GPCP однозначно проработаннее JOB'а.
Сергей Залманович мог открыть исходники JOB'а уже давно, тем более компилятор вроде как учебный. Но вовремя он этого не сделал, и сейчас GPCP обходит JOB практически по всем параметрам. Язык: КП вместо Оберона-2. Есть расширения языка для удобства интеграции в JVM, например, обработка исключений. Как работать с JVM без этого?
А у JOB есть недостатки. Например, не реализованы все возможности Оберона-2. Навскидку - нету указателей на процедурные типы. Не верите - потестируйте сами.
Когда я пробовал генерировать мидлеты для Java ME на JOB, у меня ничего не получилось. На GPCP (после исправления ошибки в утилите J2CPS) - вполне успешно:
http://zx.oberon2.ru/forum/viewtopic.php?f=27&t=27Замечу ещё: ранее Джону Гофу (мною, в частности) в рассылке давались многие пожелания по усовершенствованию компилятора, ровно также как и по устранению косметических багов, я могу назвать парочку: например, при IMPORT A := B в модуле доступны оба идентификатора (A и B как синонимы) - хотя такого поведения я не наблюдал ни в одной реализации Оберона. Ещё косметическая (хотя не совсем) проблема с CONST A=INTEGER (пишу по памяти). Всё это не исправлено до сих пор. Компилятор иногда вылетает с ошибкой COMPILER PANIC вместо текстового сообщения. Хотя на практике это просто синтаксическая ошибке в исходнике.
Я сгенерировал не работающий HelloWorld на GPCP для Android, идучи путём автора статьи
«Mirah — глоток свежего… кофе»:
http://zx.oberon2.ru/forum/viewtopic.php?f=87&t=244Но в процессе генерации символьных файлов .cps из Андроид-классов утилита J2CPS вываливается с ошибкой на некоторых классах. А полученный HelloWorld при запуске даёт ошибку отсутствия вызова суперконструктора. Т.е. <init> главного класса приложения не может стартовать. Вот как об этой проблеме отзывается стандартный эмулятор из Android SDK:
Цитата:
I/ActivityManager( 61): Starting activity: Intent { act=android.intent.action.
MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=CP.Hello/.Hello_Main }
I/ActivityManager( 61): Start proc CP.Hello for activity CP.Hello/.Hello_Main:
pid=381 uid=10028 gids={}
D/dalvikvm( 381): newInstance failed: no <init>()
D/AndroidRuntime( 381): Shutting down VM
W/dalvikvm( 381): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime( 381): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 381): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{CP.Hello/CP.Hello.Hello_Main}: java.lang.InstantiationException: CP.Hello.Hello_Main
Я бы с удовольствием пробовал ковырять GPCP + Android и дальше, но вот эта проблема с J2CPS и проблема невызывания конструктора (которая может быть следствием) понижает запал. Желающим помочь в исправлении сих багов буду всячески содействовать.
Уверен, что разрабатывать на GPCP для Android можно. Проблема различия версий JVM не существенна, всё равно dx всё конвертирует в байт-код Dalvik. Скомпилированный GPCP и декомпилированный класс, а потом скомпилированный снова с помощью javac работает на Андроид-устройстве, проверено. Так что нужно только зафиксить вызов суперконструктора.
Есть ещё парочка трудностей. В GPCP несовместимы типы java_lang.CharSequence и ARRAY OF CHAR, поэтому вызов некоторых функций Android'а затруднён. Как решить - ещё не понял. Далее. Неудобно задавать юникодовые строки (кодировка исходников однобайтовая). Но в JOB'е символы вообще однобайтовые. Вобщем, есть над чем потрудиться.
Так что могу очень осторожно рекомендовать GPCP для JVM только людям, не боящимся трудностей. Рацпредложение №1: совместно скинуться Джону Гофу и попросить его ускорить правку багов, т.к. он лучше всех знает как устроен этот компилятор. №2: фиксить своими силами, но для этого нужна квалификация (знание внутреннего устройства JVM, .class- и .cps-файлов и т.п.).