เป็นไปได้หรือไม่ที่จะสร้างพอร์ตจากแอปพลิเคชัน C ++ ไปยัง Java ผ่าน LLVM


9

มันทำงานได้อย่างไรกับพอร์ตแอปพลิเคชัน C ++ ไปยัง Java bytecode โดยใช้ LLVM (ฉันเดา LLJVM)

สิ่งที่เป็นอยู่ในปัจจุบันคือเรามีกระบวนการเขียนใน C ++ แต่ไคลเอนต์ใหม่ได้รับคำสั่งให้สามารถรันโปรแกรมในรูปแบบที่หลากหลายโดยใช้ Java Virtual Machine ที่ไม่มีรหัสพื้นเมือง (ไม่มี JNI) แนวคิดคือสามารถนำ jar ที่สร้างขึ้นมาและคัดลอกไปยังระบบอื่น (Linux, Win, 32 bits - 64 bits) และควรใช้งานได้

มองไปรอบ ๆ ดูเหมือนว่ามันเป็นไปได้ที่จะรวบรวมรหัส C ++ กับ LLVM IR และจากนั้นรหัสไปยัง java bytecode ไม่จำเป็นต้องใช้รหัสที่สร้างขึ้นเพื่อให้สามารถอ่านได้

ฉันมีการทดสอบเล็กน้อยกับสิ่งที่คล้ายกันโดยใช้ emscripten นี้ใช้รหัส C ++ และรวบรวมไปยัง JavaScript ผลลัพธ์คือ JS ที่ถูกต้อง แต่อ่านไม่ได้ทั้งหมด (ดูเหมือนว่า assambler)

  • มีใครทำพอร์ตของแอปพลิเคชันจาก C ++ ไปยัง Java bytecode โดยใช้ tecnique นี้หรือไม่?
  • เราเจอปัญหาอะไรบ้าง?
  • เป็นวิธีการที่ถูกต้องสำหรับรหัสการผลิตหรือไม่

เพื่อให้ชัดเจนยิ่งขึ้นหลังจากความเห็นของฉันบางทีพอร์ตอาจไม่ได้ใช้อย่างดีฉันไม่คาดหวังว่าซอร์สโค้ดที่อ่านได้จะเป็นผลลัพธ์เพียง java bytecode ดังนั้นจึงไม่ใช่ 'พอร์ต' ซึ่งจะพัฒนาขึ้นอีกต่อไปเพียงแค่ แพลตฟอร์เป้าหมายต้องเป็น java JVM ไม่ใช่ assamblear ดั้งเดิม

หมายเหตุ: ฉันทราบว่าขณะนี้เรามีไลบรารี C ++ ที่ไม่เป็นมาตรฐานและใกล้เคียงเรากำลังมองหาที่จะลบรหัสที่ไม่ได้มาตรฐานนี้และไลบรารี่แหล่งที่อยู่ใกล้ทั้งหมดและใช้ซอฟต์แวร์โอเพนซอร์สฟรี Libre ดังนั้นให้สมมติว่า รหัสทั้งหมดที่มีอยู่ในเวลารวบรวม

Note2: มันไม่ใช่ตัวเลือกในการเขียนรหัส C ++ แบบพกพาแล้วคอมไพล์ไปยังแพลตฟอร์มเป้าหมายที่ต้องการโปรแกรมที่คอมไพล์ต้องเป็นหลายแพลตฟอร์มดังนั้นการใช้ JVM

Note3: ตอนนี้เราไม่ได้มองหาวิธีการแก้ปัญหาที่คล้ายกันที่ใช้กับ Python หรือฐานภาษาอื่น ๆ แต่ฉันก็อยากจะได้ยินเช่นกัน ด้วยสิ่งนี้ฉันหมายความว่าเป้าหมายการปฏิบัติการของเราจะต้องเป็น java bytecode แต่ถ้ามีตัวเลือกในการคอมไพล์ C ++ กับรหัสที่รวบรวมไพ ธ อนที่ถูกต้องฉันก็อยากจะได้ยินเกี่ยวกับพวกเขาเช่นกัน


ไม่แน่ใจว่าคุณหมายถึงอะไรในประโยคสุดท้ายเกี่ยวกับ Python แต่ Jython เหมือนกันทั้งหมด: ใช้ JVM แทน Python VM และใช้ในสถานการณ์นั้น ๆ : โปรแกรมเมอร์ต้องการใช้ Python การปรับใช้ต้องอยู่บน JVM
Javier

เรากำลังพูดถึงโค้ดกี่บรรทัด? มันอาจคุ้มค่ากับเวลาที่คุณจะเขียนใหม่ แต่นั่นไม่ใช่การตัดสินใจที่ง่าย นอกจากนี้หากรหัสของคุณใช้เลขคณิตตัวชี้ใด ๆ ฉันก็อยากรู้ว่าจะจัดการอย่างไรเมื่อทำงานกับ JVM
Levi Morrison

1
การแก้จุดบกพร่องที่น่าสนุก O_o
Daniel Gratzer

@LeviMorrison รหัสนั้นค่อนข้างกว้างขวาง (การพึ่งพาไลบรารีต่างๆสำหรับการสื่อสาร, ฟังก์ชั่น utlity) แต่สันนิษฐานว่าเรามีรหัสทั้งหมดในเวลารวบรวม และหากลูกค้าอื่นไม่ต้องการเราจะยังคงสร้างไบนารีดั้งเดิม
Javier Mr

@jozefg เกี่ยวกับ aritmetics ของตัวชี้และการดีบักที่มีวัตถุประสงค์ฉันไม่คาดว่าจะ debuggable ตัวอย่างเช่น Emscripten ทำสิ่งเดียวกัน แต่ภาษาเป้าหมายคือ Javascript คุณลงท้ายด้วยอาร์เรย์ไบต์ขนาดใหญ่เนื่องจากการดำเนินการฮีปและบิตที่ชาญฉลาดสำหรับตัวนับโปรแกรมและการดำเนินการกับไบต์ไม่มีวัตถุสตริงหรือสิ่งอื่น ๆ ฉันคาดหวังผลลัพธ์ที่คล้ายกับ assamblear ใน java bytecode มันอาจสันนิษฐานได้ว่าไม่สามารถ debuggable ได้
Javier Mr

คำตอบ:


11

ฉันสงสัยจริงๆว่ามันจะได้ผล คุณอาจจะสามารถแปลรหัสของคุณเป็นรหัส Java byte แต่มันจะไม่แปลการโทรในห้องสมุดเป็นการโทรที่เทียบเท่ากับรันไทม์และไลบรารีของ Java อาจไม่มีแม้แต่การเรียกใช้งานจริงของ Java runtime call! แม้ว่าคุณจะกำจัดไลบรารี่ที่เป็นกรรมสิทธิ์ทั้งหมดคุณก็ยังคงอยู่กับไลบรารี่มาตรฐาน C ++

ในการสร้างรูปธรรมนี้: โปรแกรม C ++ ของคุณอาจมีการเรียกไปยัง fprintf () ฟังก์ชั่นดังกล่าวถูกนำไปใช้ในไลบรารี่มาตรฐาน C และมันสมบูรณ์แบบสำหรับโปรแกรม C ++ ที่จะเรียกมัน ตัวแปล LLVM เป็น LLJVM น่าจะไม่สามารถหาลำดับของการเรียกเวลารันไทม์ของ Java ที่จะสร้างผลลัพธ์ที่เทียบเท่ากับ fprintf () และแทนที่สิ่งต่อไปนี้เพื่อให้สิ่งอำนวยความสะดวกนั้นต้องการการปรับใช้รันไทม์ C และ C ++ ใน Java รหัสไบต์

มีเครื่องมือบางอย่างที่ดำเนินการแปล C ++ เป็น Java แต่จะแปลงการเรียกใช้ไลบรารีรันไทม์ที่ง่ายกว่าเล็กน้อย ส่วนที่เหลือจะให้คุณคิดออก


ฉันเห็นประเด็นของคุณ แต่เท่าที่ฉันเข้าใจ emscripten ทำสิ่งที่คล้ายกับเป้าหมายที่เป็น Javascript ถ้าฉันไม่เข้าใจผิด emscripten ให้กับไลบรารีมาตรฐานแบบกำหนดเองเพื่อหลีกเลี่ยงสิ่งที่คุณชี้ (และแม้แต่การแมปสำหรับ webGL ผ่านห้องสมุด SDL ) แต่ฉันไม่พบสิ่งที่เทียบเท่าสำหรับ Java (LLJVM ดูเหมือนว่าถูกทอดทิ้ง) ฉันคิดว่าจะเสนอ llvm bytecode ให้เป็นแพลตฟอร์มอิสระ (แน่นอนว่าไม่มีสาขาการรวบรวมขึ้นอยู่กับแพลตฟอร์มโดยใช้ API หรือข้อมูลการใช้งานaprหรือคล้ายคลึงกัน)
Javier Mr

3
lljvm จัดเตรียมไลบรารีรันไทม์ C ส่วนหนึ่งเป็น C ที่คอมไพล์กับ JVM bytecode และบางส่วนเป็นคลาส Java มันเป็น libc ที่ค่อนข้างสมบูรณ์ คุณจะต้องสร้างสิ่งที่เทียบเท่าสำหรับ libstdc ++ แบ็กเอนด์ lljvm ยังไม่รองรับ C ++ ในตอนนี้ ฉันพยายามแก้ไข lljvm เพื่อทำงานกับ llvm build ล่าสุด เป็นไปได้ช้าเนื่องจาก llvm APIs และเครื่องมือมีการเปลี่ยนแปลงอย่างมากระหว่างการเปิดตัว คุณสามารถติดตามได้ที่นี่เกือบจะใช้งานได้แล้ว github.com/hyc/lljvm/tree/llvm3.3
hyc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.