コンパイラとは?構造や自作方法、おすすめのコンバイラの選び方を解説!インタプリタやアセンブラとの違いとは?
はじめに
プログラミングに携わるとコンパイルするという言葉をよく見かけます。
コンパイルという言葉に馴染みがなければ壁にぶつかるかもしれません。
今回は、コンパイラはどういうものなのか、コンパイラは何ができるのかなどについての紹介です。
コンパイラとは
プログラミング言語に携わるとコンパイルやインタプリタ、アセンブラは、外せない用語です。
どの単語もざっくりいえば人間と機械の言葉を繋ぐ役割を持つものです。
コンパイラとは、人間と機械の間に立ってお互いの言葉を翻訳するプログラムのこと。
少しややこしいですが、コンパイルは「人間の言葉を機械語に翻訳すること」を指します。
コンパイル(compile)に「~をする人(er)」を合わせたのが「コンパイラ(compiler)」です。
人ではありませんが、要するにコンパイラは「人間語を機械語に翻訳する者」といえます。
コンパイラは人間語で書かれたソースコードを読み込んで、コンピューターが理解できるように機械語へ翻訳するのです。
機械語を高級言語に変換するプログラムはコンパイルではなく、逆コンパイルです。
コンパイラの構造
コンパイラは、高級言語を翻訳します。コンパイラの構造は、機械言語(低級言語)へ翻訳するためにいくつかのフェーズを経ます。
ソースコードから機械語のコードを生成するまで大まかに分けて5つのフェーズがあります。まず、ソースコードを受けての字句解析です。
キーワードや括弧、カンマなどを識別するのです。
文字列解析を解析したら次のフェーズが構文解析になります。
構文解析は、字句、言い換えるとトークンの言語仕様をチェックするフェーズです。
チェックが完了したら解析木にトークンをはめ込みます。
解析木にトークンを当てはめたら中間コードを生成するフェーズです。
解析木を中間言語表現へ移行します。
中間言語表現に移行したらコード生成・最適化のフェーズです。
ここでは、処理速度を上げるためにプログラムのサイズを小さくし、中間コードへ変換します。
中間コードを生成したら次のフェーズがコード生成です。
コード生成のフェーズは、5W1Hのように最後機械語になる前の段階できちんとコンピューターに伝わるように翻訳検証を行います。
このフェーズが終わると機械語が生成されてプロセスが完了です。
コンパイラの構造はこのフェーズに密接してエラーハンドラーがあります。
コンパイラの重要な機能で、ソースコードのエラーをチェックしてレポートする検診プロセスです。
コンパイラ自作支援システム
コンパイラを自作するために、最もメジャーな方法はC言語を使うことです。
他のプログラミング言語でもできなくはありません。
また、最近は、オンラインでコンパイラを作成することも可能です。今回は、オンラインで作れるコンパイラ自作支援システムを紹介します。
piaza.io
piaza.ioは、オンラインでコンパイラを自作するのに使いやすいシステムです。
コンパイラ型のプログラミング言語だけでなく、インタプリタ型や他の言語にも対応しています。
コードを書いた後、「Run」ボタンをクリックするとコンパイルを実行することが可能です。
複数ファイルのコンパイルも対応しているだけでなく、ユーザー登録なしで使える手軽さがおすすめのシステムになります。
CodingGround
CodingGroundは、piaza.io同様、ユーザー登録なしで利用ができます。ただ、欠点としてコードを保存することができないので注意が必要です。
CodingGroundは、コンパイルをボタン一つで実行できることやプロジェクトをダウンロードできることなど気軽に利用できるシステムです。
C++ shell
C++のみになりますが、コンパイルを練習するのに最適なシステムは、C++ shellです。こちらもユーザー登録なしで利用できます。
コンパイル型プログラミング言語のC++のみを対象としたシステムだけにコンパイルオプションが豊富です。
コードを記入後、「Run」ボタンでコンパイルを実行できます。
codepad
codepadは、コンパイル言語やインプリタ言語など多数の言語に対応しています。
エディタにコードを記入して、「Run」ボタンでコンパイルの実行が可能です。
複数ファイルがアップできないのが難点ですが、ユーザー登録なしで利用できるところは重宝できます。
CodeChef
CodeChefは、ユーザー登録なしで使えるだけでなく、他のオンラインシステムと違いファイルアップロードが可能です。
多数の言語に対応していることや作ったコンパイルをファイルとしてダウンロードもできます。
コンパイラの選び方
コンパイラを選ぶ時は、コンパイラ言語の得手不得手や学びやすさ、市場のトレンドなど様々な要素があります。
コンパイラを学ぶに当たり、特に初心者が注目すべき選び方のポイントは、「学びやすさ」と「使用目的」です。
学びやすさ
コンパイラ型のプログラミング言語を学ぶ上でのポイントは、学びやすさです。
特にプログラミング初学者が、いきなり難易度の高いプログラミング言語を選んでしまうと挫折してしまう可能性があります。
学びやすいプログラミング言語を選ぶポイントは、参考資料が多いものやコードがシンプルなものです。
コードが複雑すぎるプログラミング言語や参考資料が少なすぎるプログラミング言語は、学ぶモチベーションを下げてしまいます。
使用目的
次にポイントとなるのは、使用目的です。コンパイラ型のプログラミング言語を選ぶ際に使用目的を明確にすることがポイントになります。
例えば、求人件数が多いコンパイル型プログラミング言語を学ぶと仕事に直結できます。
目的があれば、学習のモチベーションを高く保つことが可能です。逆に使用目的がはっきりしていないと挫折してしまいます。
何を目的にコンパイル型プログラミング言語を学ぶか必要としているのか、使用目的をはっきりさせることがポイントです。
おすすめのコンパイラ
コンパイラ言語は、どれがおすすめで、どれから始めるのがいいのかわかりにくい可能性があります。
それは、コンパイラ系プログラミング言語の種類が豊富だからです。コンパイラ言語は、人気の言語や学びやすい言語が色々あります。
ここでは、おすすめのコンパイラ言語をいくつかピックアップしての紹介です。
C言語
C言語と聞いて知らない人はいないくらい有名なプログラミング言語です。コンパイラ型プログラミング言語の代表格になります。
1970年代に誕生してから年月が経っていますが、未だに人気と需要が高いプログラミング言語です。
C言語は、長い間ロボット開発やOS・ソフトウェア開発に携わってきています。それは今も変わらず続いていて、多くの派生語がある言語です。
引き続きロボット開発やソフトウェア開発の現場で広く普及しているため、需要は高いため、おすすめのコンパイラ言語です。
Java
Javaは、JavaScriptと混同する場合がありますが、Javaというプログラミング言語があります。
コンパイラ型プログラミング言語の代表で、近年は、インフラに広く普及している言語です。
Javaは、OSを選ばず、どのOSでも対応することができることや処理速度が早いところが特徴になります。
Javaを扱えるエンジニアの需要がまだ高く、コンパル型プログラミング言語の中では人気の高く、キャリアアップも見込めます。
プログラミングスクールやオンラインスクールなど学ぶ資料が豊富なのもJavaの特徴です。
C++
C言語の派生として有名なプログライング言語です。C言語に足りなかったオブジェクト指向を加えたのがC++とされています。
C++は、スマホアプリやWebアプリの開発に広く普及しているコンパイラ型プログラミング言語です。
C++は、一般的に普及しているプログラミング言語より動作速度が早いため、大規模な開発に好まれています。
スマホアプリやWebアプリの開発現場ではまだまだ需要のある言語なのでC++の知識があれば、キャリアチェンジなどに活かすことが可能です。
C#
VR開発現場に普及しているコンパイラ型プログラミング言語は、C#です。名前の由来どおり、C言語がベースとなっています。
Javaと共通しているところが多く、C#を学習するとJavaも理解できるようになるところがメリットです。
Objective-C
コンパイラ型プログラミング言語の中でも少しマニアックなのがObjective-Cです。
Objective-Cは、Macユーザーの間だけで普及しているので普及エリアが限定的ですが、Macのソフトウェア開発に普及しています。
コンパイラとインタプリタ
コンパイラとインタプリタは、どちらもよく聞きます。
プログラミング言語を学ぶ上でコンパイラ、インタプリタとアセンブラは混同しがちです。
ここでは、まずコンパイラとインタプリタの役割や違いについて紹介します。
役割
コンパイラとインタプリタの役割は、基本的にほぼ同じです。コンパイラとインタプリタは、共に高級言語を翻訳する役割を担います。
ただ、実行の仕方が違うことで区別される言語です。
違い
コンパイラとインタプリタの違いは、まずソースコードの翻訳の仕方です。コンパイラは、全てのコードを一括して機械語へ翻訳します。
インタプリタは一つ一つ丁寧に言葉を解釈して、それに対応するインタプリタのサブルーチンで翻訳します。
インタプリタは「一行一行翻訳していく」ものだと勘違いされがちですが、これはインタプリタの中にある一つのやり方に過ぎません。
実行課程においてコンパイラとインタプリタの違いは、処理速度です。
一括して全てのコードを機械語に翻訳するコンパイラは、インタプリタより処理速度が早くなっています。
一方で、一つ一つ機械語へ翻訳するインタプリタは、ミスなどの確認や修正がしやすいところがコンパイラとの違いです。
コンパイラとアセンブラ
コンパイラとアセンブラも、よく混同されます。どちらも同じソースコードを機械語に翻訳するための言語です。
根本は同じ役割を担いますが、アセンブラとコンパイルは、役割や言語としての違いがあります。
ここでは、コンパイラとアセンブラの役割と違いについての紹介です。
役割
コンパイラとアセンブラは、それぞれ役割があります。
根本的には、ソースコードを機械語に翻訳することです。しかし、詳しくみると役割が違います。
アセンブラは、アセンブリ言語といわれるMASMが代表的なプログラミング言語です。
アセンブリ言語は、コマンドが基本的に機械語とマンツーマン対応しています。
一方コンパイラは、高級言語を機械語に翻訳します。
高級言語は、人間の言語に比較的近いプログラミング言語です。
高級言語の代表格は、有名なC言語やJavaなどになります。
コンパイラ言語は比較的アセンブラ言語に比べると身近です。
違い
アセンブリとコンパイラの違いは、翻訳対象です。
アセンブリは、機械の動作を一対一で機械と対話して変換します。
コンパイラは、機械の動作ではなく、人間がわかりやすいように翻訳することです。
コンパイラ最適化
コンパイラ最適化は、プログラミング言語を最適に機械語へ変換する処理プロセスを示します。
プログラムをコンパイルするために、コンパイラ最適化には種類があります。最適化技法やスコープといわれる処理方法です。
ここではメジャーなコンパイラ最適化のスコープを紹介します。
ループ
ループ最適化は、for文などを最適化するプロセスです。ループには多くの最適か技法があります。
機能変数解析という変数が簡単な計算で処理される場合、そのループ変数を更新するときは同時に更新できる技法です。
他には、分裂という1つのループを分裂する技法や融合という複数のループをまとめる技法もあります。
ループの中身や回数がコンパイル時にわかっているならコードを複数回配置、ループ条件のチェック・分岐回数を減らすことが可能です。
これをループ展開といいます。
並列性を高めるためには、条文を外してループのコピーを活用する条件文の入れ替えも可能です。
データフロー
データフロー最適化は、データフロー解析してデータがきちんと伝わるかどうかを検証するプロセスです。
共通式削除という重複した同じ式を省略や削除したり、定数畳み込みや定数伝播という定数の式を変換するプロセスがあります。
まとめ
プログラミング言語を使う上でコンパイラが必要な仕組みであることを説明しました。
コンパイラという単語だけではなかなどういうものかイメージしづらいですが、プログラミング言語には欠かせないプロセスです。
toiroフリーランスは、SHIFTグループがプライムとして参画している独自案件をフリーランスエンジニア向けに紹介する唯一のプラットフォームサービスです。
エージェントによるサポートもありますので、ご利用を検討してみてはいかがでしょうか。