Size: a a a

Compiler Development

2020 January 02

꧁Станцуем жизнь꧂ in Compiler Development
Alexander Tchitchigin
И даже более того, по-уму, нужно ещё и статью прочитать и разобраться в доказательствах! 😉
Да ну тебя, с новым годом в общем
источник

AT

Alexander Tchitchigin in Compiler Development
С Новым годом! Всем побольше компиляторов в этом году! 😁
источник

M

MaxGraey in Compiler Development
и поменьше транспиляторов 😁
источник

YS

Yuriy Syrovetskiy in Compiler Development
Gymmasssorla
https://t.me/CompilerDev/49620

Вот это определение полностью подходит под enum в Rust. Не влияет на поведение? Не влияет. Делает удобнее? Да. Вопрос тут по сравнению с чем не влияет на поведение и делает удобнее - по сравнению с ручным struct + tag + union
нет, невозможно сделать удобнее то, чего нет
источник

МБ

Михаил Бахтерев in Compiler Development
Yuriy Syrovetskiy
нет, есть конкретные фичи у ADT, которые невозможны без ADT (enum)
Интересно, какие? Потому что, например, на Scheme (ну, как пример, убожества с точки зрения языковых фич) pattern-matching легко пишется на структурах и тэгах со всеми этими exhaustive-проверками в виде макроса match https://docs.racket-lang.org/reference/match.html. Берём какой-нибудь https://github.com/eudoxia0/cmacro и делаем то же самое для Си. Ну, как бы, оно же всё равно построено на if-ах и jmp-ах. Никакой магии там нет, и все эти фичи воспроизводимы.

Дело тут совсем не в языке, а именно в концепции, и в способе организации программ. С ADT (algebraic), действительно удобнее, но не из-за синтаксиса, а из-за математических свойств конструкции. Я и на Си (когда студенты пишут загрузчики для операционки) учу использовать ADT. Как их кодировать - дело такое, наживное.
источник

AV

Alexey Veselovsky in Compiler Development
ADT удобны из за их семантики прежде всего.
источник

I

Ilmir in Compiler Development
Михаил Бахтерев
Интересно, какие? Потому что, например, на Scheme (ну, как пример, убожества с точки зрения языковых фич) pattern-matching легко пишется на структурах и тэгах со всеми этими exhaustive-проверками в виде макроса match https://docs.racket-lang.org/reference/match.html. Берём какой-нибудь https://github.com/eudoxia0/cmacro и делаем то же самое для Си. Ну, как бы, оно же всё равно построено на if-ах и jmp-ах. Никакой магии там нет, и все эти фичи воспроизводимы.

Дело тут совсем не в языке, а именно в концепции, и в способе организации программ. С ADT (algebraic), действительно удобнее, но не из-за синтаксиса, а из-за математических свойств конструкции. Я и на Си (когда студенты пишут загрузчики для операционки) учу использовать ADT. Как их кодировать - дело такое, наживное.
Два чая этому господину!
источник

YS

Yuriy Syrovetskiy in Compiler Development
Михаил Бахтерев
Интересно, какие? Потому что, например, на Scheme (ну, как пример, убожества с точки зрения языковых фич) pattern-matching легко пишется на структурах и тэгах со всеми этими exhaustive-проверками в виде макроса match https://docs.racket-lang.org/reference/match.html. Берём какой-нибудь https://github.com/eudoxia0/cmacro и делаем то же самое для Си. Ну, как бы, оно же всё равно построено на if-ах и jmp-ах. Никакой магии там нет, и все эти фичи воспроизводимы.

Дело тут совсем не в языке, а именно в концепции, и в способе организации программ. С ADT (algebraic), действительно удобнее, но не из-за синтаксиса, а из-за математических свойств конструкции. Я и на Си (когда студенты пишут загрузчики для операционки) учу использовать ADT. Как их кодировать - дело такое, наживное.
например, в Расте при сопоставлении с образцом происходит неизбежная проверка тэга. в С с тэгами компилятор такую помощь не даёт, разрешая читать Some из None. в Рэкете это тоже всего лишь сахар, как я понимаю
источник

I

Ilmir in Compiler Development
Михаил Бахтерев
Интересно, какие? Потому что, например, на Scheme (ну, как пример, убожества с точки зрения языковых фич) pattern-matching легко пишется на структурах и тэгах со всеми этими exhaustive-проверками в виде макроса match https://docs.racket-lang.org/reference/match.html. Берём какой-нибудь https://github.com/eudoxia0/cmacro и делаем то же самое для Си. Ну, как бы, оно же всё равно построено на if-ах и jmp-ах. Никакой магии там нет, и все эти фичи воспроизводимы.

Дело тут совсем не в языке, а именно в концепции, и в способе организации программ. С ADT (algebraic), действительно удобнее, но не из-за синтаксиса, а из-за математических свойств конструкции. Я и на Си (когда студенты пишут загрузчики для операционки) учу использовать ADT. Как их кодировать - дело такое, наживное.
И спасибо за cmacro! Как раз то, что я искал.
источник

YS

Yuriy Syrovetskiy in Compiler Development
Михаил Бахтерев
Интересно, какие? Потому что, например, на Scheme (ну, как пример, убожества с точки зрения языковых фич) pattern-matching легко пишется на структурах и тэгах со всеми этими exhaustive-проверками в виде макроса match https://docs.racket-lang.org/reference/match.html. Берём какой-нибудь https://github.com/eudoxia0/cmacro и делаем то же самое для Си. Ну, как бы, оно же всё равно построено на if-ах и jmp-ах. Никакой магии там нет, и все эти фичи воспроизводимы.

Дело тут совсем не в языке, а именно в концепции, и в способе организации программ. С ADT (algebraic), действительно удобнее, но не из-за синтаксиса, а из-за математических свойств конструкции. Я и на Си (когда студенты пишут загрузчики для операционки) учу использовать ADT. Как их кодировать - дело такое, наживное.
всё равно всё построено на машинном коде. всё равно всё построено на лямбда-исчеслении и машине Тьюринга. и что это доказывает?
источник

G

Gymmasssorla in Compiler Development
Ilmir
И спасибо за cmacro! Как раз то, что я искал.
Годно
источник

YS

Yuriy Syrovetskiy in Compiler Development
Михаил Бахтерев
Интересно, какие? Потому что, например, на Scheme (ну, как пример, убожества с точки зрения языковых фич) pattern-matching легко пишется на структурах и тэгах со всеми этими exhaustive-проверками в виде макроса match https://docs.racket-lang.org/reference/match.html. Берём какой-нибудь https://github.com/eudoxia0/cmacro и делаем то же самое для Си. Ну, как бы, оно же всё равно построено на if-ах и jmp-ах. Никакой магии там нет, и все эти фичи воспроизводимы.

Дело тут совсем не в языке, а именно в концепции, и в способе организации программ. С ADT (algebraic), действительно удобнее, но не из-за синтаксиса, а из-за математических свойств конструкции. Я и на Си (когда студенты пишут загрузчики для операционки) учу использовать ADT. Как их кодировать - дело такое, наживное.
да, конечно! математические свойства важны! и они должны помогать писать программы, а не просто кодировать одно через другое
источник

YS

Yuriy Syrovetskiy in Compiler Development
когда АТД реализованы сахаром, они никак не спасают от сегфолтов. а когда в самом языке вмето NULL и явных tagged union, то спасают
источник

МБ

Михаил Бахтерев in Compiler Development
Yuriy Syrovetskiy
когда АТД реализованы сахаром, они никак не спасают от сегфолтов. а когда в самом языке вмето NULL и явных tagged union, то спасают
Вопрос в том, как реализовывать. Обычно мы делаем через макро-таблицу: (Тэг, union-поле, Деконструктор). Кстати, идея украдена из какого-то компилятора. Из 8cc, наверное.

Ну, и как бы, автоматом втыкается проверка на NULL, а в деконструкторе указан тип union-поля и всё сшивается вместе с проверкой типов. Вручную, конечно, можно понаписать всякого, но вот есть метод сделать корректно и автоматически.
источник

МБ

Михаил Бахтерев in Compiler Development
Если объявите этот метод костыльным - спорить не стану. Но он неплохо работает и отражает устройство ADT. Помогает "системщикам" потом ориентироваться в Haskell.
источник

AV

Alexey Veselovsky in Compiler Development
Сегфолт - это такая же сработавшая рантайм проверка.

Сегфолт это вообще лучшее, что может случиться с некорректной программой.
источник

G

Gymmasssorla in Compiler Development
Alexey Veselovsky
Сегфолт - это такая же сработавшая рантайм проверка.

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

AV

Alexey Veselovsky in Compiler Development
Gymmasssorla
А ещё лучше - избежать его на этапе компиляции
Да
источник

YS

Yuriy Syrovetskiy in Compiler Development
Михаил Бахтерев
Вопрос в том, как реализовывать. Обычно мы делаем через макро-таблицу: (Тэг, union-поле, Деконструктор). Кстати, идея украдена из какого-то компилятора. Из 8cc, наверное.

Ну, и как бы, автоматом втыкается проверка на NULL, а в деконструкторе указан тип union-поля и всё сшивается вместе с проверкой типов. Вручную, конечно, можно понаписать всякого, но вот есть метод сделать корректно и автоматически.
независимо от метода надо ещё запретить лезть грязными руками в тэг и данные
источник

YS

Yuriy Syrovetskiy in Compiler Development
Alexey Veselovsky
Сегфолт - это такая же сработавшая рантайм проверка.

Сегфолт это вообще лучшее, что может случиться с некорректной программой.
зачем проверки в рантайме, если во время компиляции всё ловится?
источник