16

私は文芸的プログラミングの概念に不慣れです。私はこの主題に関するドナルド・クヌースの論文(PDF)を読んでいましたが、最初の冒頭で、彼は次のように述べています。

私たちの主な仕事はコンピューターに何をすべきかを指示することだと想像する代わりに、コンピューターに何をしてほしいかを人間に説明することに集中しましょう。

彼または彼女 [リテラシー プログラミングの実践者] は、プログラムの概念が人間の理解に最適な順序で導入されているため、相互に補強し合う公式および非公式の方法を組み合わせて、理解しやすいプログラムを目指しています。

次に、さらに読む:

プログラムに関することは、その構造的な関係です。複雑なソフトウェアは、単純なパーツとそれらのパーツ間の単純な関係で構成されます。プログラマーの仕事は、トップダウンやボトムアップのように厳密に決められた順序ではなく、人間の理解に最も適した順序で、それらのパーツとそれらの関係を 記述することです。

(...)

トップダウン プログラミングでは、どこに向かっているのかについて強いアイデアが得られますが、頭の中で多くの計画を立てる必要があります。最後まで本当に何も決まっていないので、サスペンスが高まります。プログラミングには、ますます多くのサブルーチンが構築されるにつれて、ますます強力な鉛筆を継続的に使用できるという利点があります。しかし、プログラム全体の編成を最後の最後まで延期せざるを得なくなるため、あてもなく失敗する可能性があります。

このように WEB 言語は、人が「意識の流れ」の順序でプログラムを表現することを可能にします。TANGLE は、PASCAL コンパイラが要求する配列にすべてをスクランブルすることができます†</sup>。WEB のこの機能は、おそらくその最大の資産です。

上記の抜粋は、この主題に興味を持たせたので、もう少し調査しました。Haskell とリテラシー プログラミングの関係を検索エンジンの検索結果から確認することは難しくありませんが、「人間が理解するのに最適な順序」は見当たりません。むしろ、コンピューターが機能するために必要な順序を維持しながら、非常によくできたドキュメントを目にします。

  • その順序の問題を取り除いて「文芸的プログラミング」という用語を使用できますか?
  • 「意識の流れ」順序機能を必要としない、読み書き可能なプログラミングの他の定義はありますか?
  • Haskell は (Knuth の定義を使用して) 本当に読み書き可能なプログラミングが可能ですか?

最後に、個人的な意見として、Haskell が行うこと (そしておそらく他の多くの言語が行うこと) でさえ、Knuth の文芸的なプログラミングではないということを言わなければなりません。コメントがコードをはるかに超える場合、それは大きな目的を果たします。


†</sup> WEB と TANGLE は、もともと D. Knuth が文芸的プログラミング概念の最初の実装で使用したシステムの一部です。

4

1 に答える 1

16

Haskell は、ほとんどの場合、注文に関して非常に柔軟です。Haskell モジュール内では、すべての宣言と定義を任意の順序で行うことができます。参照透過性のおかげで、サブ問題を抽出して別の場所に実装することも非常に簡単です。

順序が重要な主な領域はパターン マッチングです。関数のすべての方程式は一緒にする必要があり、順序が一致しているため、常に順序を変更できるとは限りません。ただし、(a) これは通常非常に局所的であり、(b) 多数の方程式を含む大きな関数は小さなパーツにリファクタリングできる (そしておそらくリファクタリングする必要がある) ため、これが重大な制限であるとは思いません。 .

おそらく最も厄介な制約は、インポート宣言がモジュールの先頭になければならないということです。これは意識の流れを少し壊します。Haskell で書かれた多くの読み書き可能なプログラムは、「これらのインポートを気にしないでください。必要な場所は後でわかります」などのステートメントで始まります。なぜインポートが必要なのかがコンテキストから明らかなテキスト中のより自然なポイントでインポートに名前を付けることができれば、Knuth の文芸的プログラミングの定義とより一致していたでしょう。

それはさておき、Haskell は読み書きのできるプログラミングに適していると思います。Knuth の定義には完全には当てはまらないかもしれませんが、十分に近いと思います。

于 2013-06-01T05:21:22.913 に答える