Size: a a a

Compiler Development

2020 February 10

PS

Peter Sovietov in Compiler Development
Vasiliy Tereshkov
Кстати, кто-нибудь встречал грамматику C, переписанную под рекурсивный спуск?
Есть такие. Я встречал, кажется, для Coco. Но на практике так никто не делает.
источник

VT

Vasiliy Tereshkov in Compiler Development
Peter Sovietov
А вот это как раз проблема изучения основ компиляции исключительно на примере игрушечного языка. Проблема в том, что студент не знакомится с более мощными техниками, которые просто не нужны были для работы на уровне Паскаля/Оберона.
А может быть, лучше нацелиться на то, чтобы новые языки сразу проектировать под рекурсивный спуск? В Go так и сделали и, кажется, ни в чём не проиграли по сравнению с C. Что удобно читать транслятору, то удобно читать и человеку.
источник

AK

Andrei Kurosh in Compiler Development
Vasiliy Tereshkov
У K&R и в стандарте C грамматика дана с левой рекурсией, так что парсер попадёт в бесконечный цикл. Её надо вручную переписывать, как это, видимо, и делали создатели TCC и 8cc
Я вообще спрашивал про написание кода на си без препроцессора, но давайте и это тоже обсудим :) если писать парсер руками, в лоб, не модифицируя грамматику - так и будет, вы правы. Но вроде бы замена левой рекурсии - тривиальная операция, и парсерогененаторы умеют делать это автоматически
источник

PS

Peter Sovietov in Compiler Development
Vasiliy Tereshkov
А может быть, лучше нацелиться на то, чтобы новые языки сразу проектировать под рекурсивный спуск? В Go так и сделали и, кажется, ни в чём не проиграли по сравнению с C. Что удобно читать транслятору, то удобно читать и человеку.
Так никто не отказывается от рекурсивного спуска. Просто там есть еще и секретный ингредиент :)
источник

VT

Vasiliy Tereshkov in Compiler Development
Peter Sovietov
Есть такие. Я встречал, кажется, для Coco. Но на практике так никто не делает.
В Coco грамматика C ущербная. Это даже прямо говорится в комментариях в коде
источник

VT

Vasiliy Tereshkov in Compiler Development
Andrei Kurosh
Я вообще спрашивал про написание кода на си без препроцессора, но давайте и это тоже обсудим :) если писать парсер руками, в лоб, не модифицируя грамматику - так и будет, вы правы. Но вроде бы замена левой рекурсии - тривиальная операция, и парсерогененаторы умеют делать это автоматически
Вероятно. Но в TCC и 8cc это явно делали вручную. К тому же это шаг, усложняющий процесс, но не приносящий никаких преимуществ, а следовательно, антипедагогический.
источник

PS

Peter Sovietov in Compiler Development
Vasiliy Tereshkov
А может быть, лучше нацелиться на то, чтобы новые языки сразу проектировать под рекурсивный спуск? В Go так и сделали и, кажется, ни в чём не проиграли по сравнению с C. Что удобно читать транслятору, то удобно читать и человеку.
Мне кажется, Вы невнимательно смотрели исходный код парсера Go. Вот, собственно, тот самый "секретный ингредиент":

https://github.com/golang/go/blob/master/src/go/parser/parser.go#L1606
источник

AZ

Alexander Zaitsev in Compiler Development
Любителям LLVM: тут ещё один оптимизирующий pass завезли
https://reviews.llvm.org/rGa17f03bd939
источник

E

EgorBo in Compiler Development
Alexander Zaitsev
Любителям LLVM: тут ещё один оптимизирующий pass завезли
https://reviews.llvm.org/rGa17f03bd939
какой tldr? :)
источник

AZ

Alexander Zaitsev in Compiler Development
EgorBo
какой tldr? :)
one more AggressiveInstCombine :)
источник

E

EgorBo in Compiler Development
скорее инсткомбайн для векторов :)
источник

E

EgorBo in Compiler Development
полезная вещь, приминяет все эти существующи пипхол оптимизации но уже для векторных типов
источник

TS

Timur Safin in Compiler Development
Alexander Zaitsev
Любителям LLVM: тут ещё один оптимизирующий pass завезли
https://reviews.llvm.org/rGa17f03bd939
сколько, сколько проходов?

161 (если я правильно посчитал в LinkAllPasses.h)??
источник

E

EgorBo in Compiler Development
кол-во не имеет значение, многие из них состоят из пары сотен строк кода, а другие - из десятков тысяч :)
источник
2020 February 11

VT

Vasiliy Tereshkov in Compiler Development
Peter Sovietov
Мне кажется, Вы невнимательно смотрели исходный код парсера Go. Вот, собственно, тот самый "секретный ингредиент":

https://github.com/golang/go/blob/master/src/go/parser/parser.go#L1606
А в чём секрет? В ручном прописывании приоритетов? В допущении необъявленных идентификаторов в левой части?
источник

M

MaxGraey in Compiler Development
Combinatris: Tetris with SKI combinators
https://dirk.rave.org/combinatris/
источник

KR

K R in Compiler Development
Vladimir Kazanov
А то все эти метациркулярности в хорошем смысле очень хороши для игнорирования реальности создания языков и компиляторов к ним
Ну это обычное дело в естественных науках. Если вы физику вспомните, то на каждом новом уровне "вам всё врали". Сложность ПО уже, видимо подошла к тому, что можно использовать подходы биологии. 😊
источник

KR

K R in Compiler Development
Vladimir Kazanov
Ml и Пролог, в общем-то, всегда были прежде всего академическими инструментами... Да и лиспы, пускай и в меньшей степени
Ocaml - это практически компилируемый Python. Только синтаксис отличается, да понятнее местами.
источник

VK

Vladimir Kazanov in Compiler Development
K R
Ocaml - это практически компилируемый Python. Только синтаксис отличается, да понятнее местами.
Сильное заявление, почти радикальное. С какой это стороны Окамле есть почти Питон? :-)
источник

KR

K R in Compiler Development
Vladimir Kazanov
Сильное заявление, почти радикальное. С какой это стороны Окамле есть почти Питон? :-)
С утрированно практической стороны (пользователя, естественно):

1. Объекты, замыкания есть, функции - значения.
2. Типы указывать не нужно.
3. Сборщик мусора.
4. Более-менее однопоточные.
5. Скорость выполнения байт-кода более-менее одинаковая.
6. Не требуют внешней виртуальной машины JVM/.NET.
7. Есть языковые менеджеры пакетов.
8. Энергичные вычисления, есть побочные эффекты.
9. Изменяемые значения. Семантика - всё boxed (у Питона нет выделенного типа ref, потому там известный ахтунг, конечно).

Отличия - у OCaml'а нет классов типов, поэтому выч. мат код требует некоторых мелких хаков, а вывод структур на консоль - ppx_deriving или т.п.

И я, честно говоря, ничего более близкого к Питону, но компилируемого и достаточно популярного, не вижу.
источник