Java-ning C darajali ko'chirilishiga erishishiga nima to'sqinlik qiladi?

Umuman olganda, taşınabilirlik, odatda, til yoki texnologiyalar ishlaydigan platformalar ulushi sifatida belgilanadi, C/C ++ odatda Java'dan ko'ra ko'proq ko'proq deb yuritiladi, chunki Java ilovasi JVM mavjudligiga bog'liq.

But, what prevents a Java application from shipping within a JVM wrapper? Or being transpiled to C/C++ with a supporting framework? (Essentially a JVM, but as a supporting library instead of a wrapper/container.)

Is there a technical issue? A licensing issue? Or, simply that no one has decided to do it!?


Haqiqiy misolni ko'rib chiqsangiz, birinchi javobning ikkinchi o'qini hisobga oling: " Nima uchun o'yinni rivojlantirish uchun Java keng tarqalgan emas? ", bu quyidagilarni bildiradi:

Ko'pgina konsollar (masalan, 360, PS3) JVMga ega emas, shuning uchun kodni kompyuter versiyasidan qayta ishlata olmaysiz. C ++ kodini turli xil qurilmalarni qo'llab-quvvatlash uchun tuzish juda oson.

Agar bu da'vo to'g'rilanardi ("ko'p" konsollar bilan bog'liq holda), texnik cheklovlar tufayli ushbu platformalar uchun JVM etishmasligi? Huquqiymi? Siyosiy? va boshqalar.


Java "o'yin konsollarida (yoki iPhone) ishlamasligini" aytganda, biz aslida olmaysiz demoqchiman? Yoki, demak, "hech kim bezovta qilmasa, ? "

4
C dasturini Java (yoki C ++) ga nisbatan ancha soddalashtiradigan narsa u bilan bog'liq bo'lishi mumkin. Xotiradan foydalanishni to'g'ridan-to'g'ri nazorat qilish qobiliyati, KiloBytes sizning umumiy xotirangizni o'lchash uchun juda noaniq bo'lsa yoki Foo vidjetiga tegishli ma'lumotni aniqlaydigan bo'lsa, maxsus xotira manziliga 0xf0 </< kodi>.
qo'shib qo'ydi muallif steve, manba
"Java dasturi JVM mavjudligiga bog'liq." va C manba kodi platforma uchun mavjud bo'lgan kompilyatorga bog'liq.
qo'shib qo'ydi muallif rrbaker, manba

5 javoblar

Java C yoki C ++ portativ bo'lishi mumkinligi bilan portativdir: bir xil manba kodi bir nechta operatsion tizimlar yoki protsessor arxitekturalari uchun ishlatilishi mumkin. Aslida, bu Java-da juda oson, chunki JVM ko'p platformalar uchun maxsus tafsilotlarni (masalan, long int yoki endiannessning o'lchami) qisqartiradi va standart kutubxona taqdim etilgan funktsiyalar haqida qisqacha ma'lumot beradi OS tomonidan (masalan, faylni ochish).

C va C ++ uchun keyingi eng yaxshi narsa hech bo'lmaganda Unixes va Linuxda manba ko'chirishni ta'minlaydigan POSIX standartiga mos keladi, lekin Windowsni WSL yoki Cygwin holda o'z ichiga olmaydi. Va Java-dan farqli o'laroq, har bir maqsadli platforma uchun portativ kod bazasi qayta-qayta takrorlanishi kerak. C va C ++ ni "ko'chma" deb ataydigan narsa, GCC kabi o'zaro translyatsiya qiluvchilardan juda ko'p maqsadli platformalarga ega bo'lishni talab qiladi (yangi maqsadli plakatlarni qo'llab-quvvatlash uchun siz "faqat" yangi derleyici ordenini yaratishingiz kerak).

Java 9 Java ilovasini Java Runtime ning kerakli qismlarini o'z ichiga olgan mustaqil dasturga aylantirish imkoniyatini taqdim etadi. Siz JVM-ning taşınabilirliği bilan hali ham cheklangansiz. Va maqsad operatsion tizimida paketni yaratish kerak.

JVM o'zi o'zi portativ bo'lishi mumkin yoki bo'lmasligi mumkin bo'lgan dasturdir. Masalan, HotSpot - C ++ dasturidir, u yangi OS yoki arxitektura vositalariga ulanishi mumkin.

Xo'sh, agar biz to'liq operatsion tizimni ishga tushirmasligi yoki apparat cheklashlarga ega bo'lishi mumkin bo'lgan ko'milgan qurilmani aniqlasak nima bo'ladi? Bu C va Java uchun ham qiyin bo'ladi. Biroq, o'rnatilgan JRElar mavjud, va har ikkala til tillari uchun ham yechim kichikroq standart kutubxonani maqsadlashni o'z ichiga oladi. Java 9 Java ME kabi oldindan belgilangan profilga ega bo'lish o'rniga, qurish vaqtida modullarni tanlash imkonini beradi.

C-ning g'olib bo'lishiga qaramay, operatsion tizimning yo'qligi da ishlaydigan bitta ishlatish holati to'g'ridan-to'g'ri mikrokontrolratorga ulangan. Siz standart kutubxonadan foydalana olmaysiz (masalan, fayllarni ochish yoki dinamik xotira ajratish uchun), lekin asosiy til hali ham mavjud. Biroq "portativlik" ning ma'nosini "standart kutubxonasiz ishlash" ga cheklash maqsadga muvofiq emas.

IOS yoki konsollar kabi bloklangan tizimlar, agar ular jismonan ushbu dasturiy ta'minotni ishlatishga qodir bo'lsalar ham, odatdagi dasturiy ta'minotni o'rnatishga ruxsat bermaydilar - odatda standart protsessorlardan qurilgan, standart yadrolardan foydalaniladi. Ushbu tizimlar bo'yicha JVMning yo'qligi, darvozabonning (masalan, Apple yoki Nintendo) o'zlarining nazorati ostida bo'lmagan alohida platformaga ruxsat berishdan manfaatdor emas. Shunday qilib, bu yo'qotish qonuniy/siyosiy.

13
qo'shib qo'ydi
@svidgen Java Yil hali ham 32 MB RAM va mutlaq minimal to'plami uchun yana 11 MB ROM. Ko'pgina ko'milgan tizimlar uchun bu katta xotira. Ayrim manbalar uchun Atmelning AVR mikrokontrolllari ROMning 384 Ki B va RAM 32 Ki ga ega. Ushbu maxsus MSP430 mikrokontrolörü (PDF link) 2 KB ROM va 128 RAMning B (eslatma: no prefix, faqat 128 bayt). JVM bularga mos kelmaydi.
qo'shib qo'ydi muallif steve, manba
@svidgen Java ME (PDF link) Java SE ga qaraganda ancha zaifroq, faqat 128 KB RAM va 1 MB ROM talab qilinadi. Ammo qimmatli tashqi xotirasi bo'lmagan AVRlar uchun bu juda ko'p.
qo'shib qo'ydi muallif steve, manba
"Java 9 Java ilovasini Java Runtime ning kerakli qismlarini o'z ichiga olgan mustaqil dasturga aylantirish imkoniyatini taqdim etadi." ... O'sha. Men ko'proq tadqiqot qilishim kerak edi. Gapirdagigan gapim yo'q.
qo'shib qo'ydi muallif svidgen, manba
Sizning so'nggi fikringizga qaraganda, kichik tizimlar emas, balki Java SE/EE hal qiladi?
qo'shib qo'ydi muallif svidgen, manba
Yaxshi tahrir. Rahmat.
qo'shib qo'ydi muallif svidgen, manba
@svidgen o'rnatilgan tizimlar OS-kam bo'lmasligi kerak. Biroq, ha, Oracle, Java ME tasvirlarni taqdim etilishini, ya'ni, bir uy egasi operatsion tizimi holda ishlashi mumkin. SE/EE-ning Java standart va korporativ nashrlari ekanligini e'tiborga oling, ular ko'milganlarga juda mos kelmaydi.
qo'shib qo'ydi muallif amon, manba

Java dasturi JVM mavjudligiga bog'liq.

Bu to'g'ri emas. JVM haqida hech narsa aytmaydigan Java tilining o'ziga xos xususiyati yo'q. Oracle ikkita alohida-alohida saqlanish haqida juda qattiq.

Va, aslida, JVM holda keng Java ishlatib, Google tomonidan juda mashhur mobil platforma bor.

Lekin, Java dasturining yukini JVM paketiga yuborishiga nima to'sqinlik qiladi? Yoki C/C ++-ga qo'llab-quvvatlovchi tizim bilan transpredatsiya qilinadi? (Aslida, JVM, lekin slip/container o'rniga qo'llab-quvvatlovchi kutubxona sifatida.)

Hech narsa.

Texnik muammolar bormi? Litsenziyalash muammosi bormi? Yoki faqatgina hech kim buni qilishga qaror qilmagan!

Ha.

    

Ko'pgina konsollar (masalan, 360, PS3) JVMga ega emas, shuning uchun kodni kompyuter versiyasidan qayta ishlata olmaysiz. Turli qurilmalarni qo'llab-quvvatlash uchun C ++ kodini kompilyatsiya qilish juda ham oson.     Agar bu da'vo to'g'rilanardi ("ko'pchilik" konsollari bo'yicha), texnik cheklovlar tufayli ushbu platformalar uchun JVM etishmasmi?

  

Yo'q.

Huquqiymi? Siyosiy? va hokazo.

Ehtimol.

Yoki hali hech kim bu ishni qilmagan.

Java-ning o'yin konsollarida (yoki iPhone) ishlay olmasligi aniqlanganida, biz qilolmaysizlarmi? degan ma'noni anglatadimi? Yoki "hech kimning bezovtalanmagan qurilishi kerakli sanitariya-tesisat? ".

Apple ilovaning bir qismi bo'lmagan kodni ishga tushiradigan ilovalarga ruxsat bermaydi. Bu sof JVMni juda foydasiz qiladi.

Albatta, ilova kodini va JVM dasturini o'z ichiga olgan ilovaga ega bo'lishingiz mumkin. Ammo, har bir ilovada JVMning o'z nusxasi bo'lishi kerak.

6
qo'shib qo'ydi
"Hech kim hali ishlamadi" - LLVM XBox 360 va PS4 uchun chiqish kodini aniqlay oladi va ishonaman va LLVM bit kodini chiqaradigan Java kompilyatorlari mavjud va mavjud bo'lgan ochiq kodli Java sinf kutubxonalari mavjud. osonlik bilan yangi platformalar uchun yig'ilib, shuning uchun ish samarali bajarildi. Hech kim buni qo'llamasa, buning sababi, texnik sabablarga ko'ra emas, balki buni qilish istagi yo'q.
qo'shib qo'ydi muallif Jules, manba

TL;DR: Apart from the legal/business issues others already mentioned, there are indeed technical limitations. Roughly speaking, creating a reasonably good JVM is harder than a reasonably good C compiler. So while theoretically possible, many ports are not created simply due to the effort required.

So what are the challenges? There are at least three important elements of a working Java implementation: support for parsing and compiling the language itself, implementing the standard library, and making the JVM which offers an environment in which compiled applications run.

Tilga kelsak, Java-ning ob'ekti yo'naltirilganligi kabi juda ko'p xususiyatlar mavjud.

Keyinchalik juda boy bo'lgan standart kutubxona mavjud. Ularning ko'pchiligi Java-da yozilgan bo'lsa ham, ba'zi ishlash kodlari yoki kutubxonaning bevosita Java'dan bevosita foydalana olmaydigan darajada past darajadagi ishlaydigan kodi ham mavjud (masalan, past darajadagi parallellik kodi).

Va nihoyat, JVM - bu yirtqich hayvondir. . Axlatni yig'ish, hozirgi vaqtda kompilyatsiya qilish, sinfi o'rnatish va tushirish, mahalliy kod bilan o'zaro bog'lanish JVMning yaxlitligini saqlab qolishda davom etadigan juda murakkab va juda murakkab operatsiyalarni amalga oshiradi. Qisman ro'yxat uchun

JVM bumi? ga qarang. Bularning barchasini amalga oshirish, yuqori ishlashni saqlab qolish juda murakkab vazifadir va juda kam odam buni amalga oshirishga qodir.

Dasturning murakkabligi bilan bir qatorda ishlash xarajatlari ham mavjud. Java dasturlari bugungi kunda juda tez bo'lishiga qaramasdan, bu JVM tomonidan amalga oshirilgan juda ko'p aqlli fokuslar tufayli mumkin. U erda optimallashtirishsiz JVMni qo'llash barcha dasturlarni sekinlashtiradi va shu bilan butun portni juda ma'nosiz bo'ladi. Bundan tashqari, ba'zi xotira miqdori ham bor. Bu kompyuter yoki server uchun katta muammo emas, lekin ko'proq cheklangan muhit uchun. JVM ning o'ziga kerak bo'lgan juda ko'p ma'lumot mavjud: butun murakkab standart kutubxona. Yoki xato qilmasam, kamida bir necha megabayt bo'lgan Unicode ma'lumotlar bazasi.

Albatta, yangi platforma uchun JVMni yaratish oson bo'lmaganda, ikkilantlar JVM yoki uning katta qismlarini samarali tarzda egallashga majbur bo'lgani sababli transpiler yoki Java-ni mahalliy biarazalarga biriktirish uchun juda qiyin.

In Java 9, the main focus was modularization which means that for the first time your hello world program might not need to include 50 MB of libraries just for the JVM to start. This is an important step in the right direction but there is still a long way to go before real Java can run in as restricted environments as C. J2ME is actually just a subset of the full Java stack.

2
qo'shib qo'ydi

Biroq, Java ilovasini JVM paketiga yuborishdan nima to'sqinlik qiladi?

O'ylaymanki, siz noto'g'ri qarorga keldingiz: agar JVM dasturi amalga oshirilsa, JVM alohida-alohida yuborilganmi yoki ilovaga qo'shilganmi-yo'qligiga qaramay, urush allaqachon g'olib chiqqandi. Muammo birinchi navbatda JVMni yozadi.

Bir tomondan, odamlar "portativlik" haqida gapirganda, odatda, "bu platforma uchun ish vaqti/derleyici" emas, balki "bu manba kodini bir nechta o'zgarish bilan qayta-qayta o'zgartirishingiz va boshqa platformada ishlashingiz mumkin" degan ma'noni anglatadi. Albatta, ikkinchisi shartdir). Bu ma'noda Java Java kabi portativdir, ya'ni quyidagicha: oddiy kod, xuddi shunday ishlaydi, lekin ba'zi kutubxonalar mavjud bo'lmasligi mumkin va xotira haqidagi ba'zi taxminlar xato bo'lishi mumkin. Shuni esda tutingki, ehtimol deyarli barcha platformalar uchun C-kompilyatori joriy etilishi ehtimoli mavjud bo'lsa-da, ko'pgina noan`viviy bo'lmagan C dasturlari API-lar, kutubxonalar, xotira xulosalari va boshqa bog'liqliklar tufayli boshqa platformada ishlashga yaroqsiz.

Java "o'yin konsollarida (yoki iPhone) ishlay olmaydi", degani qachonki, biz haqiqatan ham shunday emasmi? Yoki, "hech kim zaruriy suv ta'minoti tizimini qurishdan bezovta emasmi?" Degani bormi?

Java, iPhone, Nintendo yoki bironta konsolda Java-ni ishlata olmaslikning texnik sabablari yo'q. Agar JVM dasturi amalga oshirilmasa, u odatda qonuniy sabablar (iPhone uchun va rasmiy SDKlarga ega bo'lgan maxsus apparat uchun) bo'lishi mumkin degan ma'noni anglatadi, yoki u mantiqiy emas, chunki allaqachon keng ishlatiladigan SDK boshqa til uchun foydali kutubxonalar, yoki ikkalasi ham mavjud.

2
qo'shib qo'ydi
Oracle'dan emas, balki platformasidan tomondan huquqiy cheklovlarni nazarda tutdim. Misol uchun, agar Apple yoki Nintendo JVM ni o'zlarining mulkiy platformalari uchun istamasalar va uni taqiqlasalar, men hayron bo'lmasdim.
qo'shib qo'ydi muallif Mike McAllister, manba
... Yoki ular buni ta'qiqlamaydilar, balki JVMni qo'llashni istagan uchinchi taraf devlar bilan hamkorlik qilmaydilar. Har holda, sabablar texnik emas :)
qo'shib qo'ydi muallif Mike McAllister, manba
"odatda qonuniy sabablar" degan ma'noni anglatadi ... "yoki mantiqiy emas, chunki keng tarqalgan SDK allaqachon mavjud ..." ... Lekin
qo'shib qo'ydi muallif svidgen, manba

Haj va tezlik ikki katta omil. JVM - bu juda katta dastur bo'lib, u ko'plab RAM va xotira maydonlarini talab qiladi. JVM ko'pincha asta-sekin (ish oqimiga bog'liq).

Ya'ni, Java Java dasturlari uchun mos emas (albatta, katıştırılmış deb o'ylayman). Masalan, 8 bit microcontroller, masalan, arduino java ishlayotgan harakat qilib ko'ring.

Tahrirlash:

Java kartasi 16 kB ROM, 8 kB EEPROM va 256 baytlik RAM uchun minimal tizimi talablariga ega java ning pastki (!) Bu kichik bo'lsa-da, u C ni boshqaradigan darajada kichik emas. Aslida bu juda shishgan. Java Card 16 bitli arifmetikadan foydalanadi, ya'ni 8 bitli protsessorda ishlamaydi (yaxshi).

J2ME uchun talablar ham kattaroqdir, shuning uchun men uni suhbatdan chiqarib tashlayman.

Iltimos, javobimni noto'g'ri isbot qilmasdan, bu javobni pastga tushirmang, ya'ni java 8-bitli tizimda juda cheklovli ishlaydigan ishni ko'rsatadi.

1
qo'shib qo'ydi
@JGlass Iltimos, mening javobimda aytganimdek, menga 8 bitli CPUda ishlaydigan Java namunasini ko'rsating. Bilaman, Java Card buni qila olmaydi.
qo'shib qo'ydi muallif iveqy, manba
U erda yo'l, J2ME va Java Card-ga qarang. Java Card - ko'milgan qurilmalar uchun mo'ljallangan eng kichik Java platformalaridir. Siz javobingizni biroz qisqartirishingiz mumkin ;-)
qo'shib qo'ydi muallif madduci, manba
O'zgartirishingiz uchun tashakkur - Men faqat J2ME va Java Card kartalarining juda kichik ekanligini ta'kidlamoqchi edim - garchi to'liqsiz bo'lsa ham, ular mikrokontrolratorda ishlamaydi - men buni qaytarib olaman, hackaday.com saytida bir necha marta o'qigan edi) Projeler - uJ - mikro JVM " odam "Dmitry izzati.
qo'shib qo'ydi muallif madduci, manba