2011-07-02 36 views
18

Tôi muốn thực hiện các tệp mã nguồn Clojure (.clj) và chuyển đổi chúng thành các tệp mã nguồn java tương đương (.java) một cách tự động. Tôi tự hỏi cách tốt nhất để làm điều này là gì hoặc nếu nó thậm chí có thể. Mã nguồn java được chuyển đổi sẽ cần phải đủ chấp nhận được.Cách tốt nhất để chuyển đổi nguồn Clojure sang nguồn Java Tự động

+1

Đó là chắc chắn * có thể *, bởi vì Clojure biên dịch sang mã byte của JVM và có các trình giải mã bytecode-to-Java. Nhưng một nghi phạm và hy vọng có một tuyến đường trực tiếp hơn sẽ tạo ra mã chất lượng cao hơn đáng kể ... –

+2

Hãy xem: http://georgejahad.com/clojure/clojureDecompiled.html – phlogratos

+0

Vâng, ý tôi là có thể sản xuất nguồn Java với bất kỳ khả năng đọc nào. – mudge

Trả lời

8

Tôi sẽ thử tạo tệp .class từ .clj và sau đó biên dịch nó thành .java với trình dịch ngược, ví dụ: JAD.

+1

Cũng nên nhớ rằng mã được biên dịch sẽ phụ thuộc vào các lớp Clojures. Vì vậy, bạn sẽ không nhận được mã Java "thuần túy". Đó có lẽ là giải pháp tốt nhất. –

4

Tôi không quen thuộc với Clojure nhưng lưu ý rằng bạn có thể đọc trong một chương trình Lisp và coi nó như một cơ sở dữ liệu, rất có khả năng tốt hơn việc xử lý mã Clojure đã biên dịch vì điều này phụ thuộc nhiều vào thời gian chạy Clojure.

Nếu điều này là dành cho các chương trình của riêng bạn thì bạn có thể sống với một tập hợp con rất nhỏ của Clojure đầy đủ và có thể bạn có thể tự xử lý với một trình tạo chương trình nhỏ.

15

Đặt cược tốt nhất của bạn, như những người khác đã chỉ ra, sẽ sử dụng trình giải mã bytecode. Bạn vẫn sẽ cần các lớp clojure. Nhưng, quan trọng hơn, nếu mục tiêu của bạn là tạo ra mã Java cần được xử lý bởi các lập trình viên Java, rất khó có khả năng bạn sẽ thành công.

Clojure không chỉ là "java với cú pháp khác". Cấu trúc ngôn ngữ của nó rất khác so với java, nhiều thứ mà Clojure thành ngữ sẽ trông rất lạ trong Java.

Thậm chí nếu mã Java của bạn trông có vẻ dễ đọc hơn, các nhà phát triển Java của bạn sẽ trở nên vô cùng thất vọng. Về cơ bản họ vẫn cần lập trình Lisp nhưng sử dụng cú pháp Java và các cấu trúc rất lạ: Nó sẽ là một mớ hỗn độn.

Nếu bạn đang tìm cách sử dụng Clojure trong một nhóm các nhà phát triển Java, tôi sẽ cố gắng phát triển và đóng gói mã Clojure của bạn như một cái bình với một API java được xác định rõ. Các nhà phát triển Java sẽ hạnh phúc, bởi vì nó chỉ là một thư viện java khác, và bạn sẽ hạnh phúc bởi vì bạn sẽ viết mã Clojure thích hợp.

8

Bộ công cụ gỡ lỗi Clojure là một công cụ tuyệt vời để tìm hiểu về mã Clojure đã biên dịch và nó thể hiện một số cách mà các lớp của Clojure khác với các lớp được tạo ra từ nguồn java. Nó sẽ là khó khăn ví dụ để viết mã java để đại diện cho Clojures đóng cửa ví dụ (mặc dù nó có thể)

Clojure tạo mã byte mà không thể được tạo ra bằng cách thu thập bất kỳ chương trình java, do đó, một giải pháp chung là không thể. Cụ thể Clojure nulls ra các đối số (trong khung gọi) trước khi thực hiện các cuộc gọi đệ quy. Vì bạn đang bắt đầu từ nguồn và không phải là tệp .class, bạn sẽ có thể nhận đủ gần với điều kiện bạn không cố gắng đảm bảo rằng mã java sẽ tạo ra hành vi giống hệt nhau. Clojure ngăn chặn một số rò rỉ bộ nhớ trong đệ quy sẽ thực sự khó tránh khỏi trong mã java tương đương.

"Mục đích của mã này là hủy bỏ các đối số để ngăn chặn 'giữ đầu' trong trường hợp có cuộc gọi hàm đệ quy." Từ bài nói chuyện của George Jahad về việc dịch ngược lớp clojure. http://georgejahad.com/clojure/clojureDecompiled.html

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