LINUX.ORG.RU

Интерпретация, компиляция, а это что?

 ,


1

2

Если транслятор преобразовывает программу:

input i
let j = i * 2;
print j

в

#include "set_val.h"
hash vars;
int main()
{
   input("i");
   set("j", mult(val("i"), 2);
   print(val("j"));
}

где set, mult и val определены как

void set(char *key, variant & val)
{
   set_hash(vars, key, val);
}

variant val(char *key)
{
   return get_hash(vars, key);
}

variant mult(variant a, variant b)
{
   variant c;
   assert(a.type == NUMBER && b.type == NUMBER);
   c.type = NUMBER;
   c.number = a.number * b.number;
}

а затем при помощи gcc получает бинарник, то этот весь процесс является компиляцией или интерпретацией?

★★★★★

Последнее исправление: maxcom (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Чисто теоретически - можешь. Только gcc тебе в этом не поможет ровно никак.

Каждую инструкцию преобразовывать в кусок кода на Си своей программой, а компилировать получившийся исходник-монстр в целевую архитектуру с помощью gcc. Это работает, по крайней мере в частных случаях.

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

Каждую инструкцию преобразовывать в кусок кода на Си своей программой

Каким образом gcc облегчает эту задачу?

Хотя забей, я не стану обсуждать бред Бетти.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от anonymous

я могу написать транслятор asm x86 -> C

Чисто теоретически - можешь

Чисто практически тоже можно http://infoscience.epfl.ch/record/149975/files/x86-llvm-translator-chipounov_...

По ссылке - модификация TCG для выдачи LLVM bitcode. Задачу трансляции x86 в Си она не облегчает ровно никак.

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

Задачу трансляции x86 в Си она не облегчает ровно никак.

А про cbe ты прочитать забыл, подслеповатый?

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

Или ему понадобится ИИ, или в результирующем си-коде не будет практически ничего кроме int-ов и прямой возни с указателями

Мы же вроде не про декомпиляцию, а про трансляцию произвольного машинного коды в Си (а потом компиляция в машинный другой платформы).

А для этого достаточно сделать что-то вроде

int eax, ebx, ..., cs, ds, ip;

void mov_eax_imm(int arg1, int arg2, int arg3, ...)
{
   eax = arg2;
}

void mov_ebx_imm(int arg1, int arg2, int arg3, ...)
{
   ebx = arg2;
}

void call(int arg1, int arg2, int arg3, ....)
{
   ip = translate_to_addr(arg1);
}

typedef void (*instr) (int arg1, int arg2, int arg3, ...);
struct command {
  instr *func;
  int arg1, arg2, arg3, ...;
};

command commands[MAX_LENGTH] = 
{
  { mov_eax_imm, 2, 0, ...},
  { mov_ebx_imm, 2, 0, ...},
  { add_reg_reg, EAX, EBX, 0, ...},
  ...
}

int main()
{
  for(ip = 0; ip < PROG_SIZE; ip++)
  { 
    struct command *s = &commands[i];
    s->func(s->arg1, s->arg2, ...);
  }
}

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

Задачу трансляции x86 в Си она не облегчает ровно никак.

А про cbe ты прочитать забыл

То есть ссылка на статью о Qemu - для понтов? Гыгы, анонимусу-то ничто человеческое не чуждо.

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

Каждую инструкцию преобразовывать в кусок кода на Си своей программой

Каким образом gcc облегчает эту задачу?

Вот конкретно эту — никак. Собственно я это и пытался сказать зелёной пони. Но ты-то отвечал monk'у, а он говорил:

Например, я могу написать транслятор asm x86 -> C и автоматически получу трансляторы x86 -> arm, x86 -> mips, x86 -> ... через gcc.

Видишь? Два этапа. Первый, трансляция инструкций из бинарника в Си, делается руками. Второй, трансляция из Си в бинарный код, делается gcc.

Я сделал почти так же, только выбросил стадию ассемблера. Проще и практичнее написать декодер инструкций, чем парсер вывода objdump, который может неожиданно поменяться.

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

То есть ссылка на статью о Qemu - для понтов? Гыгы, анонимусу-то ничто человеческое не чуждо.

Не, ну ты не больной ли?

Через qemu - генерить биткод. Из биткода через cbe генерить C. Я понимаю, что два хода для твоего IQ это слишком много, но ты уж поднапряги извилину.

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

Но ты-то отвечал monk'у

Я отвечал только на то, что процитировал. То, что GCC умеет компилировать Си-код для разных архитектур как бы очевидно.

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

Слил, как всегда, убогий недоумок?

Повторяю для жалкой свиньи: x86 -> LLVM IR -> C. Что тебе не понятно в такой последовательности, чмошник?

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

Слил, как всегда, убогий недоумок?

Как скажешь. Кстати, что ты тут делаешь? Иди куда сказали, не оглядывайся.

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

«Реализовал с ошибками» лучше «не реализовал, но и не допустил ошибок». В первом случае ошибки можно исправить, во втором ничего сделать нельзя.

у тебя ЧСВ шкалит. Мне эта задача не нужна, потому я её не решал.

Если считаешь, что у меня есть принципиальные ошибки — покажи концепт решения без этих ошибок.

gcc решает примерно такую задачу. Почему ты от него не отталкивался? Может я неправильно тебя понял? Но ты же просто говоришь: «ты дурак, а я сделал». Откуда мне знать, что тебе не нравится? Ведь «всё бред».

Статья короткая, прочитай, там написано.

мне лень.

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

дык слив тебе засчитывать, да?

Если тебе это зачем-то нужно - конечно.

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

у тебя ЧСВ шкалит

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

gcc решает примерно такую задачу.

gcc преобразует скомпилированный код для одной платформы в код для другой платформы? Ничего не путаешь?

Почему ты от него не отталкивался?

Потому что он для этого не подходит. С тем же успехом можно отталкиваться от Windows Media Player.

Но ты же просто говоришь: «ты дурак, а я сделал». Откуда мне знать, что тебе не нравится? Ведь «всё бред».

Я перепробовал разные способы для разных частей, часть работала, часть нет. На основании этого опыта я могу судить, какая идея стоящая, а какая нет. У тебя опыта нет, поэтому способен лишь на спекуляции. Но даже несмотря на это, твоя идея не просто неудачная, она бредовая.

gcc никак не поможет в декомпиляции. Промежуточное представление можно преобразовать в ассемблерный листинг, но обратное сделать нельзя. Это отдельная задача. Она настолько отличается, что из gcc использовать вообще ничего нельзя, разве что какие-нибудь функции для работы с хеш-массивами. Так понятно?

i-rinat ★★★★★
()
Ответ на: комментарий от emulek

дык слив тебе засчитывать, да? вместе с i-rinat

За себя говорю — засчитывай. Может тебе полегчает. :)

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

А что там было нерешаемого? Я не говорю, что она решается просто, но это двоичный транслятор, а их не один и не два.

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

А что там было нерешаемого?

Если бы задача была нерешаемой, её бы никто не решил.

но это двоичный транслятор, а их не один и не два.

Статические есть? Я таких рабочих не видел. Можно ссылку? Я б посмотрел.

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

это двоичный транслятор, а их не один и не два.

Статические есть?

«Статические» - это не запускающие исходный бинарь? Да, конечно. Я думаю, что с точки зрения подхода это подмножество «динамических».

Я таких рабочих не видел.

Я тоже. Но во времена Alpha читал не раз. У DEC были такие для миграции.

Можно ссылку? Я б посмотрел.

Гугл на static binary instruction set translation выдает достаточно ссылок. Например: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.111.4525&rep=rep... или https://www.usenix.org/legacy/events/osdi08/tech/full_papers/bansal/bansal_html/

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

Прости, что-то я туплю. Где почитать о том, что значит фраза «более специализированная программа»?

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

погугли на тему «проекция футамуры», там смотри на тему специализации

я употребил ее в том смысле, что программа А более специализирована, чем программа В, если А может быть получена специализацией В и В отлична от А (т.е. умеет делать что-то полезное, что не умеет А)

вообще этому интересно придать точный смысл, но кроме того, надо учесть, что практический смысл от компилятора отнюдь не только в специализации

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от i-rinat

Перед решением я тщательно гуглил информацию по теме и везде о задаче отзывались как о нерешаемой.

ну дык если кому-то очень-очень не хочется решать какую-то задачу, он быстренько доказывает, что она http://en.wikipedia.org/wiki/NP-complete и дело в шляпе

А я решил. Пусть частный случай, но решил.

... но при этом практически важные частные случаи могут быть решаемыми, да

пара вопросов:

у тебя функции транслировались в функции, или весь ассемблер в одну гигантскую функцию?

и очень любопытно, почему появились тормоза

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

у тебя функции транслировались в функции, или весь ассемблер в одну гигантскую функцию?

В отдельные функции. Каждый bl считался вызовом функции. Tail call оптимизированные вызовы перекрывались, я их никак не определял.

и очень любопытно, почему появились тормоза

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

Кстати, код открыт.

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