2009-05-03 20 views
24

Tôi đã rất vui mừng về LLVM đủ thấp để tạo mô hình cho bất kỳ hệ thống nào, và thấy nó hứa hẹn rằng Apple đang áp dụng nó; nhưng sau đó một lần nữa Apple không hỗ trợ cụ thể Haskell;LLVM so với C--; làm thế nào có thể LLVM về cơ bản không được tốt hơn cho Haskell hơn C--?

Và, một số nghĩ rằng Haskell sẽ khấm khá hơn với C--:

Đó LLVM'ers đã không giải quyết được vấn đề của zero-overhead thu gom rác thải là không quá ngạc nhiên. Giải quyết vấn đề này trong khi vẫn không hiểu rõ mô hình dữ liệu là một câu hỏi mở trong khoa học máy tính.

- LHC won't be using LLVM.

+10

bạn cần có blog –

+1

Bạn cần sử dụng tùy chọn báo giá cho các trích dẫn dài như vậy. – Unknown

+0

Bản chỉnh sửa dường như cho thấy rằng * đã được * dán từ một blog. – ShreevatsaR

Trả lời

21

Vâng, đó là một dự án tại UNSW dịch GHC Core để LLVM

Hãy nhớ rằng: nó không phải là rõ ràng cách đây 10 năm mà LLVM sẽ xây dựng tất cả các cơ sở hạ tầng C - không thể. Thật không may, LLVM có cơ sở hạ tầng cho mã xách tay, được tối ưu hóa, nhưng không phải là cơ sở hạ tầng để hỗ trợ ngôn ngữ cấp cao, mà C-- ha (s) d.

Một dự án thú vị sẽ được nhắm mục tiêu LLVM từ C-- ...


Cập nhật, tính đến GHC 7, GHC uses LLVM for code generation. Sử dụng cờ -fllvm. Điều này đã cải thiện hiệu suất số cho một số chương trình cấp thấp. Nếu không, hiệu suất tương tự như phần phụ trợ GCC cũ.

+0

. câu trả lời chính xác; đó chỉ là điểm mù-hoàn tác mà tôi đang tìm kiếm! . llvm'ers có một phản ứng tương tự với việc thiếu sự hỗ trợ đồng thời: nó là một thư viện tiện ích. . c-- có thể được chuyển đến llvm, có nghĩa là gv llvm sẽ không được sử dụng. –

+1

liên kết này không còn hoạt động nữa :(, tình hình có thay đổi chút nào kể từ lần cập nhật cuối cùng không? –

25

Đã từng làm việc một chút với chương trình phụ trợ tạo mã mới, thao tác C--, tôi có thể nói có một số lý do tại sao C-- có thể tốt hơn LLVM và cũng lý do tại sao chúng không thực sự ở tất cả điều tương tự.

  1. C-- hoạt động ở mức trừu tượng cao hơn LLVM; ví dụ, chúng ta có thể tạo mã trong C-- nơi con trỏ ngăn xếp hoàn toàn ẩn, và chỉ biểu hiện nó sau này trong quá trình biên dịch. Điều này làm cho việc áp dụng một số loại tối ưu hóa dễ dàng hơn nhiều, bởi vì biểu diễn mức cao hơn cho phép nhiều chuyển động mã hơn với ít biến đổi hơn.

  2. Trong khi chúng tôi đang tích cực tìm cách khắc phục sự cố này, LLVM gặp phải vấn đề tương tự mà chương trình phụ trợ qua C: phải yêu cầu chúng tôi tạo các điểm thu thập . Điểm proc là gì? Về cơ bản, vì Haskell không sử dụng quy ước gọi/gọi lại cổ điển, bất cứ khi nào chúng ta thực hiện tương đương đạo đức của một cuộc gọi subprocedure, chúng ta cần phải đẩy một tiếp tục vào ngăn xếp và sau đó nhảy đến subprocedure. Sự tiếp tục này thường là một nhãn cục bộ, nhưng LLVM yêu cầu nó phải là một thủ tục thực tế, vì vậy chúng ta cần phá vỡ các hàm thành các phần nhỏ hơn (mỗi phần được gọi là điểm proc). Đây là tin xấu cho việc tối ưu hóa, hoạt động trên cấp độ thủ tục.

  3. C-- và LLVM có cách tiếp cận khác để tối ưu hóa dữ liệu.LLVM sử dụng kiểu SSA truyền thống với các nút phi-nút: C-- sử dụng một khung làm mát được gọi là Hoopl mà không yêu cầu bạn duy trì bất biến SSA. Tôi có thể xác nhận: tối ưu hóa lập trình trong Hoopl rất thú vị, mặc dù một số kiểu tối ưu hóa nhất định (nội tuyến của các biến được sử dụng một lần) không chính xác nhất trong cài đặt dataflow này.

+0

Khi bạn nói C--, bạn đang đề cập đến C-- triển khai chính hay biến thể Cmm của GHC. – refi64

2

Một vấn đề trong thực tế là LLVM đã có nhiều mục tiêu di chuyển hơn.

GHC gặp sự cố khi cố gắng hỗ trợ nhiều phiên bản LLVM. Có một hoạt động discussion trên danh sách gửi thư ghc-dev về điều này.

Btw, hiện tại phụ trợ llvm trong ghc là sau khi Haskell được dịch sang ngôn ngữ cmm (mà tôi tin chủ yếu là C-- mở rộng bằng một số thanh ghi nhất định từ ngôn ngữ STG) và do điều kiện trên khó khăn -address, có tối ưu hóa dư thừa đang được thực hiện mà làm chậm quá trình biên dịch.

Ngoài ra, trong lịch sử và hiện tại AFAIK, dự án LLVM không ưu tiên cung cấp nền tảng di động và một số nhà phát triển đã nêu rõ rằng nó là is a compiler IR and not a form of portable assembly language.

LLVM IR bạn viết cho một mục tiêu có ý định có thể không hề hữu ích cho một mục tiêu dự định khác. Để so sánh, trang web C-- thực sự đề cập đến nó như là lắp ráp di động. "Bạn sẽ hạnh phúc hơn nhiều với một ngôn ngữ lắp ráp di động có thể là ..." là một báo giá từ their website. Trang web đó cũng đề cập đến một giao diện thời gian chạy để dễ dàng thực hiện thực hiện của việc thu gom rác thải và xử lý ngoại lệ.

Vì vậy, bạn có thể nghĩ về C-- là nền tảng chung cho tất cả các giao diện người dùng có nhiều điểm chung hơn với mã byte CIL và Java và LLVM IR làm nền tảng chung cho tất cả các chương trình phụ trợ của bạn tạo điều kiện cho việc tối ưu hóa các mức tối ưu hóa cấp thấp phổ biến cho nhiều mục tiêu. LLVM IR cũng cung cấp phần thưởng thêm rằng dự án LLVM sẽ thực hiện rất nhiều tối ưu hóa mức thấp đó. Điều đó đang được nói, trong một số cách LLVM IR thực sự có thể được coi là cấp cao hơn C--, ví dụ LLVM IR có các loại khác nhau, như trong C-- tất cả mọi thứ chỉ là bit vectơ.

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