1. ホーム
  2. 記事一覧
  3. 静的型付け言語とは何か?特徴や適したプロジェクトを解説

2023.01.31

静的型付け言語とは何か?特徴や適したプロジェクトを解説

プログラミング言語には様々な種類があり、その特性によって分別することができます。その一つが型付けの形式による静的型付け言語動的型付け言語の区別です。こちらの記事では型付けとは何か、その必要性について解説し、併せて静的型付け言語の特徴についてまとめています。

動的型付け言語の特徴については次の記事をご覧ください。

https://envader.plus/article/79

「型を付ける」とは

型とは何か

型とはそもそも何かについて説明します。

普段人間が書くプログラムには数値や文字列、配列、オブジェクトなど様々なデータが記述されています。それらは人間が読んで理解することができますが、プログラムを実行するコンピュータにとっては数字の羅列に過ぎません。またコンピュータ(物理メモリ)においては処理できるデータ数には上限があります。データに有限範囲がある中で、コンピュータが理解できる命令=機械語に変換する際に、数字の羅列にそれがどんなデータでメモリの使用量はどれくらいかという意味を与えることが必要になります。どんなデータかというのは先に挙げたような数値、文字列といったデータの種類であり、これが「型」の正体です。

型付けとは何か

型付けとは、前項で説明した「型」をプログラムのコード上のデータに定義づけることです。ここで型付けをいつ誰が行うかという点が静的型付けと動的型付けの違いとなります。

まず静的型付けは、変数や関数などのデータ型をコードを書く時点で宣言します。型をデータに定義づけることが型付けと説明しましたが、実際にはデータが格納される変数・関数に型を指定するのが静的型付けです。コード上で予め型を決定しているため、実行時にはすでに決められた型の情報に従ってソースコードが機械語に変換されます。

一方で動的型付けは、コード上で型の定義を行う必要がありません。コードを書く際には変数や関数にどんなデータが入ってくるかは決まっていません。プログラムの実行時にコードが解釈されてデータに対して型の決定が行われます。

次項からプログラムの実行形態と型付けの関係、静的型付けと動的型付けのメリットとデメリットについて説明していきます。

コンパイルとインタプリタ

プログラミングにおける型付けを理解するために、まずプログラムの実行形態について押さえておきます。

プログラムを実行するのはコンピュータですが、人間がソースコードとして記述するPythonやJavaといったプログラミング言語はコンピュータが理解できるものではありません。コンピュータが理解できるのは0か1の数値の羅列、つまり2進数です。人間が書いたプログラムは2進数の文字列=機械語に変換する必要があります。

そしてプログラミング言語は変換する方式によってコンパイル方式とインタプリタ方式に分けられます。

コンパイル方式について

コンパイルとは「翻訳」を意味します。開発者が書いたソースコードを一旦全て機械語に変換(翻訳)し、機械語に翻訳されたプログラムを実行する形態がコンパイル方式です。翻訳するプログラムをコンパイラと言います。日本語に翻訳された外国語の文書を読むようなイメージです。

メリットは実行速度の速さです。全て翻訳されたコードを実行するため速度は速くなります。外国語の文書を読む時に一つずつ意味を調べるのではなく、はじめから母国語に翻訳されていればすらすら読めるというイメージです。デメリットは実行前にコンパイルという段階を挟まなければならないこと、一度コンパイルすると元のソースコードは残らないことです。元のソースコードがないということは、実行時に「型」が不明だとしても辿ることができません。

インタプリタ方式について

インタプリタ方式では、開発者が書いたソースコードを一つ一つ機械語に変換(翻訳)しながら実行も行います。イメージは、外国語の文書を読む時に一行ずつ意味を解釈したり通訳を介して外国語話者と会話するようなものです。

インタプリタ方式は翻訳という作業を挟まずにソースコードをすぐに実行できるというメリットがあります。デメリットは実行速度の遅さです。イメージとして述べたように、元のコード(外国語の文書)を一つ一つ解釈しているため実行速度(文書を読む速度)は遅くなります。

プログラムの実行形態と型付けとの関係

静的型付けにおいてはソースコードの時点で型が定義されているため実行時に一つ一つ解釈する必要はありません。そのためコンパイル方式で実行される言語は静的型付け言語が多くなっています。対して動的型付けはプログラムの実行時に型が解釈されるので、ソースコードを一つずつ解釈して実行まで行うインタプリタ方式の言語で採用されています。

このことから静的型付け言語=コンパイラ型言語、動的型付け言語=インタプリタ型言語とされることが多いですが、必ずしもそうではありません。静的型付け言語でも動的な型を扱えたり、動的型付け言語でも型を予め指定したりすることができるものもあります。

静的型付け言語について

静的型付け言語の代表例としては以下の言語があります。

  • C言語
  • C#
  • Java
  • Swift
  • Go

静的型付け言語とは

先に説明したように、プログラムを実行する際に型の情報は不可欠です。プログラムを実行する物理メモリにはデータ量に上限があるためです。しかし物理メモリが解釈できる機械語には型の概念は存在しません。物理メモリにとってはデータがどのくらいのメモリ領域を使用するかという情報を必要とします。例えばchar型では1byte、int型では4byteといった情報です。型を定義する理由はここにあります。

以下のコードはJavaでの記述例です。このように引数a,bと返り値sumのそれぞれにint型を指定しています。

public int add(int a, int b) {
    int sum;
    sum = a + b;
    return sum;
}

このように静的型付け言語は人間が書くソースコードの時点で型を定義しています。つまりソースコードがすでに持っている型の情報を元にコンパイラがソースコードを機械語に翻訳することができます。

そして変数や関数に型を予め定義するということは、ソースコード上で始めに定義した型以外のデータはその変数や関数では使えません。もしも定義された型と違うデータが入った場合はコンパイル時にエラーになります。どういうことかというと、ここでプログラムの実行形態の話が影響します。

静的型付け言語のほとんどがコンパイラ方式で実行されます。コンパイラ方式とはプログラムの実行前にソースコードを一旦全て翻訳することでした。つまりソースコード上で始めに定義された型と異なるデータが入っていた場合、実行前のコンパイル時にエラーが出ます。

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

  • プログラムの実行前にバグ・エラーを特定できる

前項で述べたように、静的型付け言語では予め型定義されたソースコードを実行前に翻訳(コンパイル)します。コンパイルの時点で定義と異なる型のデータがあればエラーが発生します。エラーの発生は好ましくないものですが、実行前にデバッグを行えることは大きなメリットです。

  • 最適なメモリ領域の割り当てが可能になる

ソースコードに型が定義されているということは、どの型がどれだけ使われているか分かります。そのためプログラムの実行前に必要なメモリ領域が把握できます。動的型付け言語ではプログラムを実行するまで型が分からない=使用するメモリ領域が予想できないことがほとんどであるため余分にメモリ領域を確保しておく必要があります。

  • パフォーマンスの向上

上記に伴って、メモリ領域を最小限に押さえられるということはその分のメモリを他の処理に使用することができます。例えば数値の演算において整数だと分かっていれば小数を考慮する必要がないためメモリの使用を最小限に抑えることができます。また型が予め宣言されているためコードを一行ずつ解釈する必要がないことも処理を高速化しています。

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

  • 記述に手間がかかる

静的型付け言語では全ての変数に必ず型を宣言しなければならないため、コードの記述量が増えます。見た目もシンプルではなく記述量が多いことから、初学者にとっても学習の難易度は高く感じることが多いでしょう。

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

  • 大規模なプロジェクト

静的型付け言語は型の整合性についてチェックを厳密に行うことができ、したがってプログラムが堅牢になります。また型定義がコード上で示されているため開発に関わる人数が多くなっても開発者はスムーズにコーディングを行うことができます。これらのことから、大規模なプロジェクトにおいては静的型付け言語が適しています。

  • 速度や保守性を求められるプロジェクト

また静的型付け言語は先に説明したように高速で堅牢です。そのため速度が求められるゲームの開発やデータの保守性を求められる金融系などにおいては静的型付け言語が適しています。

型推論について

型推論とは、変数や関数に必要最小限の型を指定(型定義)することで、そこから型を「推論」できるというものです。静的型付け言語の機能として近年増えてきています。

型の推論が可能になると全ての変数・関数に型を宣言する必要がなくなります。これは静的型付け言語のデメリットであるコーディングの記述量の多さをカバーしています。一方、型の宣言がなくなるため人間の目で見てコードから型の視認性が落ちるというデメリットもあります。

変数に型を宣言しない点は動的型付けと似ていますが、静的型付け言語の型推論においては型が明示されていないだけで定義はされています。動的型付け言語では型の定義は行われていません。動的型付け言語では型が決定するのはプログラムの実行時ですが、静的型付けの型推論ではコンパイル時にコンパイラが型を推論して決定します。そのためコンパイル時に型の整合性チェックを行うことができるため、静的型付け言語のメリットであるコンパイル時にエラーが出る=プログラムの実行前にデバッグを行うことができるという点は踏襲しています。

まとめ

この記事では静的型付け言語についての特徴と、それに伴うメリット・デメリットについて説明しました。静的型付け言語は型が自明であることから共同開発がしやすかったり高い堅牢性・保守性から長期的かつ大規模なシステム構築に向いていたりという点から開発者には好まれやすいです。

しかし近年流行の言語は動的型付けが多かったり、WEBアプリのデータ交換形式として主流のJSONを処理する際にデータ型が明確な静的型付け言語ではかえって大変になったりという点もあります。静的型付け言語、動的型付け言語それぞれのメリット・デメリットはトレードオフの関係です。しかしながらプログラミング言語はデメリットをカバーするため発展を重ねています。各言語の特徴を押さえ、開発するシステムに求められる性質に応じて最適な言語を選定できるとよいでしょう。

エンベーダー編集部

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

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

関連記事