1

私は、プログラミング言語が静的または動的に型付けされることが知られている、または静的に型付けされた言語と動的な言語、または動的に型付けされた言語と動的な言語の両方であると見なされるのはいつであるかという概念に頭を悩ませようとしています。

私が混乱しているのは、Java の場合、コンパイル時に変数の型が既知または定義されているときに、言語が静的に型付けされていることがわかっている場合です。

//Java illustration of statically typed  
int x, y; //explicit type declaration 
x = 5, y = 10; //Now we use the variables 

//Groovy illustration of statically typed 
def x, y //explicit type declaration 
x = 1, y = 10 //now we use the variables

さまざまなオンライン ソースを読むことに基づいて、静的に型付けされていると見なされる言語のリストには、Groovy は含まれていませんが、Java と C++ が含まれているとのことです。

また、Groovy が動的言語の場合 (DL の定義 - DL はコンパイル時にチェックをほとんどまたはまったく行わない言語であり、代わりに実行時にチェックが行われます)。これは、Groovy も動的型付け言語であることを意味するのではないでしょうか。変数が動的型付けと見なされるのは、「変数の型がコンパイル時ではなく実行時にわかっている場合」だからです。

//Illustration of a language being dynamically typed according to DT and DL definition
x = 5 //directly using the variable (exceptable in Python and PHP but not in Java/Groovy)

Groovy がそうである場合、Groovy が静的に型付けされている上記のコード図は、実行時にチェックが行われるという Groovy の定義と矛盾します。

これは、変数を直接使用するとJavaとgroovyの両方でコンパイラエラーがスローされるため、両方のJava groovyが動的型付け言語ではないことを意味しますか?

間違っている場合は修正してください。あなたの例をコードの図で提供してください。

4

3 に答える 3

1

これをコメントとして入れましたが、少し埋もれていました。

def DOES はタイプを指定します。「オブジェクト」のタイプを使用します。Java で定義されたすべての変数がオブジェクトとして定義されているかのようです (したがって、Groovy の def x=7 は Java の Object x=7 とまったく同じであり、多かれ少なかれ型付けされていません)。

これらのオブジェクトは、両方の言語で常に型情報を保持します。これらの 2 つも同等です。

グルーヴィー:
デフォルト x=5
アサート (x == 5)
x="おい、タイプ変えたぞ!"
assert(x == "おい、型を変えたぞ!")

ジャワ:
オブジェクト x=5
アサート (x == 5);
x="ねえ、私はちょっとタイプを変えました!"
assert(x.equals("ねえ、私はちょっとタイプを変えました!"))

大きな違いは、Java が (コンパイル時に) 持っていると思われるクラスの型でのみ既知のメソッドを呼び出すことを強制することです.. したがって、上記の例では、.toString() と .equals() が実際に唯一の有用なメソッドです。 . 数学を行うには、次のようにする必要があります。

オブジェクト x=5;
オブジェクト y=7;
オブジェクト z=(int)x + (int) y;
アサート (z == 12);  
// Integer z は自動的に回転すると思います
// ここでは int に変換しますが、これはコンパイルできない可能性があります :)

Groovy では、言語は単純にメソッドを呼び出そうとし、実行時に成功または失敗します。

これは、リフレクションを使用して Java でエミュレートすることができます。すべてを「オブジェクト」と入力し (groovy の「def」と同様)、リフレクション ユーティリティを記述して、次のようなことを行うことができます。

オブジェクト s="ねえ、ワサップ???";
オブジェクト s2=magic(s, "toLowerCase")
assert(s2.equals("ねえ、wassup???"));

Groovy は「魔法」を隠しているだけです。

したがって、一方が他方よりも本質的に動的であるとは言えないと思いますが、リフレクションを使用すると両方の言語が動的になると言うことができ、Groovy は Java よりも多くのリフレクションを使用すると言うこともできます...

于 2013-01-25T21:44:09.897 に答える
1

静的型付けと動的型付けは、主に変数(および関数の引数と戻り値) の型付け方法の説明です。多くの静的に型付けされた言語では、変数の型を宣言する必要があります。これにより、コンパイラはどの操作が有効で、関数/演算子のどのオーバーロードされたバージョンを使用する必要があるかを認識できます。最近のいくつかの静的型付け言語 (ほとんどの関数型言語を含む) には型推論があるため、ほとんどの場合、変数の型を宣言する必要はありません。ただし、変数には固定型が必要です。異なる型の値を同じ変数に割り当てると、コンパイラはコンパイルを拒否するか、すべてに共通の操作のみを許可します。厳密に型指定された言語では、型に関連する実行時エラーが発生することはありません。

動的型付け言語では、変数は単なる名前です。任意のタイプの値を任意の変数に割り当てることができ、別のタイプの値を割り当てることでタイプを変更できます。関数呼び出しまたは変数に対する操作の有効性は、ステートメントの実行時にのみチェックできます。(これは、Java のすべての変数を Object として宣言し、使用時に目的の型にキャストすることと考えることができます。もちろん、コンパイラはキャストが成功するかどうかを判断しようとせず、実行時に失敗する可能性のあるキャスト チェックを挿入します。時間。)

一般に、動的言語とは、コンパイラーによってチェックされるほとんどのものを緩和することを意味します (事前にチェックされるのはおそらく構文だけです)。これは通常、必要になるまで変数の存在や関数呼び出しの有効性さえ検証されないことを意味します。静的型付けは緩和に反するため、通常は動的型付けを使用します。

于 2013-01-24T21:17:29.593 に答える
0

Java では、変数の完全な型を伝える必要があることに注意してください。あなたの例では「int」。「float」、「Map」、または「MyClassWithALongName」と言うことができます。

Groovy では、変数があることを示すために「def」とだけ言いましたが、コンテンツ タイプについては何も言いませんでした。

于 2013-01-24T20:35:54.843 に答える