Size: a a a

Compiler Development

2019 December 31

YS

Yuriy Syrovetskiy in Compiler Development
я в браузере и другими фичами пользуюсь. например, переключаюсь между вкладками
источник

VY

Vasiliy Yorkin in Compiler Development
Всем привет! Пытаюсь сделать Part. b главы 5 (семантический анализ) из Modern Compiler Implementation in ML by A. Appel, а именно проверку корректности "вложений" break'ов (проверку взаимно-рекурсивных ф-ций сделал). Хочу посоветоваться как лучше это реализовать. На ум сходу приходят 2 способа:
1) Таскать с собой путь (стек) до корня АСТ и тогда в соотв. ф-циях, которые проверяют определённый тип узла (можно не во всех). Тогда у нас будет достаточно информации, чтобы выполнить такую проверку (посмотреть что встретится раньше — узел цикла или ф-ции).
2) Параметризовать ф-ции, проверяющие соотв. тип узла белым или чёрным списком разрешённых или запрещённых типов узлов, тогда это ещё проще проверить. Тут я пока не продумал до конца
3) ?

https://github.com/vyorkin/tiger/blob/2e777cdea4ea69f9158525b097499cb34ed8f97f/chapter5/lib/semant.ml#L37

Пробую пока сделать 1)

P.S. Никогда не писал ничего подобного, поэтому то, что я делаю может выглядеть очень странно
источник

VY

Vasiliy Yorkin in Compiler Development
источник

I

Ilmir in Compiler Development
Peter Sovietov
А где-то есть... Как будто есть какая-то эталонная архитектура, на которую нужно равняться.
Да. Это идеализированная виртуальная архитектура, описанная в стандарте. На нее должны все равняться.
источник

I

Ilmir in Compiler Development
Andrei Kurosh
Это намек на то, что «вся квантовая химия» занимает ничтожный процент от общего числа программистов
Я бы с радостью с вами поспорил о том, на кого равняться при разработке языков. И почему нельзя равняться на "young, fresh out of school. They probably learned C or Java, probably Python. They are not able to understand genius language, but we want them to be productive". Пинганите меня в @pofftop. Этот спор не для компиляторного чата.
источник

PS

Peter Sovietov in Compiler Development
Ilmir
Да. Это идеализированная виртуальная архитектура, описанная в стандарте. На нее должны все равняться.
В моей фразе подразумевался этап проектирования ЯП, а не его использования.

А по поводу архитектуры в стандарте —- она должна бы быть формально описана в разделе "динамическая семантика". Но много ли Вы встречали стандартов с подобным разделом? :)
источник

PS

Peter Sovietov in Compiler Development
Vasiliy Yorkin
Всем привет! Пытаюсь сделать Part. b главы 5 (семантический анализ) из Modern Compiler Implementation in ML by A. Appel, а именно проверку корректности "вложений" break'ов (проверку взаимно-рекурсивных ф-ций сделал). Хочу посоветоваться как лучше это реализовать. На ум сходу приходят 2 способа:
1) Таскать с собой путь (стек) до корня АСТ и тогда в соотв. ф-циях, которые проверяют определённый тип узла (можно не во всех). Тогда у нас будет достаточно информации, чтобы выполнить такую проверку (посмотреть что встретится раньше — узел цикла или ф-ции).
2) Параметризовать ф-ции, проверяющие соотв. тип узла белым или чёрным списком разрешённых или запрещённых типов узлов, тогда это ещё проще проверить. Тут я пока не продумал до конца
3) ?

https://github.com/vyorkin/tiger/blob/2e777cdea4ea69f9158525b097499cb34ed8f97f/chapter5/lib/semant.ml#L37

Пробую пока сделать 1)

P.S. Никогда не писал ничего подобного, поэтому то, что я делаю может выглядеть очень странно
В моих языках на raddsl схема проста — есть неявный и неизменяемый контекст — набор атрибутов:

while_stmt = with_context(rule(
   While(let(E=expr), let(B=block)), ...
in_loop=1))

break_stmt = seq(Break(), has_attr("in_loop"))
источник

VY

Vasiliy Yorkin in Compiler Development
Интересно, спасибо, не знал про raddsl
источник

PS

Peter Sovietov in Compiler Development
Vasiliy Yorkin
Интересно, спасибо, не знал про raddsl
Тут главное — использовать вложенность функций самого семантического анализа для проверки правильной вложенности анализируемых конструкций. Можно обойтись без состояния, если внутри блока while вызывать специальную версию функции для анализа блока — которая будет учитывать наличие break. А для произвольного блока, соответственно, наличие break в последовательности предложений будет означать ошибку.
источник

VY

Vasiliy Yorkin in Compiler Development
Понял, да, я так себе и представляю реализацию. Пойду пробовать. Нужно больше тестов добавить
источник

VY

Vasiliy Yorkin in Compiler Development
Как вы тестируете части своих компиляторов? Так же, как и что-то другое? Модульные\проперти тесты пишете? Мне кажется, что это должны быть очень надёжные тесты
источник

YS

Yuriy Syrovetskiy in Compiler Development
модульные и проперти, как обычно
источник

PS

Peter Sovietov in Compiler Development
Vasiliy Yorkin
Как вы тестируете части своих компиляторов? Так же, как и что-то другое? Модульные\проперти тесты пишете? Мне кажется, что это должны быть очень надёжные тесты
Пишу наборы тестовых программ для основных этапов компиляции.  Для собственных DSL обязательно пишу генераторы тестовых программ.
источник

VY

Vasiliy Yorkin in Compiler Development
Спасибо.
Мне как-то давали следующие 2 пейпера по синтезу\генерации программ почитать, но я пока не брался за них:
http://www.cse.chalmers.se/~russo/publications_files/AST2011.pdf
http://janmidtgaard.dk/papers/Midtgaard-al%3AICFP17-full.pdf

Попробую разобраться. Для игрушечного компилятора по книге мб это перебор, но если я хочу научиться делать по-взрослому, то придётся научиться это нормально тестировать
источник

I

Ilmir in Compiler Development
Peter Sovietov
В моей фразе подразумевался этап проектирования ЯП, а не его использования.

А по поводу архитектуры в стандарте —- она должна бы быть формально описана в разделе "динамическая семантика". Но много ли Вы встречали стандартов с подобным разделом? :)
Тогда не будет возможностей для оптимизации под архитектуру. Паддинг там всякий и тому подобное.
источник

PS

Peter Sovietov in Compiler Development
Ilmir
Тогда не будет возможностей для оптимизации под архитектуру. Паддинг там всякий и тому подобное.
Даже в физических процессорах есть разделение на архитектуру команд (ISA) и микроархитектуру. Что же мешает в абстрактном процессоре абстрагироваться от несущественных моментов, задав ту же SOS-семантику? :)
источник

PS

Peter Sovietov in Compiler Development
Vasiliy Yorkin
Спасибо.
Мне как-то давали следующие 2 пейпера по синтезу\генерации программ почитать, но я пока не брался за них:
http://www.cse.chalmers.se/~russo/publications_files/AST2011.pdf
http://janmidtgaard.dk/papers/Midtgaard-al%3AICFP17-full.pdf

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

AT

Alexander Tchitchigin in Compiler Development
$ gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Феерично! Не ожидал такого... 😂
источник

AZ

Alexander Zaitsev in Compiler Development
Alexander Tchitchigin
$ gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Феерично! Не ожидал такого... 😂
а что не так? на macOS gcc бинд же на шланг
источник

DF

Dollar Føølish in Compiler Development
О, я помню бородатые времена gcc-llvm
источник