LINUX.ORG.RU

Динамическая генерация кода


0

0

Существует-ли библиотека, которой на вход подается ассемблерная инструкция в виде текстовой строки (x86), а на выходе получается соответствующий бинарный код. Особых наворотов не нужно, только 32 бита, без SSE, MMX и тп. Достаточно i386.

Языки желательно C, Python, но вообще подойдет на любом языке.

★★★★

Ответ на: комментарий от Zitzy

Велосипедостроительством не хочется заниматься. Тем более для x86.

alexru ★★★★
() автор топика

Вызов as не катит, не? На вход ассемблер, на выход — объектник. Поздравляю, ты решил задачу за 5 минут. А так бы полгода еще промучился со своим велосипедом.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Нужна динамическая генерация кода в ран-тайм для ускорения некоторых операций, типа небольшой JIT. Какой нафиг as?

Костыльный метод есть в Qemu, но проще заново написать, чем что-то оттуда выдрать.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

>Существует-ли библиотека, которой на вход подается ассемблерная инструкция в виде текстовой строки (x86), а на выходе получается соответствующий бинарный код.

То, что ты попросил в вопросе, то as и сможет тебе обеспечить. Быстро и качественно. Никто тут не упрекнет меня, что я не ответил на этот вопрос.

Нужна динамическая генерация кода в ран-тайм для ускорения некоторых операций, типа небольшой JIT. Какой нафиг as?

Вызывай as из твоей программы в рантайм. И в рантайм же читай полученный код и используй его по своему усмотрению.

Zubok ★★★★★
()

libtcc (tiny c compiler) - на входе C код

если ассемблер - то можно взять из binutils - libbfd libopcodes

Sylvia ★★★★★
()
Ответ на: комментарий от alexru

А именно ассемблер? Просто динамическая компиляция не устроит?

Скажем, в лиспе:

 (compile nil `(lambda (x y z) (+ x y z))) => #<FUNCTION (LAMBDA (X Y Z)) {1002C7A409}> 

И код функции формировать дюже проще, чем с ассемблером, и оптимизаций компилятор делает.

dmitry_vk ★★★
()
Ответ на: комментарий от alexru

Для Tcl есть tcltcc, встроенный Tiny C Compiler. То самое делает, можно в рантайме генерить и компилировать функции, единственно, там не asm, а Си. Хотя может, inline asm там и есть, не пробовал вставлять.

anonymous
()
Ответ на: комментарий от Zubok

Требуется БЫСТРАЯ (иначе сталбы я заморачиваться с динамической компиляцией) работа, а ты предлагаешь дергать внешние программы, которые не факт что стоят на целевой системе. Вот это велосипед так велосипед.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

>Требуется БЫСТРАЯ (иначе сталбы я заморачиваться с динамической компиляцией) работа

Это будет не сильно медленнее, чем вызов библиотеки из *.so, которая тоже должна будет обработать текстовые входящие данные. И не факт, что сделает это лучше as. Только первый вызов as будет помедленнее, а потом уже быстро будет. Плюс ко всему ты получаешь возможность генерировать код на разные процессоры.

Если тебе надо быстро, то зачем тогда решается задача генерации *текста*, затем перевода его в код, когда надо генерировать сразу код. А это потому, что тебе проще сгенерировать текст. Ты же сознательно пошел в этом плане на замедление, пойдя через один лишний этап. Значит, тебе придется в любом случае вызывать какой-то тренслятор из текста в бинарный код. И все они этот будут делать примерно одинаково.

Вся беда нашего отечественного программирования в том, что отсутствует понятие прототипирования. Ты уже можешь двигаться дальше, решив задачу и получив результат. А сейчас ты сядешь на долгое время со своим premature optimization.

Zubok ★★★★★
()

А нафига это надо?

mv ★★★★★
()
Ответ на: комментарий от alexru

>Нужна динамическая генерация кода в ран-тайм для ускорения некоторых операций, типа небольшой JIT.

Ну так может и смотреть на JIT-библиотеки?

yyk ★★★★★
()
Ответ на: комментарий от Zubok

Текст был как вариант, я ничего не имею против библиотек для которых можно сразу дергать за функции для генерации кода.

Оптимизация производится для готовой программы с выявлеными местами тормозмв.

alexru ★★★★
() автор топика

На Форте пишется за ночь. Сам движок за полчаса-час и ещё сколько-то времени, чтобы вбить и проверить все опкоды.

KRoN73 ★★★★★
()
Ответ на: комментарий от alexru

Вот потому и за ночь (несколько часов) пишется, а не за час :)

...

Это реальная практика - я под Forthius32 когда-то так Форт-ассемблер писал. Плюс добавил линковку .obj на лету - удобно было :) (времена были DOS'овские, про .dll ещё никто не слышал, про .so - тем более)

KRoN73 ★★★★★
()
Ответ на: комментарий от alexru

> ты предлагаешь дергать внешние программы, которые не факт что стоят на целевой системе.

Что бы тебе не предложили использовать, на целевую систему это придется ставить тебе самому.

К tcc добавлю GNU Lightning (хотя проект вроде почти помер).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

К tcc добавлю GNU Lightning (хотя проект вроде почти помер).

Мне вот интересно, что за задача, в которой такое потребовалось?

mv ★★★★★
()
Ответ на: комментарий от anonymous

> Тогда уж сразу LLVM

Для сформулированных ТС целей вообще нужен as.

tailgunner ★★★★★
()
Ответ на: комментарий от mv

>> К tcc добавлю GNU Lightning (хотя проект вроде почти помер).

Мне вот интересно, что за задача, в которой такое потребовалось?

JIT для Лиспа :-P

tailgunner ★★★★★
()

Народ, вы чего? Искался простой исходник или проект откуда это можно выдрать, а вы предлагаете мноструозные проекты.

Так проще действительно написать самому.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

>Требуется БЫСТРАЯ (иначе сталбы я заморачиваться с динамической компиляцией) работа,

Языки желательно C, Python,

Python

Что-то у меня не сочетается. :)

Действительно, расскажи, зачем это надо?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

> Что-то у меня не сочетается. :)

Перепишу сам на си. Но переписывать с хаскеля - это слегка изврат.

alexru ★★★★
() автор топика
Ответ на: комментарий от Zubok

> Действительно, расскажи, зачем это надо?

Нужно код для специфического МК запустить на PC с как можно большей скоростью в нескольких десятках экземпляров. Простая интерпретация работает, но тормозит. Хочется сделать аналог того что есть qemu. Но когда я ее последний раз смотрел они собирали код по кусочкам и сильно зависили от версии GCC. Сейчас вроде что-то поменялось, но похоже пролемы все-равно есть.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

Я упомянутый Lightning использовал немножко, вроде работает.

Legioner ★★★★★
()
Ответ на: комментарий от alexru

>Нужно код для специфического МК запустить на PC с как можно большей скоростью в нескольких десятках экземпляров.

Я все-равно не понимаю, откуда требование преобразования в run-time? Почему нельзя этот код для МК преобразовать в бинарь целевой платформы до ее запуска? Почему нельзя переписать VM для этого МК, чтобы была более быстрой?

Zubok ★★★★★
()
Ответ на: комментарий от alexru

>Так проще действительно написать самому.

+1

Ниче там сложного нету

AF ★★★
()
Ответ на: комментарий от alexru

> > Действительно, расскажи, зачем это надо?

Нужно код для специфического МК запустить на PC с как можно большей скоростью в нескольких десятках экземпляров. Простая интерпретация работает, но тормозит.

Какой МК??

И второе, вы что, генерите этот код на лету? Если нет, то просто сгенерь вариант для х86 один раз и всё.

anonymous
()
Ответ на: комментарий от Zubok

МК уммет модифицировать свой код на лету, нужно отслеживать и часто перекомпилировать. Возможно что-то удастяся вынести в статическую часть и скомпилировать до исполнения, но ран-тайм компилятор нужен будет все-равно.

alexru ★★★★
() автор топика
Ответ на: комментарий от Zubok

А потом нужно несколько таких VM запустить в рамках одного процесса и управлять ими. Точки «вклинивания» управляющей программы - так же как и в qemu, все инструкции переходов.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

tcc - Tiny C Compiller - куда проще то? Подключается как библиотека. Потом пихшаешь фукнции свой код, inline asm там поддерживается. Потом получаеш указатель на сгенерированный код и запускаешь. Вот уж легче и человечнее сложно придумать.

ixrws ★★★
()

Возьмите какую-то существующую VM (Mono или упомянутый выше LLVM), допишите вещи спецефичные для МК и транслируйте код МК в байт-код хостовой машины. И не мучайтесь)

Sectoid ★★★★★
()
Ответ на: комментарий от mv

>> JIT для Лиспа :-P

Дык, в Лиспе компилятор из поков веков доступен в рантайме.


В том лиспе, к которому прикрутили Lightning (cLisp - «си-лисп»), компилятор только в байткод, который есть low-level всё те-же s-expr's.

yyk ★★★★★
()
Ответ на: комментарий от yyk

В том лиспе, к которому прикрутили Lightning (cLisp - «си-лисп»), компилятор только в байткод, который есть low-level всё те-же s-expr's.

В SBCL, CMUCL, Clozure CL испокон веков компиляция в машинный код.

(disassemble
 (compile
  nil
  `(lambda (x y z)
     (declare (optimize (speed 3) (debug 0) (safety 0))
              (type fixnum x y z))
     (the fixnum (+ x y z)))))

; disassembly for (LAMBDA (X Y Z))
; 03C7046B:       4801FA           ADD RDX, RDI               ; no-arg-parsing entry point
;       6E:       4801F2           ADD RDX, RSI
;       71:       48C1E203         SHL RDX, 3
;       75:       488BE5           MOV RSP, RBP
;       78:       F8               CLC
;       79:       5D               POP RBP
;       7A:       C3               RET
dmitry_vk ★★★
()
Ответ на: комментарий от yyk

>Ну так не «в Лиспе» вообще, а всего-лишь в некоторых реализациях - не?

Сферические языки в вакууме не интересны для решения конкретных задач. Они интересны лишь вместе с компиляторами/интерпретаторами/etc.

dmitry_vk ★★★
()
Ответ на: комментарий от Love5an

>да нет, как раз clisp это скорее исключение

согласен, но это не даёт права применять «квантор всеобщности» :)

yyk ★★★★★
()
Ответ на: комментарий от mv

GNU Lightning емнип используется в GNU Smalltalk для JIT

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.