ボイド安全性(ヌル安全性とも呼ばれる)とは、オブジェクト指向プログラミング言語において、オブジェクト参照がヌル値またはボイド値を持たないことを保証するものである。
オブジェクト指向言語では、オブジェクトへのアクセスは参照(または同等のポインタ)を介して行われます。典型的な呼び出しは の形式で、 は操作を表し、 は何らかのオブジェクトへの参照を表します。ただし、実行時には参照は(または)になることがあります。このような場合、上記の呼び出しはvoid 呼び出しとなり、実行時例外が発生し、多くの場合、プログラムが異常終了します。x.f(a,...)fxvoidnull
void の安全性とは、void 呼び出しが決して発生しないことを静的に(コンパイル時に)保証するものです。
2009年の講演で、トニー・ホーアはヌルポインタの発明の起源を、自身が設計したALGOL W言語に遡り、それを「間違い」と呼んだ。
私はこれを10億ドルの失敗と呼んでいます。それは1965年のヌル参照の発明でした。当時、私はオブジェクト指向言語(ALGOL W)における参照のための最初の包括的な型システムを設計していました。私の目標は、コンパイラによる自動チェックによって、すべての参照の使用が絶対に安全であることを保証することでした。しかし、実装が非常に簡単だったため、ヌル参照を導入するという誘惑に抗えませんでした。これが無数のエラー、脆弱性、システムクラッシュを引き起こし、過去40年間で恐らく10億ドルの損害と損失をもたらしたのです。[ 1 ]
ベルトラン・メイヤーは「空隙安全」という用語を導入した。[ 2 ]
ボイドの安全性を保証するための初期の試みの一つが、 Selfプログラミング言語の設計であった。
Eiffel言語は、 ISO - ECMA規格に従ってvoidセーフです。voidセーフのメカニズムは、 EiffelStudioのバージョン6.1以降で実装され、バージョン6.4以降では最新の構文が使用されています。
Microsoft Research の研究言語である Spec# 言語には、void の安全性を考慮した「null を許容しない型」という概念があります。Microsoft Research の .NET フレームワーク上で動作する関数型ファースト言語であるF# 言語は、他の .NET 言語との相互運用時を除いて void セーフです。[ 3 ]
2011年以降、いくつかのプログラミング言語は共用型と交差型をサポートしており、これらはコンパイル時にヌルポインタの可能性を検出するために使用できます。ヌルという値は、その唯一のインスタンスである特別なクラスNullを使用します。
型に基づくヌル安全性は、最初にセイロンで登場し、その後すぐにTypeScriptに導入されました。
C #言語はバージョン 8 以降、コンパイル時の null 安全性チェックを実装しています。ただし、古いバージョンの言語との互換性を維持するために、この機能はプロジェクトごとまたはファイルごとにオプトインされます。[ 4 ]
Dart言語は2018年8月のバージョン2.0以降、これを実装しています[ 5 ] [ 6 ]。
デフォルトでヌルセーフ型を使用する他の言語には、JetBrainsのKotlin [ 7 ] 、Rust [ 8 ]、AppleのSwiftなどがあります。