Уверен, что не только я думал о том, как бы так исхитриться, и получить возможность компиляции старых исходников на си под winPhone. Пусть с некоторой потерей в производительности - главное тут, чтобы работало, и чтобы не требовалось вносить изменения в исходниках.
В голову пришла простая идея - а не сделать ли компилятор Си в байткод (хотя бы в тот же х86 или арм), а потом исполнять данный байткод? Конечно, страдает производительность, но зато универсально.
Погуглив, оказалось, что подобная идея пришла не только мне, и уже даже реализована. Но для явы, а не .NET -
emscripten. Совершенно не вникал в подробности их реализации (не люблю яву), так что данную идею реализовал по-своему, тоже взяв за основу LLVM:
Си-код компилируется в
llvm байткод с помощью
clang (это полноценный С/С++ компилятор, совместимый по ключам с gcc). Байткод - декомпилируется в C#-конструкции, выполняющие соответствующие команды. Функции LLVM = функции на C#. Все указатели - это индексы в массиве. Все регистры (а их в LLVM бесконечное количество) - локальные переменные. В LLVM нет никаких флагов процессора, то есть не требуется придумывать как бы по-оптимальнее их сэмулировать.
В моей реализации поддерживаются указатели на данные и на функции, структуры, юнионы, плавающая точка. Есть зачаточная libc (взял реализацию из
klibc). Не работает setjmp/longjmp, извращения типа goto (*адрес), С++ исключения. Если первое и второе реализовывать точно не буду, то об исключениях - думаю.
Как первый тест идеи - собрал
диггер не внеся в его исходники ни байта исправлений. Для его работы собрал SDL (вот в нем пришлось добавить свой код), и zlib (тоже без изменений в исходниках).
Архив приложен. Там готовый XAP файл + исходники, для желающих посмотреть во что превращается сишный код после трансляции в C#.
В SDL пока не реализован звук, систему реакции на кнопки надо переделать на более удобную. Сейчас управление сделано так: экран разбит на сетку 5х3 клеток. При тыканьи в каждую из данных клеток эмулируется нажатие одной из кнопок - стрелки, выстрел, выход. Какие кнопки где именно - найдете сами.
Сейчас вот думаю, что попробовать следующим собрать. Досбокс (тормозить, правда, будет), или на scummVM посмотреть?
Транслятор LLVM->C# не выкладываю. Пока что в нем есть простор для доделок и оптимизаций, да и базирован он на LLVM 3.1, которая еще находится в стадии бэты. Вот выйдет релиз 3.1, тогда посмотрим. Сырцы транслятора выкладывать не планирую.
Прикрепленные файлы
digger_sdl_src.zip ( 1.17 МБ )
Сообщение отредактировал mamaich - 06.12.11, 09:17