プログラムを書くことができるようになり、この先、システムエンジニアとして顧客のシステム要求分析や要件定義といった上流工程を目指す方、データサイエンティストとして世の中の動きをとらえようという方、研究者としてソフトウェア工学の道に進む方のために、付録を用意した。また、IT機器に関心を持つ方向けに、読み物として楽しんでもらえるよう配慮したつもりである。
目次
コンピュータは全能ではない
さて、私たちはなぜプログラムを作るのだろうか?――それは、目の前に何か課題があり、それを解決するためである。課題は、市場調査結果の統計処理かもしれないし、新しいゲームを作ることかもしれない。
こうした課題を解く手段として、私たちは適切なプログラミング言語を選んで、プログラムを設計・製造する。このとき、解くべき課題をシステム要求(システム化要求、要求定義)と呼ぶ。
先輩プログラマの話を聞いたり、他のプログラマが書いたソースコードを読んでいると、プログラミングの世界は果てしなく続くように感じたかもしれない。
こうした課題を解く手段として、私たちは適切なプログラミング言語を選んで、プログラムを設計・製造する。このとき、解くべき課題をシステム要求(システム化要求、要求定義)と呼ぶ。
先輩プログラマの話を聞いたり、他のプログラマが書いたソースコードを読んでいると、プログラミングの世界は果てしなく続くように感じたかもしれない。
たしかに、研究者や技術者が知恵を寄せ合って、そしてAIの力を借りることで、多くの課題を解決できる万能なプログラムを書くことはできる。しかし、人間が作ったものである以上、すべての課題を解決できる全能なプログラムは実在しない。
考えみれば当たり前の話なのだが、仕事でシステム開発に追われていると、この当たり前の前提を忘れてしまうことがある。
なぜ全能なプログラムは実在しないのか、万能なプログラムとの境界線はどのあたりにあるのか、システム要求に制約はあるのか――これらはソフトウェア工学のテーマなのだが、ここでは、コンピュータの歴史を振り返りながら、その一部をお伝えしたい。
考えみれば当たり前の話なのだが、仕事でシステム開発に追われていると、この当たり前の前提を忘れてしまうことがある。
なぜ全能なプログラムは実在しないのか、万能なプログラムとの境界線はどのあたりにあるのか、システム要求に制約はあるのか――これらはソフトウェア工学のテーマなのだが、ここでは、コンピュータの歴史を振り返りながら、その一部をお伝えしたい。
数のはじまり――計数化と符号化
話は有史以前、人類が文字をもたない時代に遡る。
人類は、「文字」より先に「数字」を残している。文字はなくても物語を口伝で伝えることができる。だが、狩りで獲った獲物や畑から収穫した作物を数えて分配するには計算が不可避であり、その結果を残すためにも「数字」が欠かせない。文字をもたなかったインカ文明も、キープというひもを使って「数字」を記録に残していた。
人類は、「文字」より先に「数字」を残している。文字はなくても物語を口伝で伝えることができる。だが、狩りで獲った獲物や畑から収穫した作物を数えて分配するには計算が不可避であり、その結果を残すためにも「数字」が欠かせない。文字をもたなかったインカ文明も、キープというひもを使って「数字」を記録に残していた。
つまり、人類は、かなり早い段階で、数えたり計算ができる「数字」という符合を発明している。ここでは、数えたり計算できる数のことを計数化、その数を記録として残す数字のことを符号化と呼ぶことにする。
計数化(計算できる)と符号化(記録できる)は、数千年を経て登場するコンピュータの基本的特性に組み込まれていく。
計数化(計算できる)と符号化(記録できる)は、数千年を経て登場するコンピュータの基本的特性に組み込まれていく。
小石から算盤へ
数の計算は、最初は人間の「脳」を使って暗算で処理していた。だが、扱う数の桁が大きくなり、計算量が増えると、暗算だけでは処理しきれなくなってくる。そこで、指を折ったり、小石や貝殻を使って計算の途中経過を残せるようにした。
古代メソポタミアでは、土や砂の上に線をひき、そこに小石を置いて計算していた。古代ローマでは、青銅製の板に溝を刻み、そこに嵌め込んだ珠を上下に動かす溝そろばんを発明した。
古代中国では、長さ3~14cmの木製または竹製の細長い算木を縦または横に並べた。足し算や引き算の結果で算木の並びを変えることで、計算の途中経過を残すことができる。
古代中国では、長さ3~14cmの木製または竹製の細長い算木を縦または横に並べた。足し算や引き算の結果で算木の並びを変えることで、計算の途中経過を残すことができる。
算木を並べるのに使った板を算盤と呼ぶ。位取りができるように方眼状になっている。算木と算盤が合体し、14世紀頃の中国でそろばんが発明された。日本には15世紀頃に入ってきた。
四則計算のうち、足し算と割り算はそろばんを使って簡単に計算できるが、掛け算と割り算には手間がかかる。そこで、中国では1から9の数同士を掛け算した結果を暗記する九九が誕生し、3~4世紀頃に日本にもたらされた。ドイツやインドでは1~19の九九が考案された。
四則計算のうち、足し算と割り算はそろばんを使って簡単に計算できるが、掛け算と割り算には手間がかかる。そこで、中国では1から9の数同士を掛け算した結果を暗記する九九が誕生し、3~4世紀頃に日本にもたらされた。ドイツやインドでは1~19の九九が考案された。
科学革命と機械式計算機
17世紀に入り科学革命がはじまると、惑星の位置や船の航路を割り出すために、それまでになかった大量の計算を行う必要に迫られた。
スコットランドの貴族ジョン・ネイピアは、自らの領地の収穫を増やすために肥料や揚水機の研究をしたり、スペインの侵攻に備えて軍事兵器を考案しているが、それらを実用化するために膨大な量の科学計算が必要だった。そこで1594年に、かけ算を足し算に、割り算を引き算に変える対数を編み出した。ネイピアは20年かけて7桁の数の対数表を発表するが、その計算を楽にするためにネイピアの骨という道具を発明した。10本の木の棒を並べ替えることで、複数桁の掛け算や割り算を行うことができた。
1620年、イギリスの数学者で天文学者のエドマンド・ガンターは、ネイピアの対数に着想を得て、長さ60cm、幅4cmの細長い板に数直線と三角関数の値、常用対数の目盛りを刻み、それをコンパスで測ることで割り算や掛け算を簡単に計算できる対数尺を考案する。
1632年、イングランドの数学者ウィリアム・オートレッドは、2つの対数尺を組み合わせることで掛け算と割り算を直接計算できることに気づき、複数の尺をずらして計算をするという現代の計算尺の原型を考案する。
1632年、イングランドの数学者ウィリアム・オートレッドは、2つの対数尺を組み合わせることで掛け算と割り算を直接計算できることに気づき、複数の尺をずらして計算をするという現代の計算尺の原型を考案する。
1623年、ドイツでヘブライ語の教授をしていたヴィルヘルム・シッカートは世界で初めて機械式計算機「Calculating Clock」(計算する時計)を2台、製作した。1台は、ティコ・ブラーエが残した膨大な観測記録を整理し、計算し、惑星運動の法則性を発見した天文学者のヨハネス・ケプラーに贈った。「Calculating Clock」は現存しないが、シッカートがケプラーに送った手紙から計算機を復元したところ、6桁の加減算、および複数のネイピアの骨を使った乗除算ができることが分かった。また、オーバーフローが発生したときにはベルを鳴らした。
「人間は考える葦である」という名言を残したフランスの哲学者ブレーズ・パスカルは、税務官吏であった父が、毎日膨大な量の計算に追われるのを見て育った。彼は16歳の時、誰でも早く正確な計算ができる機械式計算機を製作しようと思い立ち、3年をかけて、1642年にパスカリーヌを完成させる。パスカリーヌは、真鍮や銅で作った歯車や部品を組み合わせ、0から9の数字が書かれた歯車を鉄筆で回転させることで、四則計算を行うことができた。
パスカルは10年間に53台のパスカリーヌを製造するが、歯車のかみ合わせなどの工作精度が低く、計算結果が間違っていることも多く、結局、1台も売れなかった。
パスカルは10年間に53台のパスカリーヌを製造するが、歯車のかみ合わせなどの工作精度が低く、計算結果が間違っていることも多く、結局、1台も売れなかった。
1671年に、「立派な人間が計算などという誰でもできることに時間をとられるのは無駄だ」という考えを持っていたドイツの哲学者ゴットフリート・ライプニッツは、階段状に歯の付いたドラムを使った機械式計算機「Step Reckoner」を考案した。
フランス陸軍行政官だったシャルル・グザビエ・トマ・ド・コルマは、ライプニッツが発明した機械式計算機「Step Reckoner」をベースに、手でクランクを回して計算を行う「アリスモメーター」を考案し、1820年に特許を取得した。
しかし、工作精度が計算精度を左右する問題が付きまとい、30年かけてようやくロンドン万博に出品し、この年から量産を開始する。商業的に成功した最初の機械式計算機となった。
しかし、工作精度が計算精度を左右する問題が付きまとい、30年かけてようやくロンドン万博に出品し、この年から量産を開始する。商業的に成功した最初の機械式計算機となった。
スウェーデンに生まれロシアのサンクトペテルブルクで働いていた技術者ヴィルゴット・オドネルは、機械式計算機「アリスモメーター」を修理していたとき、重くてかさばるシリンダー部分を小さい風車ディスクに置き換えられることに気付いた。1873年に試作品を完成し、いくつかの国で特許を取得した。その後の改良を経て、1890年に「オドネル計算機」の量産を開始する。翌年にはドイツに工場を開いて生産を行うとともに、その設計を公開し、世界中でコピー品が作られるようになった。
電気式計算機から電卓へ
1964年に、早川電気工業(のちのシャープ)は日本初の商用電卓「COMPET CS-10A」を発売する。
ニキシ管による20桁表示で、ゲルマニウム・トランジスタ530個とダイオード2,300個を含む約4,000点の部品からなり、重さは25kg。演算時間は、毎秒加算80回、減算60回、乗算2.5回、除算1.2回だ。定価は53万5000円と、当時の大衆向け乗用車と同じ値段だった。
ニキシ管による20桁表示で、ゲルマニウム・トランジスタ530個とダイオード2,300個を含む約4,000点の部品からなり、重さは25kg。演算時間は、毎秒加算80回、減算60回、乗算2.5回、除算1.2回だ。定価は53万5000円と、当時の大衆向け乗用車と同じ値段だった。
こうした300年以上の時間をかけ、人間の脳に頼ることなく計数化が可能になった。
1960年代後半から1970年代にかけて電卓は小さく高性能になっていき、いくつかの数を記憶することはできるようになるが、符号化の役割は異なる種類の機械が担うことになる。それがコンピュータである。
1960年代後半から1970年代にかけて電卓は小さく高性能になっていき、いくつかの数を記憶することはできるようになるが、符号化の役割は異なる種類の機械が担うことになる。それがコンピュータである。
コンピュータの誕生
1801年にフランスのフランスの発明家ジョゼフ・マリー・ジャカールがジャカード織機を発明する。パンチカードの穴の位置によって、複雑で異なる模様を織ることができる画期的な装置で、このアイデアは、後のプログラム内蔵型コンピュータに繋がる。
パンチカードを使うアイデアは、1834年にチャールズ・バベッジが開発していた解析機関に応用した。
解析機関は、科学技術計算で求められるようになってきた何種類もの数表を自動計算で作り出そうという汎用性のある計算機のことだ。決まった計算式を手入力で計算する機械式計算機や電卓とは根本的に異なる目的をもっており、現代のコンピュータの直接的な祖先と言える。さらに、演算装置、記憶装置、データ入出力装置というコンピュータとしての基本構成が揃っていた。
しかし、完璧主義者であったバベッジは、設計は続けたものの、ついに解析機関を完成させることができなかった。
解析機関は、科学技術計算で求められるようになってきた何種類もの数表を自動計算で作り出そうという汎用性のある計算機のことだ。決まった計算式を手入力で計算する機械式計算機や電卓とは根本的に異なる目的をもっており、現代のコンピュータの直接的な祖先と言える。さらに、演算装置、記憶装置、データ入出力装置というコンピュータとしての基本構成が揃っていた。
しかし、完璧主義者であったバベッジは、設計は続けたものの、ついに解析機関を完成させることができなかった。
詩人バイロンの娘エイダ・ラブレス伯爵夫人は、数学者である母アナベラ・ミルバンクの影響を受けており、解析機関に取り組んでいたバベッジを紹介された。エイダはバベッジの弟子として、解析機関のアイデアを理解し、1843年にパンチカードを利用してベルヌーイ数を求めるためのプログラムを開発した。これが世界初のコンピュータ・プログラムとされている。
ここで、プログラムは、実際にそれが動くハードウェアがなくても作ることができるということ覚えておいていただきたい。
彼女は「ジャカード織機が花や葉を描くように、解析機関は代数学の模様を織り上げる」と書き残している。エイダの名は、1983年に登場したプログラミング言語「Ada」に冠された。
ここで、プログラムは、実際にそれが動くハードウェアがなくても作ることができるということ覚えておいていただきたい。
彼女は「ジャカード織機が花や葉を描くように、解析機関は代数学の模様を織り上げる」と書き残している。エイダの名は、1983年に登場したプログラミング言語「Ada」に冠された。
日本電気で遠方監視制御装置、自動交換機などのリレー回路の設計に取り組んでいた中嶋章は、ブール代数の存在を知らなかったが、独自の発想でリレー回路によって論理回路を組み立てることで足し算ができることに気付き、1935年に「継電器回路の構成理論」という論文を発表した。この論文は海外でも参照され、電子計算機の開発が加速する。
中嶋とは独立して、アメリカの電気工学者クロード・シャノンは1937年にベル研究所で修士論文「リレーとスイッチ回路の記号論的解析」を発表した。ブール代数とスイッチング回路の融合が論じられており、1940年には35歳未満の研究者による優れた工学論文に贈られるアルフレッド・ノーブル賞を受賞した。
1939年に、アメリカ人科学者のジョン・アタナソフとクリフォード・E・ベリーがアイオワ州立大学でアタナソフ&ベリー・コンピュータ(略称:ABCマシン)の試作機を完成させる。ABCは、真空管約300本を使い、連立方程式を解くために特化された電子計算機だったが、二進数を用いて電子的に計算を行うことや、計算部分とメモリ部分を分離することなど、現在のデジタル・コンピュータの特性を備えていた。
プログラム内蔵方式ではないものの、並列コンピューティングや再生式メモリという発明まで織り込まれている。1973年のミネアポリス連邦地方裁判所の判決により世界初のデジタルコンピュータとして認められている。
プログラム内蔵式ではなく、プラグ盤とスイッチ群を操作して配線を変更することで計算式を変更できた。ただし、計数とブール演算という暗号解読に特化した設計であった。
1935年から Zuse Z1 を設計したドイツ人のコンラート・ツーゼは、2進法とリレー回路を使った Zuse Z3 を1941年に完成させ、ドイツ航空機研究所で翼のフラッター現象の統計解析に利用された。
紙テープを使ってプログラムをすることが可能だったが、条件分岐命令は備えていない。浮動小数点演算において、正の無限大・負の無限大・未定義という値をとることができた。
紙テープを使ってプログラムをすることが可能だったが、条件分岐命令は備えていない。浮動小数点演算において、正の無限大・負の無限大・未定義という値をとることができた。
ENIACは1万7千本あまりの真空管を用いており、幅24メートル、高さ2.5メートル、奥行き0.9メートル、総重量30トンに及ぶ巨大な計算装置で、消費電力は150キロ・ワットに達した。
ENIACは2進法ではなく10進法により計算を行い、1秒間に5千回の加算、14回の乗算を行うことができた。しかし、プログラムを変更するためには人力で配線を変える必要があり、この点で現在のプログラム内蔵式コンピュータとは大きく異なる。
ENIACは2進法ではなく10進法により計算を行い、1秒間に5千回の加算、14回の乗算を行うことができた。しかし、プログラムを変更するためには人力で配線を変える必要があり、この点で現在のプログラム内蔵式コンピュータとは大きく異なる。
1956年9月、富士通信機製造(のちの富士通)が、日本初の商用リレー式計算機「FACOM 128」を文部省統計数理研究所へ納入した。リレー式計算機は原理的にプログラム内蔵方式でないため、厳密には「コンピュータ」と呼べない。
1964年4月、IBMはメインフレーム「System/360」を発表する。同一の命令セット・アーキテクチャを、最上位機種では可能な限りハードウェアで直接的に実装し、下位機種ではマイクロプログラム方式の活用により比較的低コストで実装するというコンピュータ・アーキテクチャを確立したことで、IBMはさまざまな価格帯のモデルを、さまざまな市場へ展開していくことになる。1964年当時の最上位機種は、計算性能は約1MIPS、主記憶容量は8MB、補助記憶装置は最大8MB。
System/360 は8ビットを1バイトとして扱ったが、この後のコンピュータの標準規格となる。また、同一の命令セット・アーキテクチャを維持したことから、それまでコンピュータ毎に作られてきた基本制御プログラムが共通化され、やがて OS(基本ソフトウェア)と呼ばれるようになる。
System/360 は、あらゆる分野で利用できることを目的としたことから、汎用機と呼ばれるようになる。IBMは、科学技術計算用のプログラミング言語 FORTRAN と、事務処理用の COBOL の両方の特性を兼ね備えた PL/I を System/360 用のプログラミング言語として完成させた。
IBMは System/360 に開発に、国家事業のアポロ計画を超える3兆円を投入したといわれる。
System/360 は、事務処理にも用いることから、文字も数値として扱うことができた。つまり、数字だけでなく文字も符号化できるようになった。コンピュータが機械式計算機や電卓と一線を画すのが、この符号化の機能だ。
System/360 では文字を符号化するための EBCDIC という文字コードを用意した。
System/360 は、あらゆる分野で利用できることを目的としたことから、汎用機と呼ばれるようになる。IBMは、科学技術計算用のプログラミング言語 FORTRAN と、事務処理用の COBOL の両方の特性を兼ね備えた PL/I を System/360 用のプログラミング言語として完成させた。
IBMは System/360 に開発に、国家事業のアポロ計画を超える3兆円を投入したといわれる。
System/360 は、事務処理にも用いることから、文字も数値として扱うことができた。つまり、数字だけでなく文字も符号化できるようになった。コンピュータが機械式計算機や電卓と一線を画すのが、この符号化の機能だ。
System/360 では文字を符号化するための EBCDIC という文字コードを用意した。
この後、国産の汎用機は EBCDIC を日本語(カタカナ)対応に拡張し、さらに漢字を加えた JIS X 0208(いわゆるJISコード)、古今東西にあるあらゆる文字を表現できる Unicode へと進化していく。文字の符号化については、当サイトの「IT技術 - 文字コードの話」をご覧いただきたい。
さらに、画像や音声も符号化され、コンピュータで扱うことができるようになる。
さらに、画像や音声も符号化され、コンピュータで扱うことができるようになる。
計数化と符号化の制約
これまで見てきたように、コンピュータが扱える課題は、まず、数えたり計算できる計数化されている必要があり、次に、それを記録として残す符号化手段が用意されていなければならない。
しかし現時点において、計数化と符号化には制約があり、これがコンピュータが全能ではない根拠となる。では、どのような制約があるのだろうか――。
しかし現時点において、計数化と符号化には制約があり、これがコンピュータが全能ではない根拠となる。では、どのような制約があるのだろうか――。
まず計数化の制約だが、現代のコンピュータは ENIACに比べて桁違いに高速で容量が増えたが、それでも計算速度は計測可能な有限なものであるし、容量も無限ではない。つまり、無限大に発散するような計算を行うことはできない。たとえば、円周率の完全解を計算することはできないし、完全暗号化のために無限に大きな素数を計算することもできない。
こうして、もしシステム要求を分析する過程で計数化の制約に引っかかるようなら、その要求を変更しなければいけない。
次に符号化の制約だが、人間の五感を例にとると、数字、文字、画像などは符号化できるから視覚はほぼカバーできる。音声も符号化できるから、聴覚もカバーできるといっていいだろう。触覚については、圧力や摩擦力で符号化できる範囲でカバーできる。しかし、味覚、嗅覚となると、かなり怪しい。ある物質の濃度を符号化することはできるが、それが味覚や嗅覚と一致するかというと、必ずしもそうはならないからだ。
もしシステム要求を分析する過程で符号化できない/するのが難しい要素が出てきたら、その要求を変更しなければいけない。
計数化や符号化ができたら、そのレンジ(range;範囲)を具体的に決めておく必要がある。これまで見てきたように、機械式計算機に電卓にせよ、計算できる桁数には限りがある。これがレンジだ。
アナログ回路を扱ったことがある方は、計測器でレンジを設定するのは当たり前のことだろうが、ソフトウェア専業だとピンとこないかもしれない。
一般的に64ビットCPUで扱える整数は、おおよそ-920京から+920京の範囲である。通常の事務計算であれば十分すぎる範囲だが、科学計算では不足するかもしれない。また、古い32ビットCPUだと、おおよそ-21億から+21億の範囲で、これだと事務計算でも不足することがあるだろう。たとえば大企業の財務の金額を扱うのには桁が足りない。また、1970年1月1日0時を原点とする経過秒数をあらわす UNIX時間は、32ビットでカウントする場合には2038年1月19日に桁あふれを起こしてしまう。
具体的に検討せずに、レンジを必要以上に大きなものにすると、その分、計算速度が低下したりメモリ使用量が増え、コストパフォーマンスが悪いシステムになってしまう。趣味のプログラミングならともかく、仕事では常にコストを気にしなければならない。
こうして、もしシステム要求を分析する過程で計数化の制約に引っかかるようなら、その要求を変更しなければいけない。
次に符号化の制約だが、人間の五感を例にとると、数字、文字、画像などは符号化できるから視覚はほぼカバーできる。音声も符号化できるから、聴覚もカバーできるといっていいだろう。触覚については、圧力や摩擦力で符号化できる範囲でカバーできる。しかし、味覚、嗅覚となると、かなり怪しい。ある物質の濃度を符号化することはできるが、それが味覚や嗅覚と一致するかというと、必ずしもそうはならないからだ。
もしシステム要求を分析する過程で符号化できない/するのが難しい要素が出てきたら、その要求を変更しなければいけない。
計数化や符号化ができたら、そのレンジ(range;範囲)を具体的に決めておく必要がある。これまで見てきたように、機械式計算機に電卓にせよ、計算できる桁数には限りがある。これがレンジだ。
アナログ回路を扱ったことがある方は、計測器でレンジを設定するのは当たり前のことだろうが、ソフトウェア専業だとピンとこないかもしれない。
一般的に64ビットCPUで扱える整数は、おおよそ-920京から+920京の範囲である。通常の事務計算であれば十分すぎる範囲だが、科学計算では不足するかもしれない。また、古い32ビットCPUだと、おおよそ-21億から+21億の範囲で、これだと事務計算でも不足することがあるだろう。たとえば大企業の財務の金額を扱うのには桁が足りない。また、1970年1月1日0時を原点とする経過秒数をあらわす UNIX時間は、32ビットでカウントする場合には2038年1月19日に桁あふれを起こしてしまう。
具体的に検討せずに、レンジを必要以上に大きなものにすると、その分、計算速度が低下したりメモリ使用量が増え、コストパフォーマンスが悪いシステムになってしまう。趣味のプログラミングならともかく、仕事では常にコストを気にしなければならない。
高級言語の登場
コンピュータを動かすソフトウェアを作るための基盤がプログラミング言語であるが、これも一朝一夕でできたわけではない。その歴史を追ってみることにしよう。
前述した ENIAC はソフトウェアを搭載していなかった。異なる計算をするには、回路(ハードウェア)を組み替えなくてはならなかった。
ソフトウェアで制御できる最初のコンピュータはイギリスの Colossus だったことは前述の通りだ。
この頃のコンピュータは、その回路の特性に合わせて制御プログラムを書き、紙テープやパンチカードでコンピュータに読み込ませる方式だった。各々の回路に合わせ、直接コンピュータが解釈できる2進数(または16進数)で書くことから、機械語(マシン語)と呼ばれた。
前述した ENIAC はソフトウェアを搭載していなかった。異なる計算をするには、回路(ハードウェア)を組み替えなくてはならなかった。
ソフトウェアで制御できる最初のコンピュータはイギリスの Colossus だったことは前述の通りだ。
この頃のコンピュータは、その回路の特性に合わせて制御プログラムを書き、紙テープやパンチカードでコンピュータに読み込ませる方式だった。各々の回路に合わせ、直接コンピュータが解釈できる2進数(または16進数)で書くことから、機械語(マシン語)と呼ばれた。
紙テープやパンチカードでは、穴が開いているか否かで0と1の2進数を表現する。これを人間が読み書きするには、それなりの技術と鍛錬が必要だ。私も学生時代に、毎日紙テープを読む修練を積んだものである。ここに、プログラマという技能職が誕生する。
システムの規模が大きくなり、多くの業種にシステム導入が進むと、当然、プログラマの数が足りなくなる。そこで、回路への制御命令を2進数ではなく、人間が読んで分かるような記号(ニモニック)に置き換えることにした。これがアセンブリ言語である。アセンブリ言語から機械語に変換するプログラムをアセンブラと呼ぶ。
左図は、8ビットCPU「8080」のアセンブリ言語の例だ。右半分がアセンブリ言語で、左側がアドレスと機械語になっている。MOVはmoveの略なので何となく分かるだろうが、JZは「Zフラグが1の時にジャンプする」と分かりにくい。
システムの規模が大きくなり、多くの業種にシステム導入が進むと、当然、プログラマの数が足りなくなる。そこで、回路への制御命令を2進数ではなく、人間が読んで分かるような記号(ニモニック)に置き換えることにした。これがアセンブリ言語である。アセンブリ言語から機械語に変換するプログラムをアセンブラと呼ぶ。
左図は、8ビットCPU「8080」のアセンブリ言語の例だ。右半分がアセンブリ言語で、左側がアドレスと機械語になっている。MOVはmoveの略なので何となく分かるだろうが、JZは「Zフラグが1の時にジャンプする」と分かりにくい。
FORTRAN を使って、2024年がうるう年かどうかを判定するプログラムを以下に掲げる。プログラムは英語に近く、人間が読みやすいことから高級言語と呼ばれるようになる。
なお、初期の FORTRAN では大文字と小文字の区別がなく、行頭から5文字目まではコメントや行番号用に空けておく。FORTRAN で書かれたプログラムは、コンパイラと呼ばれるプログラムを使って、そのコンピュータが直接実行できる機械語に変換する。
なお、初期の FORTRAN では大文字と小文字の区別がなく、行頭から5文字目まではコメントや行番号用に空けておく。FORTRAN で書かれたプログラムは、コンパイラと呼ばれるプログラムを使って、そのコンピュータが直接実行できる機械語に変換する。
! うるう年の判定:FORTRAN SUBROUTINE IS_LEAP_YEAR(YEAR, RESULT) INTEGER YEAR, RESULT IF (MOD(YEAR, 4) .EQ. 0) THEN IF (MOD(YEAR, 100) .NE. 0 .OR. MOD(YEAR, 400) .EQ. 0) THEN RESULT = 1 ELSE RESULT = 0 ENDIF ELSE RESULT = 0 ENDIF RETURN END PROGRAM MAIN INTEGER YEAR, RESULT YEAR = 2024 CALL IS_LEAP_YEAR(YEAR, RESULT) IF (RESULT .EQ. 1) THEN WRITE(*,*) YEAR, '年はうるう年である.' ELSE WRITE(*,*) YEAR, '年はうるう年ではない.' ENDIF STOP END
FORTRAN は科学技術計算を目指したプログラミング言語であったが、数学のアルゴリズムという観点でみると、条件分岐などの制御構造を入れ子にすることができないという欠点があった(後のバージョンで改善されている)。
ヨーロッパの研究者たちは、こうした FORTRAN の欠点を改良し、世界共通のプログラミング言語として ALGOL(ALGOrithmic language)を考案し、1958年に公表した。
ALGOL は、モジュールを組み合わせてプログラムを構築する手続き型プログラミング言語の先祖として、その後、C言語、Pascal、PL/Iなどの多くのプログラミング言語に影響を与えた。
また、ALGOL はハードウェアの特性に関係なくプログラムを書くことができることを目指し、コンパイラが機械語に変換するのではなく、仮想的な機械語である中間コードに変換する。この考えは、のちにJavaに引き継がれることになる。
ヨーロッパの研究者たちは、こうした FORTRAN の欠点を改良し、世界共通のプログラミング言語として ALGOL(ALGOrithmic language)を考案し、1958年に公表した。
ALGOL は、モジュールを組み合わせてプログラムを構築する手続き型プログラミング言語の先祖として、その後、C言語、Pascal、PL/Iなどの多くのプログラミング言語に影響を与えた。
また、ALGOL はハードウェアの特性に関係なくプログラムを書くことができることを目指し、コンパイラが機械語に変換するのではなく、仮想的な機械語である中間コードに変換する。この考えは、のちにJavaに引き継がれることになる。
MITの人工知能研究者ジョン・マッカーシーは、1936年にアロンゾ・チャーチが提案したラムダ計算式の影響を受け、ALGOL の設計にも触発され、関数型言語の先祖となる LISP を1958年に考案した。LISP には、ガベージコレクション、動的型付け、木構造といったデータ構造に加え、条件分岐、再帰などの制御の仕組みが備わっており、その後、Forth、Haskell、JavaScript、LOGO、Python、Rubyなど多くのプログラミング言語に影響を与えた。
LISP の最大の特長は、自分自身を記述する meta-circular evaluator という仕組みが備わっていることだ。どういうことかというと、meta-circular evaluator をLISP以外のプログラミング言語で実装すれば、すぐにLISPインタプリタが手に入るということを意味する。インタプリタはコンパイラと違い、プログラムを逐次解釈し、コンピュータが実行できる機械語に変換する。しかも、meta-circular evaluator は小さいプログラムで実装が容易だった。最初の LISP は、FORTRAN と同じ IBM 704 上に実装された。
FORTRAN が科学技術計算が得意であるのに対し、文系事務員でもプログラミングできる言語として、アメリカ政府主導で、1959年に COBOLが開発された。英語に近い文法体系を持っており、FORTRAN や LISP に比べて冗長だが可読性の高いプログラムを書くことができる。
こうして、1960年までに現代のプログラミング言語の祖先となる高級言語が出そろった。
FORTRAN が科学技術計算が得意であるのに対し、文系事務員でもプログラミングできる言語として、アメリカ政府主導で、1959年に COBOLが開発された。英語に近い文法体系を持っており、FORTRAN や LISP に比べて冗長だが可読性の高いプログラムを書くことができる。
こうして、1960年までに現代のプログラミング言語の祖先となる高級言語が出そろった。
チューリング完全性とスクリプト言語
話は少し遡るが、1936年にアラン・チューリングは、万能チューリングマシンという概念を提示する。
マス目に分かれた任意の長さのテープと、そのテープの上を1マスずつ前後に移動でき、現在位置のマス目の記号を読み取ったり書き込んだりできるヘッドで構成される簡単な機械をチューリングマシンと呼ぶ。
マス目に分かれた任意の長さのテープと、そのテープの上を1マスずつ前後に移動でき、現在位置のマス目の記号を読み取ったり書き込んだりできるヘッドで構成される簡単な機械をチューリングマシンと呼ぶ。
この機械に外部から、(1)有限個の記号の定義、(2)あらかじめ記号の列が書き込まれたテープ、(3)ヘッドの状態を遷移させる規則の集合を与えると、さまざまな計算ができるというもので、この動きを完全に再現できるハードウェアやソフトウェアを万能チューリングマシンまたはチューリング完全性と呼ぶ。
数学者フォン・ノイマンは、ENIAC の制約を指摘し、プログラム内蔵式コンピュータを提案したことから、プログラム内蔵式の現代のコンピュータのアーキテクチャをノイマン型コンピュータと呼ぶ。ノイマン型コンピュータでは、チューリングマシンの (1)はハードウェア、(2)と(3)がソフトウェア(プログラム+データ)に相当する。
数学者フォン・ノイマンは、ENIAC の制約を指摘し、プログラム内蔵式コンピュータを提案したことから、プログラム内蔵式の現代のコンピュータのアーキテクチャをノイマン型コンピュータと呼ぶ。ノイマン型コンピュータでは、チューリングマシンの (1)はハードウェア、(2)と(3)がソフトウェア(プログラム+データ)に相当する。
計数化・符号化できるシステム要求をプログラムとして実装するとき、チューリング完全性が担保されているシステムを適用することが大前提となる。
チューリング完全性とは、見方を変えると、プログラミング言語は自分自身(コンパイラまたはインタプリタ)を記述できる必要がある。
LISPは、その成り立ちから、チューリング完全性をパスしている。しかし、初期の FORTRAN や COBOL はパスしない。これらはプログラミング言語ではあるが、その適用範囲の制約を受けることがあるので注意が必要だ。
1970年代後半に入ると、プログラミング言語がどんどん高機能で複雑になり、言語毎に専門プログラマが必要になってしまった。そこで、ある特定の作業に特化したプログラミング言語が登場する。これをスクリプト言語と呼ぶ。
たとえば、1977年に登場した AWK はテキスト処理に特化したスクリプト言語だ。Microsoft Office製品向けの VBA(Visual Basic for Applications)、ブラウザが内蔵する JavaScript、Webサーバ向けの Perl といったスクリプト言語が登場する。HTMLやCSSもスクリプト言語の一種といっていいかもしれない。
ここで、スクリプト言語はチューリング完全性ではないことに留意しよう。
チューリング完全性とは、見方を変えると、プログラミング言語は自分自身(コンパイラまたはインタプリタ)を記述できる必要がある。
LISPは、その成り立ちから、チューリング完全性をパスしている。しかし、初期の FORTRAN や COBOL はパスしない。これらはプログラミング言語ではあるが、その適用範囲の制約を受けることがあるので注意が必要だ。
1970年代後半に入ると、プログラミング言語がどんどん高機能で複雑になり、言語毎に専門プログラマが必要になってしまった。そこで、ある特定の作業に特化したプログラミング言語が登場する。これをスクリプト言語と呼ぶ。
たとえば、1977年に登場した AWK はテキスト処理に特化したスクリプト言語だ。Microsoft Office製品向けの VBA(Visual Basic for Applications)、ブラウザが内蔵する JavaScript、Webサーバ向けの Perl といったスクリプト言語が登場する。HTMLやCSSもスクリプト言語の一種といっていいかもしれない。
ここで、スクリプト言語はチューリング完全性ではないことに留意しよう。
システム要求から要件定義へ
数の誕生に始まり、プログラミング言語の歴史まで眺めてきたわけだが、冒頭の問いかけの答えを書いておこう。
なぜ全能なプログラムは実在しないのか、という問いかけだが、「計数化と符号化の制約」に書いたように、無限大に発散するような計算を行うことはできないし、決められたレンジ(範囲)を超える巨大数を扱うこともできないし、符号化できない/するのが難しい問題には対応できないためだ。
だが、万能なプログラムを書くことはできる。そのためにはチューリング完全なアーキテクチャ(開発環境を含む)を選択する。
最後のシステム要求に制約はあるかという問いかけだが、課題をコンピュータで解決するための最上流工程――システム要求から要件定義を起こす手順を下記の通り整理することで、その回答とする。
プログラミングは、あなたの技術力を見せびらかすことではなく、顧客が出してきたシステム要求のような課題を解決するための手段だということを忘れないでいてほしい。
なぜ全能なプログラムは実在しないのか、という問いかけだが、「計数化と符号化の制約」に書いたように、無限大に発散するような計算を行うことはできないし、決められたレンジ(範囲)を超える巨大数を扱うこともできないし、符号化できない/するのが難しい問題には対応できないためだ。
だが、万能なプログラムを書くことはできる。そのためにはチューリング完全なアーキテクチャ(開発環境を含む)を選択する。
最後のシステム要求に制約はあるかという問いかけだが、課題をコンピュータで解決するための最上流工程――システム要求から要件定義を起こす手順を下記の通り整理することで、その回答とする。
- 課題を解決するための手順や成果物をシステム要求として日本語の文章に書き出す。
- そのシステム要求を分析し、計数化できないもの、または符号化できないものを見つけたら、遡ってシステム要求を修正する。
- 計数化や符号化のレンジ(範囲)を定義する。このとき、「汎用性のある」「何でも表せる」などの曖昧な要求でお茶を濁さず、かならず数値化する。
- システム要求がチューリング完全性を求めているのであれば、チューリング完全なアーキテクチャを選択する。
- 開発コストを見積もる。コストが要求を超えるようであれば、遡ってシステム要求を修正する。コストを下げるために要求を絞ってスクリプト言語を導入するのも1つの選択肢となるだろう。
プログラミングは、あなたの技術力を見せびらかすことではなく、顧客が出してきたシステム要求のような課題を解決するための手段だということを忘れないでいてほしい。
参考サイト
- Most Popular Programming Languages 1965 - 2022
- 近代科学資料館には日本一の計算機コレクションがあった:ぱふぅ家のホームページ
- 西暦1617年 - ネイピアの骨の発明:ぱふぅ家のホームページ
- 西暦1620年 - 計算尺の発明:ぱふぅ家のホームページ
- 西暦1623年 - 世界初の機械式計算機:ぱふぅ家のホームページ
- 西暦1642年 - 機械式計算機「パスカリーヌ」の製作:ぱふぅ家のホームページ
- 西暦1822年 - 階差機関の設計:ぱふぅ家のホームページ
- 西暦1847年 - ブール代数:ぱふぅ家のホームページ
- 西暦1851年 - アリスモメーター:ぱふぅ家のホームページ
- 西暦1890年 - オドネル計算機の登場:ぱふぅ家のホームページ
- 西暦1923年 - タイガー計算機:ぱふぅ家のホームページ
- 西暦1946年 - 実用コンピュータ「ENIAC」完成:ぱふぅ家のホームページ
- 西暦1935年 - デジタル回路の創始:ぱふぅ家のホームページ
- 西暦1947年 - トランジスターの発明:ぱふぅ家のホームページ
- 西暦1954年 - FORTRAN が考案される:ぱふぅ家のホームページ
- 西暦1956年 - リレー式計算機「FACOM 128」発売:ぱふぅ家のホームページ
- 西暦1957年 - 世界初の小型純電気式計算機「14-A」:ぱふぅ家のホームページ
- 西暦1962年 - 世界初の電卓「ANITA Mark VIII」:ぱふぅ家のホームページ
- 西暦1964年 - 世界初のスーパーコンピュータ:ぱふぅ家のホームページ
- 西暦1966年 - プログラミング言語「BCPL」:ぱふぅ家のホームページ
- 西暦1969年 - UNIX誕生:ぱふぅ家のホームページ
- 西暦1970年 - プログラミング言語「Pascal」:ぱふぅ家のホームページ
- 西暦1971年 - インテル、4004発表:ぱふぅ家のホームページ
- 西暦1974年 - 世界初のパソコン「アルテア8800」発売:ぱふぅ家のホームページ
- 西暦1977年 - Apple II 発売:ぱふぅ家のホームページ
- 西暦1977年 - スクリプト言語「AWK」:ぱふぅ家のホームページ
- 西暦1978年 - 日本語ワードプロセッサ「JW-10」発表:ぱふぅ家のホームページ
- 西暦1981年 - IBM PC発売:ぱふぅ家のホームページ
- 西暦1982年 - PC-9801発売:ぱふぅ家のホームページ
- 西暦1983年 - ファミリーコンピュータ発売:ぱふぅ家のホームページ
- 西暦1984年 - Macintosh発売:ぱふぅ家のホームページ
- 西暦1987年 - パソコン「X68000」発売:ぱふぅ家のホームページ
- 西暦1990年 - DOS/Vパソコン発表:ぱふぅ家のホームページ
- Most Popular Programming Languages 1965 - 2022
参考書籍
コンピュータが計算機と呼ばれた時代 | |||
著者 | C&C振興財団 | ||
出版社 | アスキー・メディアワークス | ||
サイズ | 単行本 | ||
発売日 | 2005年12月 | ||
価格 | 2,200円(税込) | ||
ISBN | 9784756146779 | ||
戦後、コンピュータが世界中で作られた。日本だけが生き残った。若きエンジニアたちの呼吸も伝わる未公開写真多数。 | |||
ザイログZ80伝説 | |||
著者 | 鈴木哲哉 | ||
出版社 | ラトルズ | ||
サイズ | 単行本 | ||
発売日 | 2020年08月24日頃 | ||
価格 | 2,398円(税込) | ||
ISBN | 9784899774815 | ||
約半世紀に渡ってマニアを魅了し続けるZ80の、あの話とかこの話とか。 | |||
僕らのパソコン10年史 | |||
著者 | SE編集部 | ||
出版社 | 翔泳社 | ||
サイズ | 単行本 | ||
発売日 | 1989年09月01日頃 | ||
価格 | 1,281円(税込) | ||
ISBN | 9784915673399 | ||
12平方ミリメートル、これが1971年に誕生したマイクロプロセッサ4004の大きさである。マイクロプロセッサの技術はコンピュータにまったく新しい歴史を歩ませることになった。混迷の草創期をへて、マイクロプロセッサはパソコンにかたちづくられて世に出た。それから10年の歳月が経過し、80年代が駆け去ろうとしているいま、激動のパソコン史をふりかえってみよう。 | |||
僕らのパソコン30年史 | |||
著者 | SE編集部 | ||
出版社 | 翔泳社 | ||
サイズ | 単行本 | ||
発売日 | 2010年05月 | ||
価格 | 1,980円(税込) | ||
ISBN | 9784798121895 | ||
30年以上を通して変化したパソコンを、写真を多用し世相にも触れながら、わかりやすく解説。第1部を年代ごとのトピックの解説にあて、当時の開発者や関係者への「証言(ターニングポイント)」を盛り込み、開発秘話などを明かしてもらう。第2部ではPCアーキテクチャ、OS、パソコンの聖地アキハバラ、「雑誌」の変遷など、テーマごとにまとめた。 | |||
復刊 計算機の歴史 | |||
著者 | ハーマン・H.ゴールドスタイン/末包良太 | ||
出版社 | 共立出版 | ||
サイズ | 単行本 | ||
発売日 | 2016年07月09日頃 | ||
価格 | 6,380円(税込) | ||
ISBN | 9784320124011 | ||
(この項おわり)