見出し画像

PASCAL言語と構造化

XのSNSのTLにPASCAL言語の創始者であるヴィルトが亡くなった話が出ていたので「アレ?」とは思ったのですが、それはもう1年前の話です。マイコン黎明期に有名だった御大はそろそろ鬼籍に入られても仕方がないほど年月が経ったのですが、そういえばPASCAL言語に関しては自分が触れた話を軽く書いただけで済ませていたことに気が付きました。

TinyPASCAL

PASCALはBASICばかりの当時のマイコン界隈では「構造化」というキーワードとともにコンパイラな世界を垣間見せてくれまいた。もちろんBASICにもコンパイラはあったのですが、基本はあくまでインタプリタなので、うまくコンパイルできないケースや、コンパイルしても速くなるところとそうでもないところがあったりしました。そもそもBASICはプログラミング言語の入門として作られたもので、あまり大きなプログラムを書くには適していません。そもそもの選択肢もなかったので、そんな言語で数千行にわたるプログラムを平気で書いていたのですが、全体がひとつの塊で自由にフラットに書かれたコードは時に「スパゲティ」とも称されて、読みにくくメンテナンスもし難いものが多かったです。コードの再利用も簡単ではなくヒトの書いたコードを使うには変数リストを作って衝突する変数の名前を変更し、都合の良い行番号に付け替えて何とか使っていました。

ここで問題とされたのは GOTO 文です。BASICは行番号の単位で実行する順序を決めることしか出来なかったので、実行する場所を変更するには IF 文であっても、FOR 文であっても、結局のところ GOTO 文と同じです。複数の行をまとめる方法がなかったので他にやりようが無かったのは確かです。自由に行番号へジャンプできるので、仮に最初は順序立てて書いてあったとしても後から修正したり機能を追加していくと、いったいどんな条件でどの部分が実行されるのかが大変にわかりにくいことになりがちです。そこで「構造化」という概念が提唱され制御の流れが見ただけでわかるように書こうということが重要視されるようになりました。

そこでPASCALの登場です。PASCALは基本的にコンパイラ向けの言語仕様ですが、手軽にコンパイルできるように1パス(最初から最後までを1度読むだけでコードを生成する)で済むように工夫されています。おかげで最初に実行する main を最後に書かなくてはいけないという制約もあるのですが、行番号も不要で制御構造を見やすくかけるという点ではBASICとは比べられないほどのアドバンテージがありました。まだパソコンでFORTRANはもちろんC言語を使うにもなかなか大変だった時代に、BASICに比べれば少しばかり大変でしたが、大きなプログラムを書くための機能も充実していて、今後はPASCALの時代だと騒がれていたものです。

こんな素敵なプログラミング言語を作ったのが、かのヴィルトだった訳です。

ニクラウス・ヴィルト

Pascal

よくPASCALはALGOL系の言語だとも言われるのですが、ALGOLが動くパソコンなんて存在していなくて詳しいところはよく分からなかったのですが、計算機の教科書なんかではよく使われていたように思います。あまり細かな文法を知らなくても「読めばわかる」ような書き方が出来てアルゴリズムの説明には役に立っていました。

ALGOL

どちらかというと、古典的プログラミング言語の欠点を無くすように作られたPL/Iのコードを見ることも多かったので、PASCALを初めて読んだときにもまあおおよそはどう書くのかは理解できたような気もします(PL/Iの問題は書いたコードが実際にコンパイルできるかの方)。

PL/I

PASCALのもう一つの特徴としてコンパイラがPASCAL自身で記述できるというもので、少なくとも構文解析する部分はわかりやすく書かれていて、コンパイラを書くにはこういう事をするのかと勉強になりました。ここでBNF記法とかも覚えて、その後UNIXな時代になった時に yacc と lex を覚えるのに役に立ちました。バイナリ生成も当時の貧弱な8ビットCPUの命令を生成するのではなくp-codeと呼ばれる仮想マシンのある程度の機能を持つバイナリを扱うので、比較的理解しやすいものでした(このp-codeを実行する部分はまた別の話)。

文法上の特徴としては、強い静的な型を持つことなんですが、BASICでも型は大事だったので変数名の末尾記号ではなくて、ちゃんと宣言しないとイケないのねという程度でスルーしていたのですが、レコード型を見て「なるほど、本来の型というのはこういうものを指すのね」とようやく気がついた次第。

また代入が他の言語のように’=’ではなく’:=’を使うことで、代入と等号比較がちゃんと別物になりました。今ではみんな慣れてしまいましたが「A=A+1」という表現が「どうしてAとA+1が同じなんだ!」とプログラミング言語の初心者はよく混乱したと聞いています(私はそんな悩みは持ちませんでしたけど)。ただ頻度の高い代入に2文字使うのは今でもちょっと面倒です。

PASCALでは基本的に変数は静的なもので、BASICに比べれば文字列を扱うのが面倒ではあったのですが、例外的にレコード型に関しては動的な扱いが導入されていて、ポインタがアドレスという実装を見せずに上手に処理していたのが、少しばかりわかりにくかったとは言え良くできていると思いました。

私自身は結局BASICを捨てられず、OS-9のBASIC09や自分で作った構造化BASICからAPPLESOFT BASICへのトランスレータを使っていて、結局C言語を使う時代になってもQBやVBを愛用し続けましたが、PASCALも進化を続け、オブジェクト指向を取り入れたObject PascalやDelphiに進化して多くの人に使われ続けました(TurboPASCALは少し使ったけどDelphi時代はもっぱらVBな人でした)。

Object Pascal

今も改良が続くPascal/Delphi言語の栄枯盛衰

今でも比較的シンプルなPASCALで勉強しようとする人もいるようで、いろいろな実装が用意されています。

割と簡単に '標準 Pascal' を試してみたい

Turbo Pascal Compiler - WEBベースの処理系 ※ここにBNFもある

もともとのPASCAL時代に覚えたので、文字列の面倒さやエラー処理が書きにくいので、ヘビーに使うことは無かったとはいえ、その後にいろいろなプログラミング言語を覚えるのに基本となったことは間違いないです。あらためてヴィルトの偉大さに感謝。

ヘッダ画像は、以下のものを使わせていただきました。
https://commons.wikimedia.org/wiki/File:Niklaus_Wirth,_UrGU.jpg
Tyomitch - 投稿者自身による著作物, Copyrighted free use, https://commons.wikimedia.org/w/index.php?curid=449735による

#プログラミング言語 #PASCAL #ニクラウス・ヴィルト #Delphi #構造化 #スパゲティ

いいなと思ったら応援しよう!

kzn
頂いたチップは記事を書くための資料を揃えるために使わせていただきます!