1. ホーム
  2. 記事一覧
  3. 動的型付け言語の解説、メリットや適したプロジェクトについて

2023.01.31

動的型付け言語の解説、メリットや適したプロジェクトについて

プログラミング言語は「型」を扱う形式によって動的型付け言語と静的型付け言語に分けることができます。こちらの記事では動的型付け言語についての説明のみ行い、型および型付けについては静的型付け言語についての特徴と共にこちらの記事で説明していますので先にご参照下さい。

https://envader.plus/article/78

動的型付け言語について

動的型付け言語には以下の言語が挙げられます。

  • Python
  • Ruby
  • JavaScript
  • PHP

動的型付け言語とは

上記参照先の記事で説明したように「型」とは数値や文字列、配列、オブジェクトなど様々なデータの種類のことです。そして動的に型を付けるということは、人間が書くソースコードの時点では型が決められておらずプログラムの実行時に型が決定されます。

型の決定が実行時に行われるため、インタプリタ型(ソースコードを一行ずつ翻訳・実行まで行う実行形態)の言語においてこの形式が必然的に多くなります。プログラムを実行するまで型の情報が分からないため実行前にコンパイルして機械語に出力するということには向いていません。

以下のコードはPythonでの記述例です。このように変数に型を指定しなくてもインタプリタが一行ずつ型を解釈して実行されます。

a = 3
b = 5
num = a + b
print(num)
# 実行結果:8

参照先の記事でプログラムを実行する際には型の情報が必要と説明しました。厳密に言うと、データがどのくらいのメモリ領域を必要とするかということを型情報から得るということです。

静的型付け言語では型を予め指定しているためソースコード上の型に応じたメモリ領域を用意することができます。では動的型付け言語ではメモリの確保をどうするかというと、プログラムの実行時にその都度型を解釈してメモリの割り当てが行われます。メモリを最小限に抑えようとすると事前に型を指定する必要があり、これは動的に型を付けるとは言えない=静的に型を付けるということになります。

動的に型を付けるとは、つまりプログラムの実行時にデータ型を柔軟に対応できるということです。型が不確定なJSON形式でデータをやり取りする際などに動的型付け言語だと扱いやすいと言えます。

ここから動的型付け言語のメリットとデメリットを挙げながら特徴をさらに説明していきます。

動的型付け言語のメリット

  • データの型・大きさを気にしなくて良い

前項で動的型付けではメモリの割り当ては実行時に行われると説明しました。この過程を十分に行うためには実行前にメモリ領域が大きめに確保されています。例えば動的型付け言語で数値を扱う場合、ほとんど8byteのメモリを使用します。これは数値型で考えられる最大範囲が8byteだからです。物理メモリにとって型が何であるかは必要ではなく、使用量と扱い方のみ分かれば問題ありません。用意された範囲内であればデータの型は柔軟に対応することができます。このことはデータ型の変動がある環境ではメリットとなります。 また動的型付け言語にはダックタイピングという概念があり、これはプログラムが実行可能であれば型が何であるかに関わらず動作するというものです。「アヒルのように鳴き、歩くのであれば、それはアヒルである」という考え方に由来する造語でここでは詳しい説明は割愛しますが、型に依存しないプログラミングが可能である点は動的型付け言語のメリットと言えます。

  • 記述が簡潔である

動的型付け言語は型を宣言する必要がないためコードの記述量が減ります。よって開発の速度は上がりますし、単純で扱いやすいことは記述コストも小さくなります。

動的型付け言語のデメリット

  • ソースコードだけではプログラムの設計・型の仕様が分からない

動的型付け言語の最大の欠点はソースコードを見ても型の仕様が分からないということです。自分が書いたコードであれば変数・関数がどのような型を扱うべきか頭の中で認知することができますが、他者が書いたコードだと型が明示されていないためその変数・関数の扱いが分からなくなります。自分で書いたコードでも記述量が多くなってくると型の仕様を把握できなくなるということも起こるでしょう。動的型付け言語を使用する場合は型の扱いについてドキュメント等で共有する必要性があります。大人数で開発する場合やコードが膨大になる場合にはこういった共有コストが発生します。

  • 実行後にエラーが発生する・思い通りに動かない・究明に時間がかかる

動的型付けはソースコードの時点では型が自由です。実行可能であれば翻訳され、その後実行されます。ですがこの時に整合性エラーが発生したり思った通りに動作しないということが起きる可能性があります。

以下はPythonでのコード例です。1行目で変数numberを定義しています。そして2行目で変数numberを書き換える記述をしようとしていますが、ここでスペルミスが発生しています。この場合、スペルミスのnumbarという変数が新たに作成されることになります。この場合はプログラムとしては実行可能ですが思い通りの挙動ではなくなり、実行時に何らかのエラーが発生してしまいます。

```python
number = 3
numbar = (number + 9) / 3
```

また動的型付け言語でよく起こる実行時のエラーとしてundefined variable(変数に値が存在しない)というものがあります。例えば以下のコードでは変数ageを出力する処理を書こうとしてagrとスペルミスをしています。この場合コンピュータはagrという変数を探しますが、単純なスペルミスに過ぎず変数agrは存在しないため、実行時に「undefined variable」=変数に値が存在しないというエラーが発生します。

```python
name = "Alice"
age = 21

print(f'私の名前は{name}です。年齢は{agr}です。')
```

これらの原因を見つけることが、コード量が膨大になると開発者にとっては極めて困難になります。

  • 実行速度が静的型付け言語に比べて遅くなる

型チェックを実行時に行っているためその分処理に時間がかかります。またメモリ領域を大きく確保していることでどうしても余分が出てしまいます。文字列型から数値型、あるいは数値型から文字列型といった型変換の必要性やプログラム上で型チェックの分岐を記述しなければならない等、かえって処理が増えてしまうこともあります。こういったことからコード上で型付けを行わないことで実行速度が遅くなる点は、動的型付け言語のデメリットです。

動的型付け言語が適しているのは

  • 小規模・個人・初学者の開発

メリットとして挙げたように動的型付け言語ではコードの記述が簡潔であるため、個人または小規模な開発に向いています。また初学者がプログラムを書く際にも型の考慮が必要ないため取り掛かりやすいという特徴もあります。逆にシステムの堅牢性・保守性が求められる大規模なプロジェクトでは型をしっかり定義すべきであり、静的型付け言語の方が向いています。

  • 開発速度が求められるプロジェクト

ここまで説明してきた通り、実行速度は落ちるもののコードの記述量が減るということは開発速度は速くなります。そのため開発速度が求められるスタートアップ事業などでは動的型付け言語が選ばれることが多いです。

  • 開発時にプログラムの設計変更が予想されるプロジェクト

ソースコード上で型定義を行わないため、開発途中で型などの設計を変更しやすいことは動的型付け言語の利点です。この利点は例えばアジャイル開発などで発揮されます。開発を進めていく上で設計の仕様変更が考えられるということは、メリットとして説明した「データ型の変動がある環境」ということです。細かい単位でプログラムの仕様が変わる可能性があるアジャイル開発では動的型付け言語が扱いやすいと言えます。

Pythonの型ヒントについて

Pythonは動的型付け言語です。変数・関数に型を宣言する必要はありません。しかし型を宣言しないことによるデメリットもありました。これをカバーするため、Pythonではバージョン3.5から型ヒントが導入されました。型ヒントとは変数にアノテーション(注釈)として型を示すことができるというもので以下のように記述します。

name: str = "Alice" #変数nameは文字列型と指定
age: int = 21 #変数ageは数値型と指定

型ヒントは静的型付けのように記述していますが、Pythonは動的型付け言語であり、型が示されていてもコンパイル時に型解釈が行われるものではなく、また型の明示がなくても問題なく動作します。あくまで型のヒントを注釈づけるというものです。公式ドキュメントでも以下のように示されています。

Python ランタイムは、関数や変数の型アノテーションを強制しません。 型アノテーションは、型チェッカー、IDE、linterなどのサードパーティーツールで使われます。

このように型ヒントは開発時に各ツールのサポートを受けて静的型チェックを行えるというメリットがあります。例えばVScodeなどのエディタで型ヒントの指定通りにコードを記述しているかチェックを実行できます。これは実行時にしか型エラーが分からないという動的型付けのデメリットをカバーしています。その他型ヒントのメリットとして、開発時のコード補完の充実、コードの可読性の向上といったものがあり、静的型付けの利点を受けることができます。

まとめ

ここまで動的型付け言語のメリット・デメリットを踏まえた特徴を説明してきました。動的型付け言語は記述の簡潔性はあるもののシステム構築の上では重大なデメリットもあるため開発者にとっては好みが分かれやすいです。型の柔軟性・不確実さをメリットとするかデメリットとするか、また開発速度と実行速度がトレードオフの関係にある点を考慮することは、プロジェクトの特性によって言語選定を行う上で大切です。

しかしながら最後に説明したPythonの型ヒントのように動的型付け言語でもデメリットをカバーできるように言語は発展しており、開発環境・ツールもこういった機能が増えています。また動的型付け言語であるJavaScriptに型システムを付与したTypeScriptのように元々動的型付けである言語に静的型付けを可能にした言語もあります。近年では静的型付け・動的型付けの垣根が曖昧になっているとも言えるため、言語・技術を選定する際にはそれらの特徴を多角的に押さえていくことが求められます。

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事