5

Tomas Petricek と Jon Skeet による「Functional Programming」を読んでいて、宣言型プログラミングと命令型プログラミングの違いを理解しています。

私が疑問に思っていたのは、プリミティブ演算子と関数がどのように実装されているか、命令型演算子と関数から構築された宣言型言語であるということです。

乾杯

AWC

4

5 に答える 5

6

私があなたの質問を正しく理解していれば、それは厳格な規則ではないと思います。たとえば、Lisp のような関数型言語を使用して、それ自体のインタープリターを作成できます。この場合、実装の詳細は関数的な方法で実装されます (Lisp は関数型言語であるため)。

また、チューリング完全な言語がある場合は、それを使用して他の言語のパーサー/インタープリター/コンパイラーを実装できます。命令型のチューリング完全言語と関数型/宣言型のチューリング完全言語があります。

しかし、すべてのコードは最終的にアセンブリ コードまたはマシン コードに変換されます。これは本質的に必須です。理論的には、私が上で言ったことは真実ですが、明らかに実際にはそうではありません:)。

興味深い歴史的なことはさておき、LISP は完全に理論的な構造でした。それはコンピューター言語の数学表記でした。LISP のeval機能が IBM 704 の Steve Russel によってマシン コードに実装されるまで、それは理論的なままでした。

Hackers & Painters で Paul Graham が報告した内容によると、p. 185 、McCarthy は次のように述べています。 . しかし彼は先に進みました. つまり, 彼は私の論文のevalを IBM 704 マシンコードにコンパイルし, バグを修正し, そしてこれを Lisp インタプリタとして宣伝しました. それは確かにそうでした.本質的には今日の形です...」(強調は私のもの)

繰り返しになりますが、理論と実践の間の微妙な点です。:)

于 2010-02-08T19:56:24.187 に答える
3

低レベルのマシン (CPU、アセンブリ言語レベル) は必須であるため、明らかに、ある時点で実装でそれを考慮する必要があります。ただし、Haskell のような特定の種類の関数型言語を実装するには、まともなパフォーマンスのランタイムを作成するために、いくつかの非常に非自明なアプローチが必要です。

奇妙なことに、ほとんどの命令型言語は、すべてのコードがより宣言的なものに変換されるフェーズを通過します。

以下は、Scheme (関数型) を C コード (命令型) に直接コンパイルする例です。

于 2010-02-08T19:57:05.637 に答える
2

あなたの質問は少し不明確です。内部では、プロセッサ命令は本質的に必須です。コードがフォン ノイマン マシンで実行されることになっている場合は、最終的には命令型コードとして実行する必要があります。

これらの操作を本質的にサポートするマシン (いくつかの特定のアーキテクチャを持つ) を構築することは可能かもしれません。実際、LispMは Lisp プログラムの実行を支援するために設計されました。私は LispM のハードウェア特性に精通していませんが、おそらく、より宣言的なレベルでいくつかのプリミティブ操作を提供する資格があると思われます。

于 2010-02-08T19:57:46.993 に答える
2

宣言型言語は命令演算子と関数から構築されていますか?

時々。これは、言語ではなく、実装のプロパティです。

1980 年代、多くの人が関数型プログラムをグラフにコンパイルし、そのグラフをより単純なグラフに書き直しました。通常、この計算には所定の場所でグラフを更新することが含まれますが、それ以外の場合は、必要に応じて宣言的でした。詳細については、「グラフ リダクション」を検索するか、Chris Clack と Simon Peyton Jones による「The four-stroke reduction engine」をお読みください。

最終的に、コンパイラの作成者は、機能的なプログラムをネイティブのマシン コードに直接コンパイルすることで、パフォーマンスを向上させる方法を見つけました。ネイティブ マシンが典型的なコモディティ マシンである場合、これは典型的な命令型操作を意味します。しかし、MIT の Arvind 教授の先駆的な研究を調べると、彼のグループは、基本的な計算操作が本質的により宣言的であるデータフロー マシンを設計および構築しました。それは素晴らしい仕事でしたが、1980 年代に栄えたすべての専用アーキテクチャは、Microsoft/Intel の偉大な好循環 (より多くのソフトウェア -> より多くの PC が販売される -> より安価なプロセッサ -> より多くの PC が販売される -> .. . -> 本当にクールなことをする 300 ドルのネットブック)。

于 2010-02-09T02:16:06.483 に答える
0

実装は、ボンネットの下に隠されていることです。任意のパラダイムで構築できます。

宣言型プログラムは、多かれ少なかれ「普遍的な」命令型実装/vm の単なるデータです。

プラス:ハードコードされた(およびチェックされた)形式でデータのみを指定することは、命令型アルゴリズムのバリアントを直接指定するよりも簡単で、エラーが発生しにくいです。一部の複雑な仕様は、DSL 形式でのみ直接記述することができません。DSL のデータ構造で使用される best と freq は、セットとテーブルです。要素/行間に依存関係がないためです。依存関係がない場合は、自由に変更でき、サポートも簡単です。(たとえば、モジュールとクラスを比較してください-モジュールには満足し、クラスには脆弱な基本クラスの問題があります)宣言性とDSLのすべての商品は、そのデータ構造(テーブルとセット)の利点からすぐに続きます。別のプラス-DSLが多かれ少なかれ抽象的である(適切に設計されている)場合、宣言型言語vmの実装を変更できます。たとえば、並列実装を行います。

マイナス:あなたは正しいと思います。一般的な (および DSL によってパラメーター化された) 命令型アルゴリズム/vm の実装は、特定のものよりも遅くなるか、メモリを消費する可能性があります。ある場合には。そのようなケースがめったにない場合は、忘れて、遅くしましょう。頻繁な場合 - その場合はいつでも DSL/vm を拡張できます。どこかで他のすべてのケースの速度が低下します、確かに...

PS フレームワークは、DSL と命令型の中間です。そして、すべての中途半端な解決策と同様に...それらは利点ではなく欠点を組み合わせています。それらはそれほど安全ではなく、それほど速くもありません:)なんでも屋のハスケルを見てください-それは強力で単純なMLと柔軟なメタプログPrologの中間です...それはなんとモンスターです。ブール値のみの関数/述語を持つ Haskell として Prolog を見ることができます。そして、Haskell に対してその柔軟性がいかに単純であるか...

于 2016-01-06T05:04:17.917 に答える