プログラムとは何か
I/O(アイオー)2017年7月号記事のこぼれ話
月刊誌I/O(アイオー)2017年7月号の特集「分野別おススメプログラミング術」に「プログラムとは何か」という記事を書かせていただいた.記事はこう始まる.
プログラミングとは,プログラムを「書く」または「組み立てる」ことです.ではプログラムとはいったい何でしょうか.
答えは是非本誌を手にとって読んでいただきたいので伏せておくが,このブログでは紙面の都合で記事に書けなかったこぼれ話を書いてみようと思う.
記事の中で,世界初のプログラムとしてジャカード織機 (1801) のパンチカードを挙げている.これは正しい歴史なのだが,もうちょっとコンピュータぽいもの,つまりは計算に結びついたものはどうだろうか.
電気で動くデジタルコンピュータだと,ドイツのツーゼZ3 (1941),米国の ENIAC (1946) が最初期の真の(チューリング完全な)コンピュータだと言える.一方で,チューリングが設計したコンピュータ(Bombe) とそれに続く Colossus Mark 1 はチューリング完全ではない.
チューリング完全ではない電動デジタルコンピュータを追っていくと,機械式計算機にたどり着く.歴史的にはシッカートの計算機 (1623) が先だが,シッカートは計算機を完成させることができなかったため,その約20年後に発明されるパスカルの計算機 (1645) のほうが有名だ.このパスカルは「人間は考える葦である」のパスカルと同一人物で,非常に多才な人だったことがこのことからもわかる.パスカルの計算機は現存している(次の写真).
パスカルの機械式計算機は歯車の回転によって足し算と引き算を行うものだ.引き算は9の補数を使うことで足し算と同じ計算機構を使う.歯車の動力は人力だ.ほんの一時期だが,機械式計算機の動力に電動モーターが使われた時代がある.
パスカル以前にはネイピアの骨という興味深い計算機が発明されている.このネイピアはネイピア数に名前を残す数学者ネイピアである.ただしネイピア数を見つけたのはベルヌーイらしい.ネイピアの骨は機械的な仕組みが一切ないので,計算機というよりはそろばんに近い.
パスカルの計算機を任意の数をカウントアップすることで足し算する機械と捉えると,目的にあわせて数値をカウントアップする機械にも視野が広がる.この分野で現在まで使われているものは機械式時計だろう.機械式時計は時刻を知るという目的と同時に,地球から見た太陽の運行をシミュレートする機械としての側面もある.
残念ながら最古の機械式時計がいつ歴史に登場するかはわかっていない.
ヨーロッパに限定すると,1176年にフランスのサンス大聖堂に horologia が設置されたと文献にあり,この horologia が機械式時計を意味するものだと考えられているのだが,実態はわかっていない.
北宋の科学者蘇頌が世界初となる天文時計水運儀象台(すいうんぎしょうだい)を1092年に開発している.
725年に中国で水力で歯車を動かす機械式時計が発明されている.こちらは脱進機を備えていないため,現在の基準からは機械式時計とは呼び難いが,機械的にカウントアップする機構であることは間違いないだろう.発明者は唐の天文学者一行とエンジニア梁令瓚とされる.
恒星や太陽および惑星の運行をシミュレートする機械にまで視野を広げると,古代ギリシャの天文学者ヒッパルコス(紀元前190年頃から前120年頃まで)の発明まで遡る.アンティキティラ島の機械(紀元前150年–前100年?)は,ヒッパルコスの理論にもとづいて作られていると考えられており,ひょっとしたらヒッパルコス自身が作成したのではないかとも言われている.
アンティキティラ島の機械のような複雑な機構はヨーロッパではその後1,000年以上現れないが,イスラム世界に引き継がれたのかもしれない.次の写真はイスラム世界で開発が進んだアストロラーベという天体運行シミュレータ(兼計測機器)だ.
というわけで,人類と計算機械の歴史ってのはかくも長いのだなと実感するわけである.ひょっとしたら,ヒッパルコスよりも以前に,古代エジプト人たちがなにか計算する機械を発明していたのではないかと,個人的には妄想もしている.
最近,計算機プログラミングに関する良さそうな本が出たので紹介する.
Al Sweigart 著「退屈なことはPythonにやらせよう」だ.
最初に覚えるプログラミング言語は何が良いか,あるいは何が良くないか(例えばCは使うべきではない等)については,一種の宗教戦争になっている.僕自身,もし「計算機科学者を育てるなら」という形容矛盾した前提条件を与えられたなら「機械語,Lisp(つまりLisp機械の機械語),Haskell(つまり数学者の機械語)」の三つをこたえるだろう.
しかし,学習のしやすさと,数学計算や機械学習のライブラリの充実度を考えると,まず最初に手にする言語は Python で良かろうと僕は思う.
というわけで,本書をプログラミングの取っ掛かりにお勧めする.英語で読める,あるいは読みたいという方は,こちらに全文が無料公開されているようだ.
Happy programming!