ソースファイル(.java)とクラスファイル(.class)の違いをファイルの中を見ることで確認してみましょう。
Hello.java を例にします。ファイルがカレントディレクトリにあることを確認します。
$ ls -l
.....
-rw------- 1 c1f08 c1f08 416 2009-02-12 19:21 Hello.class
-rw------- 1 c1f08 c1f08 119 2009-02-12 19:17 Hello.java
....
Hello.javaの内容を見てみます。
$ hd Hello.java
00000000 70 75 62 6c 69 63 20 63 6c 61 73 73 20 48 65 6c |public class Hel|
00000010 6c 6f 20 7b 20 0a 20 20 20 20 70 75 62 6c 69 63 |lo { . public|
00000020 20 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 69 | static void mai|
00000030 6e 28 20 53 74 72 69 6e 67 5b 5d 20 61 72 67 73 |n( String[] args|
00000040 20 29 20 7b 0a 20 20 20 20 20 20 20 20 53 79 73 | ) {. Sys|
00000050 74 65 6d 2e 6f 75 74 2e 70 72 69 6e 74 6c 6e 28 |tem.out.println(|
00000060 22 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 22 29 3b |"Hello World!");|
00000070 0a 20 20 20 20 7d 20 0a 7d 0a 0a |. } .}..|
0000007b
これでファイルのデータが16進表記で表すと次のように続いていることがわかります。
7075626c696320636c6173732048656c6c6f207b200a202020...
これを1バイトずつ1行に16バイト書き出しています。このような書き出しをダンプといいます。
最初の16バイトは、
70 75 62 6c 69 63 20 63 6c 61 73 73 20 48 65 6c
それを文字と解釈したものを右側に
|public class Hel|
と書いています。
70 が p, 75 が u, 62 が b, 6c が l, 69 が i, 63 が c, ....
です。20 はスペース、0a は改行です。
hd の代わりに、od も使えます。
$ od -t x1z Hello.java とします。
Hello.classの内容を見てみます。
$ hd Hello.class
00000000 ca fe ba be 00 00 00 32 00 1d 0a 00 06 00 0f 09 |.......2........|
00000010 00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 |................|
00000020 00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 |.....<init>...()|
00000030 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e |V...Code...LineN|
00000040 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 |umberTable...mai|
00000050 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 |n...([Ljava/lang|
00000060 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 |/String;)V...Sou|
00000070 72 63 65 46 69 6c 65 01 00 0a 48 65 6c 6c 6f 2e |rceFile...Hello.|
00000080 6a 61 76 61 0c 00 07 00 08 07 00 17 0c 00 18 00 |java............|
00000090 19 01 00 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 |....Hello World!|
000000a0 07 00 1a 0c 00 1b 00 1c 01 00 05 48 65 6c 6c 6f |...........Hello|
000000b0 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a |...java/lang/Obj|
000000c0 65 63 74 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f |ect...java/lang/|
000000d0 53 79 73 74 65 6d 01 00 03 6f 75 74 01 00 15 4c |System...out...L|
000000e0 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 |java/io/PrintStr|
000000f0 65 61 6d 3b 01 00 13 6a 61 76 61 2f 69 6f 2f 50 |eam;...java/io/P|
00000100 72 69 6e 74 53 74 72 65 61 6d 01 00 07 70 72 69 |rintStream...pri|
00000110 6e 74 6c 6e 01 00 15 28 4c 6a 61 76 61 2f 6c 61 |ntln...(Ljava/la|
00000120 6e 67 2f 53 74 72 69 6e 67 3b 29 56 00 21 00 05 |ng/String;)V.!..|
00000130 00 06 00 00 00 00 00 02 00 01 00 07 00 08 00 01 |................|
00000140 00 09 00 00 00 1d 00 01 00 01 00 00 00 05 2a b7 |..............*.|
00000150 00 01 b1 00 00 00 01 00 0a 00 00 00 06 00 01 00 |................|
00000160 00 00 01 00 09 00 0b 00 0c 00 01 00 09 00 00 00 |................|
00000170 25 00 02 00 01 00 00 00 09 b2 00 02 12 03 b6 00 |%...............|
00000180 04 b1 00 00 00 01 00 0a 00 00 00 0a 00 02 00 00 |................|
00000190 00 03 00 08 00 04 00 01 00 0d 00 00 00 02 00 0e |................|
000001a0
ソースファイルと同様に文字として読める部分もありますが、文字として解釈できない部分も多くあります。
ca fe ba be 00 00 00 32 00 1d 0a 00 06 00 0f 09
最初の ca fe ba be はjavaのクラスファイルであることを識別するためのものです。
データ本体はその後の 00 00 00 32 00 1d 0a 00 06 00 0f 09 から始まりますが、対応する文字があるのは、32 の 2 だけで、その他は対応する文字がないので右側の部分にはすべてドットで表現されています。
32もたまたま文字にすれば 2 というだけで、2 の意味でここにあるわけではありません。このような文字としての解釈をしない前提で作られているファイルを一般にバイナリーファイルといいます。逆に文字としての解釈を前提にしたファイルをテキストファイルといいます。
以下に、英字だけのコード表(数値と文字の対応表)を出しておきます。
60+1=61 で 61に対応する文字は a 60+B=6B で 6Bに対応する文字は k と読みます。20は赤い色が付いていますが、これは半角スペースです。
薄い水色の部分は制御文字で、0a は改行、09 はタブ、07 はベルをならすことを意味します。普通の意味での文字ではありません。
ここにある文字以外を使う西洋諸国やアジアの文字、日本の文字を表すのにはそれぞれいくつかのやり方があります。さらに複雑になりますので解説はここまでにします。
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
10 | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
20 | . |
! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
30 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
40 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
50 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
60 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
70 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |