The point I see to a reentrant compiler: You could use this as a compiling-interpreter.
ie You could write program code into an ordered sequence of text boxes, run that code as-is, then potentially change that code and (if you chose) re-evaluate it as it was running. (?) On Tue, Dec 10, 2019 at 5:54 PM ag <aga.chatzimani...@gmail.com> wrote: > On Mon, Dec 09, at 03:33 Michael Matz wrote: > > Hi, > > > > On Sat, 7 Dec 2019, Christian Jullien wrote: > > > > > > 2) slower code: most of the time the indirection through a pointer > > > variable (the state) in comparison to a direct access to a static > > > variable doesn't matter. > > > > > > In fact, I experimented the opposite. When moving all global variables > > > to a struct, my Lisp was around 1% faster because globals are now > close > > > together and more often accessible from L1 cache. > > > > They are equally close in the .data section/segment, as long as you put > > _all_ global data into that struct (which is what was proposed). I do > > believe you that it was faster, merely pointing out that it probably had > > other reasons. > > > > Either way, I measured with TCC itself, not some other program with > > completely different behaviour. Specifically the accesses to the token > > hash table from the pre-processor (tokenization is the slowest part in > > TCC, as it should be) currently needs only one register, because the > > address of that table is an immediate. Just changing this to be a > pointer > > (cached in a register), with otherwise similar code made the inner loop > of > > tokenization measurably slower (though I don't remember the percentage > > anymore, but I was thinking "meeh"). The effect is that on x86-64 the > > computation either needs a slow addressing mode, or multiple > instructions > > (which are dependend then), which alone caused this slowdown. > > > > Of course, we could decide that a (say) 2% slowdown in compilation speed > > is acceptable for the feature of multiple compiler states that don't > have > > to interact. > > > > Or we could think long and hard about what we really want/need from our > > APIs and try to get both. E.g. it's not clear that the token hash table > > really needs to become a non-singleton, even _if_ we'd allow multiple > > TCCState objects. It's just that the update to the token hash must not > be > > done concurrently. > > > > So, we could for instance allow and support multiple TCCStates but > > _without_ multi-threading. Or (like grischka said) allow > multi-threading, > > but only on the API level (and serialize internally). > > > > So, I think the latter is the solution with the most bang for the buck: > > allow multiple TCCStates, but don't necessarily move all global data > into > > the state, under the assumption that at its core TCC remains > > single-threaded. > > > > We'd also still have to decide what multiple TCCStates really mean: e.g. > > I'd say this is only for compiling to memory. That would mean that it's > > not really necessary for the code from different states to be generated > > into different sections. Though finalization needs to be per state, so > > maybe it's unavoidable, but that needs to be tried. There might be > other > > global data (e.g. the memory allocator) that also could remain shared > > between different states. (Again, all with the assumption that > > multi-threading is serialized high in the API level). > > And at the end is always about mechanics and mechanism[s] (funny). > > First is the tcc underlying machine. Should be fast. No compromises. Direct > access to the underlying physical machine. This is C and its property. We > take > some risks we want results. Optimum results. Otherwise goto the > abstraction. > C has almost no abstraction (probably is more like a tiny bits of > convenience). > > With multi-threading though, the underlying machine tcc code, should > account for > side effects of the shared execution space, so adds even a tiny bit (and > with the > best of efforts) of complexity. So that is not quite primitive and it > seems like > a condradiction with the "direct access to the machine" thing. It's even > is a bit > of odd, that tcc which is a C compiler, to use "second thoughts" in its C > code. > > But as (almost) always staring at the code reveals the answer. I never > done threading, > i saw some and always look (oh well) complicated! (for the C way of > thinking), as it > is perhaps the only code that scanning stops and the mind should start to > think in an > unusual way. > > State though can encapsulate all what they need to make them work without > worries. > And since it is their data and their methods, and if at some point they > sanitized > that data, perhaps they can feel more certain and could apply some > optimizations > (e.g., uneeded conditional branches) and even gain some speed at the end. > > But states could not let them without a supervisor or (anyway) is wise to > implement > one. As Michael said, there is a need to think hard here to avoid > complexity and > without loosing speed. Compilation speed is all what matters to tcc > (foremost) as a > development tool. Tcc compiles more than 15000 lines library code in a > fraction of a > second, when gcc takes 19 and clang 24. When you only want to inspect some > values > this can speed a whola lot of time the development process, as sometimes > this can > gets really intensive and it might happens quite of times in the row. In > (almost 2 > years now experience with tcc) tcc produces identical results with gcc > with -O2 -g > -Wall -Werror, while gcc and clang disagree sometimes. > > What this supervisor or the root state of those states will do is > discussable. > It can perhaps impose some strictness of the state objects visibility, or > it can > pass messages between them, or perhaps it could be used as a wise > try/catch method, > or it can handle communication outside of its parent group pid, or it can > even been > used with the same way with a higher level language (it can be set for > instance, an > intermediate function)). But here we are starting to talking like tcc is a > programming > language, but why not? If we could use a very strict subset of C (a C--) > we could cut > roads and be faster. Perhaps we could have a way to instruct tcc, that > only for tcc > will make sence, even for a second pass! For instance to optimize a block > or a function > where performance matters. Right now no code has special treatment. > Perhaps it would > be wise to have. > > The above make sence with the regards to flexibility and mainly about the > user freedom > to do whatever she likes todo without to have to pay a lot o price (like > multiply tcc > instances: but this seems like quite of complex task, and besides that is > uneconomical > (and we all know that economy matters here!)). > > In any case the objects should be (naturally) opaque pointers. > > How this can be implemented? My favorite way it to pass my objects or > states as the > first argument of the function, and having a root linked list (usually > double) with > a head and a tail and with a current pointer, to control them; plus an > index pointer > and the number of the states. But in this case manifested, that pointer > indirection > adds (even) a small of an overhead so this might be out of the discussion, > but this > is quite technical and its far away the time (they say you need at least > 20 years of > experience in C), to know the prudent way (though i saw/see people with > more than 40 > years of experience (both) to disagree sometimes about the technical > details). > > But as always there always afterthoughts but discussion surely helps, > (damn too many > always, it's getting absolutism). > > > Ciao, > > Michael. > > Best, > Αγαθοκλής > > > > It has of course no effect when global is a pointer which introduces > the > > > same indirection. It is true for aggressive optimizers which are > likely > > > to put struct pointer to a register. So it may be faster for tcc > > > compiled by gcc, clang or vc++ but slower when tcc is compiled by tcc. > > > > > > C. > > > > > > -----Original Message----- > > > From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis= > orange...@nongnu.org] On Behalf Of Michael Matz > > > Sent: Friday, December 06, 2019 16:42 > > > To: TCC mailing list > > > Subject: Re: [Tinycc-devel] make tcc reentrant > > > > > > Hello, > > > > > > On Tue, 3 Dec 2019, Ulrich Schmidt wrote: > > > > > > > i try to write a lua binding for tcc. To work out propperly, the tcc > lib > > > > needs to be reentrant. > > > > > > As demonstrated down-thread, that isn't correct. It doesn't _need_ to > be, > > > it would be an feature. As usual with features it needs to be > measured > > > against the downsides. The downsides for your proposed changes are > the > > > following at least: > > > 1) more complicated/boiler-platy source code of TCC (a TCCState > > > argument almost everywhere) > > > 2) slower code: most of the time the indirection through a pointer > > > variable (the state) in comparison to a direct access to a static > > > variable doesn't matter. But it does matter for the symbol/token > > > table (and potentially for the register/evaluation stack). I have > > > measured this years ago for the token table, so this might or might > not > > > still be the case. > > > > > > So, while I can see the wish for this feature, I don't necessarily see > > > that tcc should be changed to accomodate. > > > > > > If anything I would expect a _complete_ transition to exist, in order > to > > > measure the impact. The worst thing that could happen is if someone > added > > > TCCState arguments everywhere, moved some static variables to that > state, > > > and then leaves: none of the features of this whole excercise would be > > > had, but all the downsides would be there. > > > > > > And yes, this is a big project. I really think it would be better > > > if you simply write a wrapper for libtcc that ensures > single-threadedness > > > and that regards TCCState as a singleton. I think such thing would be > > > well-suited in the TCC sources itself. > > > > > > (In a way it seems prudent for a tiny C compiler to only be usable as > a > > > singleton) > > > > > > > > > Ciao, > > > Michael. > > > > > > > > > > > I took a look into the sources and found some comments (XXX:...) and > > > > started with removing > > > > > > > > the static var tcc_state. As a result allmost all lib functions > needs a > > > > 1st parameter of > > > > > > > > type TCCState*. I did this in my own local branch and tcc is still > > > > running :). > > > > > > > > But this is a really HUGE change. in addition most of the local vars > in > > > > tccpp, tccgen, ... needs > > > > > > > > to be moved to TCCState. I can do that but at some points i will have > > > > some questions and i > > > > > > > > can only test on windows and probably on linux. > > > > > > > > My 1st question is: Are you interested in these changes or should i > do > > > > this locally? > > > > > > > > I would like to this together with you. > > > > > > > > > > > > Greetings. > > > > > > > > Ulrich. > > _______________________________________________ > Tinycc-devel mailing list > Tinycc-devel@nongnu.org > https://lists.nongnu.org/mailman/listinfo/tinycc-devel >
_______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel