2017-09-01 53 views
20

Tôi đọc bài đăng trên blog tuyệt vời của Dan Piponi trên The Three Projections of Doctor Futamura. Đến cuối bài viết, ông có một phụ lục với một bằng chứng về các dự báo Futamura trong Haskell. Tuy nhiên, tôi thấy bài viết của anh ấy thiếu thông tin về các ngôn ngữ liên quan. Ngôn ngữ nguồn, đích và đối tượng của trình chuyên môn phải là gì để các dự báo của Futamura hoạt động? Ví dụ, các dự báo Futamura có hoạt động nếu tôi đã viết một trình Haskell cho LLVM trong Haskell? Sẽ rất hữu ích nếu bạn viết một chương trình Haskell để chứng minh điều này giống như Dan Piponi đã làm trong bài viết của mình.Bằng chứng về các dự báo Futamura trong Haskell

Trả lời

15

Có, dự đoán Futamura sẽ hoạt động nếu và chỉ khi ngôn ngữ nguồn và đối tượng của trình chuyên môn là giống nhau. Điều này là do trình đặc biệt chỉ có thể được áp dụng cho chính nó nếu nó được viết bằng cùng một ngôn ngữ mà nó có thể đọc được. Tuy nhiên, ngôn ngữ đích của trình chuyên biệt là độc lập với hai bộ kia. Điều này có những hậu quả quan trọng mà tôi sẽ thảo luận sau trong câu trả lời này.

Để chứng minh giả thuyết của mình, tôi sẽ giới thiệu một ký hiệu mới để mô tả các chương trình dựa theo số tombstone diagrams. Một sơ đồ bia mộ (hoặc sơ đồ T) là một biểu diễn bằng hình ảnh của các trình biên dịch và các liên quan khác metaprograms. Chúng được sử dụng để minh họa và lý do về việc chuyển đổi một chương trình từ một ngôn ngữ nguồn (trái của T) sang một ngôn ngữ đích (bên phải của T) như được thực hiện trong một ngôn ngữ đối tượng (dưới cùng của T). Chúng ta hãy mở rộng ý tưởng của T-sơ đồ làm việc cho tất cả các chương trình:

α → β : ℒ -- A program is a function from α to β as implemented in language ℒ. 

Trong trường hợp của metaprograms αβ là bản thân chương trình:

(α → β :) × α → β : -- An interpreter for language as implemented in . 
(α → β :) → (α → β :) : -- A compiler from to as implemented in . 
(ι × α → β :) × ι → (α → β :) : -- A self-hosting specializer from to . 
(ι × α → β :) → (ι → (α → β :) :) : -- A compiler compiler from to . 

Ký hiệu này có thể được chuyển đổi trực tiếp vào định nghĩa kiểu trong Haskell. Được trang bị với điều này, bây giờ chúng tôi có thể viết một bằng chứng về những dự Futamura trong Haskell liên quan đến ngôn ngữ:

{-# LANGUAGE RankNTypes #-} 

module Futamura where 

newtype Program a b language = Program { runProgram :: a -> b } 

type Interpreter source object = forall a b.  Program (Program a b source, a) b object 
type Compiler source target = forall a b.  Program (Program a b source) (Program a b target) target 
type Specializer source target = forall input a b. Program (Program (input, a) b source, input) (Program a b target) source 
type Partializer source target = forall input a b. Program (Program (input, a) b source) (Program input (Program a b target) target) target 

projection1 :: Specializer object target -> Interpreter source object -> Program a b source -> Program a b target 
projection1 specializer interpreter program = runProgram specializer (interpreter, program) 

projection2 :: Specializer object target -> Interpreter source object -> Compiler source target 
projection2 specializer interpreter = runProgram specializer (specializer, interpreter) 

projection3 :: Specializer source target -> Partializer source target 
projection3 specializer = runProgram specializer (specializer, specializer) 

Chúng tôi sử dụng phần mở rộng RankNTypes ngôn ngữ để ẩn các máy móc loại cấp, cho phép chúng tôi tập trung vào các ngôn ngữ có liên quan . Nó cũng cần thiết cho việc áp dụng một bộ đặc biệt cho chính nó.

Trong chương trình trên, phép chiếu thứ hai được quan tâm đặc biệt. Nó cho chúng ta biết rằng với một Haskell tự lưu trữ cho LLVM specializer, chúng ta có thể áp dụng nó cho bất kỳ trình thông dịch nào được viết bằng Haskell cho một số ngôn ngữ nguồn để có được một trình biên dịch LLVM. Điều này có nghĩa là chúng ta có thể viết một thông dịch viên bằng một ngôn ngữ cấp cao và sử dụng nó để tạo ra một trình biên dịch nhắm vào một ngôn ngữ cấp thấp. Nếu specializer là bất kỳ tốt thì trình biên dịch tạo ra cũng sẽ được decently tốt.

Một chi tiết đáng chú ý khác là trình chuyên biệt tự lưu trữ rất giống với trình biên dịch tự lưu trữ. Nếu trình biên dịch của bạn đã thực hiện đánh giá từng phần thì nó không nên quá nhiều công việc để biến nó thành một trình đặc biệt. Điều này có nghĩa là việc triển khai các dự án Futamura dễ dàng hơn nhiều và có nhiều phần thưởng đáng giá hơn ban đầu được cho là. Tôi chưa thử nghiệm này vì vậy hãy dùng nó với một hạt muối.

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