💟 Archived View for schinkel.bevuta.com › articles › forth.jp.txt captured on 2024-08-31 at 11:40:22.

View Raw

More Information

⬅ Previous capture (2023-11-04)

-=-=-=-=-=-=-

------------------------------------------------------------------
以䞋の翻蚳文は、Felix Winkelmann の Thoughts on Forth Programming 
(http://call-with-current-continuation.org/articles/forth.txt) の
翻蚳であり、原著者の蚱可を埗お公開するものです。
                2021-09-01 Nobuhiko FUNATO (nfunato @ acm . org)

曎新履歎: 
2021-09-02(rev10): Shiro Kawaiさんにご指摘いただいた誀蚳蚂正/改善を反映
2021-09-02(rev09): 公開初版
------------------------------------------------------------------

この文曞は、私のForthの哲孊に関する理解ず、それを特に興味深いものにしおいる
いく぀かの属性を、Forthずその䜿い方に぀いお私が重芁ず思うこずず䞀緒に蚘述す
る詊みです。これらはすべお私の個人的意芋であり、ドグマず芋なすべきではありた
せん。私はこれたで様々なプログラミング蚀語を䜿っおきたしたが、そのほずんどが
奜きではありたせんでした。SchemeやPrologのように非垞に゚レガントで匷力な蚀語
もあるず思いたすが、Forthのようにプログラミングの再考を求める蚀語はありたせん。

Forthは、䞀人の人間や少人数のプログラマのグルヌプに合わせお䜜られた、非垞に
「個人䞻矩的」なものです。その理由のほずんどは、Forthシステムを自分で実装す
るこずが自然で比范的簡単であるこず(そしおそうすべきであるこず)ず、蚀語に本質
的に可鍛性があり、個人のニヌズに適応するこずによりたす。したがっお、私が曞いお
いるこずは、プログラミング蚀語であるず同時に゚ンゞニアリング哲孊でもある
Forthの䞀぀の芋方に過ぎたせん。

私の認識では、Forthプログラマには2぀の考え方の流掟が存圚したす。䞀方は、極端
なシンプルさ、ミニマリズム、短い定矩、そしお可胜な限りハヌドりェアに近いずころ
たで降りおいくこずを奜む「叀兞掟」です。
もう䞀方は、他の蚀語に芋られる機胜で叀兞的なForthモデルを拡匵し、䞀般的に
機胜やツヌルを远加するこずで、よりコンピュヌティングの䞻流にアクセスしやすい蚀語
にしようず努力する「珟代掟」です。埌者は、抂しおスタック、逆ポヌランド蚘法、重い
リファクタリングずいったアむデアを、䞀般的に珟代のプログラミング蚀語に䞍可欠で
望たしいず考えられおいるものず混ぜ合わせようずしおいたすが、結果ずしお倉な蚘法を
備えたLispのようなものになっおいたす。私は個人的には前者の陣営に属しおいたすが、
それは埌に続く文章でより明らかになるでしょう。

たず第䞀に、Forthはかなり颚倉わりでずっぎに芋えるいく぀かの基本的な特性を土台ず
しおいたす。それはForthがマむクロコンピュヌタ時代に(今日の基準では)非垞に限られた
容量を提䟛するマシン䞊で誕生したこずから、シンプルさずコンパクトさに根ざしおいる
こずによりたす。しかし、これらの属性は、ある皮の独特の利点をもたらしたす。

そのような特性の1぀は、逆ポヌランド蚘法の䜿甚ずロヌカル倉数の欠劂あるいは省略です。
サブルヌチンやプリミティブぞの匕数枡しはスタック䞊で行われるため、コヌドのファクタ
リング(分解)はずるに足らないものになりたす。匏は、関数型プログラミングの「ポむント
フリヌ」スタむルのように、文脈から取り出しお新しい定矩に移動するこずができたす。
短い定矩ず(通垞は)䜎いサブルヌチン呌び出しオヌバヌヘッドを匷調するこずは、共通の
コヌドシヌケンスを分離するこずをさらに瀺唆しおいたす。ロヌカル倉数の䜿甚はこれを
難しくするこずが、ロヌカル倉数の機胜を避けるべき理由です。

もう䞀぀の䟿利な機胜は、埌から(ワヌドの)倀を再定矩しおも以前の䜿甚箇所の意味に
圱響を䞎えない超静的な環境です。これにより、既にコンパむルされたコヌドの安定性が
倧幅に向䞊し、既存のワヌドをシャドりむングするこずが埌からコヌドを定矩するうえで
問題ずならない限り、既存の定矩に察する代替の名前を芋぀けるプレッシャヌが軜枛されたす。
Forthはボキャブラリヌを䜿った非垞に匷力な名前空間システムを提䟛しおいたすが、
シャドりむングが問題にならない限り、環境を汚染しないように名前空間を分離するこずは
厳密には必芁ではありたせん。

Forthは通垞、察話的に動䜜したす。基本的な read-eval-print-loop は非垞にシンプル
なので、すべおの機胜を察話的な方法でテストできたす。Forthを実装する際に最初に行う
こずの䞀぀は、トップレベルむンタプリタを動くようにするこずです。デバむスドラむバを察話的に
デバッグできるこずを想像しおみおください(それも、高レベル蚀語でデバッグできるように
なる前に膚倧な量のコヌドがすでに存圚しお動䜜しなければならないLispマシンの前に
座らずに)。組蟌みシステムのプログラミング、テスト、調査がどれだけ簡単にできるかを
垣間芋るこずができたす。

非垞に初期の段階での察話的なデバッグは、ボトムアップがForthでの蚭蚈や実装のい぀もの
やり方であるこずをほのめかしおいたす。これは、即興やハッキングの匂いがしたすが、
私たちの心は、トップダりンの方法論、事前の蚭蚈、レむダ化されたアヌキテクチャ、
最初に蚈画を立おおから構築を行うずいう理想に瞛られおいお、解決しようずしおいる
問題を完党に把握しおいるこずはめったになく、芁件、期埅、基瀎ずなるシステムの知識が
事前に完党にわかっおいるこずは単に真実では無い、ずいう事実を無芖しおいるだけなのです。

Forthにはメモリしかありたせん。メモリ内のストレヌゞのワヌドサむズずバむトサむズの
セル、そしおスタックです。アセンブリ蚀語のレベルにステップダりンするのは面倒に
聞こえるかもしれたせんが、メモリレむアりトのあらゆる偎面を完党に制埡するこずが
できたす。あなたずマシンのアヌキテクチャの間には人工的な障壁はありたせんし、
フォン・ノむマン・マシンに乗っおいないず思わせようずする抜象化もありたせん。
実際、フォン・ノむマン・マシンの䞊に乗っおいるのですから。
そしお、そう認めるこずで、最終的に真の公開されたマシンリ゜ヌスぞのアクセスが
手に入るのです。これは良いこずで、すべおのC蚀語プログラマは
このレベルのアクセスが可胜(そしおそれを必芁ずしおいる)ですが、Forthプログラマは、
コンパむラの透過性の無い操䜜や、䞍明確な構造レむアりトや定矩されおいない動䜜の
ような、邪魔になる脆い抜象化には驚かされないでしょう。蚀語暙準に反しおプログラム
する堎合、垞にそれを解釈する人たちに翻匄されるこずになりたすが、実装に反しお
プログラムする堎合は、特に自分で実装を䜜った堎合は、䞍明瞭な点は䜕もありたせん。
Forthには「yak-shaving」はありたせん: 自分ずゎヌルずの間にあるものはすべお
そこに自分で眮かれおきたものです。これは、プログラミングの仕事の倚くは他人の仕事が
䜕に䜿われるかを予想しお圌らの倱敗を回避するこず(それは実際は䞍可胜ですが)であるず
教えおくれる興味深い経隓です。

それは、マシンに盎接アクセスできるようにしようずしおいるにもかかわらず誀った安党性を
感じさせ、邪魔になったずきに回避策を必芁ずするあらゆる皮類の制限を提䟛したり、
習埗に䞀生かかるようなかなり難しい安党性のモデルを課しおいる蚀語ではさらに悪化したす。
マシンぞの䜎レベルの盎接アクセスを提䟛し、同時に自動メモリ管理のような高レベル環境の
すべおの利点を提䟛する䞀぀の蚀語を手にするこずはできたせん。どこかに、より倚くのコヌド、
より倚くの定型文、より脆匱で人工的な抜象化を必芁ずするだけの目立ったギャップがあるこず
でしょう。私たちは䞡方の方法を持ちたいず思っおいたすし、その二分法を苊痛でなくするこずを
玄束する人は誰でも信じたすが、それはすべお倱敗しおいたす。マシンから離れすぎお、
蚀語、コンパむラ、たたは「パラダむム」を喜ばせるためだけに䜕かをしおしたうからです。

ここで性胜の話を持ち出す人がいるこずでしょう。モダンで耇雑な蚀語は単玔なむンタプリタ型
蚀語にはできないヘビヌな最適化を提䟛しおいるのだず(ずはいえ、Forthむンタプリタは非垞に
䜎レベルで、コンパむルされたコヌドず解釈されるコヌドの境界は非垞に薄く、倚くのCPUで
むンタプリタは2぀か3぀のマシン呜什で構成されおいたすが)。これは技術的には正しいのですが、
このような重い最適化䜜業が必芁かどうかは議論の䜙地がありたす。あなたのコヌドの
ほずんどは、最近䜜り出されおいるブロヌトりェア(bloatware)の䞭で実行されるこずは
めったに(あるいは決しお)ないでしょうが、実行時パフォヌマンスの調査は、やや宗教的な
意味合いを持っおいたす。私たちは、あらゆるサむクルの速床を維持し぀぀、メモリ
トラフィックやキャッシュミスを増加させる膚倧な量のコヌドを気にするこずはありたせん。
ネむティブコヌドコンパむラを提䟛する倚くのForthシステムがありたすが(䞭には非垞に
掗緎されたものもありたす)、倚くの堎合これは必芁なく、メモリず耇雑さの点でコストが
かかるだけです。高床に最適化されたコンパむラが暗瀺するセキュリティぞの圱響を無芖
するずしおも、゜ヌスから生成されたコヌドを完党に理解できるこずは、満足感があり、
心匷いものです。

これは、構文レベルだけでなく、抜象化レベルでのコンパクトさに぀ながりたす。゜フト
りェアを理解できないこずが、プログラマが知るべきではない詳现からプログラマを守ろう
ずするレむダヌの増殖に぀ながっおいたす。オペレヌティングシステム(それ自身の抜象化を
凝集したもの)はランタむムラむブラリの䞋にあり、ランタむムラむブラリはアプリケヌション
レベルのラむブラリのベヌスずなり、蚀語レベルの抜象化の基盀ずなっおいたす。
抜象化のため、あるいはそれ以䞊の抜象化のために、増え続ける抜象化の塔は、実際に
実行しおいるこずに぀いおの知識の䞍足を認めるこずです。これは今日では良いこずだず
考えられおいたすが(「無知は力なり」)、実際にはデメリット以倖の䜕物でもありたせん。
そもそも、オペレヌティングシステムの機胜やバむナリファむルフォヌマット、ハヌド
りェアぞの盎接アクセスなどの䜎レベルのむンタフェヌスは、䞀般的に芋られるような
難解で犁じられたものではありたせん。それらのむンタフェヌスは、(たずえあるずしおも)
ひどく文曞化されおいるか、特定のシステムやアプリケヌションに特有の文曞化されおいない
拡匵機胜が含たれおいるだけです。あるいは、むンタフェヌスの「良い」郚分は゜フトりェア
担圓者に任せるず決めたハヌドりェア゚ンゞニアが粗雑に蚭蚈しただけかもしれたせん。

Forthでは、理想的には2぀の局を持぀こずになりたす: 手元の問題に察するプログラミング
むンタフェヌスを提䟛するアプリケヌション局ず、倖郚デバむスにアクセスするための
プリミティブを提䟛するハヌドりェア局です。本圓の芞術は、この2぀の局を統合するこずです。
しかし、芞術ずは孊ぶものではなく、他の方法 - 玔粋な経隓や内省 - によっお身に぀ける
ものです。

チャック・ムヌアのようなForthプログラミングの䞊局郚にいる人たちは、自分たちでハヌド
りェアを蚭蚈しおForthから䜿いやすいむンタフェヌスを䜜るようにしおいたすが、ツヌル、
蚀語、暙準、パラダむムずいった面でそれ自䜓の負荷が生じたすから、すべおの人のための
ものではありたせん。

ムヌア氏ずいえば、圌はForthプログラミングのために、䞀芋自明のこずのように芋えおも、
それを実行するために積極的な努力をしないず空虚な蚀葉になっおしたう賢明なルヌルを
いく぀か瀺しおくれたした。

倧原則は「シンプルに」です。確かに、私たちは皆それを望んでいたす。しかし、なぜ
これほど倚くのひどく耇雑なプロトコルやアヌキテクチャが存圚するのでしょうか?
それは、誰もこのアドバむスを真剣に受け止めおいないからです。結局のずころ、耇雑さ
ずはプログラマヌの醍醐味、あるいは、それを極めたずいう感觊なのです。しかし、実際に
耇雑さを远求するために必芁な謙虚さは、私たちの職業の䞭では滅倚に芋られないものです。
シンプルさずは、シンプルなコヌドを意味するだけでなく、芁件、特城、党䜓の機胜を
シンプルにするこずを意味したす。ベルやホむッスル、玠敵なナヌザヌむンタフェヌス、
目の保逊、無駄なむンタフェヌスやプロトコル、レガシヌサポヌト、その他、必芁䞍可欠ず
されおいるすべおのもの(実際には本圓の品質の埋め合わせに過ぎないのですが)を萜ずす
こずを意味するのです。

物事をシンプルに保぀ための原則には、2぀の重芁なコロラリヌがありたす。第䞀に、
「憶枬をしない」ずいうこず、぀たり、将来の䜿甚を想定したコヌドを曞いたり、抜象化
したりしないこずです。確信が持おないこずを蚈画するのではなく、今持っおいる芁件を
満たしおください。

2぀目のコロラリヌは「自分でやれ」です。このアドバむスを真面目に受け止めた堎合、
これは深刻な圱響を及がしたす。これはたた、゜フトりェア開発者が決しお恐れるべき
ではなく、実際に楜しむべきものである、孊ぶこずの必芁性を匷調しおいたす。すべおを
自分で行うこずで、平凡な抜象化や、圹に立たないものでいっぱいの肥倧化したラむブラリや、
そのコヌドを䜿っおいるかもしれないアプリケヌションの普遍性を説明できない人による
普遍的な䜿甚を目的ずしお曞かれたコヌドにはびこるバグなどを理解する必芁から解攟されたす。
再利甚は、それが慎重に疑われおいるずいう最初の兆候があるにもかかわらず、ドグマに
ᅵᅵᅵっおいたす。再利甚を匷調するずいうこずは、資産を生産し、氞続的な䟡倀(コヌドベヌス
や知的財産ず呌んでいたす)を創造しようずする産業界の動きを瀺しおいるにすぎたせん。
それは、゜フトりェアが腐っおいるずいう事実を吊定する幻想です。あなたがラむブラリを
再利甚しおいるのは、通垞はほんの䞀郚に過ぎたせんが、あなたは䜿われおいない機胜や
無意味な機胜、特にあなたのものではないバグのためにお金を払っおいるのです。

そしお、これは重芁なポむントです: すべおを自分で行うこずで、自分が制䜜した゜フト
りェアをよりよく理解するこずができたす。自分のニヌズに合わせお、あらゆるレベルで
修正するこずができたす。バむナリのすべおのバむトを(正しく行えば)蚈算できるように
なりたす。最埌にそんなこずができたのはい぀ですか? ぀たり、Forthでプログラミング
するずいうこずは、垞に自分で実装し、「暙準」を気にしないずいうこずです。昔から
蚀われおいるように "If you have seen one Forth - then you have seen one 
Forth. "ずいう叀いこずわざがありたす。そしお、それは党く問題ありたせん。

䞀人のプログラマがアプリケヌション党䜓の責任を負う時代は終わったず蚀われおいたす。
私たちはチヌムで考え、埌から来た人たちが責任を匕き継ぐこずを考えるべきだず蚀われお
いたす。マルチメガバむトのアプリケヌションや、りェブスケヌルの誇倧劄想の芳点から
考えるなら、この考え方は適切かもしれたせんが、゜フトりェアは儚く、陳腐化し、腐敗し、
最終的には腐っおしたうずいうこずを再び吊定しおいたす。この考え方は、゜フトりェア
開発に調敎された理想䞻矩的モデルから生たれたもので、開発者はレゎのピヌスを぀なぎ
合わせる倧きな機械の䞭の小さな歯車です。この考え方は、基本的な前提条件が倉わるこず、
芁件が倉わるこず、そしお、倧量の機胜を倧量のコヌドで倉曎しなければならないずきに、
どのプログラミング蚀語も珟実の問題に適切に察凊できないこずを吊定する考え方です。
私たちは、少しの再蚭蚈、1぀か2぀の新しいレむダヌ、たくさんのナニットテストで十分で
あり、い぀か私たちはこのすべおをきれいにするだろうず、それはさほど悪くないふりを
しおいたす。倧きな「曞き換え」は、なにか考えられない、蚀葉にできない、匱さや倱敗を
認めるこずです。これはたったくナンセンス、あるいはプロパガンダです。「ベスト
プラクティス」に埓うこずは、盎感を無芖し、新しいアプロヌチでの実隓を避けお、
他のみんなず同じ間違いを繰り返すこずを意味したす。

ここで関係しおくるのは暙準の問題です。Forthの暙準がありたすが、それをあたり深刻に
受け止めるべきではありたせん。暙準は、あなたが䜜業するプラットフォヌム䞊では最適では
ないかもしれないむンタフェヌスデザむンを課しおいたす。それは䞍可胜なこずをしよう
ずする詊みです。぀たり、ある蚀語の䜿甚に関する曖昧さを、すべおの可胜な状況で、
すべおの可胜なプラットフォヌムで、すべおの可胜なアプリケヌションで解決しようず
いうこずです。その意図はもちろん、再利甚を簡単にし、移怍を容易にするこずです。
しかし、これに぀いおはすでに話したした。暙準は圹に立぀こずがありたすが、準拠する
こず自䜓が目的ではありたせん。さらに、普遍的な暙準は定矩䞊、非垞に曖昧でなければ
なりたせん。察象ずなるプラットフォヌムが増えれば増えるほど、すべおの可胜性のある
実装をカバヌするために、より曖昧にならざるを埗たせん。そうなるず、C(たたはC++)蚀語の
暙準で芋られる、匁護士やそのように考える人にしか理解できない信じられないほど耇雑な
動䜜蚘述に終わるこずになりたす。

誰もコヌドを共有するこずができないずは蚀っおいたせんし、他人のコヌドを理解するこずを
孊ぶべきではないずも蚀っおいたせんし、デザむンは䞀匹狌にため蟌たれるべきだずも
蚀っおいたせん。しかし、倚くの堎合、特定のアプリケヌションやコンポヌネントの䞻芁な
蚭蚈ず実装の䜜業を行うのは、䞀人のプログラマヌや非垞に小さなチヌムであるこずを
理解すべきです。なぜなら、プログラムには(単玔なものであっおも)、䞻題、圢匏的たたは
非公匏な芁件、異なる蚭蚈決定の結果の可胜性などの䞡方に知的に深く関䞎するこず(äž­æ–­
しないようにお願いしたす!)が芁求されるからです。倧芏暡な蚭蚈䌚議のように、誰もが
い぀でも䜕をしおいるのかを正確に把握しおいるような倧芏暡なチヌムで行われるのは神話です。
バグの修正やメンテナンスのために、より倧きなチヌムに仕事を分散させるこずは可胜かも
しれたせんが、その段階では、゜フトりェアはすでに、倚かれ少なかれ死にかけおいたす。
䜕十幎もかかるかもしれたせんが、䞀人の人間がれロからコア機胜を曞き換えるこずが
䞍可胜になったら、゜フトりェアは死んでいたす。いいえ、理想的なのは「あ な た」が
それを曞いお、それを理解し、それを維持し、倉曎し、必芁に応じお䜕床でも曞き盎し
(コンパクトさを芚えおいたすか?)、それを棄おお別のこずをするずいうこずです。

Forthは実甚的な問題を解決するための蚀語です。LEDをON/OFFするための蚀語であり、
モヌタヌを動かすための蚀語であり、ピクセルをフレヌムバッファに曞き蟌むための蚀語であり、
デバむスドラむバを曞くための蚀語であり、シングルボヌドコンピュヌタ䞊で実行可胜なものを
立ち䞊げるための蚀語です。たた、デヌタを怜玢したり、゜ヌトしたり、操䜜したりするための
蚀語でもあり、必ずどうにかしおそのような仕事になっおしたう単調で぀らい仕事を実装する
ための蚀語でもありたす。XMLやJSONをパヌスしたいのであれば、確かに可胜ですが、それだけ
では幞せにはなれたせん。これは、他の無意味な抜象化の䞊に無意味な抜象化を曞くための
蚀語ではありたせんし、特定の問題を今日の流行りのアルゎリズムやデヌタフォヌマットを
䜿っお可胜な限り䞀般的な方法で解決するラむブラリを曞くための蚀語でもありたせん。
仮想マシンやアセンブラ、カスタムデヌタフォヌマットを曞くためには優れたツヌルです。
問題をForthで実装するのが圓たり前になるほど単玔化し、同時に意図した目暙を達成する
こずができれば、あなたは正しい道を歩んでいるこずになりたす。既成抂念にずらわれない
思考ず倚くの思玢を必芁ずしたすが、その代わりに、動くのがやっずで、すぐに腐っおしたう
コヌドや、今たで曞いおきたこずを埌悔し、曞き換えや眮き換えが難しくなるほど成長した
負債ずなるコヌドの山ずならないであろう䜕かを埗るこずができたす。

「良い」Forthのコヌドを曞くのは非垞に難しいこずです。あるいは、少なくずも私が考える
良い Forth のコヌドは、他の人が考える良いコヌドずは異なるかもしれたせん。Forthは
「曞くだけの蚀語」ず呌ばれおきたしたが、それは、すべおが明らかになるずころたでコヌドを
単玔化するための远加の努力が必芁だからに他なりたせん。これは芞術であり、超越の瞬間であり、
私が到達したこずがあるずは蚀いたせんが、時々、その瞬間を垣間芋るこずがあり、もし私が
これに䞀生懞呜取り組めば、それはずおもシンプルになり、十分に分解され、明癜で明確な
名前を䜿っお、すべおのものがうたく収たるずいう事実の暗瀺を感じたす。プログラマヌが
たたに経隓するこの瞬間です。短くおシンプルなコヌドが、䜙蚈な荷物を持たずに、簡単に
理解できるように、やるべきこずをやっおくれるのです。Forthでそれを実珟するのはずっず
難しく、より倚くの時間ず倚くの曞き換えが必芁になるかもしれたせんが、その結果は、より
小さく、はるかにシンプルで、完党に自己完結しおいお、信頌できないコヌドによる負担が
ないので、さらに満足感が埗られたす。あなたが、子䟛たちを人身埡䟛にするMoloch神に
なっおいる「生産性」に察する衝動を忘れたずき、品質、優雅さ、芞術ず呌ばれる特別の
ものを達成するこずができるかもしれたせん。それは䞀生かかるかもしれないし、そこたで
到達するこずはないかもしれないが、それでもあなたはそれのために努力すべきです。

さもなければ、あなたは機械の歯車のたたで、信じられないほど耇雑な「゜フトりェアスタック」
で開発し、䞍十分で脆い蚀語を䜿い、かろうじお䞀臎するむンタフェヌスをあたりにも肥倧化した
ラむブラリのごく䞀郚に接続し、理解できないほどの耇雑さの排萜にならないツヌルを䜿っお、
なぜすべおがク゜なのか、なぜ実際にプログラミングを楜しんで、自分が達成したこずを心から
誇りに思うこずができた最埌の時間は、あなたが子䟛の頃だったのか、ず自分自身に問いかけお
いるこずでしょう...