stringtranslate.com

Безопасность пустоты

Безопасность пустых значений (также известная как безопасность пустых значений ) — это гарантия в объектно-ориентированном языке программирования , что ни одна ссылка на объект не будет иметь пустых или недействительных значений.

В объектно-ориентированных языках доступ к объектам осуществляется через ссылки (или, что эквивалентно, указатели ). Типичный вызов имеет вид:

хф(а, ...)

где f обозначает операцию, а x обозначает ссылку на некоторый объект. Однако во время выполнения ссылка может быть void (или null ). В таких случаях вызов выше будет void call , что приведет к исключению времени выполнения , часто приводящему к ненормальному завершению программы.

Безопасность Void — это статическая (во время компиляции) гарантия того, что вызов void никогда не возникнет.

История

В своем выступлении в 2009 году Тони Хоар проследил связь изобретения нулевого указателя с его разработкой языка ALGOL W и назвал это «ошибкой»:

Я называю это своей ошибкой на миллиард долларов. Это было изобретение нулевой ссылки в 1965 году. В то время я проектировал первую всеобъемлющую систему типов для ссылок в объектно-ориентированном языке (ALGOL W). Моей целью было гарантировать, что все использование ссылок должно быть абсолютно безопасным, с проверкой, выполняемой автоматически компилятором. Но я не мог устоять перед искушением ввести нулевую ссылку, просто потому, что это было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и сбоям системы, которые, вероятно, нанесли миллиард долларов боли и ущерба за последние сорок лет. [1]

Бертран Мейер ввел термин «пустотная безопасность». [2]

В языках программирования

Ранней попыткой гарантировать безопасность пустоты стала разработка языка программирования Self .

Язык Eiffel является void-безопасным в соответствии со стандартом ISO - ECMA ; механизм void-безопасности реализован в EiffelStudio , начиная с версии 6.1, и использует современный синтаксис, начиная с версии 6.4.

Язык Spec#, исследовательский язык от Microsoft Research, имеет понятие "необнуляемого типа", направленное на безопасность void. Язык F# , функционально-первый язык от Microsoft Research, работающий на .NET Framework, является void-безопасным, за исключением случаев взаимодействия с другими языками .NET. [3]

Нулевая безопасность, основанная на типах объединения

С 2011 года несколько языков поддерживают типы объединения и типы пересечения , которые можно использовать для обнаружения возможных нулевых указателей во время компиляции, используя специальный класс Null, значение которого null является его уникальным экземпляром.

Безопасность null, основанная на типах, впервые появилась в Ceylon , а вскоре за ней последовал TypeScript .

Язык C# реализует проверку безопасности null во время компиляции, начиная с версии 8. Однако для обеспечения совместимости со старыми версиями языка эта функция включается отдельно для каждого проекта или файла. [4]

Язык Dart от Google реализует его с версии 2.0, в августе 2018 года [5] [6]

Другие языки, которые по умолчанию используют типы, безопасные для значений null, включают Kotlin от JetBrains , [7] Rust , [8] и Swift от Apple .

Смотрите также

Ссылки

  1. CAR Hoare: Null References: The Billion Dollar Mistake , аннотация выступления на QCon London, 9–12 марта 2009 г., доступно онлайн
  2. ^ Бертран Мейер: Присоединённые типы и их применение к трём открытым проблемам объектно-ориентированного программирования , в ECOOP 2005 (Труды Европейской конференции по объектно-ориентированному программированию, Эдинбург, 25–29 июля 2005 г.) , под ред. Эндрю Блэка, Lecture Notes in Computer Science 3586, Springer Verlag, 2005, страницы 1–32, также доступны онлайн
  3. ^ Сайм, Дон. «Цитата недели: «Что может C#, чего не может F#?»» . Получено 7 сентября 2018 г.
  4. ^ "Ссылочные типы, допускающие значение NULL | Microsoft Docs" . Получено 12 марта 2021 г. .
  5. ^ Мур, Кевин (2018-08-07). "Анонс Dart 2 Stable и Dart Web Platform". Dart . Получено 2018-08-08 .
  6. ^ "Sound null safety | Dart" . Получено 12 марта 2021 г. .
  7. ^ "Null safety—Kotlin" . Получено 12 марта 2021 г. .
  8. ^ "Определение перечисления — язык программирования Rust". doc.rust-lang.org . Получено 26.06.2021 .