パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
プログラミング言語

プログラミング言語とはコンピュータプログラムを記述するための形式言語である。

その他の外部情報

本サイトでの解釈

かつてプログラミング言語はインタプリタとコンパイラの2種類あると教えられた。これらはプログラミング言語の実装手段なのでプログラミング言語の属性とするのは明らかに誤用だが、古くからの慣用として本サイトも従う。

インタプリタ言語とコンパイラ言語

N-BASICは間違いなくインタプリタ言語であり、C++は(本サイトを含むほとんどの運用において)コンパイラ言語である。"コンパイラ"あるいは"インタプリタ"はプログラミング言語を実装する実行ファイルの総称としても使われる。本サイトで使用するC++コンパイラはmingw-w64である。

N-BASICやC++と異なり、より現代的なプログラミング言語はコンパイラでアーキテクチャに依存しないバイトコードを生成し、アーキテクチャに依存するバイトコードインタプリタ(多くは仮想マシンと呼ばれる)がバイトコードを実行する。この処理は一般に多段化できる。

  • ソースコードをコンパイラ1がバイトコード1へコンパイルする。
  • バイトコード1をコンパイラ2がバイトコード2へコンパイルする。
  • ...
  • バイトコードN-1をコンパイラNがバイトコードNへコンパイルする。
  • バイトコードNのインタプリタがバイトコードNを実行する。

CPUを最終段のインタプリタと見なすこともできる。CISCのマイクロコードはCPU内部で処理されるバイトコードであるとさえ言える。このように眺めればコンパイラ言語とインタプリタ言語は相対的な定義と言えよう。

バイトコードを生成するプログラミング言語の多くはJITコンパイラで実装され、運用上はインタプリタ言語と区別できない。本サイトはインタプリタ言語の代表例としてPythonを参照するが、JITコンパイラで出力されたバイトコードをPython仮想マシンが実行している場合が多い。

動的プログラミング言語

インタプリタ言語は実行時にソースコードを解釈するため動的プログラミング言語として実装可能で、例えばオブジェクト指向プログラミングの多態性を容易に実現する(ダックタイピング)。バイトコードにソースコードに記述されている名前や型をメタデータとして保存するプログラミング言語は、インタプリタ言語と同レベルで動的プログラミング言語たり得る。

class Boy:
def GetName(self):
return "Jack"
class Girl:
def GetName(self):
return "Betty"
def WhoAreYou(kid):
print(kid.GetName())
WhoAreYou(Boy())
WhoAreYou(Girl())

コンパイラ言語も動的プログラミング言語とする事は可能とされる。しかしC言語を継承するC++は動的プログラミング言語ではなく、多態性の実現に仮想メンバ関数を発明する必要があった(Bjarne Stroustrup, The Design and Envolution of C++, Readings, Addison-Wesley, 1994; Readings, Addison-Wesley, 1998, pp.72-78)。

#include <iostream>
class Abstract
{
public:
virtual const char* GetName() const=0;
};
class Boy:public Abstract
{
public:
virtual const char* GetName() const {return "Jack";}
};
class Girl:public Abstract
{
public:
virtual const char* GetName() const {return "Betty";}
};
void WhoAreYou(const Abstract& kid)
{
std::cout<<kid.GetName()<<std::endl;
}
int main()
{
WhoAreYou(Boy{});
WhoAreYou(Girl{});
return 0;
}