C-подобный язык без NULL? - PullRequest
6 голосов
/ 31 января 2010

Привет. Недавно я смотрел старое видео о том, что нулевые указатели были ошибкой в ​​миллиард долларов. Он указывает и на C #, и на java, так как они имеют проверки во время выполнения, но не полностью устраняют это, и это несколько понятно. Он также указывает на C в одной точке, в которой он уверен, что это большая проблема. Я получаю, что строки с нулевым символом в конце, массивы без длины и некоторые другие вещи плохие (миллиарды долларов на использование переполнения буфера), но полностью удалить ноль?

Некоторые языки сделали ноль ушедшим в прошлое, а другие пытались заменить C, но я не могу найти, какой язык достиг того и другого.

Если ноль C настолько плох, то почему никто не создал его замену? то есть Haskell хорош, но не может работать как замена.

Ответы [ 4 ]

2 голосов
/ 31 января 2010

Существует причина, по которой он не был заменен, посмотрите на это с другой стороны, существует такая огромная база программ на C, где лежат тысячи и тысячи кода, и создание замены может вызвать много горя, так как код должен был бы быть обновлен, чтобы отразить изменение, поскольку NULL в контексте указателя означает, что вызов был бы неудачным и, следовательно, возвращал NULL, чтобы обозначить условие, что код для обработки указателя потерпел неудачу , Кроме того, он используется в случае операций FILE *, если файл был недействительным, будет возвращено NULL. Представьте себе трудности, если весь этот код будет изменен, к сожалению, он является частью стандарта ANSI C и, следовательно, является очень дорогостоящим упражнением с точки зрения $$$, чтобы все это изменить, чтобы приспособиться к новому соглашению для замены NULL.

Просмотрите этот FAQ по печально известному NULL-указателю, найденному в C FAQ .

Edit: Кстати, « Я получаю, что строки с нулевым символом в конце, массивы без длины и некоторые другие вещи плохие» «Это неправильный способ сказать это, поскольку вы путаете эти два ... как Питер Ван Der Linden, автор книги «Эксперт C Программирование - Deep C Secrets», нуль с одним l - это «\ 0», ноль с двумя l - это NULL! Нет такой вещи, как null terminated, которая должна читаться как nul terminated, то есть '\ 0', которая является заполнителем для обозначения конца строки.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

2 голосов
/ 01 февраля 2010

Проблема с нулевыми указателями в C состоит в том, что когда вы ссылаетесь на них, программа ведет себя неопределенным образом, что приводит к «неисчислимым ошибкам, уязвимостям и сбоям системы», о которых упоминает презентация. Но это не означает, что идея о ценности, которая не является реальной, обязательно плохая. Многие языки содержат их; они называются NULL, None, NaN, undef, null, nil и т. д. Вам просто нужен четко определенный и надежный способ справиться с ними.

Я полагаю, что причина того, почему язык "как C, но не падает при разыменовании нулевого указателя" не получил широкого распространения, заключается в том, что ниша для такого языка была бы очень маленькой. С одной стороны, у вас есть системное программирование, где вам (предположительно) нужен жесткий контроль над всем, что происходит, и вы не можете позволить компилятору вставлять автоматическую проверку нулевого указателя при каждом разыменовании указателя. С другой стороны, существует прикладное и другое, менее критичное к производительности программирование, в котором гораздо проще поднять уровень или больше абстракции и вообще забыть об указателях, что приводит к таким вещам, как Java, C #, Python и другие.

0 голосов
/ 23 декабря 2012

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

  1. Компилятор может потребовать, чтобы каждый элемент был записан (возможно, в порядке), прежде чем любой из них может быть прочитан; это может напрасно тратить время на запись элементов с бессмысленными значениями, если разумные значения не будут доступны до тех пор, пока не будут прочитаны части массива.
  2. Попытка чтения слота массива, который не был записан, может вызвать немедленную ошибку, без каких-либо способов проверить, является ли слот массива допустимым, или пометить слот массива как недействительный (в случае, если код знает, что определенное место, которое было написано однажды, не должно читаться, пока оно не будет написано снова).
  3. Как и выше, но с явными методами, предусмотренными для проверки, является ли слот массива допустимым, или для аннулирования ранее написанных слотов.
  4. Попытка чтения слота массива, который не был записан или является иным недействительным, приведет к специальному значению, которое нельзя использовать ни для чего, кроме как для проверки правильности или для аннулирования слота массива или другой переменной.

Хотя в некоторых контекстах может быть неплохо # 1, во многих других контекстах нет какого-либо конкретного значения, которое программа могла бы поместить в слоты массивов, который работал бы лучше, чем null.

0 голосов
/ 31 января 2010

Когда вы говорите «как», оно идет в том же направлении, что и другие. Scala как-то устраняет пустые значения с помощью опций. Тем не менее, вы можете использовать нули. Фунциональные языки не имеют нулевых проблем и побочных эффектов, но они не похожи. Динамические языки также имеют нулевые или неопределенные переменные и тому подобное. Это цена, которую вы должны заплатить за c, как imho.

...