2

次の 2 つの定義のうち、正しいのはどれですか?

  • 静的型付け- 型の一致はコンパイル時にチェックされます (したがって、コンパイルされた言語にのみ適用できます)。
  • 動的型付け- 型の一致は実行時にチェックされるか、まったくチェックされません。(この用語は、コンパイルされた言語または解釈された言語に適用できます)

  • 静的型付け- 型は変数に割り当てられるため、 「x は int 型です」と言えます。
  • 動的に型付けされる - 型は値に割り当てられる (存在する場合) ため、 「x は int を保持している」と言えます。

この定義により、静的型付けまたは動的型付けは、コンパイル済み言語またはインタープリター型言語に関連付けられていません。

どちらが正しいですか、それともどちらも正しくありませんか?

4

4 に答える 4

4

どちらが正しいですか、それともどちらも正しくありませんか?

最初の定義のペアはより近いですが、完全に正しくはありません。

静的型付け- 型の一致はコンパイル時にチェックされます (したがって、コンパイルされた言語にのみ適用できます)。

これはトリッキーです。言語が解釈されたが、実行が開始される前に型チェックを行った場合でも、静的に型付けされると思います。OCaml REPL は、技術的にソースコードを独自のバイトコードにコンパイル (および型チェック) し、バイトコードを解釈することを除いて、ほぼこの例です。

動的型付け- 型の一致は実行時にチェックされるか、まったくチェックされません。

それよりも:

動的型付け- 型チェックは実行時に行われます。

型なし- 型チェックは行われません。

静的型付け- 型は変数に割り当てられるため、「x は int 型です」と言えます。

動的に型付けされる - 型は値に割り当てられる (存在する場合) ため、「x は int を保持している」と言えます。

変数は無関係です。多くの静的に型付けされた言語のソース コードでは、変数と関数の定義で型が明示的にしか表示されませんが、すべての部分式にも静的型があります。たとえば"foo" + 3、文字列を int に追加することはできませんが、関連する変数がないため、通常は静的型エラーです。

于 2013-03-18T22:01:06.533 に答える
2

静的という言葉を理解するのに役立つ 1 つの方法は次のとおりです。静的プロパティとは、可能なすべての入力に対するプログラムのすべての可能な実行を保持するものです。次に、特定の言語または型システムを調べて、どの静的プロパティを検証できるかを検討できます。次に例を示します。

  • JavaScript: セグメンテーション違反/メモリ エラーなし

  • Java/C#/F#: プログラムがコンパイルされ、変数の型が T の場合、変数はすべての実行でこの型の値のみを保持します。しかし、悲しいことに、参照型もnull値として認めています - 10 億ドルの間違いです。

  • ML には がなくnull、上記の保証がより強力になります

  • Haskell は、副作用に関するステートメントを検証できます。たとえば、「このプログラムは stdout に何も出力しません」などのプロパティです。

  • Coqは終了も検証します-「このプログラムはすべての入力で終了します」

どれだけ確認したいか、これは好みと目前の問題によって異なります。すべての魔法 (検証) には代償が伴います。

ML を見たことがない場合は、ぜひお試しください。Yaron Minsky の講演に少なくとも 5 分間注意を払ってください。プログラマーとしての人生を変えることができます。

于 2013-03-21T01:27:44.450 に答える
1

2 番目は、なぜ、またはどのように機能するかについての説明を探していないと仮定すると、私の目にはより良い定義です。

もう一度言ったほうがいい

  • 静的型付けは変数に変更できない EXPLICIT 型を与えます
  • 動的型付けは変数に変更可能な IMPLICIT 型を与えます
于 2012-07-12T07:47:42.680 に答える
0

私は後者の定義が好きです。最初の定義ではなく 2 番目の定義に適合する Java や C++ などのオブジェクト指向言語で、基底クラスから派生クラスにキャストする場合の型チェックを検討してください。これは、(オプションの) 動的型チェックを備えたコンパイル済み言語です。

于 2012-07-12T07:53:27.213 に答える