Javaバイトコード復習 (0) - 導入

ちょっとアイデアが出たのでバイトコード上でのモデル検査をやろうかなと思ってます。ただ、バイトコードを最後に触ったのが4年前だかですっかり忘れてたので、復習の過程をまとめていこうかと。

バイトコードバイナリエディタで書くのがつらすぎるので、Jasminとかいうアセンブラを使います。

ダウンロード

http://jasmin.sourceforge.net/ の "Download Jasmin from SourceForge" から jasmin-2.3.zip をダウンロードしてくる。

インストール

インストールってほどのものでもないけど、次のようなフォルダ構成を作る。

  • フォルダ構成
 +-jasmin/
    |
    +-src/ (作業フォルダ)
    |
    +-bin/ (クラスファイル出力先)
    | 
    +-lib/
    |  |
    |  +-jasmin.jar (jasmin-2.3.zipに同梱)
    |
    +-jasmin.bat (これから作る)
  • jasmin.bat
@echo off
java -jar lib/jasmin.jar -d bin -g -e UTF-8 %1 %2 %3 %4 %5 %6 %7 %8 %9

jasminディレクトリで、 jasmin src/Hoge.j 見たいな感じで使います。出力先は bin/ 以下な感じ。シェルスクリプトな人も@echo offを消して最後を $@ に変えるだけでOKかと。

Hello, world!

基本はHello, world!です。ソースは src/Hello.j に。

  • src/Hello.j
; public class Hello /* extends Object */ {
.class public Hello
.super java/lang/Object

; public static void main(String[] args) {
.method public static main([Ljava/lang/String;)V
.limit stack 2
.limit locals 1

; System.out.println("Hello, world!")
  getstatic java/lang/System/out Ljava/io/PrintStream;
  ldc "Hello, world!"
  invokevirtual java/io/PrintStream/println(Ljava/lang/Object;)V

;}
  return
.end method

「言語は生産性と関係ないよ」と偉い人がおっしゃっていましたが、高級言語と低級言語じゃ違いすぎるorz

アセンブル+実行

Jasminを実行します

jasmin src/Hello.j
Generated: bin\Hello.class

bin/Hello.class ができるので、あとは普通にJavaの世界です。

java -cp bin Hello
Hello, world!

こんにちは。