too late amatuar programmer

[paradigm] [Forth] 正しい定義を積み上げていくというプログラミングスタイル

2011-07-10 by ebon | Lavel: ,


きれいなソースコードを書くために必要な、たったひとつの単純な事
そのソースコードが汚い理由:共通した根源的な間違い

ちょっと前の人気記事っぽいが今さら読んでみた。
注目した点は、正しい名前を付ける・維持する姿勢養成ギプスとしてhaskellを推奨していること。
haskellは少しかじっていた自分は、その宣言性の高さからくる、上記著者の主張する効果を強く実感している。
自然と名前付けに苦労する時間が増えた結果、正しい名前へのこだわりが増した,という方が正しいかな。

そんな事を考えている折、FORTHという言語を最近、今さらながら知った。
ちょうど近日読んだ本、「言語設計者達の考える事」にてだ。
そこでFORTHの作者の話があり、同記事の正しい名前の重要性の主張と、FORTHの言語思想が重なり合って感じたため、よい定義スタイル養成のためにこの言語に注目してみたい。
# その後見た同記事のブクマコメントでも少し語られていたこともきっかけとしてある。

haskellを中途半端に学んだ効果

まず、既に少しかじっていたhaskellの学習効果について。
特にこの記事の影響や宣言的言語を学ぶという動機ではなく、単に興味からhaskellを学んだ。
その宣言性, 個々の関数の参照透明性を保つこと、データの写像の連続を表現することで設計とすること..
思えば、推奨されてるように、確かにhaskellを学んだ効果を実感する。
他言語で書くときも良い名前を維持するスタイルを圧倒的に重視するようになった。

ただ、haskellを中途半端に学ぶと、良くない面が身に付いてしまう恐れもある。
haskellのその簡潔性へのサポートから、宣言性へのこだわりより、簡潔に書く事へのこだわりが強くなる。
簡潔さや抽象的であることを単に短さに還元してしまうというか。
結果、単純にそのデータが何であるかを現す、定義としての一時変数を置くことに煩わしさを感じ、個々に独立して作成した関数をどうにか一気に適用しようとする。
シンタックスシュガーがそうさせるものではあると幻惑され、むしろその方が良いスタイルに思えてしまう瞬間がある。

これらデータを示す一時変数を丁寧に置くか、一気に書き下ろしてしまうかの加減が今一分からない。1行1意味文とするのが鉄則なのだろうか。もっとコードを読めという話ではあるけれども。

FORTHのスタイル

まず、Forthとは、というところを、「言語設計者達が考える事」から引用。
Charles H. Moore氏(以下Chuck)によって、1960年代に設計されたスタックに基づく、拡張可能な言語です。その主な特徴は、データの保持にスタックを使用するという点と、スタック上の引数をポップし、結果をスタック上にプッシュするという操作を行うワードを使用するという点にあります。

その作者Chuck氏へのインタビュー内で、言語哲学を語る際に、
よい名前を管理維持するスタイルとの共通するものが感じられた。
その辺りの、上記の記事の主旨と共通する思想の部分をいくつか引用する。
これら哲学を持ったForthは、良いプログラミングスタイルの養成ギプスになりうると思う。

小さな機能を持った数多くのワードを定義していく

■ FORTHは言語のツールキットというわけですね。
他の言語よりもシンタックスが簡潔である点、小さな機能のワードを組み合わせてボキャブラリを
作って行ける点を考えると、その通りだともいます。他にも何か特徴がありますか?

Chuck:
基本的な特徴はそれが全てであり、そういった特徴が極めて高い密度で実現されているのです。
ワードを小さくまとめるためには、たいていの定義を1行で収めることになります。
この言語は、既存のワードを用いて新たなワードを定義していくことで拡張されるため、
星の数ほどのワードが階層化されることになります。

正しい定義を持ったワードを構築することこそがプログラミングである

■ この言語の成功はどういったことだと考えていますか?

Chuck:
Forthという言語でプログラムを記述するのではありません。Forthこそがプログラムなのです。
つまり、問題に取り組むためのボキャブラリを構築するためのワードを追加していくわけです。
正しい単語が定義できれば、そのことは自ずと明らかになり、
その後は対話的に適切な問題を解決できるようになるのです。

ボトムアップでワードを定義していく

■ 優れたForthプログラムをは、どのようなかたちで設計されるのでしょうか?

Chuck:
ボトムアップです。
まず最初に、おそらくは生成しなければならない何らかの入出力信号があるはずです。
このため、そういったものを生成することになります。
次に、出力信号の生成を制御するコードを記述します。
その後、上位のワードに到達するまでに次々にコードの記述を続けていきます。
最後は最上位のワード名を入力するだけで、そのワードが呼び出され、
全てのコードが実行されることになるわけです。

  • ボトムアップでプログラミングしていく
  • まずプログラムを作るための言語をつくる。そのことこそがプログラミングである。

という事はLispでの主張として有名でもある。
haskellやlisp, そしてForthは生産性の高さ・コードの簡潔さの実現を強烈にうたっている言語だが、それら言語達で、名前に関する共通する哲学が感じられる。
元記事が推奨するその教義に従いたくなるな。

最後に

正しい名前を付ける というスキルは一丁縄では全くいかない。膨大な訓練が必要である事は間違いない。
もっとも大切な事はやはり、個人が、数多くのコード・優れたコードを読む事なわけで。
ただ、この問題に対して,プログラミングを取り巻く社会はどのように担保してるのか。
現状は、優れた慣習は形成されているとは言っても、個人の技芸の域に留まっているのは否めない。
その状況はやはり工学とは呼べない。
ということは散々言及されていることではあるけれど。
オントロジーやAIが発展してきた時に、慣習はより直接的な標準に変わって行くのかな。。

0 comment:

Post a Comment