1)静的型付けと正式な文法との関係は、もしあれば、何ですか?
2)特に、線形有界オートマトンは、たとえばC ++またはSMLプログラムが適切に入力されたかどうかをチェックできますか?ネストされたスタックオートマトン?
3)静的型付け規則を正式な文法用語で表現する自然な方法はありますか?
1)静的型付けと正式な文法との関係は、もしあれば、何ですか?
2)特に、線形有界オートマトンは、たとえばC ++またはSMLプログラムが適切に入力されたかどうかをチェックできますか?ネストされたスタックオートマトン?
3)静的型付け規則を正式な文法用語で表現する自然な方法はありますか?
回答:
線形有界オートマトンがC ++プログラムをチェックすることはできません。また、LBAがSMLプログラムが適切に型付けされているかどうかをチェックすることはほとんどありません。C ++にはチューリング完全型システムがあります。これは、任意のプログラムをテンプレートメタプログラムとしてコーディングできるためです。
SMLはより興味深いものです。決定可能な型チェックがありますが、問題はEXPTIME完了です。したがって、複雑さの階層に非常に驚くべき崩壊がない限り、LBAがそれをチェックできる可能性は低いです。これは、SMLが型推論を必要とし、プログラムのサイズよりもはるかに速く型のサイズが大きくなるプログラムファミリがあるためです。例として、次のプログラムを検討してください。
fun delta x = (x, x) (* this has type 'a -> ('a * 'a), so its return value
has a type double the size of its argument *)
fun f1 x = delta (delta x) (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)
fun f3 x = f2 (f2 x) (* This function has a HUGE type *)
CやPascalなどの単純なタイプのシステムの場合、LBAでチェックできると考えています。
プログラミング言語の研究の初期の頃、人々は時々プログラミング言語の型システムを指定するためにvan Wingaarden文法(別名2レベルの文法)を使用していました。Algol 68はこのように指定されたと思います。しかし、このテクニックは本質的に実用的な理由で放棄されたと言われています。人々が指定したと思うものを指定した文法を書くことは非常に難しいことがわかりました!(通常、人々が書いた文法は、意図したよりも大きな言語を生成しました。)
最近では、図式推論ルールを使用して型システムを指定しています。これは、基本的に、述語をHorn句のコレクションの最小固定小数点として指定する方法です。一般に、一次ホルン理論の充足可能性は決定不能であるため、タイプ理論家が行うすべてをキャプチャしたい場合、選択する文法形式は本当に便利なものよりも強力になります。
属性文法を使用して型システムを実装する作業がいくつか行われたことを知っています。彼らは、この選択にはいくつかのソフトウェアエンジニアリングの利点があると主張しています。つまり、属性文法は情報の流れを非常に厳密に制御します。