Erlang Opcodes и их значение
Некоторые коды операций, используемые Erlang VM, имеют очевидное значение, но другие являются загадочными, и они, кажется, отличаются друг от друга тонкими различиями.
В качестве примера:
- Какая разница между
call_ext
а такжеcall_ext_only
опкоды? - Какая разница между
allocate
иallocate_zero
опкоды? - Что
test_heap
код операции используется для? Это какая-то проверка или она фактически выделяет место в куче? Это как-то связано с использованием кортежей и списков, но в каких терминах? - Что говорят аргументы
allocate
обозначает?
Если бы кто-нибудь мог указать мне какую-либо документацию, доступную для кодов операций, используемых Erlang VM, или если бы он мог хотя бы просветить меня по вышеуказанным пунктам, это было бы очень признательно.
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 в той же папке. Я тоже не эксперт по эрланг-асму и, возможно, что-то пропустил. Пожалуйста, помните об этом и перепроверьте мои заявления, прежде чем начать с ними работать.
Процитирую TamasNagy из связанного SO-awnser:
Я не уверен, что вы пытаетесь достичь с этим, но ядро erlang может быть лучшим уровнем для манипулирования кодом.
Пожалуйста, посмотрите там для получения дополнительной информации. У Erlang есть свои сильные стороны, но документация не входит в их число.
С уважением.