От C Source към Java Bytecode? [затворено]

Търся начин да компилирам изходния код на C във високопроизводителен байткод на Java. Използвах успешно NestedVM, но постижението в производителността не е приемливо за проект, който съм работи върху. Виждал съм също различни проекти с отворен код, насочени към този проблем, и няколко комерсиални продукта. Този SO въпрос се занимава с общ проблем с конвертирането на не-Java в източник на Java, но искам да премина само от C към Java байткод.

Кой е най-добрият начин за компилиране на изходния код на C във високопроизводителен, чист Java байт код?


person Rich Apodaca    schedule 20.01.2009    source източник
comment
С какво сравнявате представянето? Искате да кажете, че конвертираният C код работи по-бавно във VM от собствения C код? или искаш да кажеш, че работи по-бавно от Java под VM? Ако е първият, тогава не мисля, че можете да направите нещо (може да използвате JNI, но това не е вашият въпрос)   -  person hhafez    schedule 20.01.2009
comment
NestedVM работи, като създава виртуално съпоставяне върху JVM. Това води до значително натоварване в сравнение с подход, при който източникът на C се компилира директно в байт код.   -  person Rich Apodaca    schedule 22.01.2009


Отговори (4)


Тъй като съм автор на Cibyl, може да съм предубеден тук. Както и да е, разгледах java байт кода, генериран от аксиоматичния C компилатор, и той не е ефективен. И NestedVM, и Cibyl работят, като компилират MIPS двоични файлове и след това превеждат двоичния файл в Java байт код. Той е изненадващо ефективен, като основният проблем е достъпът до паметта на 8- и 16-байтови стойности (което трябва да се направи на няколко стъпки).

NestedVM и Cibyl имат малко по-различни характеристики на производителност, като Cibyl обикновено е по-бърз за натоварвания с цяло число, докато NestedVM се справя по-добре с плаващи и удвоени. Това е така, защото Cibyl използва GCC soft-float поддръжка (въпреки че използва "истински" 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
Благодаря за насърчителните думи! Както и да е, мисля, че Cibyl дойде твърде късно, точно преди смартфоните да излязат. Година по-рано и с някакъв 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 файлове и ги интегрирайте. Това е решението, imho. - person peterh; 30.03.2016
comment
Би ли било възможно да се намери еквивалент на java? Това едно и също нещо ли е? tutorialspoint.com/sqlite/index.htm. Когато искате независимост от платформата, вероятно не е добре да се придържате към C версия, защото ще трябва да прекомпилирате или изберете различна библиотека, с която да се свържете, когато отидете на различна архитектура или искате да оптимизирате за различен CPU, докато 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