Mein Verständnis der TCL-Ausführung ist, wenn die Compilerfunktion eines Befehls definiert ist, wird es zuerst aufgerufen, wenn es darum geht, den Befehl auszuführen, bevor seine Ausführungsfunktion aufgerufen wird.Wann wird die Kompilierfunktion eines Befehls aufgerufen?
Nehmen Sie das Kommando als Beispiel anhängen, hier ist seine Definition in tclBasic.c:
static CONST CmdInfo builtInCmds[] = {
{"append", (Tcl_CmdProc *) NULL, Tcl_AppendObjCmd,
TclCompileAppendCmd, 1},
Hier ist mein Testskript:
$ cat t.tcl
set l [list 1 2 3]
append l 4
ich hinzufügen gdb an beiden Funktionen Haltepunkte, TclCompileAppendCmd und Tcl_AppendObjCmd . Meine Erwartung ist TclCompileAppendCmd wird vor Tcl_AppendObjCmd getroffen.
Gdb Ziel ist tclsh8.4 und Argument ist t.tcl.
Was ich sehe, ist interessant:
- TclCompileAppendCmd bekommen zuerst anstößt, aber es ist nicht von t.tcl, eher aus init.tcl ist.
- TclCompileAppendCmd wird mehrmals getroffen und alle stammen von init.tcl.
- Das erste Mal t.tcl ausgeführt wird, ist es Tcl_AppendObjCmd wird getroffen, nicht TclCompileAppendCmd.
Ich kann nicht Sinn geben:
Warum ist die Funktion für init.tcl genannt Kompilierung aber nicht für t.tcl?
Jedes Skript sollte unabhängig kompiliert werden, d. H. Das Objekt mit dem kompilierten Befehl append bei init.tcl wird nicht für spätere Skripts wiederverwendet, oder?
[UPDATE] Dank Brad für die Spitze, nachdem ich das Drehbuch zu einem proc bewegen, kann ich sehen, TclCompileAppendCmd getroffen wird.
Versuchen Sie, Ihren Test innerhalb eines Proc. Q2 hat eine falsche Annahme. Der Befehl 'append' ist kompiliert. –
Es ist eine der Eigenarten des Tcl-Bytecode-Compilers. Im Allgemeinen, sobald ein Skript langsam wird, erstellen Sie eine Hauptprozedur und fügen alles ein, damit es kompiliert wird. –
Die Ausnahme sind die sehr großen Skripten in EDA-Tools gefunden. Jene stoßen auf schreckliche Speichergrenzen ... –