2010-07-11 22 views
14

Tôi chưa có kinh nghiệm với llvm hoặc clang. Từ những gì tôi đọc clang được cho là dễ dàng embeddable Wikipedia-Clang, tuy nhiên, tôi đã không tìm thấy bất kỳ hướng dẫn về làm thế nào để đạt được điều này. Vì vậy, nó có thể cung cấp cho người dùng một ứng dụng C++ với kịch bản-quyền hạn bởi JIT biên dịch và thực thi mã do người dùng định nghĩa trong thời gian chạy không? Có thể gọi các lớp và phương thức của ứng dụng và chia sẻ các đối tượng không?Bất kỳ hướng dẫn nào để nhúng Clang làm trình thông dịch script thành Mã C++?

sửa: Tôi muốn một cú pháp C-like cho kịch bản-languge (hoặc thậm chí C++ chính nó)

Trả lời

10

Tôi không biết về bất kỳ hướng dẫn, nhưng có một thông dịch viên dụ C trong nguồn Clang điều đó có thể hữu ích. Bạn có thể tìm thấy nó ở đây: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

Bạn có thể sẽ không có nhiều lựa chọn cú pháp cho ngôn ngữ kịch bản nếu bạn đi tuyến đường này. Clang chỉ phân tích cú pháp C, C++ và Mục tiêu C. Nếu bạn muốn bất kỳ biến thể nào, bạn có thể đã cắt bỏ công việc của mình cho bạn.

+0

Cảm ơn bạn. Nó đã cho tôi khá một thời gian để có được nó và chạy - về cơ bản vì tôi đã không tìm thấy thực thi :) Bây giờ sau khi nhìn vào nó tôi muốn nói nó là một nửa chiều ở đó. Bây giờ tôi cần tìm ra cách gọi các hàm được định nghĩa trong phần không được ghi. ... bất kỳ ý tưởng nào về điều đó? – FFox

+0

Tôi không chắc chắn ý của bạn là gì. Bạn sẽ có thể nhận được một con trỏ tới bất kỳ hàm nào mà bạn đã biên dịch. Có lẽ hướng dẫn LLVM nói chung này sẽ hữu ích: http://llvm.org/docs/tutorial/ (chương 4, đặc biệt). Tôi không nghĩ rằng bạn sẽ có thể sử dụng thông dịch viên như nó, nhưng nó sẽ cung cấp cho bạn một ý tưởng về cách nhúng một trình thông dịch C/C++ vào ứng dụng của bạn. (Tôi thậm chí không sử dụng nó bản thân mình, tôi chỉ nhớ nhìn thấy nó.) –

+1

Ok đây là những gì tôi đã làm: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ... và nó thực sự làm việc với sự giúp đỡ của những người tốt đẹp từ danh sách gửi thư của cfe-dev. Tại sao bạn nghĩ rằng thông dịch viên này không thể được sử dụng trong một ứng dụng? – FFox

0

Tôi không biết về Clang nhưng bạn có thể muốn xem xét Ch:

http://www.softintegration.com/

này được mô tả như một nhúng hoặc độc lập c/C++ thông dịch viên. Có một bài viết Tiến sĩ Dobbs với ví dụ về nhúng nó ở đây:

http://www.drdobbs.com/architecture-and-design/212201774

Tôi đã không làm nhiều hơn chơi với nó, nhưng nó có vẻ là một sản phẩm ổn định và trưởng thành. Đó là thương mại, nguồn đóng, nhưng phiên bản "chuẩn" được mô tả miễn phí cho cả mục đích sử dụng cá nhân và thương mại. Tuy nhiên, nhìn vào giấy phép có vẻ như "thương mại" chỉ có thể bao gồm việc sử dụng nội bộ của công ty, không nhúng vào một sản phẩm mà sau đó được bán hoặc phân phối. (Tôi không phải là luật sư, vì vậy rõ ràng bạn nên kiểm tra với SoftIntegration để chắc chắn về các điều khoản cấp phép.)

5

Bạn có thể sử dụng clang làm thư viện để thực hiện biên dịch JIT như đã nêu trong các câu trả lời khác. Sau đó, bạn phải tải lên mô-đun đã biên dịch (ví dụ, một thư viện .so). Để thực hiện điều này, bạn có thể sử dụng dlopen chuẩn (unix) hoặc LoadLibrary (windows) để tải nó, sau đó sử dụng dlsym (unix) để tham chiếu động các hàm đã biên dịch, nói một hàm "main"() giống như có tên được biết đến. Lưu ý rằng đối với C++ bạn sẽ phải sử dụng các ký hiệu bị xáo trộn. Một giải pháp thay thế di động là ví dụ: GNU libltdl. Thay vào đó, "tập lệnh" có thể chạy tự động tại thời điểm tải bằng cách thực hiện các hàm init module hoặc đặt một số mã tĩnh (hàm tạo của đối tượng được xác định trên toàn cầu C++ sẽ được gọi ngay lập tức).

Mô-đun được nạp có thể gọi trực tiếp bất kỳ thứ gì trong ứng dụng chính. Tất nhiên các ký hiệu được biết đến tại thời gian biên dịch bằng cách sử dụng các tệp tiêu đề của ứng dụng chính thích hợp.

Nếu bạn muốn dễ dàng thêm C++ "vào chương trình của bạn, và biết giao diện thành phần ưu tiên (nói ứng dụng chính của bạn biết tên và giao diện của một lớp đã tải từ .h trước khi mô-đun được tải trong bộ nhớ), sau khi bạn tự động tải thư viện, lớp có sẵn để được sử dụng như thể nó được liên kết tĩnh. Chỉ cần chắc chắn rằng bạn không cố gắng để khởi tạo một đối tượng của lớp trước khi bạn dlopen() module của nó.

Sử dụng mã tĩnh cũng cho phép thực hiện các cơ chế đăng ký plugin tự động tốt đẹp.

0

Tôi không chắc chắn rằng nhúng C hoặc C++ như Clang là một ý tưởng tốt trong trường hợp của bạn. Bởi vì "tập lệnh", đó là mã (C hoặc C++) được nạp (lúc chạy!) Có thể tùy ý để có thể làm hỏng toàn bộ ứng dụng. Bạn thường không muốn đầu vào người dùng bị lỗi có thể làm hỏng ứng dụng của bạn.

Nếu bạn muốn nhúng một thông dịch viên, hãy chọn thứ gì đó được thiết kế cho mục đích đó, như Guile hoặc Lua và cẩn thận rằng các lỗi trong tập lệnh sẽ không làm hỏng toàn bộ ứng dụng. Xem this answer để có một cuộc thảo luận chi tiết hơn về việc nhúng trình thông dịch.