コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

動的型付けと型推論の違いをざっくりまとめる

ざっと眺めるとミスリードしがちなのでわかりやすい違いを述べるだけの話。

動的型付けとは

文字通り「動的に」「型をつける」というプログラミング言語の機構。

言語として実行するときに型が決定するので、ソースコード上では型を特段指定しなくても値の内容から判断して型を決定づける。

例えばJavaScriptの場合は

// ただ足し込むだけの関数を作る
function plusing(x,y){ return x+y; }

// 文字列同士を設定するとtypeは文字列になる
typeof(plusing("a","b"))
// => "string"

// 数値を設定するとtypeは数値になる
typeof(plusing(1,2))
// => "number"

(相対する考えの)静的型付けとは

対象となる静的型付けの言語は、変数を宣言するときに必ず型を指定しないといけない。厳格に型をしていすることで意図違いのものが混入することを防ぐことができるが、動的型付けほど自由度の高い使いかたはできない。

型推論とは

静的型付けの場合は変数宣言した型を決めなければいけないが、代入される値から推察して値を確定させるのが型推論

一番わかりやすい例は初期値に使う場合の例。

Go言語で例を出す。

varのあとに int として型を宣言している

package main

import (
    "fmt"
)

func main() {
    var suji int
    suji = 10
    suji = suji + 20
    fmt.Println(suji)
}

ただ型推論を使うと初期値から型が自明になるので、宣言しなくても解釈される。

package main

import (
    "fmt"
)

func main() {
    var suji = 10
    suji = suji + 20
    fmt.Println(suji)
}

そのため、以下の場合は推論材料がないのでエラーになる。

package main

import (
    "fmt"
)

func main() {
    var suji
    suji = 20
    fmt.Println(suji)
}

違いはなにか

大雑把に動きを見ると親しい動きをするので同じものと思えてしまうが、型推論は文字通り「型が推論できる材料が揃わないとコンパイルエラーになる」なので、入る値が推定できないような書き方は許容されないのでその点がわかりやすい違いとなる。

参考リンク