Недавно мне в руки попала интересная вещь — Simple Java Compiler от Стефана Френца. Как он сам пишет, его компилятор преобразует Java-код в native-код для определенной архитектуры (поддержка IA-32 и AMD64). Компилятор использует спец-аннотации. Автор реализовал с помощью компилятора несколько ОС. Также один умелец по имени lenidh написал ОС Bearded Robot.
Компилятор можно скачать на сайте автора.
Сегодня я вам покажу, как написать нативный «Hello, world!», который потом можно запустить в QEMU.
Класс Object — суперкласс всех классов в Java.
А теперь и «Hello World!»
А теперь компилируем.
Для Linux (32-bit):
Пример для 64-bit есть в поставке компилятора.
Для Windows (32-bit):
Пример для AMD64 есть в поставке компилятора.
Для запуска в QEMU:
Всем спасибо за внимание.
Компилятор можно скачать на сайте автора.
Сегодня я вам покажу, как написать нативный «Hello, world!», который потом можно запустить в QEMU.
Класс Object — суперкласс всех классов в Java.
Код
package java.lang;
import rte.SClassDesc;
public class Object {
public final SClassDesc _r_type=null;
public final Object _r_next=null;
public final int _r_relocEntries=0, _r_scalarSize=0;
}
package java.lang;
public class String {
private char[] value;
private int count;
@SJC.Inline
public int length() {
return count;
}
@SJC.Inline
public char charAt(int i) {
return value[i];
}
}
package rte;
public class SArray {
public final int length=0, _r_dim=0, _r_stdType=0;
public final Object _r_unitType=null;
}
package rte;
public class SClassDesc {
public SClassDesc parent;
public SIntfMap implementations;
}
package rte;
public class SIntfDesc {
}
package rte;
public class SIntfMap {
public SIntfDesc owner;
public SIntfMap next;
}
package rte;
public class SMthdBlock {
}
package rte;
public class DynamicRuntime {
public static Object newInstance(int scalarSize, int relocEntries,
SClassDesc type) { while(true); }
public static SArray newArray(int length, int arrDim, int entrySize,
int stdType, Object unitType) { while(true); }
public static void newMultArray(SArray[] parent, int curLevel,
int destLevel, int length, int arrDim, int entrySize, int stdType,
Object unitType) { while(true); }
public static boolean isInstance(Object o, SClassDesc dest,
boolean asCast) { while(true); }
public static SIntfMap isImplementation(Object o, SIntfDesc dest,
boolean asCast) { while(true); }
public static boolean isArray(SArray o, int stdType,
Object unitType, int arrDim, boolean asCast) { while(true); }
public static void checkArrayStore(Object dest,
SArray newEntry) { while(true); }
}
А теперь и «Hello World!»
Код
package kernel;
public class Kernel {
private static int vidMem=0xB8000;
public static void main() {
print("Hello World");
while(true);
}
public static void print(String str) {
int i;
for (i=0; i<str.length(); i++) print(str.charAt(i));
}
public static void print(char c) {
MAGIC.wMem8(vidMem++, (byte)c);
MAGIC.wMem8(vidMem++, (byte)0x07);
}
}
А теперь компилируем.
Для Linux (32-bit):
./compile rte.java hello.java -o boot
Пример для 64-bit есть в поставке компилятора.
Для Windows (32-bit):
compile rte.java hello.java -o boot
Пример для AMD64 есть в поставке компилятора.
Для запуска в QEMU:
qemu-system-i386 -boot a -fda BOOT_FLP.IMG
Всем спасибо за внимание.