C programs of a particular type are known as
big wish programs. They have this name because of their similarity to the
wish program that is part of Tk.
Unless you are completely new to Tcl/Tk, you are familiar with the program
tclsh. With
tclsh you can interactively enter Tcl commands and see the results of their evaluation. Or you can name a script file for
tclsh to evaluate. The Tcl interpreter within
tclsh starts out with all the built-in commands provided by the Tcl package.
The program
wish is quite similar to
tclsh. The primary difference is that the Tcl interpreter within
wish starts out with all the commands provided by both the Tcl and Tk packages. The commands of two packages are combined in one interpreter right from the startup of the program.
A
big wish program is one like
wish that combines Tcl and one or more packages in one program. Examples include:
- expect - includes Tcl and Expect packages
- expectTk - includes Tcl, Tk, and Expect packages
- tcl - includes Tcl and TclX packages
- itclsh - includes Tcl and Itcl packages
- bltsh - includes Tcl and Tk, and BLT packages
- tcldomsh - includes Tcl and TclDOM packages
- tixwish - includes Tcl, Tk, and Tix packages
...and there are others.
In the early days of Tcl, the construction of a
big wish program was the only way to extend Tcl with commands provided by an
extension.
One challenge in those days was if you had a Tcl script that made use of commands provided by a package other than Tcl, you had to be careful to choose the right
big wish to evaluate that script, so that it had access to all the commands it used. For example, if your script used the
signal command, it would need to be run with the
tcl program, and not with the
tclsh program, because
signal comes from
TclX.
Tcl 7.5 (released 1996) introduced the
load command. This allowed C-coded
extensions to be added to a Tcl interpreter dynamically at run time. Also new in Tcl 7.5 was the
package command that offered a higher level interface to control the
source-ing and
load-ing of new functionality into a Tcl interpreter on demand. The authors of
extensions started to use the new features to support dynamic loading. At the same time, these
extensions continued to support embedding, and continued to be distributed with machinery to build an appropriate
big wish program.
One valuable simplification from this time was that scripts no longer needed to be concerned about what program was used to run them. A [package require TclX] in a script would be sufficient to supply the
signal command that script needed to function. The [package require TclX] would succeed the same whether the
tcl program was running, so
TclX was present from startup, or whether
tclsh was running, and
TclX was dynamically
loaded as demanded by the script.
(One significant exception to this general history was the
Tk extension. For a number of reasons, best described elsewhere,
Tk continued to be available only in
wish and other
big wish programs, and did not support
load-ing via a [package require Tk] for many years. The first release of
Tk that could be [package require]d was Tk 8.4.0 (released in 2002). Even with Tk 8.4, the result of a [package require Tk] in
tclsh is not quite the equivalent of
wish. See
tclsh vs. wish.)
For several years after
load became available,
big wish programs have remained useful, and have continued to be used. In part this is simple inertia -- why fix what is not broken -- but in part it is because
big wish programs have been able to solve one of the challenges of the
loadable extension approach, dependency management.
Say a script makes use of the
interact command. Because the
interact command is provided by the
Expect package, you include a [package require Expect] in your script. You want to send that script to someone else to use. It's fairly simple to tell them "Here's a script; you'll need to run it with a program named
expect." It's somewhat more complex to tell them, "Here's a script; you'll need to run it with a program named
tclsh, and, oh yeah, make sure there's an extra package named
Expect installed with your tclsh." The difference in complexity grows greater with each additional package your script needs. Dealing with this complexity had a number of effects. First, people often tried to do without commands provided by
extensions altogether, preferring
pure-Tcl solutions. Second, people continued to rely on
big wish programs far longer than they might have otherwise.
Over time, other solutions to the dependency management problem have arisen. So-called
batteries included distributions, such as
ActiveTcl, have been released, and grown popular, making it more reasonable to assume that a [package require] of a popular extension in a script will succeed. Another approach has been to make use of virtual file systems embedded in single-file executable programs to be able to depend on the availability of
loadable extensions because they are carried in the same file as the script that [package require]s them. This approach was first known as a
scripted document, but later became known as a
Starkit. Tcl 8.4.0 (released 2002) includes virtual file system support, providing
Starkits a firm base of technical and moral support. The
Tcl Dev Kit suite of tools from
ActiveState is focused on supplying
Starkit solutions for application delivery.
As of 2003, with their remaining advantages fading away,
big wish programs are falling out of favor. Recent and pending releases of several
extensions are now configured to build only a
loadable package by default, omitting the construction of any
big wish program.