Как стать автором
Обновить
0
0
Alexander @joedm

Пользователь

Отправить сообщение
Понятно, спасибо. Я искал через общие настройки.
Можно как-то отключить javascript на определённых сайтах? Я почему-то не нашёл этого в настройках. Плохо искал?
Вопрос: может я просмотрел в статье, вы Поросёнка для себя как академический проект делаете или это отражение вашей работы?
libjit я рассматривал, но у меня от него тогда остались какие-то противоречивые ощущения. Может, сейчас что-то там изменилось, давно не заглядывал.
Да не за что. Будут вопросы — обращайтесь. А я попробую выделить время на статью.
Увы, в архитектуре особенно не разгуляешься. Например, обратная совместимость, так её разэтак — в общем, там всё сложно.
И да и нет. Была попытка сделать jit-компиляцию при помощи LLVM, но компиляция получилась настолько медленной, что выигрыш в производительности нивелируется временем на разогрев. Поэтому пока этот проект отложен и скорее всего будет продолжен уже как AOT-компилятор либо как second tier для templated jit.
Плюс рассматривается возможность применения JitBuilder/OMR от J9 — это вообще родственная душа. :)
Это-то и хорошо, что он много чего делает с IR. К тому же, можно рулить тем, что делать, а что не делать. Потом, можно допилить, если он чего-то делает не так. Как сам LLVM, так и сделать свой LLVM pass.
На чистом асме было бы, конечно, здорово. Однако интерпретатор довольно большой и сложный. К тому же у нас три разных архитектуры, умножьте на два для 32-бит версий и вот уже слишком дофига кода.
В случае с LLVM IR — это и есть тот самый портативный асм, и весь код интерпретатора в одном месте.
Что не получилось, так это заставить LLVM использовать %rsp. Почему, потому что сама концепция LLVM не подразумевает использование понятия «стек» и в IR нет вещей для явной работы со стеком (за исключением пары интринсиков, добавленных по просьбам трудящихся). К тому же, в реализациях для платформ стековый регистр настолько прибит гвоздями, что оторвать его — очень трудоёмкая задача.
Вы мыслите в правильном направлении. :) Нужно что-то «повыше» ассемблера и «пониже» С. Для этих целей отлично подходит LLVM IR.
Я очень долго боролся с С за интерпретатор, пробовал всякие варианты — в том числе и аналог «трасс», замешанный с continuation passing style. Лучшее, что получилось — это threaded code с прибитыми регистрами.
И после некоторых упражнений с LLVM я понял — это то что надо. В итоге наш новый VA Smalltalk содержит интерпретатор, написанный на LLVM IR. :)
Собирался написать об этом статью тут, но решил, что мало кому будет интересно.
Я понимаю ваши опасения, но быстрый интерпретатор целиком на pure С вы не напишете. Так или иначе придётся применять«плохие» решения. И, поверьте, pinned registers — это довольно близко к золотой середине. Повторюсь, главный недостаток этого — уменьшение кол-ва доступных GPR для компилятора.
Вы попробуйте ради спортивного интереса.
Можно было бы также задействовать %rsp для стека VM, но во-первых, gcc не даст его закрепить, во-вторых, даже если его инициализировать принудительно через ассемблер, то gcc не обучен таким извращениям и не будет использовать стековые инструкции.
Читатель iliazeus предложил еще одну оптимизацию: кеширование вершины стека в отдельной переменной.

А если её ещё и в регистр прикрепить вместе с ip — совсем летать будет:
register uint8_t *ip asm("%r14");
register uint64_t *stack_top asm("%r15");

Использовать осторожно (особенно в x86_32) — эти регистры всегда будут заняты, их аллокатор не трогает вообще.
Blackberry выпускает с аппаратной клавиатурой.
Пособолезнуйте и мне тоже — у меня в машине китайская магнитола на 4.2. Естественно, обновлять ПО в которой никто не собирается.
Чуть выше выложил видео, посмотрите. Монстр там ни при чём. ;) Баг в игре связан со спецификой обработки движения игрока.
А секрет это да, только ради секрета.
У автора видео тоже не оригинал — в оригинальной игре узнать сколько ты открыл секретов можно было только выйдя с уровня.
Короче, вот как-то так, без всяких читов и монстров.
vimeo.com/287924909
Где мои поздравления, Джон Ромеро? :)
Таким образом, что бы там ни писал Ромеро — это баг уровня, баг, не учитывающий особенности движка.
В общем, чушь это всё насчёт несрабатывающего телепорта из-за того, что игрока туда толкает внешняя сила (монстр). Абсолютная чушь. Сейчас докажу. :)

Как я написал выше, сектор с триггером очень маленький и движок не фиксирует попадание игрока в этот сектор, а сразу фиксирует телепортацию.
Далее, у doom2 есть замечательный параметр -turbo <0..400>. Так вот, если выставить 0, то игрок движется очень медленно — и этот секрет замечательно берётся! Что, собственно, и подтверждает сказанное выше.
У автора видео заметно, что Pain Elemental толкает его в сектор очень слабо, да ещё и игрок стоит по диагонали. В результате игрок попадает в сектор с триггером секрета и не попадает в сектор с триггером телепорта.
Извиняюсь, не Pain Elemental attack, а Lost Soul attack — что-то я думал об одном, а написал другое.
Я не уверен, что это именно так, но всё похоже на то, что у товарища просто случайно получилось. Хотя записал же он видео…

Информация

В рейтинге
Не участвует
Откуда
Липецкая обл., Россия
Зарегистрирован
Активность