Size: a a a

Compiler Development

2020 March 11

А

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

А

Антон in Compiler Development
MPQ
источник

А

Антон in Compiler Development
Вроде как даже есть палёная спецификация
источник

MM

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

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

Какая-то такая фантазия. Это возможно? И дополнительный вопрос: не знает ли кто-нибудь какую-нибудь внятную реализацию Source Maps? А то в ClojureScript трындец.
В том виде, в котором это сформулировано задача довольно сложная. Все современные компиляторы пытаются её решить хотя бы приближённо. Чтобы можно было в отладчике поставить breakpoint нужно отображение "стока в исходном коде -> инструкция". Чтобы можно было остановиться по произвольному событию (watchpoint переменной) и понять где сейчас находится поток управления, нужно обратное отображение. Оба отображения неоднозначны: в первом случае когда одна операция в исходном коде дублируется в несколько операций в машинном коде (unrolling, unswitching, jump threading, и т.п.), во втором случае - наоборот (устранение общих подвыражений, tail merging).

В LLVM есть некоторая документация на эту тему https://llvm.org/docs/SourceLevelDebugging.html
Общий принцип, насколько я понимаю, простой: из исходного кода генерируется LLVM IR, где к каждой инструкции прикреплена информация о позиции в исходном коде. Оптимизации и backend пытаются по возможности эту информацию сохранить, а при вставке новых инструкций выбрать другую инструкцию, откуда эту информацию скопировать.

Одна интересная идея/статья на тему от разработчиков GCC: https://developers.redhat.com/blog/2017/07/11/statement-frontier-notes-and-location-views/

Самый распространённый открытый формат отладочной информации - это DWARF, там в разделе про "Line Number Information" описан формат.
источник

IJ

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

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

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

А

Алексей in Compiler Development
Mikhail Maltsev
В том виде, в котором это сформулировано задача довольно сложная. Все современные компиляторы пытаются её решить хотя бы приближённо. Чтобы можно было в отладчике поставить breakpoint нужно отображение "стока в исходном коде -> инструкция". Чтобы можно было остановиться по произвольному событию (watchpoint переменной) и понять где сейчас находится поток управления, нужно обратное отображение. Оба отображения неоднозначны: в первом случае когда одна операция в исходном коде дублируется в несколько операций в машинном коде (unrolling, unswitching, jump threading, и т.п.), во втором случае - наоборот (устранение общих подвыражений, tail merging).

В LLVM есть некоторая документация на эту тему https://llvm.org/docs/SourceLevelDebugging.html
Общий принцип, насколько я понимаю, простой: из исходного кода генерируется LLVM IR, где к каждой инструкции прикреплена информация о позиции в исходном коде. Оптимизации и backend пытаются по возможности эту информацию сохранить, а при вставке новых инструкций выбрать другую инструкцию, откуда эту информацию скопировать.

Одна интересная идея/статья на тему от разработчиков GCC: https://developers.redhat.com/blog/2017/07/11/statement-frontier-notes-and-location-views/

Самый распространённый открытый формат отладочной информации - это DWARF, там в разделе про "Line Number Information" описан формат.
а при отладке разве делаются оптимизации?
источник

MM

Mikhail Maltsev in Compiler Development
Алексей
а при отладке разве делаются оптимизации?
Никто не запрещает: генерирование отладочной информации и оптимизация это независимые фичи. В некоторых случая проблема проявляется только в оптимизированном коде, и приходится отлаживать его.
источник

DP

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

АВ

Александр Вольнов in Compiler Development
Почитал. Это формат архива, то есть там внутри в конечном счёте после распаковки и расшифровки будут файлы в различных форматах, которые MPQ рассматривает как чёрный ящик и то, как трактовать их решает приложение на основе его типа.
Я продумываю такой формат, который не содержит никаких чёрных ящиков и знает, какие данные он содержит вплоть до каждого пикселя изображения и вершины 3D модели и т.п.. Допустим, если файл хранит все данные игры, то можно будет подгрузить его, а потом написать
DataVoln::OpenFile("game.bdv").DeserializeExpr<Color>("Levels.MyLevelName.Textures.Metal.Pixels[42][42]");
И это выражение прочитает цвет пикселя текстуры с именем Metal, находящейся в уровне с именем MyLevelName в позиции x = 42, y = 42. И будет выполнен ровно тот объём вычислений, который нужен. То есть весь файл не будет расжиматься и декодироваться, если его структура позволяет прочитать данные пикселя без распаковки всего.
То есть никаких вложенных JPG/PNG/DDS, всё делается средствами одного формата.
источник

А

Алексей in Compiler Development
Mikhail Maltsev
Никто не запрещает: генерирование отладочной информации и оптимизация это независимые фичи. В некоторых случая проблема проявляется только в оптимизированном коде, и приходится отлаживать его.
как например сгенерировать отладочную информацию для переменной, которой тупо не существует к примеру, из-за того что оптимизатор её вырезал?
источник

AT

Alexander Tchitchigin in Compiler Development
Александр Вольнов
Почитал. Это формат архива, то есть там внутри в конечном счёте после распаковки и расшифровки будут файлы в различных форматах, которые MPQ рассматривает как чёрный ящик и то, как трактовать их решает приложение на основе его типа.
Я продумываю такой формат, который не содержит никаких чёрных ящиков и знает, какие данные он содержит вплоть до каждого пикселя изображения и вершины 3D модели и т.п.. Допустим, если файл хранит все данные игры, то можно будет подгрузить его, а потом написать
DataVoln::OpenFile("game.bdv").DeserializeExpr<Color>("Levels.MyLevelName.Textures.Metal.Pixels[42][42]");
И это выражение прочитает цвет пикселя текстуры с именем Metal, находящейся в уровне с именем MyLevelName в позиции x = 42, y = 42. И будет выполнен ровно тот объём вычислений, который нужен. То есть весь файл не будет расжиматься и декодироваться, если его структура позволяет прочитать данные пикселя без распаковки всего.
То есть никаких вложенных JPG/PNG/DDS, всё делается средствами одного формата.
источник

А

Антон in Compiler Development
Александр Вольнов
Почитал. Это формат архива, то есть там внутри в конечном счёте после распаковки и расшифровки будут файлы в различных форматах, которые MPQ рассматривает как чёрный ящик и то, как трактовать их решает приложение на основе его типа.
Я продумываю такой формат, который не содержит никаких чёрных ящиков и знает, какие данные он содержит вплоть до каждого пикселя изображения и вершины 3D модели и т.п.. Допустим, если файл хранит все данные игры, то можно будет подгрузить его, а потом написать
DataVoln::OpenFile("game.bdv").DeserializeExpr<Color>("Levels.MyLevelName.Textures.Metal.Pixels[42][42]");
И это выражение прочитает цвет пикселя текстуры с именем Metal, находящейся в уровне с именем MyLevelName в позиции x = 42, y = 42. И будет выполнен ровно тот объём вычислений, который нужен. То есть весь файл не будет расжиматься и декодироваться, если его структура позволяет прочитать данные пикселя без распаковки всего.
То есть никаких вложенных JPG/PNG/DDS, всё делается средствами одного формата.
Там если что мета есть, и это не черный ящик
источник

А

Антон in Compiler Development
Закинуть в мету рантайм - и вот что ты хотел
источник

MM

Mikhail Maltsev in Compiler Development
Алексей
как например сгенерировать отладочную информацию для переменной, которой тупо не существует к примеру, из-за того что оптимизатор её вырезал?
В теории: В DWARF описана виртуальная машина, отладочная информация для переменной будет представлять собой код для этой VM, вычисляющий значение переменной исходя из доступных значений. На практике это, во-первых, не всегда возможно, а во-вторых разработчики оптимизаций часто на это просто забивают. Так что оптимизатор всегда делает одни и те же преобразования, независимо от наличия отладочной информации, при это часть отладочной информации может теряться. В GDB вы увидите вместо значения переменной <optimized out>.
источник

А

Алексей in Compiler Development
Mikhail Maltsev
В теории: В DWARF описана виртуальная машина, отладочная информация для переменной будет представлять собой код для этой VM, вычисляющий значение переменной исходя из доступных значений. На практике это, во-первых, не всегда возможно, а во-вторых разработчики оптимизаций часто на это просто забивают. Так что оптимизатор всегда делает одни и те же преобразования, независимо от наличия отладочной информации, при это часть отладочной информации может теряться. В GDB вы увидите вместо значения переменной <optimized out>.
о как, не знал
источник

АВ

Александр Вольнов in Compiler Development
Пополню ими список того, что "убьёт" моя технология. Всё что существует - avro, parquet, protobuf, flat buffers, json, xml и т.п. вместе взятое покрывает от силы 10% того функционала, который будет в моём формате-языке. У меня будут:
1) Поля произвольной битности. Например, можно хранить монохромные картинки без оверхеда и кастомной логики на стороне приложения
2) вычисляемые поля - был сначала формат с полями A и B, в новой версии поле A убрали, ввели C и указали, что A = C*2. Старая версия программы сможет прочитать новый файл. Новая версия сможет прочитать старый файл. Совместимость в обе стороны. Или, к примеру, можно не хранить пиксели изображения совсем, а записать формулу вычисления каждого пикселя картинки. Программа сможет прочитать этот файл как картинку, не имея представления о том, хранится ли она в файле или считается по формуле.
3) формат можно использовать как язык для обработки данных - писать всякие map, reduce, filter, считать статистические функции над данными и делать другую обработку.
Вот такая идея. Большую часть уже продумал и выглядит, что это вполне реально сделать силами одного человека и умениями, которые у меня уже есть. Жду не дождусь, когда руки дойдут до реализации.
источник

AT

Alexander Tchitchigin in Compiler Development
Александр Вольнов
Пополню ими список того, что "убьёт" моя технология. Всё что существует - avro, parquet, protobuf, flat buffers, json, xml и т.п. вместе взятое покрывает от силы 10% того функционала, который будет в моём формате-языке. У меня будут:
1) Поля произвольной битности. Например, можно хранить монохромные картинки без оверхеда и кастомной логики на стороне приложения
2) вычисляемые поля - был сначала формат с полями A и B, в новой версии поле A убрали, ввели C и указали, что A = C*2. Старая версия программы сможет прочитать новый файл. Новая версия сможет прочитать старый файл. Совместимость в обе стороны. Или, к примеру, можно не хранить пиксели изображения совсем, а записать формулу вычисления каждого пикселя картинки. Программа сможет прочитать этот файл как картинку, не имея представления о том, хранится ли она в файле или считается по формуле.
3) формат можно использовать как язык для обработки данных - писать всякие map, reduce, filter, считать статистические функции над данными и делать другую обработку.
Вот такая идея. Большую часть уже продумал и выглядит, что это вполне реально сделать силами одного человека и умениями, которые у меня уже есть. Жду не дождусь, когда руки дойдут до реализации.
Т.е. Вы переизобретаете SQLite? 😃
источник

p

polunin.ai in Compiler Development
Александр Вольнов
Пополню ими список того, что "убьёт" моя технология. Всё что существует - avro, parquet, protobuf, flat buffers, json, xml и т.п. вместе взятое покрывает от силы 10% того функционала, который будет в моём формате-языке. У меня будут:
1) Поля произвольной битности. Например, можно хранить монохромные картинки без оверхеда и кастомной логики на стороне приложения
2) вычисляемые поля - был сначала формат с полями A и B, в новой версии поле A убрали, ввели C и указали, что A = C*2. Старая версия программы сможет прочитать новый файл. Новая версия сможет прочитать старый файл. Совместимость в обе стороны. Или, к примеру, можно не хранить пиксели изображения совсем, а записать формулу вычисления каждого пикселя картинки. Программа сможет прочитать этот файл как картинку, не имея представления о том, хранится ли она в файле или считается по формуле.
3) формат можно использовать как язык для обработки данных - писать всякие map, reduce, filter, считать статистические функции над данными и делать другую обработку.
Вот такая идея. Большую часть уже продумал и выглядит, что это вполне реально сделать силами одного человека и умениями, которые у меня уже есть. Жду не дождусь, когда руки дойдут до реализации.
Хрень. Все это уже есть в том или ином виде.
источник

IJ

Igor 🐱 Jirkov in Compiler Development
Александр Вольнов
Пополню ими список того, что "убьёт" моя технология. Всё что существует - avro, parquet, protobuf, flat buffers, json, xml и т.п. вместе взятое покрывает от силы 10% того функционала, который будет в моём формате-языке. У меня будут:
1) Поля произвольной битности. Например, можно хранить монохромные картинки без оверхеда и кастомной логики на стороне приложения
2) вычисляемые поля - был сначала формат с полями A и B, в новой версии поле A убрали, ввели C и указали, что A = C*2. Старая версия программы сможет прочитать новый файл. Новая версия сможет прочитать старый файл. Совместимость в обе стороны. Или, к примеру, можно не хранить пиксели изображения совсем, а записать формулу вычисления каждого пикселя картинки. Программа сможет прочитать этот файл как картинку, не имея представления о том, хранится ли она в файле или считается по формуле.
3) формат можно использовать как язык для обработки данных - писать всякие map, reduce, filter, считать статистические функции над данными и делать другую обработку.
Вот такая идея. Большую часть уже продумал и выглядит, что это вполне реально сделать силами одного человека и умениями, которые у меня уже есть. Жду не дождусь, когда руки дойдут до реализации.
А также этот язык можно транслировать в С и обратно, и компиляция Doom 3 занимает 0.4 секунды?
источник

p

polunin.ai in Compiler Development
Не вижу причин использовать то что вы предлагаете в третьем пункте, когда то же самое и даже больше предоставляет питон с scipy/numpy
источник