Size: a a a

Compiler Development

2020 March 11

МБ

Михаил Бахтерев in Compiler Development
K R
Безумно обманчивое 😞. Первое впечатление

let a = b in let b = a + 1 in a + b

Но второе -

let (a, b) = (b, a + 1) in a + b

И выбрать что-то одно чувствами/интуицией не могу. Крайне неудачная конструкция.
Ну... Мне кажется, пускай так или так. Но вопрос в том, как это должно выполняться? Или не должно выполняться никак? Типа: exception при попытке использовать undefined? Ну, то есть, вот как точнее могу спросить. Какая ожидаемая здесь должна быть fixpoint? Вечный цикл или undefined a и b, и по итогу исключение?
источник

АВ

Александр Вольнов in Compiler Development
Михаил Бахтерев
Очередной вопрос к опытным участникам: а насколько реально проследить происхождение каждой инструкции в результате компиляции прямо до исходного текста? Имеется в виду, чтобы предоставить программисту комментарии в ассемблерном коде, что вот эти инструкции сгенерированы конкретно из такого-то выражения. Подразумевается, что ассемблер получен после нескольких проходов оптимизатора и планирования инструкций.

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

Какая-то такая фантазия. Это возможно? И дополнительный вопрос: не знает ли кто-нибудь какую-нибудь внятную реализацию Source Maps? А то в ClojureScript трындец.
https://godbolt.org/ и есть такой инструмент.
источник

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Ну... Мне кажется, пускай так или так. Но вопрос в том, как это должно выполняться? Или не должно выполняться никак? Типа: exception при попытке использовать undefined? Ну, то есть, вот как точнее могу спросить. Какая ожидаемая здесь должна быть fixpoint? Вечный цикл или undefined a и b, и по итогу исключение?
В энергичном языке нет смысла во взаимно-рекурсивном let, поэтому я бы сделал ошибку компиляции, если b нет в лексическом скоупе, а новый b его бы затенял (shadow).
источник

МБ

Михаил Бахтерев in Compiler Development
А он какими средствами делает? Штатными или нечто дополнительное?
источник

МБ

Михаил Бахтерев in Compiler Development
Alexander Tchitchigin
В энергичном языке нет смысла во взаимно-рекурсивном let, поэтому я бы сделал ошибку компиляции, если b нет в лексическом скоупе, а новый b его бы затенял (shadow).
Хочется сделать let рекурсивным по-умолчанию.
источник

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Хочется сделать let рекурсивным по-умолчанию.
В энергичном языке? Ну, такое... 😊
У меня по этой причине нет претензий к let rec/letrec в (SML|OCaml|F#)/(Lisp|Scheme).
источник

АВ

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

АВ

Александр Вольнов in Compiler Development
Михаил Бахтерев
А он какими средствами делает? Штатными или нечто дополнительное?
Компилятор выдаёт асм с номерами строк кода, а compiler explorer их парсит и визуализирует соответствие между ними.
источник

МБ

Михаил Бахтерев in Compiler Development
Alexander Tchitchigin
В энергичном языке? Ну, такое... 😊
У меня по этой причине нет претензий к let rec/letrec в (SML|OCaml|F#)/(Lisp|Scheme).
Ну... Чисто формально это транслируется в fix .... Но есть вот этот нюанс как воспринимать циклические зависимости. Либо циклами, либо undefined-ами.
источник

МБ

Михаил Бахтерев in Compiler Development
Теоретически, вроде, оба варианта будут fixpoint-ами, только не понятно, какое из них mu, а какое nu.
источник

МБ

Михаил Бахтерев in Compiler Development
И какое надо брать? Вроде, стандартно берут mu
источник

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Ну... Чисто формально это транслируется в fix .... Но есть вот этот нюанс как воспринимать циклические зависимости. Либо циклами, либо undefined-ами.
Если Вы так ставите вопрос, то я за undefined - exception лучше зависания.
источник

A

Alex in Compiler Development
Михаил Бахтерев
Очередной вопрос к опытным участникам: а насколько реально проследить происхождение каждой инструкции в результате компиляции прямо до исходного текста? Имеется в виду, чтобы предоставить программисту комментарии в ассемблерном коде, что вот эти инструкции сгенерированы конкретно из такого-то выражения. Подразумевается, что ассемблер получен после нескольких проходов оптимизатора и планирования инструкций.

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

Какая-то такая фантазия. Это возможно? И дополнительный вопрос: не знает ли кто-нибудь какую-нибудь внятную реализацию Source Maps? А то в ClojureScript трындец.
Если нужна просто привязка к исходнику, то относительно просто. Если нужно прослеживать конкретный путь от инструкции с первых проходов до её адреса в исполняемом файле, то очень сложно. Отслеживать на какой оптимизации инструкция создалась наверное не так сложно (примерно как с исходником), но там могут быть сюрпризы вида "создали инструкцию на peephole, потом вынесли из цикла, потом ещё куда-нибудь перетащили, потом перепланировали", а информация будет только о результате peephole'а
источник

DP

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

DP

Dmitry Ponyatov in Compiler Development
человек склонен в объектных графах мыслить, даже те кто программируют в ФП и типах
достаточно понаблюдать как человек или особенно группа думает — на бумажке или доске сначала символы записываются, или иконки, и потом на них строится (гипер)граф отношений
источник

AG

Alex Gryzlov in Compiler Development
функции тоже не в воздухе висят
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Вопрос: какое бы вы ожидали поведение от такого вот кода let a = b; b = a + 1 in a + b при энергичном исполнении?
ошибку делать наверное
источник

А

Алексей in Compiler Development
а не, не наверное, а точно ошибку
источник

PS

Peter Sovietov in Compiler Development
Михаил Бахтерев
Очередной вопрос к опытным участникам: а насколько реально проследить происхождение каждой инструкции в результате компиляции прямо до исходного текста? Имеется в виду, чтобы предоставить программисту комментарии в ассемблерном коде, что вот эти инструкции сгенерированы конкретно из такого-то выражения. Подразумевается, что ассемблер получен после нескольких проходов оптимизатора и планирования инструкций.

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

Какая-то такая фантазия. Это возможно? И дополнительный вопрос: не знает ли кто-нибудь какую-нибудь внятную реализацию Source Maps? А то в ClojureScript трындец.
Это хороший вопрос!  Идеальная ситуация -- когда позиции в исходном тексте сохраняются только до завершения стадии семантического анализа. А бывает и так, что компилятор практически готов и вдруг выясняется, что нужно поддержать отладку на уровне исходного текста. Это может очень опечалить разработчика компилятора.

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

И, конечно же, надо понимать, что при серьезных трансформациях программы информация об исходном тексте точной не будет. Простейший пример. Положим, у нас в коде есть множество констант Int(0), каждая из которых имеет свою позицию в исходном тексте. Далее мы проводим CSE и оказывается, что узел Int(0) теперь в единственном экземпляре. Какую же Location ему назначить? :)
источник

АВ

Александр Вольнов in Compiler Development
Dmitry Ponyatov
типа Smalltalk image ? c графовыми или объектными БД пробовали свою идею? Seaside, neo4j
Не был знаком ни с чем из перечисленного. Прочитал про Smalltalk image, во многом идеи похожи. У меня тоже типы - это данные. Но у меня не снапшоты состояния приложения, а идея в том, что эти бинарные файлы с данными и информацией о типах будут использоваться как формат сериализации и обмена данными между приложениями и различными компьютерами.
Про Seaside почитал википедию, не нашёл ни единого упоминания о том, чтобы это была БД. Пишут, что это фреймворк для написания серверной части веб-приложений.
И по идее мой язык позволит создать свою легковесную БД под задачу с практически любым внутренним представлением. Можно графы, можно таблицы, можно вложенные иерархические структуры любой сложности.
источник