回答:
通常理解されているように、実際の抽象構文と型のソートには多くの類似点があります。しかし、ソートは正式な構文上の概念であり、ASツリーも構文ですが、タイプは意味上の概念です。
用語は、用語代数(自由代数とも呼ばれる)と普遍代数に由来します。これらは本質的に代数的構造の構文理論であり、解釈とは無関係に分析されます。彼らは20世紀の前半に開発されました。
用語はツリーと見なすことができ、ノードは有限の演算子のセットからラベル付けされ、各演算子はツリー内の娘の数を指定する固定アリティを持っています。アリティ0は葉用です。では代数マルチソートこのようにソートに属し、各オペレータことを、種類で洗練され、かつその頭演算子の各娘の修正は、ソートすることをアリティは、種類の順序付けられたリストに置き換えられます。演算子の種類は、その娘の種類のリストとともに、演算子のシグネチャと呼ばれます。
普遍代数では、これは、用語間に等式で定義された同値関係を導入することによってさらに洗練されます。
少し色褪せたように見えますが、これらの概念はかなり人気があり、20世紀後半にコンピュータサイエンスで多くの研究が行われました。オブジェクト指向プログラミングのnosクラス。
普遍代数はカテゴリー理論の発展に関係しており、カテゴリー理論は現在の型とプログラミング言語のビジョンの基礎でもあります。
代数は構文オブジェクトであり、型に対応するいくつかのセマンティックドメインでの解釈で使用することを目的としています。解釈とは、値(型)のドメインにソートをマッピングし、それらのドメイン間の関数に演算子をマッピングする準同型であるため、シグネチャが尊重され、方程式の場合は方程式も同様です。これは、グループ理論の結果を、グループの定義を尊重する操作で任意のドメインに適用する方法です。
この組織は、プログラミング言語の初期の研究者、特にプログラミング言語の形式化に関心のある研究者によって非常に便利であると考えられていました。構文と意味を分離し、数学的によく理解されているという利点がありました。
それを採用したもう1つの理由は、開発環境または正式なシステムのいずれかでプログラムのプロパティを証明するプログラムを操作するツールの開発に関する懸念でした(これはますます双子の問題であることが判明しました)。
これにより、プログラミング言語の抽象構文ツリー(AST)の概念が登場しました。これは、本質的にマルチソート代数の用語です(一部のシステムではソートユニオンを使用して改良される場合があります)。ASTは言語のリファレンス構文であり、セマンティクスは表記セマンティクスのように準同型によって定義できます。
これは、言語のセマンティクスを研究するのに便利なだけでなく、ツリーは文字列よりも構造が優れているため、プログラミングツールとプログラミング環境を開発するための優れた基盤となります。
構文解析技術の制限により、歪んだ文法の使用が余儀なくされたため、伝統的に厄介な部分であった構文解析を分離することができます。また、プレゼンテーションの問題も除外されます。
プログラムの複数の具体的な(文字列またはグラフィック)表現が可能で、便利な場合があります(プログラム構文でタブではなく句読点を使用したり、その逆を強制する必要がある理由はありません)。
プログラムの性質を抽象的な解釈で分析するために、プログラムやソートの多くの解釈を簡単に定義できます。
これは、自動プログラム変換や言語間の翻訳など、(半)自動プログラム操作ツールを書くのに便利です。
一部の形式の抽象構文では、一部の演算子が複数の種類に属するツリー(式)を構築できるため(非公式な方法でそれを見ることができるため)、物事は実際には少し複雑になる場合があります。たとえば、変数(割り当て可能なエンティティ)を表す構文構造のソートと、式のソートがあります。しかし、任意の変数を式として使用でき、その逆は偽です。
これに関する初期の論文は、プログラミング言語としては70年代半ばにさかのぼります。当時の概念化は、構文を意識した( "directed"という単語が使用された)プログラミング環境の作成を目的としています。ヨーロッパではメンターとケンタウロスを、アメリカではコーネルプログラムシンセサイザを探してください。それらは実際にそのような概念を実際に使用する最初の2つのシステムでした。他の多くはその後開発されました。
しかし、抽象構文はこれらのシステムよりも古いものです。Lisp言語(1958)は抽象的な構文を持っていましたが、これは論理学者によって開発されたため、プログラムを操作するプログラムを作成する目的のために驚くことではありません(MLとLCF ...も参照)。しかし、Lispはソートされていませんでした。すべてが構文的にリストであり、より洗練された構造は本質的にセマンティクスに依存していました。これにより、一部の人々は、Lispに構文がないと多少誤って考えるようになりました。
ソートは構文用、タイプはセマンティクス用であることが第4章に記載されています。
40ページの構文チャートの例は、言語L {num str}のソートを扱います。どうやらソートは言語の構文のカテゴリです。
特に、「プラス」にはソートがあり、これはその結果の構文カテゴリです。演算子「プラス」の一種は「Exp」と名付けられています。これは、構文上、演算子「プラス」の呼び出しが式であることを表しています。演算子「プラス」を呼び出すと、式が許可されている抽象構文ツリーの位置を埋めることができます。それが「プラス」の構成です。これが、プログラムを表すテキストの構造に適合する方法です。
41ページの型システムは、言語L {num str}の型を扱います。演算子のタイプが「num」の場合、演算子のタイプは「num」です。この判断は、演算子「プラス」のセマンティクスの部分的な説明です。つまり、演算子「プラス」の意味の一部は、2つの数値を組み合わせて数値を生成することです。この意味は、「プラス」を他の表現と区別します。
さらに、「num」と「str」の2つのタイプを含む「Typ」という名前のソートがあります。
第1章の初めに、ハーパーはsortという単語で彼が何を意味するかについてのヒントを与えています。
言語の構文は、さまざまな種類の句 (式、コマンド、宣言など)を組み合わせてプログラムを形成する方法を指定します。
彼は語句を抽象構文木として定義し、それを彼は次に議論します。