結論:静的型付けは「書いた時点で型の間違いを機械が捕まえてくれる」仕組み(Java・C#・TypeScript・C++)、動的型付けは「実行してみて初めて型の食い違いがわかる」仕組み(Python・JavaScript・Ruby)です。安全性を先に払うか、手軽さを先に取るかというトレードオフで、優劣ではありません。 どちらの世界も、このサイトなら環境構築なしにブラウザで書き比べられます。
「型付け」とは何か
プログラムが扱う値には「これは数値」「これは文字列」といった**型(type)**があります。3 は整数、"3" は文字列で、見た目は似ていても中身は別物です。「型付け」とは、この型の食い違いをいつ・どうやってチェックするかという言語の設計方針のことです。
チェックのタイミングで大きく2つに分かれます。
- 静的型付け(型あり):コードを実行する前(コンパイル時)に型を検査する。変数に「どんな型を入れるか」をあらかじめ決める。
- 動的型付け(型なし):コードを実際に動かしている最中(実行時)に型を検査する。変数の型はその時々の値で決まる。
「型あり言語/型なし言語」という言い方も、ほぼこの静的/動的の違いを指しています。
静的型付け:書いた時点で間違いを捕まえる
静的型付けの言語では、変数を作るときに型を宣言します。たとえば C# では「この箱には文字列を入れる」と先に決めます。詳しくは C#文法コースの「変数と代入」 をブラウザでそのまま実行して確かめてください(無料・登録不要)。
TypeScript はもっと分かりやすく、JavaScript に「型注釈」を足した言語です。名前: 型 と書くだけで型付けが始まります。TypeScriptコースの「型注釈 ― 変数に型をつける」 と 「関数の型 ― 引数と戻り値」 は、どちらもブラウザで TS→JS に変換してその場で動きます。関数に「文字列を渡すはずが数値を渡してしまった」ような間違いを、実行する前に赤線で教えてくれるのが静的型付けの持ち味です。
静的型付けの代表格:
- C#文法コース ― 本物の C#(Roslyn)がブラウザ内で動きます。最初の一歩は Hello World とトップレベル文。
- Javaコース ― 「壊れては困る現場」で長く使われてきた型あり言語。まずは Javaってどんな言語? から。
- TypeScriptコース ― JavaScript に型を足すと何が変わるかを体験できます。
- C++コース ― 型と低レベルの世界を扱う言語。
メリット:型の間違いを早く発見できる/エディタの補完が賢くなる/大人数・大規模でも壊れにくい。 デメリット:型を書く手間がある/短いスクリプトだと少し大げさに感じる。
動的型付け:まず動かして、実行時に判明する
動的型付けの言語では、型を宣言せずにいきなり値を入れます。Python なら x = 3 と書けば整数、x = "hello" と書き直せば文字列に変わります。手早く書けるので、最初の一歩や試行錯誤が軽いのが魅力です。
まずは動かしてみるのがいちばんです。
- Pythonコース ― print ― 画面に表示する からブラウザで即実行。
- JavaScriptコース ― console.log ― 画面に表示する で最初の一歩。
- Rubyコース ― putsで出力 から。
メリット:型宣言がいらず短く書ける/小さなスクリプトやプロトタイプが速い/柔軟。 デメリット:型の食い違いが実行するまで隠れている/大規模になると「どこで何型が来るか」を追いにくい。
同じトレードオフ、逆から見ているだけ
静的と動的は「安全性 vs 手軽さ」をどちらから先に払うかの違いです。静的型付けは、書くときに少し型の手間を払っておいて、実行時のバグを減らします。動的型付けは、書くときは軽くして、その分チェックを実行時(ときにはユーザーが使う場面)まで先送りします。どちらが正しいという話ではなく、作るものやチームの規模で選ぶものです。
なお「静的/動的」はコンパイルするか・インタプリタで実行するかとは別の軸です。混同しやすいので、興味があれば コンパイラとインタプリタの違い もあわせてどうぞ。
つまずきやすいところ
動的型付けで多くの初心者が最初に踏むのが、文字列と数値をうっかり混ぜるミスです。たとえば Python で数値と文字列を + でつなごうとすると、実行して初めてエラーになります。文字列の連結そのものは Pythonコースの「文字列の基本」 で試せますが、型が合わないと何が起きるかは Pythonのエラー「TypeError ― 型が合わない操作をした」 を見ると腑に落ちます。
静的型付けの側では、同じ間違いが実行前にエラーとして出ます。TypeScript なら 「TS2322: Type is not assignable ― 違う型を代入した」 がその代表です。「実行時に判明するエラー」と「書いた瞬間に出るエラー」を並べて見ると、静的/動的の違いが体で分かります。エラーで詰まったら Pythonのエラー逆引き や TypeScriptのエラー逆引き を辞書のように引いてください。
どちらから学べばいい?
「型を意識せずまず動かす楽しさを味わいたい」なら動的型付けの Python や JavaScript から。「最初から型の安全網に守られて学びたい」なら TypeScript や C# から。両方を少しずつ書き比べるのがいちばん理解が早いので、このサイトのように環境構築なしで並べて試せる場を使うのがおすすめです。
TypeScript と JavaScript は「同じ言語に型があるか・ないか」を比べる最短の教材です。具体的な違いは TypeScriptとJavaScriptの違い で、Python と JavaScript の性格の違いは PythonとJavaScriptの違い で解説しています。
次に読む・試す
- 型あり側を動かす:TypeScriptコース / C#文法コース / Javaコース / C++コース
- 型なし側を動かす:Pythonコース / JavaScriptコース / Rubyコース
- 型の食い違いで出るエラー:Pythonのエラー逆引き / TypeScriptのエラー逆引き
- 関連する比較記事:TypeScriptとJavaScriptの違い / PythonとJavaScriptの違い / コンパイラとインタプリタの違い