220 likes | 362 Views
World’s first Forth compiler for the .NET platform. Delta Forth .NET. Valer BOCAN , PhD. Agenda. What is Forth anyway? Reverse Polish Notation Stack-based programming Delta Forth .NET Demonstration. What is Forth anyway?.
E N D
World’s first Forth compiler for the .NET platform Delta Forth .NET Valer BOCAN, PhD
Agenda • What is Forth anyway? • Reverse Polish Notation • Stack-based programming • Delta Forth .NET • Demonstration
What is Forth anyway? • Procedural, stack-based language that is compiled and interpreted at the same time • Developed by Chuck Moore at the US National Radio Astronomy Observatory in the early 1970s • Procedures are called words that are grouped in vocabularies. • Forth is a meta-language, as new words can form new specialized Forth-like languages
Where is Forth used? • Popular for developing embedded systems. • Implemented on RISC processors • Open Firmware boot ROMs used by Apple, IBM, and Sun Microsystems • First stage boot controller for FreeBSD • Software that controlled the robotic arm that repaired the Hubble Space Telescope
Implementing Forth • 50-70% of a typical Forth implementation is written in… Forth • Implementation effort is small; a single developer can create a Forth system on a new platform in months • Delta Forth .NET was implemented in just 5 weeks
Agenda • What is Forth anyway? • Reverse Polish Notation • Stack-based programming • Delta Forth .NET • Demonstration
Reverse Polish Notation (RPN) • Invented by Charles Hamblin in 1950’s to enable zero-address memory stores • In postfix notation, the operators follow their operands, i.e. 3 + 5 becomes 3 5 + • RPN obviates the needs for parentheses otherwise required by infix notation • Reading from left to right, calculations can occur as soon as an operator is read
RPN Sample • Take infix expression (2 + 5) * (10 – 4) • This translates to postfix expression 2 5 + 10 4 - * • See how the postfix expression is evaluated using a stack-based algorithm - + 4 * 5 10 6 2 7 42
Agenda • What is Forth anyway? • Reverse Polish Notation • Stack-based programming • Delta Forth .NET • Demonstration
Stack-based programming • Unusual programming style, close to machine • Forth uses two stacks: • Parameter stack, used to transmit parameters between words • Return stack, used to hold the return address of the word caller and some counter for loop functions • There are some powerful primitives to handle the stacks
Forth primitives (1/5) • DUP – duplicates the topmost element on the stack DUP 33 33 33 20 20 9 9
Forth primitives (2/5) • DROP – drops the topmost element on the stack DROP 33 20 20 9 9
Forth primitives (3/5) • SWAP – swaps the two topmost elements on the stack SWAP 33 20 20 33 9 9
Forth primitives (4/5) • OVER – duplicates the second topmost element on the stack OVER 20 33 33 20 20 9 9
Forth primitives (5/5) • ROT – rotates the three topmost elements on the stack ROT 10 33 33 20 20 10 9 9
Agenda • What is Forth anyway? • Reverse Polish Notation • Stack-based programming • Delta Forth .NET • Demonstration
Delta Forth .NET • Sequel of the Delta Forth for Java project (1997) • C# command-driven application • This dialect is not interpreted, the generated code is fully managed • Supports Forth at the .NET consumer level (i.e. no new .NET classes can be derived) • Supports interoperability with other .NET libraries
Hello World in Forth • Perhaps the most odd looking Hello World out there : main \ Entry point ."Hello World" ;
Forth Sample (1/2) • Finding prime numbers (up to 400 in this case) 400 constant limit : isprime \ Returns 1 if the number on top of stack is a prime number 2 begin over over mod 0= 0= rot rot dup >r over 2 / > 0= rot and r> swap while 1+ repeat over 2 / > ; : main \ Entry point ."Prime numbers up to " limit . .": " limit 1 do iisprime if i . space then loop ;
Forth Sample (2/2) • Euclid’s algorithm 4330 constant num1 \ The first number 8235 constant num2 \ The second number ( Word to test if value on top of stack is equal to or less than 0 ) : ZeroLessEqual dup 0= swap 0< or ; : gcd (num1 num2 - - -) over ZeroLessEqual if (num1 is <= 0) drop drop else dup ZeroLessEqual if (num2 is <= 0) drop drop else begin over over = if (We've got the result) . else over over > if swap then over - 0 then until then then ; : main \ Entry point ."GCD of " num1 . ." and " num2 . ." is " num1 num2 gcdcr ;
Agenda • What is Forth anyway? • Reverse Polish Notation • Stack-based programming • Delta Forth .NET • Demonstration
Questions? www.bocan.ro/deltaforthnet valer@bocan.ro