命令型プログラミングの理論的根拠は何ですか?


48

関数型プログラミングには、ラムダ計算組み合わせロジックの理論的基礎があります。統計計算に携わる人として、これらの概念はモデリングに非常に役立つと思います。

命令型プログラミングと同等の数学的な基礎はありますか、それとも単に機械語での実用的なハードウェアアプリケーションとその後のFORTRANの開発から発展したのですか?

回答:


27

一般に、数学を使用してXを研究する場合、まずXのモデルが必要であり、次にそのモデルに関する一連の結果である理論を開発します。理論はXの「理論的基礎」であると言えるかもしれないと思います。次に、X = computationを設定します。多くの計算モデルがあり、その多くは「状態」に関係しています。各モデルには独自の「理論」があり、モデル間で「翻訳」することもできます。どのモデルがより「基本」であるかを言うのは難しいと思います---それらは単に異なる目標を念頭に置いて設計されています。

チューリングマシンは、何が計算可能かを定義するように設計されました。したがって、特定の問題に対するアルゴリズムが存在するかどうかを気にする場合、彼らは良いモデルを作ります。このモデルは、時には勉強に悪用された効率のアルゴリズムや硬さだけ多項式/非多項式を心配している場合、それは少なくとも、良い十分だという口実の下で、問題のを。RAMモデルは実際のコンピューターに近いため、アルゴリズムの正確な分析が必要な場合に適しています。それはに優れている問題の硬度に下限を入れていません現在のコンピューターに非常によく似たモデルを使用します。これは、可能な限りのコンピューターをカバーしたいが、それでも単なる多項式/非多項式よりも正確であるためです。これに関連して、たとえばセルプローブモデルが使用されているのを見ました。

正確性に関心がある場合は、他のモデルも役立ちます。ここには、操作上のセマンティクス(ステートフル計算のラムダ計算の類似物だと思います)、公理的セマンティクス(1967年のフロイドの帰納的主張に基づいて1969年にHoareによって開発され、The Art of Computer Programmingで普及しています)ボリューム1)、その他。

要約すると、あなたは計算のモデルを求めていると思います。さまざまな目標を念頭に置いて開発されたこのようなモデルは数多くあり、多くは状態を持っているため、命令型プログラミングに対応しています。何かを計算できるかどうか知りたい場合は、チューリングマシンを見てください。効率を重視する場合は、RAMモデルをご覧ください。正確性を重視する場合は、操作上のセマンティクスなど、「セマンティクス」で終わるモデルを見てください。

最後に、ジョン・サベージによる計算のモデルのみに関するオンラインの大きな本があることを言及させてください。それは主に効率性についてです。正確さについては、フロイド(1967)ホア(1969)ダイクストラ(1975)、およびプロトキン(1981)の古典的な論文から始めることをお勧めします。彼らはすべてかなりクールです。


4
実際、操作上のセマンティクスは、ポスターが探しているものだと思います。ウィキペディアに関するもう少しの情報:en.wikipedia.org/wiki/Operational_semantics
sclv

22

命令型プログラムの最も単純な理論モデルは、チューリングマシン自体です。命令型プログラムの必須コンポーネントである、無制限の変更可能な状態と、その上で動作する状態マシンの両方を備えています。

Haskellプログラミング言語で行われているように、プログラムをグローバルステートの変更されたバージョンを渡して返すモナド演算の構成と見なすことにより、命令型プログラミングを関数型プログラミングに組み込むこともできます。


2
モナドを使用して、純粋に関数型の言語(Haskellなど)で命令型の構造を取得しても、命令型プログラミングの完全な能力は得られません。特に、真に変更可能な状態がない場合(たとえば、参照のある多くの言語のように)、純粋に機能的な言語での効率的な実装が不明なデータ構造がまだ多くあります。
ジョシュアグロチョウ

@ジョシュア:なぜ状態モナドは参照のセマンティクスを表現しないと思いますか?異議の内容を理解するのに途方に暮れています。
チャールズスチュワート

状態モナドは基本的に、すべてが追加の引数(状態)を受け入れ、追加の出力(次の状態)を出力する関数のコレクションを持つための構文糖です。しかし、純粋に機能的な言語では、次の状態を取得するために状態を実際に変更することはできません。コピーして再構築する必要があります。純粋に機能的な言語で効率的に実装できないことがわかっている特定のデータ構造があるかどうかはわかりませんが、示唆的な証拠は確かにあります(例:Pippenger。Pure vs. impure Lisp。1997)。
ジョシュアグロチョウ

6
モナドで突然変異のセマンティクスを完全にうまくキャプチャできます。たとえば、HaskellのSTモナドを参照してください。ここでは実装ではなくセマンティクスについて説明しています。
sclv

20

要するに、命令型プログラミングは機械語とプログラミングの実践から進化したと言えます。一方、モナドは、命令型プログラミング言語の機能のセマンティクスを記述するための適切なセマンティックフレームワークを提供します。Moggiによる論文 「計算とモナドの概念」は、正式な基盤を確立しました。Phil Wadlerはこのアイデアを広め、プログラミング言語Haskellに命令型機能を組み込むための重要な方法であることに大きく貢献しました。Plotkinによる最近の研究と計算のべき概念がモナドを決定する すべてではありませんが、一部の(命令型)計算の概念は実際にモナドを与えます。つまり、非常に本質的な方法で、モナドは命令型(およびその他の)計算の概念に対応します。


8
モナドは純粋に関数型の世界で命令型プログラミングを阻止するために使用できますが、それらがラムダ計算と多くの関数型言語の関係に類似した命令型プログラミングの理論的基礎を形成していると主張するケースは見当たりません。モナドは、計算のクラスを抽象化するほど計算をモデリングしません(たとえば、純粋な計算とIOを含む計算、または特定の可変状態に依存する計算)。
-blucz

1
モナドは、効果的な言語のより明確な意味論的意味論を書く方法です。
nponeccop

15

命令型プログラミング言語の厳密な数学的処理を探している場合は、Winskelの著書「The Formal Semantics of Programming Languages」(1993)が例です。

本の中で、彼はIMPと呼ばれる命令型プログラミング言語を定義し、その操作的、表示的、公理的意味論を提供しています。


14

私はこの質問に遅れて来ていますが、それは魅力的な質問です。だから、ここに私の意見があります。

私が学部生だった頃、数学の素晴らしい教授がいて、数学の歴史と発展に関する講義をしていました。彼によると、数学は「拡大」と「統合」の波で発展しました。拡張フェーズでは、これまで知られていなかった新しいアイデアが検討され、調査されました。次に、統合フェーズ中に、新しい理論が既存の知識体系に統合されました。しかし、20世紀には、拡張と統合が並行して行われていると彼は言いました。

命令型プログラミングは現在、数学の拡張活動です。以前は「不明」でした。(それは完全に真実ではないかもしれない 。Hoareは、ユークリッドがGeometryで命令型プログラミングのようなことをしていたと言っている。彼らにとっての損失は大きい。しかし、私はコンピューターサイエンスのすべてを抽象的な意味での数学の分野と考えています。私たちはそれを研究しており、その過程で数学を拡大しています。

ですから、命令型プログラミングに先験的な理論的根拠があるかどうかは特に気にしません。見つからない場合は、探しに行きましょう。私たちが知っていることから、命令型プログラミングは素晴らしく深く美しいことがわかっています。関数型プログラミングは比較して見劣りします。しかし、この理論をすべて人々に伝えるためには、やるべきことがたくさんあります。


「機能プログラミングは比較すると見劣りします」。あなたとボブ・ハーパーを戦いの場に連れて行くことができたら。あなたはコマンドの大きなブロックを振るだろうし、彼はあなたに閉鎖をキャストしようとします。(PS:非常に良い答え、私はそれを支持しました。)
アンドレバウアー

まあ、彼は一種の私を避けます。それが何か意味があるかどうかはわかりません:
Uday Reddy

11

関数型プログラミングは数学に明確な基盤を持っています。関数型プログラミング言語は関連する数学と並行して進化し、その設計者は通常数学を高く評価していたためです。強固で率直な関係は、自己実現的な予言です。

命令型プログラミングには、ビジネスやエンジニアリングの問題とより密接に結びついた非常に厄介な歴史があり、歴史的には、コンパイラとそれらが生成するコードのパフォーマンスに数学的な形式を尊重するよりもはるかに関心がありました。

多くの人々は、命令型プログラミングを(従来の)機能的な用語で説明しようとしました。これはあなたが探しているものに最も近いかもしれませんが、これらの試みは常に厄介で退屈で法医学的です。CLRの進捗/保存の証拠を読むよりも、顔から目を引き裂くほうがましだと確信しています。

通常、まともなpl教科書(Pierceの型とプログラミング言語など)の終わりに近づくと、命令型言語機能の正式なモデリングが見られるようになります。これはあなたにとって興味深いかもしれません。


11

An Axiomatic Basis for Computer Programming CAR HOARE

この論文では、幾何学の研究に最初に適用され、後に数学の他の分野に拡張された技術を使用して、コンピュータープログラミングの論理的基盤を探求しようとしました。これには、コンピュータープログラムの特性の証明に使用できる公理と推論規則のセットの解明が含まれます。そのような公理と規則の例が与えられ、簡単な定理の正式な証明が表示されます。最後に、これらのトピックの追求から、理論的および実用的な重要な利点が得られる可能性があると主張されています。

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.85.8553&rep=rep1&type=pdf


8

次に、アレクサンドルが言ったことは、チューリングマシンが命令型プログラミングの元の理論的基礎を提供したということです。命令型プログラミング言語の編成がマシンアーキテクチャを反映している限り、John Von Neumannの仕事もその理論的基盤の重要な部分になると思います。


7

命令型プログラミングに同等の数学的基礎があるのか​​、それとも機械語での実用的なハードウェアアプリケーションとその後のFORTRANの開発から単純に成長したのか?

歴史的な意味で「基礎」を意味する場合、「同等の数学的な基礎」はないと思います。ただし、命令型プログラミングは実際的な懸念から生まれたものの、Hoareロジックなど、「モデリングに役立つ」と思われる方法で命令型プログラミングの意味を包括的に特徴付けるいくつかの方法があります。


このコミュニティwikiを作成するつもりだったのですか?
スレシュヴェンカト

はい、コミュニティwikiにするつもりでした。
jbapple

7

ホアロジックと分離ロジックに言及している投稿は、この件に関する正しい投稿です。Hoareロジックを使用すると、プログラムのヒープ構成全体のプロパティを指定できます。また、分離ロジックは、プロパティが保持するコードのセグメントに事前条件と事後条件として指定できる「分離接続詞」を使用できる、より現代的な相対です残りのヒープを定量化する際にプログラムセグメントが操作するヒープの部分。

haskellではモナドが使用されるのは、評価制約の順序のエンコードと「IOの使用可能性」プロパティの明示的な追跡を可能にする抽象化だけであるため、モナドに関する答えは厳密には正確ではありません。

ホーア/分離ロジックはモナドと見なすことができることと、これらのトピックを調査しているハーバード大学のynotプロジェクトなど、多くの現代的なプロジェクトがあることを指摘する価値があります。

分離ロジックの研究は継続的かつ活発な分野です。


Haskellがモナド(およびMonad型クラス)の概念を使用するという事実と、モナギを使用してカテゴリのセマンティクスのアカウントを構築するより一般的なアプローチ(Moggiなど)を混同するのは誤りのようです。プログラミングを構造化するためのツールとしてモナドを採用することはプログラミングに関する推論を構造化するためのツールとしてのカテゴリーセマンティクスの使用を盲目にするべきではありません。
sclv

非常に明確な説明ですが、多くの人々がモナドを使って、モナド変換器を介してセマンティクスを探索していると信じています。特に、上記のトランスフォーマーの異なる構成から生じる操作の異なるセマンティクス(例えば、状態/可変性、継続、非決定性など)
カータータジオシェーンヴァルト

5

私はこの質問に後ほど出ますが、それにも同様に魅了されます。

命令型プログラミングの理論が関数型プログラミングの理論よりも落ち着いていると思われる理由は私を回避します。単純な命令型言語での再帰の意味の分析から、1969年にスコットとデバッカーに真剣になり始めたと思われます[1]。命令型言語が機能を獲得すると、ストーリーは少し乱雑になりますが、それは金属に近づくために支払う代価です。1980年に、より包括的な取り組みの1つとして、de Bakker、de Bruin、およびZuckerがこの主題に関するモノグラフを作成しました[2]。他のものは上で言及されました。もちろん、これらの参照は日付の分離ロジックよりも前ですが、[2]それにもかかわらず配列と相互再帰的な手順に取り組んでいます。

[1]:1969年に未公開ですが、Jaco W. de BakkerおよびDana S. Scottとして登場しました。プログラムの理論、 1-30ページ。Klop et al。JW de Bakker、25 jaar semantiek。CWI、アムステルダム、1989。LiberAmoricum。

[2]:Jacobus W. de Bakker、Arie de Bruin、Jeffrey Zucker:プログラムの正確性の数学的理論。プレンティスホール1980。


1
明らかに命令型プログラミングは非常によく理解されています。落ち着いていると言うときの人々の意味は、構造的に、命令型プログラミングは純粋な関数型プログラミングよりも豊富であり、このまたはその形式の命令型プログラミングで生じる数学的な構造ははるかに少ないことが発見されたと思います。たとえば、特定の種類の命令型プログラムは、分離ロジックをうまく使用することで推論できます。これはおそらく共有の形式に関係しています。たぶん、これらの種類のプログラムには、素敵で抽象的な数学的特徴がありますか?
マーティンバーガー

1
個人的には、命令型言語のモジュール性の理論は非常に不明確です。モジュール型が関数型言語に意味するもの、つまり関係パラメトリック性を知っています。命令型言語には、(a)明確に機能するが、(b)適切な証明技術に欠ける多くの情報隠蔽イディオムがあります。ここには深い理論があるという興味をそそるヒントがあります。たとえば、シーケンシャル命令型プログラムのモジュール式の証明を行うとき、並行性からのテクニックが必要になります。...非公式に、エイリアシングが同時実行のようですが、私は実際にそのアイデアを形式化する方法がわからない
ニールKrishnaswami

@カイ。スレッドへようこそ!de Bakkerの作品を見たのは久しぶりですが、基本的な問題はアプローチが拡大しなかったことだと思います。その後の命令型プログラミングの進捗状況の簡単な概要については、「表示的セマンティクスを構成するもの」の私の投稿を参照してください。スレッドリンク
ウダイレディ

かわいー 私はそれらの証拠を見たいです。それらはあなたのWebページにありますか?エイリアシングは、高度な共有とインターリーブを伴うという点で、同時実行性に似ています。並行性では、インターリーブを抽象化し、非決定性を仮定します(これは良いことです)。エイリアシングでは、インターリーブに対処する必要があります。ゲームのセマンティクスは、この強制インターリーブの優れた例です。これが、私が好まない理由です。
ウダイレディ

3

質問をした直後に、マクマスター大学のマークベンダーが論文:Assignment Calculus:A Pure Imperative Reasoning Language(2010 Sep 8)を発表しました。この論文では、ラムダ計算に対応するシンプルで命令型の言語について説明します。

割り当て計算は、割り当てX:=t、シーケンスt;u、プロシージャ形成¡t、およびプロシージャ呼び出しの4つの基本構成のみで構成されます!t。ACには、操作セマンティクス、表示セマンティクス、および用語書き換えシステムの3つの解釈があります。3つは同等であることが示されています。

Mark Benderの論文は、遅延評価、バックトラッキング、手順構成で拡張されたバリアントを調査し続けています。これは、小さな拡張の使用によるラムダ計算の調査に似ています。

全体として、論文はOPの質問に対する比較的直接的な答えを提供します。


PDFリンクが壊れています
クインウィルソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.