Nauczyłem się czegoś o implementowaniu typów zależnych, takich jak ten samouczek , ale większość z nich to implementacja tłumaczy. Moje pytanie brzmi: wydaje się, że implementacja kompilatora dla typu zależnego jest znacznie trudniejsza niż kompilator, ponieważ naprawdę można ocenić argumenty typu zależnego dla sprawdzania typu.
Więc
- Czy moje naiwne wrażenie jest właściwe?
- Jeśli ma rację, jakikolwiek przykład / zasoby dotyczące implementacji sprawdzanego statycznie języka obsługującego typ zależny?
type-systems
compilers
dependent-type
molikto
źródło
źródło
ocamlopt
lub GHC :-) (Odpowiedzi:
To interesujące pytanie! Jak sugeruje odpowiedź Anthony'ego, można użyć zwykłych podejść do kompilacji niezależnego języka funkcjonalnego, pod warunkiem , że masz już tłumacza do oceny warunków do sprawdzania typu .
Takie podejście zastosował Edwin Brady. Teraz jest to koncepcyjnie prostsze, ale traci kontrolę nad szybkością kompilacji podczas sprawdzania typu. Zostało to rozwiązane na kilka sposobów.
Po pierwsze, można zaimplementować maszynę wirtualną, która w locie kompiluje warunki do kodu bajtowego w celu wykonania sprawdzenia konwersji. Taki jest pomysł
vm_compute
zaimplementowany w Coq przez Benjamina Gregoire'a . Podobno jest też to teza Dirk Kleeblatt na dokładnie ten temat, ale w dół rzeczywistego kodu maszynowego, a nie na maszynie wirtualnej.Po drugie, można wygenerować kod w bardziej konwencjonalnym języku, który po uruchomieniu sprawdza wszystkie konwersje niezbędne do sprawdzania typu programu zależnie wpisanego. Oznacza to, że możemy użyć Haskell, powiedzmy, do sprawdzenia typu modułu Agda. Kod można skompilować i uruchomić, a jeśli się zgadza, można założyć, że kod w języku typu zależnego jest dobrze wpisany (błędy implementacji i błędów kompilatora). Po raz pierwszy usłyszałem takie podejście sugerowane przez Mathieu Boesfluga .
źródło
Praca doktorska Edwina Brady'ego opisuje, jak zbudować kompilator dla języka programowania o typie zależnym. Nie jestem ekspertem, ale powiedziałbym, że nie jest to trudniejsze niż implementacja kompilatora podobnego do Systemu F. Wiele zasad jest dość podobnych, a niektóre są takie same (np. Kompilacja superkombinatora). Teza obejmuje wiele innych problemów.
źródło