Chính xác thì LLVM là gì?


464

Tôi cứ nghe về LLVM mọi lúc. Đó là ở Perl, sau đó là ở Haskell, sau đó ai đó sử dụng nó trong một số ngôn ngữ khác? Nó là gì?


45
Có một chương hay trong một cuốn sách giải thích mọi thứ độc đáo ở đây: www.aosabook.org/en/llvm.html
David d C e Freitas

Câu trả lời:


369

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.


39
Nếu bạn muốn chơi với nó, hãy xem bài viết tuyệt vời này: gnuu.org/2009/09/18/wr-your-own-toy-compiler
LiraNuna

29
Liên kết được cung cấp trong câu trả lời cho biết "Trang demo LLVM hiện đang bị vô hiệu hóa."
EngrStudent

5
ellcc.org/demo/index.cgi là một cách khác để chơi với việc biên dịch C / C ++ thông qua LLVM cho các mục tiêu khác nhau, bao gồm mã trung gian
Tom Goodfellow

1
bạn có thể đưa ra một ví dụ thực tế về ý nghĩa của nó?
Migrate2Lazarus xem hồ sơ của tôi

112

Một bản tóm tắt tốt về LLVM là đây:

nhập mô tả hình ảnh ở đâ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.


39
bức tranh trị giá một ngàn chữ 👍
ipatch

3
Vì vậy, có vẻ như LLVM là hữu ích cho các nhà thiết kế trình biên dịch. Một lập trình viên có nên quan tâm nếu anh ta biên dịch với một trình biên dịch chuẩn hoặc một trình biên dịch dựa trên LLVM, bên cạnh việc phân tích mã được tạo độc lập với mã nguồn không?
jinawee

4
nếu bạn có thể biên dịch với LLVM sang IR của nó, thì rất nhiều công cụ có thể được mở cho bạn để phân tích IR. Nhưng nếu công cụ của bạn chỉ có khả năng phân tích các nhị phân riêng (ví dụ x86), thì dù đó là nhị phân do LLVM tạo hay nhị phân do gcc tạo hay trình biên dịch Intel tạo ra, không có sự khác biệt.
Peter Teoh

73

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


13
.. vì vậy những gì các tài liệu đang cố gắng nói; trong khi LLVM là từ viết tắt của Máy ảo cấp thấp , dự án được đặt tên đơn giản là LLVM , không phải là các từ được đánh vần đầy đủ.
Joool Kuijpers

2
Trước đó, nó đã viết tắt nhưng sau đó đã xóa en.wikipedia.org/wiki/LLVM
VVB

2
Để tóm tắt các ý kiến. "Máy ảo cấp thấp (LLVM)" phải là một cái gì đó giống như "LLVM (có nghĩa là" Máy ảo cấp thấp "sớm hơn trong vòng đời dự án)"
ssokolow

52

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".


35

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ữ.


6
Vậy LLVM là thư viện và Clang là trình biên dịch?
Abdul

11
Clang là C / C ++ frontend của LLVM. Nó chuyển đổi mã C thành mã bit LLVM, được dịch sang một số ngôn ngữ hội bằng trình biên dịch phụ trợ.
Boris Mulder

6

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.