C
is a programming language
first found
on Unix systems but now found on many platforms. The
Tcl and
Tk core is written in C.
See Also edit
- C FAQ

- Programming in C

- at lysator.liu.se, a list of various C papers and resources
- C99 Draft (N869)

- at busybox.net
- C99 draft specification

- big HTML file
The ANSI committee as well as the ISO committee have approved a standard reference for C
Compilers edit
Support for C is traditionally provided by a compiler.
The
FSF's
gcc compiler is a quite popular C compiler found on many platforms and operating systems.
Also, most Unix systems have vendor supported compilers. They are often unbundled products these days. Sun is one of the vendors who have this type of product.
There is also
tcc, the "Tiny C Compiler".
[In the following list, be certain to indicate whether or not you have built Tcl and Tk with the compiler in question.] On
Microsoft Windows there are many options, including
- Visual C++
- from Microsoft (commercial) (but, in summer 2003, tclguy says VC7 is "free from ms - it just has the opts turned off
"), PT NB: as of Apr 2004 the command line version with optimizations is now free (see below). - C++Builder
- from Borland (commercial; an older command-line version is still available as a free download),
- Cygwin
- C compiler (free; a version of gcc; for some strange reason it cannot be used to compile the Tcl source code out-of-the-box - but Cygwin comes with its own version of Tcl at least),
- Mingw
- C compiler [1] (free; another version of gcc for Windows with goals slightly different from Cygwin),
- CodeWarrior

- (commercial)
- Digital Mars C

- (free), which was once Zortech C and later became Symantec C
- LCC-Win32

- (free) [Can that compile Tcl itself?]
- Intel C++ compiler

- (commercial)
- OpenWatcom C++ compiler

- (free?) [No idea if it can compile Tcl.]
etc.
The number of C compilers available on
MacOS is more limited. There is
- CodeWarrior

- by Metrowerks (commercial) for MacOS Classic and MacOS X,
- Apple's MPW for MacOS Classic
- (free download)
- gcc for MacOS X
- (free; download from Apple); either used stand-alone or with Apple's XCode IDE (included in the download)
- IBM's XL C/C++

- (commercial), intended to be optimized for recent machines.
Interpreters edit
Support for C can also take the form of an interpreter.
For instance, a recent advertisement for
Ch
is interesting. It is a C/
C++ interpreter that runs cross-platform on a large number of operating systems and hardware. It provides not only standard language features, but also support for 2 and 3 dimensional plotting, shell programming, and numerical programming. It supports 1990 ISO C standard as well as C99 features. In Jan, 2003, the product page for Ch Standard says that the product is free for use on Unix, Linux, and Mac OS X.
EiC
is another C interpreter.
See as well
CInt
is a (free) interpreter, originally from Masaharu Goto, and apparently currently maintained by the CERN Root team which uses CInt as its scripting language
I do not know if
Tcl can be interpreted under this interpreter
RFox.
Linkable Compilers edit
Support for C can also take the form of a run-time compiler.
tcc provides a libtcc library, which allows a running program to compile and link C code without touching disk. In milliseconds for a small chunk of code. (x86 only as of Jun 2003)
Odyce Annoying things about C edit
AMG: One annoying thing about C is that, like
Fortran, it uses "
=" as its assignment operator. This is very easy to confuse with the comparison operator "
==", resulting in either of the following two coding errors:
x == 5; /* Nothing happens, except maybe a warning if -Wall is on. */
if (x = 6) {...} /* Unintended assignment and incorrect logic. */Algol uses "
:=" as its assignment operator, and
C is ancestrally derived from
Algol, so I was always mystified about why
C reverted to
Fortran's assignment syntax. But I just now figured it out, I think. A "
:=" assignment operator looks almost identical to C's "
!=" inequality operator, so using "
:=" instead of "
=" for assignment simply trades one potential coding error for another. To fix
that problem, "
!=" would have to be replaced with, say, "
/=" (borrowed from
Ada), but that (1) collides with the compound division and assignment operator "
/=" and (2) breaks symmetry with the logical negation operator "
!". Or instead use "
\=", but that will behave unexpectedly when placed inside double quotes. Or use "
<>" and be like
BASIC and
SQL. Shrug!
bch: One thing that I do in C (indeed, Perl too) is use typical
rvalues
on the left side when doing comparisons, which will fail compilation if assignment operator is mistakenly used instead of comparison operator. Eg: use "if(9==a){...}" instead of "if(a==9){...}"; in the case of mistakenly using assignment operator, this will fail "if(9=a){...}", which is good; the programmer will be notified that his intent was mis-typed. If the rvalue is indeed on the right, though, one would have typed "if(a=9){...}", which will compile, but is unlikely to represent the programmer's intent, and lead to hard-to-find bugs. Reading expressions written this way (w/ rvalues on left) may seem "backward" to some people, and the practice is affectionately dubbed
Yoda Conditions
,
[
2]
AMG: Cute. I've seen that style too. Unfortunately, it doesn't help when both sides of the comparison (or unintended assignment) are valid lvalues. Thankfully, gcc -Wall provides useful warnings:
| x == y; | warning: statement with no effect |
| if (x = y) {...} | warning: suggest parentheses around assignment used as truth value |
To silence the latter warning on a case-by-case basis, type:
if ((x = y)) {...}. In my opinion, the extra parentheses highlight the fact that this expression isn't Business As Usual, so the reader will look at it more carefully and is more likely to notice that it uses assignment instead of comparison. Of course, only silence this warning when the code really is doing what you intend, and please put a comment nearby to testify to this fact and explain why. Also, watch your warnings like a hawk, and don't release code that emits any warnings in your chosen build environment(s). (You can't control if some alien compiler puts out weird warnings because it used MS-Word to grammar-check your comments.)
Sometimes I really do want my conditional expression to have the side effect of assigning into a variable. I need this when I want to save some intermediate value of a complex conditional for later processing. A simple example is calling a syscall (read()) that either returns a useful result (number of bytes read) or an error flag (-1, check errno for details).
if ((ret = read(fd, buf, max)) == -1) {
perror("read");
} else {
printf("read %d bytes\n", ret);
}This style is also available in Tcl:
proc getline {} {...}
while {[set line [getline]] ne ""} {
puts "got header line: $line"
}
puts "got blank line, the header is now done"As you can see, Tcl makes it impossible to mix up assignment and comparison. ;^)
Questions about C vs Tcl edit
How does performance in Tcl compare to comperable programs in C?
For instance, certainly there are types of programs which can likely be developed more quickly in Tcl than in C.
Are there types of things that
run faster in Tcl than C? If not, how much slower than C is Tcl? 10 times slower? 50 times slower? 100 times slower?
Miscellaneous Thoughts edit
AMG: I just thought of a cute alternate name for C: "lightspeed". You know, 'cuz physicists use the constant "c" to represent the speed of light. :^) I leave it up to you to figure out if this name has any deeper meaning. At least it would give C an excuse to have a
snazzy, energetic theme song
.
Related Topics edit
- Cameron Laird's personal notes on how to use C with Tcl

- What 'embedding' means
- How to embed Tcl in C applications
- Adding Tcl/Tk to a C application
- Extending Tcl
- Writing Tcl-Based Applications in C
- Building a custom tclsh
- Tcl_Init
- Init Scripts in the DLL
- Tcl interpreter in C# Application
- Adding Tk to an Existing Xt Program
- Mixing Tcl/Tk and Xt Event Loops
- Using Xlib With Tcl/Tk
- 3D Text for Tk in Unix
- C compiled image processing on an interactive Bwise canvas
- automatically generating socket based Tcl / C connection code, 1
- automatically generating socket based Tcl / C connection code, 2, using bwise
- Connecting Tcl/Tk with GNUstep Objective-C programs
- Building Tcl with the free VC++ toolkit
- How to invoke a C function from Tcl
- Tcl and other languages
- Critcl
- C-header Parser
- C code generators
- C Language