байт-код erlang BEAM

Asked
Viewd5897

19

Что ж, надеюсь, я не нарушу здесь правила рассылки спама. Я только что задал вопрос о том, как компилятор erlang реализует сопоставление с образцом, и получил несколько отличных ответов, одним из которых является скомпилированный байт-код (полученный с параметром, переданным в директиву c ()):

 {function, match, 1, 2}.
  {label,1}.
    {func_info,{atom,match},{atom,match},1}.
  {label,2}.
    {test,is_tuple,{f,3},[{x,0}]}.
    {test,test_arity,{f,3},[{x,0},2]}.
    {get_tuple_element,{x,0},0,{x,1}}.
    {test,is_eq_exact,{f,3},[{x,1},{atom,a}]}.
    return.
  {label,3}.
    {badmatch,{x,0}}
 

это всего лишь простые кортежи erlang. Я ожидал какой-то загадочной двоичной штуки, не думаю. поэтому я импульсивно задаю это здесь (я мог бы взглянуть на исходный код компилятора, но задавать вопросы всегда лучше с дополнительным пониманием), как этот вывод транслируется на двоичный уровень?

например, {test,is_tuple,{f,3},[{x,0}]}. Я предполагаю, что это одна инструкция, называемая «тест» ... в любом случае, поэтому этот вывод будет по существу AST языка уровня байт-кода, из которого двоичная кодировка представляет собой просто перевод 1-1? Все это настолько захватывающе, что я понятия не имел, что могу легко увидеть, во что взламывается компилятор erlang.

большое спасибо

2 ответов

12

Хорошо, поэтому я покопался в исходном коде компилятора, чтобы найти ответ, и, к моему удивлению, файл asm, созданный с параметром 'S' для функции compile: file (), фактически просматривается как есть (file: consult ( )), а затем кортежи один за другим проверяются на предмет дальнейших действий (строка 661 - beam_consult_asm (St) -> - compile.erl). далее там есть сгенерированная таблица сопоставления (папка компиляции источника erlang), которая показывает серийный номер каждой метки байт-кода, и я предполагаю, что это используется для генерации фактической двоичной подписи байт-кода. качественный товар. но вы просто должны любить функцию consult (), вы можете почти иметь синтаксис типа lispy для случайного языка и полностью избегать необходимости в парсере / лексере и просто сверяться с исходным кодом в компиляторе и делать с ним что-то ... код как данные данные как код ...

  • Вы видели Erlang Роберта Вирдинга, приправленный Lisp (http://forum.trapexit.org/viewtopic.php?p=40268)

    Gordon Guthrie26 февраля 2009, 16:54
  • Да, я видел это, но еще не использовал, хотя он довольно высок в моем списке вещей, которые нужно сделать в краткосрочной перспективе.спасибо

    deepblue26 февраля 2009, 17:40