12/03/2021, Alexander Tchitchigin¶
https://hal.inria.fr/hal-01499946/document “A modular module system”, Xavier Leroy
Утверждение, что (ML-style) система модулей не зависит от “базового” языка программирования, и может быть реализована почти для любого, а не только ML, широко известно и озвучивалось в литературе. Данная статья приводит конструктивное доказательство этого тезиса, реализуя такую (слегка упрощённую) систему модулей, в виде, явно параметризованном относительно синтаксиса и системы типов базового языка.
Несмотря на ряд упрощений по сравнению с системой модулей того же Standard ML, представленная модельная система содержит (и корректно реализует) все базовые возможности, включая структурную типизацию модулей, абстрактные типы, функторы, зависимость (типа) результата функтора от (типа) аргумента а также равенства между (абстрактными) типами.
All in all, module type matching resembles subtyping in a functional language with records, with some extra complications due to the dependencies in functor types and signatures.
Статья составлена в духе Literate Programming, перемежая пояснительный текст и реальный рабочий код на языке OCaml. Реализация системы модулей ML с помощью системы модулей ML отсылает к традиции метациркулярных интерпретаторов Лисп. Леруа выражает надежду, что такой способ представления материала не только не запутает читателя, но и дополнительно прояснит связь конкретного и абстрактного синтаксиса как и практическую полезность (и даже необходимость) всех возможностей представленной системы. (По-видимому, метациркулярность системы не оставила Лисперов равнодушными, что привело к появлению реализации MiniML с полноценной системой модулей на Scheme: http://wiki.call-cc.org/eggref/4/miniML 😊)
Для иллюстрации приводятся два примера “надстраивания” реализованной системы модулей над “упрощённым C” в качестве императивного (процедурного) базового языка и Mini-ML в качестве функционального, приближенного к используемым на практике, в частности, реализующего типы высших порядков (Higher-Kinded Types).
Кратко обсуждаются вопросы (модульной) компиляции таких модулей. Упоминаются три основных варианта: компиляция самих модулей в виде структур данных, а функторов — в виде (полиморфных) функций, специализация функторов для всех применений в духе C++ templates и полное стирание модулей во время компиляции (аналогично девиртуализации вызовов методов в ООП). Но за деталями интересующиеся читатели отсылаются к соответствующим публикациям.
В заключительной части Леруа обсуждает ряд расширений модельной системы модулей — как реализованных на практике, так и не до конца проработанных даже в теории — но уже без фактической реализации.
Таким образом, статья представляет собой практическое введение в ML-style системы модулей и связанные вопросы, полезное как для пользователей таких систем, так и для авторов языков программирования, желающих реализовать собственную систему модулей. 😊
#leroy #modules #classic #ocaml #sml
17/02/2021, Vladimir Kazanov¶
Распределение регистров и планирование инструкций - важные аспекты реализации бэкенда компилятора. Обе задачи NP-полны и связаны между собой: распределение может внести в код новые инструкции, планирование же меняет инструкции местами. Несмотря на это в популярных компиляторах решаются они, как правило, раздельно и используют эвристические подходы.
Последние два десятилетия много исследований было посвящено точным комбинаторным методам решения тех же самых задач: предложены методы на основе целочисленного программирования, PBQP, программирования в ограничениях и др. Слабость таких подходов - большое время поиска оптимальных решений, что заставляет исследователей упрощать задачу, делая методы неприменимыми в универсальных компиляторах.
Роберто Лозано (Roberto Castaneda Lozano) задался целью разработать одновременно точный и легкий в реализации подход, причем решающий задачи планирования инструкций и распределения регистров совместно. За основу он взял программирование в ограничениях (constraint programming), позволяющее удобно выразить условия обеих задач и для которого существуют мощные решатели.
Проект Unison заменяет три фазы LLVM: предварительное планирование инструкций, распределение регистров и финальное планирование. Распределение проводится глобальное, планирование же локальное - последнее упрощение дает ощутимый эффект при умеренной сложности.
В отличие от предшественников Unison не упрощает задачу распределения. Все практические аспекты проблемы учитываются в решениях: спиллинг, алиасинг (aliasing), рематериализация (rematerialisation), разбиение областей жизни переменных (live range splitting), слияние (coalescing) и др. Программирование в ограничениях позволяет выразить любые проблемы распределения регистров лаконично и просто.
Оптимальность имеет свою цену: поиск решений занимает много времени. Размер компилируемых функций - до 1000 инструкций. Наибольший эффект от Unison был показан на спецпроцессоре Hexagon с длинным машинным словом (VLIW), где важно оптимальное расписание: на некоторых тестах реальное время исполнения снижается на 40%.
Лозано предлагает использовать Unison как инструмент для порождения кода к спецпроцессорам, оценки эффективности эвристических решений, поиска оптимальных решений в отдельных функциях.
Презентация на конференции LLVM (2017): https://www.youtube.com/watch?v=kx64V74Mba0
Обобщающая исследования Лозано диссертация (2018 год): http://kth.diva-portal.org/smash/get/diva2:1232941/FULLTEXT01.pdf
Оценка производительности Unison (2017): https://www.diva-portal.org/smash/get/diva2:1119107/FULLTEXT01.pdf
Сайт проекта: https://unison-code.github.io/
Программирование в ограничениях: https://ru.wikipedia.org/wiki/Программирование_в_ограничениях
Программная статья от именитых исследователей (Nuno P. Lopes и John Regehr) о роли точных методов в будущих компиляторах: https://arxiv.org/pdf/1809.02161.pdf
#constraintprogramming #unison #registeralloc #instructionscheduling #llvm
13/02/2021, Alexander Tchitchigin¶
https://grosskurth.ca/bib/1997/cardelli.pdf “Program Fragments, Linking, and Modularization” Luca Cardelli.
Статья поднимает вопрос корректности раздельной компиляции и линковки, и потому — я считаю — обязательна к прочтению для всех авторов языков программирования! 😃
Уже во введении на простейшем примере создания воображаемой программы, состоящей всего из двух модулей, разрабатываемых независимо, автор иллюстрирует, наверное, все проблемы, при этом возникающие. Между делом Карделли упоминает публичные репозитории артефактов (типа Maven Central или Nuget. Напомню, что статья опубликована в 1996 году!). Многие из обозначенных проблем линковки раздельно скомпилированных модулей до сих пор не решены ни в мейнстримных, ни в исследовательских языках.
В качестве основного результата Карделли предлагает, вероятно, первую формальную модель раздельной компиляции и последующей линковки, позволяющую строго рассмотреть вопрос о корректности этих процессов. Корректность в этом смысле приведённой простейшей системы модулей для просто типизированного лямбда-исчисления (в качестве модельного языка) формально доказывается. Автор, конечно же, указывает на необходимость расширения модели как в сторону более развитых языков (параметрический полиморфизм, ООП), так и в сторону более сложных систем модулей (параметризованные модули, “функторы” в духе Standard ML, первоклассные модули). Существуют ли такие работы, непосредственно продолжающие это исследование, мне не известно.
Однако, в качестве related work и дальнейшего чтения могу указать на работы по формализации (и доказательству корректности) раздельной компиляции для языка C в рамках проекта CompCert.
#separatecompilation #modules #stlc #linking
07/02/2021, Vladimir Kazanov¶
На Хабре несколько дней назад появилась статья, популярно поясняющая знаменитую технику реализации языка Scheme - Cheney on the M.T.A. Статья излагает историю названия и объясняет работу остроумного подхода к сборке мусора.
Исходный код Scheme здесь сначала должен быть преобразован в представление с продолжениями (см., например, книгу Compiling with Continuations). Функции этого представления один к одному компилируются в функции на языке C. Многочисленные временные значения, характерные для Scheme, сначала размещаются на стеке вызовов C. Во время работы программы стек вызовов функций C будет расти, так как при компиляции с продолжениями функции не возвращаются к точке исходного вызова.
При превышении допустимого размера стек сбрасывается вызовом longjmp. Размер проверяется, например, через численное значение адреса временной переменной. Перед сбросом живые значения из стека перемещаются в кучу для зачистки алгоритмом Чейни, мертвые же значения отбрасываются автоматически.
Техника сильно упрощает компиляцию Scheme в C (например, рекурсивные вызовы и их оптимизацию, легко выражаются продолжения), из-за чего ее используют минимум два популярных компилятора: Cyclone и Chicken.
Статья на Хабре: https://habr.com/ru/company/ruvds/blog/540502/
Подробности реализации техники от разработчика Chicken Scheme: https://www.more-magic.net/posts/internals-gc.html
Реализация Cyclone: https://justinethier.github.io/cyclone/docs/Garbage-Collector
Оригинальная публикация по Cheney on the MTA: http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=3A988CF024FE807165D1CFA957445BC8?doi=10.1.1.54.7143&rep=rep1&type=pdf
Алгоритм сборки мусора Чейни: https://people.cs.umass.edu/~emery/classes/cmpsci691s-fall2004/papers/p677-cheney.pdf
Компиляторы, использующий другие подходы к компиляции в язык C:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.50.8424&rep=rep1&type=pdf - Bigloo - компилятор Scheme и Standard ML
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48.8788&rep=rep1&type=pdf - Gambit - компилятор Scheme
27/01/2021, Vladimir Kazanov¶
Распределение регистров - одна из старейших проблем построения компиляторов, первые работы по которой появились еще в 50-ые годы прошлого века. Как и в других NP-полных задачах недостатка в эвристических решениях нет. Тем не менее, в последние десятилетия разработчики все чаще используют один из двух глобальных подходов: линейное сканирование в динамических (JIT) компиляторах и раскраску графа в статических (AOT) компиляторах.
В своей диссертации Йозеф Эйсель (Josef Eisl) предлагает новый субглобальный подход к распределению регистров в динамических компиляторах, имеющий в основе следующие наблюдения:
-
Глобальные методы тратят много времени на редко исполняемый (холодный) код.
-
В современных динамически компилируемых языках после агрессивного встраивания функций (inline) появляются большие функции, где много холодного кода.
-
Крупные функции при глобальном охвате занимают много времени.
Выходит, что если сконцентрировать внимание алгоритма на горячих участках в ущерб холодным, то можно за то же время найти эффективное (или даже оптимальное!) распределение на отдельных важных участках кода.
В качестве важных участков Эйсель выбрал непересекающиеся последовательности базовых блоков - трассы (traces). Каждая трасса в зависимости от популярности получает свою политику распределения - быструю и неэффективную, долгую и эффективную, компромиссную или даже специализированную.
Интересно, что схожий подход уже применялся в трассирующих jit-компиляторах, но там трассы компилировались целиком, тогда как у Эйселя трассы выделяются только для распределения регистров.
Эйсель в сотрудничестве с Oracle реализовал подход в GraalVM, нового jit-компилятора для JVM, где тот показал сравнимую с актуальными версиями линейного сканирования производительность порожденного кода при меньшем времени РР. При этом распределение на трассах позволяет искать баланс между временем компиляции и производительностью распределения, а также открывает возможности для параллельной работы над трассами.
В настоящий момент код по умолчанию выключен, но доступен в Java версий от 10 и новее через опции
java -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler -Dgraal.TraceRA=true
.
https://ssw.jku.at/General/Staff/Eisl/papers/phdthesis.pdf
#trace #jvm #registerallocation #graalvm
13/01/2021, Vladimir Kazanov¶
BLISS - один из самых ранних портативных языков для системного программирования, первая версия которого (BLISS-10) была выпущена для PDP-10 еще в 1970-ом году. Наиболее широкое применение язык нашел во внутренних разработках компании DEC, где на BLISS вплоть до 90-х создавались компиляторы, операционные системы и низкоуровневые утилиты.
Но прославился этот язык благодаря версии для PDP-11, вышедшей в 1975 году. Компилятор BLISS-11 был на голову выше конкурентов вроде ранних компиляторов C и поражал воображение разработчиков (“we’d sit and chuckle at what it had done”). Реализацию описывали несколько диссертаций (одна из них - за авторством будущего основателя Adobe) и книга. Пример инновационности BLISS-11 - анализ жизни переменных в применении к глобальному распределению регистров.
Книга описывает собственный подход к анализу областей жизни переменных (потому что “no truly satisfactory solution exists in the literature”). Найденные области обозначались каждая двумя координатами в двухмерном пространстве. Координаты задавали вершины прямоугольников. Если области-прямоугольники времени жизни переменных пересекались, то такие области не должны были оказываться в одном регистре.
Каждая переменная получала рейтинг на основе расположения в коде (напр. глубины вложения циклов) и размера области жизни (меньше - лучше). Переменные сортировались по рейтингу, и за один проход одна за другой сопоставлялись с регистрами, если только при этом не случалось пересечения с уже сопоставленными с регистром переменными.
Позже эта проблема была сведена к NP-сложной задаче об упаковке в контейнеры; и в следующих версиях BLISS разработчики развили подход в семейство алгоритмов binpacking, к которым относится и популярный алгоритм линейного сканирования.
С закатом DEC зашла и звезда BLISS. Но в истории компиляторов реализация языка оставила значимый след: книга The Design of an Optimizing Compiler (1975) стала классикой, и без BLISS любое обсуждение истории компиляторов будет неполным.
Wulf, W.A., 1975. The design of an optimizing compiler.
Brender, Ronald F. 2002. The BLISS programming language: a history
#bliss #history #registerallocation
08/01/2021, Vladimir Kazanov¶
Некоторые разработки получают известность не в силу новаторских решений, а благодаря качественной инженерной работе и удобной сопроводительной документации. Пример - портативный компилятор lcc, ставший прообразом 8cc, chibicc, tcc и других свободно доступных небольших компиляторов.
Разработчики lcc задались целью сделать не просто полноценный компилятор языка Си, но еще и подробно документированный: проект написан в стиле “литературного программирования” Д.Кнута, когда код интегрирован в документацию (а не наоборот).
Более того, из такого “художественного” исходного кода можно собрать полноценную книгу, изданную под названием A Retargetable C Compiler: Design and Implementation. Вместе с книгой для разъяснения ключевых технических решений авторы опубликовали статьи, посвященные, например, распределению регистров и порождению кода.
lcc можно отнести к промежуточному варианту между простыми компиляторами, описываемыми в популярных книгах для программистов, и серьезными оптимизирующими компиляторами. Здесь есть внутреннее представление (лес ациклических графов внутри базовых блоков графа потока исполнения), используются отдельные популярные оптимизации.
Характерное для компилятора решение - распределение регистров. Оно локальное и восходящее, то есть проводится внутри базового блока проходом по списку инструкций. Регистры один за другим выделяются под значения до тех пор, пока не приходится искать значение для вытеснения в память. Вытесняются те значения, следующее использование которых в списке инструкций находится дальше всего.
В результате компилятор был портирован на множество платформ, стал основой для бесчисленных форков и даже использовался для скриптования популярного игрового движка id Tech 3 (см. Quake 3 Arena) компании idSoftware.
https://en.wikipedia.org/wiki/LCC_(compiler)
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.57.2519&rep=rep1&type=pdf
https://en.wikipedia.org/wiki/Id_Tech_3
#history #lcc #registerallocation
07/01/2021, Vladimir Kazanov¶
Самый ранний и задавший главные направления исследований в области компиляторов проект это, безусловно, оптимизирующий компилятор языка Fortran I. Работы над ним велись в середине 1950-х и примененные в компиляторе техники устарели, но, например, остроумный механизм распределения регистров продержался в Fortran еще много лет.
Распределение регистров в Фортране 1 проводится в два этапа. На вход первого этапа поступает список инструкций, использующих неограниченное число символьных регистров. Список разбивается на базовые блоки, то есть строится граф потока исполнения. При этом во всех ветвлениях (IF, вычисляемых GOTO) программисты на языке должны были сами (!) расставить вероятность перехода по каждой из ветвей. Вероятности впоследствии используются для моделирования частоты базовых блоков метдом Монте-Карло.
Во втором этапе, начиная от самого “горячего” из оставшихся необработанных блоков, строится регион, внутри которого будет проводится распределение регистров. Регион расширяется самым горячим из соседних базовых блоков до тех пор, пока не упирается в другие регионы или начало/конец графа. Специальным образом обрабатывается закольцованные регионы, то есть циклы.
Само выделение регистров происходит внутри каждого такого региона; при необходимости вытесняются регистры, наименее востребованные в оставшейся части региона (например, мертвые).
Материалы для интересующихся историей компиляторов:
https://www.cs.fsu.edu/~lacher/courses/COT4401/notes/cise_v2_i1/fortran.pdf - краткий современный обзор компилятора
http://archive.computerhistory.org/resources/text/Fortran/102663113.05.01.acc.pdf - оригинальная публикация 1957-го года.
#fortran #history #registerallocation
07/01/2021, Peter Sovietov¶
Next-gen Haskell Compilation Techniques
На мой взгляд, презентация интересна будет многим компиляторщикам. Автор приводит массу академических ссылок. В целом, речь идет о проблематике организации архитектуры современного компилятора. Мне, например, очень понравилась идея с использованием Datalog, которая дополнительно себя оправдала и с точки зрения производительности статического анализа.
06/01/2021, Peter Sovietov¶
И мой комментарий к комментарию https://t.me/plcomp/64 по “A Survey on Register Allocation”.
Статья-обзор по алгоритмам распределения регистров. Автор старается простыми словами объяснить на ходу базовую терминологию, чтобы читателю не пришлось на каждом шагу сверяться с другими источниками. В этом смысле содержание обзора можно было бы назвать доходчивым. Но, казалось бы, это не большое достижение – на тему распределения регистров есть разделы в известных учебниках, а проект LLVM, кажется, вообще закрыл эту тему для компиляторщиков, мол, бери готовое и не думай, как оно устроено.
А теперь перейду к сути. Fernando M Q Pereira, автор рассматриваемого обзора, один из признанных современных специалистов в области распределения регистров. F.M.Q. — автор передового алгоритма Puzzle Solving и даже имеет патент на него. Что касается самого обзора, то это, на мой взгляд, обязательное чтение для компиляторщика-профессионала, которого интересуют вопросы порождения целевого кода, особенно для нетрадиционных, неортогональных архитектур. И при всей своей внешней доходчивости это нелегкое чтение, требующее серьезной квалификации.
В обзоре рассматриваются как классические подходы, так и подходы передовые, специализированные. Передовые настолько, что в реализации LLVM вы их не встретите. Речь, например, о распределении регистров прямо в форме SSA, а также о более экзотических техниках, в духе PBQP.
Важно, что перед нами действительно научный обзор, поэтому автор не скупится на изложение важных теоретических результатов. На этот счет, в частности, есть очень ценный, заключительный раздел по NP-полным (современным!) результатам из области распределения регистров.
06/01/2021, Vladimir Kazanov¶
Размещение сотен промежуточных значений современных программ в десятках регистров типичных процессоров - одна из первых проблем, с которой столкнулись разработчики языков высокого яровня. Со временем было показано, что в общем случае задача распределения регистров является NP-полной, что предполагает множество эвристических и частичных решений.
“A survey on register allocation” - обзор темы РР на 2008 год с пояснением ключевой терминологи и перечислением наиболее эффективных подходов к проблеме.
Много внимания уделяется вариантам алгоритмов раскраски графа, линейного сканирования (linear scan) и перспективным на момент написания статьи альтернативным подходам (целочисленное линейное программирование, multi-commodity flow problem и др.).
В 2008 году все крупные компиляторы перешли к использованию внутренних представляний со статически однократным присваиванием (SSA). Поэтому естественно, что половина обзора посвящена рассмотрению полезных в РР свойств популярнейшего представления и адаптации ключевых алгоритмов к нему.
Интересно, что в обзоре почти не упоминаются легковесное локальное (внутри базовых блоков) РР и тяжелое точное РР; рассматриваются прежде всего популярные в больших промышленных компиляторах решения.
Материал написан доступно и явно ориентирован на введение в курс дела старшекурсников или аспирантов; автор не только разбирается в материале, но и умеет его донести.
http://compilers.cs.ucla.edu/fernando/publications/drafts/survey.pdf
29/12/2020, Peter Sovietov¶
Поздравляю читателей PLComp с предстоящими праздниками! Подведу некоторые итоги этого года.
-
Выход очередного, четвертого тома HOPL. https://t.me/plcomp/6 Замечательное, увлекательное чтение для всех, кто интересуется историей разработки ЯП.
-
Развитие подхода E-Graphs для создания систем оптимизации и синтеза программ. https://t.me/plcomp/8 Именно в этом году появились доступные реализации E-Graphs, в том числе и учебные. Следует ожидать постепенного внедрения подхода в компиляторы.
-
Практические применения SyGuS (синтаксически-управляемый синтез программ) в компиляторах. Для BPF (https://t.me/plcomp/51), для сетевых процессоров (https://dl.acm.org/doi/abs/10.1145/3387514.3405852) и для DSP (https://www.cs.utexas.edu/~bornholt/papers/diospyros-lctes20.pdf ).
В будущем году, надеюсь, мы в PLComp также сможем оперативно реагировать на основные события в компиляторной/языковой тематике. Пока же предлагаю “заглянуть в будущее”, посмотреть на работы предстоящих конференций.
-
ASPLOS 2021. https://asplos-conference.org/papers/
-
POPL 2021. https://popl21.sigplan.org/program/program-POPL-2021
-
CGO 2021. https://conf.researchr.org/info/cgo-2021/accepted-papers
17/12/2020, Peter Sovietov¶
Работа Strategic Tree Rewriting in Attribute Grammars заслуживает внимания попыткой объединения стратегического переписывания термов с атрибутными грамматиками.
https://www-users.cs.umn.edu/~evw/pubs/kramer20sle/kramer20sle.pdf
В последнее время интерес к забытым когда-то атрибутным грамматикам (АГ), похоже, вновь возрастает. Напомню, что АГ, формализованные Д. Кнутом еще в 1968 году, позволяют элегантным образом описывать задачи (статической) семантики и не сводятся только лишь к семантическим действиям какого-нибудь YACC. В случае АГ у нас, в общем случае, имеются как синтезированные, так и унаследованные атрибуты, позволяющие учесть контекст (это может быть, к примеру, таблица имен) при семантических вычислениях. Сами же вычисления могут производиться на графе, по готовности аргументов-атрибутов.
Существует ряд современных систем быстрого прототипирования DSL-компиляторов с использованием АГ, это, в частности, JastAdd, Kiama и Silver. В рассматриваемой статье система Silver (http://melt.cs.umn.edu/silver/ ) используется для реализации стратегий в виде атрибутов высшего порядка. Зачем это нужно? Дело в том, что на уровне стратегического переписывания тяжело работать с контекстной информацией. К примеру, классический подход от E. Visser предполагает динамическое создание правил в зависимости от контекста, что не назовешь элегантным решением. На уровне атрибутов с контекстом работать значительно удобнее, в то время, как преобразования программ выразительнее осуществляются с использованием стратегий.
В статье демонстрируется ряд примеров использования такого “смешанного” подхода, среди которых: оптимизация регулярных выражений на основе производных Бржозовского и нормализация for-цикла для Halide-подобного языка. Сложно сказать, насколько предложенный подход окажется успешным, но сама по себе система Silver в любом случае представляет интерес [1].
- Язык AbleC (расширение C11): http://melt.cs.umn.edu/ableC/
11/12/2020, Peter Sovietov¶
В среде компиляторщиков можно встретить утверждения в духе “SSA это функциональное программирование” и “в теории нет разницы между phi-функциями и базовыми блоками с параметрами”. С инженерной же точки зрения различия, все-таки, имеются. В заметке ниже показан пример этих различий со сравнением императивного и функционального подходов к разработке компилятора:
http://blog.ezyang.com/2020/10/the-hidden-problem-with-basic-block-procedures-in-ssa/
Добавлю, что нельзя сказать, что одно из этих представлений в общем случае лучше, чем другое, с точки зрения вариантов проводимого анализа (см. также https://news.ycombinator.com/item?id=24872752 ). Но, в целом, можно отметить тенденцию использования базовых блоков с параметрами в высокоуровневых IR и для межпроцедурных преобразований, а phi-функций – в низкоуровневых представлениях (вплоть до реализации мультиплексоров в описании генерируемой цифровой схемы).
01/12/2020, Alexander Tchitchigin¶
https://www.jeffsmits.net/assets/articles/sle20-paper4.pdf Gradually Typing Strategies
Статья рассказывает о применении популярной техники постепенной типизации (Gradual Typing) в необычной области – к языку переписывания термов Stratego (который используется для “program normalization, type checkers, program analyses, code generators, and more”). Несмотря на отсутствие проверки типов в Stratego до сего момента, он тем не менее послужил для вдохновения авторов Haskell фреймворка SYB.
Использование Gradual Typing (постепенной типизации) мотивировано двумя факторами. Первый – обратная совместимость, так как Stratego (в составе фреймворков Stratego/XT и Spoofax) используется в production-системах, разрабатываемых как в академии (researchr.org, conf.researchr.org, платформа онлайн-курсов TU Delft), так и в индустрии (где-то в недрах Oracle Labs). Второй – высокая “динамичность” переписывания термов, которая в некоторых случаях используется (а кто-то скажет “эксплуатируется”) для (временного) порождения нетипизируемых термов и превращения их обратно в типизируемые.
Дополнительно задача осложняется наличием в Stratego правил переписывания “высшего порядка” (называемых “стратегиями переписывания”), принимающих и применяющих другие правила переписывания (или стратегии). Отсюда возникает понятие Type-Preserving стратегий, реализующее ограниченную форму Higher-Kinded Types.
Кроме того, авторы применяют механизм “прозрачных” во время исполнения прокси-типов для того чтобы избежать накапливания лишних динамических преобразований типов при передаче правил переписывания из статически-типизированных стратегий в динамически-типизированные и обратно.
Проверка полученной системы типов на существующем проекте (учебный ассемблер для Java-байткода) продемонстрировала два достаточно ожидаемых результата: а) корректный динамический код написан так как если бы был статически типизирован, поэтому его легко аннотировать явными типами и почти не приходится при этом рефакторить; б) плохо протестированный динамический код содержит ошибки, которые легко обнаруживаются тайп-чекером (например, возврат списка вместо элемента — классика, сам на таком попадался).
#stratego #types #spoofax #gradual
27/11/2020, Vladimir Kazanov¶
Популярный алгоритм распределения регистров линейным сканированием (Linear Scan Register Allocation, 1999) определен на живых интервалах (live intervals) и линейном списке инструкций. Построение и хранение списка интервалов в виде пар индексов инструкций занимает время и память, поэтому исследователи продолжали искать возможность не строить явно список интервалов.
Авторы Efficient Global Register Allocation (2020) предложили алгоритм из того же семейства, но определенный на графе потока исполнения (control flow graph). Ключевые идеи здесь две:
-
Список живых интервалов здесь отслеживаются неявно, на каждом из базовых блоков и инструкций внутри блоков.
-
Проход по отдельным инструкциям позволяет не только не строить в явном виде интервалы, но и высвобождать временно регистры внутри блоков, что решает проблему “пустот в живости” (liveness holes).
Алгоритм сравним по производительности порожденного кода с актуальными реализациями линейного сканирования, немного выигрывая в ресурсах на этапе компиляции. Из работы следует, что основное преимущество подхода заключается в возможностях специальных оптимизаций.
В настоящий момент этот вариант линейного сканирования используется при порождении регистрового байткода dex для виртуальной машины ART, используемый в Android.
https://arxiv.org/pdf/2011.05608.pdf
#art #registerallocation #android #dex #linearscan
26/11/2020, Vladimir Kazanov¶
Распределение регистров - краеугольная задача любого порождающего машинный код компилятора. В работе Linear Scan Register Allocation (1999) был представлен один из двух популярнейших алгоритмов распределения регистров.
По сравнению с алгоритмами на основе раскраски графов алгоритм линейного сканирования отличается простотой в реализации, высокой скоростью работы самого алгоритма и эффективностью выходного кода. Авторы пишут, что даже простейший вариант алгоритма, представленный в публикации, порождает код, лишь немного уступающий в производительности алгоритмам на основе раскраски графов.
Благодаря своим свойствам алгоритм стал стандартным решением в динамических (just-in-time) и легковесных компиляторах.
Из известных компиляторов линейное сканирование используется, например, в luajit или Hotspot.
#linearscan #history #registerallocation
24/11/2020, Vladimir Kazanov¶
Классический редактор GNU Emacs в скором времени получит, наконец, нативный компилятор для своего языка расширений Emacs Lisp. Это уже третья попытка решить сопутствующие проблемы, но Andrea Corallo за последний год построил на базе libgccjit компилятор, показывающий достойный результат в пакете elisp-benchmarks. Уже сейчас компилятор готовится к вливанию в основную ветку репозитория GNU Emacs.
Презентация автора на Linux Plumbers Conference 2020: http://akrl.sdf.org/Kludging_LPC_2020.pdf
Дневник разработки: http://akrl.sdf.org/gccemacs.html
Обсуждение (в положительном ключе) состояния ветки репозитории: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=43725
12/11/2020, Peter Sovietov¶
(Это мой старый перечень, но интерес, как мне кажется, он все еще представляет) Ниже я хочу представить краткий список полновесных книг по специальным вопросам компиляции. Эти книги много дали лично мне. Надеюсь, они окажутся в соответствующий момент полезными и вам.
- Automatic Algorithm Recognition and Replacement. A New Approach to Program Optimization (https://mitpress.mit.edu/books/automatic-algorithm-recognition-and-replacement?cr=reset).
Тема распознавания алгоритмов очень мало изучена. Но перспективы здесь самые впечатляющие. Оптимизации на уровне алгоритмов, автоматическое распараллеливание и проч. Весьма вдохновляющее чтение.
- Reasoning About Program Transformations. Imperative Programming and Flow of Data. (https://www.springer.com/us/book/9780387953915).
Очень нетипичная книга по анализу и преобразованиям программ. Доходчиво написано, автор предмет понимает настолько глубоко, что не стесняется быть субъективным, оригинальным в изложении традиционной теории. Рассматривается в том числе полиэдральная модель программы.
- Instruction Selection. Principles, Methods, and Applications. (https://www.springer.com/us/book/9783319340173).
Такого подробного, эницклопедического обзора подходов к выбору инструкций не хватало давно. Автор систематизировал различные приемы, использовал в изложении исторический контекст.
- Partial Evaluation and Automatic Program Generation (https://www.itu.dk/~sestoft/pebook/).
В наше время все чаще на практике используются давние результаты Турчина, Футамуры, Ершова и других исследователей в области частичных вычислений/метапрограммирования. В какой-то момент, после прочтения очередной заметки в блоге с упоминанием проекций Футамуры (PyPy, Truffle и так далее), нелишне будет открыть и эту книгу, где подробно изложены все эти темы.
02/11/2020, Peter Sovietov¶
Очередная работа от John Regehr со товарищи на тему супероптимизации.
Dataflow-based Pruning for Speeding up Superoptimization https://www.cs.utah.edu/~regehr/dataflow-pruning.pdf
Заметно, как первая эйфория от полностью автоматического применения SMT-решателя и метода CEGIS уходит. Оказывается, для задач реалистичных размерностей все равно приходится придумывать если не полностью собственную процедуру поиска с учетом эвристик из предметной области, то хотя бы ее элементы – иначе SMT-решателю справиться будет тяжело.
Ключевая идея авторов – прежде чем передавать на вход SMT-решателю очередную программу-кандидат из пространства поиска, полезно эту недооформленную программу (описывающую целое семейство конкретных программ) проверить на соответствие спецификации с помощью абстрактной интерпретации (анализ потоков данных на предмет known bits, int. ranges и так далее). В том числе, на конкретных тестовых входах.
В завершающей части статьи есть краткий и полезный обзор современного положения дел в области синтеза программ.
01/11/2020, Peter Sovietov¶
Известно, что в компиляторе IR выбирается таким образом, чтобы облегчить порождение кода для выбранного класса целевых архитектур. Но бывает ли так, чтобы уже само абстрактное IR оказывало влияние на набор команд процессора? Оказывается, и такое существует, причем речь здесь не идет о предметно-ориентированном наборе команд или поддержке конструкций входного языка. Ниже два характерных примера.
BasicBlocker: Redesigning ISAs to Eliminate Speculative-Execution Attacks https://arxiv.org/pdf/2007.15919.pdf
В этой работе предлагается добавить к ISA процессора специальную команду, отмечающую начало линейного участка (basic block) с указанием его длины. Это нужно для предотвращения Spectre-подобных атак. Здесь мы видим, как черты абстрактного управляющего графа (CFG) проступают в машинном коде.
Hardware Acceleration for Programs in SSA Form https://pp.ipd.kit.edu/uploads/publikationen/mohr13cases.pdf
В современных компиляторах форму SSA стараются сохранять настолько долго, насколько возможно, включая и фазу распределения регистров. Тем не менее, в какой-то момент из формы SSA приходится выходить и выход это достаточно болезнен, поскольку требует формирования дополнительных машинных команд. Особенно это касается phi-инструкций, имитировать которые приходится с помощью команд, заменяющих параллельные копирования/перестановки регистровых значений. А если попробовать реализовать phi-инструкцию аппаратным образом? При этом вместо реального копирования часто можно обойтись перестановками, которые на аппаратном уровне заключаются в переименовании регистров. Здесь в ISA процессора появляются черты абстрактной phi-инструкции из формы SSA.
22/10/2020, Peter Sovietov¶
Очередной выпад в сторону классического подхода к преподаванию синтаксического разбора. Простое и изящное в части содержания пособие по написанию разбора арифметических выражений. Автор красиво и плавно приводит к идее использования рекурсивного спуска совместно с парсером Пратта.
Just write the #!%/* parser https://tiarkrompf.github.io/notes/?/just-write-the-parser/
На первый взгляд эта новость не слишком подходит для PLComp, но обращает на себя внимание личность автора (Tiark Rompf — один из лучших специалистов в области DSL-компиляции) и идеологическая спорность его подхода.
Действительно ли это правильный путь — перейти в обучении сразу к нюансам низкоуровневого кодирования, оставив за бортом вопросы формальной спецификации языка, его синтаксиса? Известные примеры реальных проектов, безусловно, говорят, мол, да, так оно и происходит на практике. И даже если есть спецификация, то она остается «на бумаге» и со временем расходится с реализацией все больше и больше.
21/10/2020, Peter Sovietov¶
Очередное подтверждение тому факту, что работа над компиляторами – это не только известные проекты-бегемоты в духе LLVM/GCC для 2-3 популярных архитектур и виртуальных машин.
Вы слышали о BPF? Впрочем, что я говорю, если читаете внимательно PLComp, то, конечно, слышали. Но, в любом случае, есть замечательная заметка, которая вводит в предмет:
BPF, XDP, Packet Filters and UDP https://fly.io/blog/bpf-xdp-packet-filters-and-udp/
Посмотрите, сколько всего интересного! Узкая предметная область, виртуальные машины, JIT-компиляция, статический анализ кода, верификация.
В заметке есть ссылка на хорошую статью 1999 года:
BPF+: Exploiting Global Data-flow Optimization in a Generalized Packet Filter Architecture https://andrewbegel.com/papers/bpf.pdf
Ничего себе, да? Такие-то технологии для, вроде бы, заурядной задачи фильтрации пакетов!
И вот кульминация, статья уже совсем свежая:
Specification and verification in the field: Applying formal methods to BPF just-in-time compilers in the Linux kernel https://unsat.cs.washington.edu/papers/nelson-jitterbug.pdf
Складывается ощущение, что BPF – своеобразный полигон для обкатки перспективных технологий компиляции. Это объяснимо: на исходный язык и вычисления накладываются жесткие ограничения, сама виртуальная машина простая – есть где развернуться и применить что-нибудь изощренное. И, разумеется, интересны перспективы использования BPF в специализированных аппаратных решениях.
P.S. Вообще, в области обработки сетевых пакетов компиляторные технологии в целом развиваются очень интересным образом, существуют работающие подходы из области синтеза программ и я к этой теме еще обязательно вернусь.
#bpf #analysis #verification #jit #vm
16/10/2020, Vladimir Kazanov¶
Обсуждения вокруг эффективности интерпретатора и компилятора LuaJIT не утихают в нишевых сообществах до сих пор, при этом сам автор развернутых пояснений так и не оставил. Отдельные его комментарии можно найти на Reddit и в рассылке lua:
http://lua-users.org/lists/lua-l/2008-07/msg00651.html http://lua-users.org/lists/lua-l/2010-11/msg00437.html http://lua-users.org/lists/lua-l/2011-02/msg00671.html http://lua-users.org/lists/lua-l/2011-02/msg00742.html https://www.reddit.com/r/programming/comments/hkzg8/author_of_luajit_explains_why_compilers_cant_beat/c1w8xyz/?context=3 https://www.reddit.com/r/programming/comments/badl2/luajit_2_beta_3_is_out_support_both_x32_x64/c0lrus0/
JIT #Lua¶
16/10/2020, Peter Sovietov¶
Пособие по реализации проверки для refinement-типов. В духе разработки компиляторов на основе техники nanopass. Предикаты проверяются с помощью SMT-решателя Z3.
Refinement Types: A Tutorial https://arxiv.org/abs/2010.07763 https://github.com/ranjitjhala/sprite-lang
08/08/2020, Peter Sovietov¶
Formulog – выразительный DSL для задач статического анализа. Основан на Datalog и ML, реализация использует SMT-решатель.
Formulog: ML + Datalog + SMT http://www.weaselhat.com/2020/08/07/formulog-ml-datalog-smt/
25/07/2020, Peter Sovietov¶
Детальный анализ трассирующего JIT-компилятора Lua
LuaJIT https://github.com/MethodicalAcceleratorDesign/MADdocs/blob/master/luajit/luajit-doc.pdf
JIT¶
03/07/2020, Peter Sovietov¶
Впечатляющая подборка материалов от серьезно настроенного исследователя.
По вопросам корректности компиляторов: https://github.com/MattPD/cpplinks/blob/master/compilers.correctness.md
По статическому и динамическому анализу: https://gist.github.com/MattPD/00573ee14bf85ccac6bed3c0678ddbef
По компиляторам в целом: https://github.com/MattPD/cpplinks/blob/master/compilers.md
26/06/2020, Peter Sovietov¶
Небольшая заметка на тему вопросов канонизации внутренних представлений в компиляторах. Тема затронута очень поверхностно, но даже в таком виде, думаю, заслуживает более пристального внимания со стороны компиляторщиков.
Canonicalization https://sunfishcode.github.io/blog/2018/10/22/Canonicalization.html
23/06/2020, Peter Sovietov¶
Два небольших доклада об инструментах статического анализа, основанных на Datalog.
DOOP https://www.youtube.com/watch?v=FQRLB2xJC50
Soufflé https://www.youtube.com/watch?v=Qp3zfM-JSx8
17/06/2020, Peter Sovietov¶
В рамках PLDI Alex Aiken (известный многим по курсам компиляторостроения) рассказал о проекте TASO – это автоматический синтез графовых оптимизирующих преобразований для нейросетевых фреймворков. Перечисляются все графы-шаблоны нейросетевых операций до фиксированного размера, между графами устанавливается соответствие с помощью Z3, преобразования графов программ происходят с помощью механизма отката и стоимостной модели. В целом, рассказ повторяет эту статью:
TASO: Optimizing Deep Learning Computation with Automatic Generation of Graph Substitutions https://cs.stanford.edu/~padon/taso-sosp19.pdf
15/06/2020, Peter Sovietov¶
Подход к выявлению “семантического клонов” в программе. Основан на насыщении равенствами и забытой концепции Programmer’s Apprentice. Утверждается, что работает лучше, чем популярное в этой области представление PDG.
Semantic Code Search via Equational Reasoning https://dl.acm.org/doi/pdf/10.1145/3385412.3386001
10/06/2020, alekum¶
Unsupervised Translation of Programming Languages Довольно любопытная статья на тему создания транскомпилятора от исследователей из Facebook AI Research. Путем тренировки модели, на корпусе программ из Github, транслируют код языков C++, Java, Python.
Авторы показывают, что их модель превосходит работы в данной области, основанные на подходе использования правил. Из интересного, прямой цитатой из статьи:
• We introduce a new approach to translate functions from a programming language to another, that is purely based on monolingual source code. • We show that TransCoder successfully manages to grasp complex patterns specific to each language, and to translate them to other languages. • We show that a fully unsupervised method can outperform commercial systems that leverage rule-based methods and advanced programming knowledge. • We build and release a validation and a test set composed of 852 parallel functions in 3 languages, along with unit tests to evaluate the correctness of generated translations. • We will make our code and pretrained models publicly available.
В видео можно послушать комментарии.
Paper: https://arxiv.org/pdf/2006.03511
Video: https://www.youtube.com/watch?v=xTzFJIknh7E&app=desktop
10/06/2020, Peter Sovietov¶
Авторы оценивают верхнюю и нижнюю границы вычислительной сложности статического анализа указателей Андерсена (APA) и приводят свои варианты реализации APA.
The Fine-Grained Complexity of Andersen’s Pointer Analysis https://arxiv.org/pdf/2006.01491.pdf
10/06/2020, Peter Sovietov¶
Автоматическое извлечение КС-грамматики на основе динамического анализа управляющего графа программы на примерах входных данных. Любопытно, что авторы не стали даже упоминать грамматическое сжатие.
Mining Input Grammars from Dynamic Control Flow https://publications.cispa.saarland/3101/1/fse2020-mimid.pdf
07/06/2020, Peter Sovietov¶
Любопытная заметка от Intel на тему использования внешнего решателя задач целочисленного программирования в LLVM. Речь идет об оптимальной расстановке команды LFENCE в управляющем графе. Это нужно для предотвращения LVI-атак.
An Optimized Mitigation Approach for Load Value Injection https://software.intel.com/security-software-guidance/insights/optimized-mitigation-approach-load-value-injection
ILP-решатель для автоматической вставки fence применяли и ранее. См., например, работу Don’t sit on the fence. A static analysis approach to automatic fence insertion: https://arxiv.org/pdf/1312.1411.pdf
07/06/2020, Alex¶
Опубликовано “Руководство по эффективному программированию на платформе «Эльбрус»”.
Это первая версия руководства, содержащая в себе общие сведения о платформе, описание важных оптимизаций компилятора и способы увеличения производительности. Кроме того, в нём содержатся сведения о наиболее распространённых инструкциях процессора, что официально публикуется впервые. Руководство позволит как ознакомиться с устройством самого процессора и сравнить его с популярными архитектурами, посмотреть как на практике решаются проблемы работы на нестандартной архитектуре.
Эльбрус - процессор общего назначения, разрабатываемый фирмой МЦСТ, с архитектурой на основе широкого командного слова (VLIW).
http://www.mcst.ru/elbrus_prog
05/06/2020, Peter Sovietov¶
Доклад Improving Compiler Construction Using Formal Methods (Jubi Taneja) Обзор работ по теме использования супероптимизатора Souper в различных фазах компиляции (статический анализ, автоматизация создания правил локальной оптимизации). https://www.youtube.com/watch?v=de8Ak0nY1hA
02/06/2020, Vladimir Kazanov¶
Сопоставление с образом (pattern matching) в наши дни упоминается прежде всего в контексте функциональных языков программирования семейства ML. Но техника эта имеет гораздо более широкое применение, в том числе и вне контекста разработки ЯП. Интереснейший из классических результатов - алгоритм Rete, позволяющий эффективно сопоставлять тысячи образов с тысячами же объектов.
Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem
01/06/2020, Alex Gryzlov¶
Очередная работа Мюнш-Макканьони по превращению Окамла в своеобразный конкурент Раста, черновик предложения о добавлении возможности работы с off-heap указателями:
Towards better systems programming in OCaml with out-of-heap allocation (draft) https://github.com/gadmm/RFCs/blob/interop/rfcs/interop.md
30/05/2020, Peter Sovietov¶
Использование рекомендательных систем для автонастройки компилятора, с учетом собранной ранее информации. Результаты внушают оптимизм. A Collaborative Filtering Approach for the Automatic Tuning of Compiler Optimisations https://arxiv.org/pdf/2005.04092.pdf
#autotuning #optimization #compiler #machinelearning
28/05/2020, Peter Sovietov¶
SSA в историческом контексте. Очень хорошая систематизация знаний по теме. Program Analisys and Transformation Survey and Links https://github.com/pfalcon/awesome-program-analysis
28/05/2020, Vladimir Kazanov¶
Синтаксический анализ программ считается давно изученной и почти даже скучной областью. Но при применении теории к практике текстовых редакторов часто выясняется, что привычные формализмы работают плохо и разработчикам приходится предлагать неординарные решения. В своей статье “SMIE: Simple Minded Indentation Engine” Стефан Монье излагает суть проблемы автоматического расставления отступов и описывает решение на базе грамматик с операторным предшествованием (operator-precedence grammars), используемое в Емаксе.
http://www-labs.iro.umontreal.ca/~monnier/smie.pdf
#editor #emacs #smie #indentation #parsing
27/05/2020, Peter Sovietov¶
Очень доходчивый и практико-ориентированный разбор одной из ключевых статей в области супероптимизации на основе метода CEGIS. Автор даже не поленился расшифровать формулы из статьи для тех, кто сторонится математической нотации. Synthesizing Loop-Free Programs with Rust and Z3 https://fitzgeraldnick.com/2020/01/13/synthesizing-loop-free-programs.html
26/05/2020, Peter Sovietov¶
Halide — яркий пример современного и популярного DSL для высокопроизводительных вычислений (обработка изображений, нейросети). В работе по ссылке ниже представлена его формальная семантика. Достаточная, по большому счету, для разработки собственного компилятора Halide. Любопытно, что в описании трансляции в императивное представление использован формализм из области синтеза программ. Formal Semantics for the Halide Language https://www2.eecs.berkeley.edu/Pubs/TechRpts/2020/EECS-2020-40.pdf
25/05/2020, Peter Sovietov¶
Любопытная работа по применению методов машинного обучения без учителя (Q learning) для разработки адаптивного сборщика мусора. Впрочем, полученные в статье результаты пока не очень впечатляют. Learned Garbage Collection https://arxiv.org/pdf/2004.13301.pdf
#garbagecollection #gc #machinelearning
23/05/2020¶
Интересное сравнение Rust и Haskell на поле написания компиляторов для функциональных языков, с ссылками на бенчмарки:
https://old.reddit.com/r/haskell/comments/gok70o/simple_haskell_is_best_haskell/frj9hty/
#fp #haskell #rust #compiler #education
22/05/2020¶
Возможно, вы уже слышали новость о древнем GW-BASIC. Компания Microsoft выложила исходники интерпретатора на github: https://devblogs.microsoft.com/commandline/microsoft-open-sources-gw-basic/
В заметке по ссылке есть одна интригующая фраза: “Microsoft was able to generate a substantial amount of the code for a port from the sources of a master implementation. (Alas, sorry, we’re unable to open-source the ISA translator.)”. И действительно, текст на языке ассемблера для 8088 был получен автоматически с помощью специального транслятора. При этом даже комментарии в коде остались нетронутыми, там речь идет, судя по всему, о 8080.
В статье из журнала Byte за 1982 год сравниваются возможности трех трансляторов, которые автоматически преобразуют код 8-битных процессоров 8080/Z80 для CP/M в 16-битный код 8088/8086 для MS-DOS: https://tech-insider.org/personal-computers/research/acrobat/8206-b.pdf
Особенно выделяется среди этих трансляторов XLT86 (8080 -> 8086) от компании Digital Research. Этот транслятор — детище Гэри Килдалла, о котором специально говорить, наверное, нет необходимости. В области построения компиляторов Килдалл известен своей работой A unified approach to global program optimization (1973): https://dl.acm.org/doi/pdf/10.1145/512927.512945
Статья Килдалла до сих пор находится в числе самых цитируемых по компиляторной тематике и речь идет об алгоритме анализа потока данных, который позже был описан во множестве учебников и применяется в самых современных компиляторах: http://compcert.inria.fr/doc-1.6/html/Kildall.html
Вернемся, однако, к XLT86. К счастью, сохранилась документация к транслятору: http://www.s100computers.com/Software%20Folder/Assembler%20Collection/Digital%20Research%20XLT86%20Manual.pdf
Из нее можно узнать, в частности, что:
- Трансляция состоит из 5 фаз.
- В начале определяются линейные участки и строится граф потока управления. Затем проводится глобальный анализ потока данных для определения “живых” регистров и флагов процессора.
- Сам процесс “выбора команд” элегантно описан табличным образом. Некоторые правила преобразований являются условными и зависят от ранее полученных результатов анализа потока данных.
- Транслятор написан на ЯП PL/I-80 и имеет ограничение на размер входной программы — не более 6 Kбайт.
21/05/2020¶
Особенно же интересными (субъективно, разумеется) событиями симпозиума по Лиспу оказались: доклад и семинар по передовому фреймворку (набор eDSL на языке Scheme) для быстрой разработки компиляторов Nanopass. По Nanopass как раз не хватало свежей, актуальной информации в авторском изложении.
Доклад The Nanopass Framework as a Nanopass Compiler Слайды: https://www.european-lisp-symposium.org/static/2020/keep-slides-keynote.pdf Видео: https://www.youtube.com/watch?v=lqVN1fGNpZw
Семинар Mixing Mutability into the Nanopass Framework Слайды: https://www.european-lisp-symposium.org/static/2020/keep-slides-workshop.pdf Видео: https://www.youtube.com/watch?v=wTGlKCfP90A
21/05/2020¶
Недавно (27-28 апреля, 2020) состоялся европейский симпозиум по Лиспу.
European Lisp Symposium https://www.european-lisp-symposium.org/2020/ Видеозаписи докладов: https://www.youtube.com/playlist?list=PLA66mD-6yK8yjlJCI0Ay2f2IvvmB9Ktga
Ниже краткая информация о 3 докладах по околокомпиляторной тематике:
Partial Evaluation Based CPS Transformation: An Implementation Case Study Описание компилятора для диалекта Лиспа pLisp. В компиляторе используются частичные вычисления и CPS. Слайды: https://www.european-lisp-symposium.org/static/2020/jayaprakash-slides.pdf Текст доклада в сборнике: https://www.european-lisp-symposium.org/static/proceedings/2020.pdf
LLVM Code Generation for Open Dylan Dylan — это диалект Лиспа с Алгол-подобным синтаксисом. В начале 90-х этот язык развивался компанией Apple. В докладе представлено описание генератора кода для Dylan на основе LLVM. Слайды: https://www.european-lisp-symposium.org/static/2020/housel-slides.pdf Текст доклада в сборнике: https://www.european-lisp-symposium.org/static/proceedings/2020.pdf
Later Binding: Just in Time Compilation of a Younger Dynamic Programming Language Краткий анализ компилятора LuaJIT Видео выступления: https://www.youtube.com/watch?v=FBk5XAEhu2s Текст доклада в сборнике: https://www.european-lisp-symposium.org/static/proceedings/2020.pdf
21/05/2020¶
На этой неделе появился официальный self-hosted дистрибутив функционального языка с зависимыми типами Idris 2.
На текущем этапе он использует в качестве бэкенда один из трех компиляторов Scheme: Chez, Racket или Gambit. Как и в первой версии Idris, есть инфраструктура для создания собственных бэкендов на основе нескольких IR c лямбдами (обычный LC, lifted форма, ANF, виртуальная машина с замыканиями).
https://github.com/idris-lang/Idris2/
Why is Idris 2 so much faster than Idris 1? https://www.type-driven.org.uk/edwinb/why-is-idris-2-so-much-faster-than-idris-1.html
20/05/2020¶
A Language for Describing Optimization Strategies Пример использования стратегического переписывания термов в духе Stratego. В статье демонстрируются оптимизирующие преобразования на Scala, для GPU и других ускорителей. https://arxiv.org/pdf/2002.02268.pdf
19/05/2020¶
Работа по синтезу программ с использованием Rosette (Racket). Cинтезируется JIT-компилятор DSL BPF (ядро Linux) в машинный код (в примере использован RISC-V) Synthesizing JIT Compilers for In-Kernel DSLs https://www.cs.utexas.edu/~isil/jitsynth.pdf
Подробности о BPF VM: BPF: A New Type of Software http://www.brendangregg.com/blog/2019-12-02/bpf-a-new-type-of-software.html
19/05/2020¶
Полезная ссылка для участия в спорах на тему, какой ЯП выбрать для реализации компилятора Comparing the Same Project in Rust, Haskell, C++, Python, Scala and OCaml https://thume.ca/2019/04/29/comparing-compilers-in-rust-haskell-c-and-python/
#python #cpp #haskell #rust #comparison #compiler #implementation #scala #education #ocaml
19/05/2020¶
Работы Ian Piumarta, участника проекта STEPS
Maru Миниатюрный расширяемый Лисп-подобный язык с компилятором в IA32-код. Использовался в проекте STEPS. Open, extensible composition models https://www.piumarta.com/freeco11/freeco11-piumarta-oecm.pdf STEPS Toward the Reinvention of Programming, 2012 Final Report http://www.vpri.org/pdf/tr2012001_steps.pdf
PEG-based transformer provides front-, middleand back-end stages in a simple compiler http://www.vpri.org/pdf/tr2010003_PEG.pdf Шедевр изящества и миниатюризации в области генераторов компиляторов.
19/05/2020¶
Femtolisp — минималистичный интерпретатор диалекта LISP. https://github.com/JeffBezanson/femtolisp Автор стал впоследствии работать над Julia. На femtolisp написаны лексер и парсер Julia.
18/05/2020¶
В стадии call for papers
Конференция по ЯП с управляемым кодом и VM MPLR 2020 Ноябрь 4-6, 2020 https://mplr2020.cs.manchester.ac.uk/index.php/mplr/call-for-papers
Симпозиум по ЯП и системам APLAS 2020 30 ноября 2020 https://conf.researchr.org/home/aplas-2020
18/05/2020¶
В Retrofitting Parallelism onto OCaml авторы разбирают технические решения и компромисссы Multicore Ocaml, основное внимание уделяя сборщику мусора: https://arxiv.org/pdf/2004.11663.pdf
#multicore #garbagecollection #ocaml #gc
15/05/2020¶
Необычный подход к построению PEG-подобного парсера на основе восходящего разбора. Pika parsing: parsing in reverse solves the left recursion and error recovery problems https://arxiv.org/pdf/2005.06444.pdf
14/05/2020¶
Две недавние статьи с участием Alessandro Warth. A. Warth — разработчик системы oMeta и автор известной работы по адаптации Packrat-парсеров для поддержки левосторонней рекурсии.
Incremental Packrat Parsing (оригинальная идея по использованию Pakrat-таблицы для реализации инкрементального разбора) https://dl.acm.org/doi/pdf/10.1145/3136014.3136022
Recognising and Generating Terms using Derivatives of Parsing Expression Grammars Использование производных Бржозовского в PEG-парсере для порождения предложений описываемого языка. Может использоваться в задаче тестирования компилятора (fuzzing). Но особенно интересно расширить эту идею на PEG с иерархическими структурами данных – и порождать тестовые примеры для них. https://arxiv.org/pdf/1801.10490.pdf
12/05/2020¶
О вычислительной универсальности PEG-парсеров. The computational power of Parsing Expression Grammars https://arxiv.org/pdf/1902.08272.pdf
12/05/2020¶
Program Analysis Свежий (весна 2020) курс по анализу программ, с неплохим выбором тем. https://cmu-program-analysis.github.io/
12/05/2020¶
Основные работы по методу насыщения равенствами (equality saturation)
Denali: A Goal-directed Superoptimizer (в работе описывается применение E-Graphs для задач оптимизации программ) https://courses.cs.washington.edu/courses/cse501/15sp/papers/joshi.pdf
Equality Saturation: A New Approach to Optimization (вместо E-Graphs используются PEG/E-PEG, поддерживающие управляющие конструкции) https://www.cs.cornell.edu/~ross/publications/eqsat/
“Доказательство свойств функциональных программ методом насыщения равенствами” (диссертация на русском языке) https://keldysh.ru/council/1/2017-grechanik/diss.pdf
11/05/2020¶
Работы по практическому применению передовых подходов E-Graphs (дедуктивный синтез программ) и Equality Saturation (решение для проблемы phase ordering).
Особенно интересно, что для серьезных примеров использования взяты области, далекие от традиционных целевых представлений компиляторов. Это показывает, что компиляторные технологии имеют более широкое применение, чем иногда принято думать.
Carpentry Compiler https://grail.cs.washington.edu/projects/carpentrycompiler/files/CarpentryCompiler.pdf
Synthesizing Structured CAD Models with Equality Saturation and Inverse Transformations https://jamesrwilcox.com/szalinski.pdf
Для работы с E-Graphs авторами разработана библиотека egg (есть веб-демо).
egg: Easy, Efficient, and Extensible E-graphs https://arxiv.org/pdf/2004.03082.pdf
https://github.com/mwillsey/egg
11/05/2020¶
Авторы экспериментального компилятора для Emacs Lisp на базе libgccjit опубликовали работу, описывающие основные фазы работы компилятора
Bringing GNU Emacs to Native Code: https://zenodo.org/record/3736363/files/GCCEMACS_proceeding.pdf?download=1
11/05/2020¶
Крупнейшая конференция по истории ЯП - HOPL IV - была перенесена, но некоторые интересные ретроспективные обзоры уже доступны:
The History of Standard ML https://smlfamily.github.io/history/SML-history.pdf
Evolution of Emacs Lisp https://www.iro.umontreal.ca/~monnier/hopl-4-emacs-lisp.pdf
History of Logo https://escholarship.org/uc/item/1623m1p3
The Early History of F# https://fsharp.org/history/hopl-final/hopl-fsharp.pdf
A History of Clojure https://clojure.org/about/history
A History of the Oz Multiparadigm Language https://www.info.ucl.ac.be/~pvr/hopl20main-p14-p-329dcad–final.pdf
Thriving in a Crowded and Changing World: C++ 2006–2020 https://www.stroustrup.com/hopl20main-p5-p-bfc9cd4–final.pdf
Остальные доклады: https://dl.acm.org/toc/pacmpl/2020/4/HOPL
11/05/2020¶
Programming Paradigms for Dummies: What Every Programmer Should Know Ликбез по основным принципам ЯП: классификация, вопросы представления состояния, конкурентности и параллелизма. https://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf
11/05/2020¶
CBS — система для описания компонентной спецификации ЯП. В каком-то смысле это аналог LLVM для формальной семантики. Идея в том, чтобы транслировать ЯП в элементарные, строго определенные конструкции, называемые funcons. https://plancomps.github.io/CBS-beta/
11/05/2020¶
Статьи по современным легковесным методам порождения кода
Destination-Driven Code Generation https://pdfs.semanticscholar.org/dcb8/8719880e1f76ad71fb1c5aebb118e2ecfe71.pdf
One-pass Code Generation in V8 https://github.com/eatonphil/one-pass-code-generation-in-v8/blob/master/One-pass%20Code%20Generation%20in%20V8.pdf
HotpathVM: An Effective JIT Compiler for Resource-constrained Devices https://static.usenix.org/events/vee06/full_papers/p144-gal.pdf
11/05/2020¶
Недавние конференции (статьи доступны)
CGO 2020 (порождение кода и оптимизация) https://cgo-conference.github.io/cgo2020/program/
СС 2020 (построение компиляторов) https://conf.researchr.org/program/CC-2020/program-CC-2020
PLDI 2020 (проектирование и реализация языков программирования) https://pldi20.sigplan.org/program/program-pldi-2020
HOPL IV (история языков программирования) https://hopl4.sigplan.org/track/hopl-4-papers#List-of-Accepted-Papers