タグ付けされた質問 「type」

6
コンパイラが「複雑な」式を静的に型チェックするときに使用される一般的な手順は何ですか?
注:タイトルで「複雑」を使用したとき、式には多くの演算子とオペランドがあることを意味します。式自体が複雑なわけではありません。 私は最近、x86-64アセンブリの単純なコンパイラに取り組んでいます。コンパイラのメインフロントエンド(レクサーとパーサー)を終了し、プログラムの抽象構文ツリー表現を生成できるようになりました。そして、私の言語は静的に型付けされるので、次のフェーズ、つまりソースコードの型チェックを実行しています。しかし、私は問題に遭遇し、自分で合理的に解決することができませんでした。 次の例を考えてみましょう。 私のコンパイラのパーサーは、次のコード行を読み取りました。 int a = 1 + 2 - 3 * 4 - 5 そして、それを次のASTに変換しました: = / \ a(int) \ - / \ - 5 / \ + * / \ / \ 1 2 3 4 次に、ASTを入力する必要があります。最初に=演算子をチェックするタイプから始まります。まず、オペレーターの左側をチェックします。変数aが整数として宣言されていることがわかります。そのため、右側の式が整数に評価されることを確認する必要があります。 式が1or などの単一の値である場合、これがどのように行われるかを理解しています'a'。しかし、複数の値とオペランドを持つ式 -上記のような複雑な式 -では、これはどのように行われますか?式の値を正しく判断するには、型チェッカーが実際に式自体を実行し、結果を記録する必要があるようです。しかし、これは明らかにコンパイル段階と実行段階を分離する目的を無効にしているようです。 私がこれを行うことができると思う他の唯一の方法は、ASTの各部分式のリーフを再帰的にチェックし、リーフのすべてのタイプが期待される演算子タイプと一致することを確認することです。そのため、=演算子から始めて、型チェッカーは左側のすべてのASTをスキャンし、リーフがすべて整数であることを確認します。次に、部分式の各演算子に対してこれを繰り返します。 「The Dragon Book」のコピーでトピックを調査しようとしましたが、あまり詳細に説明されていないようで、すでに知っていることを繰り返します。 コンパイラが多くの演算子とオペランドを含む式を型チェックするときに使用される通常の方法は何ですか?上記の方法のいずれかが使用されていますか?そうでない場合、メソッドは何であり、どのように正確に機能しますか?

4
「オブジェクトコンストラクター」は「名前が「object」の関数で、タイプが「object」を返す」の短い名前ですか?
つまり、関数とコンストラクタの呼び出しに違いがある以上に、単語を選択するということです。「オブジェクトのコンストラクタ」という名前のオブジェクトは、「名前をobject返す型を持つ関数」という名前でもかまいませんobject。 C ++では同じ関数と型名を使用できないと主張する人もいます。ただし、そのための回避策があります。C ++には特別な構文糖(コンストラクターと呼ばれます)があり、これを使用してobjecttypeを返す名前の関数を作成できますobject。ですから、コンストラクタは自立関数として見られ、使用できると思います。 ここに欠けている重要な意味上の違いはありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.