Подтвердить что ты не робот

Erlang Opcodes и их значение

Некоторые из opcodes, используемые Erlang VM, имеют очевидное значение, но другие являются таинственными, и они, похоже, отличаются друг от друга тонкие различия.

В качестве примера:

  • Какая разница между кодами call_ext и call_ext_only?
  • Какая разница между кодами allocate и allocate_zero?
  • Для чего используется код операции test_heap? Это какая-то проверка, или она фактически выделяет некоторое пространство в куче? Это как-то связано с использованием кортежей и списков, но в каких терминах?
  • Что означают аргументы allocate?

Если кто-нибудь может указать мне любую документацию, доступную для opcodes, используемую виртуальной машиной Erlang, или если он мог бы хотя бы просветить мне по вышеуказанным пунктам, было бы очень признательно.

4b9b3361

Ответ 1

Как указано в подобном SO-вопросе и документация erlang

Обратите внимание, что формат файлов ассемблера не документирован и может меняться между выпусками - этот параметр предназначен, прежде всего, для внутренней отладки.

Если вы действительно хотите знать, что происходит, кажется, вам нужно отследить его в исходном коде. Большая часть работы выполняется в erts/emulator/beam/beam_emu.c(я просмотрел otp_src_R15B02):

  • call_ext: установите указатель продолжения в текущую инструкцию + 2 и отправьте/вызовите внешний. call_ext_only: не касайтесь CP, просто отправляйте. (~ строка 1520)
  • оба выделяют память, но allocate_zero также инициализирует ее до 0x00 (~ строка 334).
  • test_heap: проверьте, доступны ли слова кучи Nh; если нет, сделайте сборку мусора. (~ строка 390)
  • allocate(StackNeeded, NumberOfRegistersToPreserve) (~ строка 316)

Весь файл представляет собой состав #defines и gotos, некоторые макросы определены внутри ops.tab в той же папке. Я тоже не специалист в erlang-asm и, возможно, что-то пропустил. Помните об этом и перепроверьте мои заявления, прежде чем приступить к работе с ними.

Чтобы процитировать TamasNagy от связанного SO-awnser:

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

Пожалуйста, посмотрите там дополнительную информацию. У Erlang есть свои сильные стороны, но документация не является одним из них.

С уважением.