2012-01-19 36 views
5

Tôi muốn tạo lối vào cho một ngôn ngữ đơn giản có thể sản xuất GHC Core. Tôi muốn sau đó lấy đầu ra này và chạy nó thông qua đường ống GHC bình thường. Theo this page, nó không thể trực tiếp có thể từ lệnh ghc. Tôi tự hỏi nếu có bất kỳ cách nào để thực hiện điều đó.Biên dịch sang GHC Core

Tôi lý tưởng mong đợi một vài cuộc gọi hàm tới ghc-api nhưng tôi cũng mở cho bất kỳ đề xuất nào bao gồm hack (không quá rộng) trong nguồn của GHC. Bất kỳ con trỏ nào cũng sẽ hữu ích!

+0

"Hiện tại (kể từ phiên bản 6.8.2), GHC không có khả năng đọc trong các tệp External Core dưới dạng nguồn". Bạn sẽ phải sản xuất một đại diện trong lõi _internal_ và chuyển nó cho GHC, tôi sợ. Vì lợi ích của bạn, tôi hy vọng tôi quá bi quan, nhưng tôi tin rằng bạn cần nhiều hơn một vài cuộc gọi đến ghc-api. –

Trả lời

5

Vẫn không có cách nào để đọc tệp lõi bên ngoài, cho dù thông qua lệnh ghc hoặc API. Xin lỗi: (

Có lẽ về mặt lý thuyết có thể xây dựng cây cú pháp cốt lõi từ đại diện của bạn bằng API GHC, nhưng điều đó nghe có vẻ rất đau đớn Tôi khuyên bạn nên nhắm mục tiêu một số chương trình phụ trợ khác.Bạn không nhất thiết phải ngừng sử dụng GHC Haskell đơn giản với các loại unboxed và unsafeCoerce cho phép bạn nhận được khá gần với kết quả Core, vì vậy bạn có thể xác định ngôn ngữ đơn giản của riêng bạn "Core-ish" và biên dịch nó thành ngôn ngữ đó (Thật vậy, thậm chí bạn có thể biên dịch GHC Core chính nó , nhưng đó là một chút quá siêu cho sở thích của tôi.)

+1

Bạn cũng có thể có sự may mắn hơn để biên dịch cho Haskell-that-is-basic-already-Core. –

9

Lưu ý rằng Core là ngôn ngữ được nhập rõ ràng, có thể gây khó khăn cho việc tạo từ các ngôn ngữ khác (trình kiểm tra loại GHC có i đặt tất cả các loại để nó không có vấn đề ở đó). Ví dụ, chức năng nhận diện thông thường (id = \x -> x :: forall a. a -> a) trở thành

id = \(a :: *) (x :: a) -> a 

nơi a là một biến kiểu loại *. Nó là một trình giữ chỗ ở mức độ hạn cho ràng buộc loại forall. Tương tự, khi gọi số id, bạn cần đặt loại đó làm đối số đầu tiên, do đó biểu thức Haskell (id 42) được dịch thành (id Int 42). Các ràng buộc kiểu và kiểu ứng dụng như vậy sẽ không có mặt trong mã máy được sinh ra, nhưng chúng hữu ích để xác minh các phép biến đổi trình biên dịch là chính xác. Trên mặt tươi sáng, có thể chỉ cần tạo ra Haskell - nếu bạn có thể tạo mã theo cách sao cho GHC sẽ luôn có thể xác định loại của nó thì về cơ bản bạn chỉ sử dụng một tập con nhỏ của Haskell. . Cho dù điều này có thể làm việc phụ thuộc rất nhiều vào ngôn ngữ nguồn của bạn, mặc dù.

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