Size: a a a

Compiler Development

2020 April 01

PS

Peter Sovietov in Compiler Development
Doge Shibu
Монады - с практической точки зрения - это прежде всего способ переиспользования кода, который использует данный тайпкласс для композиции значений.

И в этом смысле он достаточно ключевой, т.к. компизация такого плана встречается очень много где и его наличие позволяет более-менее удобно шарить реализации многих функций для совершенно различных типов.
Давайте, все же, учитывать контекст нашего канала. Реализации компиляторов встречаются на самых различных ЯП, поэтому конкретный шаблон проектирования я бы не ставил сейчас во главу угла. С точки зрения разработки компиляторов, повторюсь, важнее общий комбинаторный подход, где комбинатор понимается в широком смысле (цитируя Джона Хьюза: «функция, которая строит фрагмент программы из фрагментов программ»). Как это устроено — монады, стрелки, DCG, передача динамического состояния... — вопросы реализации в конкретных ЯП.
источник

DS

Doge Shibu in Compiler Development
Илья Чистяков
я про языки без функторов, и шаринг функций делается через концепцию интерфейсов

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

DS

Doge Shibu in Compiler Development
Peter Sovietov
Давайте, все же, учитывать контекст нашего канала. Реализации компиляторов встречаются на самых различных ЯП, поэтому конкретный шаблон проектирования я бы не ставил сейчас во главу угла. С точки зрения разработки компиляторов, повторюсь, важнее общий комбинаторный подход, где комбинатор понимается в широком смысле (цитируя Джона Хьюза: «функция, которая строит фрагмент программы из фрагментов программ»). Как это устроено — монады, стрелки, DCG, передача динамического состояния... — вопросы реализации в конкретных ЯП.
Тут вопрос в том, насколько просто и безопасно будет переиспользовать комбинаторы в различных подходах.

И что может дать каждый из них, т.к. у всех есть свои трейдоффы.
источник

ИЧ

Илья Чистяков in Compiler Development
polunin.ai
ну тебе нужно будет писать раз в 10 больше кода
если имеется ввиду реализации одной и той же логики в разных языках, то больше похоже на заблуждение, хотя припоминаю какую-то старинное исследование, но там не было того же питона
источник

AT

Alexander Tchitchigin in Compiler Development
Peter Sovietov
Давайте, все же, учитывать контекст нашего канала. Реализации компиляторов встречаются на самых различных ЯП, поэтому конкретный шаблон проектирования я бы не ставил сейчас во главу угла. С точки зрения разработки компиляторов, повторюсь, важнее общий комбинаторный подход, где комбинатор понимается в широком смысле (цитируя Джона Хьюза: «функция, которая строит фрагмент программы из фрагментов программ»). Как это устроено — монады, стрелки, DCG, передача динамического состояния... — вопросы реализации в конкретных ЯП.
Нет. Монады подчиняются вполне определённым законам композиции в отличие от.
источник

p

polunin.ai in Compiler Development
Илья Чистяков
если имеется ввиду реализации одной и той же логики в разных языках, то больше похоже на заблуждение, хотя припоминаю какую-то старинное исследование, но там не было того же питона
там где в императивных языках пишутся километровые визитеры, в ФП используются сум-типы и сопоставление с образцом
источник

ИЧ

Илья Чистяков in Compiler Development
Doge Shibu
Т.е. тебе ничего не мешает выразить монаду на языке с интерфейсами. Тут вопрос именно в том, что система типов должна позволять типы высших порядков, без которых монады, функторы и т.п. - не выразимы.
понимаю что можно, только ими невозможно пользоваться, там где они не заложены в язык

а тезис про нужду выражать высокие типы, например в питоне, мне не очень понятен, можно подробностей?
источник

ИЧ

Илья Чистяков in Compiler Development
polunin.ai
там где в императивных языках пишутся километровые визитеры, в ФП используются сум-типы и сопоставление с образцом
можно пример?
источник

PS

Peter Sovietov in Compiler Development
Alexander Tchitchigin
Нет. Монады подчиняются вполне определённым законам композиции в отличие от.
Ага, но проблема в том, что в процессе разработки компилятора это не те законы, которые мне нужны. И, судя по вот этому обсуждению, скепсис возникает не только у меня :) https://mobile.twitter.com/prof_ilya/status/1230541680819879937
источник

p

polunin.ai in Compiler Development
Илья Чистяков
можно пример?
мне лень писать класс визитер и потом создавать четыре визитера
источник

МБ

Михаил Бахтерев in Compiler Development
Peter Sovietov
Давайте, все же, учитывать контекст нашего канала. Реализации компиляторов встречаются на самых различных ЯП, поэтому конкретный шаблон проектирования я бы не ставил сейчас во главу угла. С точки зрения разработки компиляторов, повторюсь, важнее общий комбинаторный подход, где комбинатор понимается в широком смысле (цитируя Джона Хьюза: «функция, которая строит фрагмент программы из фрагментов программ»). Как это устроено — монады, стрелки, DCG, передача динамического состояния... — вопросы реализации в конкретных ЯП.
Кстати. Вот комбинаторный парсер - это общеизвестная вещь. А существуют ли комбинаторные генераторы кода?
источник

МБ

Михаил Бахтерев in Compiler Development
Peter Sovietov
Это как раз к вопросу dynamic vs static в контексте компиляторов. Программист на Scheme, например, с трудом сможет себе вообразить сложности, которые заставили специалистов использовать монады для реализации комбинаторов парсеров. В целом, если говорить об общих подходах, то программирование на уровне комбинаторов как раз таким и является, на мой взгляд. В то время как монады — необходимая в некоторых случаях деталь реализации :)
Почему сложно? Монады изначально использовались для описания эффекта бета-редукции в денотационных моделях нетипизированного lambda-исчисления. С типизированным, кстати, проблем особо и не было, потому что всем хватало STLC, в котором нет проблем с неопределённостью. Теоркат, фактически, пришлось затащить в информатику в отчаянных попытках понять, в каком смысле T может быть равно Т -> T. А потом уже понеслось. Но, кстати, первые описания прочих эффектов: работа с вводом/выводом или с памятью (что особо занимало умы) тоже были даны сначала в бестиповых денотационных конструкциях.
источник

ИЧ

Илья Чистяков in Compiler Development
polunin.ai
мне лень писать класс визитер и потом создавать четыре визитера
что-то поскромнее мб, в питоне например паттерны почти не используются, в том числе и визитёр, из-за гибкости языка
источник

p

polunin.ai in Compiler Development
Илья Чистяков
что-то поскромнее мб, в питоне например паттерны почти не используются, в том числе и визитёр, из-за гибкости языка
а потом полтора часа это отлаживают, ага
источник

PS

Peter Sovietov in Compiler Development
Михаил Бахтерев
Кстати. Вот комбинаторный парсер - это общеизвестная вещь. А существуют ли комбинаторные генераторы кода?
Да, я именно так и пишу компиляторы. Оно выглядит похоже на БНФ нотацию, но уже для трансляции IR -> язык ассемблера.
источник

ИЧ

Илья Чистяков in Compiler Development
polunin.ai
а потом полтора часа это отлаживают, ага
это больше про плюсы) питон оч прозрачен для отладки
источник

p

polunin.ai in Compiler Development
давайте брать статически типизированные языки. динамически типизированные для узкого круга задач подходят.
источник

ИЧ

Илья Чистяков in Compiler Development
polunin.ai
давайте брать статически типизированные языки. динамически типизированные для узкого круга задач подходят.
скорее наоборот
источник

PS

Peter Sovietov in Compiler Development
Михаил Бахтерев
Почему сложно? Монады изначально использовались для описания эффекта бета-редукции в денотационных моделях нетипизированного lambda-исчисления. С типизированным, кстати, проблем особо и не было, потому что всем хватало STLC, в котором нет проблем с неопределённостью. Теоркат, фактически, пришлось затащить в информатику в отчаянных попытках понять, в каком смысле T может быть равно Т -> T. А потом уже понеслось. Но, кстати, первые описания прочих эффектов: работа с вводом/выводом или с памятью (что особо занимало умы) тоже были даны сначала в бестиповых денотационных конструкциях.
В этом смысле меня изумляет, когда монадические комбинаторы парсеров делают уже в динамическом языке. Карго-культ какой-то!
источник

МБ

Михаил Бахтерев in Compiler Development
polunin.ai
давайте брать статически типизированные языки. динамически типизированные для узкого круга задач подходят.
Ну, в контексте компиляторного чата, вроде как, не важно, какой язык брать. Типы-то стираются :)
источник