LLVM IR có thể là nền tảng chéo, với các trường hợp ngoại lệ rõ ràng mà những người khác đã liệt kê. Tuy nhiên, điều đó không có nghĩa là Clang tạo mã đa nền tảng. Như bạn lưu ý, bộ tiền xử lý hầu như được sử dụng phổ biến để chỉ chuyển các phần của mã tới trình biên dịch C/C++, tùy thuộc vào nền tảng. Ngay cả khi điều này không được thực hiện trong mã người dùng, nhiều tiêu đề hệ thống bao gồm một hoặc hai nền tảng cụ thể, chẳng hạn như typedef
s. Ví dụ, nếu bạn biên dịch mã C bằng cách sử dụng size_t
để LLVM IR trên nền tảng nơi size_t
là 32 bit, LLVM IR hiện sử dụng i32
cho điều đó và không có cách nào trong địa ngục bạn có thể đảo ngược kỹ sư để sửa lỗi đó.
Dự án Portable Native Client của Google (nhờ @willglynn cho liên kết), nếu tôi hiểu chính xác, đạt được tính di động bằng cách sửa ABI cho tất cả các nền tảng đích. Vì vậy, trong ý nghĩa đó, nó không giải quyết được các vấn đề nói trên: LLVM IR không thể di chuyển đến nền tảng với một ABI khác. Lý do duy nhất này là di động hơn là các khách hàng cung cấp một lớp phù hợp với ABI PNaCl ABI thực tế. Nói cách khác, mã PNaCl không di động với nhiều nền tảng, "PNaCl VM" là. Vì vậy, điểm mấu chốt: Nếu bạn rất cẩn thận, bạn có thể sử dụng LLVM IR trên nhiều nền tảng, nhưng không phải làm công việc bổ sung đáng kể (mà Clang không làm) để trừu tượng hóa sự khác biệt của ABI.
Nếu đối tượng hoàn toàn khép kín, nó có thể được diễn giải trên một nền tảng khác. Nhưng kể từ khi ABI sẽ khác nhau, nó sẽ có một thời gian khó khăn bằng cách sử dụng phần còn lại của hệ thống. –
Tôi giả định rằng http://llvm.org/docs/LangRef.html sẽ hoàn toàn nền tảng độc lập. Điều gì làm bạn có nghĩa là chính xác bởi 'thời gian hart sử dụng phần còn lại của hệ thống'? – Tim
@Tim - Mã sẽ sử dụng bất kỳ cuộc gọi hệ điều hành nào? Họ di động như thế nào? –