ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Ковыряем новый движок (моддинг) | страница 12 |
|
|
|
Канал X Rebirth »
Модовый и скриптовый отсек X Rebirth: «Ковыряем новый движок (моддинг)» |
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
HikeR : |
на Lua действительно возможно полиморфное программирование
|
Lua тут не причём. Так работает (любой) JIT - он меняет код "самого себя" (т.е. интерпритатора). Нормальная сегментация запрещает выполнять данные и писать в код. А чтобы написать и запустить динамически сгенерированный код его нужно или записать в код, или записать данные и выполнить их. Добро пожаловать в современный мир.
HikeR : |
не, каких-то отличий нет. любой код для Lua 5.1 можно выполнить при помощи luajit вплоть до 2.0.2,
|
Речь про реализацию виртуальной машины. Вроде бы понятно из контекста, нет? Выполнить raw-bytecode для luajit на виртуальной машине lua невозможно, даже если вы сумеете загрузить в неё опкоды.
HikeR : |
1) если True была где определена раньше
|
Это я перевёл ваше
t[4] = t[3] and t[3] * 2 or "tru-la-la". Т.к. все участники - константы, то в байткоде они будут записаны как результат вычисления во время компиляции. Результат этот будет true или nil или, скорее всего, просто не скомпилируется. Ибо нельзя умножить nil на 2 (t[3] не существует).
HikeR : |
по остальному у меня совершенно противоположная точка зрения, поэтому не буду холиварить
|
Главное убедитесь, что у вас противоположная точка зрения к тому что написано, а не к тому, что вы прочитали
P.S. Подождите-ка, а откуда у вас
HikeR : |
не помню точно, но вроде как в скрипте detailmonitor это дело активно используется.
|
такие знания?
P.P.S. Всё даже намного проще чем я думал - luajit вообще не запаривается даже схлопывать объявления таблиц подобные. Что было сделано при инициализации, то идёт через TDUP. Остальное - ручками, ручками. А вот вложенные таблицы в конструктор не попадают - они тоже идут ручками. Аналогично со всякими странными (не строка, примитивный тип, инт или "номер") ключами - всё запихивается руками во время выполнения.
Не могли бы вы, как знаток луа, подсказать какой-нибудь реалистичный пример с вложенными функциями? Можно ли сделать функцию типа a:foo, только в конструкторе таблицы? Т.е.
Код: |
t = {
[1] = "blabla",
foo = function(x)
print(self[x])
end
}
|
(так не работает - говорит, что не знаю 'self')
P.P.P.S По сути весь декомпилятор сводится к написанию своей примитивной виртуальной машины, которая вместо выполнения будет просто печатать код. Sounds like a plan!
Последний раз редактировалось: Night Nord (13:47 21-12-2013), всего редактировалось 4 раз(а) |
|
|
HikeR
145 EGP
   Рейтинг канала: 4(57) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
Night Nord : |
чтобы написать и запустить динамически сгенерированный код его нужно или записать в код, или записать данные и выполнить их.
|
ок, no jit on consoles, вы открыли мне глаза, серьезно.
Night Nord : |
Выполнить raw-bytecode для luajit на виртуальной машине lua невозможно, даже если вы сумеете загрузить в неё опкоды.
|
ессно. тогда я не понимаю, что вы подразумеваете под "шаблонными таблицами", которых нет в обычной Lua.
Night Nord : |
Это я перевёл ваше
t[4] = t[3] and t[3] * 2 or "tru-la-la". Т.к. все участники - константы, то в байткоде они будут записаны как результат вычисления во время компиляции.
|
все намного проще, это "краткая" форма обычного сишного a?b:c. расшифровка на Lua:
Код: |
if t[3] ~= nil then
t[4] = t[3] * 2
else
t[4] = "tru-la-la"
end |
еще очень частая конструкция, обычно идет чуть ли не первой во всех .xpl-файлах
Код: |
Menus = Menus or {}
-- превращается дословно в:
if not Menus then
var = {} -- глобальная !!
end
Menus = var
|
когда игра загружает сейа, к примеру, то нельзя переинициализировать старые данные, вот так вот и проверяются.
Night Nord : |
Подождите-ка, а откуда у вас ... такие знания?
|
то что выдает luajit -bl ... вполне хватает для опознавания таких конструкций.
Night Nord : |
так не работает - говорит, что не знаю 'self'
|
немного изменю пример:
Код: |
t = {}
t[1] = "blabla"
t.x = "i'm the X!"
function t:foo1() print(self.x) end
function t.foo2(self) print(self.x) end
t:foo1()
t.foo2(t) |
эти две ф-ии равнозначны, но использование двоеточия для вызова метода просто автоматически передает первым параметром саму таблицу и обзывает её self. юзается обычно как замена классов и this (если планируется использование нескольких членов "класса")
Night Nord : |
какой-нибудь реалистичный пример с вложенными функциями?
|
с этим еще проще, я выкладывал шрифтовые и моделековырятельные скрипты, там активно юзаю костыль для бинарного чтения файлов
там вам и вложенные ф-ии, и переменные ) юзается примерно так:
Cкрытый текст (кликните здесь для просмотра)
Код: |
require("mod_binary_reader")
local r = BinaryReader
r:open(arg[1])
print(r:size())
local i32 = r:uint32()
local s16 = r:sint16()
local str = r:str(8)
r:close() |
для превращения его в полноценный класс не хватает пары строчек
|
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
HikeR : |
ессно. тогда я не понимаю, что вы подразумеваете под "шаблонными таблицами", которых нет в обычной Lua.
|
В raw-дампе, что делает luajit -b[g] blabla.lua blabla.xpl (.raw, .ljr, что угодно кроме .c, .h и .o/.obj) есть описания прототипов (читай - функций). В прототипе помимо собственно опкодов есть ещё upvalues (ссылки на переменные внешнего прототипа для closures) и разнообразные константы. Константы численные - вещественные или целочисленные, что не влезли в литерал - и всякие сложные - строки и таблицы (и ещё, почему-то, указание на то, что предыдущий прототип в стэке является дитём этого). Вот эти "константные" таблицы называются шаблонными в luajit.
Суть в том, что если у нас есть что-то вроде
Код: |
a = {
["foo"] = 1,
-- много всего --
["bar"] = 2
}
a.bar = 3
|
то таблица a в том виде, что она представлена в конструкторе (в фигурных скобочках) пойдёт как шаблонная и будет собрана во время компиляции байткода (посчитаны хэши, отсортированы поля и т.п.), а во время выполнения она попросту будет скопирована из констант (TDUP) и потом в ней будет изменено одно единственное поле - bar. Для больших константных таблиц (которые весьма часто встречаются в lua, т.к. его часто используют аля XML/markup/конфиг) это серьёзно ускоряет работу машины, ибо вся тяжёлая работа делаеться во время компиляции + уменьшает число аллокаций (размер таблицы известен заранее).
HikeR : |
все намного проще, это "краткая" форма обычного сишного a?b:c. расшифровка на Lua:
|
Да я вообще не про это, я про то, что a[3] не существует. Собственно попробуйте скомпилировать свой пример. Ладно, проехали.
HikeR : |
немного изменю пример:
|
И этим вы окончательно убили его смысл
Суть в том, что в шаблонные таблицы попадает только то, что в конструкторе. Эти t.x и t[1] - не попадают. Мне было любопытно, можно ли сделать функцию прямо в конструкторе так, чтобы она вела себя как функция с двоеточием. Из вашего примера я так понимаю, что можно - просто self надо указывать руками. В любом случае я уже выяснил, что в шаблонные таблицы попадают только простые типы - числа и строки. Всё остальное, включая странные ключи, идёт в момент выполнения.
HikeR : |
там вам и вложенные ф-ии, и переменные ) юзается примерно так:
|
Что-то я их там не нашёл. Вложенные - тобишь функция объявленная в функции, closure. Впрочем тоже неважно - я уже разобрался.
У меня уже есть полностью распарсенный дамп и вся дебажная информация - там есть всё-всё-всё, включая имена локальных переменных и аргументов. Плюс восстановил дерево прототипов корректно. Завтра попробую сделать продвинутый "дизассемблер" - т.е. тоже самое, что кидает -bgl, но с подробными описаниями, именами переменных, корректным порядком прототипов и описаниям констант (в т.ч. константных таблиц). Следующим пунктом будет получить AST (в основном для арифметических выражений), приписать его к строкам и сдампать в виде кода. К НГ у нас будет компилируемый Lua-код.
Единственное, что огорчает - не будет комментариев. Комментарии в raw-dump попросту не попадают. Максимум можно попробовать сохранить пустые места.
|
|
|
HikeR
145 EGP
   Рейтинг канала: 4(57) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
Night Nord : |
Вот эти "константные" таблицы называются шаблонными в luajit
|
я все-таки до конца хочу вникнуть, откуда такой термин взялся?
в обычной Lua все точно также происходит, какой-никакой, но некоторый анализ перед исполнением производится. для нее компилятор идет отдельно и тоже умеет показывать листинг (luac -l -l ...), кстати более "удобный", все константы и upvalues выводятся отдельным списком.
Night Nord : |
Да я вообще не про это, я про то, что a[3] не существует. Собственно попробуйте скомпилировать свой пример.
|
эта переменная лишь в том примере не существует. но таблица может жить внутри часто вызываемой ф-ии, которая извне меняет эту переменную. или файл с этим кодом будет вызван из другого файла, в котором такая таблица уже есть. никаких проблем с компиляцией не будет.
Night Nord : |
функция с двоеточием...
|
есть просто syntactic sugar, если быть до конца точным. также как #t => table.getn(t) или print"qqq" => print("qqq").
Night Nord : |
функция объявленная в функции, closure.
|
если вы про что-то типа этого
Код: |
function add(a)
return function (b) return a + b end
end
var = add(10)
print(var(2)) |
то оно чаще встречается в учебниках, чем в реальной жизни ;)
Night Nord : |
там есть всё-всё-всё
|
вы лучше скажите, что там есть сверх того, что дает luajit -bl
и для "тренировки на кошках" все же посоветую хотя бы jit\bcsave.lua из стандартной поставки (он же ui\core\Lua\jit\bcsave.xpl), есть исходник и полный комплект всех фишек, разве что сложной математики нет.
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
HikeR : |
я все-таки до конца хочу вникнуть, откуда такой термин взялся?
|
Из кода и вики luajit. template table. Вот даже в bytecode_2.0 в описании TDUP они так называются.
HikeR : |
вы лучше скажите, что там есть сверх того, что дает luajit -bl
|
Вложенность прототипов, константы (включая upvalues), имена локальных переменных (а не только глобальных) и описание биндингов ffi.
|
|
|
HikeR
145 EGP
   Рейтинг канала: 4(57) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
если кто не следит, то на оффоруме юзер arc_ почти добил до конца импорт/экспорт xmf-моделей через Collada DAE формат.
"почти" - потому что формат на самом деле до конца не разобран. некоторые значения, судя по экзешнику, даже не читаются, некоторые читаются, но не используются, однако зачем-то переодически меняются патчами.
версия arc_ — это "мусор" от кривого эгософтовского экспортера, он забил такие значения числом 0xCCCCCCCC и все вроде бы работает. но если заменить на 0x00000000, то работает не всегда
на данный момент у части моделей получаются совершенно невообразимые нормали и UV-координаты, но если их не трогать, то обратный импорт движком вполне переваривается (ошибка "двусторонняя"). остальные ограничения перечислены по ссылке.
про новые модели речи не идет, но уже можно попробовать (только попробовать!) заняться оптимизацией. я тут засел было за collision-модели бигшипов, сделал их, как положено, кубиками и шариками, дроны стали "биться о воздух" (то есть эффект заметен). но для сравнения нужно перелопатить слишком дофига моделей.
не забросили еще свою задумку?
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
Нет, конечно. Сегодня надеюсь закончить с дизассемблером - я на нём обкатываю логику определения имён переменных по слоту (надо скопировать логику из luajit'овской функции). Если сегодня добью, то запощу примерчик дизассемблирования Event Monitor.xpl
После дизассемблера получение собственно текста луа - элементарно. Получение текста луа схожего с оригиналом - чуть более сложно, надо будет повозиться с оптимизациями AST. За выходные надеюсь ударно добить.
Пока всё идёт по плану - к НГ должен быть уже всполне нормальный/читаемый код.
HikeR : |
...в целом и не требуется, достаточно чтобы "компилировалось" обратно без ошибок.
|
Ну да, но читаемость требуется как минимум
На данный момент есть вот такие результаты (осторожно, простыня!). Резолв переменных вроде уже работает нормально - есть пара косяков в циклах, но на них можно забить, ибо там всё достаточно жёстко определено и чем являются контрольные слоты и так понятно по контексту. В принципе уже видно, что и как надо будет схлопывать (MULTRES'ы и т.п).
Завтра уйдёт на написание построения AST и дампа его в lua, а вск (если всё сложится хорошо) - на написание тестов и отладку крайних случаев. После чего можно будет заняться прихорашиванием результата.
P.S. Пародоксально, но в некоторых моментах декомпиляция luajit даже проще lua. Lua делает всё честно, раскладывая каждую операцию на много примитивных инструкций, а luajit зачастую пытается скосить углы и делает специализированные инструкции на особые случаи. Например MULTRES в коде означает вложенные вызовы func1(func2(asd)).
Последний раз редактировалось: Night Nord (01:06 28-12-2013), всего редактировалось 3 раз(а) |
|
|
HikeR
145 EGP
   Рейтинг канала: 4(57) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
Night Nord : |
Получение текста луа схожего с оригиналом...
|
...в целом и не требуется, достаточно чтобы "компилировалось" обратно без ошибок.
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
Столкнулся с проблемами, основная из которых то, что я сижу в поезде и еду в Саратов. В поезде розеток нет и ноутбук сел - пишу с планшета На данный момент я сделал элиминацию слотов (временных переменных), так что код уже компактнее дизассемблера и с поддержкой арифметических выражений. Осталось реализовать поддержку логических выражений (сейчас они выглядят как куча вложенных ифов), elseif'ов и подправить алгоритм определения имен логических переменных - сейчас он теряет названия для всех переменных кроме последней если они были объявлены в одну строку. LuaJIT почему-то записывает переменные с началом блока видимости исходя из адреса макроинструкций, а не из реально выпущенных. Если смогу реанимировать завтра ноутбук, то залью последние изменения и запощу разбор Event Monitor'а.
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
Мда. "Место проклятое" ©
Задача была несколько недооценена. LuaJIT нарушает все возможные принципы компиляторостроения. Причём даром бы ради оптимизаций, а так зачастую байткод получается даже сложнее возможного...
На данный момент из такого получается вот такое (без дизасма).
Не обращайте внимание на --BLOCK - пока вставка пустых строк (и вообще толком форматирование) не реализовано так даже более читаемо (это просто техническая информация). slot* - это неиспользуемые переменные.
Собственно коммент "oh crap" в оригинале описывает, в чём проблема - вместо того чтобы посчитать значение выражения и сделать иф с этим выражением, luajit прям так и делает макароны из ифов. В результате давятся и разборщик ифов и разборщик выражений. Надо их как-то сливать...
На данный момент код выложен на гитхабе (ветка warps, скоро перелью в master, надеюсь) и уже насчитывает 5к+ строк питонячего кода.
P.S. А на Event Monitor'е он просто давится и дохнет ещё даже не доходя до этой стадии. Я уже пару testcase'ов дополнительных увидел, но видно там ещё что-то есть. Я пока особо не разбирался - сначала надо добиться, чтобы всё работало в простом случае.
Последний раз редактировалось: Night Nord (00:41 07-01-2014), всего редактировалось 1 раз |
|
|
HikeR
145 EGP
   Рейтинг канала: 4(57) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
а на недебажном байткоде работать будет?
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
Теоретически - да. От дебажной инфы зависит только маркировка слотов как локальных переменных. Без этой маркировки удалятель слотов может переусердствовать и нагородить огромных выражений там где было с десяток локальных переменных. Но практически он скорее всего просто где-то упадёт, ибо проверки на существование дебажной инфы особо нигде нет
Это есть в планах, но после того как всё остальное будет работать - там больше работы чем просто "не падать" - нужно ещё форматирование делать исходя не из номеров строк, а из общей логики. Может разбивать длинные выражения самостоятельно и т.п.
X:R'овые скрипты с дебажной информацией, так что для них это не принципиально.
P.S. Что делать с логическими выражениями я уже придумал. Надеюсь за сегодня добью логику и начну отладку уже на основе Event Monitor'а - там какие-то пробелемы с вложенными циклами и изменением байткода. Может вообще откажусь от изменений - больно опасная операция.
P.S.S. То что local не декомпилируются как local - просто маркировка присваиваний сломана после перехода на варпы.
Последний раз редактировалось: Night Nord (12:21 07-01-2014), всего редактировалось 2 раз(а) |
|
|
HikeR
145 EGP
   Рейтинг канала: 4(57) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
Night Nord : |
X:R'овые скрипты с дебажной информацией, так что для них это не принципиально.
|
это пока они с дебажной информацией. я как-то краем уха через Olly смотрел на инициализацию Lua state-ов и закралось подозрение, что при каждом вызове карты, менюшек, статистики и прочих гуев там каждый раз заново создаются эти самые state-ы (то есть загрузка/компиляция). отсюда дикие паузы и общая тупизна перед появлением каждого нового окна.
так похабно испортить неплохой, в принципе, Anark Gameface — это реально нужен талант
поэтому если у немцев дойдут руки до оптимизации гуя, то удаление дебаг-инфы — это первое что они сделают.
Night Nord : |
начну отладку уже на основе Event Monitor'а
|
если упор делается на всевозможные языковые конструкции, то за основу желательно брать то, к чему уже есть исходники (для сравнения), т.е. ранее упомянутое содержимое каталога jit. а если нужны только X:R-овские скрипты, то в них нет и десятой доли того, что вы там в парсере понаворотили ;)
несколько констант, несколько невложенных ф-ий и куча if-else. а уж навороченные циклы в гуе, по идее, вообще недопустимы.
p.s.
кстати, почему питон?
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
HikeR : |
поэтому если у немцев дойдут руки до оптимизации гуя, то удаление дебаг-инфы — это первое что они сделают.
|
Да вообще дебажная инфа никак на рантайм не влияет. Я думаю, что более вероятно то, что они наконец-то откроют исходники без всяких декомпиляций
HikeR : |
если упор делается на всевозможные языковые конструкции, то за основу желательно брать то, к чему уже есть исходники (для сравнения), т.е. ранее упомянутое содержимое каталога jit. а если нужны только X:R-овские скрипты, то в них нет и десятой доли того, что вы там в парсере понаворотили
|
Я перфекционист Понятно, что брать надо то, к чему есть исходники. Просто я переодически пытаюсь тыкать Event Monitor, в надежде что я уже доделал всё что было нужно. Но увы, пока не всё. Вот щас выяснил, что мой замечательный разбиратель выражений давится выражением в стиле (((x or y) and z) or xi), т.е. когда порядок выражений обратен порядку написания.
Компилятор у luajit'а однопроходный (как сказали бы англичане: Whhhyyyy???) и потому он всё генерирует в том порядке, что в коде. А потом спохватывается "ой, да у меня же тут порядок операций другой!" и начинает ковырять что было сзади и вообще подставлять костыли и подпорки. Поэтому результат такой, что плакать хочется.
Это, кстати, ответ на ваш вопрос - почему к luajit ещё нету декомпилятора. Потому что когда компилятор нормальный, то и декомпилятор написать несложно, даже не зная исходников (по факту я их смотрел только когда парсер байткода писал). А когда компилятор - набор костылей и подпорок к костылям, то и декомпилятор написать - задача нетривиальная. Даже зная исходники. Оптимизации тут, к сожалению, совсем не причём. Оптимизаций на уровне байткода нет практически никаких. Он даже if false не вырезает (сам if вырезает, а тело - нет). Собственно, никаких оптимизаций и нельзя сделать в однопроходном компиляторе.
HikeR : |
кстати, почему питон?
|
Ну луа-то я не знаю А питон знаком по работе, да и на нём можно набыдлокодить чего-нибудь довольно просто. Работает медленно, но тут скорость не важна. Я ещё мог на перле написать, но боюсь тогда было бы как с самим luajit - никто кроме автора даже и прочитать не может.
|
|
|
ss39
61 EGP
 Рейтинг канала: 1(6) Репутация: 2 Сообщения: 192
Зарегистрирован: 10.12.2013
 |
|
Кхе-кхе, извиняюсь конечно, за вопрос, не то, что бы шибко умный, но мне правда очень интересно знать: движок XR действительно новый или модифицированный от X3?
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
Новый, во многих местах принципиально. В некоторых - не столь принципиально.
Изменения:
1. Основаная логика захардкожена. Возможно дадут SDK, но не факт - Эгософты обещали, что новый движок ещё более модифицируем, но пока это не так. Впрочем обещанных "утилит" и "документации" (обещаны они были когда-нибудь после релиза) тоже пока нет, так что ждём.
2. Принциально изменена структура пространства - если раньше мир делился на "сектор" и "не сектор", то теперь он делится на "зона" (читай: старый сектор), "сектор", "кластер" и "всё остальное". Для каждого уровня свой алгоритм OOS поведения (чем дальше - тем проще). Причём теперь есть множество специальных секторов и зон особого назначения (например суперхайвей является отдельной зоной), которые разработчики во всю используют для сюжетных и прочих целей.
3. Добавлены хайвеи. Как ни странно это движковая фича, ибо на хайвеи завязана предварительная подгрузка данных - для каждой магистрали заранее рассчитан список видимых зон и последовательность их появления.
4. Изменена структура объектов - теперь все объекты модульные. Т.е. можно сооружать очень сложные вещи не нагружая очень сильно движок логики (т.е. без костылей вроде комплексов из X3). Это самый большой вин нового движка, имхо.
5. Ну в плане графики движок явно научился переваривать ранее невиданное число треугольников. В одном кадре X:R треугольников как во всём секторе из X3. Тормозит, правда В остальном без особых улучшений.
Из минусов:
6. Число активных объектов явно уменьшилось (во всяком случае пока что). Оттуда и сильный уклон в капитальные корабли и отсутствие возможности покупать истребители игроку. Небольшой флот истребителей как из Х3 (штук 100-200) рискует увеличить популяцию объектов во вселенной вдвое и размер сейва - втрое.
|
|
|
HikeR
145 EGP
   Рейтинг канала: 4(57) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
Night Nord : |
Да вообще дебажная инфа никак на рантайм не влияет.
|
влияет на время загрузки/инициализации, на потребляемую память.
я пробовал перекомпилировать все скрипты с отключением дебага, но это дало примерно такой же результат, как и замена всех текстур на одну единственную, то есть практически никакого
Night Nord : |
Поэтому результат такой, что плакать хочется.
|
это вы с человеческой точки зрения плачете, а для машины такой результат в порядке вещей. к тому же байткод — промежуточное представление, в котором любые оптимизации запрещены по определению (этот код должен потом работать на любой поддерживаемой архитектуре с разным порядком байт, к примеру). его задача быть быстро загружаемым и легко обрабатываемым, не более.
а вот когда начинает работать непосредственно ВМ, там одним проходом и не пахнет, есть и DCE, и развертка циклов, и перевод чисел в int-ы, и (о ужас) выключение проверок границ массивов.
Night Nord : |
почему к luajit ещё нету декомпилятора... когда компилятор нормальный, то и декомпилятор написать несложно
|
GCC - нормальный компилятор?
|
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
Сводки с фронтов:
Event Monitor (ну наконец-то!): https://gist.github.com/8325621 https://gist.github.com/8326391
С версии 1.18, емнип. Форматирование пока хромает, завтра исправлю.
Версия для ознакомления - там как минимум пока нету нормальных elseif'ов и local'ы не обозначены как таковые. Да и не компилируется оно - проблемы с таблицами, удалятель слотов переусердствовал. компилируется
(Обратите внимание на сей замечательный фрагмент - https://gist.github.com/8324494 - это я тестировал почему у меня падает декомпилятор на какой-то очень странной конструкции. Вроде как elseif, но не elseif. А оказалось это и есть elseif, только развёрнутый руками А вы - гуй тормозит...)
Цитата: |
в котором любые оптимизации запрещены по определению (этот код должен потом работать на любой поддерживаемой архитектуре с разным порядком байт, к примеру). его задача быть быстро загружаемым и легко обрабатываемым, не более.
|
Предрасчёт константых выражений, вырезание блоков, удаление неиспользуемых переменных - это всё тоже влияет на портируемость? Конечно нет. Не оправдывайте вы косость компилятора - ему и быстрым быть не нужно и простейших оптимизаций можно было бы сделать вагон. А сейчас его максимум хватает JMP -> JMP заменить на один JMP, да и то не всегда.
Слотов он плодит кучу лишних - а это, между прочим, прямая нагрузка на VM. Он даже elseif и else if по разному обрабатывает, что вообще нонсенс.
Но так кода было бы раза в два больше. А автор строки и символы экономит - куда ему ещё разделять синтаксический анализатор и ассемблер, вы что.
Промежуточность продукта (байткода) не есть оправдание кривой архитектуры.
Цитата: |
GCC - нормальный компилятор?
|
Лично не знаком, но емнип clang потому и начали делать, что GCC - устарел и оказался запутан. Он был написан во времна когда память ещё экономили и поэтому представляет из себя набор небольших трансляторов из одного формата в другой. Из-за этого огромное количество прослоек и постоянная потеря информации - в резульате с каждым усложнением стандарта даже выдать нормальную ошибку становится сложно, ибо зачастую информации просто нет. Поэтому там вагон костылей, чтобы информацию как-то добыть и рассчитать.
Но зато там всё чётко - лексер, синтаксический анализатор, ассемблер... В clang'е ещё лучше - там ещё и ассемблер разбит на три куска, один из которых сам llvm, который производит универсальные оптимизации байткода (не теряя его совместимости, между прочим).
Впрочем их декомпилировать проще, но получить что-то стоящее - сложнее, ибо очень много информации теряется. А так да, у luajit даже if false восстановить можно
Последний раз редактировалось: Night Nord (02:06 09-01-2014), всего редактировалось 6 раз(а) |
|
|
HikeR
145 EGP
   Рейтинг канала: 4(57) Репутация: 30 Сообщения: 886 Откуда: Великий Новгород Зарегистрирован: 20.09.2005
 |
|
Night Nord : |
Event Monitor...
|
это реально достижение, впечатляет. ждем local-ы, без них все довольно зыбко. ужасные вложенные if-ы, надеюсь, будут расово правильными if-elseif-else на "одном уровне"
Night Nord : |
Слотов он плодит кучу лишних - а это, между прочим, прямая нагрузка на VM
|
если под "слотами" вы понимаете обычные временные переменные, то никакой нагрузки они не вызывают. VM, в зависимости от архитектуры, создает и (пере-)использует их в памяти, на стеке, а то и прямиком в регистрах (в порядке уменьшения размера).
Night Nord : |
Промежуточность продукта (байткода) не есть оправдание кривой архитектуры.
|
довольно сильное заявление, но с примерами и вашим пониманием кривости лучше велкам в luajit-ную рассылку, будет интересно.
Night Nord : |
clang потому и начали делать, что GCC - устарел и оказался запутан.
|
clang - дитя копирастии, которой мешала gpl-ная лицензия GCC, загляните как-нить в список спонсоров проекта. в том же luajit все самые интересные и нужные фичи появились только после акции "утром деньги - вечером фича".
ничего не мешает взять и переделать GCC "правильно" хотя бы для одной архитектуры, но требование выложить это дело в паблик никогда не нравилось коммерческим конторам.
добавлено спустя 54 минуты:
-----------
клонировал master, сразу ошибка, что не так?
Код: |
d:\devel_src\ljd>python --version
Python 2.7.5
d:\devel_src\ljd>python main.py test.luac
Traceback (most recent call last):
File "main.py", line 28, in <module>
import ljd.rawdump.parser
File "ljd/rawdump/parser.py", line 8, in <module>
from ljd.util.log import errprint
File "ljd/util/log.py", line 17
print(fmt.format(*args), file=sys.stderr)
^
SyntaxError: invalid syntax |
Последний раз редактировалось: HikeR (04:51 09-01-2014), всего редактировалось 1 раз |
|
|
Night Nord
130 EGP
  Рейтинг канала: 2(15) Репутация: 16 Сообщения: 501 Откуда: Санкт-Петербург Зарегистрирован: 31.10.2013
 |
|
Вот более читаемая версия: https://gist.github.com/NightNord/8334382
Не все файлы ещё разбираются - падает, подозреваю на константах в выражениях. Есть ошибки в local'ах (много) и пара ошибок в выражениях с локальными переменными. Их исправление сложнее чем можно позволить в перерывах пока проект компиляется, поэтому это подождёт до вечера .
Цитата: |
если под "слотами" вы понимаете обычные временные переменные...
|
Слоты это и есть регистры. В регистровой машине не бывает временных переменных в понимании стэковой машины. Но зато, в отличие от стека, их фиксированное число и перевыделение очень дорого. Вот на верхнем уровне Event Monitor'а почему-то 76 регистров (адовый ... = nil в начале), хотя большая часть из них никогда не используется (может JIT себе подготовил место).
Вы вот лучше скажите - это нормально, что функции self.что-то = function используются на верхнем уровне? Там ещё везде используется upvalue private, но я не пойму где она определёна. Либо это нормально, либо что-то потерялось.
Цитата: |
клонировал master, сразу ошибка, что не так?
|
Вы верно указали версию питона. Нужен третий питон (3.3 пойдёт). Это в вашем виндовом мире python 3 не особо используется, а в нашем линуксовом про второй уже и забыли.
Последний раз редактировалось: Night Nord (17:02 09-01-2014), всего редактировалось 1 раз |
|
|
|
|
|
Канал X Rebirth ->
Модовый и скриптовый отсек X Rebirth: «Ковыряем новый движок (моддинг)» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Больше модеров в КСО - всяких и разных, дабы ни один пилот не остался необиженным! (Helga)
|
» Ковыряем новый движок (моддинг) | страница 12 |
|