2012-02-18 17 views
5

những tác động trênSử dụng LLVM bytecode cho các thư viện (thay vì các tập tin đối tượng bẩm sinh)

  • tính di động (quy ước gọi: nó thực sự quan trọng ở mức LLVM khi chỉ gọi vào C hoặc các chức năng thư viện OS) là gì
  • thời gian liên kết
  • tối ưu hóa

tôi muốn biên dịch một ngôn ngữ đồ chơi với LLVM, do tất cả các phần cứng đã có mặt (tối ưu hóa, đối tượng sinh mã), nhưng tôi đấu tranh với khái niệm tôi muốn giữ nếu nó đáng giá: tệp thư viện phải được phân phối lại, có thể sử dụng như lib tĩnh và được chia sẻ (để liên kết, trong trường hợp dùng chung, hoặc dll sẽ được tạo khi ứng dụng cuối cùng được liên kết), xách tay. Tôi tin rằng điều này sẽ cắt giảm một phần thời gian biên dịch (như việc tạo mã gốc và có lẽ tối ưu hóa chỉ được thực hiện một lần, vào thời gian liên kết nhị phân cuối cùng). Tôi hình dung các mối liên kết chăm sóc gọi quy ước (nếu có thể) và chuyển đổi sang một thư viện được chia sẻ nếu được yêu cầu. Ngoài ra, có lẽ LLVM có thể được tận dụng tới không phải là liên kết và sử dụng LLVM JIT để chạy trực tiếp bytecode được tạo ra, loại bỏ hoàn toàn thời gian liên kết khi viết mã.

Điều này âm thanh

  1. doable?
  2. Đáng giá? Tôi biết thời gian liên kết C/C++ tương đối dài, đó là vấn đề khi thường xuyên xây dựng lại. Còn về tối ưu hóa thời gian liên kết miễn phí (cfr /GL-flto vì nó về cơ bản sẽ là bytecode LLVM được liên kết với nhau, sau đó sẽ được biến thành một tệp nhị phân gốc).

Đây có thể là một câu hỏi mơ hồ, nếu tôi phải làm rõ điều gì đó, vui lòng hỏi.

+0

Thời gian liên kết dài hơn gì? Thời gian liên kết Afaik chủ yếu phụ thuộc vào số lượng ký hiệu trên mỗi đơn vị biên dịch phải được giải quyết (bắt nguồn từ các đơn vị biên dịch khác), chứ không phải trên ngôn ngữ.Tôi cũng không chắc chắn rằng bytecode LLVM thực sự tự động loại bỏ các quy ước gọi điện. Sau đó, mã C++ được biên dịch với LLVM không thể truy cập bất kỳ thứ gì không được biên dịch LLVM. –

+0

@MarcovandeVoort: LLVM quản lý quy ước gọi khi nó tạo mã đối tượng gốc. Nếu tôi chỉ gọi mã LLVM (vì vậy không có thư viện hệ điều hành) tất cả mọi thứ sẽ làm theo cùng một quy ước gọi điện được tạo ra bởi LLVM. C/C + + mã được biên dịch với một quy ước gọi điện thoại trong tâm trí ở nơi đầu tiên. Clang tạo bitcoin LLVM không phải là nền tảng độc lập. Tôi không thấy lý do tại sao ngôn ngữ đồ chơi của tôi cần phải quan tâm đến C quy ước gọi điện thoại nội bộ. – rubenvb

Trả lời

8

Tôi đã làm điều gì đó tương tự như vậy trong quá khứ. Một điều mà bạn nên nhận ra là bitcoin LLVM không phải là "di động" ở chỗ nó không hoàn toàn độc lập với máy. Các tệp bitcode có kiến ​​thức về những thứ như kích thước của con trỏ, v.v. cụ thể cho bộ xử lý đang được nhắm mục tiêu. Có nói rằng, trong quá khứ tôi đã biên dịch chương trình và thư viện hỗ trợ của họ để bitcode và liên kết các tập tin bitcode với nhau trước khi tạo ra một tập tin lắp ráp cho toàn bộ chương trình. Bạn nói đúng rằng các quy ước gọi điện không quan trọng đối với các cuộc gọi nội bộ nhưng các cuộc gọi được thực hiện bên ngoài (hoặc từ bên ngoài) vẫn yêu cầu ABI phải tuân theo.

Bạn có thể thiết kế ngôn ngữ đồ chơi của mình theo cách sao cho bạn có thể tránh mã bit phụ thuộc vào bộ xử lý, nhưng bạn sẽ phải rất cẩn thận.

Tôi nhận thấy rằng việc liên kết các tệp bitcode với nhau mất khá nhiều thời gian, đặc biệt là ở các mức tối ưu hóa cao. Điều đó có thể đã tăng tốc ngay bây giờ, tôi đã làm nó với LLVM từ 2 hoặc 3 năm trước đây.

Điểm cuối cùng: tùy thuộc vào bộ xử lý đích bạn có thể cần tương đương với libgcc.a hoặc trình biên dịch-rt để xử lý những thứ mà bộ xử lý không thể như điểm nổi hoặc số nguyên 64 bit nếu bộ xử lý không ' t có hướng dẫn thực hiện các hoạt động đó.

+0

Cảm ơn bạn đã chia sẻ trải nghiệm của mình. Tôi thực sự có kế hoạch liên kết để "biết" về các quy ước gọi đến thư viện OS (sẽ là C) và đã xem xét các công cụ biên dịch-rt quá (ví dụ như hỗ trợ ngoại lệ), nhưng đó vẫn là một chặng đường dài. Nó cũng có vẻ như tốc độ của llvm-ld được tích cực cải thiện trong thời gian ([ví dụ] (http://llvm.org/bugs/show_bug.cgi?id=6355)) – rubenvb

+0

Tôi đã tìm ra hệ thống kiểu viết lại sẽ giúp . Tôi nên thử toàn bộ chương trình biên dịch một lần nữa, khái niệm này là khá mát mẻ. :-) –

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