December 18th, 2009

glider

Аналоги 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 совершенно невообразимый, но меня соблазняет возможность заюзать качественные оптимизации и, возможно, реюзать один из бакэндов. В процессе еще отпишусь.
glider

OneNote и Sharepoint - часть 2

Продолжение предыдущего поста про ВанНоут совсем не радостное. Пытался я создать шаренный ноутбук на SharePoint 2010, но нифига не вышло - ни банальным New, ни забрасыванием на сервер файла *.onepkg, ни забрасыванием набора файликов-страничек *.one вместе с индексом *.onetoc2.

Лучший результат: ВанНоут умеет открывать и синхронизировать вручную заброшенные на сервер файлики *.one, но они помещаются в Misplaced Sections, так как ВанНоут не догоняет, к какому ноутбуку они принадлежат. Если же открывать onetoc2, то ВанНоут говорит, что не знает такого типа файлов. Гыгы.

Засабмиттил баг на форуме Technet: Having problem with storing notebooks in Sharepoint 2010 document library, но, судя по ответам, вроде бы при точно такой же конфигурации софта у народа все работает. Блин, надо разбираться.
glider

APL

Откопал прикольный документ: Notation as a Tool of Thought, в котором Кеннет Иверсон, создатель языка APL, рассказывает о своем детище на вручении ACM Turing Award 1979. АПЛ - абсолютно эпический язык, который по своей криптичности понравился мне с первого взгляда. Обязательно полностью почитаю этот док.

Вышел на этот креатив я через потс на кодебеттере A Programmer Pilgrim’s Progress, в котором автор пишет: "APL is interpreted which, combined with its unequaled power and economy of expression, enabled productivity such as had never been seen … and would not be seen until this century. While everyone else was presenting their boxes of 80-column cards to the guardians of the raised floor, hoping to squeeze in one or two runs per day, we were merrily tapping away at our terminals, cranking out several new applications a week".