เป็นไปได้ไหมที่จะรวบรวม Java เป็นรหัสเครื่อง? (ไม่ใช่ไบต์)


32

คุณสามารถคอมไพล์ Java โดยตรงในรหัสเครื่องได้หรือไม่?

ฉันต้องการทำสิ่งนี้ดังนั้นฉันจึงสามารถควบคุมได้ว่าจะใช้แพลตฟอร์มใดและไม่รู้ว่า C, C ++ เป็นต้น

คำตอบ:


36

ปรากฏว่าGNU Compiler สำหรับ Javaสามารถแปลงซอร์สโค้ด Java เป็น Java bytecode หรือรหัสเครื่อง นอกจากนี้ยังสามารถแปลง Java bytecode ที่มีอยู่เป็นรหัสเครื่องได้ อย่างไรก็ตามข่าวล่าสุดมาจาก 2009 ดังนั้นฉันไม่แน่ใจว่ามันเป็นปัจจุบันและถ้ามันสามารถจัดการคุณสมบัติล่าสุดของภาษาจาวา


1
หาก Java bytecode ไม่ได้เปลี่ยนไปตั้งแต่ปี 2009 สิ่งนี้จะยังคงใช้ได้หากไม่มีนักพัฒนาที่โบกธง "เฮ้! ฉันยังอยู่ที่นี่" ในซอฟต์แวร์
Robert Harvey

@RobertHarvey ฉันเชื่อว่า Java 7 แนะนำแนวคิดภาษาใหม่บางอย่างดังนั้นจึงอาจล้มเหลวในการแปลงไฟล์ต้นฉบับเป็นรหัสเครื่อง ถ้า bytecode เปลี่ยนไปด้วยคุณสมบัติใหม่เหล่านี้นั่นก็จะล้มเหลวเช่นกัน
Thomas Owens

1
ดูเหมือนว่า JET Excelsior จะยังคงทำงานอยู่ (เชิงพาณิชย์) มีฟูจิตสึทาวเวอร์เจ แต่ดูเหมือนว่าจะตายไปเมื่อสิบปีก่อนและค่อนข้างไร้จุดหมายในตอนนั้น
Tom Hawtin - tackline

ฉันใช้จาวา 6 ดังนั้นจาวา 7 จึงไม่มีปัญหาในกรณีของฉัน
รัสเซล

1
เว็บไซต์ของ GCJ กล่าวว่ายังไม่รองรับแม้แต่ Java 1.5 ดูกระทู้นี้: stackoverflow.com/a/4040404/1257384
GregT

13

ไม่ตอบ OP โดยตรง แต่อาจเป็นสิ่งที่น่าสนใจ Java สามารถเรียกใช้ในสามโหมด:

  1. ผสม (ค่าเริ่มต้น) - การรวมกันของรหัสที่แปลและเครื่องที่คอมไพล์ (เครื่องที่คอมไพล์ == รวบรวมโดย JIT เมื่อรันไทม์)
  2. ด้วยการ-Xintตั้งค่าสถานะ - ตีความ - รหัสไบต์เท่านั้น
  3. With -Xcompflag - รวบรวม - รวบรวมเครื่อง

1
@Martjin นี่คือ HotSpot หรือเปล่า? โดยบังเอิญคุณมีการอ้างอิงสำหรับ-Xcompเพราะฉันไม่พบว่าหนึ่งในเอกสาร JDK 7 หรือเอกสารตัวเลือก HotSpot และไม่แน่ใจว่าคุณมีความลับรายชื่อผู้รับจดหมายที่ซ่อนอยู่ที่เรามนุษย์ปุถุชนไม่ได้ตระหนักถึง :-)
edalorzo

2
มันเป็นตัวเลือกที่ซ่อนอยู่โดยเจตนาใช่ :-) มีรายชื่อผู้รับจดหมาย openjdk (openjdk.java.net) มากมายที่คุณสามารถรวบรวมข้อมูลจาก - หรืออ่านซอร์สโค้ด :-)
Martijn Verburg

โปรดทราบว่าตามการทดสอบของฉัน -Xcomp อาจมีประสิทธิภาพที่ต่ำกว่า (โดยสองเท่า) ในบางกรณี
Daniel Lemire

ใช่แล้ว การปรับให้เหมาะสมทันเวลาเป็นเรื่องยากที่จะทำเมื่อ JIT ไม่ได้ทำงาน สามารถมี! = จะมี
candied_orange

ummm ดังนั้นตัวเลือกเหล่านี้คือjavacอะไร? เมื่อใช้ -Xcomp มันจะทำการเริ่มต้นด้วยไฟล์ไบนารีไฟล์เดียวหรือไม่?
Alexander Mills

7

มันอาจจะดีกว่าที่จะตรวจสอบระบบปฏิบัติการที่ใช้System.getProperty (“os.name”) นั่นจะช่วยให้คุณเลือกที่จะสนับสนุนมากกว่าหนึ่งระบบปฏิบัติการ แต่ไม่รวมระบบอื่น


มีวิธีนี้สามารถหลอก / gamed?
FrustratedWithFormsDesigner

@ เฟอะฟะอาจ แต่ฉันสมมติว่าความตั้งใจของเขาคือการป้องกันอย่างเป็นทางการจากระบบปฏิบัติการที่เขาไม่ได้ทดสอบ ไม่เหมาะสมที่จะปิดใช้งานการพกพาที่คุณได้รับฟรี
Karl Bielefeldt

มันอาจเป็นไปได้ว่าเขาต้องการผูกโปรแกรมกับฮาร์ดแวร์เฉพาะในทางที่ไม่ขึ้นกับระบบปฏิบัติการ
FrustratedWithFormsDesigner

คุณสามารถบังคับ "os.name" คุณสมบัติของระบบโดยใช้อาร์กิวเมนต์พิเศษสำหรับ java -Dos.name=MacOSJVM:
SkyDan

2

คือตอนนี้: GraalVM ช่วยให้คุณสามารถคอมไพล์โปรแกรมของคุณล่วงหน้าไปสู่การปฏิบัติการแบบเนทีฟ ดูฟีเจอร์native-image :

คำถามที่เกี่ยวข้อง: 'ฉันสามารถคอมไพล์ Java เป็นโค้ดเนทีฟได้หรือไม่' https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ ไม่ได้รับการบำรุงรักษาอีกต่อไป
ที่มา: 'การลบ gcj' http://tromey.com/blog/?p=911

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.