Entries

スポンサーサイト
[EDIT]
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

-件のコメント

コメントの投稿

新規
非公開にする

-件のトラックバック

トラックバックURL
http://harukazehajime.blog115.fc2.com/tb.php/127-02bace4b
この記事に対してトラックバックを送信する(FC2ブログユーザー)
バイトコードと仮想機械
[EDIT]
要望があったので、バイトコードについて解説します。
今後もツイッターやブログコメントで要望があれば、(可能であれば)記事にしていこうと思います。

プログラミングに少しでも興味があるなら、Javaが爆発的に普及していることはご存知でしょう。C言語に比肩するくらいにまで広く使われています。
Javaが普及した秘密はCよりも学習コストが低いこともさることながら、移植性に優れ、比較的新しい言語であるがゆえに近代的な機能を持っているところも大きな理由です。
Javaの高い移植性を実現しているのが、今回扱うバイトコードです。

Javaはもともと、JVM(Java Virtual Machine)と呼ばれる、Javaプログラムを実行するための仮想的なコンピュータ(仮想機械、バーチャルマシン)を用いることで高い移植性を現実のものにしました。
バーチャルマシンとは、端的に言ってしまえばソースコードを一行ずつ読み込んで実行していくインタープリタのことです。ですが、仮想的なコンピュータというだけに、インタープリタとは違ってよりコンピュータに近い仕組みになっています。
Javaはバーチャルマシンに合わせた機械語を実行していきます。本来の機械語はCPUが直接実行するのでCPU依存したものですが、バーチャルマシン用の機械語はCPUが直接実行することはないため、高い移植性を可能にしています。そしてバーチャルマシン用の機械語をバイトコードといいます。

なぜバーチャルマシンが必要なのか、普通のインタープリタでは駄目なのか、という疑問が湧いてくると思います。BASICはインタープリタで実行するプログラミング言語の代表格です(CPU専用の機械語にコンパイルできる方言もたくさんあります)。
BASICで書かれたプログラムは、ソースコードをインタープリタに読み込ませればすぐに実行できます。しかし、実行の手順を見ると、
  1. 字句解析 キーワードを分割して取り出し、構文木と呼ばれるものを作ること

  2. 意味解析 字句解析で得たキーワードが何を意味しているか――演算子なのか、変数名なのか、サブルーチン名なのかなど――を調べる

  3. 実行   構文木をたどり、意味解析の結果に合わせてインタープリタに組み込まれたサブルーチンを実行したり、OSの機能を呼び出したり、ソースコードの読み込み位置を変えたりといった処理を行う

というステップによってプログラムとして機能します。
インタープリタではソースコードを読み込むたびにこれらすべてを行うので、処理速度の遅いコンピュータでは動作が非常に遅いという欠点がありました(現在はコンピュータの性能向上によって、さして気にならない程度になりました)。

それに対して、JavaではJVMの機械語にコンパイルしてから実行させます。このコンパイルの過程で、
  1. 字句解析や意味解析を済ませる

  2. 構文木をたどる順番にソースコードを並べ替える(例えば括弧で括られた計算など、優先順位の高い処理を先に並べることで、実行する順番を気にする必要がなくなる)

  3. インタープリタで呼び出すサブルーチン(命令)を番号に置き換える

  4. コンピュータが高速に処理できるバイナリ(2進数表現、機械的表現)に変換する

といったことを行います。
バーチャルマシンは、インタープリタがプログラムを実行するのに必要な作業のほとんどがあらかじめ済んでいるので、通常のインタープリタより高速に処理できます。
こうしてでき上がったものを中間コードと呼びます。バイトコードは中間コードの一種で、命令番号が1バイト(8ビット、255種類まで)になっているためこのように呼ばれます。

中間コードを利用することは、Java以前からありました。Pascalも初期はP-code(Pseudo Code)と呼ばれる中間コードを利用していますし、BCPLと呼ばれる、C言語の遠い祖先もまた、O-codeと呼ばれる中間コードを利用していました。
最近ではPerl6やRuby、C/Objective-C(ごく一部)、C#やVisualBasic.NETなど、様々なところで用いられるようになってきています。
これらの近代的な言語では、Just In Timeコンパイルと呼ばれる、実行時にバイトコードからネイティブコード(CPU固有の機械語)にコンパイルしたり、バイトコードとして実行している間に頻繁に実行される部分だけをネイティブコードにコンパイルする動的コンパイル(JavaではHotSpotという)などを行って実行速度を大幅に改善する技術が利用されています。
ネイティブコンパイラ(CPU 機械語にコンパイルするコンパイラ)で実装されていたCやObjective-Cは、移植性の高さを持たせ、機械語にかなり近いバイトコードにコンパイルすることで、ネイティブコードにコンパイルしやすくすることが目的のひとつです。
関連記事

0件のコメント

コメントの投稿

新規
非公開にする

0件のトラックバック

トラックバックURL
http://harukazehajime.blog115.fc2.com/tb.php/127-02bace4b
この記事に対してトラックバックを送信する(FC2ブログユーザー)

Appendix

プロフィール

さくらゆーな

Author:さくらゆーな
鉄道熱が再燃して、撮影に模型にいろいろやってます。
最近反核運動に偏ってるのを反省したいけど
知れば知るほど極悪非道な界隈で止まらない…

カレンダー

03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

+ アーカイブ
 

最近の記事

カテゴリー

検索フォーム


キーワード

カウンター

トータルカウンター
現在の閲覧者数:

ads3

Mac ソフトのことなら act2.com

Make a donate

もしこのブログを気に入っていただけたら上記アフィリエイトプログラムか下のPayPalでブログ・サイトの維持にご協力ください。

donationPrice

ブロとも申請フォーム

この人とブロともになる

ブログランク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。