Go Forth!
Blog Post
Posted Oct 19, 2010
by Colin Walls
Follow on Twitter
Go URL
What is a Go URL?I was writing recently about my fondness for RPN [Reverse Polish Notation] and this reminded me of a programming language, designed specifically for real time and embedded applications, which has largely been forgotten: Forth. It is interesting to look at how Forth worked and the benefits it offered for embedded developers. I am not proposing that the language be revived and used for new developments, but I think there are valuable lessons to be learned.
My attention was originally draw to Forth when somebody told me that there was a programming language which facilitated the generation of code using less memory than an assembly language implementation of the same functionality. I did not believe them, but it hooked me in …
Forth is a Threaded Interpretive Language, which means that the code is compiled into an internal form, which is read by runtime software to give the effect of execution, much the same way that Java is normally implemented. It is possible to include native assembly language components as required.
A Forth program is comprised of a number of “words” - entities that are basically similar to functions in C. Each word consists of references to other words, which may be predefined or ones created by the developer. A word may also be an assembly language routine. In source form, a word is any sequence of non-space characters; when compiled, they become a list of addresses, which point to other words or assembly language.
A fundamental aspect of Forth is its use of a stack, which it uses for most data manipulation. Words tend to operate on the data on top of the stack, maybe removing it, and place results there.
Forth may be used interactively, where each line of code is executed when the RETURN key is pressed, or it may be compiled for create new words. For example, you could type this line:
3 dup + .
The interpreter would [probably] not find a word called “3″, so it would attempt to treat this as a constant and place the value on the stack.
The word “dup” results in the duplication of the top stack item [so now there are two stack entries of the number 3].
It is probably obvious that “+” adds together the 2 top items on the stack and pushes the result [6] there.The last word, “.”, pops a value off the stack and displays it.
If this were an operation that you wanted to perform frequently, you could define a word of your own to do it, thus:
: show2times dup + . ;
The word “:” tells the interpreter to start compiling a word with the name that follows - in this case “show2times”. The “;” marks the end of the text to be compiled. Having done this, you can double and print 3 by typing:
3 show2times
From this short description and trivially simple example, I hope that you can see that Forth is conceptually quite different from C and other more familiar languages and also has a lot of flexibility and expressiveness. Many people criticize Forth for being a “write only language”, as it is very easy to write code which is impossible to read. Although I would agree that this is true, I promise that I could write some completely unintelligible [but valid] C, if required to do so.
Last week I attended a seminar, where one of the speakers was discussing the history of their company over the last 25 years. He talked about their first project being done in Forth and commented that this was unlikely to be the way things would be done today. I wonder if Forth will ever see a revival. Or maybe there are people out there still using it …
Preparing RecommendationsMore Blog Posts
Preparing RecommendationsRecent Posts
- GTC - mission accomplished
- Measuring RTOS performance - a Web seminar
- The value of MISRA-compliant software
- Preparing for GTC
- Who needs a Web server?
- More on Yocto Terminology - recipes and packages
- PowerPoint hints and tips #2
- New book
- Video
- In an open-source world, it’s all about integration
Comments (↓ Add Your Own)
9 Comments on this Post
Commented on 5:12 PM, Oct 20, 2010
By Dave Wyland
Commented on 5:54 AM, Oct 21, 2010
By Craig
Commented on 2:27 PM, Oct 21, 2010
By Colin Walls
Commented on 2:31 PM, Oct 21, 2010
By Colin Walls
Commented on 6:04 AM, Oct 28, 2010
By Dave Wyland
Commented on 7:52 AM, Oct 28, 2010
By Colin Walls
Commented on 6:45 PM, Nov 28, 2010
By Charles Manning
Commented on 8:53 PM, Nov 30, 2010
By Colin Walls
Commented on 10:39 PM, Feb 28, 2011
By Rob
Add Your Comment
Please complete the following information to comment or sign in.