xeno_by (xeno_by) wrote,
xeno_by
xeno_by

Аналоги LLVM для дотнета

Есть таск, который заключается в том, чтобы взять IL, заколбасить в нем несколько изменений, заоптимизировать его и скомпилировать в машинный код. Так как абсолютно не хочется руками писать работу с SSA, пропагацию констант и устранение мертвого кода (это программа-минимум, которую обязательно надо реализовать для конкретной задачи), то есть желание найти либу, которой можно скормить либо сам IL, либо некое его легко получаемое производное, а на выходе получить оптимизированный IR.

В unmanaged мире я таких библиотек знаю как минимум три - GCC, Open64 и LLVM, но 1) на плюсах писать совсем нет желания, 2) этот таск вкладывается в managed прилагу, так что при таком раскладе придется париться с интеропом, например, писать дофига пи-инвоуков. Вот к чему меня привели поиски менеджд-аналогов, которые на данный момент активно разрабатываются или доведены до релизного статуса:
  • Phoenix. Гигантский тул от Майкрософта (главная либа весит 8 метров, плюс супплементарные библиотеки составляют еще до 15 метров - это все не считая pdb). Либа пишется еще с 2002 года, когда команды разработчиков компиляторов объединили усилия в девелопменте унифицированной платформы, которая бы хостила IR и операции над ним, и позволяла бы непринужденно дописывать front- и back-энды для поддержки новых языков и платформ. Последнюю на момент написания поста версию скачать можно вот тут, можно почитать краткий обзор, а вот тут лежат хоть какие-то примеры использования.

  • CCI aka Common Compiler Architecture. Представляет собой результат внутренних разработок нескольких команд Майкрософта, которым нужно было средство для интеллектуального анализа и инструментации сборок .NET (например, для Bartok и FxCop). Хостится на кодеплексе в двух частях AST и Metadata, причем AST включает в себя метадату как svn:external, такчт ради любопытства можно ограничиться чекаутом лишь аста. С документацией дело обстоит немного лучше, чем у Финикса, да и сложность там не такая офигенная.

  • Компиляторы для полностью managed операционных систем. Оказывается, очень похожую на мою задачу решали создатели C#-only операционок. Обычной практикой для таких креативов является написание собственного AOT (ahead-of-time) компилятора, который преобразует IL в машинный код, который умеет исполнять операционная система. Здесь можно упомянуть MOSA, COSMOS и Singularity.
По лицензиям все обстоит следующим образом - Phoenix и Singularity это RDK, то есть их юзать можно только для фана (для Финикса еще в 2008м году обещали SDK для коммерческого использования, но пока что все остановилось), а все остальные креативы доступны нашару для коммерческого использования по лицензии MS-PL.

По функциональности. 1) В Финиксе реализована туева хуча алгоритмов для работы c IR, включая те, что мне нужны, плюс есть ридер и райтер IL-а, а также x86-бакэнд. 2) В CCI реализованы source (файлы), metadata (метаданные CLI) и code (AST кодярника) модели сборок дотнета, причем есть read-only и read-write режимы работы. Например, при помощи CCI можно декомпилировать IL, поменять что-ть в AST и записать результат обратно. К сожалению, нету ни средств анализа, ни средств оптимизации code model. 3) Из компиляторов операционок я смотрел только MOSA, и он меня приятно порадовал (есть IL -> IR, есть IR <-> SSA, есть dead code elimination), хоть и находится в весьма ранней стадии разработки.

Промежуточный вывод. Несмотря на то, чтo Phoenix - единственный closed-source проект из вышеперечисленных, я решил остановиться на нем. Слухи подсказывают, что несмотря на то, что последний SDK вышел 1.5 года назад, проект живет. API совершенно невообразимый, но меня соблазняет возможность заюзать качественные оптимизации и, возможно, реюзать один из бакэндов. В процессе еще отпишусь.
Tags: conflux, dotnet
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments