LLVM aracılığıyla bir C ++ uygulamasından Java'ya bir bağlantı noktası yapmak uygun mu?


9

nasıl bir C ++ uygulaması LLVM (sanırım LLJVM) kullanarak Java bayt kodu taşımak için?

Mesele şu anda C ++ ile yazılmış bir işlemimiz var, ancak yeni bir istemci, açıkça bir yerel kod (JNI yok) olmadan Java Sanal Makinesi'ni kullanarak programı çok platformlu bir şekilde çalıştırabilmek için zorunlu hale getirdi . Fikir, üretilen kavanozu alıp farklı sistemlere (Linux, Win, 32 bit - 64 bit) kopyalayabilmektir ve sadece çalışmalıdır.

Etrafa bakmak C ++ LLVM IR kodu ve sonra bu kodu java bayt kodu derlemek mümkün gibi görünüyor. Oluşturulan kodun okunabilir olmasına gerek yoktur.

Ben emscripten kullanarak benzer şeyler ile biraz test var, bu C ++ kodu alır ve JavaScript derlemek. Sonuç geçerli JS ancak tamamen okunamıyor (assambler gibi görünüyor).

  • Herkes bu tekniği kullanarak C ++ 'dan Java bayt koduna bir uygulama portu yaptı mı?
  • Hangi sorunlarla karşılaşabiliriz?
  • Üretim kodu için geçerli bir yaklaşım mı?

Bazı yorumlardan sonra daha net kılmak için, belki de port iyi kullanılmamış, sonuç olarak okunabilir kaynak kodu beklemiyorum, sadece java bayt kodu, bu yüzden artık geliştirilecek bir 'port' değil, sadece hedef platforform yerel assamblear değil, java JVM olmalıdır.

Not: Şu anda bazı standart olmayan C ++ ve yakın kaynak kitaplıklarımız olduğunu biliyoruz, bu standart olmayan kodu ve tüm yakın kaynak kitaplıklarını kaldırmayı ve Free Libre Açık Kaynak Yazılımını kullanmayı arıyoruz, bu yüzden tüm kodların standart C ++ kodu olduğunu varsayalım. tüm kod derleme zamanında kullanılabilir.

Not2: Taşınabilir C ++ kodu yazma ve daha sonra istenen hedef platforma derleme seçeneği değildir, derlenen program çoklu platform olmalıdır, bu nedenle JVM kullanımı gerekir.

Not3: Şu anda Python veya başka bir dil tabanına uygulanan benzer çözümlere bakmıyoruz, ancak bunu duymak istiyorum. Bu ile bizim hedef yürütülebilir java bayt kodu olması gerektiği anlamına gelir ama C ++ geçerli python derlenmiş kod derlemek için seçenekler varsa ben de onları duymak istiyorum.


Python hakkındaki son cümlede ne demek istediğinizden emin değilsiniz, ancak Jython tamamen aynıdır: Python VM yerine JVM kullanın ve tam olarak bu senaryoda kullanılır: programcılar Python kullanmak istiyor, dağıtım JVM'de olmalıdır.
Javier

Kaç satır koddan bahsediyoruz? Yeniden yazmak için zaman ayırmaya değer olabilir, ancak bu basit bir karar değildir. Ayrıca, kodunuz herhangi bir işaretçi aritmetik yaparsa ben JVM üzerinde çalışırken nasıl ele bilmek merak ediyorum.
Levi Morrison

1
Eğlenceli olmalı hata ayıklama O_o
Daniel Gratzer

@LeviMorrison. Kod oldukça kapsamlıdır (iletişim, fayda fonksiyonları için çeşitli kütüphaneler bağımlılıkları), ancak derleme zamanında tüm kodu kullandığımız varsayılmaktadır. Ve ayrıca başka bir istemci gerektirmezse, yine de yerel ikiliyi üreteceğiz.
Javier Mr

@jozefg. İşaretçi aritmetik ve hata ayıklama amaçlı hata ayıklanabilir olmasını beklemiyorum. Örneğin Emscripten aynı şeyi yapar ama hedef dil Javascripttir, sadece program sayacı için yığın ve bit bilge işlemleri ve sadece baytlarla hiçbir nesne, dize veya bunun gibi bir işlem olarak büyük bir bayt dizisi ile sonlanırsınız. Java bayt kodunda assamblear benzer sonuç bekliyoruz, hata ayıklama olmadığı varsayılabilir.
Javier Bay

Yanıtlar:


11

Bunun işe yarayacağından gerçekten şüpheliyim. Kodunuzu Java bayt koduna çevirebilirsiniz, ancak kitaplık çağrılarını Java çalışma zamanı ve kitaplıklarına eşdeğer çağrılara sihirli bir şekilde dönüştürmez. Eşdeğer Java çalışma zamanı çağrıları bile olmayabilir! Tüm tescilli kütüphaneleri ortadan kaldırsanız bile, C ++ standart kütüphanesine bırakıldınız.

Bu somutlaştırmak için: C ++ programınız fprintf () çağrısı içerebilir. Bu işlev C standart kitaplığında uygulanır ve bir C ++ programının onu çağırması son derece yasaldır. LLVM'den LLJVM'ye çevirmen muhtemelen fprintf () 'ye eşdeğer sonuç üretecek ve bunları ikame edecek Java çalışma süresi çağrılarının sırasını sihirli bir şekilde çözmeyecektir. bayt kodu.

C ++ Java çevirisini gerçekleştiren bazı araçlar vardır, ancak yalnızca bir avuç basit çalışma zamanı kitaplığı çağrısını dönüştürürler. Gerisi anlamanız için size bırakılmıştır.


Anladığım kadarıyla anlıyorum, ama anladığım kadarıyla, emscripten'in Javascript olmasıyla benzer bir şey yaptığını anladığım kadarıyla, yanlış anlayamadımsa, emscripten, işaret ettiğiniz şeyi önlemek için özel bir standart kütüphane sağlar (ve hatta SDL kütüphanesi üzerinden webGL için eşlemeler) ). Ama Java için eşdeğer bulamıyorum (LLJVM terk edilmiş görünüyor). Ben llvm bytecode platform bağımsız bir yapı (tabii ki platforma, API veya veri ile bağlı derleme dalları olmadan; kullanarak aprveya benzeri) olarak önermek düşünüyorum
Javier Mr

3
lljvm, kısmen JVM bayt koduna derlenmiş C ve kısmen Java sınıfları gibi bir C çalışma zamanı kitaplığı sağlar. Oldukça eksiksiz bir libc. Libstdc ++ için eşdeğerini oluşturmanız gerekir. Ayrıca lljvm arka ucu zaten C ++ 'ı desteklemiyor. Daha yeni bir llvm derlemesi ile çalışmak için lljvm'yi düzeltmeye çalışıyorum. Llvm API'leri ve araçları sürümler arasında çok değişmeye devam ettiğinden bu yavaş ilerliyor. Buradan takip edebilirsiniz, neredeyse kullanılabilir durumda. github.com/hyc/lljvm/tree/llvm3.3
hyc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.