質問

新しいプログラミング言語は動的に型付けされているという話をよく聞きますが、言語が動的に型付けされているというのは、実際には何を意味するのでしょうか。静的に型付けされていますか?

役に立ちましたか?

解決

静的型付け言語

変数の型は、コンパイル時に知られている場合、

言語は静的に型付けされています。いくつかの言語では、これは、プログラマとして使用すると、各変数は、(例えば:ジャワ、C、C ++)であるタイプを指定しなければならないことを意味します。他の言語ではのいくつかのフォーム型推論、変数(例えば:OCamlの、ハスケル、スカラ、Kotlin)

の種類を推定するタイプ・システムの機能を提供します

ここでの主な利点は、チェックのすべての種類は、コンパイラによって行うことができますので、些細なバグの多くは、非常に早い段階でキャッチされていることである。

例:C、C ++、Javaの、錆、ゴー、Scalaの

動的型付け言語

言語は型は、実行時の値に関連付けられている場合、動的型付け、およびなど/変数/フィールドの名前が付いていません。これは、あなたが(の型推論ので静的に型付けされた言語を使用していない限り)タイプを毎回指定する必要はありませんので、プログラマとして、あなたが少し速く書くことができることを意味します。

例:PerlやRubyのやPython、PHP、JavaScriptの

とにかく、静的型チェックを行うには、コンパイラがないので、ほとんどのスクリプト言語では、この機能を持っていますが、あなた自身が変数の型を誤って解釈するインタプリタが原因であるバグを探して見つけることがあります。幸いにも、スクリプトはバグが非表示にするには非常に多くの場所を持っていないので、小さくなる傾向があります。

ほとんどの動的型付け言語では、型情報を提供することができますが、それを必要としません。現在開発されている一つの言語、ラスカルには、関数内の動的タイピングを可能にするが、静的に強制ハイブリッドアプローチをとります関数署名を入力します。

他のヒント

静的型付けのプログラミング言語は型チェックします(つまり、検証及び種類の制約施行のプロセス)のコンパイル時のの実行時のとは対照的に、を。

動的型付けプログラミング言語がでチェックを入力します。の実行時をとは対照的に、のコンパイル時に

ここではPython(動的型付け)と(静的型付け)Goは型エラーを処理する方法対照的な例があります:

def silly(a):
    if a > 0:
        print 'Hi'
    else:
        print 5 + '3'

Pythonは、実行時にチェックを入力ず、したがってます:

silly(2)

は完全に罰金実行され、期待される出力Hiを生成します。問題のある行がヒットした場合、エラーにのみ発生します:

silly(-1)

生成します。

TypeError: unsupported operand type(s) for +: 'int' and 'str'

該当する行が実際に実行されたため。

型チェックを行い、コンパイル時に一方行きます:

package main

import ("fmt"
)

func silly(a int) {
    if (a > 0) {
        fmt.Println("Hi")
    } else {
        fmt.Println("3" + 5)
    }
}

func main() {
    silly(2)
}

上記コンパイルされません、次のエラーで

invalid operation: "3" + 5 (mismatched types string and int)

単にそれをこのように置く:を静的型付け言語の変数の型であるの静的の中で、あなたがタイプに変数を設定したら、あなたはそれを変更することはできませんを意味します。タイピングは可変ではなく、それが指す値に関連付けられているからです。

Javaでたとえばます:

String str = "Hello";  //variable str statically typed as string
str = 5;               //would throw an error since str is supposed to be a string only

一方:中の動的型付け言語の変数の型であるのダイナミックの、あなたは型に変数を設定した後、あなたはそれを変更することができることを意味し。タイピングは、変数自体ではなく、前提値に関連付けられているからです。

のPython例えば:

str = "Hello" # variable str is linked to a string value
str = 5       # now it is linked to an integer value; perfectly OK

だから、それは値を入力し、のちょうど一般的なポインタのように動的型付け言語で変数を考えるのがベストです。

まとめると、のタイプはの言語ではなく、言語自体の変数説明(または記載しているべきです)。動的型付けと静的変数の対の言語を入力してそれはを言語として優れて使用されている可能性が変数の私見ます。

静的型付け言語では、このように、コンパイラは型が(種類が実行時に後で変更することが許可されていないよう?完璧なセンスの権利を作る)一般のコンパイル言語をチェックされます。

動的型付け言語は、一般的に(もしあれば)型チェックしたがって、解釈され、それらが使用されている実行時に起こります。もちろん、これは、いくつかのパフォーマンスコストをもたらし、動的言語(例えば、パイソン、ルビー、PHP)が入力されたもの(のjava、C#の、など)ほど良くスケーリングしない理由の一つです。別の観点から、静的型付け言語は、起動コストの多くを持っている:あなたは、通常より多くのコード、難しいコードを書くことができます。しかし、それは後にオフに支払っています。

良いことは、双方が相手側から機能を借りているです。型付け言語は、C#で例えば、ジェネリック医薬品と動的ライブラリをよりダイナミックな機能を組み込んでいる、と動的言語は、より多くの型チェックを含めている、例えば、Pythonで型注釈を、またはPHPの変種をハック、通常の言語へのコアとで使用できるされていませんデマンド。

それは技術選択になると、どちらの側には、他の上本質的な優位性を持っています。あなたがより多くのコントロールがしたり、柔軟性を開始するかどうかの好みだけの問題です。ちょうど仕事のための適切なツールを選択し、スイッチを検討する前に、反対の面で利用可能であるかどうか確認してください。

http://en.wikipedia.org/wiki/Type_system

静的型付け

プログラミング言語は、 型チェックが コンパイル時に ランタイムとは対照的です。静的型付けでは、 型は変数に関連付けられます 値ではありません。静的型付け言語 Ada、C、C++、C#、JADE、Java、 Fortran、Haskell、ML、Pascal、Perl (区別に関して スカラー、配列、ハッシュ、 サブルーチン) と Scala.静的型付け は限定された形式のプログラムです 検証 (「タイプ セーフ」を参照):したがって、多くのタイプを許可します エラーは、 開発サイクル。静的型 チェッカーは型のみを評価します で決定できる情報 コンパイル時ですが、検証できる チェックされた条件が すべての可能な プログラムによって、 repeat typeは、 プログラムが実行されます。プログラムの実行 また、より効率的にすることもできます(つまり、より速く、またはメモリの使用量を減らすことで) 実行時の型チェックの省略と 他の最適化を有効にします。

型情報を評価するため コンパイル中であるため、 型情報のみ 実行時に使用可能、静的型 チェッカーは保守的です。彼らはそうするでしょう である可能性のあるいくつかのプログラムを拒否します 実行時には正常に動作しますが、 静的に 適切に型指定されています。たとえば、 常に式 実行時に true と評価され、 コードを含むプログラム

if <complex test> then 42 else <type error>

は、型が正しくないとして拒否されます。 静解析では判断できない else ブランチが 撮影。[1] 保守的な振る舞い 静的型チェッカーの 有利な場合 false と評価される頻度は低い:ある 静的型チェッカーは型を検出できます めったに使用されないコードパスのエラー。静的な型チェックを行わなくても、 100%コードによるコードカバレッジテスト カバレッジはそのようなものを見つけることができないかもしれません 型エラー。コードカバレッジテストでは、 このような型エラーの検出に失敗します なぜなら、すべての場所の組み合わせが ここで値が作成され、すべての 特定の値が使用される場所 を考慮に入れる必要があります。

最も広く使用されている静的型指定 言語は正式にはタイプ セーフではありません。彼らには「抜け穴」があります。 プログラミング言語仕様 (programming language specification) プログラマーがコードを書けるようにする 検証を回避する 静的型チェッカーによって実行され、 そのため、より幅広い問題に対処します。たとえば、Java やほとんどの C スタイル 言語にはpunning型があり、 Haskellには次のような機能があります。 unsafePerformIOです。このような操作は、 実行時に安全でない、 次の原因で望ましくない動作を引き起こします プログラムが実行されます。

動的型付け

プログラミング言語は、 動的型付け、または単に「動的」、 その型チェックの大部分が は、 コンパイル時。動的型付けでは、 型は、 変数。動的型付け言語 Groovy、JavaScript、Lisp、Lua、 Objective-C、Perl( ユーザー定義型 (組み込み型ではない) types)、PHP、Prolog、Python、Ruby、 Smalltalk と Tcl.静的との比較 タイピング、動的タイピングはもっとすることができます 柔軟性 (例:プログラムに次のことを許可します。 型と機能の生成 実行時データでは)、 先験的保証が少ない費用。これは、動的に型付けされた 言語は以下を受け入れ、試みます いくつかのプログラムを実行すると、 静的な型によって無効とされた チェッカー。

動的型付けによりランタイムが発生する可能性がある 型エラー - つまり、実行時に value が予期しない型を持つ可能性があり、かつ その型に対して無意味な操作 が適用されます。この操作が発生する場合があります 場所のずっと後 プログラミングミス、つまり、 間違ったタイプのデータがある場所 それがすべきではない場所に送られました 有る。これにより、バグが困難になります 見付ける。

動的型付け言語システム、 静的に型付けされたものと比較して いとこ、より少ない「コンパイル時間」を作る ソースコードをチェックします(ただし、 たとえば、プログラムが は構文的に正しい)。ランタイム チェックは潜在的に多くなる可能性があります 彼らは使用できるので、洗練されています 動的情報だけでなく、 中に存在した情報 編纂。一方 ランタイムチェックは、 条件は、特定の プログラムの実行、およびこれらの チェックは、すべての プログラムの実行。

動的型付けでの開発 言語は、多くの場合、 Unit などのプログラミング手法 テスティング。テストは、 プロフェッショナルなソフトウェア開発 は、 動的型付け言語。で 練習、テストは確実に行われます 正しいプログラム操作で検出できます 静的なエラーよりもはるかに広い範囲のエラー 型チェックはできませんが、逆に型チェックはできません を包括的に検索します。 テストと静的の両方のエラー 型チェックは検出できます。テストは、 ソフトウェア・ビルド・サイクル (その場合は は「コンパイル時」と考えることができます プログラムユーザーが このようなテストを手動で実行する必要はありません。

参考文献

  1. ピアース、ベンジャミン (2002)。種類とプログラミング言語。MITプレス。ISBN 0-262-16209-1。

の用語は、「動的型付け」残念ながら誤解を招くおそれがあります。すべての言語は静的に型付けされ、そして(一部は考えていない値の)種類は、式の性質があります。しかし、いくつかの言語は、一種類のみを持っています。これらは、ユニ型付け言語と呼ばれています。そのような言語の一例は、型なしラムダ計算されます。

は、型なしラムダ計算では、すべての用語はラムダ用語であり、そして用語に行うことができる唯一の操作は、別の用語に適用されます。したがって、すべての操作は常に無限再帰やラムダ項のいずれかになりませんが、決してエラーを通知ます。

(λx.x) + (λy.y)

しかし、我々は、我々は無意味な操作を行うことができ、このような二ラムダ項を一緒に加えることをプリミティブ数と算術演算と型なしラムダ計算を増強することでした。一つを行うための唯一のまともなものは、このような場合、エラーを通知することであると主張することができ、これを行うことができるように、それぞれの値は、この用語は、ラムダ用語または番号であるかどうかを示すインジケータでタグ付けされなければなりません。加算演算子は、実際に両方の引数が数字としてタグ付けされていることを確認し、そうでない場合は、エラーを通知します。種類は、プログラムのではなく、これらのプログラムによって生成される値の性質であるため、これらのタグは、のないのタイプであることに注意してください。

これを行うユニ型付けされた言語は、動的型付けと呼ばれます。

こうしたJavaScriptのやPython、およびRubyなど

言語は全てユニ型付けされています。ここでも、JavaScriptでtypeof演算子とPythonでtype機能は、誤解を招くような名前を持っています。彼らはオペランドではなく、その種類に関連付けられたタグを返します。同様に、JavaでC ++とdynamic_castinstanceofは、のないのチェックを入力しないでください。

コンパイル済み vs.通訳済み

「ソースコードを翻訳するとき」

  • ソースコード:元のコード (通常は人間がコンピュータに入力したもの)
  • 翻訳:ソースコードをコンピュータが読めるものに変換する(つまり、マシンコード)
  • ランタイム:プログラムがコマンドを実行している期間(コンパイルされている場合はコンパイル後)
  • コンパイル言語:実行前にコードが翻訳される
  • 通訳言語:実行中にその場でコードが翻訳される

タイピング

「種類をチェックした場合」

5 + '3' の型エラーの例です。 強く型付けされた Go や Python などの言語では、「型強制」、つまり 2 つの型のマージなど、特定のコンテキストで値の型を変更する機能が許可されていないためです。 弱い型指定 JavaScript などの言語は型エラーをスローしません (結果として '53').

  • 静的:実行前に型がチェックされる
  • 動的:型は実行中にオンザフライでチェックされます

「静的およびコンパイル済み」と「動的および解釈済み」の定義は非常に似ています...しかし、「型がチェックされるとき」と「型がチェックされるとき」であることを覚えておいてください。「ソースコードが翻訳されるとき」。

言語がコンパイルされているかインタープリタされているかに関係なく、同じタイプのエラーが発生します。!これらの用語を概念的に分離する必要があります。


Python の例

動的、解釈された

def silly(a):
    if a > 0:
        print 'Hi'
    else:
        print 5 + '3'

silly(2)

Python は解釈され、動的に型指定されるため、実行中のコードのみを変換して型チェックします。の else ブロックは決して実行されないので、 5 + '3' 見られることさえありません!

静的に型付けされたらどうなるでしょうか?

コードが実行される前に型エラーがスローされます。解釈される場合でも、実行前に型チェックを実行します。

コンパイルされたらどうなるでしょうか?

else ブロックは実行前に変換/確認されますが、動的に型付けされるため、エラーはスローされません。動的型付け言語は実行されるまで型をチェックしないため、その行は決して実行されません。


Go の例

静的、コンパイル済み

package main

import ("fmt"
)

func silly(a int) {
  if (a > 0) {
      fmt.Println("Hi")
  } else {
      fmt.Println("3" + 5)
  }
}

func main() {
  silly(2)
}

型は実行前にチェックされ (静的)、型エラーはすぐに捕捉されます。解釈される場合、型は実行前に引き続きチェックされ、同じ結果が得られます。動的であれば、コンパイル中にコードが確認されてもエラーはスローされません。


パフォーマンス

コンパイルされた言語は、静的に型指定されていると実行時のパフォーマンスが向上します。動的);型の知識により、マシンコードの最適化が可能になります。

静的に型付けされた言語は、実行中に動的に型をチェックする必要がないため (実行前にチェックが行われます)、本質的に実行時のパフォーマンスが優れています。

同様に、コンパイル言語は、コードをその場で「解釈」/翻訳する必要がなく、すでに翻訳されているため、実行時間が高速になります。

コンパイル言語と静的型付け言語はどちらも、それぞれ翻訳と型チェックの実行前に遅延が生じることに注意してください。


さらなる違い

静的型付けは、実行中にエラーを検出するのではなく、早期にエラーを検出します (特に長いプログラムの場合に便利です)。これは、プログラム内のどこでも型エラーを許容せず、多くの場合、変数の型変更を防ぐという点でより「厳密」であり、これにより、意図しないエラーをさらに防ぐことができます。

num = 2
num = '3' // ERROR

動的型付けはより柔軟であり、これを高く評価する人もいます。通常、変数の型の変更が許可されるため、予期しないエラーが発生する可能性があります。

コンパイル時に静的型付け言語は、型チェックとタイプが変更することはできません。 (新しい変数/参照が作成され、タイプキャストコメントとキュート取得しないでください)。

動的型付け言語の実行時に型チェックや変数の型は、実行時に変更することができます。

を静的型付け言語:各変数と式がすでにコンパイル時に知られています。

(実行時にのみ整数タイプの値をとることができるint a;

例:C、C ++、Javaの

を動的型付けの言語の:変数は、実行時に異なる値を受け取ることができ、その種類は、実行時に定義されます。

(実行時における値の任意の種類をvar a;取ることができる)

例:ルビー、Pythonの

甘いとシンプルな定義はなく、必要性を当てはめます: 静的型付け言語は、その全範囲のための変数にタイプをバインド(ワンセグ:SCALA) 動的型付け言語は変数が参照する実際の値にタイプをバインドします。

  • 静的型付け言語では、変数はコンパイル時に既知の型に関連付けられ、その型はプログラムの実行中は変更されません。同様に、変数には既知/指定された型のインスタンスである値のみを割り当てることができます。
  • 動的型付け言語では、変数に型はなく、実行中の値はどのような形でも構いません。

は、静的C ++、Javaなどの言語を入力し、Pythonのような動的型付け言語は、変数の型を実行するという点でのみ異なります。    を静的に型付けされたの言語は変数の静的データ・タイプを持って、ここではデータ型がそのようにコンパイル、デバッグ時にチェックされてはるかに簡単です...の動的型付けの言語は行わないのに対し、同じデータ・タイプは、プログラムを実行れるチェックされ、従って、デバッグが少し困難である。

はまた、彼らは非常に小さな違いがあり、を強く型付けされた弱い型指定の言語に関連することができます。強く型付けされた言語を使用すると、別の例として、1種類を使用することはできません。 CおよびC ++ ...弱い型付け言語が許す一方eg.python

動的型付け言語のは、すぐに(を静的に型付けさlanguag の電子で必要である)を使用する必要がある変数の種類を考える程度のオーバーヘッドなしに、アルゴリズムの概念のプロトタイプを作成するのに役立ちます。

静的型付き言語 (コンパイラーはメソッド呼び出しを解決し、参照をコンパイルします):

  • 通常はパフォーマンスが向上します
  • コンパイルエラーのフィードバックが高速化される
  • IDE サポートの向上
  • 未定義のデータ形式を扱うのには適していません
  • モデルが定義されていない場合、開発を開始するのが難しくなります。
  • コンパイル時間が長くなる
  • 多くの場合、より多くのコードを記述する必要があります

動的型付け言語 (プログラムの実行中に決定):

  • パフォーマンスの低下
  • より速い開発
  • 一部のバグは実行時の後半になって初めて検出される可能性があります
  • 未定義のデータ形式 (メタ プログラミング) に適しています

静的型付け: Java や Scala などの言語は静的型付けされています。

変数は、コードで使用する前に定義して初期化する必要があります。

たとえば。int x;x = 10;

System.out.println(x);

ダイナミックタイピング:Perl は動的型付け言語です。

変数は、コードで使用する前に初期化する必要はありません。

y=10;コードの後半でこの変数を使用します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top