Câu trả lời:
LLVM là một thư viện được sử dụng để xây dựng, tối ưu hóa và sản xuất mã máy trung gian và / hoặc mã nhị phân.
LLVM có thể được sử dụng làm khung trình biên dịch, trong đó bạn cung cấp "giao diện người dùng" (trình phân tích cú pháp và từ vựng) và "mặt sau" (mã chuyển đổi biểu diễn của LLVM thành mã máy thực tế).
LLVM cũng có thể hoạt động như một trình biên dịch JIT - nó có hỗ trợ cho việc tạo lắp ráp x86 / x86_64 và PPC / PPC64 với tối ưu hóa mã nhanh nhằm mục đích tốc độ biên dịch.
Nếu bạn quan tâm, bạn có thể chơi với mã máy của LLVM được tạo từ mã C hoặc C ++ trong trang demo của họ , nhưng trang demo hiện bị vô hiệu hóa kể từ năm 2013.
Một bản tóm tắt tốt về LLVM là đây:
Ở frontend bạn có Perl, và nhiều ngôn ngữ cấp cao khác. Ở phần phụ trợ, bạn có mã bản địa chạy trực tiếp trên máy.
Tại trung tâm là đại diện mã trung gian của bạn. Nếu mọi ngôn ngữ cấp cao có thể được biểu diễn theo định dạng LLVM IR này, thì các công cụ phân tích dựa trên IR này có thể dễ dàng được sử dụng lại - đó là lý do cơ bản.
LLVM (được sử dụng để chỉ "Máy ảo cấp thấp" nhưng không còn nữa) là một cơ sở hạ tầng trình biên dịch, được viết bằng C ++, được thiết kế để tối ưu hóa thời gian biên dịch, thời gian liên kết, thời gian chạy và "thời gian nhàn rỗi" của các chương trình được viết trong các ngôn ngữ lập trình tùy ý. Nguyên thực hiện cho C / C ++, thiết kế ngôn ngữ độc lập (và thành công) của LLVM từ đó đã sinh ra một loạt các mặt trận-kết thúc, bao gồm Objective C, Fortran, Ada, Haskell, Java bytecode, Python, Ruby, ActionScript, GLSL , và những người khác.
Đọc phần này để được giải thích thêm
Cũng kiểm tra Unladen Swallow
Theo cuốn sách 'Bắt đầu với thư viện lõi LLVM' (c):
Trong thực tế, tên LLVM có thể đề cập đến bất kỳ điều nào sau đây:
Dự án / cơ sở hạ tầng LLVM: Đây là một chiếc ô cho một số dự án, cùng nhau, tạo thành một trình biên dịch hoàn chỉnh: frontends, backends, tối ưu hóa, trình biên dịch, trình liên kết, libc ++, trình biên dịch-rt và công cụ JIT. Từ "LLVM" có nghĩa này, ví dụ, trong câu sau: "LLVM bao gồm một số dự án".
Trình biên dịch dựa trên LLVM: Đây là trình biên dịch được xây dựng một phần hoặc hoàn toàn với cơ sở hạ tầng LLVM. Ví dụ, một trình biên dịch có thể sử dụng LLVM cho frontend và backend nhưng sử dụng các thư viện hệ thống GCC và GNU để thực hiện liên kết cuối cùng. LLVM có nghĩa này trong câu sau đây, ví dụ: "Tôi đã sử dụng LLVM để biên dịch các chương trình C sang nền tảng MIPS".
Thư viện LLVM: Đây là phần mã có thể tái sử dụng của cơ sở hạ tầng LLVM. Ví dụ, LLVM có nghĩa này trong câu: "Dự án của tôi sử dụng LLVM để tạo mã thông qua khung biên dịch đúng lúc".
Lõi LLVM: Các tối ưu hóa xảy ra ở cấp độ ngôn ngữ trung gian và các thuật toán phụ trợ tạo thành lõi LLVM nơi dự án bắt đầu. LLVM có nghĩa này trong câu sau: "LLVM và Clang là hai dự án khác nhau".
LLVM IR: Đây là biểu diễn trung gian của trình biên dịch LLVM. LLVM có nghĩa này khi được sử dụng trong các câu như "Tôi đã xây dựng một frontend dịch ngôn ngữ của riêng tôi sang LLVM".
LLVM về cơ bản là một thư viện được sử dụng để xây dựng các trình biên dịch và / hoặc phần mềm hướng ngôn ngữ. Ý chính cơ bản là mặc dù bạn có gcc có lẽ là bộ trình biên dịch phổ biến nhất, nhưng nó không được xây dựng để có thể sử dụng lại tức là. thật khó để lấy các thành phần từ gcc và sử dụng nó để xây dựng ứng dụng của riêng bạn. LLVM giải quyết vấn đề này tốt bằng cách xây dựng một bộ "công nghệ trình biên dịch và công cụ mô đun và có thể tái sử dụng" mà bất kỳ ai cũng có thể sử dụng để xây dựng trình biên dịch và phần mềm định hướng ngôn ngữ.
Cơ sở hạ tầng trình biên dịch LLVM đặc biệt hữu ích để thực hiện tối ưu hóa và biến đổi trên mã. Nó cũng bao gồm một số công cụ phục vụ các công dụng khác nhau. llvm-prof là một công cụ định hình cho phép bạn thực hiện hồ sơ thực hiện để xác định các điểm nóng chương trình. Opt là một công cụ tối ưu hóa cung cấp các vượt qua tối ưu hóa khác nhau (ví dụ loại bỏ mã chết).
LLVM quan trọng cung cấp cho bạn các thư viện để viết Passes của riêng bạn. Chẳng hạn, nếu bạn yêu cầu thêm một phạm vi kiểm tra vào các đối số nhất định được truyền vào các chức năng nhất định của Chương trình, việc viết một LLVM Pass đơn giản sẽ đủ.
Để biết thêm thông tin về cách viết Pass của riêng bạn, hãy kiểm tra http://llvm.org/docs/WritingAnLLVMPass.html này