5

Trong đường ống của GHC có một giai đoạn dịch mã nguồn Haskell sang Core và sau đó (không nhất thiết phải là bước tiếp theo ngay lập tức) dịch Core thành STG. Tuy nhiên, một vấn đề đã thoát khỏi sự hiểu biết của tôi - khi nào chúng tôi có một mã "bình thường" (tức là văn bản thuần túy) và khi một thứ thực sự sống trong bộ nhớ, như cây cú pháp trừu tượng (AST)?Đường ống GHC: Lõi, STG - AST hoặc văn bản?

Và để làm câu hỏi của tôi một chút chính xác hơn, tôi sẽ chia thành các phần:

1) trong phân tích của giai đoạn tập tin nguồn Haskell, chúng ta ngay lập tức xây dựng ASTs của ngôn ngữ cốt lõi? Nếu không, thì có vẻ như tôi phải xây dựng AST của Haskell đầy đủ (có vẻ lạ) và sau đó chuyển đổi chúng sang ASTs của Core, hoặc trước hết là biểu diễn văn bản của chúng trong Core và một lần nữa gọi phân tích cú pháp để lấy AST của Core.

2) gần như cùng một câu hỏi áp dụng cho Core để chuyển STG (nhưng trong trường hợp này tôi nghĩ tôi có thể cho rằng những gì chúng ta có là ASTs Core - đúng)

Trả lời

13

Nguồn Haskell là lần đầu tiên phân tích thành một AST của Haskell đầy đủ, sau đó được đánh máy.

Từ đó trở đi, nó được giải phóng tới Core, được dịch sang STG, từ đó sang Cmm thành mã lắp ráp hoặc LLVM. Tất cả các giai đoạn này được xây dựng trên AST, không có sự biểu diễn văn bản của bất kỳ giai đoạn nào cho đến khi mã assembly/llvm, sau đó được ghi vào một tệp và được biên dịch bằng các công cụ bên ngoài.

Nó không phải là strage để có một AST đầy đủ Haskell. Trong thực tế, nó là một yêu cầu để cung cấp cho các loại lỗi trong điều khoản của mã người sử dụng đã viết, thay vì phát hiện lỗi loại chỉ ở cấp độ cốt lõi.

Bạn có thể tìm AST cho Haskell trong các mô-đun từ HsSym và AST của Core trong CoreSyn.

+3

Bây giờ rõ ràng - cảm ơn bạn! Oh, và các liên kết dường như bị hỏng ... – socumbersome

+0

Hãy xem [ở đây] (https://github.com/ghc/ghc/tree/ghc-7.8/compiler/hsSyn), đặc biệt [ở đây] (https: //github.com/ghc/ghc/blob/ghc-7.8/compiler/hsSyn/HsExpr.lhs), sau đó [tại đây] (https://github.com/ghc/ghc/blob/ghc-7.8/compiler/ coreSyn/CoreSyn.lhs) và [ở đây] (https://github.com/ghc/ghc/blob/ghc-7.8/compiler/stgSyn/StgSyn.lhs). –

+0

Sửa các liên kết. Đó là những gì tôi nhận được khi cố gắng tạo ra các liên kết 'https: // www.haskell.org/ghc /' rõ ràng thay vì các liên kết 'https: // downloads.haskell.org/~ ghc /' lạ. –

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