🐕

言語のタイプについて -スクリプト、コンパイラ、インタプリンタの話

2023/05/07に公開

プログラミング言語全体像の理解を深める

今まで以上に最近は触れる言語の幅が増えてきて気になったこと。
"言語には種類がある"

今日はそこを深めていきたいと思う。

プログラミング言語のタイプ

プログラムの実行方法により、何通りかに分かれています。
まず、どんな種類(タイプ)があるのか、簡単なtableで掲載します。

注意:
この表は、プログラミング言語のタイプと例の一部です。
プログラミング言語は、単一のタイプに分類されるわけではなく、
また、ある言語が複数のタイプに分類されることもあります

タイプ 説明
スクリプト言語 コンパイルの代わりに実行時にプログラムを解釈する言語 Python, Ruby, PHP,JavaScript
コンパイル言語 プログラムをコンパイルして実行可能ファイルを生成する言語 C, C++, Java
インタープリタ言語 実行時にコードを解釈して実行する言語 Python, Ruby, JavaScript
JITコンパイル言語 実行時にコードをコンパイルすることで、コンパイルとインタープリテーションの長所を併せ持つ言語 Java, C#, JavaScript
マクロ言語 テキスト処理ツールとして使用され、通常はコンパイルや実行をしない言語 Tcl, Emacs Lisp, Clojure
関数型言語 関数をプログラムの基本単位として使用し、状態の変更を最小限に抑える言語 Haskell, Lisp, Erlang
用語説明
  • コンパイル(compile):
    プログラミング言語で書かれたソースコードを、
    コンピュータが実行可能な形式に変換すること。
    この変換作業を行うプログラムのことをコンパイラ(compiler)と呼ぶ。

プログラマが書いたプログラムは、人間が理解しやすい形式で書かれています。
しかし、コンピュータは0と1のバイナリ形式でしかプログラムを実行できない。
そのため、
プログラマが書いたソースコードをコンピュータが理解できる形式に変換する必要がある。

このように様々あるのですが、
大きく分けると、主にコンパイル言語とスクリプト言語の2つです。
以下のように、一般的な特徴をまとめたtableを作成してみました。

コンパイラ言語 スクリプト言語
概説 プログラムをコンパイルして実行可能ファイルを生成する言語 コンパイルの代わりに実行時にプログラムを解釈する言語
解釈/コンパイル コンパイル 解釈
代表例 C、C++、Java、Swift、Kotlin Python、Ruby、JavaScript、PHP、
Perl、Shell Script等
実行速度 高速 低速
デバッグ 難しい 容易
開発速度 遅い 速い
コード量 多い 少ない
メモリ使用量 少ない 多い
長所 実行速度が高速 開発速度が速い
短所 デバッグが難しい
コード量が多く、開発に時間がかかる
ポータビリティに欠ける
(OSやCPUに依存することがある)
実行速度が遅い
メモリ使用量が多く、
大規模なプログラムには向かない
コードが読みにくい場合がある

この二つの処理の違いは..."機械語への翻訳仕方の違い"

  • スクリプト言語はコンパイル不要で実行しながらの同時通訳型です。
    この同時通訳の仕組みはインタプリンタのおかげで、
    インタプリタを使うことによって直接実行できるという利点になっている。

  • コンパイル言語はコンパイルし事前に機械語に翻訳してから実行するので実行速度が速い。

■ コンパイラ言語を使用する場合

【コンパイラ言語:概要】

  • プログラムを機械語に変換するプログラム(コンパイラ)によって、
    実行可能ファイルに変換される言語のこと。
    コンパイルは、プログラムのコードを機械語に変換し、実行可能ファイルを生成する処理のこと。
    実行可能ファイルは、コンピュータ上で直接実行できるバイナリ形式のファイルであり、
    ハードウェアに直接命令を送信するため、高速で効率的に実行できます。
    => 高速な処理が必要なアプリケーションやシステムプログラムの開発に適している。

  • ⚠️ コンパイルに時間がかかる、デバッグが難しい、コードが冗長になるなどの課題がある。
    また、コンパイル時にハードウェア依存性がある場合があるため、
    複数のプラットフォームに対応するには、複数のバイナリファイルを生成する必要がある。

  • コンパイラ言語は静的型付けを採用していることが多く、
    コンパイル時に型エラーを検出することができる。
    これにより、プログラムの安全性や信頼性を向上させることができます。

長所 短所
高速で効率的な実行が可能 コンパイルに時間がかかる
静的型付けにより、プログラムの安全性や信頼性が高い デバッグが難しい
ハードウェアに直接命令を送信するため、ハードウェア制御が容易 コードが冗長になる場合がある
大規模なアプリケーションの開発に適している ハードウェア依存性がある場合がある

使用例

高速な処理やハードウェア制御が必要な場合など、効率的で高度な処理を要求される場合に使用される。

  • 高速な実行速度が必要な場合
  • 大規模なプログラムを開発する場合
  • ハードウェアに直接アクセスする必要がある場合(例:デバイスドライバ)
  • プログラムのセキュリティが重要な場合

■ スクリプト言語を使用する場合

【スクリプト言語:概要】
スクリプト言語は、通常はコンパイルを必要とせず、インタプリタによって実行される
これにより、コンパイルにかかる時間を省略できるため、開発サイクルが短くなります。
また、スクリプト言語は通常、メモリ管理やエラーハンドリングを自動的に処理するため、
開発者が自分でこれらの問題に対処する必要がない。

長所 短所
コンパイル不要で、スクリプトの修正が容易にできる コンパイラ言語に比べて実行速度が遅い場合がある
他のプログラムやシステムとの連携が容易 大規模なプログラム開発には向かない
シンプルな構文でプログラムを書きやすい エラーの発見が実行時まで遅れる可能性がある
オブジェクト指向や関数型プログラミングのサポートが充実 大量のデータを処理する際には向かない場合がある

使用例

  • 開発速度が重要な場合
  • 小規模なプログラムを開発する場合
  • テキスト処理やデータ解析など、高レベルなタスクに適している場合
  • プログラムの柔軟性が重要な場合(例:動的なWebサイト)

■ インタプリンタ言語とスクリプト言語の違い

上記したように、スクリプト言語は、インタプリタのおかげで同時通訳をしている.

  • コンパイル言語にはコンパイラー(翻訳者)が必要
  • スクリプト言語にはインタープリタ(通訳者)が必要

そう聞くと、スクリプトはインタプリタ型言語...?イコールなの??
厳密には同じではない。

インタプリンタとは

インタプリタは、およそ次のいずれかの動作をするプログラムのことです。
 ・ソースコードを直接解釈実行する。
 ・ソースコードを何らかの効率的な中間的なコード(中間表現)に、最初に全て変換して、あるいは、逐次変換しながら、解釈実行する。
何らかのコンパイラが生成し出力した、何らかの効率的な(マシンに依存しない、あるいは、マシン依存の)中間表現を解釈実行する。

  • 人間が理解しやすい言葉で書かれたプログラム(ソースコード)を、
    コンピュータが直接的に実行できるコード(機械語)に逐次翻訳しながらプログラムを実行していくプログラミング言語がインタプリンタ言語

スクリプト言語は言語の仕様全般の話であり、インタプリタ型言語は「プログラムの実行型」の話だ。

簡単に例で言えば、インタプリンタが親で、スクリプト言語が子供のような感じだ。

インタプリンタ型のほとんどが、スクリプト言語を採用している。
だから同じと思われやすい。

スクリプト言語とインタプリンタ言語は、実行しながら処理をするという部分は同じだが、
スクリプト言語はそのインタプリンタの同時通訳を取り入れて、
1行ずつではなくその実行時にインタプリンタの同時通訳をソースコード全体として読み込み翻訳なのだ。

各言語と利用例、できること

以下の表は、主要なプログラミング言語のタイプと利用分野の例です。
それぞれの言語は用途が多岐にわたるため、この表に挙げた利用分野以外でも使われることがあります。

プログラミング言語 タイプ 利用分野
C コンパイル言語 システムプログラミング、組み込みシステム、
データベース、OS、ネットワーク
C++ コンパイル言語 ゲーム開発、組み込みシステム、3Dグラフィックス、
OS、ブラウザー
Java コンパイル言語 エンタープライズシステム、Androidアプリ開発、
Webアプリケーション、ゲーム開発
Python スクリプト言語 データサイエンス、人工知能、Web開発、サーバーサイド、
科学技術計算
JavaScript スクリプト言語 Webアプリケーション、フロントエンド開発、ゲーム開発、
モバイルアプリ開発
PHP スクリプト言語 Web開発、サーバーサイド、
動的なWebページ、eコマース
Ruby スクリプト言語 Webアプリケーション、サーバーサイド、テスト自動化、
Webスクレイピング
Swift コンパイル言語 iOSアプリ開発、macOSアプリ開発、Linux、
組み込みシステム
Kotlin コンパイル言語 Androidアプリ開発、Webバックエンド、
デスクトップアプリ、IoT
TypeScript スクリプト言語 フロントエンド開発、Webアプリケーション、
モバイルアプリ開発、サーバーサイド
Go コンパイル言語 クラウドシステム、Webアプリケーション、ネットワーク、
組み込みシステム
Rust コンパイル言語 システムプログラミング、Webアプリケーション、
ブロックチェーン、OS、ネットワーク

Discussion