動的型付け言語と静的型付け言語の違いとは?
プログラミング言語の特徴をあらわすときによく使われる「動的型付け」「静的型付け」ですが、
- そもそも動的と静的ってどういう意味?
- 動的型付け言語と静的型付け言語って何が違うの?
- それぞれの利点、メリットは?
- 処理速度は遅い速い関係あるの?
という疑問があると思います。
今回はこの「動的型付け」「静的型付け」について解説していきたいと思います。
「動的」「静的」の意味とは?
まずは、動的と静的という単語の意味について軽く触れておきます。
「知ってるよ!」って方は下にスクロールしてください!
動的と静的の違いを簡単に表せば、
「状況によって状態を変える」か「状況によらず状態を変えない」かです。
- 動的 : 状況によって状態を変えること
- 静的 : 状況によらず状態を変えないこと
webサイトの例でいえば、
- 動的サイト : ユーザーの要求で表示する内容を変えるWebサイト
- 静的サイト : だれでもどんな状況でも表示する内容を変えないWebサイト
が挙げられます。
ショッピングサイトは動的サイトで、古いブログなんかは静的サイトの良い例です。
ちなみに英語では、
- 動的 : dynamic(ダイナミック)
- 静的 : static(スタティック)
と書きます。聞いたことありますね!
動的型付け言語と静的型付け言語とは
本題に入ります。
まず動的型付け言語と静的型付け言語の定義から行きましょう。
- 動的型付け言語 : 変数などのデータ型の宣言がいらないプログラミング言語
- 静的型付け言語 : 変数などのデータ型の宣言が必要なプログラミング言語
コードを書く中であらかじめデータ型を決めるか決めないかが違います。
実際にコードを見てみましょう。
ここでは、動的型付け言語の代表「Python」さんと静的型付け言語代表「C++」さんに、
- x に 2を代入
- y に 3を代入
- x + y を表示
この3つの処理を行ってもらいましょう。
動的型付け言語「Python」の場合
まずは動的型付け言語からです。
ポイントはxとyにデータ型の宣言がないことです。
x = 2
y = 3
print( x + y )
わあ、なんて簡単なんでしょう。
もちろん計算結果は「5」と出ます。
静的型付け言語「C++」の場合
次は静的型付け言語です。
ポイントはxとyにデータ型の宣言があることです。
#include <iostream>
using namespace std;
int main()
{
int x = 2;
int y = 3;
cout << x + y << endl;
return 0;
}
int型という整数の変数x,yが定義されています。
こちらも計算結果は「5」と出ます。
この二つの言語からわかることですごく大切なことは、
動的型付け言語は変数の宣言時にデータ型を決める必要がない
静的型付け言語は変数の宣言時にデータ型を決める必要がある
ということです。まあこれは最初のほうに書いたことと全く同じです。
しかし、これだけ見ると、
- データ型を決めることは何かに役立つの?
- データ型を決めなくても大丈夫なの?
ということを思う方がいるかもしれません。
静的型付け言語から勉強を始めた方は前者、動的型付け言語から勉強を始めた方は後者に当てはまるのではないでしょうか。
ここからは、データ型を決めるか決めないかで
- どんな違いが出るのか
- どんなメリットデメリットがあるのか
について解説していきます。
動的型付けのプログラミング言語のメリットやできること
動的型付けプログラミング言語は、あらかじめデータ型を決めずに定義するため、こんないいことがあります。
- 記述量が大幅に減る
- 比較的簡単にプログラムが書ける
この二つを紹介します。
記述量が大幅に減る!
動的型付け言語は型宣言を省略できる(そもそもいらない)ため、型宣言のいる静的型付け言語に比べ記述量がぐっと減ります。
違いが分かりやすいように、C言語(静的型付け言語)とPython(動的型付け言語)で同じ機能のソースコードを比較してみましょう。
#include <stdio.h>
int main(void)
{
// 整数1を整数型変数aに格納
int a = 1;
// aを表示
printf("%dn",a);
// 文字Jを文字型変数bに格納
char b = 'J';
// bを表示
printf("%cn",b);
return 0;
}
# 整数1を型の決まっていない変数aに格納
a = 1
# aを表示
print(a)
# 文字Jを型の決まっていない変数bに格納
b = 'J'
# bを表示
print(b)
↓プログラムに関係ないコメントを外せば違いは明確です↓
#include <stdio.h>
int main(void)
{
int a = 1;
printf("%dn",a);
char b = 'J';
printf("%cn",b);
return 0;
}
a = 1
print(a)
b = 'J'
print(b)
言語によって多少の差はありますが、型宣言がないというところで、記述量の差が生まれます。
圧倒的に動的型付け(型宣言のいらない)言語のほうが記述量が減ります。
これは大きなメリットの一つです。
プログラムの記述量が少なくて済めば、それだけ生産性が向上します。
同じコードでも短くかけるんだったらそっちのほうが生産性が高いでしょう?
でも実際は、「生産性」と引き換えに「実行速度や保守性」を失っていることがあります。
比較的簡単にプログラムが書ける
動的型付け言語は静的型付け言語に比べて、簡単にプログラミングできるといえます。
要は、あんまり難しいことを考えないでも手を付けられる言語というわけです。
最初は、データ型についての知識も必要なく始められるため、プログラミングを学び始めるにはうってつけでしょう。
静的型付けのプログラミング言語のメリットやできること
静的型付けプログラミング言語は、あらかじめデータ型を決めて定義するため、こんないいことがあります。
- コンパイル時にエラーが出てくれる
- メモリ領域の最適化が行える
- パフォーマンスの向上が狙える
一つずつ紹介します。
コンパイル時にエラーが出てくれる!
エラーって聞くと出ないほうがいいかと思う方もいると思いますが、出てく「れ」ると書いたのは、コンパイル時にデバッグを行えるという意味です。
つまり、プログラム実行前に、バグやエラー箇所を特定できるということです。
どんなことがエラーででるかというと、
- 整数型変数なのに文字列を代入しようとしてる
- 型の違うデータで関数を呼ぼうとしている
とかです。
逆に言えば動的型付け言語は型が違うというエラーが実行時までわからないのです。
要は、
動的型付け言語はプログラムを実行しないとバグがわからない
これは致命的ですが事実です。
なので、このような型エラーが実行前にわかるというのは静的型付け言語の大きなメリットです。
メモリ領域の最適化
静的型付け言語は、あらかじめ型宣言によってデータ型を決めておきます。
それによって、メモリ領域などの最適化が行えます。どういうことかというと、
int a; // 4byte
float b; // 4byte
char c; // 1byte
double d; // 8byte
と置いたときに、データ型の大きさより
- 整数型 int 4byte
- 浮動小数点型 float 4byte
- 文字型 char 1byte
- 倍精度 double 8byte
という「各変数がメモリをどれだけ必要とするか」が分かります。
それが、型宣言を行わず、ただの変数としたときはどうなるでしょうか?
var a; // ?byte
var b; // ?byte
var c; // ?byte
var d; // ?byte
こうすると、変数a,b,c,dがどのくらいのメモリ領域を使用するのかわからない状況です。
なので、最適なメモリ管理ができず、余分に多くメモリ領域を取っておくなどをしないといけません。
一方、静的型付け言語であれば、あらかじめデータ型がわかっているのですから、その変数がどれくらいのメモリが必要なのかがわかります。
そのため、変数に対しての最適なメモリ割り当てが可能になるのです。つまり、
- 1byte必要な変数には1byte分のメモリ領域
- 4byte必要な変数には4byte分のメモリ領域
を割り当てることができるのです。
データはコンピュータのメモリに格納するのですから、当然、無駄なメモリ割り当てが重なればメモリ不足に陥ります。
そういう点で静的型付け言語はメモリ領域の最適化ができる点で優れているといってもよいでしょう。
パフォーマンスの向上
静的型付けを行うと、当たり前ですがデータ型がわかります。そのため、
- 整数と整数の計算が行われる
- 小数と小数の計算が行われる
ということはプログラム実行前にわかります。
そこで、計算の最適化を行えることがあります。
難しい話なのでかみ砕くと、整数と整数の足し算で小数が出てくることはないから端折れるというようなイメージです。
その結果、静的型付け言語のほうが、演算処理でのパフォーマンスが優れている場合があります。
結局どっちがいいの?
ここからは個人的な意見になるので参考程度にしてください。
私としては、プログラミングにおいての「生産性」と「実行速度や保守性」はトレードオフの関係だと思っています。
生産性を高めようとすれば実行速度や保守性で劣ってしまうことがあり、逆に、実行速度や保守性を求めると生産性が落ちてしまうことがあります。
なので、
- 生産性をとるなら動的型付け言語
- 実行速度や保守性をとるなら静的型付け言語
なのかなと思っています。
生産性をとるべきは、発展途上の分野においての開発です。
誰よりも早く、一つ目を確立させたほうが勝ちという状況においては、生産性をとるべきでしょう。
逆に実行速度や保守性をとるべきは、いろいろあるでしょう。
業務システムがいい例ではないでしょうか?
仕事中にいきなり動かなくなるシステムなんて嫌ですし、お客様の情報検索で2分も3分も待たされるのも嫌です。
このように、なにを重視するのかによってつかうべきプログラミング言語は変わってきます。
プログラミング言語は単なる道具にすぎません。
しかし、今の時代とても力強い道具です。
どの道具を使うのかは場面場面で変わってくるはずです。
私は静的型付け言語のほうが好きですけどね。
動的型付けプログラミング言語の例
有名なプログラミング言語だと以下のようなものが挙げられます。
- Python
- Ruby
- JavaScript
- PHP
静的型付けプログラミング言語の例
有名なプログラミング言語だと以下のようなものが挙げられます。
最新のプログラミング言語人気度ランキング
こちらの記事で人気のプログラミング言語の特徴や学習難易度など詳しく解説しています。
コンパイラ型言語とインタプリタ型言語とは
インタプリタ型言語とはプログラムを一行一行実行する方式(逐次翻訳型)をとっているプログラミング言語です。
インタプリタ型言語の多くは動的型付け言語です。
コンパイラ型言語とインタプリタ型言語についてはこちらの記事で詳しく解説しています。
最後に
私のイメージは、
- 動的型付け言語は「柔軟」
- 静的型付け言語は「頑固」
って感じです。私は頑固派です。
twitterのフォローお待ちしております!
以上、「動的型付け言語と静的型付け言語の違いとは?」でした。
最後まで見ていただきありがとうございます。