毎回、いろいろなプログラミング言語を紹介している本連載ですが、少し趣向を変えて主要プログラミング言語を真偽型を通して言語の歴史を振り返ってみましょう。現在主流のプログラミング言語には大抵真偽型がありますが、黎明期に登場したCOBOLやC言語には真偽型がありません。その後どのように言語が発展していたかを確認してみましょう。

言語別TrueとFalseはどちらが大きいのか?

現在主流のプログラミング言語には真偽型(Boolean型/bool型)があります。処理の分岐や繰り返しなどの条件には比較式が指定され、その比較の真偽に応じて分岐や繰り返しが行われます。

しかし、興味深いことに真偽型は言語によって実装方法が異なっています。真(True)は偽(False)よりも大きいと実装している言語もあり、その逆もあるのです。そこにプログラミング言語の性格が表れています。そこで、言語ごとの実装を調べてみます。

TrueとFalseのどちらが大きいのか確かめるために、以下のようなプログラムを用意しました。各プログラミング言語で実行したとき、どんな結果がでるのか確かめてみましょう。

if (true > false) {
  print("True > False - 真が偽より大きい");
} else {
  print("True < False - 偽が真より大きい");
}

例えば、PythonでTrueとFalseの大小を比較すると以下のような結果が出ます。PythonではTrueがFalseより大きいと表示されます。

  • PythonでTrueとFalseの大小を比較したところ

    PythonでTrueとFalseの大小を比較したところ

このような要領で、筆者が主要なプログラミング言語で真偽型の大小比較を試した結果が以下の表になります。

プログラミング言語 TrueとFalseの関係 言語の登場年
C++言語(clang 12.0.0) true > false 1983年
Python (3.7) True > False 1991年
JavaScript (Chrome) true > false 1995年
PHP (7) true >false 1995年
Rust true > false 2010年
Delphi true > false 1995年
SQLite TRUE > FALSE 2000年
Perl (5) true < false 1987年
VBA / VB / VBScript True < False 1991年
C# エラー 2000年
Java エラー 1995年
Ruby エラー 1995年
Go言語 エラー 2009年
Lua (5.3) エラー 1993年
Gauche/Scheme エラー 2001年
C言語 真偽型がない 1972年
COBOL 真偽型がない 1959年

こうして見ると、True(真)の方がFlase(偽)より大きいという言語が多く感じます。しかしこれほどプログラミング言語ごとに結果が異なるというのも面白いものです。

以下の年表は言語の登場時期と真偽型の大小の結果を示したものです。

  • プログラミング言語の登場時期と真偽型の大小結果の年表

    プログラミング言語の登場時期と真偽型の大小結果の年表

真偽型から見る言語の歴史

冒頭でも紹介したように、プログラミング言語の黎明期である1959年に登場したCOBOLには真偽型はありません。そして、1972年に登場したC言語にもありません。とは言え、COBOLにもC言語にも条件分岐文はあります。通例では数値の0が偽であり、それ以外の値は真であると判断されます。

なお、C言語では真偽型こそないものの、マクロを利用してTRUEが1、FALSEが0と定義することが通例となっています。WindowsのAPIでもこのように定義されています。また論理否定演算子『!』を使って『!0』と書くと1を返すように決められています。つまり、真偽型はC言語に標準で用意されていないものの、多くの環境ではTRUEとFALSEを定義して使っているという状況です。

そして、C言語の機能や特徴を継承して1983年に登場したC++にはbool型が最初から用意されました。そして表にもある通り真(true)が偽(false)より大きいと定義されています。これは、C言語でTRUEを1、FALSEを0と定義するのが一般的であることに由来していると考えられます。

それからC/C++言語を用いてPythonやPHPなど様々なプログラミング言語が開発されました。その際、C言語から真(true)が偽(false)よりも大きいという特徴が受け継がれたのではないかと考えられます。

真偽型の大小が比較できない言語

興味深いことに真偽型の大小を比較しようとするといくつかの言語でエラーが表示されてしまいました。実際のところ真と偽の大小を比べる必要がある処理などほとんどありません。そのためエラーにするのも正しい判断の一つと言えます。

この点で改めて表を見てみましょう。C#やJava、Go言語など静的型付けの厳しい言語ではエラーになる傾向にあります。これは、誤って真偽型同士の大小を比較しないよう配慮しているのです。大規模開発を想定して開発されたこれらの言語では、型の厳格さを優先しており、言語の性格を考えるともっともな判断と言えます。

なお、Rubyは型が厳しいわけではありませんが、Rubyでもエラーが出ます。真(true)を表すTrueClassで『>』演算子が定義されていないというエラーが表示されました。Rubyでは全ての値がオブジェクトであり、真偽型オブジェクトの大小比較は許さないという、Rubyの言語設計ポリシーの一端を垣間見ることができました。

偽が真より大きいのは個性的な言語 ?!

そして、偽が真よりも大きくなる言語には、PerlとVBA/VBといった言語があります。Perlの登場は1987年、Visual Basicの登場は1991年ですが、これらの言語に共通するのは、熱心のファンが多いことが思い浮かびます。

VBScriptやVBAでTrueとFalseの値を表示させてみると、Trueが-1、Falseが0と表示されました。Perl5ではtrueやfalseの値は数値として表示されませんでしたが、結果から考えると内部的にVBと同じように定義されているのでしょう。どの言語でも基本的に0が偽なのは共通であり、Trueを1とするか-1とするかが異なるようです。

まとめ

以上、今回は真偽型の大小比較を通して、様々な主要プログラミング言語に想いを馳せることができました。ここで取り上げたプログラミング言語は、本連載で既に紹介したものばかりです。興味があれば本連載のバックナンバーで確認してみてください。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。