かねがね思っているがソフトウェアはマン・マシンインターフェースの事だ。マンとマシンのインターフェースといえばマシンマンがいると思う。
マンとマシンが一つになったところと、胸に輝くエムマーク
後学のため歌詞なども載せておく
マシン空間光に乗って
マシンドルフィン飛んで来る
マンとマシンが一つになって
胸に輝く「M」マーク
赤い太陽仮面に燃えて
すっくと立った星雲仮面
心に星を持つ男
強く優しい星雲仮面
あれはっ? あれはっ?
あれは僕らのマシンマン
マシンマン
いつものことだが前置きはどうでもいい。マシンとはここではモーフィアスが演説するあのマシーン、マルクスが述べるあのマシーンのことである。マシーン、この甘いひびき、マシーン、痒くなる、それはジンマシーン。
そして円でエンエン円でもつかったが、コンピューターもマシーンだ。マシンが言葉を話すとしたらそれはマシン語。コンピューターがマシン語で会話している可能性は非常に高い。昔ログインで音響カプラに口をあててCLSを出すという企画があったが、それがマシン語だ。音にするとピーピーガーガー。
ところでJAVAもマシン語になっておさまっている。JAVAの構想はヴァーチャルマシーンという、架空のマシーンの上で動くプログラムというかたちなので、マシン語も架空のマシーンの上で動くという、イメクラ並みの発想でつくられている。
JAVAのマシン語、それはヴァーチャルマシン語と言われるはずだが、バイトコードと呼ばれる。
JAVAのコンパイル結果はクラスファイルで、その中にバイトコードがつめこまれていると思われる。ショーロンポーにぶたにくスープがぎっしりつまっているのと同じように
ためしにすんごい短いコードを書いてコンパイルしてみる
/*
* test.java
*
* Created on 2004/04/28, 9:15
*/
package test;
/**
*
* @author okamino
*/
public class test {
/** Creates a new instance of test */
public test() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println("ABCDEFG");
}
}
これをコンパイルした結果を、ばいなりエディタで見るとこうだ
これがマンマシンインターフェースそのもの、これこそヴァーチャルマシン語だ。
そんでもってこのファイルはマシンに理解できるように書くわけだから、当然フォーマットは機械に理解できるルールでないと機械が困る。機械は困らないが、機械に誤作動される人間が困る。
で、ファイルの一番最初の最初は、このファイルがどういうものかというのを書いておくことが非常に多い。このファイルをのみこんだマシン、プログラムが、吐き出すにせよ飲み込むにせよ、素性がわからないと困ってしまう。あたまにある文字をマジックナンバーということが多い。
JAVAのクラスファイルのあたまはハ。コセとなっているが、右の数字の羅列を見るとCAFEBABE(カフェベイブ)となっている。おそらく「カフェのあの子は今どこに・・・」という程の意味であろう。
JAVAの場合は16進のデータまんまをCAFABADEと読ませている
が、普通はアスキー文字のハ。コセの部分で意味が分かるようにすることが多い、身近なファイルを見れば%PDFだとかIIだとかMZとかPMとかいろいろ書いてあるので、このファイルはどういう素性のものだ、という第一の手がかりとする。おのおのファイルがどういうマジックナンバーをもっているか、ばいなりエディタなどで見てみるとよい。
とここまで書いて、今日もこのコーナー、教条的なものでなかったのを思い出した。否定形の教育はいけない。本編にもどろうそこでタイトルロール、ばっK
円円円―っ
ジャバZ!−後編−
ということで気が向いたのでJAVAのバイトコードをながめてみることにした。もう一度先ほどのリストを出してみたい。
http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html
ここにファイルのフォーマットが書いてあって、クラスファイルは構造体として表すとこうなると書いてある
ClassFile
{
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}

仕様書のどこかには書いてあるんだろうが”CAFEBABE”がmagicのはずで、u4となっているので1uが1バイトであるのが分かる。分かっているところでその後がバージョン情報で、2バイト2バイト。続いて続くのがコンスタントプールのカウント数
で、おそらくこれは最近のバイトデータによくあるチャンクとかタグとかいったデータのことに違いが無い。仕様を視るとこの数は実際よりも一多いということなので16進で21、33個のコンスタントプールがあるということになっている。