プログラミング言語には様々な種類があり、その特性によって分別することができます。その一つが型付けの形式による静的型付け言語・動的型付け言語の区別です。こちらの記事では型付けとは何か、その必要性について解説し、併せて静的型付け言語の特徴についてまとめています。
動的型付け言語の特徴については次の記事をご覧ください。
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を処理する際にデータ型が明確な静的型付け言語ではかえって大変になったりという点もあります。静的型付け言語、動的型付け言語それぞれのメリット・デメリットはトレードオフの関係です。しかしながらプログラミング言語はデメリットをカバーするため発展を重ねています。各言語の特徴を押さえ、開発するシステムに求められる性質に応じて最適な言語を選定できるとよいでしょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2022.11.13
【初心者入門】JavaのList(配列)について
こちらの記事では、プログラミング言語Javaの配列操作について解説します。
- プログラミング
2024.06.30
エンジニア初学者におすすめ GraphQLの基礎と簡単なクエリ例
GraphQLは、データを効率的に取得し、必要な情報だけを簡単に取得できる優れたツールです。この記事では、GraphQLの基礎を学び、簡単なクエリを実行する方法を紹介します。これを通じて、皆さんがGraphQLの魅力を理解し、実際に使いこなせるようになることを目指します。
- プログラミング
2022.11.30
【初心者入門】Python printの使い方について
こちらの記事では、Pythonのprintの使い方について解説します。
- プログラミング