生成されるクラスの仕様

基本的に普通のJavaのコードです。
java/lang/Objectを継承したクラスと言うことになります。

通常のjavaで実行されることを想定しているため、プログラムの開始位置は
Sub main(String argv[])
である必要があります。

各グローバル変数、関数はpublicかつstaticで生成されます。

ランタイムクラスRTClassについて

このコンパイラには基本的に他のライブラリを呼ぶ機能がついていません。
そこで、ランタイムとしてRTClass.classというファイルを利用します。

コンパイル時にjbc.exeと同じディレクトリにRTClass.classを置いておくと、作成するプログラムからRTClass.classの中身の関数を呼び出すことができます。
RTClass.javaを自分でjavacでコンパイルすることでこのランタイムも自由に改良することができます。
各関数はpublicかつstaticである必要があります。

RTClassは最低限static public int _String_to_int(String s)とstatic public float _String_to_float(String s)を持つ必要があります。
これは名前の通りStringからintやfloatにキャストする関数です。
Javaの仕様で文字列を例外無しに数値にキャストできないっぽいため、やむなくそこだけ外に出すことにしました。

あとは文字列をコンソールに出力するprint・printlnや文字列の長さを返すstrlenを持っています。
このクラスはコンパイル時と実行時のどちらも必要です。

おまけ?

今回は純粋に作成したクラスだけでなく、ランタイムを用いるというモデルになっています。
まぁこれだと「ランタイム使うようなものでコンパイラを名乗るのかよ」という意見もあるかと思いますが、まぁC言語だってスタートアップルーチンやシステムコール呼び出しにアセンブラでかかれたコードを通るわけだし、今回出力してるのは紛れもないJavaVMのマシン語であるということで勘弁してください。

コンパイル時にRTClassのバイトコードを無理矢理埋めこんで、単体動作させることも可能ですが、利用者の知らない関数を勝手に内部に作成されるのはそれこそ胡散臭いと言うことで外に出すことにしました。
結局静的リンクか動的リンクの違いぐらいにしかならないので。