summaryrefslogtreecommitdiff
path: root/doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex')
-rw-r--r--doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex127
1 files changed, 127 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex b/doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex
new file mode 100644
index 000000000..6a7de5a06
--- /dev/null
+++ b/doc/context/sources/general/manuals/evenmore/evenmore-offloading.tex
@@ -0,0 +1,127 @@
+% language=us runpath=texruns:manuals/evenmore
+
+% \showusage
+
+% This chapter was started when I updated some of the dynamic memory management
+% code. The musical timestamp is the discovery (via Sputs & Ghostnote drumming
+% sessions) of DOMI & JS BECK (also see: keyscape, nord) and after that Louis
+% Cole (Live 2019). So much talent around ...
+
+\environment evenmore-style
+
+\startcomponent evenmore-offloading
+
+\startchapter[title={Offloading}]
+
+The \LUAMETATEX\ source code started from \LUATEX\ with the idea to make a lean
+and mean variant. In the process the whole code base has been overhauled. Because
+we develop and maintain \CONTEXT\ in parallel all kind of experiments can be
+conducted. \footnote {To my best knowledge macro packages like \LATEX\ have
+decided to use the (mostly stable) \LUATEX\ in combination with a built in font
+renderer. The wish for stability from developers of other macro packages was one
+of the reasons for starting the \LUAMETATEX\ project: \LUATEX\ could no longer
+evolve without folks complaining. So, \LUAMETATEX, at least in the short run, is
+no reasonable option for other macro packages, unless policies have changed.}
+
+Already early in the process the decision was made to remove the backend code. I
+already had a working \LUATEX\ & \MKIV\ setup with an independent backend so that
+was an easy step. Later I removed that code from \MKIV\ because a dualistic model
+made for a messy \CONTEXT\ code base, and for \LUATEX\ I like to stick to the
+reference implementation. Of course one can wonder if we still have \TEX\ when
+there is no backend but you need to keep in mind that \TEX\ always needs some
+kind of backend program. If \DVI\ was still a used format (with \CONTEXT) I could
+write a \DVI\ backend without much effort, but \PDF\ is kind of the standard now.
+The relevant primitives can easily be defined in \LUA.
+
+What more defines \TEX ? Of course the macro language, but in addition to that we
+have the handling of fonts, hyphenation and building various lists, those that
+eventually make it into paragraphs and pages. The \ETEX, \PDFTEX\ and \OMEGA\
+engines have added bits and pieces and of course \LUATEX\ added its share.
+
+In \LUAMETATEX\ the macro part has been extended. Very few things were dropped,
+most noticeably \type {\long} and \type {\outer} are no longer effective but
+that made for a better \type {\protected} and gave room for \type {\frozen}.
+
+The handling of fonts is mostly delegated to callbacks but we do have the
+original transformation mechanism available. However, loading fonts is now up to
+\LUA. If that is done right, there is no difference with \TEX. One can argue that
+when a missing piece in the binary is complemented by a \LUA\ solution that gets
+plugged in we just are like \TEX. After all, nowhere is said that the engine has
+to be written in one language and in the \CWEB\ setup of \TEXLIVE\ we already mix
+languages anyway.
+
+The language part is also upgraded and because handling hyphenation has been
+extended we're, as with fonts, going beyond what traditional \TEX\ offers. The
+code for hyphenating is slightly different because we permit runtime loading and
+extension, compound and weighted patterns, etc.
+
+Another deviation is the handling of input and output. Although currently the log
+file still happens at the engine end, all the reading and writing from files is
+delegated to \LUA. This means that primitives like \type {\openin} and \type
+{\write} have to be implemented in \LUA, which is not that hard. It makes a lot
+of sense because everything already was driven by callbacks so delegating more to
+\LUA\ in the end gave a simpler input handler. For the user (or macro package) it
+makes no difference.
+
+So, assuming that the primitives not present in the engine are provided by \LUA\
+driven counterparts, we can speak of \TEX. So how about \ETEX ? We kept the macro
+language extensions, but dropped some others, like the direction related code.
+Also the querying of internal codes has been adapted to \LUATEX's internals.
+Expressions have been extended a bit. The \type {\scantokens} primitive now uses
+the same machinery as the \LUA|-|\TEX\ pipe, which made for less code and adds to
+consistency. From the \PDFTEX\ engine we only kept a few things, like protrusion
+and expansion. From \OMEGA\ only the concept of localpar and part of the
+directional model was kept, but because it's the backend that deals with
+directions there is not much there. We also dropped some \LUATEX\ features, for
+instance first class image handling only stays as concept (a special kind of
+rule) but again it is the backend that really needs to deal with it.
+
+So, in the end we end up, as intended, with a simpler code base indeed. Of course
+there is also stuff that is not in a traditional \TEX\ or \LUATEX. In addition to
+\LUA\ some libraries are present, but we avoid dependencies on large third party
+bodies of code. The continuous updating in \LUATEX\ told me that this dependency
+is a bad thing of we want the program to compile in decades from now (as
+libraries come and go and often also politics are involved). There is a small
+canonical set of what we provide and although one can use extra libraries it
+takes some effort. The internals of \LUAMETATEX\ are hidden.
+
+Just for the record. Because I want to keep as working engine and adapt \CONTEXT\
+in parallel, the process is rather time consuming. Every optimization, removal of
+unused code, addition of a feature, etc.\ takes multiple runs of the test suite,
+checking with \CONTEXT, generating binaries, updating the distribution, and so
+on. When we don't use something in \CONTEXT\ it goes on the todo stack, which
+means that testing is delayed to when I wrap up in documentation, which only
+happens when I think it's stable. For instance: when \type {\openin} and friends
+were delegated to \LUA, the \type {\ifeof} primitive was kept around with a
+temporary callback, so that \type {tikz} kept working. We don't use those read
+channels in \CONTEXT\ so that was a compromise. A while later the if test was
+also delegated and the temporary callback removed. There is no way I could do
+this kind of stepwise development were it now within the \CONTEXT\ community
+where users are willing to accept this.
+
+Another example of something that took some time is checking all memory
+allocation code, adding safeguards, make it more dynamic, making sure we have
+more statistics. It needs some experimenting and the \CONTEXT\ tracking code had
+to be extended. The main motivation for this is that there are some users out
+there (most noticeably Massimiliano who is involved in typesetting some scholar
+encyclopedia work) who run really huge jobs and we can run out of memory or even
+crash then. \footnote {I'm not that worried about an occasional bug, because the
+number is small compared to what got added, changed and improved, but of course
+there are always folks who ignore that fact and stress bug(let)s. But, as said,
+the \CONTEXT\ users are a patient lot.} Tracing shows that although \TEX\
+allocates its share of memory, in these thousand plus page documents in small
+print the regular few dozen megabytes can grow to hundreds, most noticeably taken
+up by fonts. Tracing also gives some insight in how fast token and node memory
+grows. Of course in this case \LUA\ takes way more memory, something between 1.5
+and 2~GB. Again this is due to the large amount of font instances and also is a
+side effect of massive \XML\ processing (keep in mind that the whole tree is in
+memory) and the fact that there are plenty of optimizations wrt typesetting
+implemented and multiple large registers are added. It's this kind of
+(regression) tests that help in stepwise improving \LUAMETATEX. \footnote {In the
+process one sometimes find ways to safe memory. For instance, marks used
+preallocated arrays that took 1280 KB memory while of course in practice no one
+needs that many mark registers. By making that more dynamic we saved a lot.}
+
+\stopchapter
+
+\stopcomponent