2009-06-30 46 views
18

Tôi đang trong quá trình viết một công cụ quy tắc thực hiện các nhiệm vụ đơn giản như được xác định bởi các cấu trúc có điều kiện. Đó là điều kiện tiên quyết của dự án rằng các quy tắc ở định dạng XML. Tôi đã lập mô hình lược đồ XML của mình giống như các khối mã đơn giản. Tôi muốn phân tích cú pháp XML và sau đó biến nó thành mã Java. Sau đó tôi muốn biên dịch (và chạy) mã này khi chạy. Làm như vậy có nghĩa là công cụ quy tắc của tôi không còn hoạt động như một thông dịch viên nhưng thực thi Mã byte Byte nguyên gốc.Làm cách nào để biên dịch và triển khai một lớp java trong thời gian chạy?

Tôi đã tìm ra giai đoạn phân tích cú pháp và nhiều hơn hoặc ít hơn giai đoạn tạo mã Java. Bây giờ tôi muốn tìm ra giai đoạn cuối cùng - biên dịch ở giai đoạn chạy.

Tiếp theo chủ đề này: Compile to java bytecode (without using Java) Tôi đã trở thành nhận thức được giải pháp khả thi sau:

Tôi rất thích sự so sánh giữa những cũng như các đề xuất khác để giải quyết biên dịch Java ở giai đoạn chạy.

+2

Vài gợi ý cho bạn: 1) tải xuống nguồn Tomcat, khi nó tạo ra các lớp cho JSP, nó phải làm đúng những gì bạn mô tả. 2) hãy xem Drools (http://www.jboss.org/drools/). Tôi đã sử dụng nó trong quá khứ và nó khá mạnh mẽ khi nói đến các công cụ quy tắc. –

+0

Bạn đã bao giờ hoàn thành đơn đăng ký này chưa? Tôi muốn được quan tâm để xem nó hoạt động như thế nào nếu bạn có thể chia sẻ các nguồn. –

+0

@EricB. Vui mừng bạn đã thể hiện sự quan tâm. Thật không may, ứng dụng đã rẽ sang nơi khác. Tôi đã tiếp tục sử dụng API Java 6 Compiler, nhưng với một phạm vi đơn giản hơn nhiều. Nói cách khác, các khối mã XML vẫn nhận được giải thích không được biên soạn cho đến ngày nay ... Tôi không thể đăng lên mã tôi đã viết vì nó là độc quyền ... – Yaneeve

Trả lời

4

Bạn có thể chuyển đổi nó thành mã Clojure và trình biên dịch Clojure sẽ biến nó thành bytecode cho bạn.

+0

Bạn có thể xây dựng được không? – Yaneeve

+1

@Yaneeve, Clojure (http://clojure.org/) là một phương ngữ lisp được viết cho JVM. Nếu bạn đã thực hiện ngữ nghĩa của các thẻ của bạn như là các hàm/macro lisp, nó sẽ là tầm thường để chuyển đổi từ các cấu trúc XML của bạn thành các cấu trúc lisp tương ứng, sau đó có thể được biên dịch vào một lớp nếu bạn muốn. Nếu XML không phải là một yêu cầu, tôi muốn nói rằng chỉ cần sử dụng dữ liệu lisp bắt đầu bằng. Đối với một cuộc thảo luận java + xml-trung tâm về lý do tại sao, hãy xem: http://www.defmacro.org/ramblings/lisp.html – kwatford

+2

Chỉ cần quay lại câu trả lời của bạn nhanh chóng chuyển tiếp một vài năm và bây giờ tôi cảm thấy như thể gợi ý của bạn là tâm trí thổi.Quá tệ, vào thời điểm đó, và nhà phát triển/người quản lý trung bình cũng không nghĩ về mặt mã hóa và chức năng. Ví dụ về những gì bạn đã đề xuất sẽ là, tôi nghĩ, Reimann: http://riemann.io/ – Yaneeve

1

Tự khắc phục sự cố và sử dụng BeanShell như được nêu ở đây Executing java code given in a text file.

BeanShell là gì?

BeanShell là một, miễn phí, có khả năng nhúng Java nguồn thông dịch viên nhỏ với các tính năng ngôn ngữ đối tượng kịch bản, viết trong Java. BeanShell động thực hiện cú pháp Java chuẩn và mở rộng nó bằng cách viết mã phổ biến các tiện ích như loại lỏng lẻo, các lệnh và các phương thức đóng như những thứ trong Perl và JavaScript.

Bạn có thể sử dụng BeanShell tương tác để thử nghiệm và gỡ lỗi Java cũng như mở rộng các ứng dụng của bạn theo những cách mới. Scripting Java cho vay chính nó với một loạt các ứng dụng bao gồm nhanh chóng tạo mẫu, mở rộng tập lệnh người dùng, các công cụ quy tắc, cấu hình, thử nghiệm, triển khai động, hệ thống nhúng, và thậm chí giáo dục Java.

BeanShell là nhỏ và nhúng, vì vậy bạn có thể gọi BeanShell từ các ứng dụng Java của bạn để thực thi mã Java động tại thời gian chạy hoặc để cung cấp khả năng mở rộng trong các ứng dụng của bạn. Ngoài ra, bạn có thể sử dụng các script độc lập BeanShell để thao tác các ứng dụng Java ; làm việc với Java đối tượng và API động.Vì BeanShell được viết bằng Java và chạy trong cùng một máy ảo như ứng dụng của bạn, , bạn có thể tự do chuyển các tham chiếu đến các đối tượng "sống" thành các tập lệnh và trả về kết quả là .

Tóm lại, BeanShell là động diễn giải Java, cộng với một môi trường ngôn ngữ và linh hoạt kịch bản và tất cả được cuộn thành một gói sạch.

+0

Đúng nếu tôi sai, BeanShell là một thông dịch viên và do đó sẽ không tạo Mã byte Java như một kết quả của việc thực hiện ... – Yaneeve

+0

Vâng, tôi nghĩ rằng BeanShell được giải thích. Lý do tôi đề cập đến nó là tôi giả sử bạn muốn sử dụng Java để thể hiện các cấu trúc phức tạp hơn trong công cụ quy tắc của bạn, trong trường hợp nào thì vấn đề là mã Java được biên dịch hay giải thích? –

+0

Nó quan trọng vì cpu và bộ nhớ là một vấn đề trong môi trường mà tôi phải triển khai ... – Yaneeve

2

Groovy, BeanShell hoặc bất kỳ ngôn ngữ kịch bản nào khác dựa trên JVM có cơ sở như vậy để tiêm, sửa đổi, thêm và chạy mã khi chạy. Trên thực tế tất cả các ngôn ngữ kịch bản được giải thích, do đó, thực sự những người không biên dịch tại thời gian chạy.

1

bạn có thể ngã ba một quá trình như thế này

Process p = Runtime.getRuntime().exec("java -classpath "..." SomeClassContainingMain ...other arguments);  

     //you need to consume the outputs of the command if output/error is large otherwise the process is going to hang if output/error buffer is full. and create a seperate thead for it (not created here). 
     log.debug("PROCESS outputstream : " + p.getInputStream()); 
     log.debug("PROCESS errorstream : " + p.getErrorStream());   
    p.waitFor(); // Wait till the process is finished 

và có thể biên dịch và chạy nó.

2

Javassist gần như là một trình biên dịch Java đầy đủ được viết bằng Java, và nó hoàn toàn được làm bằng Java. Bạn không thể cung cấp cho nó toàn bộ tệp .java cùng một lúc, nhưng bạn có thể cung cấp cho nó chuỗi mã cho các hàm riêng lẻ và thêm chúng vào cùng một đối tượng CtClass, trở thành bytecode và sau đó là một java.lang.Class.

Tôi vừa phát hành phiên bản 0.1 của GigaLineCompile, sử dụng Javassist (trình biên dịch) và Beanshell (phiên dịch) cùng nhau và cho phép bạn kiểm soát mã nào để tối ưu hóa và khi nào. Trong các phiên bản sau, nó sẽ thay đổi giữa Javassist và Beanshell với độ chi tiết nhỏ hơn, do đó nếu bạn có nhiều chuỗi mã chia sẻ một số chất nền, các phần nền sẽ được biên dịch và các phần khác chạy trong beanshell. Nó chủ yếu là hữu ích cho trí thông minh nhân tạo tạo mã Java, nhưng nó cũng là một thay thế cho Clojure hoặc các thái cực của Javassist/Beanshell một mình.

Javassist, Beanshell, và GigaLineCompile thể được tải về (với nguồn) ở đây: http://sourceforge.net/projects/gigalinecompile

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