2017-09-01 14 views
20

Przeczytałem świetny wpis na blogu Dana Piponiego pod numerem The Three Projections of Doctor Futamura. Pod koniec artykułu znajduje się dodatek z dowodem projekcji Futamury w Haskell. Jednak uważam, że jego artykuł nie zawiera informacji o językach, których dotyczy. Jakie muszą być języki źródłowe, docelowe i obiektowe specjalisty, aby prognozy Futamury działały? Na przykład, czy prognozy Futamury zadziałają, jeśli napiszę Haskella do specjalisty LLVM w Haskell? Byłoby pomocne, gdybyś napisał program Haskell, aby to udowodnić, tak jak zrobił to w swoim artykule Dan Piponi.Projekcje dowodów Futamury w Haskell

Odpowiedz

15

Tak, prognozy Futamury zadziałają wtedy i tylko wtedy, gdy języki źródłowe i obiektowe specjalisty będą takie same. Wynika to z faktu, że specjalisty można zastosować tylko do niego samego, jeśli jest napisany w tym samym języku, w którym może czytać. Jednak język docelowy specjalisty jest niezależny od dwóch pozostałych. Ma to ważne konsekwencje, które omówię później w tej odpowiedzi.

Aby udowodnić moją hipotezę, wprowadzę nową notację opisującą programy luźno oparte na tombstone diagrams. Schemat nagrobka (lub T-diagram) jest obrazowym przedstawieniem kompilatorów i innych związanych z nimi metaprograms. Służą one do zilustrowania i uzasadnienia transformacji programu z języka źródłowego (z lewej strony T) ​​na język docelowy (prawo T) jako zaimplementowany w języku obiektowym (dół T). Załóżmy rozszerzyć ideę T diagramów do pracy dla wszystkich programów:

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

W przypadku metaprograms α i β same są programy:

(α → β :) × α → β : -- 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 . 

Ten zapis może być bezpośrednio przekształcony w definicji typu w Haskell. Uzbrojeni w to, możemy teraz napisać dowód występów Futamura w Haskell w odniesieniu do języków:

{-# 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) 

Używamy przedłużenie RankNTypes język ukryć maszyn typu poziomu, co pozwala nam skoncentrować się na językach zaangażowanych . Konieczne jest również zastosowanie do siebie specjalisty.

W powyższym programie druga projekcja ma szczególne znaczenie. Mówi nam, że biorąc pod uwagę self-hosting Haskella do specjalisty LLVM, możemy zastosować go do dowolnego interpretera napisanego w Haskell dla jakiegoś języka źródłowego, aby dostać się do kompilatora LLVM. Oznacza to, że możemy napisać interpreter w języku wysokiego poziomu i użyć go do wygenerowania kompilatora, którego celem jest język niskiego poziomu. Jeśli specjalista jest dobry, wygenerowany kompilator byłby przyzwoicie dobry.

Innym wartym odnotowania szczegółem jest to, że self-hosting specjalista jest bardzo podobny do self-hosting kompilator. Jeśli twój kompilator wykonuje już częściową ocenę, to nie powinno to być zbyt wielkim wysiłkiem, aby przekształcić go w specjalistę. Oznacza to, że wdrożenie projekcji Futamura jest o wiele łatwiejsze i dużo bardziej satysfakcjonujące niż pierwotnie sądzono. Jeszcze tego nie przetestowałem, więc weź to z przymrużeniem oka.