В вики обновлять не удобно — а тут закинул, шлёп и готово.
DM>Исходники компилятора не выкладываете? Компилятор на C# написан? Сколько строк примерно?
Примерно 108.000 LoC (в нем просто есть нереализованный пока задел на будущее (ибо сперва планировалось Phoenix SDK заюзать для бэкэнда, ибо с помощью него — можно и асм. но это такое @#$%^ще оказалось, что просто ппц, вспоминаю как кошмарный сон ), например, полный(!) парсер x86 асма с чеками параметров и кодогенерацией. нереализованный — изза некоторых gcc-style 'особеностей' LLVM ). Я просто не вижу смысла писать на чем-то другом, мне же быстрый и качественный результат нужен. тут — за 2.0 сек (на Intel Q9450, после ngen'а) он успевает скомпилировать 500Кб сырцов, вывести в файлы 4.1Мб промежуточного кода ( все стадии оптимизации\трансформации, для дебага ), а затем еще 7.3Мб LLVM-ассемблера и после всего этого сохранить 1.5Мб бинарь (такой большой изза debug-инфы + неоптимизированных метаданных, которых ОЧЕНЬ много).
Сырцы выкладывать не вижу смысла, ибо все задачи которые можно закодить — способен быстро выполнить самостоятельно (да и для тестирования\использования сырцы не нужны)
А всякое зло — такое как отвязать LLVM и сделать на шарпе собственный убер-оптимизационный фреймворк (например Phoenix SDK реверснуть) врятли кто-то из современных избалованных программистов поможет сделать
PS. в инсталлере есть сырцы классовой библиотеки ( которая шибко .NETовскую напоминает ), по ним сразу понятно, как языком пользоваться более продвинуто, чем в юнит-тестах.
~~Новый скриптовый язык для игр с генерируемыми биндингами~~
LUA и Python замечательно подходят для скриптов, единственный неприятный момент у меня был — создание биндингов. Используя API можно сделать шустрые биндинги, но с большей чреватостью ошибками (для среднестатистичекого прогера), чем скажем luabind/boost.python. тока эти два монстра заставляют компилер падать на колени из-за кучи раскрываемых шаблонов. Я где-то год назад начал писать свой компилер (для прокачки), синтаксис которого содран с C# и внесены некоторые фишки с С+, но код генерится в машинные команды (на данный момент в LLVM-asm) и нет сборщика мусора ( рефкаунт для классов — аналогичен boost::shared_ptr<T> ). И самое главное — биндинги в нем генерируются автоматически (только для С++)!
Кому интересно — смореть сюда http://code.google.com/p/bamelg/
После инсталляции увидите примерно здесь c:\Program Files (x86)\MindStrike Solutions\Bamelg\ проект с примером использования этого компилера.
Для запуска самого компилера нужен .NET 2.0 и выше. А для запуска использующего биндинги приложения — .NET не нужен(!)
Осуждения от ярых фанатов тех или иных языков предлагаю оставить при себе и предлагаю послушать мнения людей, которые хотели бы заюзать у себя какой-либо скриптовый язык, но все что они видели по каким-либо причинам чем-то им не нравится.
На данный момент есть:
* Базовые типы (byte/sbyte, short/ushort etc...), производные (ссылки, указатели, фиксированные массивы, динамические массивы) типы с фиксированным байт-ордером (short_littleendian/short_bigendian .. etc)
* Работа со строками
* Рефлексия, атрибуты
* Итераторы ( как в C# 2.0 )
* Шаблоны, с возможностью полной специализации
* Вычисления на этапе компиляции
* Генерация биндингов для С++
Re[6]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, meandr, Вы писали:
M>~~Новый скриптовый язык для игр с генерируемыми биндингами~~ M>А есть ли какие бенчмарки в сравнение м lua?
Разумеется нет, и не будет, оно и так должно быть понятно ибо за низкоуровневую оптимизацию отвечает LLVM, а благодаря статической типизации он может до смерти заоптимизировать полученный код (т.е. получить более быстрый чем проJITенный LUA/Python ).
+ есть дополнительные оптимизационные плюшки, вроде инлайнинга ( помечаешь атрибутом [Inline] метод — а ЛЛВМ его инлайнит ).
язык-то собственно далеко не скриптовый и весьма продвинутый, НО на нем можно писать и скрипты, и регенерирующиеся биндинги позволяют его быстро и эффективно встраивать в С++ код.
Re: ~~Новый скриптовый язык для игр с генерируемыми биндинга
Здравствуйте, gesman, Вы писали:
G>На данный момент есть: G>* Базовые типы (byte/sbyte, short/ushort etc...), производные (ссылки, указатели, фиксированные массивы, динамические массивы) типы с фиксированным байт-ордером (short_littleendian/short_bigendian .. etc) G>* Работа со строками G>* Рефлексия, атрибуты G>* Итераторы ( как в C# 2.0 ) G>* Шаблоны, с возможностью полной специализации G>* Вычисления на этапе компиляции G>* Генерация биндингов для С++
А почему ты называешь свой язык скриптовым? У тебя есть eval() функция?
Re: ~~Новый скриптовый язык для игр с генерируемыми биндинга
Здравствуйте, meandr, Вы писали:
M>Вы очень пероцениваете LLVM
Нет, не переоцениваю. API у них не отточенный, хотя много лет прошло, просто видимо профессионалы руку не прикладывали (да и не приложат =) )... Далее — куча мемликов в статиках, которые они не могут обнаружить, ибо пользуются валгриндом, вместо того чтоб денёк потратить под дебагом, скажем, в Visual Studio 2010. Для пущей уверенности еще и девпартнером разок прогнаться.
НО! Апишкой достаточно приятно пользоваться, в отличие, от скажем, GCC деревьев. Куча ассертов проставлена — тока наглючил\недописал\схалявил где-то, сразу по башке, это тоже жирный +.
Есть правда нюансы.. мне асм не сынтегрировать с LLVM, ибо у них в АПИ — есть только поддержка асмовых строк, оформленных в GCC-style. да кстати, GCCшка на вход гимпл принимать не умеет, а LLVMка свое IR умеет читать из файла, что есть большой плюс при дебаге. далее — не умеет собирать .exe/.dll/.dylib/.so и пр. (в clang'е это делается хаком — LLVMом генерится асм, по нему `gas` проходится, и по полученному — линкером, так что они немного гонят на офсайте )
Кстати, если сравнивать с Phoenix SDK, то последний — кал позорный. Не потому что MS, а потому что MS Research, там программистов адекватных видимо нету Дикий апи, который интуитивно вообще ни разу не понятен ( LLVMовский — тут же с ходу во все въезжаешь, что куда как и зачем ). тоже на офсайте круто все про него написано, а потом начинаешь узнавать приколы:
0. Не компонентно-ориентированная логика, т.е. совершенно не .NET стайле раскидана логика(и логика ли?=)). Среди разрабов этого проекта в MS Researh я видел индусов, что как бе намекаэ
1. *.exe шники не собрать. только интрументировать(!) можно. т.е. компилер должен уже с путой болванкой идти. допустим...
2. *.pdb шники, халявный дебаг... хрен! очень жёстко крошатся, если начать их активно генерить.
3. ОЧЕНЬ МАЛО ассертов. генеришь, генеришь код, и когда даешь команду скомпилить IR, где-то внутри эгзипшен (или несколько вложенных).
4. нет сырцов. учитываю ЛЮТУЮ глючность — они просто жизненно необходимы. Как сырцы для коммерческого игро-движка Torque =) Reflector слабо спасает, ибо у них CLI/C++ там ( а то и Managed вовсе).
5. 2х летняя давность последнего доступного CTP.
6. нет чтения из сырцов как в LLVM, т.е. отлаживать кодеген было жутко тяжело (ибо начинал компилер как раз с феникса). дампить умеет, а читать — фиг.
7. разные опкоды не поддерживаются, например 'Alloca'
8. дичайшее потребление памяти, т.е. пацаны, видимо, не обладают достаточными навыками программирования на .NET платформе.
Еще какие-то приколы были, но уже не помню, но кто хочет — может попробовать отыскать
Итог — LLVM это вовсе не так уж и плохо.
Re[2]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, Danchik, Вы писали: D>Может вам посмотреть на Squirrel ?
Я видел. И питон, и луа, и квейк-с и GameMonkey =) но посмотрите внимательно на примеры использования и промежуточные stage-файлы у компилера, и станет совсем понятно чем он от всех них отличается.
Здравствуйте, c-smile, Вы писали: CS>А почему ты называешь свой язык скриптовым? У тебя есть eval() функция?
Кхе-кхе, потому что на нем можно писать в т.ч. скрипты для игр (цитирую 'скриптовый язык для игр' ). Я его не называл динамическим, наоборот, писал что у него статическая типизация (см. выше).
Re[3]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, gesman, Вы писали:
CS>>А почему ты называешь свой язык скриптовым? У тебя есть eval() функция?
G>Кхе-кхе, потому что на нем можно писать в т.ч. скрипты для игр (цитирую 'скриптовый язык для игр' ). Я его не называл динамическим, наоборот, писал что у него статическая типизация (см. выше).
"Скрипты" для игр можно писать и на C/C++ и на том-же D. Да и вообще на всем что шевелится.
Родовым признаком скриптового языка является наличие eval() т.е. runtime содержит полноценный compiler.
У тебя оно есть такое? Собственно я это хотел спросить.
Re[4]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, c-smile, Вы писали:
CS>Родовым признаком скриптового языка является наличие eval() т.е. runtime содержит полноценный compiler.
Очень неоднозначный критерий ИМХО. В C# 4.0 есть eval(), а "полноценный compiler" входит в рантайм с самой первой версии. В то же время мне кажется, что C# — это не скриптовый язык.
Возможно, скрипт — это язык, который исполняется в особом sandbox-е, у него нет каких-либо средств, входящих ли в рантайм или в сам язык, которые подходили бы для решения универсальных задач, и sandbox нужно расширять специальным образом, чтобы добавить к скрипту функциональность, необходимую в конкретном случае. Как например, BOM/DOM для джава-скрипт. И, с другой стороны, WSH для него же.
Re[5]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Возможно, скрипт — это язык, который исполняется в особом sandbox-е, у него нет каких-либо средств, входящих ли в рантайм или в сам язык, которые подходили бы для решения универсальных задач, и sandbox нужно расширять специальным образом, чтобы добавить к скрипту функциональность, необходимую в конкретном случае. Как например, BOM/DOM для джава-скрипт. И, с другой стороны, WSH для него же.
Тогда ни питон ни руби ни перл не скрипты.
Re[6]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, FR, Вы писали:
FR>Тогда ни питон ни руби ни перл не скрипты.
С последними двумя знаком очень слабо, а вот по поводу питона у меня действительно большое сомнение, что это скриптовый язык. По-моему это обычный динамический интерпретируемый язык. Достаточно широкого применения, насколько позволяют его особенности.
Вообще если есть лучшее определение того, что из себя представляет скрипт, то буду рад выслушать.
Re[7]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, Воронков Василий, Вы писали:
ВВ>С последними двумя знаком очень слабо, а вот по поводу питона у меня действительно большое сомнение, что это скриптовый язык. По-моему это обычный динамический интерпретируемый язык. Достаточно широкого применения, насколько позволяют его особенности.
Я тоже так считаю.
ВВ>Вообще если есть лучшее определение того, что из себя представляет скрипт, то буду рад выслушать.
Нет, тема слишком расплывчатая
Re[7]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Вообще если есть лучшее определение того, что из себя представляет скрипт, то буду рад выслушать.
"Scripts" are distinct from the core code of the application, which is usually written in a different language, and are often created or at least modified by the end-user.
...
Scripting languages are nearly always embedded in the applications they control
Т.е. возможность быть modified by the end-user (что включает в себя наличие compiler и eval на борту) есть то что отличает скрипты от всего остального.
C/C++/D можно тоже использовать как скрипт но в этом случае приложение должно включать в себя дистрибуцию означенных компиляторов и runtime библиотек. То же самое и с .NET. Например VB не есть scripting language, а VBS уже есть скрипт т.к. VBS engine самодостаточен — и компилятор и runtime в одном флаконе и ему не требуется ни VB runtime ни .NET.
В принципе для скриптинга есть еще один критерий: поддержка interactive режима когда ввод строки с RETURN в конце вызывает непосредственную компиляцию/исполненние обновляя текущее состояние VM. Но это есть следствие наличие eval().
Re[8]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, c-smile, Вы писали:
CS>C/C++/D можно тоже использовать как скрипт но в этом случае приложение должно включать в себя дистрибуцию означенных компиляторов и runtime библиотек. То же самое и с .NET. Например VB не есть scripting language, а VBS уже есть скрипт т.к. VBS engine самодостаточен — и компилятор и runtime в одном флаконе и ему не требуется ни VB runtime ни .NET.
CS>В принципе для скриптинга есть еще один критерий: поддержка interactive режима когда ввод строки с RETURN в конце вызывает непосредственную компиляцию/исполненние обновляя текущее состояние VM. Но это есть следствие наличие eval().
Ну у Хаскеля и Окамла, которые вполне классические компиляторы есть вполне нормальный REPL, притом у Окамла его можно спокойно вкомпилировать и в конечное приложение.
Re[5]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Re[4]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Я думаю вы не правы, хотя бы посмотреть на печальный опыт гугла по встраиванию LLVM в питон (получися большой пук ). Там приросты в производительности прото копеечные, а так как в гугле вряд ли работают дураки(что исключает кокое то неправильное привинчивание LLVM), то LLVM вообщем то бе (много шума из ничего)
Posted via RSDN NNTP Server 2.1 beta
Re[6]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, meandr, Вы писали:
M>Re[4]: ~~Новый скриптовый язык для игр с генерируемыми бинди M>Я думаю вы не правы, хотя бы посмотреть на печальный опыт гугла по встраиванию LLVM в питон (получися большой пук ). Там приросты в производительности прото копеечные, а так как в гугле вряд ли работают дураки(что исключает кокое то неправильное привинчивание LLVM), то LLVM вообщем то бе (много шума из ничего)
LLVM просто заточен на компиляцию статически типизированных языков. А Питон таковым не является, поэтому его компилировать во что-то более быстрое, чем сам интерпретатор, очень сложно. Даже MS'овский IronPython, который через DLR какбэ компилится в IL и дальше, как-то не блещет...
Re[6]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, meandr, Вы писали:
M>Я думаю вы не правы, хотя бы посмотреть на печальный опыт гугла по встраиванию LLVM в питон (получися большой пук ). Там приросты в производительности прото копеечные
Ну вот пример скрещивания хаскеля с LLVM — по отдельным тестам прирост двукратный =)
Re[7]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Пока тянулось обсуждение, появились зачатки лямбда-экспрешшинов, даже с захватом контекста (но пока без overload resolution для методов =( над нам надо подумать будет, чтобы предпочитал выбирать конвертирование лямбды в функтор над конвертировнием в делегат и пр. )
Здравствуйте, gesman, Вы писали: G>как всегда, герой этого сабжа лежит здесь
Хм... Уж больно он на c# похож. Может, тебе стоит допилить его до определенного сходства с ecma-334 и обозвать имплементацией c# для llvm? Реклама будет.
Re: ~~Новый скриптовый язык для игр с генерируемыми биндинга
Здравствуйте, gesman, Вы писали:
G>Кому интересно — смореть сюда http://code.google.com/p/bamelg/ G>После инсталляции увидите примерно здесь c:\Program Files (x86)\MindStrike Solutions\Bamelg\ проект с примером использования этого компилера. G>Для запуска самого компилера нужен .NET 2.0 и выше. А для запуска использующего биндинги приложения — .NET не нужен(!)
а зачем ему NET?
он же с LLVM работает.
Re[2]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, night beast, Вы писали:
G>>Для запуска самого компилера нужен .NET 2.0 и выше. А для запуска использующего биндинги приложения — .NET не нужен(!)
NB>а зачем ему NET? NB>он же с LLVM работает.
См. выделенное.
Re[3]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, D. Mon, Вы писали:
G>>>Для запуска самого компилера нужен .NET 2.0 и выше. А для запуска использующего биндинги приложения — .NET не нужен(!)
NB>>а зачем ему NET? NB>>он же с LLVM работает.
DM>См. выделенное.
да видел я.
просто интересно, для LLVM биндинги на нет появились, или вручную формирует, и дальше llc вызывает.
Re[4]: ~~Новый скриптовый язык для игр с генерируемыми бинди
NB>да видел я. NB>просто интересно, для LLVM биндинги на нет появились, или вручную формирует, и дальше llc вызывает.
Нет, биндингов на НЕТ я не видел, да и чтоб прочувствовать что можно вытрясти из LLVM лучше их самому написать... тем более что у них частенько интерфейсы меняются — например дебажный, так что это еще позволяет быть в курсе вещей. щас (пару месяцев назад перерефакторили) он слизан с Phoenix SDK — каждая инструкция помечается тегом с метаданными с дебажной инфой ( а раньше вставлялись специальный debug-инструкции для отделения языковых статементов в ЛЛВМ коде). плюс такого подхода — отоптимайженный код можно будет дебажить.
llc вызывать не нужно — llc это CLI интерфейс к кодогенерирующим функциям LLVM'а. слинковался с LLVM — можешь делать что любая LLVMная тулза умеет.
Добавил полную поддержку X86 asm, для извращенцев (ассемблерные блоки разделены на блоки по фичам, блоки выбираются в рантайме). асм вреден, но полезен %) всё грамотно состыковано с остальными языковыми конструкциями, так бы в С++ былоб...
PS. к сведению, LLVM не умеет асм вставлять, только в gcc/AT&T-style да и то через &^$$%^#, т.к. потом эта строка в голом виде вставляется в асмовый листинг. а у меня все похакано и сделано, ы =)
Я им предложил сделать аналог DataInstruction из PhoenixSDK — которая есть блоб бинарных данных, в который асм прошит, + к ней указывается точки релокаций + register kill set, соответственно получаем поддержку для асма, но к сожалению Крис Латтнер с потрохами продался Apple'у и теперь у него другие приоритеты %)
кстати, асмовые блоки выглядят примерно так (решил тряхнуть стариной и пару простеньких функций накатать под разные процессорные фичи)
Re[5]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, gesman, Вы писали:
G>кстати, асмовые блоки выглядят примерно так (решил тряхнуть стариной и пару простеньких функций накатать под разные процессорные фичи)
Да очень скриптовый у тебя язык получается
Re[5]: ~~Новый скриптовый язык для игр с генерируемыми бинди
Здравствуйте, gesman, Вы писали:
NB>>да видел я. NB>>просто интересно, для LLVM биндинги на нет появились, или вручную формирует, и дальше llc вызывает. G>Нет, биндингов на НЕТ я не видел, да и чтоб прочувствовать что можно вытрясти из LLVM лучше их самому написать... тем более что у них частенько интерфейсы меняются — например дебажный, так что это еще позволяет быть в курсе вещей. щас (пару месяцев назад перерефакторили) он слизан с Phoenix SDK — каждая инструкция помечается тегом с метаданными с дебажной инфой ( а раньше вставлялись специальный debug-инструкции для отделения языковых статементов в ЛЛВМ коде). плюс такого подхода — отоптимайженный код можно будет дебажить.
понятно.
а можешь в кратце описать, какие бенефиты дает использование .Net по сравнению с C++?