SSブログ

特集プログラム言語は面白い(その1)(月刊ASCII 1988年5月号11) [月刊アスキー廃棄(スクラップ)]

この号から始まった「特集プログラム言語は面白い」をスクラップする。
ASCII1988(05)f01プログラム言語_W520.jpg
プログラムが面白くてパソコンという趣味を始めたので何を今更特集していたのかとも思うが、何より懐かしいのでスクラップする。
プログラム言語はなぜ面白いのか?
 プログラムを書いたことがありますか?という質問に対して、趣味でコンピュータをお持ちの方なら、少なくとも70%の人がYesとこたえるだろう。ここでは,そうした人も含めて,もう少しだけしつこくプログラム言語の面白さ,プログラミングの楽しさについて考えてみることにしたい。本誌では、この特集に続いて12回の予定でプログラミングについての連載を予定している.これは「病みつきになるほど面白いプログラム言語」の入門のすすめである.
確かに趣味でパソコンを買った人たちは皆プログラミングをしようと思ったに違いない。8bit機の頃、よく人にプログラム(Basic)を教えて欲しいと頼まれた。しかし、16bit機になった頃からはほとんど頼まれたことは無くなった。その変わりconfig.sysの書き方,autoexec.batの書き方とかソフトウエアのインストールの仕方やその使い方等技のようなことを教えてほしいと頼まれた。私は、最後までプログラミングを趣味としていたので言語は気持ちよくコーディングできるものとか動かして面白いものという観点で選んでいた。
プログラミングは、音楽に似ている。
 現在の多くのパーソナルコンピュータには,BASICのシステムが付属している。それで、入門書を見て「簡単なプログラム」を書いてみましょうということになる.“my 1st program”とかいう文字列を画面に表示してみようというわけだ.
 BASICのシステムはよくできているので,これは文字どおり簡単にいく.入門書には,「たいへんよくできました」という調子のことが書かれているに違いない.ところが,これは入門書のそれも最初の何十ページかのことであり,一度立って歩けるようになったら,誰も手を引いてくれず,振り返ってもくれないように感じられるのがプログラム言語の世界である.
 こうして,言語の修得を断念してしまった人もいるのではなかろうか.まったくひどいといえば,ひどい世界である.
 しかし,少しだけ弁護するならば,これもプログラム言語とプログラミングの本質的な意味を考えた場合には,あたりまえのことだし,やむをえないことなのである.
 プログラミングは音楽に似ているという趣旨のことを述べているのは,Small talkの提案者のひとりであり,Macintoshのユーザーインターフェイスの設計者として知られるアラン・ケイだ.Scientific American誌のComputer Software特集の冒頭で彼は,コンピュータにとってのプログラムは,楽器にとっての楽譜であると述べている.そして,プログラムや楽譜がともに紙とインクで記述可能なほど単純なものでありながら,あまりにも多くのことがなし遂げられるということを述べている.注1)
注1) アラン・ケイ(AlanKay)は,大学時代にジャズギタリストとしても活動していたという.XEROX社のパロ・アルト研究所を経て,1984年5月までAtari社の主任研究者であり,この論文は,その直後に書かれたものとして興味深いものである.なお,この号は「サイエンス」誌の別冊“コンピュータ・ソフトウェア”となっている.
ASCII1988(05)f02プログラム言語_図1_W520.jpg  まさにそのとおりであり,プログラムを書くことは,レコードプレイヤーを聴くことではなく,楽器を使って自分で演奏することなのである.この2つが,それぞれ異質の楽しみを提供することは,誰でも理解できるだろう.楽器を演奏できるようになるのは,少少たいへんだが,うまくできるようになったら、音の組み合わせやリズムはもちろん,さまざまな様式やモチーフが自分のものとなる.
 そして,プログラム言語とプログラミングの持つ意味は,アプリケーションやアプリケーションによって構築されたシステム,あるいはプログラムを動作させるコンピュータのハードウェアそのものですら「限定的」であるのに対して,ほぼ「無限の空間」を擁することにある.たとえば,Wizardryでは,その舞台となるTrebor城の地下迷宮やキャラクター,モンスター,アイテム,呪文といったものが,1つの非常によくできた世界を作っているのは確かだが,プログラム言語であるPascalの世界は,Wizardryがそれで書かれているという事実を見るまでもなく,はるかに広範で,考えられるすべてのものを表現可能なのである.
Cとかを始めて困ったのは中級者用の本がなかったことだ。初心者向けの本は知っていることばかりで次の段階に進もうとすると上級者用の本しかなかった。上級者とは仕事でプログラムを書いている人たち向けの本で、十分な知識を持っている人が理解できるのものばかりで、趣味のプログラミングをしている者にとって丁度いい知識が書かれている本がほとんどなかった。もう自分で苦労していくしかなかった。
おいしい蜜の部分の食べ方
 実際のところ,プログラム言語によってこれほどのことができるとは,最初あまり多くの人は考えていなかった.
 今日では,「お手」と入力したらディスプレイの中の犬が「お手」をするようなプログラムは,簡単に書くことができるということは誰でも知っている.写真1は,人間が指示をすると何らかの動作をし,「なでなで」するとその指示と動作の関連を覚えていき,最後には,「お手」も「伏せ」も「お回り」もできるようになるというプログラム犬である.注2)
注2) お気づきの方もいると思うが,この趣向は,MacintoshやAMIGA用に出ている「Puppy Love」のエッセンスを真似たものである.このゲームのキャミッチフレーズは、"Artificial Intelligence for Dogだとか.
 そもそも、最初のコンピュータがENIAC(Electronic Numerical Integrater and Calculator)という,ソロバンの親方のような名前で登場したために,「コンピュータ=数値の計算」という考え方が定着してしまったのかもしれない注3)当時の高名な学者には,そんなに速く計算できる機械は,世界に十台もあればいいといった人がいたという話もある.
注3) 実際にENIACは,基本的には名前のとおり古典的な機械式計算輪を電子化したようなものであった.コンピュータが汎用マシンとしての可能性を切り開くのは,プログラム内蔵方式を採用したEDSAC(Electronic Delay Storage Automatic Calculator)やEDVAC(Electronic Discrete Variable Automatic Calculator)からである.この時点で,コンピュータは数値データだけでなく,プログラムの命令という不可思議なものを扱いはじめたのである.
 ところが,プログラム言語によって,簡単なプログラム犬ばかりではなく,Wizardryの“Proving Ground of the Mad Overload"(気の狂った大君主の領土での試練)や人間がやると煩わしかったりえらく時間がかかると思われるおよそあらゆる作業,最新のAI分野では,コンピュータが認識している概念を人間に把握させることによって問題を解決しようという手法さえ考えられているのである.
 ともあれ,プログラム言語とプログラミングによって,我々は,コンピュータが万能機械であるという本質的な意味でこの面白さに触れることができるのである.cこれは,いわば蜜の部分とでもいうべきものだ.これを食べないのも勝手だが,もっともおいしい部分であるのも間違いなさそうである.
 「ご冗談でしょう,ファインマンさん」注4には,次のようなほのぼのとしたエピソードが出てくる.1940年代前半,アメリカのロスアラモス研究所では,マンハッタン計画が進行中だった。その頃は,まだ手動式計算機が使われていたのだが,スタンレー・フランケルという男が,当時IBMが作っていた加算機や表作成機を組み合わせて一種のコンピュータを作った.これによって,作業は非常に効率的に進みはじめたのだが,作業の監督をしてい。たフランケルは,このコンピュータを使って,本来の問題とは何の関係もないアークタンジェントの表を作るプログラミングに熱中してしまう。その結果作業は停滞してしまい,ファインマンは監督の仕事を引き継ぐことになるのである.ファインマンはフランケルを「世界最初のコンピュータ病患者」と呼び,監督にあたってはこれにとりつかれないように心したというのである.フランケル氏のプログラムのほどは分からないが,プログラミングとはそのようなものなのである.
注4) 「ご冗談でしょう,ファインマンさん」(岩波書店刊,R.T.Feynman,R.Leighton著,大貫昌子訳)

ASCII1988(05)f03プログラム言語_写真1_W520.jpg
全くその通りである。プログラミング自体が楽しくて、それも仕事とは関係ない部分スタンレー・フランケルがアークタンジェントの表を作るプログラミングに熱中してしまうのが良く分かる。誰かのために作るプログラムより、自分の興味のためのプログラミングの方が面白くてしょうがない。そして、それを誰かが使ってくれると幸せになる。
パラグラマチックなもの
 プログラム言語とプログラミングの面白さのもう1つの局面は,プログラム言語やプログラムソースそのものについてのこだわりのようなところにある.
 初期のプログラム言語は、マシンを操作するための単なる命令コードの集まりであった.それも,1950年代までは,いわゆるマシン語によるコーディングである.もっとも,当時の計算機は命令数も少なく、10進表記が中心であったなど,それほど難しいものではなかったようだ.その後,FORTRANやCOBOLといった初期のコンパイラ言語が登場し,1960年頃までに,数理言語学などのアプローチがさかんになり、プログラム言語そのものが自然言語を含めた言語理論の中で体系化されていく、さらには抽象化や術後論理といった概念が、プログラム言語に取り込まれていくことになるわけである。
 こうして,プログラム言語には,非常に幅広く,さまざまな方法論を持つものが用意されるようになった.
 プログラム言語は,もはやコンピュータというハードウェアを操作するための命令コードの集まりではなく,マシンから独立した,個々の言語が持つ思考空間を実現してみせるシミュレーションソフトウェアとしての意味あいを持つようになってきている(図2)。
 プログラマは,これらを使ってプログラムを書くことができるばかりではなく、それらの言語を共有し,そのプログラム言語が織りなす世界の可能性について考え,語ることもできるのである.
 CにはCの,LispにはLispの,あるいはPrologにはPrologの表現や認識のしかたと思考のフレームがあり,その中でプログラムは書かれることになるわけだ.
 たとえば,数人の容疑者がいて,いくつかの証拠やアリバイが提供されていて,犯人を推理していくようなプログラムは,Prologなら入門用のサンプルプログラムのたぐいであるが,CやPascalでそれらしいものを書くとしたら,まるで違う発想で書くことになるだろうし,ちょっとした労力を必要とするに違いない。注5)
注5) 論理プログラミングならではの楽しい問題である.TURBO PROLOGのマニュアルのサンプルプログラムとして、4人の男女がいて,被害者の死因,被害者を含めた愛憎関係,動機や所持品,また常識的な知識の一部として所持品と所持品で危害を加えた場合の死因との対応関係などが与えられ,いくつかの推理を働かせるという50行ほどのプログラムが掲載されている.もっとも,これはPrologの機能としては,基本的なユニフィケーションの動きを見るためのものである.
 ところで,こうしたプログラム言語の面白さは、普段こうして使っている言語の面白さと同じものである.簡単な言葉遊びから分析哲学者がいっているようなことまで,プログラム言語についてあてはめるとピタリときてしまう.注6)たとえば,人間が言語を使うのではなく,逆に言語に人間が使われているのであるといった考え方は、そのままCを使っているはずのCプログラマが,実はC言語に使われているということを意味している.
注6) ミッシェル・フーコーの言語に関する議論など、人間が言語を……はもっとも新しい考え方の1つといえる.Cプログラマが,エラトステネスのふるいについてどのようなプログラム(ソースコード)を書くかについて,Cはあらかじめ知っていて、はじめて分かったようなふりをしてみせるだけである.一方,言語を批判する立場もあり,ヴィトゲンシュタインによれば,言語によって語られるものは,あきらかに語られうるものであり,語ることのできないものについては沈黙しなければならない.
 では,現在パーソナルコンピュータで使う(使われる)ことが可能な言語としてはどのようなものがあるだろうか.おそらくこれは,次の3つに分類して考えた方がよさそうである.
a. 入門/または簡単なプログラム用
b. アプリケーション/ツールの開発用
c. プログラミングの研究用
 aは,文字どおり入門用やちょっと思い付きで書いてみる類のプログラムのための言語であり,これからプログラミングをはじめようという人には,興味のあるところだろう.bは,具体的なアプリケーションやオペレーティングシステム上のツールを書くための言語である.そして,cは,プログラム言語やコンピュータサイエンスに関する新しい概念について考えたい人のための言語といえる.これらについて,図3に示してみたので参考にしてほしい.

ASCII1988(05)f04プログラム言語_図2_W520.jpg
ASCII1988(05)f04プログラム言語_図3_W520.jpg
「人間が言語を使うのではなく,逆に言語に人間が使われているのである」まさにそうだと思う。ただ、天才は逆でアントニー・ホーアがクイックソートの概念を説明するときに再帰という概念があったPascalが登場して説明できたというようなことを読んだ記憶がある。私はアセンブラでレジスタの内容がアドレスを示すというポインタの概念を学んで、BASICにはそれがなくやはり初心者向けはダメだとか、ローカル変数がないことでこれは使えない言語だとしたが、BASICを使わざるを得ないときはBASICのコーディングを工夫して実現した。初めからBASICを使っていたらこれらの概念は知りえなかった。逆にBASICで1000行を超えるようななプログラムを作っている人を尊敬した。
美しいものとの出会いについて
 プログラマの世界では,しばしば美学的表現が使われるのをすでにご存じのことと思う.著名なソフトウェアの開発者のインタビューを集めた「実録!天才プログラマー」注7)を読んでみても,すぐれたソフトウェアの多くには,アルゴリズムやそれを実現するソースコードについての美学的執念によって支えられ,生まれてきたのではないかと思える箇所がいくつもある。
注7) 「実録!。天才プログラマー」(アスキー出版局刊,マイクロソフトプレース編,岡和夫訳),原題“Programmers at Works
 XEROX社のパロ・アルト研究所で先駆的な対話型エディタ/整形系Bravoを開発し,Microsoft社でMultiplanからExcelにいたる人気ソフトウェアを開発しているチャールズ・シモニイは,効率のよいアルゴリズムをつかむのは科学だが,プログラムの構造を描いていくのは芸術だと述べている.また,誰かが彼のソースコードを読んだとしても,すぐに彼のだと分かるともいっている.これは単に,彼の仲間が「ハンガリアン」と呼んでいるシンボルのネーミング法についてのことなのだが,明らかなスタイルとソースコードのリスティングについての美学を持っているのは間違いない.
 プログラムの美しさについての考え方は,プログラミングをやっていく上で,もっとも重要なことの1つかもしれない.実際のところ,美しいプログラムがコンピュータのメモリ上で壮大な舞踏会のように秩序だって動作するのを想像することは、はなはだ気持ちのよいことであり,あるいはまた,まっ白いフォーム用紙の上にタイプフェイスで印字されたプログラムリストの行の頭が揃っているのは,心を洗われる思いがするほどである。
 ところで,この美しさに関連して,入門用の言語として頻繁に使われているBASICがしばしばヤリ玉に上がる。
 もっとも有名なのは,構造化プログラミミングの提案者であるエジセル・ダイクストラによる批判である.構造化プログラミングとは、順次処理,選択処理,繰り返し処理の3つのプログラム構造だけで手続きを記述すべきであるという考え方であり,Goto-lessプログラミングともい呼ばれるものだ.ダイクストラによれば,BASICに馴染んだ学生にまっとうなプログラミングを教えるのは不可能に近いという。BASICによって思いつくまま書かれたプログラムは,ちょうどこんがらがったスパゲッティの玉のようなもので,苦労してとりあえず動くようなことがあるとしても,書いた本人にも説明のつかないような代物であるというのだ.

ASCII1988(05)f05プログラム言語_写真2_W520.jpg
まさにそのとおり。特に趣味でプログラミングをしていると早く完成させたいというよりコーディングを味わって完成させたいと思っていた。なんだか分からないが動くというプログラムが嫌いだった。人の書いたBASICを読むのは苦痛だった。BASICにはローカル変数がなかったので大きなプログラムを書くと変数名に困り、行き当たりばったりの変数名になる。関数の戻り値という概念がないのですべてグローバル変数であるのである変数がどこで書き変えられているか分からない。BASICから始めた人はループ変数をA,B,CとかにするのでFORTRANから入った者には物凄く違和感がある。構造化されていないBASICを物凄く嫌っていた。職場でプログラムを作ったときはASCIIに載っていたRATBASを入力してBASICを構造化して使っていたほどだった。
プログラム言語入門のために
 さて,プログラム言語やプログラミンングは,「病みつきになるほど面白い」かどうかというと,実は人によって少々事情は異なってくるかもしれない.ここまで述べてきたような「面白さ」を了解できる「器量」が必要かもしれない.2分の1ほどでも理解できるならば,プログラミングを始める価値は十分ある.
 そこで,ではどのようなプログラム言語をやろうかという人もいるだろう.現在パーソナルコンピュータで使用できる言語は,先に述べたように3つほどのグループに分けることができる.
 入門用には,BASICやLogoが良いとされてきた.BASICはもともと,1964年にダートマス大学で,対話型で使用できる入門用言語として開発されたという経歴を持つ素人でも試行錯誤しながら,プログラムができるというわけだ。その名も“Beginner's All-purpose Symbolic Instruction Code"からきている.一方,Logoも最初から教育用,それも子供が思考方法を学ぶために設計された言語であり,Apple IIcの入門キットなどではLogoを勧めていた.
 しかし,もう少し前向きにプログラミングを楽しみたいのなら,BASICなどよりも,CかPascalを選んだ方がよいかもしれない.ともに,統一された言語仕様の上に設計されており,また,そのままアプリケーションやツールの開発用言語として使っていける.難をいえば,BASICに比べて少々とっつきにくい点があるが,低価格で性能の良いコンパイラも登場してきた.
 また,具体的なアプリケーションの開発というよりも,プログラム言語そのものやコンピュータサイエンスに興味のある場合には,LispやPrologの処理系も比較的入手しやすくなってきている.Lispは,1950年代に開発された非数値データを扱うための言語であり,自然言語をはじめとする人工知能の研究の過程で生まれてきた言語である.一方,Prologも人工知能分野で注目を集めている言語であり,順序だった手続きではなく,論理と推論をベースとする非手続き型の言語である.
 また,Smalltalk-80やAdaといった比較的新しい処理系も,すでにパーソナルコンピュータにインプリメントされているほか,FORTHやAPLなどのユニークな言語処理系にも熱烈な支持層がある.
 最初にも述べたように,本誌では,次号以降プログラミングについての12回にわたる連載を予定しているが,その中で,一般的なプログラミングについての情報とともに,これらの処理系についても少しずつ触れていくつもりである.
私は8bit機からプログラミングを始めたのですぐさまZ80でハンドアセンブルしながらマシン語を入力していた。アセンブラが欲しくて雑誌に載っているアセンブラを機械語入力したが、テンキーを0~9とA~Fに割り当てるプログラムをまず入力するというありさまだった。CP/Mを買ってMACRO80を買ってアセンブラでプログラミングした。BASICのコーディングよりもよっぽど楽しかった。

nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。