見出し画像

🛠️Forth言語の歴史



https://amzn.to/3bwwaC3

わんぱくだが逞しかった、おおらかなForth黎明期

FORTHの初期開発は、多くの点で他の多くのプログラミング言語とは全く異なるものでした。他のプログラミング言語では、言語の構文や意味を明確にした形式的な仕様が完備されているのに対し、FORTHでは、言語の基本的な前提条件が実際のアプリケーションで試されるという、長くダイナミックな青春時代を過ごしました。

わんぱくおじさん🤣、チャールズ・ムーア

ムーアのプログラミングのキャリアは、1950年代後半にスミソニアン天体物理観測所で、エフェメライド、軌道要素、衛星局の位置などを計算するプログラムから始まった。彼の開発コードはカードトレイ2個分にもなり、この大きなプログラムの再コンパイルを最小限にするために、彼はプログラムを制御するカードを読み取る簡単なインタプリタを開発した。これにより、再コンパイルすることなく、複数の衛星に対して異なる方程式を構成することができた。このインタプリタには、後にFORTHと呼ばれるプログラム言語に受け継がれていく、いくつかのコマンドや概念があった。

自由形式の方が、小さく速くなるんだ

主なものは、スペースで区切られた「単語」を読むコマンド、数値を外部形式から内部形式に変換するコマンド、そしてIF ... ELSEの構成である。彼は、自由形式の入力は、特定の列にフォーマットするというFortranの一般的なやり方よりも効率的(コードが小さく速くなる)かつ信頼性が高いことを発見した。

1961年、MITで物理学の学士号を取得したムーアは、スタンフォード大学の大学院に入学した。また、スタンフォード・リニア・アクセラレーター(SLAC)でプログラミングのアルバイトをしながら、当時計画中の2マイル電子加速器のビームステアリングを最適化するためのコードを書いていた。この仕事から生まれたのが「CURVE」というプログラムで、1964年にAlgolでコーディングされた、汎用の非線形微分補正データフィッティングプログラムである。このプログラムを制御するために、彼はインタープリタの拡張版を使い、パラメータを渡すためのプッシュダウンスタック、変数(明示的に値を取得・保存する機能)、算術演算子、比較演算子、手続きを定義・解釈する機能などを管理するように拡張した。

結婚したばかりのムーアは、小さな町の環境を求めて、1968年にニューヨーク州アムステルダムのモハスコ・インダストリーズ社に入社した。ここでは、2250グラフィックディスプレイを搭載したIBM1130ミニコンピュータ用のコンピュータグラフィックスプログラムを開発した。

1970年、モハスコはムーアに、新しいユニバック1108で専用線のネットワークを使った受注システムを扱う野心的なプロジェクトを任せる。ムーアは、1108にForthを移植し、トランザクション処理を行うCOBOLモジュールとのインターフェースを整えた。


代数学がFORTRANの代名詞であったように、Forthは英語の散文をモデルにして考案された。

「単語」は、名前の付いたデータアイテム(ほぼ名詞に相当)、名前の付いた手続き(動詞に相当)、定義語(カスタマイズされた特性を持つデータアイテムを作ることができる特別な種類の動詞)からなる。単語は、以前に定義された単語を使って定義したり、(組み込みアセンブラを使って)マシンコードで定義したりすることができる。

Forthは、ダイクストラが提唱した「構造化プログラミング」[e.g. Dijkstra, 1969]や「モジュラー・プログラミング」[Parnas, 1971]の原則に従っている。

ムーアのシステムでは、I/Oに割り込みを使っていました。割り込みは、アセンブラのマクロを使ってレスポンスコードに直接ベクタリングされ、Forthの実行者は介入しませんでした。割り込みコードは、最も時間的に重要な操作(数値の読み取り、カウンタのインクリメントなど)だけを実行し、割り込みを待って中断していたタスクを再び有効にします。このタスクは、次にラウンドロビンタスクループに遭遇したときに実際に動作を再開し、そのときにイベントによって発生した高レベルの処理を完了して作業を続行します。

理論的には、このノンプリエンプティブ・アルゴリズムは、論理的または計算集約的な動作でCPUを独占するタスクに対して脆弱ですが、実際にはリアルタイムシステムはI/Oに支配されているため、問題になることはほとんどありません。

文字Aに数字の1を加えたいとき、それはできないとコンパイラが言うことではない

ムーアの個人的な哲学は、データタイピングへのアプローチに顕著に表れている。基本的にムーアは、データオブジェクトを自分の好きなように操作することに全責任を負いたいと考えていた。「文字Aに数字の1を加えたいとき、それはできないとコンパイラが言うことではない」と。

1970年代にムーア氏が開発したオリジナルのForthシステムは、ディスクからのソースをメモリ上で実行可能な形式にコンパイルします。これにより、一般的なコンパイル言語に見られるような、コンパイル、リンク、ロードという一連の作業が不要となり、プログラマが常駐するForthエディタを使ってソースを修正し、再コンパイルすることで、数秒後にはテストが可能になるという、非常にインタラクティブなプログラミングスタイルが実現しました。

Forthの最大の特徴は、その拡張性である。Forthのプログラミングは、新しい言葉、つまり言語の新しいコマンドを定義することから始まります。これは、子供に概念を教えるときに、以前に理解した概念から説明するのと同じである。このような言葉を高位定義(high-level definitions
)と呼ぶ。また、Forthの実装にはホストプロセッサ用のアセンブラが含まれているため、新しい単語はアセンブリコードで定義することもできる。

https://www.taygeta.com/forth/dpansc.htm

Forthの拡張性は、単に新しいコマンドを言語に追加するだけではない。Forthの拡張性は、単に新しいコマンドを追加するだけではなく、新しい種類の単語を簡単に追加することができる。つまり、それ自体が単語を定義するような単語を作ることができる。このような定義語を作る場合、プログラマは、その定義語が作る語に対して、コンパイル時、実行時、あるいはその両方で有効な特殊な振る舞いを指定することができる。この機能により、構造と動作の両方を完全に制御した特殊なデータ型を定義することができる。このようなワードの実行時動作は、高レベルでもコードでも定義できるので、この新しい定義ワードで作成されたワードは、性能的には他のすべての種類のForthワードと同等である。さらに、特殊なループや制御構造を実装するために、新しいコンパイラ指令を追加することも容易である。

https://www.taygeta.com/forth/dpansc.htm
\ スタックに数字をプッシュ
5 3 8 1  \ スタックの状態: 5, 3, 8, 1 (トップ)

\ スタックのトップの2つの数を加算
+  \ スタックの状態: 5, 3, 9 (8 + 1)

\ スタックから数をポップして表示
.  \ 9をポップして表示、スタックの状態: 5, 3

\ 別の例: 数値を掛け算
2 2 * .  \ 4を表示 (2 * 2)

\ スタックをクリア
clear

お願い致します