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

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

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

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

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

Ответ 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 есть свои сильные стороны, но документация не является одним из них.

С уважением.