プログラムの経験はありますか?
PASCAL, PHP, Python, BASIC, Java, HTML, JavaScript, COBOL, FORTRAN, …
これらのプログラミング言語は、私たちが読んだり書いたりしゃべったりしている日常語(自然言語)と違う目的で作られたものです。
しかし、生成AIがさかんになった今、日常語を使うだけでコンピュータから答えが返ってくるという時代になると、日常語がプログラミング言語であってもかまわない、と考える人が出てきそうです。
また、日常語でコンピュータに指示しているという錯覚が生まれます。
もっと進んで、コンピュータが日常語を理解しているという錯覚も持つことになります。
そこまで飛躍する前に、ここでちょっと、コンピュータが生まれはじめたころの過去にさかのぼってみます。
目次
■チューリングが考えた装置
チューリングという数学者が、パスカル(パスカルの原理でも有名な17世紀の科学者)が発明したとも言われている万能機械を数学的に定義しようとしました。機械の中にプログラムを入れれば、その機械は専用機械ではなく、いろんな機能を持つ万能機械になりうる、というパスカルのアイディアです。
チューリングは、数学者ですから、数学的にこのアイディアを定義しようと考えました。

図1を見てください。データ(プログラムもデータの一部)を一次元のテープメモリの中に保存する。データは、シンボル(記号)の集まりです。メモリーからデータを取り出すヘッド(左右に自由に移動できる)と取り出したデータを加工する制御部(演算部、CPU)を持つという簡単な仮想装置を考えました。
単純化して証明可能な形にすることが数学原理ですから、これを最小限の必要な要素として定義しています。
人間の頭の中の最小機能もこれと同じだと考えられます。人間の思考過程は同様にシンボルシステムだからです。
■紙テープ時代のコンピュータとスーパープログラマ
そういえば、私が経験した1970年代に存在した大型コンピュータへのデータ入力は紙テープで、長期保存できるデバイスは磁気テープ装置、そしてコンピュータ内部の短期的メモリは小さなもので64Kバイト程度(1 Symbol=1Byte)だったのですから、ほぼチューリングの原理そのものを想像してプログラミングをするわけです。メモリーにあるデータの位置(アドレス)を知って、それを読みだして、簡単な演算をすることをシンボルの集合として組み合わせてプログラムを作るのです。
その当時は、研究室の大型コンピュータではすでにあったFORTRANやCOBOLが使えないし、機能が限られているので、アセンブラ(ASM)とよばれるチューリングレベルの言語で記述していきます。そして、プログラムはシンボルの集まりとしてデータと同等とみなされていて、紙テープに穴をあけて記述したものを読み込むという作業をやっていました。
しかし、当時もそんなプログラミングでもスーパープログラマが研究室にいて、一人はその後CMU(米国カーネギーメロン大学)に留学し、世界的なロボット・画像処理の科学者となった金出先生、もう一人はNLPおよび機械翻訳のパイオニアで、日本の人工知能研究所元所長の辻井先生です。どちらも紙テープの穴を読みながらの高速のデバック(バグを取り作業)できるプログラマだったのです。
■普通の人間でも読めるプログラミング言語(HLP)
米国では人間が初めて月に足をおろしたころです。大型コンピュータを使って多くのプログラムを実行することで実現できた、と言われています。その時に使われたプログラミング言語がFORTRAN(科学計算用)です。アセンブラよりハイレベルのプログラミング言語(HLP)でした。このころの話は以下を参照してください。
コンピューティング史見聞録(18)ジョン・バッカスとFortran
普通の人間でも読めるハイレベルのプログラミング言語(HLP)が誕生したことにより、プログラム・ソフトウエアの発展があったのです。HLPがあってもコンピュータの中ではASM、つまりその下のレベルの機械語でしかプログラムが動作しないことには変わらないので、メモリー制約、高速、セキュリティをめざすプログラム開発では今でもASMが使われています。
HLPはそのままではコンピュータは動作できないので、機械語まで変換する必要があります。そのプロセスはコンパイラと呼ばれるものですが、その詳細は後日に説明します。
■プログラミング言語(HLP)と日常語の違い
HLPと日常語には違いがあります。日常語の文法は、数学的な記述ができたとしても、例外事項が多すぎます。HLPは例外事項をなくして、数学的な文法で定義できるように設計します。BNF(Backus Normal Form)はそのために考え出されたメタ言語です。HLPの文法は、CFG(文脈自由文法)と呼ばれて分析のためのプログラム開発が可能になります。
特にPASCALはエラーの少ないプログラムをめざすことに重点をおく強力な言語であり、パソコンの普及とともにパソコンでも動作するコンパイラを備えた本格的な言語として人気の高いものでした。なぜなら、正確な文法体系と整合性の取れた言語であり、かつコンパイラ自身もPASCAL言語で開発できるという特徴を持っていたからです。
HLPを設計するときは、まず文法を数学的に定義すること(BNFで定義)から始めます。なぜなら、誰でも理解できる共通の言語(数学)で仕様が書かれていることが要求されるからです。それがないと、HLPの実行環境を正確に開発することができませんし、開発したコンパイラがバグがあるかないかのテストすらできません。PACALの文法例とプログラム例は次回に説明します。
■エラーなく動作するプログラム?
プログラムは、コンピュータでの動作を指示する言語で成り立っています。数学的に定義できるチューリングマシン上で動作するためには、PASCALのような数学的な定義の可能なHLP言語が要求されていました。「プログラムが正しい」と言えるための判定が可能であることがもっとも重視された時代の到来です。それは今日も変わりません。さもなければ、飛行機も宇宙船も自動車も安心してのれません。
コンパイラの仕事はまず、プログラムが文法的に正しいかどうかを判定することからはじまります。しかし、文法的に正しいと判定されても、プログラムが正しい、ということにはなりません。
HLPが開発されてはじめて、プログラマはそのHLPを使ってプログラムを開発できるのですが、もしHLPのコンパイラにバグ、エラーがあり、プログラマが想定する機能に不具合があれば、社会的な問題を起こします。
プログラムは現代では、私たちの生活にかかせないものであるばかりではなく、社会・経済・政治・科学のすべてに存在し利用されるものです。したがって、想定しない動作や誤った動作、あるいは意図的に破壊する動作、などを引き起こすことがあれば大変です。
しかし、「プログラムがエラーなく正しく動作する」という証明はほぼ不可能であり、テストをくりかえして暫定的に正しいという判断しかできないのです。
大きなソフトウエアでは、開発時にエラーのある確率を予測しその値が小さければリリースするということがなされています。
人間だと良心、法律、道徳などで守られている行為も、プログラムには人間には存在する歯止めのようなものがなく動作します。それを理解することも、このプログラミング学習の重要な目的です。
今のAIブームの背景にあるプログラミングに対する誤解と過信は、これからの世代に大きな負の資産を残しかねません。
どのプログラムも論理的思考(数学的)で成り立つものであり、それにより作成されるプログラムは正しいという仮説の検証を数学的な証明方法で行おうとする研究プロジェクトが、80年代にDOD(米国国防省)の研究機関と大学との協力で始動しました。国防に使われるコンピュータのOSの正しさを検証するために、その仕様記述の言語が設計され、数学的証明が試みられました。
限定されたプログラムしか検証できないという結果が出て、研究は今では下火になっていますが継続されています。
大きな規模のプログラムの正しさの証明を数学的な方法で行うのは現実的ではないため、いろんな経験則的なテスト手法で検証が行われています。でも、完ぺきではありません。最終的には人間が責任をもってするものであり、未知な部分をできるだけユーザに伝える責任があります。
自動車の自動運転もプログラムであり、エラーがないという保証はできません。したがって、事故の可能性も確率的手法で説明されていますが、先日も踏切で止まらずに大事故になりかけた、というニュースが米国でありました。
また、今の生成AIが生成されたものをどのように検証するのか、という研究もこれからであり、難問だと想像されます。
次回は、簡単なプログラミング例を紹介し、プログラミングの楽しさを味わっていただきます。
(1)数字列を大きいものから小さいものへ並べ替えるソートのプログラム——数字の数が、膨大になればプログラムによって計算時間が指数的に増えます。
(2)ソートされた数字列の中から、指定する数字の位置を見つける検索のプログラム
参考資料
ソフトウエアテストの技法
PythonプログラミングABC
https://plato.stanford.edu/entries/turing-machine/#DefiTuriMach
https://rocq-prover.org/
著者:松尾正信
株式会社京都テキストラボ代表取締役