[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Name resolution in Lua (was: Feature ...)
- From: Dirk Laurie <dirk.laurie@...>
- Date: Fri, 16 Nov 2018 10:53:39 +0200
Op Vr. 16 Nov. 2018 om 05:25 het Philippe Verdy <email@example.com> geskryf:
> The upvalues are in some table (even if the LuaVM uses a faster approach using an array for the environment of function closures, which allows faster and direct indexing by it's internal opcode).
> The opcodes however are not relevant, they are internals of the VM
> When you realize that, you can see that there's a much wider way to implement a VM and its intruction set (generated by its internal compiler, which may be multistaged, with several kinds of instruction sets and opcodes).
I thnk we are all agreed that the VM and its instruction set, and
therefore binary Lua chunks, are implementation details.
Where we seem to differ, is in what other concepts are also
Philippe's point of view is that there exists a scripting language
called Lua, for which in principle a compiler or interpreter is
possible that does not use the Lua stack model and C API, thereby
relegating that model to an implementation detail. In such an
implementation, there would be no need for any data stucture other
than a table.
The rest of us take the point of view that whatever is in the manual
is part of the official specification ot Lua, not an implementation
I grant Philippe the validity of his point of view. There are some
practical difficulties, such as the entire run-time library that would
have to be rewritten and re-debugged if you do not have the API at
your disposal, but in theory it is fine.
But then we come to the whole question of name resolution. Lua has an
interesting mixture: local variables, including upvalues, have lexical
scope and are resolved at compile time; global variables are resolved
at runtime. This has not necessarily always been the case, but from
Lua 5.2 it has been part of the definition of Lua that a global
variable is equivalent to a field in a table named _ENV.
There would need to be a similar table _LOC for local variables (which
includes parameters), and as Philippe has said, its __index metamethod
would be another _LOC, eventually leading to _ENV.
There is a certain economy of thought here: the use of the table as
the only data structuring mechanism is carried a step further, the
distinction between "upvalue" and "global" would disappear, closures
would not be needed.
This economy is however immediately lost in performance, involving
time and memory resources. Much of the work done in the usual model at
compile time would now (repeatedly) be done at runtime. In order to
preserve lexical rather than dynamic scoping. a new _LOC table would
be necessary for every 'local' statement.
But it does seem to be _possible_ to get a working Lua interpreter that way.