2010-05-10 51 views
16

Tôi đang trong quá trình triển khai ứng dụng đa nền tảng (Mac OS X, Windows và Linux) sẽ thực hiện rất nhiều phân tích chuyên sâu về dữ liệu tài chính của CPU. Phần lớn công cụ phân tích sẽ được viết bằng C++ vì lý do tốc độ, với công cụ tạo tập lệnh có thể truy cập được với công cụ kiểm tra C++. Tôi muốn viết một số front-end kịch bản theo thời gian để mô phỏng các phần mềm phổ biến khác với các cơ sở người dùng lớn hiện có. Mặt trước đầu tiên sẽ là một ngôn ngữ kịch bản giống như VisualBasic.Liên kết LLVM JIT Mã với Thư viện LLVM tĩnh?

Tôi nghĩ rằng LLVM sẽ là hoàn hảo cho nhu cầu của tôi. Hiệu suất là rất quan trọng vì số lượng tuyệt đối của dữ liệu; có thể mất hàng giờ hoặc vài ngày để chạy một lần chạy thử nghiệm để nhận được câu trả lời. Tôi tin rằng việc sử dụng LLVM cũng sẽ cho phép tôi sử dụng một giải pháp back-end duy nhất trong khi tôi triển khai các giao diện người dùng khác nhau cho các hương vị khác nhau của ngôn ngữ kịch bản theo thời gian.

Bản thân động cơ thử nghiệm sẽ được tách khỏi giao diện và kiểm tra thậm chí sẽ diễn ra trong một quy trình riêng biệt với tiến độ và kết quả được báo cáo cho giao diện quản lý thử nghiệm. Các thử nghiệm sẽ bao gồm mã kịch bản được tích hợp với mã công cụ thử nghiệm.

Trong lần triển khai trước đó của hệ thống kiểm tra thương mại tương tự tôi đã viết, tôi đã xây dựng một trình thông dịch nhanh dễ dàng giao tiếp với thư viện thử nghiệm vì nó được viết bằng C++ và được liên kết trực tiếp với thư viện công cụ kiểm tra. Gọi lại từ mã kịch bản để kiểm tra các đối tượng thư viện liên quan đến việc dịch giữa các định dạng với chi phí đáng kể.

Tôi tưởng tượng rằng với LLVM, tôi có thể thực hiện cuộc gọi lại thành C++ trực tiếp để tôi có thể làm cho mã script hoạt động gần như thể nó được viết bằng C++. Tương tự như vậy, nếu tất cả các mã được biên dịch sang định dạng mã byte LLVM, có vẻ như các trình tối ưu hóa LLVM có thể tối ưu hóa trên các ranh giới giữa ngôn ngữ kịch bản và mã công cụ thử nghiệm được viết bằng C++.

Tôi không muốn phải biên dịch công cụ kiểm tra mỗi lần. Lý tưởng nhất, tôi muốn JIT chỉ biên dịch mã kịch bản. Đối với các thử nghiệm nhỏ, tôi sẽ bỏ qua một số lần tối ưu hóa, trong khi đối với các thử nghiệm lớn, tôi sẽ thực hiện tối ưu hóa đầy đủ trong liên kết.

Vậy điều này có khả thi không? Tôi có thể biên dịch trước công cụ thử nghiệm thành một tệp đối tượng .o hoặc tệp thư viện .a và sau đó liên kết trong mã kịch bản bằng cách sử dụng JIT không?

Cuối cùng, lý tưởng, tôi muốn có mã kịch bản triển khai các phương thức cụ thể làm lớp con cho một lớp C++ cụ thể. Vì vậy, công cụ kiểm tra C++ sẽ chỉ thấy các đối tượng C++ trong khi mã thiết lập JIT đã biên dịch mã kịch bản đã triển khai một số phương thức cho các đối tượng. Có vẻ như nếu tôi sử dụng thuật toán mangling đúng tên thì sẽ dễ dàng thiết lập thế hệ LLVM cho ngôn ngữ kịch bản để trông giống như một cuộc gọi phương thức C++ mà sau đó có thể được liên kết với công cụ kiểm tra. Do đó, giai đoạn liên kết sẽ đi theo hai hướng, các cuộc gọi từ ngôn ngữ kịch bản vào các đối tượng thử nghiệm để lấy thông tin về giá và kiểm tra thông tin trạng thái và các cuộc gọi từ công cụ kiểm tra các phương pháp của một số đối tượng C++ cụ thể. không phải từ C++ mà từ ngôn ngữ kịch bản.

Nói tóm lại:

1) Tôi có thể liên kết trong biên dịch sẵn (hoặc, .o, hoặc .a) file .bc như một phần của JIT biên soạn, quá trình mã thế hệ?

2) Tôi có thể liên kết trong mã bằng cách sử dụng quy trình trong 1) ở trên theo cách mà tôi có thể tạo mã hoạt động như thể tất cả được viết bằng C++ không?

Trả lời

14
  1. Có, chúng tôi có thể! Tùy thuộc vào phiên bản LLVM bạn sử dụng có các cuộc gọi API khác nhau. bạn sẽ cần llvm :: getBitcodeModuleProvider trên 2.5.
  2. Cách dễ nhất để gọi hàm C++ là tạo một hàm (llvm :: Function :: Create) sử dụng cờ llvm :: Function :: ExternalLinkage và sau đó addGlobalMapping để làm cho nó trỏ tới hàm C++ của bạn.
+0

Cảm ơn sự giúp đỡ của bạn. Tôi sẽ kiểm tra điều đó. – inflector

3
  1. Tôi tin như vậy.
  2. Đây là lông. Bạn cần phải khớp với C++ ABI của các hàm bạn đang gọi, và cần đảm bảo mã được tạo ra sử dụng cùng cấu trúc dữ liệu, các lớp, bố trí, vv (thông qua một tệp tương đương với các tệp tiêu đề). C++ ABI có khá nhiều sắc thái và các vấn đề về tính di động. Có lẽ nguyên mẫu làm interop với C đầu tiên. clang có hỗ trợ giới hạn cho C++ ngay bây giờ.
1

1) Bạn có thể tải và liên kết các tệp .bc, .o nếu chúng đã được lưu trữ thành tệp .so nên có thể tải và các ký hiệu trong chúng sẽ có thể được sử dụng.

2) Miễn là bạn không muốn làm những điều kinh khủng với các cuộc gọi lại, bạn có thể chỉ cần vượt qua con trỏ hàm C chuẩn và thực hiện cuộc gọi lại bằng con trỏ hàm. Bạn có thể làm một số thứ khác nữa, nhưng đối phó với việc cố gắng định nghĩa các đối tượng C++ hoặc các khuôn mẫu hoặc gọi hàm thành viên trong khi không phải là trình biên dịch C++ là thứ bạn không muốn làm.

bạn phải biết C++ ABI, bạn phải biết về nền tảng bạn nhắm mục tiêu, bạn phải biết tất cả mọi thứ, bạn phải là trình biên dịch C++ để tạo mã trông giống như C++. Tên mangler là một trong những phần khó chịu nhất.

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