低水準言語とは?
まずは、低水準言語と対比して用いられる高水準言語について解説します。それぞれどのような違いがあるのか、プログラミングの現場ではどう活用されるのかについてまとめました。
低水準言語とは
低水準言語とは、人間が理解しやすいプログラミング言語のうち、コンピュータ(CPU)が直接理解して処理できる「機械語」または機械語に近い構造を持った言語のことです。「低級言語」とも言い、これと対を成す言語が「高水準言語」です。
低水準言語は電流を通さない「0」と電流を通す「1」のみでコードを表現するため、人間には理解できない数字のコードが羅列されます。具体的には以下のようなコードです。
00000101000010000000000000000100
10100000000000000000000010001100
11111100000000000000000000000000
人間がこのコードを読むことは難しいですが、コンピュータからするとこれしか理解できないため「低水準」の言語となります。
高水準言語とは
高水準言語とは「高級言語」とも呼ばれ、低水準言語と対比して用いられる用語です。人間が理解できる文法(セマンティック)を定義し、開発効率を向上させたものです。
簡単に言えば、高水準言語は「Hello Worldと画面に表示」と書くと、瞬時に表示できるのが「高いレベル・高水準」の言語です。プログラマーがプログラミングを行う際は高水準言語を用います。代表的な高水準言語の一覧は、以下の通りです。
・BASIC ・FORTRAN ・COBOL ・C言語 ・C++ ・Java ・PHP ・Ruby ・Pascal ・LISP ・Delphi
低水準言語と高水準言語の違い
ここでいう水準とは、人間に近いものを高水準、機械に近いものを低水準と言います。モノの良し悪しを表したものではありません。どちらも品質は高いため、コンピュータ性能を重視したりメンテナンス性を重視したりするなど用途に合わせて言語を採用していきます。
低水準言語と高水準言語の大きな違いは、「低水準言語=機械語に近い」「高水準言語=人間の言語に近い」です。低水準言語はコンピュータの細かい動作まで定義できますが、コードが細かすぎるため人間が理解・処理ができません。一方の高水準言語はコンピュータに依存しないため人間が理解しやすい特徴があり、プログラミングを行う際は高水準言語を使用します。
低水準言語の種類
低水準言語には種類があり、「機械語」「アセンブリ言語」があります。ここでは、それぞれがそういった言語なのか解説します。
機械語とは
プログラミング言語といえばBASIC・C++・Java・PHPといった高水準言語を指しますが、これらは人間がプログラムしやすいように開発した言語で、コンピュータ(CPU)が直接理解できる言語ではありません。
コンピュータ(CPU)自体が直接理解できるのは、0と1の2進数のバイナリデータで表されている機械語のみです。コンピュータが理解できる唯一のプログラミング言語のため「マシン語」とも言います。この2進数で表す処理のかたまりを「プログラム実行コード」と言い、人間にはただの数字が羅列してあるだけにしか見えずコードを読むことができません。
プログラミング言語(高水準言語)で記述されたコードは機械語に変換されてから実行されるため、機械語を直接プログラミングで使うことはほぼありません。
アセンブリ言語とは
0・1のみでコードを記述する機械語を、さらに人間が理解しやすいように簡略化した英数字や記号で1対1に対応させたものをアセンブリ言語と言います。プログラミング言語(高水準言語)と異なる点は、機械語に1対1で対応しているため「アセンブリ言語=機械語」と言えます。
プログラム開発者は機械語に相当するオペコードをニーモニックで表すことで、テキストファイルにソースコードを編集・格納していきます。また、機械語の処理群を定義したマクロを用いて保全性を高めていくことが多いです。
アセンブリ言語はソースコードの記述しにくさがありますが、サイズが小さいため実行ファイルの速度が速いのが特徴です。
低水準言語の特徴
低水準言語にはさまざまな特徴があります。ここでは、低水準言語のメリット・デメリットについて解説します。
ハードウェア固有の処理が可能
低水準言語のメリットとして、ハードウェア固有の処理が可能であることが挙げられます。具体的には、高水準言語が対応していない専用CPUでも動作でき、LSIやASIC等に搭載するカスタムコードを記述することができます。
また、BIOSやブートストラップローダ・割り込みハンドラはハードウェア固有の処理を実施するため、低水準言語で記述する必要があります。
OSの機能を最大限活用することが可能
もう1つのメリットとして、OSの機能を最大限活用することが可能であることが挙げられます。具体的には、メモリ操作やI/Oの制御・CPUモードを用いた特権モードを使用する方法として、低水準言語で記述することが可能です。
デバイスドライバーも現在も一部のコードは低水準言語で記述され、システムを最適動作させています。
低水準言語のデメリット
低水準言語のデメリットは、人間の理解できる言語ではないことです。ソースコード維持のための保全性が低くなることがあり、機種依存度が高いためアプリケーションの移行がしにくいという特徴があります。
現在では、高水準言語との関数の相互呼び出しにより保全性を向上させるなど、低水準言語のマクロ機能により保全性は大分改善されていますが、プロセッサ変更の際の移行作業は簡単ではないのが実態です。
低水準言語の開発環境
低水準言語の開発環境はターゲットとなる実行OSの変換プログラムを用いて、アセンブリ言語のソースコードプログラムを変換し、オブジェクトコードを生成し実行プログラムを作成します。
低水準言語を用いた開発の作業工程
低水準言語では、機種依存性が高いために稼働環境を用いてアセンブリ言語の変換プログラムを使用し、オブジェクトコードおよび実行プログラムを作成します。
開発のデバッグにはシンボルコードを埋め込んだりデバッガを用いたりしますが、1度品質が確保されたコードは関数化されるためライブラリーとして使用することもあります。
アセンブラとは
アセンブラとは、アセンブリ言語のソースコードをオブジェクトコードに変換するプログラムのことを指します。具体的な機能は、アセンブリ言語で記述されたソースコードから命令指示語となるニーモニックを実行可能なオペコードに変換し、オブジェクトコードを生成します。ソースコードはテキストファイル形式で記述します。
オブジェクトコードはプロセッサが理解できる機械語で、アセンブラを用いることで機械語プログラムへ変換していきます。同様に、マクロ機能で命令群をインライン展開することで開発効率を向上させたり、実行時の動作を向上させたりする役割があります。
コンパイラとは
コンパイラとは主に高水準言語で用います。高水準言語は人間に近い言語のため、ソースコードを効率的に解釈する必要があります。コンパイラは高水準言語で書いたソースコードを機械語へ翻訳することができます。プログラミングの世界における人間語と機械語の翻訳機能のようなものです。
近年は最適化コンパイラが登場し、高水準言語を用いて最適化されたコードを生成することが多くなりました。その分コンパイラの最適化の効率も求められてきており、開発環境の選択が重要になりつつあります。
インタープリタとは
インタープリタとは、ソースコードに記載されている命令文を1つずつ解釈しながら機械語に変換する形式をとるものを指します。コンパイラとは対照的な方式です。BASICが代表的なインタープリタ言語で、近年使われているJavaはインタープリタとコンパイラを併用しています。
インタープリタはコンパイル作業がないため簡単に開発を進められますが、実行時にエラー(ランタイムエラー)が発生することもあります。エラー発生を想定して開発を進めなければいけません。
低水準言語学習に求められるスキル
低水準言語は機種依存性が高いため、知識習得は簡単ではありません。学習にはハードウェアを理解する必要があるため、マイコンボードやRaspberry Pi(ARM)等のキットを用いるのが良いでしょう。キットを使い、CPUおよびレジスタ・メモリ・I/Oについて理解を深めます。
また情報処理技術者試験では、COMET IIのハードウェアやCASL IIアセンブラが定義されています。その情報を参考にするのも良いでしょう。
低水準言語の互換性
低水準言語はCPUの内部回路の動作に直接対応しているため、他機種との互換性がありません。プロセッサに依存するため、CPUアーキテクチャのCISCとRISCで大きく異なります。ましてやIntel社の製品でも32bitと64bitで異なり、命令セット(オペコード)も投入世代によっても異なります。ターゲット環境で採用されるプロセッサ製品についてハードウェアの細部までしっかりと理解しなければなりません。
低水準言語のプログラム移行手順
低水準言語のプログラム移行は難易度が高い作業です。現行環境と移行先の環境で採用されるプロセッサ・I/O・OSの違いを調査する必要があります。
実際の移行手順は、ターゲットとなる移行先のオブジェクトコードを生成するクロスコンパイラやアセンブラを活用します。場合によっては、機械語のコードから逆アセンブラによりソースコードを抽出します。また、現行稼働環境のメモリをコアダンプ解析・リバースエンジニアリングすることでどのように動作するのか考える必要もあります。
低水準言語の特徴と開発手法をマスターし、スキル向上を目指そう
低水準言語は電流を通さない「0」と電流を通す「1」のみでコードを表現するため、人間には理解できない数字のコードが羅列された言語です。ハードウェア固有の処理が可能、OSの機能を最大限活用できるなどのメリットがありますが、機種依存度が高いためアプリケーションの移行がしにくいという特徴があります。
低水準言語はコンピュータに近い言語のため、コンピュータシステムの性能や機能を活かすために必要です。必要な開発方法を理解し、実際に活用できればプログラム開発の選択肢が広がり自身のスキルアップも期待できるでしょう。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから