Lua in the bootloader
dteske at FreeBSD.org
dteske at FreeBSD.org
Mon Aug 25 17:22:59 UTC 2014
> -----Original Message-----
> From: Jordan Hubbard [mailto:jkh at ixsystems.com]
> Sent: Sunday, August 24, 2014 4:43 PM
> To: <dteske at FreeBSD.org>
> Cc: <freebsd-hackers at freebsd.org>; Wojciech A. Koszek; Pedro Giffuni;
> Pedro Arthur
> Subject: Re: Lua in the bootloader
>
>
> > limitations that I battle in Forth are significant enough
> > that I'd like to see if Lua can break said chains (such as
> > "dictionary full" errors causing BTX halt -- induced simply
> > by adding "too many functions" in Forth).
>
> I'm not one to stand in the way of progress either, but just to make sure
we
> are not foolishly conflating "language" with "environment" here: You do
all
> realize that ficl can have any sized dictionary you want, right?
Correct. I've also not yet tried my hand at "dictionary partitioning".
You're right that there are things I can do to reduce the dictionary,
but I think that where Forth fails us is that Lua already brings a lot
of what we need versus in Forth I've had to invent a lot of what I
need. For example, simply checking a "string" if it contains another
"string" (space or comma-separated) means that I have to create a
new function (see below):
Plucked from:
http://svnweb.freebsd.org/base/head/sys/boot/forth/support.4th?view=markup
205 : contains? ( addr1 len1 addr2 len2 -- 0 | -1 )
206 2 pick 0= if 2drop 2drop true exit then
207 dup 0= if 2drop 2drop false exit then
208 begin
209 begin
210 swap dup c@ dup 32 = over 9 = or over 10 = or
211 over 13 = or over 44 = or swap drop
212 while 1+ swap 1- repeat
213 swap 2 pick 1- over <
214 while
215 2over 2over drop over compare-insensitive 0= if
216 2 pick over = if 2drop 2drop true exit then
217 2 pick tuck - -rot + swap over c@ dup 32 =
218 over 9 = or over 10 = or over 13 = or over 44 = or
219 swap drop if 2drop 2drop true exit then
220 then begin
221 swap dup c@ dup 32 = over 9 = or over 10 = or
222 over 13 = or over 44 = or swap drop
223 if false else true then 2 pick 0> and
224 while 1+ swap 1- repeat
225 swap
226 repeat
227 2drop 2drop false
228 ;
This function takes up space in the dictionary.
> Presumably,
> it's kept small due to the limitations of the boot loader environment, and
Lua
> is not going to magically transcend those limitations.
To understand why Lua can do better, execute "words" in the Forth loader
environment to see the caliber of items taking up space in the dictionary.
The idea here is that Lua can provide us with a higher caliber of
functionality
within the same footprint.
> Writing lots of boot
> code in Lua will require memory, perhaps even MORE memory since, say
> what you like about Forth, it's hard to get more concise or compact than a
> Forth dictionary of compiled CFA's. That's why we picked it for the role
in the
> first place.
>
Lua can indeed take less memory. Forth has a dynamic dictionary that can
be used to hold multiple definitions. The Code Field Address (CFA) does not
have to associated with a unique element, and in this implementation you
can use the "forget" word in Forth to access old CFA's (using "[']" to get
at the
eXecution Token, or XT, for the current definition).
While Lua allows you to redefine functions [1] the unique identifier maps
uniquely to the current definition (old definitions do not pollute the map).
[1] http://www.lua.org/pil/6.1.html
That is not to say that you cannot have a function in Lua that calls an old
copy,
but you have to reference the old definition in the redefinition. This is
unlike
Forth wherein the XT is stored _and_ the dictionary retains CFA mappings.
> So anyway, first try expanding the size of the dictionary. If that can't
be done,
> now you know your "ceiling" for Lua. Can you stay below it, not just now
but
> longer term? Those are the questions you need to answer.
>
I know that I can increase the size of the dictionary, and it will work on
my
machine, but I'm too worried about the machines of yester-year to actually
bump the dictionary size.
--
Devin
More information about the freebsd-hackers
mailing list