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

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

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

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

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

1 ответ

Решение

Как указано в аналогичном SO-вопросе и erlang-документации:

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

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

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

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

Процитирую TamasNagy из связанного SO-awnser:

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

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

С уважением.

Другие вопросы по тегам