Forth Versus C
2004 Apr 04
Some IAQs ( Infrequently Asked Questions ) about Forth and C.
Q. What is Forth?
A. Forth is a computer programming language which has a return stack, an explicit parameter stack and a dictionary. It features an incremental compiler, an interpreter and a very fast edit-compile-test cycle. Forth is extensible.
Q. What is C?
A. C is a computer language which has a single, implicit stack. It features a “tool set” that includes a batch-mode pre-processor, compiler, linker and makefile program. It also features a binary ( pre-compiled ) distribution system using libraries and header files. C is not extensible.
Q. Why is Forth not as widely used as C?
A. C is much better suited to most business environments.
Q. So why use Forth?
A. Because it is possible to write better programs in Forth than in C.
Q. Could you define “better” in this context?
A. Easier to read and maintain, fewer bugs, smaller, faster development.
Q. So why doesn’t everyone use Forth?
A. Because it is also possible to write worse programs in Forth than in C.
Q. Perhaps you should also define “worse” …
A. Impossible to read and maintain, more bugs, bigger, longer development.
Q. Why is this?
A. Because Forth does not impose any restrictions on what you do or how you do it. However large your C program gets the source for it will still be C. Since Forth is extensible, you can extend the language so that part of your program can be written in a superset of Forth, specifically tailored to the application.
Q. Doesn’t this mean that you have to learn what is essentially a new language for every application?
Q. And this doesn’t worry you?
A. If the “new language” maps exactly onto the problem domain, what you are learning about is the problem, and then describing the solution becomes trivial.
Q. What about if the “new language” does not map to the problem domain?
A. You are in big trouble! The worst programs are those where an entirely new language is created independently of the problem, and then the problem is solved using this new language. You then really do have to learn a new language and the problem domain. This is actually much worse than programming in C, where at least you already know the language.
Q. How do you make sure that your Forth programs map to the problem domain?
A. Feedback. Ask the people who understand the problem domain if the program is right. Non-programmers can spot deviations from reality better than programmers, who usually immerse themselves in too much detail.
Q. But how can a non-programmer even read a program, let alone tell whether it is right?
A. Forth syntax can be learnt in an hour or two. If the top level of the program cannot be read and understood by someone who understands the problem domain, it is wrong and you should change it.
Q. How much faster can you develop programs in Forth compared to C?
A. This depends on the type of application and what is already available. Almost all programs are not so much written as “ported” from similar programs. It is very unusual to see the same application written in both Forth and C, so comparison of development times must be anecdotal. For embedded, non-multitasking applications I would put the ratio of Forth:C development times at around 1:2 to 1:3. For embedded multitasking applications at between 1:4 to 1:6, and for PC based Windows applications about 1:4. Others have suggested figures of 1:10 or even higher. I think 1:pi is about right.
Q. You are claiming that you can finish a program three times more quickly in Forth than C. How can this be true?
A. The difference is not only in the language syntax - you can convert Forth code into C and back relatively easily. It is possible to develop code in a C-like way in Forth, but it is not possible to develop code in a Forth-like way using the C tool set.
Q. What is it about the C tool set that stops you programming in a Forth-like way?
A1. The C language and tool set operate in a batch mode. The time taken to edit source, build and download is not usually less than a number of seconds. Because Forth compiles incrementally and has an interpreter and explicit stack, changes can be tested immediately. The turn-round speed is actually more important than most people realise.
A2. The lack of an interpreter in C means that code must be tested using “printf”, a source level ICE/debugger or a special test harness or Command Line Interpreter. All of these techniques add to the complexity of the system. Forth has an interpreter, and this combined with the explicit stack means that you can enter arguments and test any function at any time.
A3. Forth is extensible, so you can create a superset of Forth which describes your problem domain exactly.
Q. I have seen versions of Forth written in C. Doesn’t this mean that you can get all of the advantages of Forth, but written in C?
A. No. The real power of Forth lies in the synergy of the entire system. You can certainly gain an interpreter, but at the expense of a duplicate set of tools, two file formats, and two languages to learn before you even start on the application.
Q. Does Forth have any known weaknesses?
A. Yes. There is no support within the Forth language for version control. C provides pre-compiled libraries and header files which allow vendors to supply their code in a form that cannot be modified by the customer. This is a simple but effective version control system. Many Forths are supplied with a similar binary module system but this is an extension to the language.
Q. Does Forth have any perceived weaknesses?
A1. Yes. Because Forth is so simple, many people have written their own.
In fact it is almost mandatory that computer science students spend an afternoon writing a Forth, just to see how easy it is. Not surprisingly, not all Forths are created equal. The finely honed products available from Forth, Inc., MPE Ltd and other commercial vendors are vastly better than most of the free Forths available on the WWW. Specifically, with advances in native compiler technology, Forth is no longer slow.
A2. Forth is sometimes accused of being cryptic or “read only” code. This is because there is a lot of cryptic, “read only” code written in Forth. If you are going to use Forth, you must control its use, and ensure that your code is easy to read. This is a project management issue.
A3. Forth uses “Reverse Polish” notation. This is because the problem domain that the Forth system is addressing is “how to tell the computer what to do”. The simplest way to solve this problem is to give the computer its instructions in the order that it needs them. The code “1 2 +“ tells the computer to put a 1 on the stack, put a 2 on the stack and add them. The fact that the rest of the world ( HP calculators excepted ) write “1 + 2” is because this shows the operator and its arguments in a graphical way, as written on a chalkboard. It is easy to write a Forth parser that converts “1 + 2” into “1 2 +”, but this would put a boundary onto the Forth system that would make further extensions to the language much more difficult. Reverse Polish is seen as antiquated, and the fact that the computer has not even been taught to understand common usage is interpreted as a major weakness. In fact, it is just that Forth is not attempting to solve an entirely different problem.
A4. Forth is perceived as a “dead” language. This is because it is not being championed by big companies, nor is it taught as the de facto standard in most computer science courses. In fact Forth is alive and well in many low-profile niche markets, usually where resources are limited, software must be reliable or there is a need for an interpreted “scripting language”.
One limited resource is often money - short development times mean reduced costs. Smart cards and space environments are examples of restricted hardware where Forth flourishes.
Q. Why has Forth been described as “a polarising language”?
A1. People either love Forth or hate it. It is easy not to like Forth. Programmers don’t like Forth because it is not fashionable ( at the time of writing ) and does not look good on a CV. Project managers don’t like Forth because they can’t get Forth programmers easily, and the quality of code depends critically on the programmer. University lecturers don’t like it because there is not enough that can be taught about Forth that can be examined. Software vendors don’t like Forth because it removes the complexity they need to survive. Users don’t like Forth because they have never heard of it.
A2. People either love Forth or hate it. It is easy to like Forth. Programmers like Forth because its fun – you remove the tedious 66% of the job. Project managers like Forth because they can get the project finished on time, with fewer, easier-to-find bugs. University lecturers like Forth because they can teach their students about the art of programming and be involved in the cutting edge of computer science. Software vendors like Forth because they get involved with their customers to help them solve their problems and refine their products at the same time. Users like Forth because it makes programs that work.
Q. So you like Forth then?
Q. What about C?
A. I have nothing against C – it is a language specifically tailored to the problem domain of “writing C based operating systems”. Unix/Linux and DOS/Windows are written in C and are immensely successful.
“If your only tool is a hammer, all problems become nails”. For those applications that are not operating systems, Forth is probably a better language to use than C.
Q. Is that it?
Howerd Oakford 2004 Apr 04