プログラミング言語

出典: Wikipedio


thumb|230px|right|プログラミング言語に関する書籍。

プログラミング言語(プログラミングげんご)とは、コンピュータに対する一連の動作の指示を記述するための人工言語の総称である<ref>ISO 5127—Information and documentation—Vocabulary, clause 01.05.10 では、プログラミング言語を「プログラムを記述するための人工言語」と定義している。</ref>。この一連の指示をプログラムと呼び、それを記述することをプログラミングと呼ぶ。自然言語と同様、統語論(構文)規則と意味論規則で定義される。通常、それらを示した文書で仕様が示されるが、公式の実装だけで定義される言語もある。

プログラミング言語は、情報を組織し処理するタスクについての理解を容易にし、アルゴリズムを正確に表現する。場合によっては、あらゆるアルゴリズムを記述できる言語だけを「プログラミング言語」と定義することもある<ref>数学的には、これはプログラミング言語がチューリング完全であることを意味する。 </ref>。そこまでの機能のない人工言語を「コンピュータ言語」と呼ぶこともある。また、プログラミングへの応用も想定して設計されたロジバンのように、人間言語とコンピュータ言語の中間に位置するものがある。

様々なプログラミング言語<ref>2008年2月現在、The Encyclopedia of Computer Languages (Murdoch University、オーストラリア)には8152のコンピュータ言語がリストアップされている。</ref>が、毎年のように生み出されている。

目次

定義

以下は、プログラミング言語を定義する重要な観点である。

機能
プログラミング言語はプログラムを書くのに使われる言語であり、それによってコンピュータは何らかの計算<ref>Template:Cite web, The scope of SIGPLAN is the theory, design, implementation, description, and application of computer programming languages - languages that permit the specification of a variety of different computations, thereby providing the user with significant control (immediate or delayed) over the computer's operation.</ref>やアルゴリズムを実行し、場合によってはプリンターロボット<ref name="robots">Template:Cite web</ref>などの外部装置を制御する。
対象
自然言語は人間同士の対話に使われるのに対して、プログラミング言語は人間が機械に指示を与えるのにも使われる。場合によっては、装置が別の装置を制御するのにも使われる。例えば、PostScriptプログラムは別のプログラムが生成し、プリンターやディスプレイの制御に使われる。
構成要素
プログラミング言語には、データ構造を定義し操作する構成要素と、実行の流れを制御する構成要素がある。
表現能力
計算理論では、言語はその計算表現能力で分類される(チョムスキー階層参照)。チューリング完全な言語ならば、同じアルゴリズム群を表現可能である。SQLはチューリング完全ではない言語の例であるが、それでもプログラミング言語と呼ばれることがある<ref>Template:Cite web</ref>。

計算されない言語(HTMLのようなマークアップ言語BNFのような形式文法など)はプログラミング言語とは看做されない。プログラミング言語は、計算されないホスト言語に埋め込まれる場合がある。

意義と目的

プログラミング言語の存在意義は、人間が直接扱うには難しい機械語に代わって、より人間が扱いやすい形を提供することにある。

コンピュータが直接理解し実行することのできる言葉は、そのコンピュータの種類に固有の機械語だけである。したがって、最終的には機械語を使ってコンピュータが行うべき作業・計算を指示しなければならない。

しかし、機械語は複雑な決まりに従って並べられた数字の列であるので、人間にとっては理解しづらい。ごく簡単なプログラムでさえ、その機械語形式を扱うにはそれなりの習熟が必要である。まして、現在様々な業務で実用されているような複雑化したプログラムを機械語で書くことのできる人間は皆無である。

そこで、より人間に分かりやすい言葉で書いた指示を自動的に機械語に翻訳するプログラムをあらかじめ書いておく。そして自動翻訳で生成された機械語をコンピュータに実行させることにする。翻訳するプログラムは種類に応じてアセンブラコンパイラインタプリタなどと呼ばれる。必要な翻訳プログラムさえ書いておけば、人間は自分が最も扱いやすい言葉でコンピュータに指示することができる。

プログラミングの第一の目的は、コンピュータに命令を与えることである。そういった意味で、プログラミング言語は人間が行う他の表現に比較して、正確性と完全性を求められる度合いが非常に高いという特徴がある。自然言語で人間同士が対話する場合、曖昧であっても間違う可能性は低く、意図する所は伝えられる。しかし、コンピュータ相手では指示したとおりにしか動作せず、プログラマがコードに込めた意図を理解させることはできない。言語仕様とプログラムとその入力データの組合せで、そのプログラムを実行したときの結果(外部から観測される振る舞い)が完全に指定できなければならない。

多くの言語は、新たなニーズを満たすべく設計され、他の言語と組み合わされ、最終的に使われなくなる。あらゆる用途に使える万能言語を設計しようという試みはいくつかあったが、そういう意味で成功した言語は存在しない <ref>IBMは PL/I をリリースしたとき、やや野心的にマニュアルを The universal programming language PL/I (IBM Library; 1966) と名づけている。このタイトルはIBMが目標としていた無制限のサブセット化機能を反映している「PL/I は特定の応用に必要な部分を抜き出し、サブセットを分離可能なように設計されている」 (Template:Cite web). AdaUNCOLも同様の初期目標を持っていた。</ref>。多様な言語が生まれる背景には、言語が使われる状況の多様性がある。

  • 趣味で書く短いスクリプトから、数百人のプログラマが書く巨大なシステムまで、様々なプログラムがある。
  • プログラマも、言語に単純さを求める初心者から、相当に複雑な言語を好むエキスパートまで様々である。
  • システムにもマイクロコントローラからスーパーコンピュータまで様々あり、その中で性能、サイズ、単純さのバランスを保つ必要がある。
  • いったん開発されるとずっとそのまま使われ続けるプログラムもあれば、定期的に修正されるものもある。
  • 最終的にプログラマは好みによって言語を選ぶ場合もある。

プログラミング言語開発における共通の傾向として、より高いレベルの抽象化によって、より高い問題解決能力を得ようとしている。初期のプログラミング言語は、コンピュータのハードウェアのレベルと極めて近かった。新たなプログラミング言語が開発される度に機能が追加され、プログラマはハードウェアの命令からより遠い形でアイデアを表現できるようになっていった。プログラミングをハードウェアから分離することで、プログラマの生産性は向上する<ref> Frederick P. Brooks, Jr.: The Mythical Man-Month, Addison-Wesley, 1982, pp. 93-94 </ref>。

プログラミングにおけるプログラミング言語の必要性を排除する方法として、自然言語処理が提案されてきたという面もある。しかし、その方向性は実用化には達しておらず、議論が続いている。エドガー・ダイクストラは形式言語の使用によって意味のない命令を防ぐという立場で、自然言語によるプログラミングを批判していた<ref>Dijkstra, Edsger W. On the foolishness of "natural language programming." EWD667.</ref>。アラン・パリスも同様の立場であった<ref>Perlis, Alan, Epigrams on Programming. SIGPLAN Notices Vol. 17, No. 9, September 1982, pp. 7-13</ref>。

自然言語との違い

プログラミング言語は、人間がコンピュータに命令を指示するために作られており、コンピュータが曖昧さなく解析できるように設計されている。多くの場合構文上の間違いは許されず、人間はプログラミング言語の文法に厳密にしたがった文を入力しなければならない。

これに対して、一般に自然言語の文法規則はプログラミング言語にくらべてはるかに複雑であり、例外も多い。ただしこれは規則が一般にいいかげんであったり、曖昧であるということではない。一般に自然言語の規則は奥が深く、驚くほどの合理性に裏打ちされていることがある。

また、自然言語の意味は、その文脈(コンテキスト)によって定まる部分も多い。これに対して、プログラミング言語は、コンピュータによって扱いやすいように、文脈によって意味が変わることができるだけないように設計されている。

自然言語は、誤用や流行などにより長い時間をかけ、たくさんの人間の利用により、意図せざる形で変化していく。しかし、プログラミング言語の規則は、言語設計者の意図と作業によってのみ、変更される。

人間がふだん使っている日本語などの自然言語を使ってコンピュータに指示することができるのが理想ではある。しかし、自然言語はあまりにも複雑で曖昧で変則的なので、それを機械語に翻訳できるようなプログラムを作成することはとても難しい。そのような研究も進められているが、未だに汎用で実用になるプログラムは作成されたことがない。

そこで、自然言語よりも制限が強く、単純で厳密で規則的な人工言語を作って代用する。これがプログラミング言語である。プログラミング言語は自然言語よりもいくらか人間には扱いづらいが、機械語よりは遥かに親しみやすく、人間の指示の手間を軽減している。ちなみにコンピュータ向けの形式性と人間向けの柔軟性を兼ね備えるロジバンなど、本来の開発目的が違えど潜在的に一つのプログラミング言語として機能しうるものもある。

自然言語と異なりほとんどのプログラミング言語は厳密に定義されており、規則に従わないプログラムは実行されない。大部分のプログラミング言語の文法は文脈自由文法によって定義されている。

要素

文法

[[ファイル:Python_add5_syntax.svg|thumb|right|292px|シンタックスハイライトはソースコードを認識しやすくする。ここでの言語はPython。]]

プログラミング言語の見た目は、その構文(統語論)で決定される。多くのプログラミング言語は文字だけで構成され、単語や数や区切り記号の並びであり、自然言語に似ている。一方で、グラフィカルなプログラミング言語もあり、プログラムをグラフィカルなシンボル間の関係で表す。

言語の構文は、構文的に正しいプログラムを形成するシンボルの組合せを規定するものである。シンボルの組合せの意味は意味論で与えられる。多くの言語は文字で構成されるため、以下ではそれについて論じる。

プログラミング言語の構文は一般に、字句解析用の正規表現構文解析用のバッカス・ナウア記法文脈自由文法)で定義される。下記はLISPに関する単純な構文である。

expression ::= atom | list
atom  ::= number | symbol
number  ::= [+-]?['0'-'9']+
symbol  ::= ['A'-'Z''a'-'z'].*
list  ::= '(' expression* ')'

この構文は次のような意味である。

  • expressionatom または list である。
  • atomnumber または symbol である。
  • number は1文字以上の数字列であり、オプションとして符号が前置される(空白は含まない)。
  • symbol はアルファベットで始まる任意の文字列である(空白は含まない)。
  • list は括弧記号の対であり、その間に0個以上の expression がある。

これに従うトークン列の例として、'12345'、'()'、'(a b c232 (1))' などがある。

構文上正しいプログラムが全て意味論的にも正しいとは限らない。つまり、プログラミング言語の文法は、構文と意味論の両方がそろって成立する。また、構文的にも意味論的にも正しいプログラムだとしても、それを書いた人の意図を正しく反映していない場合もある。

自然言語を例にすると、文法的に正しい文に「偽」となるような意味を与えることもできる。

  • 「無色の緑色のアイデアは猛烈に眠る」は文法的には正しいが意味のない文である。
  • 「太郎は既婚の独身男である」は文法的には正しいが、決して真とは言えない文である。

以下のC言語のコード断片は構文上は正しいが、意味論的には正しくない(pヌルポインタなので、p->realp->im には意味がない)。

complex *p = NULL;
complex abs_p = sqrt (p->real * p->real + p->im * p->im);

プログラミング言語の文法はチョムスキー階層内で分類可能である。多くの言語の構文は文脈自由文法を使って記述される<ref> Section 2.2: Pushdown Automata, pp.101–114.</ref>。

型システム

Template:Main 型システムは、プログラミング言語において値や式を「型」に分類し、その型をどう扱うかを定義するものである。これには一般に、その言語で構成可能なデータ構造の定義が含まれる。数理論理学を使った型システムの設計および研究を型理論という。

内部的には、デジタルコンピュータでは全てのデータが0と1(二進法)で格納されている。

型のある言語とない言語

型のある言語とは、あるデータ型について定義されている操作を他のデータ型の値に対して実行できないものを指す<ref name="typing">Template:Cite web</ref>。例えば、"this text between the quotes" は文字列型の値である。多くの言語では、数を文字列で割る操作には意味がない。そのため、そのような操作をしようとしているプログラムは拒絶される。言語によっては、そのような意味のない操作をコンパイル時に検出し(静的型検査)、コンパイラが拒絶する。また、言語によっては実行時に検出し(動的型検査)、例外処理が呼び出されることになる。

型のある言語の特殊例として、単一型言語がある。REXXSGMLといったスクリプト言語やマークアップ言語は、単一のデータ型しか扱わない(多くの場合、そのときのデータ型は文字列型である)。

対照的にアセンブリ言語などの型のない言語は、任意のデータに任意の操作を実行可能であり、データは単にある長さのビット列として扱われる<ref name="typing"/>。高級言語で型を持たない言語としては、BCPLForth系言語の一部などがある。

型理論的に厳密な型適用をしている言語は少なく、多くの言語はそれなりの型システムを採用している<ref name="typing"/>。多くの実用的な言語には、型システムを迂回または打倒するような手段が用意されている。

静的型付けと動的型付け

静的型付けでは、全ての式の型はそのプログラムを実行する前(一般にコンパイル時)に決定される。例えば、1 とか (2+2) という式は整数型であり、文字列を期待している関数には渡せず、日付(型)を格納するよう定義された変数には代入できない<ref name="typing"/>。

静的型付け言語は、型を明記する場合と型推論を行う場合がある。前者ではプログラマは適切な位置に型を明記しなければならない(例えば、変数の宣言文など)。後者では、コンパイラが式の型を文脈から推論する。C++Javaなどの主な静的型付け言語では、型を明記する。完全な型推論は主流でない言語に使われている(HaskellML)。ただし、型を明記する言語でも部分的な型推論をサポートしていることが多い。たとえば、JavaC#では限定された状況で型推論を行う。

動的型付けでは、型の安全性を実行時に操作する。言い換えれば、型はソース上の表現ではなく、実行時の値に対して付与される<ref name="typing"/>。型推論言語と同様、動的型付け言語でも式や変数の型を明記する必要はない。また、ある1つの変数がプログラム実行中に異なる型の値を格納することも可能である。しかし、コードを実際に実行してみるまで型の間違いを自動的に検出することができず、デバッグがやや難しい。動的型付け言語としては、RubyLISPJavaScriptPython などがある。

弱い型付けと強い型付け

「弱い型付け」とは、ある型の値を別の型としても操作できることを意味する<ref name="typing"/>。例えば、文字列を数として扱うといったことが考えられる。これは場合によっては便利だが、コンパイル時には問題を検出できない場合がある。

「強い型付け」とは、その逆である。型の混同はエラーとなる<ref name="typing"/>。強い型付けの言語を「型安全」であるという。型安全性はある種のプログラムの誤りを防ぐことができる。

「弱い型付け」の別の定義として、PerlJavaScriptC++などが自動的に行う型変換を指す場合もある。例えば、Perl は動的型付け言語であり、実行時に型検査を行う言語である。型変換機能は便利だが、危険な場合もある。

実行意味論

データを入力されれば、コンピュータはそのデータに対して何らかの処理を実行する。「実行意味論(execution semantics)」とは、プログラミング言語の構成要素がどの時点でどのようにして、そのプログラムの振る舞いを生成するのかを定義するものである。

例えば、式の評価戦略先行評価部分評価遅延評価短絡評価など)は実行意味論の一部である。また、制御構造における条件付実行の作法も実行意味論の一部である。

標準ライブラリ

多くのプログラミング言語には、標準ライブラリが付属していて、その言語の実装にはほぼ必ず存在する。標準ライブラリには、典型的なアルゴリズムデータ構造入出力機構などが含まれることが多い。

ユーザーから見れば、標準ライブラリも言語の一部だが、設計者から見れば別の実体である。言語仕様には必ず実装しなければならない部分が定義されており、標準化された言語の場合、それには標準ライブラリも含まれる。言語とその標準ライブラリの境界は、言語によって様々である。実際、言語によっては一部の構文要素が標準ライブラリなしでは使えないこともある。例えばJavaでは、文字列リテラルは java.lang.String クラスのインスタンスとして定義される。同様にSmalltalkでは、匿名関数はライブラリの BlockContext クラスのインスタンスを使用する。また、Schemeは言語仕様の大部分をライブラリマクロとして実装可能にしており、言語設計者はどこまでを言語本体で実装すべきかも明確に述べていない。

プログラミング言語の実行

プログラミング言語を使うには、設計者が言語を設計して処理系を実装し、ユーザーがその言語でプログラムを書く必要がある。その際に重要となるのは、「仕様」と「実装」である。

仕様

プログラミング言語の仕様は、その言語で書かれたソースコードが与えられたとき、プログラムとしての動作がどうなるのかを決定する定義を与えることを目的としている。

プログラミング言語仕様には、以下のようないくつかの形式がある。

  • 言語の構文と意味論の明確な定義。構文は形式文法を使って記述され、意味論定義は自然言語または形式意味論で書かれるのが一般的である(形式意味論で意味論を記述した例として Standard ML<ref></ref> や Scheme<ref>Template:Cite web</ref> がある)。
  • その言語のコンパイラの動作を記述したもの(例えば、C++FORTRAN の仕様)。言語の構文と意味論はその記述から推定され、自然言語や形式言語で書かれる。
  • リファレンス実装やモデル実装。対象言語で書かれることもある(例えば、PrologANSI REXX<ref>ANSI — Programming Language Rexx, X3-274.1996</ref>)。構文と意味論は、リファレンス実装の動作を見れば明らかである。

実装

プログラミング言語の実装とは、ハードウェアおよびソフトウェアを構成して、そのプログラミング言語で書かれたプログラムを実行する方法を提供するものである。プログラミング言語の実装には大きく分けて2つの方法がある。コンパイラインタプリタである。一般にある言語をコンパイラとインタプリタの両方で実装することが可能である。

コンパイラの出力は、ハードウェアで実行される場合とインタプリタで実行される場合がある。コンパイラの出力したものをインタプリタで実行する方式は、コンパイラとインタプリタの区別が曖昧な場合もある。例えば、BASICの実装には、行単位でソースをコンパイルして実行するようなものもある。

一般にコンパイラの出力(実行ファイル)を直接ハードウェアで実行する方が、インタプリタで実行するよりもずっと高速である。

インタプリタでの実行を改善する技法として、ジャストインタイムコンパイル方式がある。

歴史

Template:See also

初期の発展

世界初のプログラミング言語は、いわゆるデジタルコンピュータの登場する前に存在した。19世紀には、プログラム可能な織機自動ピアノ向けの巻紙があり、そこには現代的分類で言えばドメイン固有言語とされるプログラミング言語でプログラムが書かれていた。20世紀初頭には、タビュレーティングマシンによってパンチカードを使ったデータの機械処理が始まっている。1930年代から1940年代にかけて、アルゴリズムを表現する数学的抽象表現を提供するラムダ計算アロンゾ・チャーチ)とチューリングマシンアラン・チューリング)が考案された。ラムダ計算はその後の言語設計にも影響を与えている<ref>Benjamin C. Pierce は次のように書いている。

". . . the lambda calculus has seen widespread use in the specification of programming language features, in language design and implementation, and in the study of type systems."(訳:ラムダ計算はプログラミング言語の仕様記述、言語設計と実装、型システムの研究に広く使われている)

</ref>。

1940年代、世界初の電子式デジタルコンピュータ群が製作された。1950年代初期のコンピュータである UNIVAC IIBM 701 では機械語を使っていた。機械語によるプログラミングは、間もなくアセンブリ言語によるプログラミングに取って代わられた。1950年代後半になると、アセンブリ言語でマクロ命令が使われるようになり、その後 FORTRANLISPCOBOL という3つの高級プログラミング言語が開発された。これらは改良を加えられ現在でも使われており、その後の言語開発に重大な影響を与えた<ref name="influences">Template:Cite web</ref>。1950年代末、ALGOLが登場し、その後の言語に様々な影響を与えている<ref name="influences"/>。初期のプログラミング言語の仕様と使い方は、当時のプログラミング環境の制約(パンチカードによるプログラム入力など)にも大きく影響されている<ref>Frank da Cruz. IBM Punch Cards Columbia University Computing History.</ref>。

改良

1960年代から1970年代末ごろまでに、現在使われている主な言語パラダイムが開発されたが、その多くはごく初期の第三世代プログラミング言語のアイデアの改良である。

これらの言語のアイデアは様々な言語に引き継がれており、現在の言語の多くは、これらのいずれかの系統に属する。

1960年代と1970年代は、構造化プログラミングに関する論争が盛んに行われた時期でもある<ref>Template:Cite journal</ref>。1968年、エドガー・ダイクストラの有名なレターが Communications of the ACM に掲載された。その中で、全ての高級言語からGoto文を排除すべきだと主張していた<ref>Template:Cite journal</ref>。

1960年代と1970年代は、プログラムのメモリ使用量を削減し、プログラマやユーザーの生産性を向上させる技法も進展した時期である。初期の4GL(第四世代プログラミング言語)は、同じプログラムを第三世代プログラミング言語で書いたときよりもソースコードの量を劇的に削減した。

統合と成長

1980年代は、相対的な統合の時代であった。C++は、オブジェクト指向とシステムプログラミングの統合である。アメリカでは、軍需に使うことを目的として Ada というシステムプログラミング言語が標準化された。日本などでは、論理プログラミングを応用した第五世代言語の研究に資源を費やした<ref> Tetsuro Fujise, Takashi Chikayama, Kazuaki Rokusawa, Akihiko Nakase (December 1994). "KLIC: A Portable Implementation of KL1" Proc. of FGCS '94, ICOT Tokyo, December 1994. 第五世代コンピュータ・プロジェクト・アーカイブ</ref>。関数型言語コミュニティでは、ML と LISP の標準化の動きがあった。これらはいずれも新たなパラダイムの生み出そうというものではなく、それまでに生み出されたアイデアに改良を加える動きであった。

1980年代の重要な言語設計傾向の1つとして、大規模システムのためのプログラミングを目的としてモジュールの概念を採り入れた点が挙げられる。1980年代にモジュールシステムを採り入れた言語として Modula-2、Ada、ML があるが、それ以前に既に PL/I がモジュラープログラミングをサポートしていた。モジュールシステムはジェネリックプログラミングの構成要素とされることが多い<ref>Template:Cite web</ref>。

1990年代中頃には、インターネットの急激な成長によって新たな言語が生み出される機会が生じた。Perl は1987年にリリースされたUNIX上のスクリプト言語だったが、ウェブサイトの動的コンテンツ作成に使われるようになった。Java はサーバ側のプログラミングに使われるようになった。これらはそれほど革新的ではなく、主にC言語を中心とした既存の言語やパラダイムの改良に過ぎない。

プログラミング言語の進化は産業界でも研究でも続いている。現在の傾向は、セキュリティと信頼性の検証、新たなモジュール性(Mixin委譲アスペクト)、データベース統合などであるTemplate:要出典

4GLSQLのようなドメイン固有言語であり、個々のデータ値を扱う汎用プログラミング言語とは異なり、データの集合を処理する。例えば、Perlヒアドキュメント機能を使うと、複数の4GLプログラムやJavaScriptプログラムをPerlのコードに埋め込むことができる<ref>Wall, Programming Perl ISBN 0-596-00027-8 p.66</ref>。

言語利用状況の計測

どのプログラミング言語が最もよく使われているかを判断することは難しい。また、利用という意味も文脈によって異なる。プログラマの工数、コードの行数、CPU時間などが尺度として考えられる。ある言語は特定分野のアプリケーションだけでよく使われているということもある。例えばCOBOLは企業のデータセンター(メインフレームであることが多い)では今でも使われているし、FORTRANは科学技術計算でよく使われ、C言語は組み込みシステムやオペレーティングシステムで使われている。

以下のように言語利用状況の尺度は様々であり、どれを選択しても一種のバイアスがかかっていると考えた方がよい。

  • プログラマなどの求人広告で言語が言及されている回数<ref>Survey of Job advertisements mentioning a given language</ref>
  • 言語に関する書籍(入門書など)の販売部数<ref>Counting programming languages by book sales</ref>
  • 言語ごとの既存のコード行数の推計。公開調査で見逃しやすい言語は少なく推定される傾向がある。<ref>Bieman, J.M.; Murdock, V., Finding code on the World Wide Web: a preliminary investigation, Proceedings First IEEE International Workshop on Source Code Analysis and Manipulation, 2001</ref>
  • 検索エンジンが見つけた各言語への参照の回数

分類

プログラミング言語の完全な分類法は存在しない(前述のCOBOLが事務計算用途向け、FORTRANが科学技術計算用途向けといった設計思想はあるが)。あるプログラミング言語には大抵複数の起源(影響を与えた言語)がある。言語は一般に複数の既存言語の要素と新たなアイデアを組み合わせて生み出される。ある言語を起源とするアイデアはその系統の言語群に広まっていき、あるときギャップを飛び越えて全く別の系統の言語で使われるようになる。

さらに事を複雑にするのは、言語は様々な観点から分類可能という点である。例えば、Javaはオブジェクト指向言語であると同時に、並行性言語でもある(言語仕様としてスレッドを複数並行して生成可能であるため)。Python はオブジェクト指向言語であると同時に、スクリプト言語でもある。

プログラミング言語の大まかな分類として、プログラミングパラダイムによる分類と想定している利用分野や用途による分類がある。パラダイムには、手続き型プログラミングオブジェクト指向プログラミング関数型プログラミング論理プログラミングなどがある。言語によっては2つのパラダイムの性格を併せ持つこともあるし、マルチパラダイムの場合もある。アセンブリ言語は、マシンのアーキテクチャを直接モデル化したものであるため、パラダイムとは言わない。用途による分類では、汎用、システムプログラミング言語、スクリプト言語、ドメイン固有言語、並行/分散言語(あるいはこれらの混合)などがある<ref>Template:Cite web</ref>。汎用言語の一部は教育目的で設計されている<ref>Template:Cite journal</ref>。

プログラミングパラダイムとは無関係なパラメータで分類されることもある。例えば、多くのプログラミング言語は英語のキーワードを使っているが、ごく一部の言語はそうではない。また、難解かそうでないかという分類もある。

低級言語と高級言語

機械語アセンブラ言語は、よりハードウェアに近い言語であり、このようなプログラミング言語を低級言語あるいは低水準言語という。また、それ以外の言語は、機械語と一対一で対応せず、より人間に近い言語であり、高級言語あるいは高水準言語という。最近ではプログラムの開発効率向上のために、沢山の高級言語が生まれてきている。その中でもプログラムを作るためのプログラミング言語というものも有る。簡単なパラメーターを入れて行ったり、選択肢を選んでいくだけでプログラムが出来てしまう高級言語もある。しかし、こういった高級言語は、ハードウェアに大変遠いため、コンピューターに大きな負荷が掛かり、ハードウェアソフトウェア(主にOSなど)ともに、高度な能力が必要とされる。

脚注・出典

Template:Reflist

関連項目

参考文献

  • Daniel P. Friedman, Mitchell Wand, Christopher Thomas Haynes: Essentials of Programming Languages, The MIT Press 2001.
  • David Gelernter, Suresh Jagannathan: Programming Linguistics, The MIT Press 1990.
  • Shriram Krishnamurthi: Programming Languages: Application and Interpretation, オンライン版.
  • Bruce J. MacLennan: Principles of Programming Languages: Design, Evaluation, and Implementation, Oxford University Press 1999.
  • John C. Mitchell: Concepts in Programming Languages, Cambridge University Press 2002.
  • Benjamin C. Pierce: Types and Programming Languages, The MIT Press 2002.
  • Ravi Sethi: Programming Languages: Concepts and Constructs, 2nd ed., Addison-Wesley 1996.
  • Michael L. Scott: Programming Language Pragmatics, Morgan Kaufmann Publishers 2005.
  • Richard L. Wexelblat (ed.): History of Programming Languages, Academic Press 1981.

外部リンク


Template:Link FA Template:Link FAaf:Programmeertaal als:Programmiersprache am:የፕሮግራም ቋንቋ an:Luengache de programación ar:لغة برمجة arz:لغة برمجه ast:Llinguaxe de programación bat-smg:Pruogramavėma kalba be:Мова праграмавання be-x-old:Мова праграмаваньня bg:Език за програмиране bn:প্রোগ্রামিং ভাষা br:Yezh programmiñ bs:Programski jezik bug:ᨅᨔ ᨀᨚᨇᨘᨈᨛᨑᨛ ca:Llenguatge de programació ckb:زمانی پرۆگرامکردن cs:Programovací jazyk cv:Компьютер чĕлхи da:Programmeringssprog de:Programmiersprache el:Γλώσσα προγραμματισμού en:Programming language eo:Programlingvo es:Lenguaje de programación et:Programmeerimiskeel eu:Programazio-lengoaia fa:زبان‌های برنامه‌نویسی fi:Ohjelmointikieli fr:Langage de programmation gl:Linguaxe de programación he:שפת תכנות hi:प्रोग्रामिंग भाषा hr:Programski jezik hsb:Programěrowanske rěče hu:Programozási nyelv ia:Linguage de programmation id:Bahasa pemrograman ilo:Lengguahe ti panangprograma is:Forritunarmál it:Linguaggio di programmazione jbo:samplabau ka:პროგრამირების ენა kab:Timeslayin n usihel ko:프로그래밍 언어 la:Lingua programmandi lb:Programméiersprooch lt:Programavimo kalba lv:Programmēšanas valoda mk:Програмски јазик ml:പ്രോഗ്രാമിംഗ് ഭാഷ mn:Программчлалын хэл mr:प्रोग्रॅमिंग भाषा ms:Bahasa pengaturcaraan nl:Programmeertaal nn:Programmeringsspråk no:Programmeringsspråk pl:Język programowania pt:Linguagem de programação ro:Limbaj de programare ru:Язык программирования sah:Программалааhын тыла simple:Programming language sk:Programovací jazyk sl:Programski jezik sq:Gjuhë programimi sr:Програмски језик su:Basa program sv:Programspråk ta:நிரல் மொழி te:ప్రోగ్రామింగు భాష tg:Забони барномасозӣ th:ภาษาโปรแกรม tl:Wikang pamprograma tr:Programlama dili uk:Мова програмування ur:برمجہ زبان vi:Ngôn ngữ lập trình war:Yinaknan han programa yo:Èdè Ìṣèlànà Kọ̀mpútà zh:编程语言 zh-min-nan:Thêng-sek gí-giân zh-yue:程式語言

個人用ツール