От исходного кода C до байт-кода Java?

Я ищу способ скомпилировать исходный код C в высокопроизводительный байт-код Java. Я успешно использовал NestedVM, но снижение производительности неприемлемо для проекта, над которым я работаю. работа над. Я также видел различные проекты с открытым исходным кодом, направленные на решение этой проблемы, и несколько коммерческих продуктов. Этот вопрос SO касается общей проблемы преобразования не-Java в источник Java, но я хочу перейти только от C к байт-коду Java.

Как лучше всего скомпилировать исходный код C в высокопроизводительный чистый байт-код Java?


person Rich Apodaca    schedule 20.01.2009    source источник
comment
С чем вы сравниваете производительность? Вы говорите, что преобразованный код C работает в виртуальной машине медленнее, чем собственный код C? или вы хотите сказать, что она работает медленнее, чем Java под ВМ? Если это первое, то я не думаю, что вы можете что-то с этим поделать (возможно, используйте JNI, но это не ваш вопрос)   -  person hhafez    schedule 20.01.2009
comment
NestedVM работает, создавая виртуальную машину поверх JVM. Это приводит к значительным накладным расходам по сравнению с подходом, при котором исходный код C компилируется непосредственно в байт-код.   -  person Rich Apodaca    schedule 22.01.2009


Ответы (4)


Будучи автором Cbyl, я могу быть предвзятым. Во всяком случае, я просмотрел байт-код java, сгенерированный аксиоматическим компилятором C, и он неэффективен. И NestedVM, и Cibyl работают, компилируя двоичные файлы MIPS, а затем переводя двоичные файлы в байт-код Java. Он на удивление эффективен, основная проблема заключается в доступе к памяти 8- и 16-байтовых значений (что необходимо делать в несколько шагов).

NestedVM и Cibyl имеют немного разные характеристики производительности: Cibyl обычно быстрее для рабочих нагрузок с большим количеством целых чисел, тогда как NestedVM лучше обрабатывает числа с плавающей запятой и удвоения. Это связано с тем, что Cibyl использует поддержку мягкого плавания GCC (хотя и использует «настоящие» инструкции с плавающей запятой байт-кода Java), в то время как NestedVM переводит инструкции MIPS FPU.

Cibyl также в большей степени ориентирован на среды J2ME, хотя, безусловно, его можно использовать и на других платформах. Я предполагаю, что с любым из них вам повезет больше, чем с компилятором Axiomatic C.

person Simon Kågström    schedule 22.09.2009
comment
Я позволил себе ссылку на Cibyl в коде Google. Надеюсь ссылка правильная. - person sleske; 18.12.2013
comment
Найдя ваш ответ в Google через 7 лет, я очень удивлен, как и почему он не привлек должного внимания в мире открытого исходного кода. В любом случае, я перенес ваш замечательный проект из закрытого кода Google в свою учетную запись github: github.com/HorvathAkosPeter/cibyl - person peterh; 30.03.2016
comment
Спасибо за ободряющие слова! В любом случае, я думаю, что Сибил пришла слишком поздно, как раз перед тем, как взлетели смартфоны. Годом раньше и с каким-нибудь магазином приложений J2ME, вероятно, это вызвало бы больший интерес. Во всяком случае, я не считаю это провалом. Я получил огромное удовольствие от его реализации и использовал его, чтобы пройти несколько старых квестов Sierra на своем мобильном телефоне :-). Ранние версии Waze также использовали его для J2ME и Blackberry (а также для Windows Phone). Я также перенес код в свою учетную запись github несколько лет назад. - person Simon Kågström; 01.04.2016

Это не совсем то, о чем вы просили, но Cibyl преобразует скомпилировано Программы C в байт-код JVM. Это та же идея, что и NestedVM (о которой вы упомянули), но она может быть быстрее для вашей задачи, поскольку это независимая реализация.

person geocar    schedule 20.01.2009

Я считаю, что некоторые проекты пытались это сделать, но просто невозможно иметь дело с указателями без довольно жестких ограничений на то, что может получить доступ к чему (по сути, они должны быть преобразованы в индексы массивов и массивы, выделенные вместо памяти)

Если у вас есть C, не слишком полагающийся на указатели, и вы хотите использовать его в JVM, вы можете просто преобразовать его в Java - это должно быть довольно просто, а производительность не должна быть слишком плохой. C по-прежнему превосходит Java в большинстве областей примерно в 2 раза, а в некоторых областях намного хуже, а в некоторых областях Java действительно превосходит C (например, управление динамической памятью), но по сравнению с большинством других языков (по крайней мере, интерпретируемых) java и c В 100 раз быстрее, поэтому с этой точки зрения разница между ними довольно бессмысленна.

person Bill K    schedule 20.01.2009
comment
Что ж, есть очень важное отличие: у меня есть библиотека C (sqlite), и я хочу интегрировать ее в проект java, не теряя при этом независимости от платформы (поэтому SNI не подходит). Скорость не так критична, как вообще для sqlite. Так что делать? Скомпилируйте библиотеку в файлы java .class и интегрируйте их. Это решение, имхо. - person peterh; 30.03.2016
comment
Можно ли найти эквивалент Java? Это то же самое? tutorialspoint.com/sqlite/index.htm. Если вам нужна независимость от платформы, вероятно, не стоит придерживаться версии C, потому что вам придется перекомпилировать или выбирать другую библиотеку для связи с ней всякий раз, когда вы переходите на другую архитектуру или хотите оптимизировать для другого ЦП, тогда как версия Java просто работает и даже повторно оптимизирует себя для процессора. - person Bill K; 30.03.2016

попробуйте программное обеспечение C2J ................

введите c в java переводчик в google. вы получите ссылку для скачивания

person feroz    schedule 12.11.2009
comment
Благодаря feroz я вспомнил C2J, который выглядит так, как будто он находится под лицензией GPL (по крайней мере, на период бета-тестирования, который начался в .. 2001?). Не уверен, использует ли он подход типа NestedVM или что-то еще. Может стоит еще раз проверить. - person Rich Apodaca; 12.11.2009