Size: a a a

Compiler Development

2020 May 05

SS

Sergey Sverdlov in Compiler Development
Языки программирования и методы трансляции. Лекция 7

Генерация кода для процедур. Компиляция простейших программ уже работает! Нас выручает HALT. Генерация кода для WHILE - это просто и IF - совсем не просто. Проблема переходов вперед. Схема трансляции IF. Адресная привязка - шикарная функция fixup. Распределение памяти для переменных. Очень красивая схема адресной привязки. Программа Primes откомпилирована полностью! Финальное украшение: наш интеллектуальный компилятор умеет определить неиспользуемые переменные и выдать предупреждение. И всё! We did It! Мы сделали это! Компилятор языка "О" готов. Точнее, это компилятор и интерпретатор (виртуальная машина) в одном флаконе.

https://www.youtube.com/watch?v=tEpim8mqlJA&feature=youtu.be
источник

SS

Sergey Sverdlov in Compiler Development
Компилятор языка "О"
источник

SS

Sergey Sverdlov in Compiler Development
Вопросы к лекции по ЯПМТ
Протестируйте программу. Удачный тест тот, который обнаруживает ошибку. Каждая обнаруженная ошибка - плюс. Оценивается только первое сообщение об одной и той же ошибке.
источник

AT

Alexander Tchitchigi... in Compiler Development
polunin.ai
есть что-то почитать по поводу вывода типов? не представляю вообще как такое проворачивать.
У Душкина есть перевод статьи про вывод по Хиндли-Милнеру. Если коротко, то выписываем систему уравнений и решаем её.
источник

AG

Alex Gryzlov in Compiler Development
polunin.ai
есть что-то почитать по поводу вывода типов? не представляю вообще как такое проворачивать.
проще всего bidirectional, но он меньше ХМ выводит
источник

PS

Peter Sovietov in Compiler Development
Пройтись по AST, сгенерировать программу на Прологе, запустить :)
источник

AG

Alex Gryzlov in Compiler Development
источник

p

polunin.ai in Compiler Development
Alexander Tchitchigin
У Душкина есть перевод статьи про вывод по Хиндли-Милнеру. Если коротко, то выписываем систему уравнений и решаем её.
звучит логично и сложно, посмотрю
источник

p

polunin.ai in Compiler Development
спасибо, тоже посмотрю
источник

DP

Dmitry Ponyatov in Compiler Development
Vlad
Программисту имеющему опыт за рамками паскального семейства средств разработки (ну Дельфи, короче)  практически нечем соблазниться. Не ищите там рационального зерна, это религия. Или как хобби (у меня, например :) Основные "жертвы" оберона - это школьники или люди из других профессий (не профессионалы в программировании), которые наслушались про "16 страниц, супер язык". Есть, как всегда, единичные исключения осмысленного применения на практике, но надо искать...
пасхального семейства, Оберон воскрес
источник

DP

Dmitry Ponyatov in Compiler Development
Peter Sovietov
В целом для таких задач хватает просто DSL со строгой типизацией и строгими правилами для программиста в духе запрета на неинициализированные переменные. А от переполнения стека я вообще радикальным образом избавился — стека нет. Ну, рекурсии тоже нет — но кто ее в своем уме на МК использует? %)
командные парсеры
источник

МБ

Михаил Бахтерев... in Compiler Development
Peter Sovietov
В обобщениях ничего плохого нет. Поиски разных вариантов перворода в свое время привели к побочным полезным результатам. Главное -- не ударяться в догматизм.

Давайте поставим конкретную задачу. Допустим, мы хотим научить новичка функциональному подходу к реализации модели процессора. Какие здесь базовые математические концепции имеет смысл использовать? Да все те же, известные из университетского курса конечные автоматы, системы переходов... которые представляются моноидом, тоже известным из курса абстрактной алгебры (категорная интерпретация нам не потребуется).

Далее, для реализации какого-нибудь RISC-V можно ввести init (начальное состояние) и next (переход из состояния в состояние). Для практической реализации остается только рассказать про хвостовую рекурсию и CPS.
Ну... Для новичка это может быть и самый верный подход. Но всё же имеет смысл продвинуться дальше. В ТК есть полезные вещи, которые позволяют просто доказывать нетривиальные результаты. Параметричность, например
источник

DP

Dmitry Ponyatov in Compiler Development
Михаил Бахтерев
С чего это? Объекты - это замыкания. Вы можете, конечно, описаывать объекты, рисуя картинки, и размахивая руками, но когда потребуется дать строгую семантику, вам придётся описывать это всё функциями. Других способов люди пока не придумали. Да и не факт, что другие способы вообще существуют.
пи-исчисление тоже к функциям сводится?
источник

МБ

Михаил Бахтерев... in Compiler Development
Dmitry Ponyatov
пи-исчисление тоже к функциям сводится?
К математическим - да.
источник

PS

Peter Sovietov in Compiler Development
Михаил Бахтерев
Ну... Для новичка это может быть и самый верный подход. Но всё же имеет смысл продвинуться дальше. В ТК есть полезные вещи, которые позволяют просто доказывать нетривиальные результаты. Параметричность, например
Ну, это отвлеченно. Настолько отвлеченно, что, кажется, далеко от нужд обычных системных программистов и компиляторщиков.

А если говорить конкретнее? Я, например, легко себе представляю, что можно интересного показать и доказать, используя моноид переходов.

В частности, можно задать функции переходов для каждой отдельной команды процессора и далее показать, как композиция этих функций отражает выполнение модели процессора по конкретной программе. Причем результат композиции вполне можно анализировать и преобразовывать в алгебраическом виде. Здесь же можно и показать, как из интерпретатора можно образовать скомпилированную симуляцию.
источник

МБ

Михаил Бахтерев... in Compiler Development
Peter Sovietov
Ну, это отвлеченно. Настолько отвлеченно, что, кажется, далеко от нужд обычных системных программистов и компиляторщиков.

А если говорить конкретнее? Я, например, легко себе представляю, что можно интересного показать и доказать, используя моноид переходов.

В частности, можно задать функции переходов для каждой отдельной команды процессора и далее показать, как композиция этих функций отражает выполнение модели процессора по конкретной программе. Причем результат композиции вполне можно анализировать и преобразовывать в алгебраическом виде. Здесь же можно и показать, как из интерпретатора можно образовать скомпилированную симуляцию.
Почему отвлечённо. Тот же final tagless вполне естественно выводится из категорного описания алгебр. Ну... Конечно, и другими способами к этой идее прийти можно, но на языке ТК она почти очевидна.
источник

KR

K R in Compiler Development
Ну ув. Михаил, вся математика - это набор языков для описания реальности. Причём эти языки могут быть совершенно эквивалетны. Например, классическая механика может быть описана как законами Ньютона, так и принципом наименьшего действия. И перейти можно как в одну сторону, так и в другую. Более того, нет никакой возможности понять "а что же на самом деле".

Так и тут с монадами.
источник

МБ

Михаил Бахтерев... in Compiler Development
K R
Ну ув. Михаил, вся математика - это набор языков для описания реальности. Причём эти языки могут быть совершенно эквивалетны. Например, классическая механика может быть описана как законами Ньютона, так и принципом наименьшего действия. И перейти можно как в одну сторону, так и в другую. Более того, нет никакой возможности понять "а что же на самом деле".

Так и тут с монадами.
Принцип наименьшего действия - это более общая идея, чем механика Ньютона. Такие обобщения полезны. Собственно, весь смысл науки - поиск общих закономерностей. Впрочем, я не настаиваю. Все подходы хороши, если работают
источник

KR

K R in Compiler Development
Шутка заключается в том, что мы используем сразу спектр моделей, а не одну. Так и тут - разумно, как Олег предлагает, не зацикливаться на монадах, а открывать спектр.
источник

AG

Alex Gryzlov in Compiler Development
правильно, надо переходить к профункторам и сопряжениям :)
источник