プログラミング言語の分析


10

SICP、著者の状態(セクション1.1プログラミング言語の三つの基本的な「仕組み」があるということ):

  • 言語が関係する最も単純なエンティティを表すプリミティブ式

  • 組み合わせの手段。これにより、複合要素はより単純な要素から構築されます

  • 抽象化の手段。これにより、複合要素に名前を付けて、ユニットとして操作できます。

これらの要素やメカニズムの観点から主流のプログラミング言語(Javaなど)を分析するにはどうすればよいですか?


以前に、拡張バッカスナウアフォーム(EBNF)または バッカスナウアフォーム(BNF)を見たことがありますか?それはこれら3つの概念に似た文法を破壊する可能性がありますが、私はあなたの意図が何であるか本当にわからないので、それが役立つかどうかはわかりません。
ジェティ

@Jetti-はい、私は持っていますが、私は興味がありません。私はプログラミング言語のセマンティクス(質問:実際に私が探している単語ですか?)を分析しようとしています。それらの書かれた形式(すなわち構文)。

回答:


1

プリミティブ式、組み合わせの手段、抽象化の手段の違いは、プログラミング言語をモデル化するときに役立ちます。これは言語の固有のプロパティではないことに注意してください。言語の定義を指して「この機能は明白に原始的な表現であり、その機能は明白に組み合わせの手段です」と言うことはできません。区別はモデルのプロパティであり、複雑なモデルは分類に抵抗できます。

これらの3つの概念の教科書の例は、ラムダ計算であり、それぞれ1つずつあります。

  • 変数xy、…だけがプリミティブ式です。
  • 機能アプリケーションMNは組み合わせの1つの手段です。
  • ラムダ抽象化λx.Mは抽象化の1つの手段です。

より多くの機能を備えた言語に到達すると、モデリングはより曖昧になる可能性があります。一般的に言えば、プリミティブ式は、プリミティブコンポーネントに分解できない、または分解しないものです。しかし、それは原子のようなものです。科学が進歩するまでは原始的です。たとえば、変数が名前ではなく数値を使用するラムダ計算のバリアント(de Bruijnインデックス)があります。これは、コンピューター証明のラムダ項をモデル化するときに特に便利です。また、コンピュータプルーフでは、整数は構成要素に分解されます。したがって、これらのモデルでは、変数はプリミティブ式ではありません。

Java(の典型的なモデル)では、プリミティブ式は主に定数と変数です。組み合わせの手段には、多数の演算子が含まれます。より正確には、「加法表現」は、2つのスロット(左側と右側)または3つのスロット(両側と演算子)を組み合わせた手段であり、A + BA - Bの両方を含める場合その名前の下に(場合の演算子+-自分の権利で原始的構造になります)。組み合わせの他の手段には、命令のシーケンスI ; J、ループ構造が含まれます。while (…) {…}、 等々。次に、変数宣言、関数定義、クラス定義などの組み合わせがあり、これらは組み合わせの手段(パラメーター名と型、本体、初期化子などを組み合わせます)と抽象化の手段(再利用する名前を定義しているため)です。実際には、抽象化の手段が組み合わせの手段であることもよくあります。それらは名前とその定義を組み合わせます。


素敵な答え; 私が苦労していた問題、つまりプリミティブ、組み合わせなどのあいまいな区別に

「変数」とはどういう意味ですか?それらには名前があるので、それらを抽象化の手段として説明することはできませんか?
morbidCode 2017

@morbidCode変数の概念は複雑なものであり、ラムダ計算とJavaでは、単語には異なるが関連する意味があります。変数は未指定の値を参照するため、「抽象化」と見なすことができます。ただし、これは抽象化の手段ではありません。参照を作成するのではなく、単に既存の抽象化を使用する方法です。ラムダ抽象化は、コードブロックを操作可能なオブジェクトとして使用する方法を作成します。
Gilles「SO-邪悪なことをやめる」

4

大まかな突き刺し:

式はそれだけです。何がJavaの式を構成するか。ステートメントが含まれるようになるかどうかはわかりません。

組み合わせには、複合式、(変数?、)ステートメント、メソッド、クラスメカニズム、およびパッケージが含まれます。言語になったモジュールも同様です。

Javaでは、抽象化の最も簡単な手段はクラスです。クラスの外には何も存在しない可能性があります。おそらく、抽象化の「層」があります。静的メソッドは、インスタンスを必要としないため、インスタンスメソッドよりも間違いなく単純です。

ジェネリックスは、抽象化の追加レイヤー(およびフラストレーション)を提供します。


@MattFenwick式は単一のプリミティブで構成できます。プリミティブと他のエンティティの組み合わせにより、複合式が作成されます(まだ式ですが、ステートメントではありません)。
デイブニュートン

@MattFenwickではない、私は式プリミティブであると言っているのでなく、式単一のプリミティブのみで構成されている可能性があると言っています。直接の文字列とそれが作成する参照を区別したくない場合を除いて、言語がその文字列に構文糖を提供するという理由だけで、文字列がプリミティブである方法はありません。+は、なんら影響を受けることがないためです。
デイブニュートン

余談ですが、Javaのジェネリックの実装に問題はありますか?
Steven Evers

2

これが私の基本的な分類です。私はLISPで平行線を描こうとしています。

プリミティブ表現

  • すべてのプリミティブ値、リテラルを使用して表現できるもの(数値、ブール値など)

LISPの並列:アトム、数値、リスト。

組み合わせの手段(複合データ構造を構築する方法)

  • 配列
  • オブジェクト/構造体。

LISPの並列:短所セル、リスト

抽象化の手段

  • すべての制御フロー構文(for、while for)
  • すべての組み込み演算子(+-*/、...)
  • すべての関数(このカテゴリには、クラスとメソッドが含まれます)

LISPの並列:関数、構文糖質letdefine


素敵な答え!制御フローの構成要素のいくつかは、組み合わせの手段に収まると考えていました。LISPとよく似ていますが、これは非常に役立ちます。

結構です。配列とオブジェクトは異なるレベルで再生されます。それらは言語自体ではなく、データ表現の一部です。配列初期化子は言語の一部であり、組み合わせの手段です。演算子と制御フロー構造は、再利用のために何も「保存」しないため、抽象化の手段ではありません。抽象化の手段は通常、エンティティに名前を付けて、その名前で将来再利用できるようにします。
Gilles「SO-邪悪なことをやめ

0

プログラミング言語は通常、その構文セマンティクスによって定義されます。これらは両方とも言語の標準で定義されます。

構文は有効なプログラムの書き方を概説し、意味論はその有効なプログラムの意味を定義します。

あなたの場合、構文はプリミティブが何であるか、それらをどのように組み合わせるか、そしてどのようにそれらを抽象化するかを教えてくれます。セマンティクスは、組み合わせと抽象化が何を意味するかを教えてくれます。

たとえば、構文は有効なforループの記述方法を示します。セマンティクスにより、forループの機能がわかります。

プログラミング言語の分析を開始したい場合は、標準のコピーを入手して、そこに何があるかを確認してください。Javaに入る前に、Cなどの単純な言語から始めます。本の残りも読んだ。コンパイラーを実装していなくても、プログラミング言語がそのように機能する理由を知ることで、私はより優れたプログラマーになりました。


1
待って、何?「Javaに入る前は、Cのように単純です。」「Simple like C」で私を失った。
corsiKa

マット、その時あなたが何をしているのか本当によくわからない。あなたが引用した本は、著者がそれらを明示的に構文と意味論と呼ぶかどうかにかかわらず、これらの両方について語っています。
mpdonadio

実際、「構文」は、言語の「最も単純な」ものを正確に表し、そこから構成される原子が構成されています。
Ira Baxter

構文は、有効なプログラムが何であるかを完全にはキャプチャしていません。たとえば、構文的に正しいプログラムは型チェックに失敗する場合があります。ステートメントを実行するCプログラムx = ++x;は、一般的なコンパイラーがそれを受け入れても無効です。
Gilles「SO-悪をやめる」

0

それが正しいかどうかはわかりませんが、除算を理解する方法は次のとおりです。

プリミティブ式、これらは>>、+、*、/、int、ブール値、変数、メソッドなどです。

組み合わせの手段、 これは議論の余地があります。+や簡潔なもの、または継承と構成などのより高度なアイデアとそれを行う方法についての話です。注入、新しい演算子、拡張など

抽象化の手段。 これは、変数、メソッドに名前を付けるために使用される構文であり、インターフェース、クラス、静的クラス、オーバーロードメソッドなどを作成する手段です。

ただし、その本の意味を正確に把握できるように、本からより多くの情報を提供する必要がある可能性があります。


この本はオンラインで無料です。OPにリンクが表示されます。私は同じように感じましたmeans of combination-そこに正確に何が属しているかを理解するのは難しいことです。いい答えですが。

彼が他のどの章を組み合わせと抽象化について話しているか知っていますか?
ボブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.