でSICP、著者の状態(セクション1.1プログラミング言語の三つの基本的な「仕組み」があるということ):
言語が関係する最も単純なエンティティを表すプリミティブ式
組み合わせの手段。これにより、複合要素はより単純な要素から構築されます
抽象化の手段。これにより、複合要素に名前を付けて、ユニットとして操作できます。
これらの要素やメカニズムの観点から主流のプログラミング言語(Javaなど)を分析するにはどうすればよいですか?
でSICP、著者の状態(セクション1.1プログラミング言語の三つの基本的な「仕組み」があるということ):
言語が関係する最も単純なエンティティを表すプリミティブ式
組み合わせの手段。これにより、複合要素はより単純な要素から構築されます
抽象化の手段。これにより、複合要素に名前を付けて、ユニットとして操作できます。
これらの要素やメカニズムの観点から主流のプログラミング言語(Javaなど)を分析するにはどうすればよいですか?
回答:
プリミティブ式、組み合わせの手段、抽象化の手段の違いは、プログラミング言語をモデル化するときに役立ちます。これは言語の固有のプロパティではないことに注意してください。言語の定義を指して「この機能は明白に原始的な表現であり、その機能は明白に組み合わせの手段です」と言うことはできません。区別はモデルのプロパティであり、複雑なモデルは分類に抵抗できます。
これらの3つの概念の教科書の例は、ラムダ計算であり、それぞれ1つずつあります。
より多くの機能を備えた言語に到達すると、モデリングはより曖昧になる可能性があります。一般的に言えば、プリミティブ式は、プリミティブコンポーネントに分解できない、または分解しないものです。しかし、それは原子のようなものです。科学が進歩するまでは原始的です。たとえば、変数が名前ではなく数値を使用するラムダ計算のバリアント(de Bruijnインデックス)があります。これは、コンピューター証明のラムダ項をモデル化するときに特に便利です。また、コンピュータプルーフでは、整数は構成要素に分解されます。したがって、これらのモデルでは、変数はプリミティブ式ではありません。
Java(の典型的なモデル)では、プリミティブ式は主に定数と変数です。組み合わせの手段には、多数の演算子が含まれます。より正確には、「加法表現」は、2つのスロット(左側と右側)または3つのスロット(両側と演算子)を組み合わせた手段であり、A +
BとA -
Bの両方を含める場合その名前の下に(場合の演算子+
と-
自分の権利で原始的構造になります)。組み合わせの他の手段には、命令のシーケンスI ;
J、ループ構造が含まれます。while (…) {…}
、 等々。次に、変数宣言、関数定義、クラス定義などの組み合わせがあり、これらは組み合わせの手段(パラメーター名と型、本体、初期化子などを組み合わせます)と抽象化の手段(再利用する名前を定義しているため)です。実際には、抽象化の手段が組み合わせの手段であることもよくあります。それらは名前とその定義を組み合わせます。
大まかな突き刺し:
式はそれだけです。何がJavaの式を構成するか。ステートメントが含まれるようになるかどうかはわかりません。
組み合わせには、複合式、(変数?、)ステートメント、メソッド、クラスメカニズム、およびパッケージが含まれます。言語になったモジュールも同様です。
Javaでは、抽象化の最も簡単な手段はクラスです。クラスの外には何も存在しない可能性があります。おそらく、抽象化の「層」があります。静的メソッドは、インスタンスを必要としないため、インスタンスメソッドよりも間違いなく単純です。
ジェネリックスは、抽象化の追加レイヤー(およびフラストレーション)を提供します。
これが私の基本的な分類です。私はLISPで平行線を描こうとしています。
プリミティブ表現
LISPの並列:アトム、数値、リスト。
組み合わせの手段(複合データ構造を構築する方法)
LISPの並列:短所セル、リスト
抽象化の手段
+
、-
、 *
、 /
、...)LISPの並列:関数、構文糖質let
、define
プログラミング言語は通常、その構文とセマンティクスによって定義されます。これらは両方とも言語の標準で定義されます。
構文は有効なプログラムの書き方を概説し、意味論はその有効なプログラムの意味を定義します。
あなたの場合、構文はプリミティブが何であるか、それらをどのように組み合わせるか、そしてどのようにそれらを抽象化するかを教えてくれます。セマンティクスは、組み合わせと抽象化が何を意味するかを教えてくれます。
たとえば、構文は有効なfor
ループの記述方法を示します。セマンティクスにより、forループの機能がわかります。
プログラミング言語の分析を開始したい場合は、標準のコピーを入手して、そこに何があるかを確認してください。Javaに入る前に、Cなどの単純な言語から始めます。本の残りも読んだ。コンパイラーを実装していなくても、プログラミング言語がそのように機能する理由を知ることで、私はより優れたプログラマーになりました。
x = ++x;
は、一般的なコンパイラーがそれを受け入れても無効です。
それが正しいかどうかはわかりませんが、除算を理解する方法は次のとおりです。
プリミティブ式、これらは>>、+、*、/、int、ブール値、変数、メソッドなどです。
組み合わせの手段、 これは議論の余地があります。+や簡潔なもの、または継承と構成などのより高度なアイデアとそれを行う方法についての話です。注入、新しい演算子、拡張など
抽象化の手段。 これは、変数、メソッドに名前を付けるために使用される構文であり、インターフェース、クラス、静的クラス、オーバーロードメソッドなどを作成する手段です。
ただし、その本の意味を正確に把握できるように、本からより多くの情報を提供する必要がある可能性があります。