プログラミングを学んでいると、様々な言語の種類があることに気付かされます。
「コンパイラ言語?インタープリタ言語?どれがどれだっけ??」
「みんな同じ プログラミング言語 じゃないの??」
こんな疑問にぶつかることもあるのではないでしょうか?
今回は、Web制作やシステム構築に使われる言語の、様々な種類について整理していきたいと思います。
目次
言語の種類
![言語マップ](https://codes101.tech/wp-content/uploads/2022/09/9cd440581be46be09525a1dfc9ec1915-1024x729.png)
上の図のように、様々な言語がシステム構築に使われています。
- プログラミング言語
- コンパイラ言語
- インタープリタ言語
- クエリ言語
- マークアップ言語
- スタイルシート言語
etc…
このうちで、 プログラミング言語 と呼ばれるものは「コンパイラ言語」「インタプリタ言語」になります。
その他のクエリ言語やマークアップ言語、スタイルシート言語などはプログラミング言語のうちに入りません。
これから一つずつ見ていこうと思うのですが、その前にまずはコンパイラとインタープリタについて説明しておきましょう。
コンパイラとインタープリタ
プログラミング言語は人間が機械に命令するための言語です。
そのため、人間が書きやすい、読みやすい構文で作られています。
一方、機械が理解できるのは「0」「1」というビッドの羅列になります。これを機械語、あるいはマシン語と呼びます。
そのため、機械が命令を理解して処理を実行するためには、プログラミング言語でかかれた命令を機械語に翻訳してあげる必要があります。
そのための翻訳機が「コンパイラ」あるいは「インタープリタ」と呼ばれるものになります。
コンパイラ言語
コンパイラ言語とは、コンパイラを使って機械語に翻訳されるプログラミング言語です。
コンパイラは、プログラムを実行する前に全ての命令を機械語に翻訳してから一括で実行するのが特徴です。
メリットとしては、
- プログラムの実行速度が早い
- コンパイル時(=機械語に翻訳時)にプログラムの間違いをエラーで教えてくれる(コンパイルエラー)
などがあげられます。
逆にデメリットとしては、
- プログラムを動かすのにコンパイルするというひと手間が必要
- コンパイル自体に時間がかかる
などがあげられます。
代表的なコンパイラ言語にはJava, C/C++, Goなどがあります。
インタープリタ言語
インタープリタ言語とは、インタープリタを使って機械語に翻訳されるプログラミング言語です。
インタープリタは、プログラミング実行時にプログラムを一行ずつ機械語に翻訳して順々に実行するのが特徴です。
コンパイラが、全てのプログラムを一気に機械語に翻訳してから実行するのに対して、インタープリタはプログラムを一行ずつ翻訳しながら実行するという違いにご注意ください。
メリットとしては、
- コンパイルのようなひと手間がいらず、すぐに実行できる
- 一行コードのような簡単なプログラミングを手軽に試せる
などがあげられます。
逆にデメリットとしては、
- プログラムの実行速度が(コンパイラ言語に比べたら)遅い
というのがあげられます。
ちょっと一言
ところで、巷にあがってるネットの記事では、「コンパイラ言語は一括で機械語に翻訳してから実行するのでデバッグしづらい」「インタープリタ言語は一行一行プログラムを実行するのでデバッグが容易」とまことしやかに囁かれていますが、筆者はそう思いません。
プログラムを書くIDE(プログラムを書くためのエディタ)には大体デバッガが備わってます。
デバッガを利用すれば、インタープリタ言語のように逐一コードを実行することができますので、そういう点でのデバッグの難易度は、コンパイラ言語でもインタープリタ言語でもそう変わらないと思います。
むしろコンパイラ言語は「コンパイル時に構文チェックをしてくれる」ところが強みになっています。
インタープリタ言語ではプログラムを一行ずつ実行していくため、事前に構文エラーがあったとしてもインタープリタは把握できません。
それに対し、コンパイラ言語は誤ったプログラムの書き方をしていたら事前にエラーを出してくれます。
これは、100万行以上の大量コードを書くような大規模開発の際にはなくてはならないメリットです。
そういう点についてはインタープリタ言語はむしろ弱みになるでしょう。
ではインタープリタ言語は駄目なのかというと、そんなことはありません。
インタープリタ言語はお手軽にプログラムを試作できることに強みがあります。
コードをちょっと書いては動かしてみて、エラーが出たらまた書きなおして……のように試行錯誤しながら開発するのに向いています。
そのため、アジャイル開発やスクラムのようなインクリメンタルな開発で力を発揮します。
そういう点では、コンパイラ言語は一度修正したら再度コンパイルをしなければならないという手間が弱点になっています。
コンパイラ言語は手堅く堅牢にプログラムを構築できる一方、インタープリタ言語は状況の変化に機敏に対応できる、というのが本質なのではないでしょうか。
スクリプト言語
スクリプト言語に関しては定義が曖昧です。
よく引き合いに出される定義は、
- 学習しやすい
- 書くのが簡単で手軽
- 実行が容易
なものをスクリプト言語と呼んでいるようです。
スクリプト言語は何らかの区分ではなくて、お手軽に動かせるプログラミング言語をひとまとめにした俗称だと思ってください。
図では、スクリプト言語がインタープリタ言語を含むように描いていますが、これは巷でスクリプト言語と呼ばれるものの大半がインタープリタ言語に属しているからです。
ですが、インタープリタ言語には「インタープリタで解釈するプログラミング言語」という厳密な定義があります。
それに対してスクリプト言語はお手軽なプログラミング言語を指した俗称です。
似て非なるものであることを理解しておきましょう。
クエリ言語
クエリ言語はデータベースへの問い合わせ(クエリ)を行うための言語です。SQLが代表的なクエリ言語です。
クエリ言語はプログラミング言語ではありません。
データベースへの問い合わせに特化した言語で、DSL(ドメイン特化型言語)の一種に区分されます。
DSLについては下記の記事が参考になるでしょう。
https://anken-hyouban.com/blog/2021/09/13/dsl/#the_post_17
マークアップ言語
マークアップ言語は、文書に構造を与えるための言語です。HTMLやXMLなどが代表的なマークアップ言語です。
マークアップ言語はプログラミング言語ではありません。
文書に構造を与えるとはどういうことかというと、例えば下記のようなブログの文章を考えてみましょう。
今日は天気が良いですね
2022年09月22日 12:33
こんにちは。みなさんお元気にすごしていらっしゃいますか?
今日は秋晴れの空でとても過ごしやすい日ですね!
最初の文章がブログの記事の見出しになっているだとか、次の行は日時を表しているとか、その下から本文が始まったとか、文章のパーツごとに意味があります。
この文章を読むのが人間であれば、これらの意味は大体は察せられるはずです。
しかし、コンピュータにとってはそうではありません。ただの文字の羅列としか理解できません。
そのため、コンピュータに「この文書には構造があるぞ」と伝えてあげるための言語がマークアップ言語です。
さきほどの文章をHTMLでマークアップしてあげると次のようになります。
<h1>今日は天気が良いですね</h1>
<time datetime="2022-09-22 12:33">2022年09月22日 12:33</time>
<p>
こんにちは。みなさんお元気にすごしていらっしゃいますか?
今日は秋晴れの空でとても過ごしやすい日ですね!
</p>
このようにすることで、
- <h1></h1>に挟まれた文字は「見出し」
- <time></time>に挟まれた文字は「日時」
- <p></p>に挟まれた文字は「段落」
のようにコンピュータが理解できるようになります。
このように、人間が理解している文書構造をコンピュータに伝えてあげるのがマークアップ言語になります。
スタイルシート言語
スタイルシート言語は、文書のスタイルを定義するための言語です。CSSやSassがこの言語に属します。
スタイルシート言語はプログラミング言語ではありません。
文書のスタイルというのは、つまりは見栄えのことです。
見出しは大文字で太くして、背景色は〇〇にして、本文の文字はこれだけの大きさで……などの文書をどんな見た目で見せたいかをコンピュータに伝えてあげるのがスタイルシート言語になります。
まとめ
プログラミングに関する言語には様々な種類があるということが掴めましたか?
HTML/CSSはプログラミング言語ではない、ということに驚かれた方もいるかもしれません。
本稿で挙げた以外にもDSL(ドメイン特化言語)やIDL(インターフェース記述言語)などという区分も存在します。
それらに関してはまた後日、別の記事でとりあげたいと思います。