ну, я надеюсь, что я не нарушу здесь какое-то правило рассылки спама.
Я только что задал вопрос о том, как компилятор 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}}
это просто простые эрлангские кортежи. Я ожидал какую-то загадочную двоичную штуку, не думаю. поэтому я спрашиваю об этом здесь импульсивно (я мог бы взглянуть на исходный код компилятора, но задавая вопросы всегда лучше заканчивая дополнительным пониманием), как этот вывод транслируется на двоичном уровне?
скажем {test,is_tuple,{f,3},[{x,0}]}
например. Я предполагаю, что это одна инструкция, называемая 'test' ... в любом случае, так что этот вывод по существу будет AST языка уровня байт-кода, с которого двоичное кодирование является просто переводом 1-1?
Это все так увлекательно, я даже не догадывался, что смогу легко увидеть, на что разбивает компилятор erlang.
Большое спасибо