2016-10-25 6 views
0

ここではthis質問を見ましたが、私が特に気にしていたことには答えません。 GoやC++ 11などの言語でDamas-Milnerのような推論アルゴリズムを使用していない場合、正確にはどうしますか?C++ 11やGoのような言語で型推論がどのように実装されていますか?

5 + 3.4 

どのようにコンパイラがどのようなタイプを解読します:私はそれが何のようなものを持っていた場合ので、右側のタイプを取るのと同じくらい簡単だと思いませんか?

if left is integer and right is float: 
    return float; 
if left is float and right is integer: 
    return float; 
etc... for every possible pattern 

ように単純ではありません任意のアルゴリズムがありますそして、あなたは簡単な言葉で物事を説明することができればそれは素晴らしいことです。私は、コンパイラの構築や理論的な話題について詳しくは学んでいませんし、実際には関数型言語や複雑な数学的表記法を話さないのです。

+0

これはもっと似ています:* "左は整数、右は浮動小数点、左に浮動小数点を変換し、2つの浮動小数点数を加算する" *。式の各2項演算子の変換が(必要に応じて)実行され、結果は式の中で最も高い順位の型になります。 – user3386109

答えて

4

私はそれが形auto var = some_expression;の基本的な型推論のために右側

上のタイプを取るのと同じくらい簡単だとは思わない、それはまさにそれは簡単です。完全に型指定された式はすべて1つの型を持ち、その型はvarの型になります。式の型から別の型への暗黙的な変換はありません(varの明示的な型を指定した場合のように)。

5 + 3.4 

質問は "5 + 3.4の種類は何ですか?":あなたはのようなものを持っていた場合はどのような

型推論に固有のものではなく、型推論が導入される前であっても、C++コンパイラは常にこの質問に答える必要がありました。

まずそれがsome_expressionの種類を決定します。

それでは、バックステップを取ると、C++コンパイラは声明some_type var = some_expression;をtypechecks方法を見てみましょう。コード内ではType exp_type = type_of(exp);のようなものを想像することができます。今度は、exp_typesome_typeと等しいかどうか、またはexp_typeからsome_typeへの暗黙の変換が存在するかどうかを確認します。その場合は、ステートメントの型が整えられ、varがタイプsome_typeとして環境に導入されます。それ以外の場合はそうではありません。今

我々は型推論を導入し、そのように、方程式の変更をauto var = some_expression;を書く:我々はまだType exp_type = type_of(exp);を行うが、その代わりに、別のタイプと比較するか、いずれかの暗黙的な変換を適用するので、私たちが代わりに単にvarの種類としてexp_type設定。

これで5 + 3.4に戻りましょう。その型は何ですか?そしてコンパイラはそれをどのように決定しますか? C++ではその型はdoubleです。算術式の型を決定するための規則は、C++標準にリストされています(通常の算術変換を探しますが、基本的には以下のようになります:2つのオペランド型のうち、より大きな値の範囲を表すものを選択します)。型がintより小さい場合は、両方のオペランドをintに変換します。そうでない場合は、両方のオペランドを選択した型に変換します。

のコードでは、各数値型に変換順位を割り当て、その後、このような何かをすることによってこれを実装したい:

Type type_of_binary_arithmetic_expression(Type lhs_type, Type rhs_type) { 
    int lhs_rank = conversion_rank(lhs_type); 
    int rhs_rank = conversion_rank(rhs_type); 
    if(lhs_rank < INT_RANK && rhs_rank < INT_RANK) return INT_TYPE; 
    else if(lhs_rank < rhs_rank) return rhs_type; 
    else return lhs_type; 
} 

おそらく行くためのルールは多少異なりますが、同じ原則が適用されます。

関連する問題