Size: a a a

Compiler Development

2020 April 01

K

Kakadu in Compiler Development
Peter Sovietov
Ну вот давайте снова вернемся к компиляторам. Есть известная статья по монадическим комбинаторам парсеров от 96 года: http://eprints.nottingham.ac.uk/237/1/monparsing.pdf
По большому счету это первая статья по данному предмету. И из нее становится понятно,  например, что комбинаторы парсеров существовали задолго до того, как слово "монада" в контексте ФП вообще начало употребляться. Автор называет это "earlier (non-monadic) accounts of combinator parsing". А теперь вчитайтесь, какую именно фундаментальную проблему решает введение монад автором: "the problem of nested tuples can be avoided by adopting a monadic sequencing combinator" ;)
А вот тут Вы передёрнули. Полная фраза "For example, using a monadic sequencing combinator for parsers avoids the messy manip-
ulation of nested tuples of results present in earlier work."
источник

K

Kakadu in Compiler Development
Алексей
что именно?
Ну там несколько разновидностей интепретаторов языка выражений
источник

МБ

Михаил Бахтерев in Compiler Development
Алексей
r - это просто результат, он тут роли вообще никакой не играет, ни в одной из версий
s - собственно скорее всего будет итератором (мутабельным) или чем-то похожим
С итератором возникнут проблемы с откатами, например. То есть, о должен быть посложнее быть устроен. А как именно, как раз и помогают монадические законы понять. Это просто математика, как математика чисел, логики и прочего.

Лично мне помогает, хоть на Bash я пишу, хоть на Си. Пэтому всем рекомендую практиковать.
источник

А

Алексей in Compiler Development
Kakadu
Ну там несколько разновидностей интепретаторов языка выражений
Ну вообще на императивных языках тоже интерпретаторы языка выражений пишутся. Но они конечно жутко некрасивыми для вас будут, даже если для императивщиков будут нормальными. Потому что не используют монады.
источник

PS

Peter Sovietov in Compiler Development
Kakadu
А вот тут Вы передёрнули. Полная фраза "For example, using a monadic sequencing combinator for parsers avoids the messy manip-
ulation of nested tuples of results present in earlier work."
Я просто указал на незначительность повода введения монад в данном случае, потому что вложенные результаты это не проблема, если посмотреть на реализации многих популярных комбинаторных библиотек.
источник

K

Kakadu in Compiler Development
Алексей
Ну вообще на императивных языках тоже интерпретаторы языка выражений пишутся. Но они конечно жутко некрасивыми для вас будут, даже если для императивщиков будут нормальными. Потому что не используют монады.
Вот только не надо это говорить человеку, который вмесчто Haskell больше любит OCaml, потому что там не надо на каждый чих использовать монады.
источник

K

Kakadu in Compiler Development
Peter Sovietov
Я просто указал на незначительность повода введения монад в данном случае, потому что вложенные результаты это не проблема, если посмотреть на реализации многих популярных комбинаторных библиотек.
Вы просто упомянули один результат, который был дан "например", и не упомянули другие, введя людей в заблуждение, что других преимуществ нет
источник

PS

Peter Sovietov in Compiler Development
Kakadu
Вы просто упомянули один результат, который был дан "например", и не упомянули другие, введя людей в заблуждение, что других преимуществ нет
Вы подозреваете у меня злой умысел, в то время как я действительно не нашел других доводов в пользу монад у автора :)
источник

А

Алексей in Compiler Development
Михаил Бахтерев
С итератором возникнут проблемы с откатами, например. То есть, о должен быть посложнее быть устроен. А как именно, как раз и помогают монадические законы понять. Это просто математика, как математика чисел, логики и прочего.

Лично мне помогает, хоть на Bash я пишу, хоть на Си. Пэтому всем рекомендую практиковать.
Ну если монадические законы без собственно монад, то это уже другой разговор. Потому что мне представляются монады на Си как что-то совсем ужасное. Да, итератор может и посложнее будет устроен, но эта сложность весьма субъективна, для кого-то монада парсера будет куда сложнее.
источник

А

Алексей in Compiler Development
Kakadu
Вы просто упомянули один результат, который был дан "например", и не упомянули другие, введя людей в заблуждение, что других преимуществ нет
А какие тут другие существенные преимущества?
источник

PS

Peter Sovietov in Compiler Development
На мой взгляд, первичен, все-таки, комбинаторный подход. Если разработчик понимает преимущества комбинаторного программирования, то, при необходимости, конкретные шаблоны проектирования (в духе монадной bind) он, походя, переизобретет, не отвлекаясь от прикладной задачи.

Для меня хорошим примером является вот эта реализация синт. анализатора Оберона: https://github.com/vladfolts/oberonjs/blob/master/src/grammar.js

Ее автор ничего не знал ни о монадах, ни о PEG, когда писал этот код. Обычный рядовой разработчик на JS. И результат он получил, исходя из собственного чувства прекрасного :)
источник

МБ

Михаил Бахтерев in Compiler Development
Peter Sovietov
На мой взгляд, первичен, все-таки, комбинаторный подход. Если разработчик понимает преимущества комбинаторного программирования, то, при необходимости, конкретные шаблоны проектирования (в духе монадной bind) он, походя, переизобретет, не отвлекаясь от прикладной задачи.

Для меня хорошим примером является вот эта реализация синт. анализатора Оберона: https://github.com/vladfolts/oberonjs/blob/master/src/grammar.js

Ее автор ничего не знал ни о монадах, ни о PEG, когда писал этот код. Обычный рядовой разработчик на JS. И результат он получил, исходя из собственного чувства прекрасного :)
Так вот именно. Bind переизобретается очень часто. Имеет смысл это изучить и практиковать
источник

K

Kakadu in Compiler Development
Алексей
А какие тут другие существенные преимущества?
Там целый абзац про это
Taking the monadic approach further, the monad of parsers can be expressed in a modular way in terms of two simpler monads. The immediate benefit is that the basic parser combinators no longer need to be defined explicitly. Rather, they arise automatically as a special case of lifting monad operations from a base monad m to a certain other monad parameterised over m. This also means that, if we change the nature of parsers by modifying the base monad (for example, limiting parsers to producing at most one result), then new combinators for the modified monad of parsers also arise automatically via the lifting construction.
источник

K

Kakadu in Compiler Development
Михаил Бахтерев
Так вот именно. Bind переизобретается очень часто. Имеет смысл это изучить и практиковать
А если человек переизобретает bind, одначает ли это, что он не пользуется монадой парсера?
источник

МБ

Михаил Бахтерев in Compiler Development
Kakadu
А если человек переизобретает bind, одначает ли это, что он не пользуется монадой парсера?
Пользуется. Вот я и говорю, что делать это осознанно - эффективнее.
источник

K

Kakadu in Compiler Development
Можем ли мы считать, что мы всех убедили, что монады при парсинге полезны?
источник

PS

Peter Sovietov in Compiler Development
Kakadu
Можем ли мы считать, что мы всех убедили, что монады при парсинге полезны?
Это полезность в общем случае уровня "оказывается, я всю жизнь говорил прозой!" :)
источник

K

Kakadu in Compiler Development
но человек же не сможет больше утверждать, что проза не нужна?
источник

PS

Peter Sovietov in Compiler Development
Kakadu
но человек же не сможет больше утверждать, что проза не нужна?
На мой взгляд, нюанс в трактовке. Если мы под монадой подразумеваем вообще (любой) способ построения комбинаторов — это одно. Действительно, нам ведь в любом случае нужно из одного состояния генерировать другое состояние под действием какой-то функции. Но вот слепо пытаться свою прикладную задачу упихивать в соответствии с конкретной сигнатурой bind из того же Haskell — неразумно. Собственно, как и в случае других шаблонов проектирования задача должна быть первична.
источник

r

rbykov in Compiler Development
а где почитать про комбинаторы?
источник