Какова цель нуля? - PullRequest
       59

Какова цель нуля?

37 голосов
/ 25 февраля 2009

Я учусь в классе компиляторов, и перед нами стоит задача создания собственного языка с нуля. В настоящее время наша дилемма заключается в том, включать ли тип 'null' или нет. Какую цель дает нуль? Некоторые из нашей команды утверждают, что в этом нет особой необходимости, в то время как другие являются ненулевыми только за дополнительную гибкость, которую она может обеспечить.

Есть ли у вас какие-либо мысли, особенно за или против нуля? Вы когда-нибудь создавали функциональность, которая требовала null?

Ответы [ 25 ]

42 голосов
/ 25 февраля 2009

Нуль: ошибка в миллиард долларов . Тони Хоар:

Я называю это своей ошибкой в ​​миллиард долларов. Это было изобретение нуля ссылка в 1965 году. В то время я был проектирование первого комплексного типа система ссылок в объекте ориентированный язык (ALGOL W). Моя цель должен был гарантировать, что все использование ссылки должны быть абсолютно безопасными, с проверкой, выполненной автоматически компилятором. Но я не смог устоять соблазн поставить в ноль ссылка, просто потому что это было так легко реализовать. Это привело к бесчисленные ошибки, уязвимости, и сбои системы, которые имеют вероятно, вызвал миллиард долларов боль и ущерб за последние сорок года. В последние годы ряд программные анализаторы, такие как PREfix и PREfast в Microsoft были использованы для проверить ссылки и дать предупреждения, если есть риск, что они могут быть ненулевыми. Более современные языки программирования, такие как Spec # ввел объявления для ненулевые ссылки. Это решение, которое я отверг в 1965 году.

28 голосов
/ 25 февраля 2009

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

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

26 голосов
/ 25 февраля 2009

О нет, я чувствую, как философия исходит из меня ...

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

В языках программирования, я думаю, очень полезно понимать ссылки на объекты, которые не ссылаются на что-либо в памяти. Поищите в Google теорию множеств, и вы увидите сходство между формальными символическими системами (обозначениями), которые используют теоретики, и символами, которые мы используем во многих компьютерных языках.

С уважением, Sam

14 голосов
/ 25 февраля 2009

Что ноль для вас спросить?

Ну,

Ничего.

12 голосов
/ 25 февраля 2009

Я обычно думаю о 'null' в аспекте C / C ++ 'адрес памяти 0'. Это не является строго необходимым, но если бы его не существовало, то люди просто использовали бы что-то еще (если myNumber == -1 или myString == "").

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

В мире .NET MS недавно добавила обнуляемые типы для int, long и т. Д., Которые раньше никогда не обнулялись, поэтому я думаю, что они тоже считают это довольно важным.

Если бы я проектировал язык, я бы его сохранил. Однако я бы не стал использовать язык, в котором не было нуля. Это тоже займет немного времени.

7 голосов
/ 25 февраля 2009

Я не думаю, что полезно говорить о нуле вне контекста всего языкового дизайна. Первый момент путаницы: пустой ли тип null или он содержит одно уникальное значение (часто называемое «ноль»)? Полностью пустой тип не очень полезен - хотя C использует пустой тип возврата void, чтобы пометить процедуру, которая выполняется только для побочного эффекта, многие другие языки используют для этой цели одноэлементный тип (обычно пустой кортеж).

Я считаю, что значение nil наиболее эффективно используется в динамически типизированных языках. В Smalltalk это значение используется, когда вам нужно значение, но у вас нет никакой информации. В Lua это используется еще более эффективно: значение nil является единственным значением, которое не может быть ключом или значением в таблице Lua. В Lua nil также используется как значение отсутствующих параметров или результатов.

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

Любой ценой избегайте указателя NULL , используемого в C и Java. Это артефакты, присущие реализации указателей и объектов, и в хорошо спроектированном языке они не должны допускаться. Обязательно предоставьте своим пользователям способ расширить существующий тип с нулевым значением, но нарочно заставьте их делать это явно - не заставляйте каждый тип иметь его случайно. (В качестве примера явного использования я недавно реализовал троичные деревья поиска Bentley и Sedgewick в Haskell, и мне нужно было расширить тип символа еще одним значением, означающим «не символ». Для этой цели Haskell предоставляет тип Maybe. )

Наконец, если вы пишете компилятор, полезно помнить, что самые легкие части языка для компиляции и те части, которые вызывают наименьшее количество ошибок, это части, которых нет: -)

7 голосов
/ 25 февраля 2009

концепция нуля не является строго необходимой в том же смысле, что концепция нуля не является строго необходимой.

5 голосов
/ 25 февраля 2009

Кажется полезным иметь способ указать ссылку или указатель, который в данный момент ни на что не указывает, называете ли вы его ноль, ноль, None и т. Д. Если нет других причин, чтобы люди знали, когда они собирается упасть с конца связанного списка.

5 голосов
/ 25 февраля 2009

В C NULL был (void * (0)), поэтому это был тип со значением (?). Но это не сработало с шаблонами C ++, поэтому C ++ сделал NULL 0, он отбросил тип и стал чистым значением.

Однако было обнаружено, что лучше иметь определенный тип NULL, поэтому они (комитет C ++) решили, что NULL снова станет типом (в C ++ 0x).

Кроме того, почти каждый язык, кроме C ++, имеет в качестве типа NULL или эквивалентное уникальное значение, отличное от 0 (оно может быть равно ему или нет, но не совпадает со значением).

Так что теперь даже C ++ будет использовать NULL как тип, в основном закрывая обсуждения по этому вопросу, поскольку теперь у всех (почти) будет тип NULL

Редактировать: Думая об этом, Haskell может быть еще одним решением для типов NULL, но его не так просто понять или реализовать.

3 голосов
/ 25 февраля 2009

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

...