Если вы разбираетесь в компиляторах, машинных кодах, ООП и динамических языках типа смолтока, селфа, руби, ио (//vkontakte.ru/club3618361), я бы с удовольствием обсудил пути реализации адаптивной оптимизации Ио.
Ио — это чистый объектно-ориентированный язык с кучей очень интересных фишек и стандартных библиотек. См. //vkontakte.ru/club3618361
Исходные данные: в Ио есть объекты, наследование через прототипы, посылка сообщений с ленивым выполнением аргументов в произвольном контексте, динамическое переопределение любых методов в любых объектах и сопрограммы (coroutines), реализующие кооперативную многозадачность. Любое телодвижение в рантайме – это поиск слотов в иерархии прототипов и их активация (если это методы). Некоторые методы — нативные CFunctions, прилинкованные в сишном коде.
Требуется:
1) Проанализировать статистику вызовов в типичных программах: корректно построить графы вызовов с тем, чтобы воочию увидеть, что следует оптимизировать. Пока что могу предположить, что это поиск слотов глубоко в иерархии (следует понять, насколько глубоко и насколько эффективным будет их кеширование), а также повторяемые действия (создание locals и наполнение его слотами-локальными переменными на каждый вызов метода) и избыточные действия.
2) Если кеширование слотов будет давать ощутимый выигрыш, его нужно реализовать так, чтобы минимально расходовать память.
3) Если будет возможно избавиться от избыточных действий, то имеет смысл ввести байткод, в терминах которого находить излишние команды и подсчитывать количество машинных циклов. В настоящий момент виртуальная машина оперирует передачей структурированных сообщений, по сути, интерпретируя AST (abstract syntax tree).
Если вы — тот человек, который примерно понимает суть проблемы и может подсказать какую-нибудь полезную информацию, свяжитесь со мной: Олег Андреев, oleganza@gmail.com, skype://olegandreev1986. Еще я обитаю на каналах #io и #io-ru на сервере freenode.
Спасибо.
16 августа 2008 в 2:00
Не, к байткоду Си# претензий нет. Просто сам по себе байткод ничего не даст. Нужно начать с продумывания кода специально для Ио, который потом можно транслировать в байткод LLVM, JVM, CLR (.NET) и т.п. А иошный байткод использовать для анализа.
15 августа 2008 в 22:01
Мда, если не знать С++, то ИМХО лучше Си и не выпендриваться =) Уважаю.
А почему такое отношение к байт-кодуу С#? По каким критериям он не подходит? О_о Свою машину написать не так просто.
15 августа 2008 в 7:03
а как насчет LLVM, C– или Parrot?
14 августа 2008 в 21:05
Граф еще не построил. Интерпретатор на аккуратном Си уже есть (Си++ там ничего особо полезного не сделает).
Байткод для сишарпа быстрее выполнение не сделает, скорее, наоборот. Для Ио имеет смысл разработать свой компактный байткод, на котором описать способы оптимизации.
14 августа 2008 в 21:00
Ну чего, построил анализ графа вызовов, как обсуждали? Ккие результаты? Выкладывай, интересно.
А по поводу байт-кода – есть два пути:
1) реализовать собственный интерпретатр (или транслятор, не суть) на С++ (учитывая простоту io)
2) использовать байт-код и машину C# (Mono в *nix) – C# машина поддерживает рефексию, в отличие от других
Чо скажешь?
18 июля 2008 в 21:05
0) //vkontakte.ru/club3618361
1) iolanguage.com
2) три статьи у semka: //habrahabr.ru/blog/crazydev/45584.html (это третья)
3) #io, #io-ru на irc.freenode.net
18 июля 2008 в 21:03
А можно про очень интересные фишки немного поподробнее?
17 июля 2008 в 20:03
Интерпретатор собственный. Для того, чтобы рассматривать LLVM нужно разработать опкоды. Сходу это сделать не получится из-за особенности вычисления аргументов сообщений (они не вычисляются перед посылкой). Вполне возможно, что я упускаю какие-то простые вещи из внимания…
Выносить медленные методы в Си — другая история, не всегда интересная. Но вариант RubyInline для Ио все же будет полезен (сейчас вообще экстеншины можно класть только в папку с дистрибутивом).
17 июля 2008 в 18:01
В Io свой собственный интерпретатор?
Есть ведь проекты, реализующие эффективные интерпретаторы: LLVM, Parrot (на счет последнего — не знаю, как там со статусом, может, вообще ничего не готово).
Есть еще другие штуковины — SquirrelFish и Tamarin (хорошие интерпретаторы JS). Думаю, можно их приспособить и к Io. SquirrelFish, к примеру, использует прямой jmp по таблице опкодов, почти как в настоящей нативной программе.
Если, конечно, невозможно реализовать Io как front-end к одному из существующих интерпретаторов… Тогда, может, вынести особо медленные функции в Си? (Почему-то такой подход мне кажется самым простым)
17 июля 2008 в 18:01
И да, еще такой "ценный совет" — может, спросить на RSDN или gamedev.ru? Там водятся очень хорошие программисты, которые могут помочь.
17 июля 2008 в 13:04
В рамках бизнес-задачи.
17 июля 2008 в 11:04
Интересная тема. Вы в рамках дипломного проекта делаете?