Có khả năng tạo một cổng từ ứng dụng C ++ sang Java thông qua LLVM không


9

Làm thế nào khả thi để chuyển một ứng dụng C ++ sang mã byte Java bằng LLVM (tôi đoán LLJVM)?

Vấn đề là hiện tại chúng tôi có một quy trình được viết bằng C ++ nhưng một máy khách mới đã bắt buộc phải có khả năng chạy chương trình theo cách đa nền tảng, sử dụng Máy ảo Java rõ ràng không có mã gốc (không có JNI). Ý tưởng là có thể lấy jar được tạo và sao chép vào các hệ thống khác nhau (Linux, Win, 32 bit - 64 bit) và nó sẽ hoạt động.

Nhìn xung quanh có vẻ như có thể biên dịch mã C ++ sang LLVM IR và sau đó mã đó thành mã byte java. Không cần mã được tạo để có thể đọc được.

Tôi đã kiểm tra một chút với những thứ tương tự bằng cách sử dụng emscripten, điều này cần mã C ++ và biên dịch nó thành JavaScript. Kết quả là JS hợp lệ nhưng hoàn toàn không thể đọc được (trông giống như kẻ lừa đảo).

  • Có ai đã thực hiện một cổng của một ứng dụng từ C ++ sang mã byte Java bằng cách sử dụng tecnique này không?
  • Những vấn đề chúng ta có thể phải đối mặt?
  • Là một cách tiếp cận hợp lệ cho mã sản xuất?

Để làm rõ hơn quan điểm của tôi sau một số ý kiến, có thể cổng không được sử dụng tốt, tôi không mong đợi mã nguồn có thể đọc được, do đó chỉ là mã byte java, vì vậy nó không phải là một 'cổng' sẽ được phát triển nữa, chỉ là plattform đích phải là java JVM chứ không phải assamblear riêng.

Lưu ý: Tôi biết rằng hiện tại chúng tôi có một số thư viện nguồn C ++ và nguồn đóng không chuẩn, chúng tôi đang tìm cách loại bỏ mã không chuẩn này và tất cả các thư viện nguồn đóng và sử dụng Phần mềm nguồn mở Libre miễn phí, vì vậy, giả sử tất cả mã là mã C ++ tiêu chuẩn với tất cả các mã có sẵn tại thời gian biên dịch.

Lưu ý2: Không phải là một tùy chọn để viết mã C ++ di động và sau đó biên dịch nó sang nền tảng đích mong muốn, chương trình được biên dịch phải là đa nền tảng, do đó sử dụng JVM.

Note3: Hiện tại chúng tôi không xem xét các giải pháp tương tự được áp dụng cho Python hoặc cơ sở ngôn ngữ khác, nhưng tôi cũng muốn nghe về nó. Với điều này, ý tôi là mục tiêu thực thi của chúng ta phải là mã byte java nhưng nếu có các tùy chọn để biên dịch C ++ thành mã được biên dịch python hợp lệ, tôi cũng muốn nghe về chúng.


không chắc ý của bạn về câu cuối cùng về Python, nhưng Jython hoàn toàn giống nhau: sử dụng JVM thay vì Python VM và được sử dụng trong chính xác kịch bản đó: lập trình viên muốn sử dụng Python, triển khai phải trên JVM.
Javier

Có bao nhiêu dòng mã chúng ta đang nói về? Nó có thể đáng giá thời gian của bạn để viết lại nó, nhưng đó không phải là quyết định đơn giản. Ngoài ra, nếu mã của bạn thực hiện bất kỳ số học con trỏ nào, tôi sẽ tò mò muốn biết cách xử lý khi làm việc trên JVM.
Levi Morrison

1
Gỡ lỗi sẽ rất vui O_o
Daniel Gratzer

@LeviMorrison. Mã này khá rộng rãi (các thư viện phụ thuộc khác nhau cho các giao tiếp, các hàm không rõ ràng) nhưng giả định rằng chúng tôi có sẵn tất cả các mã tại thời điểm biên dịch. Và nếu khách hàng khác không yêu cầu, chúng tôi vẫn sẽ tạo nhị phân gốc.
Javier Mr

@jozefg. Về mỹ phẩm con trỏ và gỡ lỗi có mục đích tôi không mong đợi có thể sửa lỗi. Ví dụ, Emscripten cũng làm điều tương tự nhưng ngôn ngữ đích là Javascript, bạn kết thúc chỉ bằng một mảng byte lớn như các hoạt động heap và bit khôn ngoan cho bộ đếm chương trình và chỉ hoạt động với byte không có đối tượng, chuỗi hoặc điều tương tự. Tôi hy vọng kết quả tương tự như assamblear trong java bytecode, nó có thể được coi là không thể sửa lỗi.
Javier Mr

Câu trả lời:


11

Tôi thực sự nghi ngờ điều này sẽ làm việc. Bạn có thể dịch mã của mình thành mã byte Java, nhưng nó sẽ không dịch thuật các cuộc gọi thư viện thành các cuộc gọi tương đương với thời gian chạy và thư viện Java. Thậm chí có thể không có các cuộc gọi thời gian chạy Java tương đương! Ngay cả khi bạn loại bỏ tất cả các thư viện độc quyền, bạn vẫn còn lại với thư viện chuẩn C ++.

Để thực hiện điều này cụ thể: chương trình C ++ của bạn có thể chứa lệnh gọi đến fprintf (). Hàm đó được triển khai trong thư viện chuẩn C và chương trình C ++ gọi nó là hoàn toàn hợp pháp. Trình dịch LLVM sang LLJVM có lẽ sẽ không thể tìm ra một cách kỳ diệu chuỗi các cuộc gọi thời gian chạy Java sẽ tạo ra kết quả tương đương với fprintf () và thay thế chúng trong. mã byte.

một số công cụ thực hiện dịch C ++ sang Java nhưng chúng chỉ chuyển đổi một số ít các cuộc gọi thư viện thời gian chạy đơn giản hơn. Phần còn lại để bạn tìm ra.


Tôi thấy quan điểm của bạn, nhưng theo như tôi hiểu thì EMScripten thực hiện một cái gì đó tương tự với mục tiêu là Javascript, nếu tôi không hiểu nhầm thì EMScripten cung cấp một thư viện tiêu chuẩn tùy chỉnh để tránh những gì bạn đã chỉ ra (và thậm chí ánh xạ cho webGL qua thư viện SDL ). Nhưng tôi không thể tìm thấy tương đương với Java (LLJVM dường như bị bỏ rơi). Tôi đang suy nghĩ về việc đề xuất llvm bytecode như một bản dựng độc lập nền tảng (tất nhiên không có các nhánh biên dịch tùy thuộc vào nền tảng, theo API hoặc dữ liệu; sử dụng aprhoặc tương tự)
Javier Mr

3
lljvm cung cấp một thư viện thời gian chạy C, một phần là C được biên dịch thành mã byte JVM và một phần là các lớp Java. Đó là một libc khá đầy đủ. Bạn sẽ cần phải tạo tương đương cho libstdc ++. Ngoài ra, phần phụ trợ lljvm không thực sự hỗ trợ C ++ vào lúc này. Tôi đã cố gắng sửa lỗi lljvm để làm việc với bản dựng llvm gần đây hơn. Mọi thứ diễn ra chậm chạp vì các API và công cụ llvm liên tục thay đổi rất nhiều giữa các phiên bản. Bạn có thể theo dõi ở đây, bây giờ nó gần như có thể sử dụng được. github.com/hyc/lljvm/tree/llvm3.3
hyc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.