型システムの分類(強い/弱い、動的/静的)


23

要するに、型システムは学術的文脈でどのように分類されるのか。特に、異なる種類の型システム間の区別を明確にする信頼できるソースをどこで見つけることができますか?

ある意味で、この質問の難しさは、答えを見つけることができないということではなく、むしろあまりにも多く見つけることができ、どれも正しいと際立っていないことです。背景は、Haskell wikiのタイピングに関する記事を改善しようとしていることです。現在、次の区別を主張しています:

  • 型なし:言語には型の概念がない、または型付きの観点から:言語には型が1つだけあります。アセンブリ言語のタイプは「ビットパターン」のみ、RexxとTkのタイプは「テキスト」のみ、コアMatLabのタイプは「複素数値行列」のみです。
  • 弱い型付け:識別型はほとんどなく、いくつかの型の同義語もあります。たとえば、Cはブール値、整数、文字、ビットセット、および列挙に整数を使用します。
  • 強い型付け:Ada、Wirthian言語(Pascal、Modula-2)、Eiffelのようなきめ細かい型のセット

これは、私の個人的な認識とはまったく反対です。

  • 弱い型付け:オブジェクトには型がありますが、コンテキストが要求すると、暗黙的に他の型に変換されます。たとえば、Perl、PHP、およびJavaScriptはすべて、"1"、多かれ少なかれ可能なコンテキストで使用できる1です。
  • 強い型付け:オブジェクトには型があり、暗黙的な変換はありません(ただし、シミュレートするためにオーバーロードが使用される場合があります)ので、間違ったコンテキストでオブジェクトを使用するとエラーになります。Pythonでは、文字列または浮動小数点で配列のインデックスを作成すると、TypeError例外がスローされます。Haskellでは、コンパイル時に失敗します。

私は、私よりもこの分野で経験のある他の人々にこのことについて意見を求めました。

  • 弱いタイピング:データに対する無効な操作の実行は制御または拒否されませんが、無効/任意の結果を生成するだけです。
  • 厳密な型指定:データの操作は、データが操作と互換性がある場合にのみ許可されます。

私が理解するように、最初と最後の特性化はCを弱く型付けし、2番目はCを強く型付けしたと呼びます。最初と2番目は弱い型のPerlとPHPを呼び出し、3番目は強い型のPerlとPHPを呼び出します。3つすべてがPythonを厳密に型指定されていると説明します。

ほとんどの人は「まあ、コンセンサスはなく、用語の受け入れられた意味はない」と言うだろうと思う。それらの人々が間違っている場合、私はそれについて聞いてうれしいですが、彼らが正しい場合、どのように CSの研究者が説明し、タイプのシステムを比較しますか?問題の少ない用語を使用できますか?

関連する質問として、私は動的/静的な区別が「コンパイル時間」と「実行時間」の観点からしばしば与えられると感じます。言語がコンパイルされるかどうかはその言語の特性ではないので不満足だと思いますその実装として。動的タイピングと静的タイピングの純粋に意味論的な記述があるべきだと思います。「静的言語とは、すべての部分式を入力できるもの」の行に沿ったものです。この概念を明確にする考え、特に参考文献をいただければ幸いです。


6
あなたはすでに答えを持っていると思います:弱いタイピングと強いタイピングの受け入れられた定義はありません。
svick

信じるのはそれほど難しいとは思いませんが、聞いたことのないものがあることを期待して質問します:または、少なくともwikiを編集した人よりも権威のある定義が当てはまります。
ベンミルウッド

3
これについてのさらなる議論については、SOに関するこの関連する質問を参照してください。
svick

1
svickの主張を補強するために、受け入れられていないものに関する権限の参照を見つけることはできません。信頼できると主張するものはすべて間違っています(反例はいくつでも提供できるため)。
edA-qa mort-ora-y

まあ、「誰もが同意する唯一の真の定義」という論文を書く人と、「この論文に使用する定義はここにある」と言う論文を書く人との間には違いがあります。他」。後者でさえ、私がこれまでに知っているものよりも良いでしょう。あなたは正しいかもしれませんが、その場合、人々はさまざまな種類の型システムについて何を言わなければなりませんか?動的/静的の区別は、少なくとも具体的ですか?
ベンミルウッド

回答:


18

歴史的に、「強く型付けされたプログラミング言語」という用語は、ほとんどが型穴のある既存の広く使用されているプログラミング言語に反応して、70年代に使用されるようになりました。いくつかの例:

  • Fortranには、「COMMON」ストレージエリアと呼ばれるものがあり、モジュール間で共有できましたが、各モジュールが同じタイプのCOMMONストレージの内容を宣言しているかどうかを確認するチェックはありませんでした。そのため、あるモジュールは特定のCOMMONストレージブロックに整数があり、別のモジュールには浮動小数点数があり、その結果データが破損することを宣言できます。Fortranには「EQUIVALENCE」ステートメントもあり、これにより、同じストレージに異なるタイプの2つの異なるオブジェクトを含めるように宣言できます。

  • Algol 60では、プロシージャのパラメータのタイプは、プロシージャのパラメータのタイプを指定せずに、単に「プロシージャ」として宣言されていました。そのため、手続きパラメーターは整数を受け入れる手続きであると仮定することができますが、引数として実際に受け入れる手続きを渡します。これにより、COMMONおよびEQUIVALENCEステートメントと同じ種類の破損が発生します。(ただし、Algol 60は古い問題を排除しました。)

  • Pascalでは、「バリアントレコード」が追加されました。これは、古いEQUIVALENCEステートメントとほぼ同じでした。

  • Cでは、「型キャスト」が追加され、任意のタイプのデータを異なるタイプのデータとして再解釈できるようになりました。これは、自分が何をしているのかを知っていると思われるプログラマ向けの、かなり意図的なタイプホールでした。

70年代に設計された強く型付けされた言語は、そのような型の穴をすべて排除することを目的としていました。これが意味するものを掘り下げると、本質的にはデータ表現が保護されることを意味します。あるタイプのデータオブジェクトを、たまたまその内部表現と同じビットパターンを持つ別のタイプのオブジェクトとして表示することはできません。理論家は、「強いタイピング」という曖昧な考えの代わりに、「表現の独立性」という用語を使用してこの特性を特徴付け始めました。

完全な実行時型チェックを実行するLispのような動的型付け言語は、表現を保護するという意味で「強く型付けされている」ことに注意してください。同時に、静的に型指定された言語は、配列の境界チェックを行わない限り、表現の独立性を失います。そのため、厳密な意味での「強く型付けされた」ものではありません。これらの異常な結果のために、「強く型付けされた」という用語は70年代以降使用されなくなりました。米国国防総省がAdaの設計のための厳しい要件を作成したとき、言語を「強く型付けする」という要件が含まれていました。(当時、「強く型付けされた」という考えは自明であると信じられていたようです。定義はありませんでした。)回答として提出されたすべての言語提案は、「強くタイプされた」と主張しました。ダイクストラがすべての言語提案を分析したとき、彼はそれらのどれも強く型付けされていないことを発見し、実際、その用語の意味すら明確ではありませんでした。レポートを見るEWD663。しかし、この用語の市松模様の歴史を知らない若い世代の研究者を通じて、この用語が現在使用されていることがわかります。

「静的型付け」という用語は、すべての型チェックが静的に行われ、実行時に型エラーが発生しないことを意味します。言語が強く型付けされている場合、それは実行中に型エラーが実際にないことを意味します。一方、型システムに型の穴がある場合、実行時の型エラーがないという意味はありません。結果は完全に破損する可能性があります。

「強いタイピングと弱いタイピング」に関する新しい議論は、特定のタイプ変換を許可するかどうかに関するもののようです。これらの人々によると、整数が必要な文字列を許可することは「弱いタイピング」です。文字列が整数を表していない場合、文字列を整数に変換しようとすると失敗する可能性があるため、ある程度の意味があります。ただし、整数を文字列に変換することにはその問題はありません。これらの人々によると、それは「弱いタイピング」のインスタンスでしょうか?何も思いつきません。「弱いタイピング」に関するウィキペディアの議論は、参考文献を引用していません。私はそれが首尾一貫した考えだとは思わない。

追加された注:基本的なポイントは、「厳密な型指定」という用語は厳密な定義の技術用語として使用されなかったことです。一部の言語設計者は、「型システムは強力で、すべての型エラーをキャッチし、型の穴がない」と感じていたため、言語設計を公開したときに「強く型付けされた」と主張しました。 。よく聞こえる話題の言葉で、人々はそれを使い始めました。Cardelli-Wegnerの論文は、それが何を意味するのかについての分析が提供された最初の論文でした。ここでの私の投稿は、彼らの立場の詳細と考えるべきです。


歴史的発展についての参考文献を教えてください。「ランタイム型エラーがないことは何も意味しません」-ここでコンパイル時を意味しますか?
ラファエル

Google Scholarに掲載されたEuclidの論文を次に示します。言語が強く型付けされていると主張されていた70年代にいくつかの論文を見たことを覚えています。それは一般にセールスピッチと考えられていました。
ウダイレディ

1
@ラファエル。「ランタイム型エラー」という意味でした。実行時を取得するには、プログラムは最初に静的型チェッカーを通過する必要があります。ポイントは、Javaなどの厳密に型指定された言語は、コンパイル時にチェックできないときに実行時に型エラーを発生させることです。タイプホール言語(Cなど)を使用すると、エラーが発生する代わりにランタイムでガベージが生成されます。
Uday Reddy

1
@benmachine。引用したユークリッドの論文の「型チェック」のセクションを参照してください。主なポイントは、「強く型付けされた」という言葉が流行語だということです。これは技術的な概念ではありません。せいぜい、それの技術的な内容は、タイプホールがないことを意味することです。
ウダイレディ

1
2つの異なる整数型が同じ表現(たとえば、両方intlong32ビット、または両方longlong long64)を持つ典型的な最新の実装では、そのような型へのポインターを使用してストレージを書き込み、他の型のポインターを使用するプログラム通常、検出可能な実行時エラーをトリガーしませんが、他の任意の方法で任意に誤動作する可能性があります。以前は引き換えに提供されていました
supercat

7

Uday Reddyの回答「タイプの理解、データの抽象化、および多態性について」(1985年)で見つかった論文は、次の回答を提供します。

静的プログラム分析によってすべての式のタイプを判別できるプログラミング言語は、静的に型付けされていると言われています。静的型付けは便利なプロパティですが、すべての変数と式がコンパイル時に型にバインドされるという要件は、制限が厳しすぎる場合があります。型自体は静的に不明である可能性がありますが、すべての式に型の一貫性が保証されるという弱い要件に置き換えることができます。これは一般に、実行時の型チェックを導入することで実行できます。すべての式の型が一貫している言語は、厳密に型指定された言語と呼ばれます。言語が強く型付けされている場合、そのコンパイラーは、受け入れたプログラムが型エラーなしで実行されることを保証できます。一般に、強力な型指定に努め、可能な限り静的型付けを採用する必要があります。


私はこれを見つけるための信用に値しないので、コミュニティwikiとして投稿しました。
ベンミルウッド

ここにある問題は、svickの最初のコメントに関連しています。強い型付けの定義を見つけたのはいいことかもしれませんが、これは一般的に受け入れられている定義ではありません。
edA-qa mort-ora-y

@ edA-qamort-ora-y:どのような根拠でそれを言いますか?一般的に受け入れられているものと受け入れられていないものについて、事例証拠よりも優れたものがありますか?引用はありますか?(そうでないとしても、あなたは有効なポイントを持っているかもしれませんが、上記は私の質問に答えていると思います。コンセンサスがなくても、深刻な学術的答えの少なくとも1つを知っているのは良いことです)。
ベンミルウッド

1
合意された定義がないことを本当に証明することはできませんか?論理的には不可能です。ただし、ウィキペディアのストロングタイピングに関する記事では、意見の相違や矛盾について多くの証拠と参考文献が提供されています。en.wikipedia.org/wiki/Strong_typing
edA-qa mort-ora-y

@ edA-qamort-ora-y:ウィキペディアの引用は実際にはそれほど役に立ちません。一部は学術的ではなく、他は用語の定義以外の理由で引用されています。Typeful Programmingペーパーは有望なように見えますが、ごく簡単に定義について言及しています。とにかく私の答えを編集する価値があるでしょう。欠席の証拠に関しては、自分が話していることを知っている人々の間で論争/不一致の証拠があれば十分だと思います(実際、Typeful Programmingの論文が私に与えるかもしれません)。
ベンミルウッド

6

信頼できる答えは、CardelliとWegnerの調査記事「型の理解、データの抽象化、および多態性」に記載されています。

「強いタイピング」には意味がありますが、「弱いタイピング」にはないということに注意してください。強い型付けの失敗は弱いとみなされる可能性があり、人々はどのような種類の失敗が許容できるのか、そうでないのかによって異なる場合があります。



素晴らしい、それはまさに私が欲しかったことです。論文は少し読んでいるので、顕著な点を要約する答えがあるべきだと思います。あなたの回答にそれらを編集するか、自分のコミュニティwikiの回答を投稿する必要がありますか?いずれにせよ、他の誰かが何か入力をした場合に備えて、あと数日を与え、残っているものは何でも受け入れます:)
ベンミルウッド

@benmachine。論文全体を読む価値は十分にありますが、高レベルの概念的な問題については、最初の数セクションで説明します。
Uday Reddy

4
私はまだこのページに要約すべきだと思います。リンクは後で期限切れになる可能性があります。
ベンミルウッド

@benmachine。あなたの質問に対するあなた自身の答えとして要約を投稿することを歓迎します。
Uday Reddy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.