年末までに10kgダイエットと言いながら、8kgで目標未達になってしまった冨田です。
今回のテーマについて深く学習をしてこなかったので、何が違うのかを改めて調べてみました。(TypeScriptに何故か苦手意識があり、避けてきたので…)
- 静的型付け言語: MDN Static typing
- 静的型付け言語(例えば、Java, C, C++)とは、コンパイル時に変数の型がわかる言語です。静的型付け言語の多くは、プログラマが明示的に型を指定
- 動的型付け言語: MDN Dynamic typing
- 動的型付け言語とは、(JavaScript のように) インタプリターが実行時に、変数の値 に基づいて、変数 にデータ型 を割り当てる
※インタプリター型言語とコンパイラー型言語で動的・静的型付け言語を判断しているわけではないので注意!
メリットとデメリット
詳細な部分までは、触れない。
- エラーのタイミング
- 動的型付け言語の場合、実行時。
- 静的型付け言語の場合は、コンパイル時(意味解析の型検証時)。
- コード量
- 動的型付け言語の場合は、少ない。
- 静的型付け言語の場合は、多い。
コンパイルなどの機械語の部分は、省略する。(機械語部分の詳細は、これから勉強していきます!)
RubyとTypeScriptをつかって、同じコードを書いてみる。
TypeScript
明示的にどの型が必要なのかを定義する。(number型しか入りませんよ〜)
class Calculator {
add(x: number, y: number): number {
return x + y;
}
}
※実行する際は、下記の流れで実行する。(node.jsとTypeScriptコンパイラが必要です)
//コンパイル中にエラーがない場合、jsファイルが生成される
// --noEmitOnError がないと、エラーがあっても生成されます
$ tsc --noEmitOnError ファイル名.ts
// 対象ファイルを実行する
$ node ファイル名.js
正しい型の引数を渡した場合
下記のように、計算結果を出力する
const calculator = new Calculator();
const result: number = calculator.add(3, 5);
console.log(result); // 8
定義した型と異なる型を引数に渡した場合
const calculator = new Calculator();
const result: number = calculator.add('aaa', 5);
console.log(result);
JSへコンパイルするときにエラーが発生し、JSファイルを生成しない。
$ tsc typescript.ts
typescript.ts:8:39 - error TS2345:
Argument of type 'string' is not assignable to parameter of type 'number'.
const result: number = calculator.add('aaa', 5);
number型に定義したパラメータにstring型の引数を割り当てられないというエラーを、プログラム実行前のコンパイル時に出力する。
Ruby
暗黙的に型を引数に定義することになる。(もちろんInt型ですよね?)
class Calculator
def add(x, y)
x + y
end
end
正しい型の引数を渡した場合
calculator = Calculator.new
result = calculator.add(3, 5)
puts result # 8
異なる型を定義した場合
calculator = Calculator.new
result = calculator.add('aaa', 5)
puts result
実行後にエラーが出力される。(実行するまで、エラーが発生しない)
ruby.rb:3:in `+': no implicit conversion of Integer into String (TypeError)
x + y
^
from ruby.rb:3:in `add'
from ruby.rb:8:in `<main>'
まとめ
どちらが良いという判断ではなく、「どちらも使い道によっては…」と要素が大きく感じました。
型注釈をコストと考えるか、投資と考えるか? サバイバルTypeScriptより
- 静的型付け言語
- チーム開発や大規模開発向け
- 型情報によって、可読性が良くなる
- 動的型付け言語
- 個人開発やスピード感が求められる開発
- すぐプログラムを実行できる
エンジニア経験の浅い私としては、静的型付け言語のほうが、IDEでエラーやタイポに気づきやすいといった点でこっちのほうが見やすいのかな?と思った気づきとなりました。 (動的型付け言語でも検出できる機能やIDEはあるかと思いますが)
以上、最後までお付き合いいただきありがとうございました!