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