「プログラミング/共通知識」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎コンパイル: 言語処理系の主要な実装がコンパイラなプログラミング言語を'''コンパイル型言語'''と呼びます。;コンパイル型言語の一覧を歴史の古い順に、Java追加
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎言語と言語処理系: 小項目の体裁を統一
タグ: 2017年版ソースエディター
127 行
-->
 
== 言語と言語処理系 ==
== 実行、意味論の解釈 ==
コンピュータが認識できるのは機械語のみであることは先で述べました。しかしプログラミング言語は文法に沿った言語で書かれています。それらの書かれた文章を'''ソースコード'''と呼びます。では、プログラミング言語→機械語の変換 (翻訳) はどうするのか
プログラムを処理するためのソフトウェアを'''言語処理系'''と呼び、言語処理系は[[#インタプリタ|インタプリタ]]と[[#コンパイラ|コンパイラ]]に大別されます。
 
=== インタプリタ ===
# ソースコード(あるいインタプリタと、プログラミング言語で書かれたソースコードから変換した中間表現)読み込み逐次解釈しながら実行するプログラムのことです
'''スクリプト言語'''と呼ばれる言語は、おおむねインタプリタ方式を採用しています。インタプリタ方式を採用しているプログラミング言語は、[[JavaScript]]、[[Python]]などがあります。
# ソースコードを翻訳する部分。
言語処理系の主要な実装がインタプリタなプログラミング言語を'''インタプリタ型言語'''(''Interpretive language'')と呼びます。
 
インタプリタ型言語には
* [[JavaLisp]]
* [[JavaScript]]
* [[Perl]]
* [[Python]]
* [[Ruby]]
などがあります。
 
'''スクリプト言語'''と呼ばれる言語は、おおむねインタプリタ方式を採用しています。インタプリタ方式を採用しているプログラミング言語は、[[JavaScript]]、[[Python]]などがあります。
手軽に書いてすぐ実行できるというメリットがある反面、プログラムの実行時に毎回解釈をする必要があるのでプログラムの実行速度はコンパイル方式のプログラミング言語に実行速度が劣る場合があります<ref>インタープリタは実行時に「どの部分が多く実行されたか?」「分岐命令でどちらに多く分岐したか?」などの実行時統計情報を容易に手に入れることができ、これらに基づき[[W:実行時コンパイラ|実行時コンパイラ]](JIT)による最適化が可能となりる。よって、一概にインタプリタ方式がコンパイル方式より実行速度が劣るとは言えない。</ref>。
インタプリタ方式を採用した言語の処理系は、ソースコードを直接実行するのでプログラムを書き換えると、即時に実行結果もそれに応じて変化します。
 
=== コンパイ ===
ソースコードを予めに機械語(ネイティブコード)に翻訳し、機械語のファイルを実行するという方法もあります。
プログラムのソースコードコードを機械語に変換することを、'''[[W:コンパイル|コンパイル]]'''と言います。
コンパイルするためのソフトウェアのことを'''[[W:コンパイラ|コンパイラ]]'''といいます。
言語処理系の主要な実装がコンパイラなプログラミング言語を'''[[W:コンパイル型言語|コンパイル型言語]]'''(''Compiled language'')と呼びます。
また、[[W:実行時コンパイラ|実行時コンパイラ]](JIT; Just-In-Time Compiler)と区別するため、[[W:事前コンパイラ|事前コンパイラ]](AOT;Ahead-Of-Time)と呼ばれます。
 
コンパイル型言語
* [[Fortran]]
* [[COBOL]]
* [[C言語]]
* [[C++]]
* [[Java]]
などがあります。
 
171 ⟶ 179行目:
という流れになります。
{{See also|w:機械語}}
 
=== 違いは? ===
* ソースコードを書き換えた場合
** インタプリタ型:実行結果が変化する
** コンパイル型:コンパイルし直さないと実行結果が変化しない
 
=== どちらでもない言語、両方できる言語 ===
ここまでプログラミング言語をスクリインタリタ型言語とコンパイル型言語に分けて説明してきましたが、どちらにも当てはまらないものや、両方の方法で実行できるものも存在します。
 
=== 中間コード型 ===
ソースコードをコンパイルしてから中間コード・ファイルを生成し、実行は中間コード・インタプリタが行う形式があり、
この様な形式を'''中間コード型'''と呼びます。
 
中間コード型には
* [[w:UCSD p-System|UCSD p-System]]
** 対象言語:[[W:UCSD-Pascal|UCSD-Pascal]]
* [[Java]]
** 対象言語:Java, Groovy, Scala, Kotlin, Clojureなど
* MS-CLI
** 対象言語:C++/CLI, C#, F#, Visual Basicほか
などがあります。
 
==== 現状Java ====
[[File:JvmSpec7.png|300px480px|ソースコード→classファイル→機械語|right]]
プログラミング言語のなかには、インタプリタかコンパイラかの分類に当てはまらない言語もあります。例えば、Javaはソースコードを、Java仮想マシンが解釈できる中間言語 (Javaバイトコード) にコンパイルします。そして実行時に、その中間言語を読み込みそれを実行するという仕組みです(中間コード・インタプリタ)。中間言語ファイルは機械語から独立しているため、どのハードウェアでも使うことができます。かわりにユーザーは、Java中間言語を実行するソフトウェア (JRE; Java Runtime Environment) をインストールします。そして、そのJavaのランタイムは、Windows、macOS、GNU/Linux系列といったそれぞれのOSごとで動作するように開発・維持されています。ユーザーから見れば、Javaのように中間言語を生成するプログラミング言語は、どのOSにも依存せず動作するので理想的なように見えます。しかし、ユーザーから見て統一的なAPIを提供しつつ、統一的なAPIとそれぞれのOSの違いを吸収する部分を実装することは非常に手間がかかります。
 
JVMを利用するJava以外の言語、Groovy, Scala, Kotlin, Clojureなども登場しています。
==== 中間言語を生成するプログラミング言語 ====
[[File:JvmSpec7.png|300px|ソースコード→classファイル→機械語|right]]
プログラミング言語のなかには、インタプリタかコンパイラかの分類に当てはまらない言語もあります。例えば、Javaはソースコードを、Java仮想マシンが解釈できる中間言語 (Javaバイトコード) にコンパイルします。そして実行時に、その中間言語を読み込みそれを実行するという仕組みです(中間コード・インタプリタ)。中間言語ファイルは機械語から独立しているため、どのハードウェアでも使うことができます。かわりにユーザーは、Java中間言語を実行するソフトウェア (JRE; Java Runtime Environment) をインストールします。そして、そのJavaのランタイムは、Windows、macOS、GNU/Linux系列といったそれぞれのOSごとで動作するように開発・維持されています。ユーザーから見れば、Javaのように中間言語を生成するプログラミング言語は、どのOSにも依存せず動作するので理想的なように見えます。しかし、ユーザーから見て統一的なAPIを提供しつつ、統一的なAPIとそれぞれのOSの違いを吸収する部分を実装することは非常に手間がかかります。
 
==== 両方できる言語 ====
また、コンパイルして実行することもインタプリタ実行も両方できる場合がある。Python、Go言語、Haskellは、その例である
 
==== 例外 ====
;コンパイル型言語を逐次実行、あるいはインタプリタ型の言語をコンパイルして使用する場合
:コンパイル型言語であに分類されるC言語のソースコード逐次実行したり、インタプリタ型のBASIC<ref>注釈: Quick BASIC というBASICで逐次実行ソフトがあり、これが、コンパイルすることによって実行速度を速めた改良型のBASICでした。</ref>をコンパイルしたりすがあ場合は分類に当てはまらない
:逆に、インタプリタ型言語に分類されるのBASICのソースコードをBASICコンパイラでコンパイルし生成された実行ファイルを実行することもある。
 
この様に、'''言語処理系の主要な実装が'''あるいは多くの場合は最初の実装が、インタプリタなのかコンパイラなのかで分類しているので、例外が生じる余地があります。
=== 現状 ===
==== インターネットとの関係 ====
ウェブページ用プログラミング言語としても <!-- "Node.js" --> 普及しているJavaScriptは、ブラウザ付属のインタプリタとしてウェブブラウザに実装されていることがほとんどだ。インタプリタかコンパイラかどうかは、けっして言語の仕様そのものによるものではなく、実装による違いだ。Pythonのようにインタプリタとして実装されているプログラミング言語に、追加モジュールとしてウェブプログラミング用モジュールを付け加えて(すでにそのようなモジュールが開発されており配布されている)、それでpythonなどでウェブプログラミングを行うという方法もあります。
 
==レキシカル・アナライザ==