Имхо для оберона проще всего замутить свой байткод и виртуальную машину. Что то вроде P-кода.
Повторить путь первых паскалей короче 
Реализацию виртуальной машины можно будет под все мыслимые платформы замутить. Там исходник то как помнится строк 300 от силы 
Я думаю компилировать надо в промежуточный язык (не являющийся кодом никакой виртуальной машины). Разница между исходным и промежуточным языками в том, что исходный язык - текстовый (оптимизированный для человека), а промежуточный - бинарный (оптимизированный для быстрой загрузки JIT компилятором). Но не смотря на то, что он бинарный, он содержит всю необходимую информацию об исходной программе. Затем надо будет написать JIT компилятор. Вот JIT компилятор на первое время (по причине очкования) можно сделать в байт-код собственной виртуальной машины.
То есть надо написать три программы
1) Транслятор "текстовый язык"-->"бинарный язык"
2) JIT компилятор "бинарный язык" --> "байт код"
3) Виртуальная машина исполняющая байт код.
Если договориться о языке промежуточного бинарного представления и о байткоде. То эти три программы можно писать независимо и параллельно, тремя разными людьми.
Четвёртый человек может в это же время писать JIT компилятор во что-то другое, хоть в натив.