• 非pの世界

コンピュータを使っていると、一回ぐらいは「ヌル」という言葉を聞いたことがあるだろう。「Null」は、コンピュータでは、「何もない」、「何でもない」を意味する記号や表現として使われる。ヌルと呼ぶ人が国内には多いようだが「ナル」と読む人もいる。Nullの英語読みが「ナル」であり、「ヌル」はドイツ語のNull(ゼロ)の発音だ。元々の意味としてはナルと呼ぶべきなのかもしれない。

英語の「ナル」は、「何もない」、「無効の」といった意味を持つ。数学の「空集合」を「null set」という。似たような意味の英単語に「Nil」(ニル)がある。

たとえば、ASCIIコードなどの制御文字「0x00」には、「NUL」というシンボル名があるが、これを「ヌル文字」と呼ぶことがある。また、中身のない文字列を「ヌル文字列」と呼ぶ。あるいは、アプリケーションが「Null Pointer Exception」などと表示するのを見たことがある人もいるだろう。

コンピュータ、特にプログラミングでは、Nullは重要な役割を持つ。「何もない」こと、「何も指し示していない」ことを表わすのにNullやNilといったシンボルを使う。Nullは、1966年に作られたALGOL Wで最初にプログラミング言語に導入された。コンピュータの初期に作られた言語のうち、現在でも影響力を残す言語の1つがヨーロッパを中心に開発されたALGOLである。現在使われている多くの言語は、なんらかの形でALGOLの影響を受けている。

ALGOL Wは、ALGOL60の後継候補の1つとして提案されたもので、ここではじめて“null”が、基本シンボルとして導入された。これを考えたのは、A.C.Eホーアだと言われている。ホーアは、前々回の記事「工学者の食卓」で、“Dining Philosophers Problem”を定式化したとして紹介した科学者。クイックソートの発明などでも知られる。しかし、Nullの発明ほどプログラミングに大きな影響を与えたものはない。

ALGOL Wでは「何も指し示していない」ことを表わす「ヌル参照」(NULL Reference)、いまでいうヌルポインタとしてキーワード“null”が導入された。ALGOL Wには、今で言う構造体であるRecordがあり、その要素として他のRecordを指すReference(参照、つまりポインタ)を入れることができた。このとき、まだ、何も指し示していないことを表わす定数としてnullを使うことができる。nullの導入により、ALGOL Wは、実行時にRecordを作り上げていくことが可能になった。このあたりに関しては、英語だが、以下のページの「Records and references」に解説がある。

・ALGOL W - Language features
https://try-mts.com/algol-w-language-features/

プログラミングでNullは便利である。Nullを使うことでエラーをしばらく「棚上げ」しておくことができる。たとえば、何かを探す「検索」のような機能で、何も見つからなかったとき、Nullを結果として返す。ここでエラーとしてしまうと、プログラムはそこで中断せざるを得ない。

コンピュータを使うときにエラーは避けて通れないものだ。だが、一時的な問題であることも少なくない。前述の検索の処理も繰り返し行い、そのうち一回でもまともな結果が得られればOKという場合がある。あるいは、何らかの条件により、エラーとなった処理の結果は捨ててしまうので、そのエラーなど、どうでもよくなることがある。こうしたとき、Nullでエラーを棚上げしておくと、プログラムで毎回エラーの有無を調べる必要がなく記述が簡単になる。

しかし、棚上げしたまま忘れていると、後でどうにもならなくなってエラーになってしまうことがある。たとえば、中身がNullなのに計算に使ってしまうことがある。なので、Nullを使うとプログラムのデバッグを難しくなる。原因があったところとは異なる場所でエラーになるからだ。

プログラムの作り方が悪ければ、そこでクラッシュして「突然死」することもあれば、どうしようもなくて、エラーメッセージを残して終了ということもある。前述の「Null Pointer Exception」は、こうしてアプリケーションが出すエラーだ。かつてWindowsで話題となった「修復が不可能なアプリケーションエラー」(UAE。Unrecoverable Application Error)の原因もNull Pointer関連が多かったという。

Nullは、善悪両面を持つ「悪魔の発明」と言ってもいいかもしれない。ホーア自身もNullの導入は誤りだったとのちに述べている。あまりにNullに起因する問題が多いため、最近の言語ではNullを持ってはいるものの、なるべく使わせないようにする「Null安全性」を持つものが増えてきた。既存の言語でも、改訂でNull安全性を取り入れるものもある。しかし、Nullを廃絶しているわけではない。Null安全性とは、実行時にNullによるエラー、Null Pointer Exceptionのようなものを出さないようにすることだ。方法の1つは、コンパイル時など実行前の段階でNull参照をエラーとすることだ。ただし、そのためには、言語処理系側の負担が増える。コンパイラの処理だけでなく、言語仕様としても、Nullを代入できる(逆に代入できない)変数を宣言できるえるための記法などを導入する必要がある。

今回のタイトルのネタは、A・E・ヴァン・ヴォークト(Alfred Elton van Vogt)の「非(ナル)Aの世界」(THE WORLD OF NULL A)である。ポインタの意味で“p”とした(ハンガリアン記法)。本書の「謎の主人公による一人称」という設定は、最近のアニメではよく見かけるが、その元祖に当たるのが本書と言ってもいいだろう。ただし本シリーズが書かれたのは1945年、第二次世界大戦が終わった年である(筆者も生まれてない)。同じNullということもあるが、1960年台に作られた言語やNullという仕組みが今もって言語開発に影響力を持つことと奇妙な一致を感じる。