Какие языковые особенности считаются вредными? [закрыто]

20

Пожалуйста, объясните, почему и перечислите, на каких языках реализована (неправильная) функция Насколько вы знаете.

Публикуйте то, что вы считаете вредной особенностью, а не то, что вам не нравится.

bigown
источник
2
@sbi Вы также можете прочитать на той же странице "XMLHttpRequest, который считается вредным" ...
HoLyVieR
1
Все они считаются вредными, кем-то или другим, с возможным исключением основных выражений.
Дэвид Торнли
3
@ Дэвид Торнли: a = 1/0- основное выражение, вредно. ;-)
Orbling

Ответы:

37

Регистрация глобалов в PHP

Информация: http://php.net/manual/en/security.globals.php

Это, безусловно, худшая функция, которая когда-либо была реализована из соображений читабельности и безопасности. В основном все полученные параметры GET преобразуются в переменные.

Например, с этим URL: /index.php?value=foobar

Вы можете сделать следующее:

<?php
echo $value; // return foobar
?>

Когда вы читаете код, очень сложно узнать, откуда берется переменная.

Также, если функция используется не по назначению, это может привести к дыре в безопасности. Вот пример кода с php.net, который показывает, как его можно использовать неправильно:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>
HoLyVieR
источник
Это ужасно. Несмотря на то, что я могу понять, что это нужно, по умолчанию его не имеет смысла
TheLQ
14
Следует отметить и подчеркнуть, что глобальные регистры не были включены по умолчанию начиная с PHP 4.2 (вплоть до 2000 года), устарели в PHP 5.3 (2009) и будут полностью удалены в PHP 6, но люди все еще продолжают возвращаться «OMG зарегистрировать глобалы» хорошо даже через 10 лет.
1
Довольно безнадежный PHP
Ming-Tang
@SHiNKiROU Это не безнадежно, эта функция устарела и будет удалена в PHP 6.
HoLyVieR
1
Это не безнадежно, просто так далеко позади так много других языков, что единственная причина, по которой кто-либо его использует, заключается в том, что до недавнего времени было намного проще получить дешевый веб-хостинг для него, чем другие языки.
интуитивно
22

Разрешить Null по умолчанию, ошибка «триллион» * доллар. Извини, Тони Хоар. Почти все языки доступны на планете.

Тони Хоар объясняет

* Я скорректировал выражение, придуманное Тони Хоаром, чтобы отразить фактические потери в эти дни :-)

оборота Bigown
источник
Это не особенность или ошибка, а скорее отсутствие возможности. Наличие необнуляемых ссылочных типов - это не то, что вы можете легко добавить в язык; Это требует много размышлений и хорошего дизайна, и это очень сложно сделать так, чтобы не было необходимости бороться с компилятором. Spec # и Singularity показывают, насколько это сложно.
imgx64,
@ imgx86, нет, это определенно ошибка. Необнуляемые ссылочные типы - это функция, добавляемая в ответ на ошибку NULL, чтобы обеспечить совместимость с системой типов, которая обычно допускает NULL.
Мэтт Оленик
@Kyralessa: Возможно, он хочет быть уверен, что HoLyVieR получит популистский значок? :-) Я согласен, нет смысла принимать свой собственный ответ, как этот.
Макнейл
18

C и C ++ MACROS. Если мне когда-нибудь придется увидеть еще одну ошибку компилятора из-за того, что кто-то выберет стандартное имя функции для своего макроса, которое испортит мой код, я буду кричать. Давайте посмотрим на последний обидчик:

#define vector(int) new VARIANT[int];

Aaarg! Что вы сделали с моим вектором STL !?

Wheaties
источник
Пространство имен - это одна из вещей, которая делает typedef и шаблоны сразу более дружественными.
Shog9
4
Согласились, но только потому, что современные языки нашли замену функциональности текстовых макросов. Когда они были изобретены, макросы были хорошей вещью, потому что технология компиляции была такой примитивной.
дсимча
где ты нашел этот макрос?
Руон
@dsimcha - я не знаю об этом. Макросы Lisp существуют уже давно.
Джейсон Бейкер
2
@Jason: я не сбиваю "настоящие" макросы AST в стиле Lisp, которые по-прежнему полезны и круты. Я ненавижу только макросы в стиле C / C ++, которые работают исключительно на текстовом уровне, не имеют понятия области видимости, позволяют создавать смехотворно дырявые абстракции и запутанный код и могут быть полностью устаревшими благодаря более современным функциям, один из которых, по иронии судьбы , это "настоящие" макросы.
dsimcha
14

Прохождение по умолчанию в операторах переключения C и C ++.

Найл С.
источник
18
Это всегда полезная функция во всем коде, который я написал. Как это несоответствие?
Greyfade
6
@greyfade: Это полезно до тех пор, пока вы не забудете breakзаявление или кто-то не добавит дело между двумя делами (или не переупорядочит их), не заметив, что между ними произошел сбой . Я не вижу способа, чтобы это было лучше, чем способ C #, требующий либо перерыва, либо перехода к делу, и т. Д.
Тим Гудман
9
Устройство Даффа издевается над вашей безнаказанностью!
Джесси С. Слайсер
3
Я согласен. По умолчанию это не очень хорошая функция.
11
Никто не читает? Он сказал, что падение ПО УМОЛЧАНИЮ
Мэтт Оленик
13

Неявные преобразования типов, когда типы, между которыми выполняется преобразование, не имеют очевидной связи. Например, преобразование случайного, не числового stringв int, как в PHP.

Чинмай Канчи
источник
7
Следует отметить, что, как только вы обдумаете это, такие вещи не станут проблемой. Это действительно проблема, если вы не выполняете никаких проверок в критических областях для введенных пользователем значений, но это бесконечно полезно, если, скажем, вы знаете, что что-то будет числом, но будет в виде строки. Например, поле из БД, скорее всего, будет возвращено в виде строки, и вам не нужно беспокоиться о его приведении.
Тарка
2
@Slokun: Вы можете придумать лучший пример? Зачем хранить целые значения в БД, используя строковый тип?
Стивен Эверс
@SnOrfus Получение числа, переданного в URL, пользовательском вводе, функциях и других вещах, общих для языков без статической типизации.
TheLQ
Это также проблема в C, поскольку значение строки в кавычках является указателем, который может быть преобразован в целое число, и это может привести к тому, что конструкции будут выглядеть так, как будто они имеют смысл компилировать правильно, но создают бессмыслицу. В C ++ вы можете определять функции преобразования с помощью ключевого слова explicit, которое останавливает неявные преобразования типов, но все еще есть проблемы.
Дэвид Торнли
@TheLQ: Если это ввод пользователя, вы должны проверить его, чтобы выяснить, является ли это число. Как сказал @Slokun. Если вы читаете данные из файла, вы можете ожидать, что числовые данные будут там, где они должны быть, но иметь исключение, возникающее в случае повреждения диска, часто лучше, чем просто иметь случайное 0значение для некоторого значения.
интуитивно
12

goto : хотя в редких случаях все в порядке, его чаще всего неправильно используют, что приводит к затруднению чтения программ.

Брайан Р. Бонди
источник
Боже да xkcd.com/292
TheLQ
3
Я видел противоположное, когда разумное использование goto спасло бы программу от 3 миллионов строк кода.
Дейв
2
Ах, гипербола ... Допустимая литературная техника.
Роберт Харви
11

НИКТО

Тот факт, что функция часто используется неправильно, не делает ее вредной.

ИМХО все "считается вредным" - это Reductio ad Hitlerum дискуссий о языке программирования.

Большинство, если не все, «вредных» функций имеют или имели изначально очень приемлемый вариант использования или, во-первых, являются просто удобными методами. Это зависит от разработчиков, чтобы понять плюсы и минусы и код соответственно.

Если бы ваши вопросы должны были быть чем-то вроде «какие языковые особенности имеют общие подводные камни или нежелательные побочные эффекты», мой ответ был бы другим.

[править] Чтобы быть ясным: я не имею в виду дальнейшее использование устаревших методов. Если разработчики осуждают / удаляют функцию, вы должны использовать замену. Я имею в виду концепцию о том, что текущая часть языка считается вредной, поскольку некоторым не нравится то, что он поощряет, или компромисс, связанный с его использованием, который обсуждают многие.

Билл
источник
13
Я не согласен, хороший встречный пример - мой ответ. Глобальный регистр PHP был просто плохим, неважно, как вы их используете. Вот почему он устарел и настоятельно рекомендует никогда не использовать его на старых версиях PHP.
HoLyVieR
5
+1 Не попадай в чужие руки, любая языковая конструкция вредна.
Мувисиэль
5
Хороший вопрос ... даже если 95% gotos плохие, сама функция все еще стоит иметь для остальных 5%
ред.
1
Я думаю, что это больше похоже на установку кнопки сиденья выталкивателя рядом с кнопкой включения / выключения радио. Сама функция может быть не плохой, но не предотвращает вред от случайного ее использования.
LennyProgrammers
1
Я думаю, что это программный эквивалент «оружие не убивает людей, а люди».
Orbling
7

Автовивификация (или другая функция bind-variable-on- (assign | use)) - это функция, которая, как я обнаружил, дает мне больше ошибок.

Пол Натан
источник
+1 - Возможно, мы не согласны с итератором сахара, но я могу согласиться со 100%.
ChaosPandion
7

PLEASEв INTERCAL. Не используйте это достаточно, это жалуется. Используйте это слишком много, это жалуется.

Алан Пирс
источник
2
Этот язык не должен использоваться всерьез. Он был создан, чтобы быть очень «уникальным» языком программирования, поэтому он полон вещей (например, пришедших мне на ум), которые не имеют смысла.
ShdNx,
4
Я думал, что это будет очевидно, но да, я знаю, что это не серьезный язык.
Алан Пирс
2
Извините, некоторые люди здесь слишком серьезны.
Марк C
1
Только что обнаружил язык на прошлой неделе в Википедии и был поражен тем, насколько он был популярен (и до сих пор остался O_O).
Оливер Вейлер
Существует несколько языков «вызова», и они всегда популярны, потому что программисты, как правило, выполняют свою работу из-за любви к погоне. Также очень популярный для вопросов интервью, поскольку они преднамеренно тупы, заставляют думать и трудно.
Orbling
7

Хотя некоторые люди не согласны с человеком или различными вещами, которые он говорит, большая часть JavaScript Дугласа Крокфорда : «Хорошие части» в основном относится к JS. Среди жалоб Крокфорда:

  • Глобальная область видимости по умолчанию для всего (DC показывает, как использовать функцию / объекты в качестве пространств имен и разделителей области действия, чтобы разрешить это.)

  • Утверждения типа with, чье поведение отказа состоит в том, чтобы определять вещи в глобальном пространстве имен. (Гах! Это как девиз JS: если ты провалишься, то провалишься как можно сильнее !)

  • Неожиданное поведение с ==оператором, которое в основном требует от вас всегда использовать ===оператора.

  • Точка с запятой.

На самом деле весь JS следует считать вредным, может быть, даже весь язык, но хорошие части настолько чертовски хороши, что это как бы компенсирует это (по крайней мере, для меня).

CodexArcanum
источник
6

«Сбой молча» в Flash Player как поведение по умолчанию

Хорошо, не совсем особенность самого языка, но все же довольно тесно связанная.

Внезапно ваше приложение Flash / Flex перестает работать, и никто не может дать вам ни малейшего намека на то, что произошло *. Нет сообщения об ошибке, нет трассировки стека, нет ничего. Просто внезапно переход экрана не происходит (или происходит совершенно неправильно), или кнопки больше не реагируют на нажатия, или комбинированные списки пусты вместо того, чтобы заполняться какими-то записями.

Одна эта «особенность» ответственна за несколько сообщений о пожимании плечами и целую кучу седых волос, которые я получаю. -.- Хотя появление нежелательного сообщения на лице пользователя также нежелательно, оно может, по крайней мере, помочь разработчику решить проблему.

Но Flash Player оставляет вас в темноте, полагаясь на описание пользователя (в то время как проблема может на самом деле происходить из совершенно другого места в коде, которое не имеет никакого отношения к тому, что делал пользователь). Только если вы используете Debug Player, вы получите всплывающее окно с сообщением об ошибке и трассировкой стека.

Тем не менее, может быть довольно интересно смотреть встроенные Flash-фильмы на определенных новостных сайтах и ​​получать повторные сообщения о ссылках Null от используемого встроенного проигрывателя SWF. : D

оборота Baelnorn
источник
Приложения для iPhone также иногда вылетают без предупреждения, в определенные странные моменты времени
Ming-Tang,
3
Безрезультатно потерпеть неудачу в чем-то довольно паршиво
6

В C / C ++: присваивания также являются выражениями, сочетающимися с очень похожими операторами присваивания = и сравнения ==. Сама по себе не вредная особенность, но это способ легко вносить (иногда скрытые) ошибки, случайно вводя оператора в заблуждение.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}
Себастьян Неграсус
источник
... в сочетании с тем фактом, что целое число или указатель является допустимым условием.
Барджак
5

Доступ к модификаторам в Java с пакетом по умолчанию для частного языка и соглашения по умолчанию для частного программирования.

Хоа Лонг Там
источник
5

Замена неопределенных переменных пустой строки в оболочке без каких - либо предупреждений: rm -rf $nosuchvar/*.

Duros
источник
+1 Аааа! LOL - ужасающий дефолт (и забавный / страшный пример)
Orbling
@ Похоже, что-то вроде ${varname:-/dev/null}обходного пути ...
duros
Что ж, это говорит о необходимости всегда проверять наличие и содержание переменных перед их использованием.
Orbling
4

Возможность поворота против часовой стрелки в логотипе. Wtf, давайте просто повернуть по часовой стрелке 360 - xградусов.

jjnguy
источник
Ну, это было давно, так как я использовал ЛОГОТИП. Почему это вредно?
Мейсон Уилер
5
Логотип может использоваться для управления настоящим, физическим роботом-черепахой. Иногда вы хотите, чтобы черепаха поворачивалась в определенном направлении или поворачивалась более одного раза. Например, может быть, вы программируете это для какого-то танца.
Даниэль Кэссиди
@ Мейсон, это должна была быть шутка.
2010 года
3
Да, особенно в LOGO For Clocks.
интуитивно
1
Мне нравится логотип (см. Programmers.stackexchange.com/questions/21028/… ), и он является отличным языком обучения, особенно для молодежи. Когда мне сказали 11 и впервые использовали Logo, большинство из моего класса не знали столько геометрии, но им сказали, что 90 - это четверть оборота, и они знают слева направо. Так что это не отрицательная особенность - так же, как то, почему мы не умножаем на взаимные, вместо того, чтобы иметь оператор деления. Да, я знаю, что это шутка.
Orbling
4

Остановка темы из другой темы

В Java и на другом языке вы можете остановить поток от другого произвольно, не давая времени для потока, который вы остановили, завершиться правильно. Эта способность устарела, учитывая огромное количество проблем, которые могут возникнуть практически во всех ситуациях.

HoLyVieR
источник
Хотя я полагаю, что это может быть вредно, бывают случаи, когда это чрезвычайно полезно (например, отладчик, поддерживающий одиночные точки шага и точки останова).
Джерри Гроб
1
@Jerry Debugging - это совсем другое, он не останавливает процесс, он останавливает его.
HoLyVieR
скорее наоборот, это останавливает поток. Очевидно, вы говорите о том, чтобы убить поток, а не просто остановить его. Это немного сложнее оправдать ...
Джерри Коффин
Я не считаю, что это обязательно языковая функция. Более стандартная библиотека.
Джейсон Бейкер
4

Переменные Переменные в PHP

Просто потому, что ты $canне имеешь в виду$$should

Кендалл Хопкинс
источник
1
Как обычно, в Perl ... имеется (потенциально опасная) функция, есть простой способ отключения ( use strict) и простой способ включить его снова в тех случаях, когда вы этого хотите ( no strict 'refs').
1
Я никогда не нашел применение для имени динамической переменной. И единственный раз, когда я это сделал, это сделало код нечитаемым, и через несколько месяцев я увидел WTF, когда я снова посетил код.
TheLQ 3.10.10
Ммм, приложения включают в себя метапрограммирование с неприятными переменными пакета других людей или таблицей символов (что, я полагаю, немного отличается).
1
@ Джо Я бы попросил вас показать мне один пример, где переменные переменные делают решение более понятным.
Кендалл Хопкинс
1
Комментарий был задуман как шутка, извините, я не прояснил это, но поскольку вы спрашиваете здесь, это лучший пример, где переменные переменные делают решение более понятным . Я признаю, что это довольно плохой пример.
Джо Д
3

На Withум приходит заявление в Delphi, хотя бывают случаи, когда оно полезно.

Ремко
источник
Хороший случай, когда я перенес что-то из Delphi в Lazarus и мой потомок TControl содержал «с Canvas do ... Width, Height», ссылаясь на размеры элемента управления, но Lazarus TCanvas имел свои собственные Width и Delphi, поэтому это привело к неправильно скомпилированному коду
Макси
3

Массивы в AWK, начиная с индекса 1 !

Оливер Вейлер
источник
2
Массивы в C и C ++, начиная с индекса 0!
Дэвид Торнли
4
Массивы в lisp, начиная с индекса car! : P
Джо Д
В Lua также - непростительно!
Тобу
2

В Perl скалярный контекст против списка может быть сложным. У него есть несколько хороших моментов, которые делают определенные операции удобными, но иногда вы сталкиваетесь с чем-то ужасным, например, полностью меняете значение оператора (возможно, из-за значительного расстояния в коде).

sub foo { (1..5) }
my @list = foo();           # (1,2,3,4,5)
my $length = scalar @list;  # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)

Это просто не правильно.

(Это происходит из-за попытки сделать что-то, что действует как оператор обычного диапазона, так что вы можете сказать что-то вроде цикла next if /start_regex/ .. /end_regex/).

user2348
источник
Человек, который так сбивает с толку. Худшее в изучении Perl - попытаться обдумать это.
Гленатрон
Я всегда думал, что все, что позволяет функции возвращать несколькими способами, было удобным удобством.
Orbling
2

Относительный импортный синтаксис Python 2.x. Предположим, у меня есть пакет, в x.pluginsкоторый добавлена ​​поддержка различных других библиотек x. И предположим, у меня есть sqlalchemyмодуль, x.pluginsчтобы я мог добавить поддержку sqlalchemy x. Как вы думаете, что произойдет, если я добавлю следующую строку в sqlalchemy.py?

import sqlalchemy

Ответ в том, что модуль попытается импортировать сам. То, что делает этот синтаксис, по сути делает невозможным импорт реального глобального пакета sqlalchemy. В Python 2.5 добавлен способ указать, что это относительный импорт:

from . import sqlalchemy

... но только в Python 3 первый синтаксис был фактически избавлен (хотя он может быть отключен в Python 2.6+ с помощью from __future__ import absolute_import).

Джейсон Бейкер
источник
1

sun.misc.unsafe - мой самый любимый; коллекция «нам нужно это для реализации вещей, но на самом деле, действительно, не думаю, что вы должны использовать это».

Дин Дж
источник
7
У каждого хорошего языка должен быть небезопасный пакет в стандартной библиотеке. Импорт этого пакета ясно показывает ваше намерение делать непортативные вещи низкого уровня. Альтернативы: 1 - наличие небезопасных функций в самом языке (например, C ++) и 2 - необходимость использования другого языка, такого как C, для выполнения задач низкого уровня (например, Python и Ruby). Небезопасный пакетный подход кажется мне намного лучше.
imgx64,
1

Фортран общие блоки. Если вы допустили простую ошибку, одна часть приложения может заглушить глобалы другой части.

FORTRAN назначил оператор goto / оператор изменения COBOL. Самомодифицирующийся код. Опасность, предупреждение, летающие спагетти монстры !!

Стивен С
источник
У Фортрана не было заявления ALTER. У FORTRAN был оператор ASSIGN с назначенным GOTO. У COBOL было утверждение ALTER, которое служило аналогичной цели.
Джон Р. Штром
@ Джон - спасибо. Моя память на назначение / изменение тусклая ... не в последнюю очередь потому, что меня учили никогда не использовать их.
Стивен С
1

Ориентация на объект (из всех статически типизированных языков). Держу пари, что эта функция будет стоить намного дороже, чем нулевые указатели. Ориентация на объект хороша только в динамическом языке передачи сообщений . Поэтому он должен быть удален из динамических языков, таких как Python (поскольку он не использует передачу сообщений, а вызывает обычный вызов подпрограммы).

Yttrill
источник
Python поддерживает (во всех смыслах и целях) идиому передачи сообщений smalltalk. Просто так не названо. Во- вторых, я думаю , что это по крайней мере , немного спорно назвать такой распространенной особенностью языка вредна.
Джейсон Бейкер
Ориентация на объект все еще улучшает повторное использование кода и инкапсуляцию кода / данных. Независимо от статического / динамического использования функции.
Orbling
@ Orbling: По сравнению с чем? На мой взгляд, функциональные языки программирования имеют более высокое повторное использование кода, и я думаю, что модульная система Haskell довольно хороша для инкапсуляции кода / данных.
LennyProgrammers
@ Lenny222 По сравнению со стандартным императивным программированием. Я тоже предпочитаю функциональный подход, Haskell - мой любимый язык.
Orbling
@Jason Бейкер: ну , конечно , это спорно, но , будучи настолько распространена именно то , что делает это так вредно! ОП спросила мое мнение, и я его высказал. То, что прыжок леммингов со скалы не делает его нормальным. В этом случае математически доказано, что ООП не работает, и правильная парадигма хорошо принята: теория категорий - это способ представления абстракций (на самом деле это теория абстракций)
Yttrill
1

magic_quotesв PHP .

Неопытные разработчики либо полагаются на то, что он включен, и, таким образом, предполагают, что весь пользовательский ввод будет экранирован для использования в запросе SQL, либо полагаются на то, что он отключен, и поэтому всегда избегают своего ввода.

Если предположить, что он включен, а затем запустить код в системе, где его нет, он открывает широкие дыры в SQL-инъекциях.

Если предположить, что он отключен, а это не так, это приведет к тому, что обратная косая черта будет фактически сохранена в БД, что приведет к появлению уродливых / неправильных строк.

Также нет чрезвычайно простого способа справиться с обоими случаями - вам нужно проверить, включено ли оно с помощью, get_magic_quotes_gpc()а затем применить его stripslashes()ко всем значениям в $_*массивах - поскольку array_mapэто не является рекурсивным, для этого вам нужна пользовательская функция.

ThiefMaster
источник
Или вы можете просто использовать параметризованные запросы.
Питер Б
Даже тогда вы получите обратную косую черту, если включены магические кавычки, а вы этого не ожидали.
ThiefMaster
-3

Функция языка, которая позволяет программистам писать некомментированный или бессмысленно прокомментированный код.

ТИА
источник
1
И как это исправить?
Маньеро
1
@bigown: с помощью функции комментирования или смерти: D.
ТИА
3
Это называется грамотным программированием. ru.wikipedia.org/wiki/Literate_programming
Барри Браун
2
Это не особенность, но это чрезвычайно известная ошибка в пользовательском интерфейсе, большинство людей знают ее по латинскому имени: Homo Sapiens.
Джо Д
-3

выходить немного на конечности здесь - void функции. функция всегда что-то делает, следовательно, она должна либо возвращать результат, либо какую-то другую информацию о своем успехе или неудаче.

Брэд Клоузи
источник
3
Паскаль имел процедуры (без возвращаемого значения), а также функции (возвращаемое значение).
Джон Онстотт
Функции всегда что-то делают (ну, как правило, это функция-заполнитель?) , Но часто не нужно никому об этом рассказывать.
Orbling
-4

Тыкать в бейсике ...

squelart
источник
7
POKE был потрясающим.
Shog9
2
В первые дни тыкать было единственным разумным способом, которым вы могли достичь определенных вещей в основном. Музыка на Apple] [приходит на ум ...
Билл
2
Если я правильно помню, без ПОК на Commodore 64 ничего не получится.
MetalMikester
1
Не забывайте ПИК, оба необходимы.
Orbling
-5

Я бы сказал, сбор мусора. Это не устраняет необходимость думать об управлении памятью, но устраняет ощущение необходимости думать об управлении памятью, которое слишком часто исключает реальную мысль, и тогда вы получаете огромные ресурсы и не знаете, почему. Особенно, когда поведение современных GC поколения можно без особой гиперболы описать как «одну большую утечку памяти».

Мейсон Уилер
источник
2
Если у вас есть ссылки в какой-то коллекции, у вас есть другие проблемы.
Чинмай Канчи
2
Вот почему у gc'ed языков слабые ссылки :)
Chinmay Kanchi
4
Несмотря на то, что у GC, безусловно, есть как сильные, так и слабые стороны, я должен сказать, что Мейсон гораздо более прав, чем неправ в этом. Фактически, я видел, как люди, использующие GC, тратят много дополнительного времени на управление памятью, потому что в итоге они пытаются взломать вещи после факта, а не планируют это заранее. GC также обычно предотвращает детерминированное разрушение, что приводит к дополнительной работе, связанной с управлением всеми ресурсами, кроме памяти.
Джерри Коффин
3
@ChaosPandion: действительно ли я дурак, если думаю, что на современной многозадачной машине, чтобы избежать потери производительности вашей системы, память должна быть освобождена как можно скорее? Ни одному GC никогда не удавалось даже приблизиться к достижению этого результата, и на самом деле сборщик мусора поколений, который, как предполагается, является лучшим, самым современным из существующих, делает с точностью до наоборот: для лучшей производительности он должен выпускать память как можно позже . Я не вижу такого подходящего инструмента для любой работы, даже если он не тормозит другие мои программы. Я дурак для этого?
Мейсон Уилер
2
@ Барри: Это детерминированный в программе. Если я закончу с блоком памяти 5 КБ, то вскоре попросите еще 5 КБ, что произойдет? В системе сбора мусора требуется запросить новый блок размером 5 КБ, даже если есть совершенно хороший блок, который не используется, если только GC не работал в промежуточный период, и в этом случае вы можете перезапустить старый блок. С помощью malloc и free вы всегда сможете утилизировать старый блок. Умножьте это на несколько сотен тысяч, и это станет реальной проблемой.
Мейсон Уилер
-5

C и определенно C ++: арифметика указателей. Разрешение людям конвертировать целые числа в адреса памяти порождает проблемы.

А может быть, даже необработанный доступ к указателям в целом?

В C ++ у вас есть ссылки, которые делают указатели почти полностью ненужными. В остальных случаях умные указатели должны считаться обязательными.

Java также доказывает, что вы можете создавать язык программирования, который использует указатели, не позволяя людям получать доступ к самому значению указателя.

Помимо null... но это другая история.

Асгейр С. Нильсен
источник
5
Указатели, хотя иногда их трудно использовать должным образом, очень необходимы для большого количества эффективных операций с памятью.
Билл
1
Правда. Но, на мой взгляд, позволить людям регулярно преобразовывать целые числа в ссылки на память или добавлять числа к адресам памяти в наши дни в основном вредно. В C ++ у вас есть ссылки как отличная альтернатива, и умные указатели / автоматические указатели, когда вам действительно нужно быть указателем.
Асгейр Нильсен
4
Этот ответ действителен, только если вы работаете с программным стеком, созданным для сокрытия указателей. Во всех остальных случаях этот ответ неверен.
Пол Натан
3
Для некоторых языков программирования должны быть доступны указатели, чтобы вы могли писать все операционные системы и виртуальные машины для других языков программирования.
2
-1. Есть причина, по которой вам нужна арифметика ptr: итерация точки быстрее, чем индексация. for(int i=0;i<SIZE;++i) ++arr[i]медленнее, чем for(int*i=arr;i<arr+SIZE;++i)*i++. Все, что удалось Java, это доказать, что вам нужен указатель, или вы никогда не смотрели sun.misc.Unsafe? Если вам не нужны указатели, объясните, как написать обобщенную функцию подкачки с использованием Java. (например, int a = 1, b = 2; swap (a, b); подтвердить (a == 2 && b == 1);). Не говоря уже о всех проблемах в c / c ++, которые у вас возникли бы, если бы вам пришлось использовать ссылки. Как бы вы вызвали виртуальную функцию для непрозрачной структуры без указателей?
KitsuneYMG