Экспертные заключения: 0
Консультации: 0

Компилятор на основе запросов для функционального языка программирования MLK

Аннотация:


Компиляторы больше не являются просто «чёрными ящиками» (black boxes), которые берут кучу исходных файлов и создают ассемблерный код. Сегодня мы ожидаем, что они будут:


— Инкрементальными, что означает, что если мы перекомпилируем проект после внесения нескольких изменений, мы перекомпилируем только то, что было этими изменениями затронуто.

— Предоставляющими инструменты для редактора, например, через языковой сервер, поддерживая такую функциональность как переход к определению, определение типа выражения в определённом месте, отображение сообщения об ошибках на лету и т. д.


Традиционный подход по созданию компиляторов на основе единого конвейера (pipeline) применения трансформаций на исходный код программы создаёт трудности по внедрению описанного выше ожидаемого пользователем компилятора поведения. Одним из решений проблемы по дублированию ответственности между компилятором и языковым сервером является подход по созданию компилятора на основе запросов [1–2]. Под этим подразумевается создание системы инкрементальных вычислений, которые будут вычисляться заново только в случае внесения изменений в зависимые подвычисления, где каждое действие трансформации исходного кода (парсинг, вычисление типа, кодогенерация) представляет собой отдельную вычислительную задачу. 


С помощью библиотек, используемых языковым сервером для Rust rust-analyzer [3] (rowan [4] для создания конкретных синтаксических деревьев и salsa [5] для инкрементальных вычислений), будет создана фронтэнд-часть компилятора, ответственная за преобразование исходного кода в промежуточные представления, за вывод и проверку типов. За стадию кодогенерации рассматриваются такие бэкэнды как Cranelift [6] и LLVM (посредством библиотеки Inkwell [7]). Создание собственного бэкэнда кодогенерации выходит за рамки данного проекта, однако использование нескольких бэкэндов кодогенерации будет предусмотрено заранее, что оставляет возможность в будущем написать свой собственный бэкэнд.


Основное взаимодействие с компилятором предполагается производить через веб-приложение, использующее Monaco Editor [8], редактор исходного кода с возможным подключением к языковому серверу через Language Server Protocol (LSP), который будет предоставлять всю функциональность по отображению промежуточных представлений и их преобразований, работы алгоритма вывода типов.


Цели данного проекта во многом схожи с целями проекта "The CakeML Compiler Explorer" [9]: повышение грамотности разработчиков о работе компилятора, помощь разработчикам компилятора в отладке его работы для поиска новых оптимизаций и устранения недочётов в его работе.


Выбор языка Rust для разработки компилятора fsicc обусловлен повышенным вниманием компилятора rustc к статическому анализу и безопасности кода, в первую очередь безопасности работы с памятью без использования сборщика мусора, что может обеспечивать в среднем более высокую производительность по сравнению со схожими программами на других языках программирования. Также компилятор rustc позволяет компилировать программы в код на WebAssembly (WASM), позволяющий запускать программы напрямую в браузере.


Создание компилятора fsicc как компилятора функционального языка программирования Fsic обусловлено возможностью затронуть более продвинутые темы теории языков программирования: статическая типизация, вывод типов, каррирование, сопоставление по шаблону. Не входят в рамки проекта, но рассматриваются функциональных эффекты, монады и зависимые типы.

Список источников:


1. Fredriksson O. Query-based compiler architectures [Electronic resource] // Olle Fredriksson’s blog. 2020. URL: https://ollef.github.io/blog/posts/query-based-compilers.html (accessed: 22.11.2024).


2. Juarez S., Hejlsberg A. Anders Hejlsberg on Modern Compiler Construction.


3. Kladov A., Wirth L. rust-analyzer: Rust.


4. Kladov A., Wirth L. rowan: Rust.


5. Matsakis N., Kladov A. salsa: Rust.


6. Crichton A. et al. Cranelift: Rust. Bytecode Alliance.


7. Kolsoi D. Inkwell: Rust.


8. Dima A., Dieterichs H. Monaco Editor: TypeScript/JavaScript. Microsoft.


9. Hjort R., Holmgren J., Persson C. The CakeML Compiler Explorer // Trends in Functional Programming / ed. Wang M., Owens S. Cham: Springer International Publishing, 2018. P. 135–148.

Ссылка

На страницу проекта

Направление

IT

Рынки

TechNet

Сквозные технологии

Технологии хранения и анализа больших данных