Tracing in Klink
This week I added improved tracing to Klink.
The new tracing is intended to complement the C code. Rather than
report the eval/apply cycle, it reports each time thru the main loop,
which is in _klink_cycle
.
Klink code is a mixture of pure C and eval cycles. The pure C can't capture continuations, so it can't call arbitrary code. But it is needed in order to run, and it is faster.
But tracing in C is only good for the pure C parts. For the rest, it
just reports that _klink_cycle
is being visited over and over.
Tracing in Kernel, inherited from Tinyscheme, didn't correspond to
much of anything. It both skipped over important parts and
redundantly traced things that could have been traced in C.
The new tracing code traces _klink_cycle
. That exactly complements
the C code.
Other enhancements
My new tracing code does two other nice things
Reports the stack depth
It reports how deep the current call is in the spaghetti stack.
In languages with continuations, that's neccessarily imperfect, since you can jump all around there with continuations. Nevertheless, it's quite useful for finding callers. Before, tracing was just a mass of calls and trying to discern which call invoked a call of interest was nearly hopeless.
It names every C operative
Before, traces used to read like:
(#<OPERATIVE> arg another-arg) (#<OPERATIVE> arg this-arg that-arg) (#<OPERATIVE> arg arg another-arg) (#<OPERATIVE> arg arg)
That didn't tell me much. So just for tracing, there is a special environment that the printer sees that tells it the name of each native C operative.
The way it's done isn't flexible right now, but I hope to make that a parameter to print that tracing will use.
Looks like:
klink> (new-tracing 1) 0 klink> (new-tracing 1) Decurry 10: Eval: (C-kernel_eval_aux #,new-tracing (1) #<ENVIRONMENT>) Decurry 11: Eval: (C-kernel_mapeval (1) () #<ENVIRONMENT>) Decurry 10: Eval: (,(unwrap #,eval) (,(unwrap #,new-tracing) 1) #<ENVIRONMENT>) Decurry 10: Eval: (C-kernel_eval_aux ,(unwrap #,new-tracing) (1) #<ENVIRONMENT>)1 klink> (new-tracing 0) Decurry 10: Eval: (C-kernel_eval_aux #,new-tracing (0) #<ENVIRONMENT>) Decurry 11: Eval: (C-kernel_mapeval (0) () #<ENVIRONMENT>) Decurry 10: Eval: (,(unwrap #,eval) (,(unwrap #,new-tracing) 0) #<ENVIRONMENT>) Decurry 10: Eval: (C-kernel_eval_aux ,(unwrap #,new-tracing) (0) #<ENVIRONMENT>)1 klink>
To use it
To use new tracing:
(new-tracing 1) ;;On (new-tracing 0) ;;Off
The old tracing inherited from Tinyscheme is still there:
(tracing 1) ;;On (tracing 0) ;;Off
No comments:
Post a Comment