22


15

プログラミング言語の背後に数学モデルや理論はありますか?

RDBMSは、http://en.wikipedia.org/wiki/Relational_algebra [Relational Algebra]およびCoddのモデルに基づいています。 プログラミング言語やOOPに似たものはありますか?

11 Answer


41


_ プログラミング言語の[基礎となるモデル]はありますか? _

天国、はい。 そして、非常に多くのプログラミング言語があるため、複数のモデルから選択できます。 最も重要な最初:

  • 教会の* untyped lambda calculus *は、 チューリングマシンと同じくらい強力です(これ以上でもそれ以下でもありません)。 有名な「チャーチ・チューリング仮説」は、これらの2つの同等なモデルが、実装方法を知っている計算の最も一般的なモデルを表しているということです。 ラムダ計算は非常に単純です。全体として、言語は+

e ::= x | e1 e2 | \x.e

+ 変数関数アプリケーション、および_関数定義_を構成します。 ラムダ計算には、式を単純化するための「縮小ルール」のかなり大きなコレクションも付属しています。 縮小できない式を見つけた場合、それは「標準形」と呼ばれ、値を表します。 +ラムダ計算は非常に一般的であるため、いくつかの方向に進むことができます。 * 使用可能なすべてのルールを使用する場合は、専門の 部分評価者やコンパイラの一部などのツール。 * ラムダの下の部分式を減らすことを避けたが、そうでなければ 利用可能なすべてのルールを使用すると、http://www.haskell.org/ [Haskell]やCleanのような遅延関数型言語のモデルが作成されます。 このモデルでは、リダクションが終了できる場合、それが保証され、無限のデータ構造を簡単に表すことができます。 とてもパワフルな。 * ラムダの下の部分式を減らすことを避け、そして また、関数を適用する前に各引数を通常の形式に減らすことを要求すると、F#、Lisp、Objective Caml、Scheme、Standard MLなどの_eager_関数型言語のモデルが得られます。 * _typed_ラムダ計算のフレーバーもいくつかあります。 最も有名なものは、* System F *という名前でグループ化されており、Girard(ロジック)とReynolds(コンピューターサイエンス)によって別々に発見されました。 System Fは、CLU、Haskell、MLなどの言語の優れたモデルです。これらのモデルは、多相ですが、コンパイル時の型チェックを備えています。 Hindley(ロジック)およびMilner(コンピューターサイエンス)は、制限された形式のSystem F(現在はHindley-Milner型システムと呼ばれる)を発見しました。 DamasとMilnerは、この推論を行うアルゴリズムを開発しました。これは、標準MLで使用され、他の言語で一般化されています。 * ラムダ計算は単にシンボルを押しているだけです。 ダナ・スコット *表示的意味論*の先駆的な研究は、ラムダ計算の式が実際に数学関数に対応することを示し、どの関数を識別するかを示しました。 スコットの研究は、「再帰的定義」の意味を理解する上で特に重要です。「再帰的な定義」は、コンピューターサイエンスでは一般的ですが、数学的な観点からは無意味です。 ScottとChristopher Stracheyは、再帰的定義が再帰方程式の最小定義の解と同等であることを示し、さらにその解をどのように構築できるかを示しました。 再帰を許可する言語、特に任意の型(HaskellやCleanなど)で再帰を許可する言語は、スコットのモデルに何かを負っています。 * *抽象的なマシン*に基づいたモデルのファミリーがあります。 Here 技術ほど個々のモデルはありません。 ステートマシンを使用し、マシンで遷移を定義することにより、言語を定義できます。 この定義には、チューリングマシンからフォンノイマンマシン、項書き換えシステムまですべてが含まれますが、一般的に、抽象マシンは「できるだけ言語に近い」ように設計されています。そのようなマシンの設計、およびそれらについての定理を証明するビジネスは、*操作上のセマンティクス*という見出しの下にあります。

_ オブジェクト指向プログラミングはどうですか? _

私は、OOPに使用される抽象モデルについての教育を受けるべきではありません。 私が最もよく知っているモデルは、実装戦略と非常に密接に関連しています。 この領域をさらに調査したい場合は、William CookのSmalltalkの表示的意味論から始めます。 (言語としてのSmalltalkは非常に単純で、ラムダ計算とほぼ同じくらい単純なので、より複雑なオブジェクト指向言語のモデリングの良いケーススタディになります。)

Wei Huは、Martin AbadiとLuca Cardelliがオブジェクト指向言語の基礎計算(ラムダ計算に類似)に関する意欲的な一連の作業をまとめたことを思い出します。 私はそれを要約するのに十分な仕事を理解していませんが、ここに引用する価値があると思う彼らの本のプロローグからの一節があります:

_ _ 手続き言語は一般的によく理解されています。それらのコンストラクトは現在では標準であり、それらの正式な基盤はしっかりしています。 これらの言語の基本的な機能は、実装、静的分析、セマンティクス、および検証の問題を識別して説明するのに役立つことが証明された形式に分解されています。

オブジェクト指向言語については、類似の理解はまだ現れていません。 基本的なコンストラクトのコレクションとそれらのプロパティに関する広範な合意はありません…​ この状況は、オブジェクト指向言語の基礎についての理解が深ければ改善する可能性があります。

  1. オブジェクトをプリミティブとして扱い、固有のルールに集中します そのオブジェクトに従う必要があります。 オブジェクト計算を導入し、それらの周りのオブジェクトの理論を開発します。 これらのオブジェクト計算は、関数計算と同じくらい簡単ですが、オブジェクトを直接表します。 _ _

この引用があなたに作品のフレーバーのアイデアを与えることを願っています。


10


Lispはラムダ計算に基づいており、今日の現代言語に見られる多くのインスピレーションです。

Von-Neumannマシンは、最初にアセンブラー言語でプログラミングされ、次にFORmula TRANslatorでプログラミングされた現代のコンピューターの基盤です。 次に、文脈自由文法の正式な言語理論が適用され、すべての現代言語の構文の基礎になっています。

計算可能性理論(フォーマルオートマトン)には、フォーマルグラマーの階層に対応するマシンタイプの階層があります。たとえば、regular-grammar = finite-state-machine、context-free-grammar = pushdown-automaton、context-sensitive-grammar =チューリングマシン。

シャノンとコルモゴロフの2種類の情報理論もあり、コンピューティングに適用できます。

再帰関数理論、レジスタマシン、ポストマシンなど、あまり知られていないコンピューティングのモデルがあります。

また、さまざまな形式のpredicate-logicも忘れないでください。

追加:離散数学-グループ理論と格子理論について言及するのを忘れました。 特にラティスは(IMHO)すべてのブール論理の基礎となる特に気の利いた概念であり、表示的セマンティクスなどのいくつかの計算モデルです。


6


Lispのような関数型言語は、教会の「ラムダ計算」から基本概念を継承します(wikipediaの記事http://en.wikipedia.org/wiki/Lambda_calculus[here])。 よろしく


5


1つの概念は、http://en.wikipedia.org/wiki/Turing_machine [Turing Machine]です。


3


プログラミング言語を勉強する場合(例:大学で)、理論は非常に多くあり、少々の数学は関係していません。

例は次のとおりです。


2


Wikipediaの_Object-oriented programming_のhttp://en.wikipedia.org/wiki/Object-oriented_programming#History[history section]は啓発的である可能性があります。


2


私が考えることができる最も近い類推は、今日では「Gurevich Abstract State Machines」(GASM)の名前でより知られているGurevich Evolving Algebrasです。

GurevichがMicrosoftに入社したとき、理論の実際の応用をもっと期待したかったのですが、ほとんど出てこないようです。 MicrosoftサイトのASMLページを確認できます。

GASMの良い点は、セマンティックが正式に指定されている場合でも、擬似コードに非常に似ていることです。 これは、開業医が簡単に把握できることを意味します。

結局、リレーショナル代数の成功の一部は、テーブル、外部キー、結合など、簡単に把握できる概念の正式な基盤であると思います

ソフトウェアシステムの動的コンポーネントにも同様のものが必要だと思います。


2


あなたの質問に対処するための多くの次元があり、答えがばらばらになっています。

まず、言語の構文を記述し、パーサーの動作方法を指定するために、コンテキストなしの文法を使用します。

次に、構文に意味を割り当てる必要があります。 形式的なセマンティクスは便利です。主なプレーヤーは、操作セマンティクス、表示セマンティクス、および公理セマンティクスです。

不正なプログラムを除外するには、型システムを使用します。

最終的に、すべてのコンピュータープログラムは、非常に単純な計算モデルに縮小(または、必要に応じてコンパイル)できます。 命令型プログラムはより簡単にチューリングマシンにマップされ、機能プログラムはラムダ計算にマップされます。

これらすべてを自分で学習している場合は、http://www.uni-koblenz.de/~laemmel/paradigms0910/をお勧めします。講義はビデオ録画され、オンラインで公開されるためです。


2


計算理論とセマンティクスへの数学の応用について多くの人が言及されています。 型理論の言及が好きで、誰かが格子理論に言及してくれてうれしいです。 ここにさらにいくつかあります。

カテゴリ理論は、モナドやファンクターの概念など、他の場所よりも関数型言語でより明確に示されています。 次に、モデル理論と、定理証明または論理言語Prologに実際に現れるさまざまな論理の化身があります。 並行言語の基礎と問題に対する数学的応用もあります。


2


OOPの数学モデルはありません。

SQLの数学モデルにおける関係代数。 bt E.Fで作成されました。 コッド。 C.J. 日付は、この理論を手伝った有名な科学者でもありました。 全体的な考え方は、すべての操作を集合操作として実行でき、同時に多くの値に影響を与えることができるということです。 これはもちろん、データベースエンジンに何を出力するように指示する必要があり、データベースがクエリを最適化できることを意味します。

CoddとDateはどちらも理論に関与していたためSQLを批判しましたが、SQLの作成には関与していませんでした。

このビデオを見る:http://player.oreilly.com/videos/9781491908853?toc_id=182164

クリス・デイトから多くの情報があります。 DateがSQLプログラミング言語をひどい言語だと批判したことを覚えていますが、その論文は見つかりません。

基本的に、ほとんどの言語では式を記述してそれらの式に変数を割り当てることができますが、SQLではできません。

SQLは一種の論理言語なので、Prologでリレーショナル代数を書くことができると思います。 少なくともあなたは本当の言語を持っているでしょう。 したがって、Prologでクエリを作成できます。 また、プロローグには自然言語を解釈するための多くのプログラムがあるため、自然言語を使用してデータベースを照会できます。

ボブおじさんによれば、SSDのアーキテクチャはアクセスがRAMと同じくらい速いことを意味するため、誰もがSSDを持っている場合、データベースは不要になるでしょう。 したがって、すべてのオブジェクトをRAMに配置できます。

SQLを捨てる場合の唯一の問題は、データベースのクエリ言語がなくなることです。

はい、いいえ。リレーショナル代数はSQLのインスピレーションとして使用されましたが、SQLは実際にはリレーショナル代数の実装ではありません。

Lispの場合、状況は異なります。 主なアイデアは、Lispでeval関数を実装すると、言語全体を実装できるということでした。 それは、最初のLisp実装がコードの半分のページに過ぎないということです。

少し笑うには:https://www.youtube.com/watch?v=hzf3hTUKk8U

関数型プログラミングの重要性はすべて、カリー化された関数と遅延呼び出しにかかっています。 そして、環境と閉鎖を決して忘れません。 そして、マップを削減します。 これはすべて、20年後に関数型言語でコーディングすることを意味します。

OOPに戻ると、OOPの形式化はありません。

興味深いことに、これまでに作成された2番目のOO言語であるSmalltalkは、オブジェクトのみを持ち、プリミティブなどはありません。 そして、作成者のAlan Kayは、Lispの機能とまったく同じように機能するように明示的にブロックを作成しました。

一部の人々は、OOPがカテゴリ理論を使用して形式化される可能性があると主張しています。 射は、オブジェクト間のマップを保持する構造です。 したがって、一般にmap(f、collection)を使用して、すべての要素がfで適用されたコレクションを取得できます。

Lispにはそれがあると確信していますが、Lispにはコレクション内の1つの要素を返す関数もあり、構造を破壊します。そのため、射は特別な種類の関数であり、そのため、関数を減らし制限する必要がありますLispでは、それらはすべて射である。

これに関する主な問題は、OOPのオブジェクトとは独立して関数が存在するのではなく、カテゴリ理論では関数が存在することです。 したがって、それらは互換性がありません。 カテゴリ理論を表現するための新しい言語を開発できます。

OOPを形式化しようとするために明示的に作成された実験的理論言語はZです。 Zは、要件の形式に基づいています。

別の試みは、ルカ・カーデッリの形式主義です。

Java`http://lucacardelli.name/Papers/PrimObjImp.pdf Java`http://lucacardelli.name/Papers/PrimObj1stOrder.A4.pdf `Java`http://lucacardelli.name/Papers/PrimObjSemLICS.A4 .pdf

私はその表記を読んで理解することができません。 私が知っている限りでは、Lamba微積分がLispで実装された方法で誰もこれを実装したことがないので、役に立たない運動のようです。