質問

また、一方はもう一方を意味しますか?

役に立ちましたか?

解決

強くタイプされた言語と静的にタイプされた言語の違いは何ですか?

静的にタイプされた言語には、実装(コンパイラまたはインタープリター)によってコンパイル時にチェックされるタイプシステムがあります。タイプチェックはいくつかのプログラムを拒否し、チェックに合格するプログラムには通常、いくつかの保証が付いています。たとえば、コンパイラは、浮動小数点数に整数算術命令を使用しないことを保証します。

「強く入力された」という意味についての本当の合意はありませんが、専門文献で最も広く使用されている定義は、「強くタイプされた」言語では、プログラマーがタイプシステムによって課される制限を回避することは不可能であるということです。 。この用語は、ほとんどの場合、静的にタイプされた言語を記述するために使用されます。

静的対動的

静的に入力された反対は「動的に型付けされた」です。

  1. 実行時に使用される値は、タイプに分類されます。
  2. そのような値をどのように使用できるかには制限があります。
  3. これらの制限が違反されると、違反は(動的)タイプのエラーとして報告されます。

例えば、 ルア, 、動的に型付けされた言語には、文字列タイプ、数字タイプ、ブール型などがあります。 Luaでは、すべての値が属します まさに 1つのタイプですが、これはすべての動的にタイプされた言語の要件ではありません。 Luaでは、2つの文字列を連結することは許可されていますが、文字列とブールを連結することは許可されていません。

強い対弱

「強く入力された」の反対は「弱く入力された」です。つまり、タイプシステムを回避できます。 cは、キャストによって他のポインタータイプに変換可能であるため、Castingのタイプに変換可能であるため、Cは弱くタイプされています。 Pascalは強く入力されることを目的としていましたが、設計(Untagged Variant Records)の監視により、タイプシステムに抜け穴が導入されたため、技術的には弱く入力されます。本当に強くタイプされた言語の例には、CLU、標準ML、およびHaskellが含まれます。標準MLは、実際には、言語が広く展開された後に発見されたタイプシステムの抜け穴を削除するためのいくつかの改訂を行っています。

ここで何が起こっているのですか?

全体として、「強い」と「弱い」について話すことはそれほど有用ではないことが判明しました。タイプシステムが抜け穴を持っているかどうかは、抜け穴の正確な数と性質よりも重要ではないか、実際に登場する可能性、そして抜け穴を悪用する結果は何ですか。実際には、 「強い」および「弱い」という用語を完全に回避するのが最善です, 、 なぜなら

  • アマチュアは、しばしばそれらを「静的」および「動的」と混同します。

  • どうやら「弱いタイピング」は、一部の人が、暗黙の変換の相対的な普及または不在について話すために使用されているようです。

  • 専門家は、用語の意味に正確に同意することはできません。

  • 全体的に、あなたはあなたの聴衆に知らせたり啓発したりすることはほとんどありません。

悲しい真実は、タイプシステムに関しては、 「強い」と「弱い」は、技術的な意味について普遍的に合意されていません。 タイプシステムの相対的な強さについて話し合いたい場合は、保証が何であり、提供されていないものを正確に議論することをお勧めします。たとえば、これは次のとおりです。「特定のタイプ(またはクラス)のすべての値は、そのタイプのコンストラクターの1つを呼び出すことによって作成されたことが保証されていますか?」 Cでは、答えはノーです。 CLU、F#、およびHaskellでは、はいです。 C ++の場合、私はよくわかりません - 私は知りたいです。

対照的に、 静的タイピング プログラムがそうであることを意味します 実行される前にチェックされます, 、そして、プログラムが開始する前に拒否される可能性があります。 動的タイピング タイプのことを意味します チェックされます その間 実行されていない操作が不十分な操作により、プログラムが停止したり、実行時にエラーが発生したりする可能性があります。静的タイピングの主な理由は、そのような「動的なタイプエラー」があるかもしれないプログラムを除外することです。

一方はもう一方を意味しますか?

「強い」という言葉は本当に何も意味しないからです。しかし、実際には、人々はほとんど常に2つのことのいずれかをします。

  • 彼らは(誤って)「強い」と「弱い」を使用して「静的」と「動的」を意味します。

  • 彼らは「強い」と「弱い」を使用して、静的型システムのプロパティを比較します。誰かが「強い」または「弱い」動的タイプシステムについて話すのを聞くことは非常にまれです。実際にはタイプシステムの種類がないフォースを除いて、タイプシステムを破壊できる動的に型付けされた言語を考えることはできません。定義上、これらのチェックは実行エンジンに埋め込まれ、すべての操作が実行される前に正気をチェックされます。

いずれにせよ、人が言語を「強くタイプした」と呼ぶ場合、その人は静的にタイプされた言語について話している可能性が非常に高いです。

他のヒント

これはしばしば誤解されているので、私にそれをクリアさせてください。

静的/動的タイピング

静的タイピング このタイプがバインドされている場所です 変数. 。タイプはコンパイル時にチェックされます。

動的タイピング このタイプがバインドされている場所です 価値. 。タイプは実行時にチェックされます。

したがって、たとえばJavaで:

String s = "abcd";

s 「永遠」はaになります String. 。その人生の間、それは異なることを指し示すかもしれません Strings(から s Javaの参照です)。それは持っているかもしれません null 値ですが、それは決して参照しません Integer またはa List. 。それは静的なタイピングです。

PHPで:

$s = "abcd";          // $s is a string
$s = 123;             // $s is now an integer
$s = array(1, 2, 3);  // $s is now an array
$s = new DOMDocument; // $s is an instance of the DOMDocument class

それは動的なタイピングです。

強い/弱いタイピング

(アラートを編集!)

強いタイピング 意味に広く合意されていないフレーズです。この用語を使用して静的タイピング以外の何かを意味するほとんどのプログラマーは、それを使用して、コンパイラによって施行されるタイプの規律があることを暗示しています。たとえば、CLUには、タイプによって提供されるコンストラクターを使用しても、クライアントコードが抽象型の値を作成できない強力なタイプシステムがあります。 Cにはやや強いタイプシステムがありますが、プログラムは常に1つのポインタータイプの値を別のポインタータイプの値にキャストできるため、ある程度「破壊」できます。たとえば、Cでは、によって返される値を取ることができます malloc() そして元気にキャストします FILE*, 、そして、コンパイラーはあなたを止めようとはしません。または、あなたが危険なことをしていることを警告します。

(元の答えは、「実行時にタイプを変更しない」という価値について何かを述べました。私は多くの言語デザイナーやコンパイラライターを知っており、実行時にバリューを変えるタイプについて話していることを知りませんでした。システム、これは「強力な更新問題」として知られています。)

弱いタイピング コンパイラがタイピングの開示を強制しないこと、またはおそらく執行を簡単に破壊することができることを意味します。

この答えのオリジナルは、弱いタイピングを混同しました 暗黙的な変換 (「暗黙的なプロモーション」とも呼ばれることもあります)。たとえば、Javaで:

String s = "abc" + 123; // "abc123";

これはコードが暗黙のプロモーションの例です。123は、連結する前に暗黙的に文字列に変換されます "abc". 。 Javaコンパイラは、そのコードを次のように書き換えます。

String s = "abc" + new Integer(123).toString();

「問題から始まる」という古典的なPHPを考えてみましょう:

if (strpos('abcdef', 'abc') == false) {
  // not found
}

ここでのエラーはそれです strpos() 一致のインデックスを返し、0です。0はブール値に強制されます false したがって、条件は実際に真実です。解決策は使用することです === それ以外の == 暗黙の変換を避けるため。

この例は、暗黙的な変換と動的なタイピングの組み合わせがプログラマーを惑わせる方法を示しています。

それをRubyと比較してください:

val = "abc" + 123

Rubyでは、ランタイムエラーです 物体 123は いいえ それがたまたまに渡されるという理由だけで暗黙的に変換されます + 方法。 Rubyでは、プログラマーは変換を明示的にする必要があります。

val = "abc" + 123.to_s

PHPとRubyを比較することは、ここで良い例です。どちらも動的にタイプされた言語ですが、PHPには多くの暗黙的な変換とRubyがあります(おそらく驚くべきことに、あなたがそれに慣れていないなら)そうではありません。

静的/動的と強い/弱い

ここでのポイントは、静的/動的軸は強い/弱い軸に依存しないということです。強いタイピングと弱いタイピングがあまり明確に定義されていないだけでなく、強力で弱いことを意味することについての本当のコンセンサスはないため、おそらくそれらを混乱させるでしょう。このため、強い/弱いタイピングは、黒や白ではなく、はるかに灰色の色合いです。

だからあなたの質問に答えるために:これを見る別の方法 多くの場合 正しいのは、静的タイピングがコンパイル時間タイプの安全性であり、強力なタイピングはランタイムタイプの安全性であると言うことです。

この理由は、静的に型付けされた言語の変数には、宣言する必要があり、コンパイル時にチェックできるタイプがあるためです。強くタイプの言語には、実行時にタイプを持つ値があり、プログラマーが動的チェックなしでタイプシステムを覆すことは困難です。

しかし、言語は静的/強い、静的/弱い、動的/強いまたは動的/弱いことを理解することが重要です。

どちらも2つの異なる軸上の極です。

  • 強いタイプと弱いタイプ
  • 静的に型付けされたものと動的に型付けされています

強く入力されました つまり、Aはあるタイプから別のタイプに自動的に変換されません。弱く入力されたのは反対です:perlは次のような文字列を使用できます "123" 数値のコンテキストでは、それを自動的にintに変換することにより 123. 。 A strongly typed language like python will not do this.

静的に入力されました つまり、コンパイラはコンパイル時に各変数のタイプを把握します。動的にタイプされた言語は、実行時に変数の種類のみを把握します。

強く入力されたことは、タイプ間の変換の間に制限があることを意味します。静的にタイプされたことは、タイプが動的ではないことを意味します - 作成されたら、変数のタイプを変更することはできません。

データの強制は、その構文砂糖の場合があるため、必ずしも弱くタイプされることを意味するわけではありません。

Javaの上記の例は、

String s = "abc" + 123;

実際に行っているため、型と入力された例ではありません。

String s = "abc" + new Integer(123).toString()

また、新しいオブジェクトを構築している場合、データ強制は弱く入力されません。 Javaは、弱くタイプされた非常に悪い例です(そして、良い反射を持つ言語は、おそらく弱くタイプされないでしょう)。言語のランタイムは常にタイプが何であるかを常に知っているためです(例外はネイティブタイプかもしれません)。

これは、Cとは異なります。Cは、弱く入力された最良の例の1つです。ランタイムには、4バイトが整数、構造体、ポインター、または4文字であるかどうかはわかりません。

言語のランタイムは、それ以外の場合、それが本当に単なる意見であるかどうかを本当に定義しています。

編集:さらに考えた後、これは必ずしも真実ではありません。ランタイムは、ランタイムシステムのすべてのタイプを強くタイプされたシステムにする必要がないためです。 HaskellとMLには、ランタイムからのOMMITタイプ情報の可能性があるような完全な静的分析があります。

一方はもう一方を意味しません。言語のために 静的に 入力すると、すべての変数のタイプがコンパイル時に既知または推測されることを意味します。

a 強く タイプされた言語では、1つのタイプを別のタイプとして使用することはできません。 cは型刻印された言語であり、強くタイプされた言語が許可されていないものの良い例です。 Cでは、間違ったタイプのデータ要素を渡すことができ、文句を言うことはありません。強くタイプされた言語では、できません。

強いタイピングは、おそらく変数が明確に定義されたタイプを持ち、式の異なるタイプの変数を組み合わせることについて厳密なルールがあることを意味します。たとえば、Aが整数であり、Bがフロートである場合、A+Bに関する厳格なルールは、Aがフロートにキャストされ、結果がフロートとして戻ってくることです。 Aが整数であり、Bが文字列である場合、厳密なルールはA+Bが無効であるということかもしれません。

静的タイピングとは、おそらくタイプがコンパイル時間(または非コンパイル言語に相当する)で割り当てられ、プログラムの実行中に変更できないことを意味します。

これらの分類は相互に排他的ではないことに注意してください。実際、私はそれらが頻繁に一緒に発生することを期待します。多くの強力な言語も静的にタイプです。

そして、私が「おそらく」という言葉を使用するとき、それはこれらの用語の普遍的に受け入れられている定義がないためであることに注意してください。あなたがすでにこれまでの答えから見たことがあるように。

回答はすでに上記で説明されています。強い週と静的と動的概念を区別しようとしています。

強く入力されたものと弱く入力されたものは何ですか?

強く入力:あるタイプから別のタイプに自動的に変換されません

GoまたはPythonのように、「2」 + 8のような強力な型言語のように、「タイプ強制」が許可されていないため、タイプエラーが発生します。

弱く(ゆるく)入力:あるタイプに自動的に変換されます:JavaScriptやPerlなどの弱い型言語はエラーを投げかけません。この場合、JavaScriptは結果「28」であり、Perlは10になります。

Perlの例:

my $a = "2" + 8;
print $a,"\n";

main.plに保存して実行します perl main.pl 出力10になります。

静的型とダイアミック型とは何ですか?

プログラミングでは、Progammerは、変数タイプがチェックされるポイントに関して、静的タイピングと動的タイピングを定義します。静的な型言語は、コンパイル時にタイプチェックが行われる言語であり、動的な型言語は実行時にタイプチェックが行われる言語です。

  • 静的:実行時にチェックされたタイプ
  • ダイナミック:実行中にその場でチェックされたタイプ

これはどういう意味ですか?

Go It Checksは実行時に入力された(静的チェック)。これは、実行しているコードを翻訳してタイプチェックするだけでなく、すべてのコードをスキャンして、コードが実行される前にスローされることを意味します。例えば、

package main

import "fmt"

func foo(a int) {
    if (a > 0) {
        fmt.Println("I am feeling lucky (maybe).")
    } else {
        fmt.Println("2" + 8)
    }
}

func main() {
    foo(2)
}

このファイルをmain.goに保存して実行すると、コンパイルが失敗したメッセージが表示されます。

go run main.go
# command-line-arguments
./main.go:9:25: cannot convert "2" (type untyped string) to type int
./main.go:9:25: invalid operation: "2" + 8 (mismatched types string and int)

しかし、このケースはPythonでは有効ではありません。たとえば、コードのブロックをフォローすると、最初のfoo(2)コールに対して実行され、2回目のfoo(0)コールで失敗します。これは、Pythonが動的にタイプされているため、実行しているコードのみを翻訳およびタイプチェックするためです。 elseブロックはfoo(2)で実行されることはないので、「2」 + 8は決して見さえされず、foo(0)はそのブロックを実行しようとして失敗します。

def foo(a):
    if a > 0:
        print 'I am feeling lucky.'
    else:
        print "2" + 8
foo(2)
foo(0)

次の出力が表示されます

python main.py
I am feeling lucky.
Traceback (most recent call last):
  File "pyth.py", line 7, in <module>
    foo(0)
  File "pyth.py", line 5, in foo
    print "2" + 8
TypeError: cannot concatenate 'str' and 'int' objects
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top