2012-04-22 32 views
8

Để viết trình biên dịch, những lợi thế và bất lợi của việc sử dụng LLVM IR vs C cho ngôn ngữ đích là gì? Tôi biết cả hai được sử dụng, và tôi tưởng tượng rằng mã máy cuối cùng sẽ là tương tự nếu tôi đã sử dụng tiếng kêu để biên dịch C. Vì vậy, những thứ khác để xem xét là gì?Ngôn ngữ đầu ra biên dịch - LLVM IR vs C

Trả lời

7

Tôi đã sử dụng LLVM IR cho một vài trình biên dịch ngược lại và đã làm việc với các trình biên dịch sử dụng C làm đầu cuối. Một điều mà tôi thấy rằng đã cho LLVM IR một lợi thế là nó được đánh máy. Rất khó để tạo ra đầu ra hoàn toàn bị lỗi mà không nhận được lỗi từ các thư viện LLVM.

Nó cũng dễ dàng hơn để giữ mối tương quan chặt chẽ giữa mã nguồn và IR để gỡ lỗi, theo ý kiến ​​của tôi.

Ngoài ra, bạn sẽ có được tất cả các công cụ dòng lệnh LLVM tuyệt vời để phân tích và xử lý IR mà giao diện người dùng của bạn phát ra.

+1

Bạn nhập IR là gì? Không phải là C đánh máy là tốt? – Dan

+3

Phải, C được nhập. Nhưng bạn không nhận được một dấu hiệu của lỗi cho đến khi bạn cố gắng biên dịch mã C. Với LLVM IR bạn nhận được một dấu hiệu của lỗi khi bạn tạo ra IR. Dễ dàng hơn nhiều để gỡ lỗi. –

0

Kiến trúc và hệ điều hành không có CLANG rõ ràng hoặc đang ở trạng thái thử nghiệm.

C được chấp nhận rộng rãi hơn, nhưng LLVM IR cho phép bạn nạp thìa cho động cơ LLVM. Không phải tất cả các đường dẫn đến IR đều bình đẳng.

1

tôi nghi ngờ bạn có thể thực hiện hỗ trợ gỡ lỗi thích hợp cho ngôn ngữ của bạn khi nhắm mục tiêu C.

+0

Đó chính là lý do tôi đã tìm kiếm chuỗi này. Tôi thấy không có cách nào có thể là "bản đồ nguồn" trên các biểu tượng gỡ lỗi, bởi vì có những thay đổi không tương thích ngược trong các trình tạo biểu tượng gỡ lỗi của trình biên dịch C. Người ta sẽ phải cập nhật phần mềm lập bản đồ gỡ lỗi với mỗi thay đổi của trình biên dịch C được hỗ trợ. –

2

lợi thế LLVM:

  1. JIT - bạn có thể biên dịch và chạy mã của bạn tự động. Chắc chắn điều tương tự cũng có thể xảy ra với C (ví dụ: sử dụng một nhúng tcc), nhưng nó là một tùy chọn ít mạnh mẽ và di động hơn.
  2. Bạn có thể chạy các thẻ tối ưu hóa của riêng mình qua IR được tạo.
  3. Phản ánh miễn phí - kiểm tra mã được tạo dễ dàng hơn nhiều với LLVM.
  4. Thư viện LLVM không lớn bằng hầu hết các trình biên dịch C (không kể số tcc, tất nhiên).

LLVM nhược điểm:

  1. Mã không phải là di động, bạn phải thay đổi nó một chút tùy thuộc vào mục tiêu của bạn. Có một phần nhỏ của LLVM, nhưng nó vẫn là một thực hành tinh ranh.
  2. Thời gian chạy phụ thuộc vào thư viện C++, có thể là một vấn đề nhỏ.
+0

bạn quên: nếu bạn muốn C interop (ngôn ngữ nào không?), Bạn phải mã tất cả những khó chịu C ABIs mình vì llvm không làm điều đó tất cả bởi chính nó (nó chia công việc 50/50 với tiếng kêu) – cap

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