![thumb_compiler_01](/placeholder.png)
コンパイラとは
![img_compiler_01](/placeholder.png)
コンパイラとは、人間が理解しやすい高水準言語のソースコードをコンピュータで認識できる低水準のコードに変換するプログラムを指します。高水準言語は人間に近い言語のため、編集作業を効率的に行うことができます。高水準言語で記述したソースコードは効率的に機械語やアセンブリ言語等に変換し、コンピュータで解釈できるようにする必要があります。
コンパイルとは、高水準言語のソースコードを低水準言語に変換する作業を指しますが、一般的にはコンパイラを実行する作業や工程を表します。
低水準言語とは
![img_compiler_02](/placeholder.png)
低水準言語とは、一般的には機械語またはアセンブリ言語を指します。コンピュータシステムは登場時には大型の計算機械で構成されていました。動作させるためには、直接機械が理解できる命令を入力する必要がありました。その命令を機械語と言います。機械語はバイナリで記述されているため、テキスト形式の言語としてアセンブリ言語が登場しました。
低水準言語はコンピュータ登場当初から用いられていますが、ハードウェア資源を最大限活用できるメリットがあるものの、人間にとって分かりにくいことやプロセッサに依存した記述が必要であり不便でした。同様に、プロセッサに関連してメモリ操作やI/O操作などのハードウェアを意識したコーディングが必要であり、より専門技術が求められていました。
高水準言語とは
高水準言語とは、低水準言語の使いにくさを解決するために人間が理解できる文法を定義し、開発効率を向上させたものです。小規模から大規模までのプロジェクトで編集作業を効率的に行うために、統合開発環境(IDE)の利用も欠かせなくなりつつあります。
ここでいう水準とは人間に近いものを高水準、機械に近いものを低水準と言います。品質やモノの良し悪しを表したものではありません。そのため、コンピュータ性能を重視したりメンテナンス性を重視したりするなど、用途に合わせて言語を採用していきます。
コンピュータ登場当初は低水準言語が必須でしたが、プロセッサの性能向上やOSの進歩により現在では高水準言語の利用が多数を占めています。
![](/placeholder.png)
インタープリタとは
インタープリタとは、ソースコードに記載されている命令文を逐次機械語に変換する形式をとるものを指します。対話型で逐次変換し、実行するためにコンパイラ型と比較すると実行性能は劣ります。代表的なインタープリタ言語としては、古くからBASICがあります。
現在の主要言語としては、Python・PHP・Rubyがあります。また、シェルも対話型言語として位置づけられ、Javaはインタープリタとコンパイラを併用しています。インタープリタは、コンパイル作業の工程が不要であり、統合開発環境を用いて効率的に開発作業が進められるので人気があります。
コンパイラではコンパイル時に構文チェックによりエラーが検出できますが、インタープリタでは実行時にランタイムエラーと呼ばれるエラーが発生することがあります。場合によってはエラー発生時のコードを用意する必要があります。
![](/placeholder.png)
![](/placeholder.png)
コンパイラの種類
![img_compiler_03](/placeholder.png)
コンパイラの種類ですが、コンパイラ言語に対応し提供されています。具体的なコンパイラ言語としては、科学技術演算のFORTRANやPascal、ビジネス向けのCOBOLなどが使われています。近年では、C言語やC++・C#、Javaが代表的な高水準言語として活用されています。同じ言語においても最適化コンパイラの性能の違いにより、実行速度に差が出ることがあります。
![](/placeholder.png)
![](/placeholder.png)
コンパイラの仕組み
コンパイラは各言語で記述したソースコードを読み込み、オブジェクトコードと呼ばれる中間コードを生成します。中間コードはプロセッサが解釈できるバイナリコードで、アセンブラがアセンブリ言語を解釈して生成します。中間コードはリンカまたはローダと呼ばれる連結プログラムにより、実行コードに統合されます。
ここからコンパイラの具体的な処理について説明します。以下がコンパイラの主要な処理フェーズです。
・プリプロセッサ 言語に規定されている拡張機能やコンパイラ固有の指示語・マクロを解釈し、言語規定に沿ったコードに変換します。例えば、C言語では#defineにおける定数定義や、#includeによるヘッダ読み込み、#ifによるコード生成条件等の”#”で始まる文字列を解釈します。
・コード解析 以下のフェーズに細分化され、コード解析を実行します。
字句解析:ソースコードを正規表現にしたがってキーワードや識別子等の要素(トークン)に分割します。 構文解析:字句解析で分解したトークンを解析し、構文のツリー構造を生成します。 意味解析:構文ツリーが正しいか内容をチェックし、コード生成の準備を行います。
・最適化 最適化の指定により不要な処理を変更したり、より高速処理可能なコードに置き換えたりします。詳細は以降で説明します。
・コード生成 意味解析で正常と判断されたコードは、アセンブリ言語に変換されます。コンパイラによってはアセンブラを利用せずに直接オブジェクトコードが生成されます。
コンパイラの最適化機能
コンパイラの最適化とは、コンピュータの処理を効率的に行うためにコンパイル時にコードを最適化し、実行速度と効率を向上させる機能を指します。従来、手作業で実施していたコードの最適化を自動的にコンパイラが実行してくれます。
コンパイラの最適化機能により、簡単に高水準言語を用いて最適化されたコードを生成することが可能となります。代表的な技法としては、ループの最適化やコードインライン化等があります。実行時に統計プロファイルを取得し、追加最適化を行う場合もあります。このような分析手法の違いから同一言語においても、コンパイラの選択で性能に違いが生じることもあります。
おすすめのコンパイラ
コンパイラ言語としては、ビジネス向けにはC言語・C++・COBOL・Javaがビジネスロジックやデータベース処理に利用されます。汎用的に活用しやすいのがC・C++・Javaで、モバイルデバイスでも開発に利用できます。
ウェブアプリケーションではJavaの他、スクリプト等のインタープリタ系言語が良く利用されています。そのためコンパイラ言語を利用しないことも多いです。
従来はコンパイラを単体で比較選定し開発することが多かったのですが、現在は用途別に提供される多様なIDEを用いて統合開発することが増えています。コンパイラやインタープリタはIDEに組み込まれていますので、お気に入りのIDEを選択するのが有効です。
おすすめのIDE
以下が主要IDEです。利用環境やターゲットとなるアプリケーションに応じて選択することをおすすめします。
・Visual Studio マイクロソフト社のIDEでWindows・MacOSで動作します。以前は別提供だったVisual C++やVisual C#が、Visual Studioに組み込まれています。.NETの開発環境としても最適です。 【参考】:Visual Studio
・Eclipse IBM VisualAgeから共通プラットフォーム化がなされたことで利用が拡大しました。Javaをはじめ、プラグインでC++・C#・COBOL等に対応可能です。 【参考】:ECLIPSE IDE
・Xcode アップル社が提供しています。MacOSやiOSのアプリケーション開発が可能です。C言語・C++・Swiftの開発が可能です。 【参考】:Xcode
・Android Studio Googleによって開発された、Java向けIntelliJ IDEAをベースとしたIDEです。Android向けに、C言語・C++・Java・Kotlinを用いて開発できます。 【参考】:ANDROID STUDIO 【参考】:IntelliJ IDEA
・JDeveloper オラクル社のIDEで、従来はJavaのIDEとして提供されていたJBuilderを記述し直しました。Web・データベース・Javaの統合開発が可能です。 【参考】:Oracle JDeveloper
この他IDE自体ではありませんが、旧ボーランド社のC++ BuilderやC++ Compiler等の製品は、エンバカデロ・テクノロジーズに移管され提供されています。コンパイラ製品を単体で比較する際に情報をご活用ください。 【参考】:Embarcadero
ソフトウェア資産を有効活用しましょう
![img_compiler_04](/placeholder.png)
現在IDEの利便性が高まり、アプリケーション開発の効率性が高まっています。多くのIDEでは、JavaのほかC言語・C++に対応します。コンパイラ言語は現在も主要な開発ツールですので、既存ソフトウェア資産が流用できれば移行性が高まります。IDEの選択を含めて開発生産性の向上について検討してみることをおすすめします。
![](/placeholder.png)
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから