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




Это не совсем то, о чем вы просили, но Сивилла преобразует программы составлен C в байт-код JVM. Это та же идея, что и NestedVM (о которой вы упомянули), но может быть быстрее для вашей задачи, поскольку это независимая реализация.
Я считаю, что некоторые проекты пытались это сделать, но просто нет способа справиться с указателями без некоторых довольно жестких ограничений на то, что может получить доступ к чему (по сути, они должны быть преобразованы в индексы массивов и массивы, выделенные вместо памяти)
Если у вас есть C без особой зависимости от указателей, и вы хотите, чтобы он был встроен в JVM, вы можете просто преобразовать его в Java - это должно быть довольно легко, а производительность не должна быть слишком плохой. C по-прежнему превосходит Java в большинстве областей примерно в 2 раза, а в некоторых областях намного хуже, а в некоторых областях Java фактически превосходит C (управление памятью кучи, например), но по сравнению с большинством других языков (по крайней мере, интерпретируемыми) java и c являются В 100 раз быстрее, поэтому с этой точки зрения разница между ними бессмысленна.
Что ж, есть очень важное различие: у меня есть библиотека C (sqlite), и я хочу интегрировать ее в проект java без потери независимости от платформы (так что SNI не подходит). Скорость не так критична, как вообще для sqlite. Так что делать? Скомпилируйте библиотеку в файлы java .class и интегрируйте их. Это решение, имхо.
Можно ли найти Java-эквивалент? Это одно и то же? tutorialspoint.com/sqlite/index.htm. Когда вам нужна независимость от платформы, вероятно, не стоит придерживаться версии C, потому что вам придется перекомпилировать или выбрать другую библиотеку для связывания всякий раз, когда вы переходите на другую архитектуру или хотите оптимизировать для другого процессора, тогда как версия Java просто работает и даже заново оптимизирует себя под процессор.
Как автор Сивилла, я могу быть здесь предвзятым. В любом случае, я просмотрел байт-код java, сгенерированный аксиоматическим компилятором C, и он неэффективен. NestedVM и Cibyl работают, компилируя двоичные файлы MIPS, а затем переводя двоичные файлы в байт-код Java. Это удивительно эффективно, основная проблема заключается в доступе к памяти для 8- и 16-байтовых значений (что необходимо делать в несколько этапов).
NestedVM и Cibyl имеют немного разные характеристики производительности, при этом Cibyl обычно быстрее для целочисленных рабочих нагрузок, тогда как NestedVM обрабатывает float и удваивает лучше. Это связано с тем, что Cibyl использует поддержку GCC soft-float (хотя и использует «настоящие» инструкции с плавающей запятой байт-кода Java), в то время как NestedVM транслирует инструкции MIPS FPU.
Cibyl также больше ориентирован на среды J2ME, хотя определенно может использоваться и на других платформах. Я предполагаю, что с любым из них вам повезет больше, чем с компилятором Axiomatic C.
Я взял на себя смелость разместить ссылку на Cibyl в коде Google. Надеюсь, ссылка правильная.
Получив ваш ответ в Google через 7 лет, я очень удивлен, как и почему он не получил необходимого внимания в мире открытого исходного кода. В любом случае, я перенес ваш замечательный проект из кода выключения Google в свою учетную запись github: github.com/HorvathAkosPeter/cibyl
Спасибо за ободряющие слова! В любом случае, я думаю, что Cibyl пришла слишком поздно, незадолго до того, как смартфоны стали популярными. Годом раньше и с каким-то «магазином приложений» J2ME это, вероятно, вызвало бы больший интерес. Во всяком случае, я не считаю это неудачей. Мне было очень весело реализовывать его, и я использовал его, чтобы пройти несколько старых квестов Sierra на моем мобильном телефоне :-). Ранние версии Waze также использовали его для J2ME и Blackberry (а также для Windows Phone). Я также переместил код в свою учетную запись github несколько лет назад.
попробуйте программу C2J ................
введите c в переводчик java в Google. вы получите ссылку для загрузки
С чем сравниваете производительность? Вы говорите, что преобразованный код C работает в виртуальной машине медленнее, чем собственный код C? или вы говорите, что он работает медленнее, чем Java под ВМ? Если это первый, то я не думаю, что вы можете что-то с этим поделать (возможно, используйте JNI, но это не ваш вопрос)