2009-02-17 43 views
45

Tôi luôn tự hỏi liệu có thể chuyển đổi Java thành C++ hay không.Trình chuyển đổi/công cụ Java sang C++ có tồn tại không?

Có thể một công cụ chuyển đổi cú pháp Java thành cú pháp C++?

Tôi biết rằng các ngôn ngữ khác nhau, nhưng những điều đơn giản như vòng nơi ngữ nghĩa trận đấu từ 1 tới 1.

Có một công cụ như vậy? Hoặc là có thể làm cho một?

+8

Đó là một câu hỏi hay. Tôi luôn tự hỏi: Tại sao chúng ta có thể tự động dịch các ngôn ngữ tự nhiên phức tạp (http://translate.google.com/translate_t), nhưng thất bại trong việc dịch tự động giữa các ngôn ngữ lập trình bị hạn chế, đơn giản hơn nhiều? – Frank

+20

Một lý do, tất nhiên, là không có sai sót nào được dung thứ khi dịch giữa các ngôn ngữ lập trình, trong khi con người linh hoạt hơn và hiểu bản dịch, ngay cả khi nó có lỗi. – Frank

+0

Một số lần thử - [ONE] (http://tech.novosoft-us.com/product_c2j.jsp) và [TWO] (http://www.soften.ktu.lt/~stonis/c2java/index.html) để tạo bộ chuyển đổi C thành Java. – Lazer

Trả lời

22

Có thể thực hiện bất cứ điều gì nếu có đủ thời gian, tiền bạc và tài nguyên. Nó có thực tế không? Ngoài những ví dụ tầm thường không thực sự. Hay đúng hơn nó phụ thuộc vào những gì cấu thành một tỷ lệ lỗi chấp nhận được.

Vấn đề thực sự là các thành ngữ khác nhau trong Java với C++. Java để C# ví dụ thực sự sẽ dễ dàng hơn nhiều (vì các thành ngữ giống nhau hơn nhiều). Dĩ nhiên, lớn nhất là C++ có bộ hủy và bộ nhớ được quản lý thủ công. Java sử dụng các khối cuối cùng cho loại hành vi này và có bộ sưu tập rác.

Ngoài ra Java có một siêu đối tượng chung. C++ thì không.

Các generics cho các mẫu sẽ được nigh trên không thể tôi sẽ tưởng tượng.

+10

Đối tượng chung không phải là một vấn đề. Bộ chuyển đổi chỉ cung cấp một và sau đó bất kỳ lớp nào mà không có một lớp cơ sở chỉ cần thêm thừa kế. Generics trong Java chỉ là cú pháp và các mẫu C++ có thể xử lý mà không có vấn đề gì. Đi theo cách khác sẽ là không thể. –

+0

Nhìn chung, mặc dù tôi đồng ý rằng các thành ngữ không phù hợp. Viết C++ không được thực hiện theo cách tương tự. –

+0

Đối tượng phổ biến vẫn là một vấn đề. Bộ sưu tập được xây dựng xung quanh đó (đặc biệt là với generics). Ý tưởng là bạn có thể chèn bất cứ thứ gì. Việc cân bằng loại đồ vật đó với các container STL không chính xác là 1: 1. – cletus

7

Có thể, không có câu hỏi, nhưng nó sẽ không đơn giản như vậy. Nó sẽ là một trình biên dịch Java tạo ra C++.

Nếu bạn muốn làm điều đó từ đầu, nó sẽ rất khó, bạn phải thực hiện tất cả công việc javac và JVM làm cho bạn (ví dụ: thu gom rác).

Btw. Google có trình biên dịch Java sang JavaScript (được bao gồm trong GWT)

+0

May mắn thay, đã có các giải pháp khác nhau cho GC, generics, vv trong C++ có thể dễ dàng tái sử dụng. – peterh

+0

công cụ trò chơi thống nhất có bộ chuyển đổi cP (C#) thành cpp. Nó không nên quá khó để làm java bytecode để cpp –

2

Có các chương trình yêu cầu họ có thể thực hiện việc này, nhưng không có chương trình nào phổ biến được đề cập thường xuyên, vì vậy chúng tôi sẽ để chúng ở "nỗ lực". Việc tạo một trình chuyển đổi sẽ đòi hỏi rất nhiều AI được tích hợp trong chương trình của bạn. Khó khăn được tăng lên gấp mười lần khi swing được tham gia bởi vì GTK/wxWidgets/Qt/win32 API tất cả khác nhau rất nhiều từ swing. Nhưng có thể. Không phải là chất lượng mã sẽ là tuyệt vời, và không đảm bảo chương trình của bạn sẽ không sụp đổ do phương pháp xử lý bộ nhớ riêng biệt, nhưng nó có thể.

3

Như đã nói sẽ rất khó để chuyển đổi Java sang C++ nhưng chúng ta có thể có một ứng dụng hoặc công cụ tạo mã trong Java và mã C++ tương đương.

Tôi biết một ứng dụng tạo mã trong C++/Java/C# cho một mô hình có cách riêng để khử biến nó.

Công cụ đó thuộc về CA và tên là CA Plex. Tìm kiếm trên www.ca.com

2

Một thứ gì đó gọn gàng sẽ là công cụ dịch java sang "C++ bằng Java API" (như GNU GCJ CNI), một vấn đề vẫn là quản lý array.length (mảng không phải vectơ) .. .

+1

'std :: vector v; v.length() '? –

2

Vấn đề chính là java là ngôn ngữ được viết và được thiết kế để nói chuyện với máy ảo. Tôi cho rằng nó sẽ là có thể, nhưng tất cả những gì bạn cần là một ứng dụng được tối ưu hóa rất kém với một lớp tự dịch làm những gì VM đã làm. Tôi có nghĩa là, chắc chắn, nó có thể, nó vẫn sẽ không phải là một giải pháp cho bất cứ điều gì tôi có thể nghĩ đến. Nếu bạn đang tìm cách làm cho ứng dụng java chậm chạp của mình, có thể suy nghĩ của bạn quá khó, chỉ cần sử dụng một ứng dụng như JET, nó thực sự khá tốt và sẽ mang lại cho bạn những lợi ích mà ứng dụng gốc mang lại. Tất nhiên nếu VM đã làm những gì các ứng dụng được yêu cầu nó để làm cũng như mã nguồn gốc có thể (nó xảy ra .. đôi khi: P) nó có thể thay đổi không có gì.

Java thành C#, tho, âm thanh hợp lý hơn, vì cả hai ngôn ngữ đều được viết theo cách tương tự, nói chuyện với một khung như vậy, nhưng điều này vẫn để lại mã rất không được tối ưu hóa như mã được viết từ đầu cho một khuôn khổ cụ thể không được tốt nhất.

2

Java to C thực sự là dễ nhất. Hãy nhớ rằng bạn cần phải chuyển đổi ngôn ngữ, Nếu bạn làm điều đó, các thư viện cần thiết có thể được chuyển đổi bởi trình biên dịch mới của bạn. Nói cách khác Swing và AWT không phải là một vấn đề lớn ...

Tôi sẽ bắt đầu bằng cách xem xét kỹ giao diện Java Native (JNI). JNI là một phần của java cho phép nó được sử dụng với C và C++. Lý do tôi sẽ bắt đầu ở đây là nó trở nên khá rõ ràng như thế nào các phần của Java có thể được thực hiện trong C. Một khi tôi đã nắm bắt các cấu trúc cơ bản, như cách Java Objects có thể được ánh xạ lên cấu trúc C (struct) và mọi thứ Java là một đối tượng bao gồm các mảng, tôi có thể nhìn vào mã nguồn mở JDK.

Trình chuyển đổi thực tế sẽ phải chuyển đổi tất cả các thư viện Java đã nhập (và các thư viện được nhập của chúng, v.v ...) có nghĩa là bạn sẽ cần mã nguồn cho mọi thứ. Chuyển đổi này không có nhiệm vụ nhỏ vì các thư viện Java lớn.

Quy trình sẽ tốn thời gian, nhưng không yêu cầu AI. Tuy nhiên, tôi không thấy lý do gì để thực hiện chuyển đổi như thế này. Nó mất tính di động của Java và sẽ không đạt được hiệu quả của C (ngoại trừ việc nó sẽ được biên dịch thành mã gốc, nhưng tốt hơn là biên dịch mã máy trực tiếp từ Java).

5

Có một, bit tôi không chắc chắn nếu nó thực sự hoạt động. Java to C++ Converter-Tangible Software Soulutions.

Thật kỳ lạ khi có C++ đối với trình chuyển đổi java, nhưng chỉ có 1 trình chuyển đổi từ java sang C++.

10

Firefox HTML5 parser is written in Java and converted to C++. Nhưng tôi nghĩ bộ chuyển đổi được sử dụng ở đây khá cụ thể cho dự án này. Điều thú vị là, hóa ra trình phân tích cú pháp C++ kết quả nhanh hơn trình phân tích cú pháp cũ được viết bằng C++.

Tôi cũng đang viết trình chuyển đổi như một phần của H2 database, dưới src/tools/org/h2/java. Ý tưởng là cho phép chuyển đổi một tập hợp con của cơ sở dữ liệu H2 thành C++, vì vậy đây cũng không phải là một trình dịch đa năng.

Và có dự án mã nguồn mở J2C.

Vì vậy, có nhiều cách để chuyển đổi Java sang C++. Nhưng đừng mong đợi người dịch hỗ trợ tất cả các tính năng và không mong đợi mã kết quả sẽ nhanh hơn một Java JVM tốt.

+0

Bạn có bất kỳ bài viết blog nào về chuyển đổi H2 sang C++ hay sth như thế này không (ý tưởng thú vị này xuất hiện trong tâm trí bạn và những vấn đề bạn gặp phải) là gì? –

+0

Tôi không viết nhiều bài viết trên blog ... Tôi đã viết trình chuyển đổi để kiểm tra xem phiên bản C++ có nhanh hơn JVM trên Raspberry Pi hay không (như các JVM có sẵn cho nền tảng này, Cacao và Zero VM, không nhanh như vậy và cần nhiều bộ nhớ). Tôi thấy nó nhanh hơn vài lần và cần ít bộ nhớ hơn. Phiên bản C++ chậm hơn một chút trên máy tính 'bình thường' (như tôi đã mong đợi). Trạng thái hiện tại là: các ứng dụng demo rất đơn giản có thể được chuyển đổi. Tôi hiện không làm việc trên công cụ chuyển đổi, nhưng có lẽ tôi sẽ tiếp tục trong tương lai. –

Các vấn đề liên quan