[erlang-questions] Is there a good source for documentation on BEAM?

Anthony Ramine n.oxyde@REDACTED
Mon May 14 15:15:44 CEST 2012


There is already a chicken-and-egg problem, that's why there are some BEAM files
in the Git repository, look in erts/preloaded/ebin.

Nothing prevents us from generating these C files from some Erlang code and
versioning them in Git too. This way the system would be bootstrapped from the
previously generated files in the repository.

--
Anthony Ramine




Le 14 mai 2012 à 15:08, Bengt Kleberg a écrit :

> Greetings,
> 
> Perhaps there is a chicken-and-egg problem with requiring Erlang to
> generate files used to build Erlang?
> 
> 
> bengt
> 
> On Mon, 2012-05-14 at 15:02 +0200, Anthony Ramine wrote:
>> Couldn't some of the bootstrap Perl scripts like beam_makeops and make_tables be
>> rewritten and documented in Erlang? I think it would make things more obvious if
>> they were not obscure Perl scripts without comments. Furthermore it would make
>> Erlang/OTP eat more of its own dog food.
>> 
>> The only thing that would need to be changed with regard to the bootstrap itself
>> is that their output would have to be versioned just as the erts/preloaded/ BEAM
>> files. A new command should also be added to otp_build to update them.
>> 
>> Some of these generated files are:
>> 
>> 	beam_tr_funcs.h
>> 	beam_pred_funcs.h
>> 	beam_hot.h
>> 	beam_cold.h
>> 	beam_opcodes.c
>> 	beam_opcodes.h
>> 	beam_opcodes.erl
>> 	beam_opcodes.hrl
>> 	erl_am.c
>> 	erl_bif_table.c
>> 	erl_bif_wrap.c
>> 	erl_pbifs.c
>> 	erl_atom_table.h
>> 	erl_bif_table.h
>> 
>> There may be an obvious reason for them not to be generated by Erlang itself but
>> I'm not aware of it.
>> 
>> Regards.
>> 
>> --
>> Anthony Ramine
>> 
>> Le 9 mai 2012 à 01:58, Richard O'Keefe a écrit :
>> 
>>> Let me illustrate the Icon approach by showing you a fragment of the
>>> micro-BEAM I wrote to get the performance numbers in the frames proposal.
>>> (The whole thing is fragmentary.)
>>> 
>>> ...
>>> @i
>>> max src, snd, dst
>>> @d
>>> dst := max(src, snd)
>>> 
>>> This computes the maximum using the micro-Erlang term ordering.
>>> If src and snd are tagged immediate integers the comparison is
>>> done inline; the compare() function is called otherwise.
>>> @c
>>>   T = @src;
>>>   U = @snd;
>>>   @dst = cmp(T, >, U) ? T : U;
>>>   @step;
>>> @e
>>> ...
>>> @i
>>> check_record src, size, const
>>> @d
>>> Type test.
>>> 
>>> Fail unless src is tagged as a pointer to a tuple or frame,
>>> the first word it points to is size, and the second is the
>>> const (which must be an atom, but we don't check that).
>>> Used for record matching.
>>> @c
>>>   T = @src;
>>>   if (!is_tuple(T))                   @fail "is_record"; else
>>>   if (FIELD(T, TUP_TAG, 0) != @size)  @fail "is_record"; else
>>>   if (FIELD(T, TUP_TAG, 1) != @const) @fail "is_record"; else
>>>   @step;
>>> @e
>>> ...
>>> There is a preprocessor written in AWK that turns this into
>>> several C files.  One of them is the emulator cases.  For
>>> the check_record instruction you get
>>> 
>>> #line 75 "frame.master"
>>>       case CHECK_RECORD:
>>> #line 76 "frame.master"
>>>           T = reg[(int)P[1]];
>>> #line 77 "frame.master"
>>>           if (!is_tuple(T))
>>>              P = failure, operation = "is_record"; else
>>> #line 78 "frame.master"
>>>           if (FIELD(T, TUP_TAG, 0) != 4)
>>> 	       P = failure, operation = "is_record"; else
>>> #line 79 "frame.master"
>>>           if (FIELD(T, TUP_TAG, 1) != P[3])
>>> 	       P = failure, operation = "is_record"; else
>>> #line 80 "frame.master"
>>>           P += 4;
>>>           break;
>>> 
>>> where I've broken the long lines (the preprocessor doesn't).
>>> The #line directives are option.
>>> 
>>> @i introduces an instruction; the next line is a template
>>> for it saying what the operands are.
>>> @d introduces the description for people.
>>> @c introduces the code.  In it, various built-in @macros
>>> are expanded.
>>> 
>>> One advantage of doing it this way is that by using
>>> @step to update the PC I *cannot* get the offset wrong;
>>> the preprocessor counted the operands and their sizes
>>> for me.  Similarly, what I write has *no* operand numbers;
>>> the preprocessor counted those, and supplies all necessary
>>> casts as well.  I can shuffle operands around (in @i)
>>> without revising the code (in @c), and have.
>>> 
>>> It wouldn't be too hard to write another preprocessor that
>>> built some kind of documentation (HTML would probably be
>>> easiest) out of this, but since this was an experiment,
>>> it didn't seem worth while.
>>> 
>>> Why did I write the preprocessor?
>>> Well, to be honest, the first draft didn't use one.
>>> I got a bit sick of debugging, and wrote the preprocessor
>>> (based on vague memories of Icon) to eliminate a class of
>>> errors.  It turned out to be _easier_ to develop a
>>> documented emulator than an undocumented one.
>>> 
>>> _______________________________________________
>>> erlang-questions mailing list
>>> erlang-questions@REDACTED
>>> http://erlang.org/mailman/listinfo/erlang-questions
>> 
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
> 
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list