Ich habe gerade eine Frage darüber gestellt, wie der Erlang-Compiler Pattern-Matching implementiert, und ich habe einige großartige Antworten erhalten, von denen eine der kompilierte Bytecode ist (den man mit einem Parameter erhält, der an die Funktion c()
Richtlinie):
{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}}
Es sind alles nur einfache Erlang-Tupel. Ich erwartete einige kryptische binäre thingy, schätze nicht. Ich frage dies auf Impuls hier (ich könnte auf den Compiler-Quellcode schauen, aber Fragen zu stellen endet immer besser mit zusätzlichen Einblick), wie wird diese Ausgabe in der binären Ebene übersetzt?
Sagen Sie {test,is_tuple,{f,3},[{x,0}]}
zum Beispiel. Ich gehe davon aus, dass es sich um eine Anweisung namens "test" handelt... Jedenfalls wäre diese Ausgabe im Wesentlichen der AST der Bytecode-Ebene, aus dem die binäre Kodierung nur eine 1-1-Übersetzung ist?
Das ist alles so aufregend, ich hatte keine Ahnung, dass ich so einfach sehen kann, in was der Erlang-Compiler Dinge zerlegt.
0 Stimmen
+1, da ich auch daran interessiert bin und Ihrer vorherigen Frage über Google gefolgt bin :)