
プログラミング言語
プログラミング言語(プログラミングげんご)とは、コンピュータに対する一連の動作の指示を記述するための人工言語の総称である。この一連の指示をプログラムと呼び、それを記述することをプログラミングと呼ぶ。自然言語と同様、統語論(構文)規則と意味論規則で定義される。通常、それらを示した文書で仕様が示されるが、公式の実装だけで定義される言語もある。
プログラミング言語は、情報を組織し処理するタスクについての理解を容易にし、アルゴリズムを正確に表現する。場合によっては、あらゆるアルゴリズムを記述できる言語だけを「プログラミング言語」と定義することもある。そこまでの機能のない人工言語を「コンピュータ言語」と呼ぶこともある。また、プログラミングへの応用も想定して設計されたロジバンのように、人間言語とコンピュータ言語の中間に位置するものがある。
様々なプログラミング言語が、毎年のように生み出されている。
定義
以下は、プログラミング言語を定義する重要な観点である。
- 機能
- プログラミング言語はプログラムを書くのに使われる言語であり、それによってコンピュータは何らかの計算やアルゴリズムを実行し、場合によってはプリンターやロボットなどの外部装置を制御する。
- 対象
- 自然言語は人間同士の対話に使われるのに対して、プログラミング言語は人間が機械に指示を与えるのにも使われる。場合によっては、装置が別の装置を制御するのにも使われる。例えば、PostScriptプログラムは別のプログラムが生成し、プリンターやディスプレイの制御に使われる。
- 構成要素
- プログラミング言語には、データ構造を定義し操作する構成要素と、実行の流れを制御する構成要素がある。
- 表現能力
- 計算理論では、言語はその計算表現能力で分類される(チョムスキー階層参照)。チューリング完全な言語ならば、同じアルゴリズム群を表現可能である。SQLはチューリング完全ではない言語の例であるが、それでもプログラミング言語と呼ばれることがある。
計算されない言語(HTMLのようなマークアップ言語やBNFのような形式文法など)はプログラミング言語とは看做されない。プログラミング言語は、計算されないホスト言語に埋め込まれる場合がある。
意義と目的
プログラミング言語の存在意義は、人間が直接扱うには難しい機械語に代わって、より人間が扱いやすい形を提供することにある。
コンピュータが直接理解し実行することのできる言葉は、そのコンピュータの種類に固有の機械語だけである。したがって、最終的には機械語を使ってコンピュータが行うべき作業・計算を指示しなければならない。
しかし、機械語は複雑な決まりに従って並べられた数字の列であるので、人間にとっては理解しづらい。ごく簡単なプログラムでさえ、その機械語形式を扱うにはそれなりの習熟が必要である。まして、現在様々な業務で実用されているような複雑化したプログラムを機械語で書くことのできる人間は皆無である。
そこで、より人間に分かりやすい言葉で書いた指示を自動的に機械語に翻訳するプログラムをあらかじめ書いておく。そして自動翻訳で生成された機械語をコンピュータに実行させることにする。翻訳するプログラムは種類に応じてアセンブラ、コンパイラ、インタプリタなどと呼ばれる。必要な翻訳プログラムさえ書いておけば、人間は自分が最も扱いやすい言葉でコンピュータに指示することができる。
プログラミングの第一の目的は、コンピュータに命令を与えることである。そういった意味で、プログラミング言語は人間が行う他の表現に比較して、正確性と完全性を求められる度合いが非常に高いという特徴がある。自然言語で人間同士が対話する場合、曖昧であっても間違う可能性は低く、意図する所は伝えられる。しかし、コンピュータ相手では指示したとおりにしか動作せず、プログラマがコードに込めた意図を理解させることはできない。言語仕様とプログラムとその入力データの組合せで、そのプログラムを実行したときの結果(外部から観測される振る舞い)が完全に指定できなければならない。
多くの言語は、新たなニーズを満たすべく設計され、他の言語と組み合わされ、最終的に使われなくなる。あらゆる用途に使える万能言語を設計しようという試みはいくつかあったが、そういう意味で成功した言語は存在しない 。多様な言語が生まれる背景には、言語が使われる状況の多様性がある。
- 趣味で書く短いスクリプトから、数百人のプログラマが書く巨大なシステムまで、様々なプログラムがある。
- プログラマも、言語に単純さを求める初心者から、相当に複雑な言語を好むエキスパートまで様々である。
- システムにもマイクロコントローラからスーパーコンピュータまで様々あり、その中で性能、サイズ、単純さのバランスを保つ必要がある。
- いったん開発されるとずっとそのまま使われ続けるプログラムもあれば、定期的に修正されるものもある。
- 最終的にプログラマは好みによって言語を選ぶ場合もある。
プログラミング言語開発における共通の傾向として、より高いレベルの抽象化によって、より高い問題解決能力を得ようとしている。初期のプログラミング言語は、コンピュータのハードウェアのレベルと極めて近かった。新たなプログラミング言語が開発される度に機能が追加され、プログラマはハードウェアの命令からより遠い形でアイデアを表現できるようになっていった。プログラミングをハードウェアから分離することで、プログラマの生産性は向上する。
プログラミングにおけるプログラミング言語の必要性を排除する方法として、自然言語処理が提案されてきたという面もある。しかし、その方向性は実用化には達しておらず、議論が続いている。エドガー・ダイクストラは形式言語の使用によって意味のない命令を防ぐという立場で、自然言語によるプログラミングを批判していた。アラン・パリスも同様の立場であった。
自然言語との違い
プログラミング言語は、人間がコンピュータに命令を指示するために作られており、コンピュータが曖昧さなく解析できるように設計されている。多くの場合構文上の間違いは許されず、人間はプログラミング言語の文法に厳密にしたがった文を入力しなければならない。
これに対して、一般に自然言語の文法規則はプログラミング言語にくらべてはるかに複雑であり、例外も多い。ただしこれは規則が一般にいいかげんであったり、曖昧であるということではない。一般に自然言語の規則は奥が深く、驚くほどの合理性に裏打ちされていることがある。
また、自然言語の意味は、その文脈(コンテキスト)によって定まる部分も多い。これに対して、プログラミング言語は、コンピュータによって扱いやすいように、文脈によって意味が変わることができるだけないように設計されている。
自然言語は、誤用や流行などにより長い時間をかけ、たくさんの人間の利用により、意図せざる形で変化していく。しかし、プログラミング言語の規則は、言語設計者の意図と作業によってのみ、変更される。
人間がふだん使っている日本語などの自然言語を使ってコンピュータに指示することができるのが理想ではある。しかし、自然言語はあまりにも複雑で曖昧で変則的なので、それを機械語に翻訳できるようなプログラムを作成することはとても難しい。そのような研究も進められているが、未だに汎用で実用になるプログラムは作成されたことがない。
そこで、自然言語よりも制限が強く、単純で厳密で規則的な人工言語を作って代用する。これがプログラミング言語である。プログラミング言語は自然言語よりもいくらか人間には扱いづらいが、機械語よりは遥かに親しみやすく、人間の指示の手間を軽減している。ちなみにコンピュータ向けの形式性と人間向けの柔軟性を兼ね備えるロジバンなど、本来の開発目的が違えど潜在的に一つのプログラミング言語として機能しうるものもある。
自然言語と異なりほとんどのプログラミング言語は厳密に定義されており、規則に従わないプログラムは実行されない。大部分のプログラミング言語の文法は文脈自由文法によって定義されている。