This page is driven mostly by the [http://www.tcl.tk/man/tcl8.6/TclCmd/contents.htm%|%8.6 manual build]. Note that some commands may be listed with a `****` against them. That is because they are present in multiple categories; they are [ensemble]s (and related) and have partial compilations. **Already bytecoded** === [append] [break] [catch] [concat] [continue] [dict] **** [dict append] [dict for] [dict get] [dict incr] [dict lappend] [dict map] [dict set] [dict update] [dict with] [error] [eval] [expr] [for] [foreach] [global] [if] [incr] [info] **** [info coroutine] [info exists] [info level] [lappend] [lassign] [lindex] [list] [llength] [lmap] [lrange] [lreplace] [lset] [namespace] **** [namespace current] [namespace upvar] [regexp] [return] [self] **** [self object] [set] [string] **** [string compare] [string equal] [string index] [string length] [string match] [subst] [switch] [tcl::mathop] tcl::mathop::[!] tcl::mathop::[!=] tcl::mathop::[%] tcl::mathop::[&] tcl::mathop::[*] tcl::mathop::[**] tcl::mathop::[+] tcl::mathop::[-] tcl::mathop::[/] tcl::mathop::[<] tcl::mathop::[<<] tcl::mathop::[<=] tcl::mathop::[==] tcl::mathop::[>] tcl::mathop::[>=] tcl::mathop::[>>] tcl::mathop::[^] tcl::mathop::[eq] tcl::mathop::[in] tcl::mathop::[ne] tcl::mathop::[ni] tcl::mathop::[|] tcl::mathop::[~] [throw] [try] [unset] [unsupported] **** tcl::unsupported::[assemble] [upvar] [variable] [while] === <> [AMG]: lmap? [DKF]: Yes, indeed (and [dict map] too)! See [http://tip.tcl.tk/405.html%|%TIP #405] for the details; the code was committed on Oct 18. More to the point, some commands ([info coroutine], [info level], [namespace current] and [self object]) aren't yet BCCed on the trunk. I chose to do those four because they're things that are relatively accessible to the bytecode engine. [AMG]: I'm glad to see [[[info coroutine]]], which is performance-critical to [Wibble]. You may have noticed [SEH]'s contributions to the [Wibble implementation], mostly driven by performance. One thing he did was try to cache [[info coroutine]] in a variable. It seems to me an optimized [[info coroutine]] ought to take less time than reading a variable. [DKF]: Don't get your hopes up too much; reading a local variable whose name is known at compile time is ''exceptionally'' fast (assuming it is untraced). <> **Potential candidates for bytecoding** Note that there is no consideration of whether these ''should'' be bytecoded; with many of them, it might well be a very bad idea for other reasons (e.g., costly internal algorithms). === [array] [array anymore] [array donesearch] [array exists] [array get] [array names] [array nextelement] [array set] [array size] [array startsearch] [array unset] [binary] [binary decode] [binary encode] [binary format] [binary scan] [dict] **** [dict create] [dict exists] [dict filter] [dict keys] [dict merge] [dict remove] [dict replace] [dict size] [dict unset] [dict values] [format] [info] **** [info args] [info body] [info class] [info cmdcount] [info commands] [info complete] [info default] [info errorstack] [info frame] [info functions] [info globals] [info locals] [info object] [info patchlevel] [info procs] [info script] [info tclversion] [info vars] [join] [linsert] [lrepeat] [lreverse] [lsearch] [lsort] mathfunc [namespace] **** [namespace children] [namespace code] [namespace delete] [namespace ensemble] [namespace eval] [namespace exists] [namespace export] [namespace forget] [namespace import] [namespace inscope] [namespace origin] [namespace parent] [namespace path] [namespace qualifiers] [namespace tail] [namespace unknown] [namespace which] [next] [nextto] [regsub] [scan] [self] **** [self call] [self caller] [self class] [self filter] [self method] [self namespace] [self next] [self target] [split] [string] **** [string first] [string is] [string last] [string map] [string range] [string repeat] [string replace] [string reverse] [string tolower] [string totitle] [string toupper] [string trim] [string trimleft] [string trimright] [string wordend] [string wordstart] [tailcall] [tcl::prefix] [tcl::prefix all] [tcl::prefix longest] [tcl::prefix match] [time] [uplevel] [yield] [yieldto] === <> [DKF]: I'm guessing that [next], [tailcall], [yield] and [yieldto] would be good candidates. Maybe also some variants of [array unset] (those that can be based on the existing [unset] machinery) and some more [dict] subcommands. We also ought to be able to do [namespace code], though I'm not sure how much of a win that is. Maybe some cases of [string is] could be done too, though I'm not convinced that would be a net win. [uplevel] would be good, but I'm really uncertain about how to do it (except in the `uplevel 0` case, which is rather low-value). Also, [self namespace] can probably be done, and if we were to do [string map] we might also be able to handle some [regsub] cases (which would definitely benefit some users' code). We can also probably handle some [format] cases (e.g., “all literals” and “only `%s` used in format string”). <> ***Filtered Candidates*** * `[array unset]` (when no pattern present) * `[dict create]` * `[dict unset]` * `[format]` (of constant literals or where the % groups are all `%s`). * `[namespace code]` (but ''not'' [namespace inscope]) * `[namespace which]` (`-command` mode; alternative to `[info commands]` check). * `[next]` * `[nextto]` * `[regsub]` (very simple cases? only if [string map] is tackled too) * `[self namespace]` (this is ''almost'' functionally identical to [namespace current]) * `[string is]` (maybe, for cases where we can do it and if the performance difference makes sense) * `[string map]` (simple cases?) * `[tailcall]` * `[uplevel] 0` * `[yield]` * `[yieldto]` **Commands that will never be bytecoded** ***Low-level details/internals*** These are commands that access information that is probably not best used in production systems. === [array] [array statistics] [dict] **** [dict info] [encoding] **** [encoding system] [memory] [memory active] [memory break_on_malloc] [memory info] [memory init] [memory objs] [memory onexit] [memory tag] [memory trace] [memory trace_on_at_malloc] [memory validate] [string] **** [string bytelength] [unsupported] **** tcl::unsupported::[disassemble] tcl::unsupported::[inject] tcl::unsupported::[representation] === ***OS connectivity, script library*** These are commands where the dominant performance factors are the OS, or they are deliberately kept as scripted commands. In either case, there's no real benefit to bytecoding (there are better choices of place to put effort). === [after] after [after cancel] [after idle] [after info] [auto_execok] [auto_import] [auto_load] [auto_mkindex] [auto_path] [auto_qualify] [auto_reset] [bgerror] [cd] [chan] [chan blocked] [chan close] [chan configure] [chan copy] [chan create] [chan eof] [chan event] [chan flush] [chan gets] [chan names] [chan pending] [chan pipe] [chan pop] [chan postevent] [chan push] [chan puts] [chan read] [chan seek] [chan tell] [chan truncate] [clock] [clock add] [clock clicks] [clock format] [clock microseconds] [clock milliseconds] [clock scan] [clock seconds] [close] [dde] [dde eval] [dde execute] [dde poke] [dde request] [dde servername] [dde services] [encoding] [encoding convertfrom] [encoding convertto] [encoding dirs] [encoding names] [eof] [exec] [exit] [fblocked] [fconfigure] [fcopy] [file] [file atime] [file attributes] [file channels] [file copy] [file delete] [file dirname] [file executable] [file exists] [file extension] [file isdirectory] [file isfile] [file join] [file link] [file lstat] [file mkdir] [file mtime] [file nativename] [file normalize] [file owned] [file pathtype] [file readable] [file readlink] [file rename] [file rootname] [file separator] [file size] [file split] [file stat] [file system] [file tail] [file tempfile] [file type] [file volumes] [file writable] [fileevent] [flush] [gets] [glob] [history] [history add] [history change] [history clear] [history event] [history info] [history keep] [history nextid] [history redo] [http] http::cleanup http::code http::config http::data http::error http::formatQuery http::geturl http::meta http::ncode http::register http::reset http::size http::status http::unregister http::wait [info] **** [info hostname] [info library] [info loaded] [info nameofexecutable] [info sharedlibextension] [interp] [interp alias] [interp aliases] [interp bgerror] [interp cancel] [interp create] [interp debug] [interp delete] [interp eval] [interp exists] [interp expose] [interp hide] [interp hidden] [interp invokehidden] [interp issafe] [interp limit] [interp marktrusted] [interp recursionlimit] [interp share] [interp slaves] [interp target] [interp transfer] [load] [msgcat] msgcat::mc msgcat::mcflmset msgcat::mcflset msgcat::mcload msgcat::mclocale msgcat::mcmax msgcat::mcmset msgcat::mcpreferences msgcat::mcset msgcat::mcunknown [open] [package] [package forget] [package ifneeded] [package names] [package prefer] [package present] [package provide] [package require] [package require] [package unknown] [package vcompare] [package versions] [package vsatisfies] [parray] [pid] [pkg::create] [pkg_mkIndex] [platform] [platform::generic] [platform::identify] [platform::patterns] [platform::shell] [platform::shell::generic] [platform::shell::identify] [platform::shell::platform] [puts] [pwd] [read] [registry] [registry broadcast] [registry delete] [registry get] [registry keys] [registry set] [registry type] [registry values] [safe] safe::interpAddToAccessPath safe::interpConfigure safe::interpCreate safe::interpDelete safe::interpFindInAccessPath safe::interpInit safe::setLogCmd [seek] [socket] [source] [tcl_endOfWord] [tcl_findLibrary] [tcl_startOfNextWord] [tcl_startOfPreviousWord] [tcl_wordBreakAfter] [tcl_wordBreakBefore] [tcltest] tcltest::bytestring tcltest::cleanupTests tcltest::configure tcltest::customMatch tcltest::debug tcltest::errorChannel tcltest::errorFile tcltest::interpreter tcltest::limitConstraints tcltest::loadFile tcltest::loadScript tcltest::loadTestedCommands tcltest::makeDirectory tcltest::makeFile tcltest::match tcltest::matchDirectories tcltest::matchFiles tcltest::normalizeMsg tcltest::normalizePath tcltest::outputChannel tcltest::outputFile tcltest::preserveCore tcltest::removeDirectory tcltest::removeFile tcltest::runAllTests tcltest::singleProcess tcltest::skip tcltest::skipDirectories tcltest::skipFiles tcltest::temporaryDirectory tcltest::test tcltest::testConstraint tcltest::testsDirectory tcltest::verbose tcltest::viewFile tcltest::workingDirectory [tell] [tm] tcl::tm::path tcl::tm::roots [trace] [trace add] [trace info] [trace remove] [trace variable] [trace vdelete] [trace vinfo] [unknown] [unload] [update] [vwait] [zlib] [zlib adler32] [zlib compress] [zlib crc32] [zlib decompress] [zlib deflate] [zlib gunzip] [zlib gzip] [zlib inflate] [zlib push] [zlib stream] === ***Command creation and related*** These create commands and do related tricks; they mostly benefit a lot from bytecoding, but there's little value in boosting them ''themselves''. (Though [rename] is a special case in that it is possible to sensibly bytecode it, but it is much more likely to trigger a progressive recompile than nearly any other command.) === [apply] [coroutine] [my] [oo::class] [oo::copy] [oo::define] [oo::objdefine] [oo::object] [proc] [rename] === **Not actually commands** These have manpage links, but aren't commands as such. === [Tcl] [argc] [argv] argv0 [env] [errorCode] [errorInfo] filename re_syntax [refchan] [tcl_interactive] [tcl_library] tcl_nonwordchars [tcl_patchLevel] [tcl_pkgPath] [tcl_platform] [tcl_precision] tcl_rcFileName tcl_traceCompile tcl_traceEval [tcl_version] tcl_wordchars [transchan] === <>Internals