[HN Gopher] Thinking Forth (1984)
       ___________________________________________________________________
        
       Thinking Forth (1984)
        
       Author : susam
       Score  : 121 points
       Date   : 2022-11-20 08:36 UTC (14 hours ago)
        
 (HTM) web link (thinking-forth.sourceforge.net)
 (TXT) w3m dump (thinking-forth.sourceforge.net)
        
       | nickcw wrote:
       | I treasure my copy of Thinking Forth. I was at a formative age
       | when I read it and I learnt so many great programming concepts
       | from it. The most important being keep breaking the problem down
       | into simpler bits so you can understand and name each bit.
       | 
       | It is a Forth book, but I think anyone could get things out of
       | it.
       | 
       | Leo Brodie's cartoons are very good too. One of my favourite ones
       | is of a machine called the "Universal Processor" with a blender
       | on top and computer keyboard underneath and a knob on the front
       | which has three positions "Word", "Food", "Data" illustrating the
       | danger of building over general solutions.
        
       | ninefathom wrote:
       | My introduction to Forth was tinkering first with Sun SPARC
       | machines in the late 90s and then PowerMacs in the early 00s.
       | 
       | At the time, I had no idea that it was a discrete programming
       | language; it only registered in my mind as part of the
       | OpenBoot/OpenFirmware environments. Then I ran into the FreeBSD
       | bootloader and things finally clicked. "Aha," I thought, "this is
       | an actual programming language." But what made it so popular for
       | the early boot process, and where else was it used?
       | 
       | The modularity was stunning. It was easy- almost absurdly so- to
       | build complex code up from a series of tiny individual functions.
       | That, coupled with the minuscule interpreters and simple stack-
       | based approach, made perfect sense for situations where
       | developers need to perform complex tasks with minimum of storage
       | overhead, and with portability as a first class citizen.
        
         | DonHopkins wrote:
         | I've frequently written about Mitch Bradley's Forthmacs / Sun
         | Forth / CForth / OpenBoot / OpenFirmware on HN. I was his
         | summer intern at Sun in 1987, and used his Forth systems in
         | many projects!
         | 
         | https://github.com/openbios
         | 
         | https://wiki.laptop.org/go/FORTH
         | 
         | https://news.ycombinator.com/item?id=29261810
         | 
         | Speaking of Forth experts -- there's Mitch Bradley, who created
         | OpenFirmware:
         | 
         | https://news.ycombinator.com/item?id=21822840
         | 
         | Here's the interview with Mitch Bradley saved on archive.org:
         | 
         | https://web.archive.org/web/20120118132847/http://howsoftwar...
         | 
         | [...]
         | 
         | https://news.ycombinator.com/item?id=27484426
         | 
         | I wrote malloc.fth for Mitch Bradley's ForthMacs, which ended
         | up in OpenFirmware:
         | 
         | https://github.com/openbios/openfirmware/blob/master/ofw/cor...
         | 
         | [...]
         | 
         | https://news.ycombinator.com/item?id=26892629
         | 
         | In a lot of FORTH implementations, constant numbers like 0, 1,
         | -1 and others are hard coded, not just for speed but also for
         | space: a call to a code word only takes one cell, instead of
         | using two cells with a LIT [value].
         | 
         | Here's some Breshenham line code I first wrote in FORTH (Mitch
         | Bradley's SunForth on a 68k Sun-2 with cg2 graphics board),
         | then translated to 68k code (using the rpn FORTH assembler) --
         | the FORTH code is commented out before the corresponding
         | assembly code:
         | 
         | https://donhopkins.com/home/archive/forth/cg/line.f
         | 
         | [...]
         | 
         | https://news.ycombinator.com/item?id=17480298
         | 
         | Cool! Does it include a FORTH 6502 assembler written in FORTH?
         | I love writing assembly code in RPN with Forth macros!
         | 
         | You can write FORTH code with loops and conditionals and any
         | kind of logic and parameters, that dynamically assembles
         | machine code! Much better than your typical macro assembler.
         | 
         | Here's some 6502 assembler for an Apple ][ SUPDUP terminal
         | emulator that does ram card bank switching:
         | 
         | http://www.donhopkins.com/home/archive/forth/supdup.f
         | 
         | [...]
         | 
         | https://news.ycombinator.com/item?id=22456471
         | 
         | In what way is PostScript worse than Forth? Please answer with
         | specific details, and provide links to code if you can. I
         | programmed a lot of Forth code before learning and moving on to
         | programming a lot of PostScript code, so I've used each of them
         | extensively, and much prefer PostScript, and I'm happy to show
         | you why and explain by showing you code.
         | 
         | [...]
         | 
         | https://news.ycombinator.com/item?id=21968175
         | 
         | Kragen is right that PostScript is a lot more like Lisp or
         | Smalltalk than Forth, especially when you use Owen Densmore's
         | object oriented PostScript programming system (which NeWS was
         | based on). PostScript is semantically very different and much
         | higher level that Forth, and syntactically similar to Forth but
         | uses totally different names (exch instead of swap, pop instead
         | of drop, etc).
         | 
         | [...]
        
           | kragen wrote:
           | Aw, I'm flattered my comments merited a mention
        
         | Gordonjcp wrote:
         | > But what made it so popular for the early boot process, and
         | where else was it used?
         | 
         | Probably simplicity. You can get a very basic Forth system
         | going in a few dozen assembly instructions. Then, you write
         | some Forth "primitives", words written in assembly, to do
         | things like basic arithmetic, branching, stack manipulation,
         | and memory manipulation. There are endless debates about how
         | many primitives you really need, but in general a couple of
         | dozen primitives ought to get you started.
         | 
         | Then the rest of Forth is just written in Forth! You might not
         | really have recognisable Forth source at this stage but more
         | complex words can be written out as lists of the addresses of
         | primitives. Think of it as like rolling your own macro
         | assembler. The "inner interpreter" reads these lists of
         | addresses and either jumps directly to the machine code in a
         | primitive, or into a command that starts the inner interpreter
         | chewing on a new word, pushing the one you've just come from
         | onto the return stack.
         | 
         | It seems really really complex until at some point as you stare
         | at it, it'll just snap into focus and you see it's actually a
         | very simple thing that does a very clever trick.
        
           | masklinn wrote:
           | Sectorforth and sectorlisp are interesting studies in
           | minimalism. One of the goals of sectorforth's author was to
           | know whether
           | 
           | > if you have an interactive terminal, a dictionary, and the
           | colon compiler, can you really build everything else based on
           | just eight primitives?
           | 
           | > Turns out the answer is yes
           | 
           | The eight primitives come from an old usenet thread:
           | https://groups.google.com/g/comp.lang.forth/c/NS2icrCj1jQ
        
       | anta40 wrote:
       | Beside embedded system or firmware, what are Forth's popular use
       | cases these days?
       | 
       | Personally I never see backend development or mobile frontend job
       | vacancies that require Forth skill, for example.
        
         | AmalgatedAmoeba wrote:
         | IIRC WebAssembly is at least partially inspired by Forth --
         | both in syntax and being stack-based.
        
           | Gordonjcp wrote:
           | Python too, and of course PostScript.
        
             | armitron wrote:
             | Python has nothing to do with Forth, they couldn't be more
             | opposite to each other if they tried. I recall Chuck Moore
             | in a Silicon Valley Forth Interest Group meeting express
             | his disappointment at how modern programming languages (and
             | Python was among the ones mentioned) that are advertised as
             | "simple" are anything but.
             | 
             | Python is an enormously complex language, full of
             | inconsistencies and bad design. However, it masks that
             | complexity behind a facade of user-friendliness which has
             | done wonders for its popularity. Forth is not only as
             | simple as it gets, but also an elegant and totally honest
             | language. That Chuck Moore managed to distill the essence
             | of programming in this form, speaks to his genius.
             | Unfortunately, as is often the case with genius, it can be
             | decades to centuries until the ideas percolate and emerge
             | in a popular fashion.
        
               | Gordonjcp wrote:
               | > Python has nothing to do with Forth, they couldn't be
               | more opposite to each other if they tried
               | 
               | Really? You don't look at the stack machine that runs the
               | .pyc files and go "jeez this is just Forth with some
               | syntactic sugar on"?
        
               | davidgay wrote:
               | > Really? You don't look at the stack machine that runs
               | the .pyc files and go "jeez this is just Forth with some
               | syntactic sugar on"?
               | 
               | No, because stack machines, including stack machines for
               | use as interpreters of compiled languages, pre-date Forth
               | by many years:
               | https://en.wikipedia.org/wiki/Stack_machine
        
         | thrown_22 wrote:
         | That's literally what it's for. Forth is the simplest language
         | to get running on hardware which you have no idea how to
         | program directly. Much easier than doing it for C.
        
         | spaintech wrote:
         | You are correct, Forth is not a institutional tool, more of a
         | individual choice. IMO, one that allows you to prototype and
         | debug interactively as you write your code and has been like
         | that since the beginning.
         | 
         | It allows you to train yourself to have a complete control and
         | command of your code making for tighter, simpler solutions for
         | complex problems ( In my personal experience and comments for
         | those that have been introduced to FORTH.)
         | 
         | If you consider that Embedded is a highly constrained resourced
         | environment, then FORTH is a fantastic choice. Now step back,
         | consider that statement once more, and you could be onto
         | something even greater, as there is lots of resource waste-
         | gates on modern OS and Computers. Now that Power is becoming a
         | greater constrain resource, there might be an opportunity for
         | someone to build something great in forth.
         | 
         | BTW the biggest back en used case is the bitcoint smart
         | contract which is based on FORTH.
         | 
         | As you can see, and in full agreement in your statement, FORTH
         | is a not a job magnet, IMO, you get better at programing
         | understanding FORTH.
         | 
         | See Bret Victors talk, https://youtu.be/PUv66718DII you most of
         | that already @ Forth ...! :;
         | 
         | Try it, you'll never go back! :)
        
           | Gordonjcp wrote:
           | > IMO, you get better at programing understanding FORTH.
           | 
           | Modern cars don't have a magneto or carburettor, but you'll
           | have a far better ability to fix your Jag if you also know
           | how to fix your lawnmower.
        
             | spaintech wrote:
             | In the car analogy, it's more like learning and
             | understanding the limitations of the Otto Engine so that
             | you can build a better one... IMO. :) BTW, in aviation,
             | where reliability, constancy, and longevity, they still use
             | magnetos and carbs... :D :;
        
           | anta40 wrote:
           | >> IMO, you get better at programing understanding FORTH
           | 
           | Isn't assembly fit the place better?
           | 
           | :)
        
         | ww520 wrote:
         | Yes. People just don't see it. I would argue the stack based
         | VM's are Forth based or inspired. Language VMs are running
         | everywhere, billions of devices.
        
         | lebuffon wrote:
         | Forth has not won any popularity awards since the end of the
         | '90s but it is still used by a small group of engineers around
         | the world to solve their custom needs. This can be for embedded
         | projects or firmware yes, but it has crept into larger
         | projects.
         | 
         | IMHO opinion Forth is hard to learn, takes more effort to
         | bootstrap your project (more like Assembler) and more
         | importantly it is hard to switch gears to think with Chuck
         | Moore's methodology. However once learned it can make one very
         | productive.
         | 
         | Forth was (is?) used for experimental control in the ISS quite
         | regularly. The ability to wip up a simple DSL that talks
         | directly to hardware and will compile or can be used as a
         | script is a win for those custom projects.
         | 
         | It's running in the FEDEX handheld package scanner from what I
         | understand. (may be dated information) Funny story that. Way
         | back, Version I was started in C but they hit the ROM size
         | limits on the hardware that was already finished. Forth Inc.
         | was asked if they could help. Using their Forth RTOS they re-
         | wrote it and it all fit with room to spare. (Indirect-threaded-
         | code is tight)
         | 
         | Years later, Version II hardware was designed with waaay more
         | memory. Re-write in C fit nicely. All good.
         | 
         | But... the batteries would not last for an entire shift. Forth
         | Inc was brought in again and they own their task scheduler so
         | they modified it to put the CPU to sleep at every chance they
         | could. Batteries lasted.
         | 
         | Largest known Forth program is on Windows.
         | https://ribccs.com/candy/ 1M+ LOC. Compiles with VFX Forth by
         | MPE UK.
         | 
         | </sermon>
        
           | cmpaul wrote:
           | YES! I worked on the FedEx Enhanced SuperTracker software
           | from 1999-2006, which I believe is the "Version II" you're
           | referencing. The core software was still written in Forth,
           | but we rebuilt the package routing logic in in C, which might
           | be what you're referring to. Very curious to know how you are
           | familiar with all the history, did you work there or at
           | Forth, Inc?
        
       | vrnvu wrote:
       | I love Chuck Moore's minimalism applied to programming. [^1][^2]
       | It goes hand in hand with the UNIX philosophy of keeping things
       | simple that we can see in other software (linux) or languages
       | (LISP, Go, Erlang )...
       | 
       | Also, I've always said that `Thinking Forth` is great for
       | beginners even nowadays. It was published in the 80s yes. But it
       | touches several "modern" topics like unit testing, function
       | composition, modular design...
       | 
       | [^1]http://www.ultratechnology.com/method.htm
       | [^2]http://www.ultratechnology.com/forththoughts.htm
        
       | DonHopkins wrote:
       | One of the best programming books ever!                   FORTH
       | ?KNOW IF             HONK!         ELSE             FORTH LEARN!
       | THEN
        
       | mro_name wrote:
       | are there any webprojects or cgis in forth to study?
        
       | dankle wrote:
       | Sourceforge is still around?
        
         | incanus77 wrote:
         | They should specialize in Forth hosting and call it
         | Forthsourge.
        
       | dang wrote:
       | Recent and related:
       | 
       |  _Starting FORTH (1981) [pdf]_ -
       | https://news.ycombinator.com/item?id=33674486 - Nov 2022 (22
       | comments)
       | 
       | Lots more links here:
       | https://news.ycombinator.com/item?id=33676237
        
       | drivers99 wrote:
       | I'm in the middle of reading it (a paperback version) this week
       | coincidentally. Seeing this on HN just now made me do a double-
       | take.
        
       | account-5 wrote:
       | I'd love to learn (a) Forth. As a beginner, where do you begin?
       | Like Lisp there seems to be different variants. I always struggle
       | with where to start.
        
         | nickcw wrote:
         | I'd recommend gforth. It runs on lots of systems and is well
         | maintained.
         | 
         | https://gforth.org/
         | 
         | Eventually you'll build your own forth (seems to be a right of
         | passage!)
        
           | teddyh wrote:
           | "rite of passage"
        
         | unsafecast wrote:
         | Write one! Forths are so simple that you can write one in
         | minutes if you understand it, and a bit more if you don't know
         | anything about it. Having your own forth is both really
         | gratifying, and gives you an opportunity to play around with
         | the internals and change things up to see what happens (and why
         | the choices made were made).
         | 
         | Forth is one of the languages where you have to know the
         | internals to write it, but the internals are really simple.
        
           | jabits wrote:
           | Sounds good. Any recommended starter guides? Thanks!
        
             | bear8642 wrote:
             | Jones Forth[0] is a good literate programming
             | implementation that explains the internals as he goes.
             | 
             | [0]https://github.com/nornagon/jonesforth/blob/master/jones
             | fort...
        
             | t-3 wrote:
             | If you know C, retroforth's nga vm is ~300 lines and quite
             | simple. I found it to be enlightening.
             | 
             | https://git.sr.ht/~crc_/retroforth/tree/master/item/doc/Nga
             | .... - this is the "literate" version, there are a few
             | variants of the source in the tree if you look.
        
         | kragen wrote:
         | I'm no Forth expert, but I've found Gforth highly educational.
         | It's interactive, runs under Linux, is free software, supports
         | the ANS standard, is well documented, is widely used (at least
         | as widely used as any Forth these days), is still maintained
         | after 27 years, and supports SEE so you can disassemble words
         | and see how they're written. Since Gforth 1.0 it has context-
         | sensitive help ("help begin", etc.) Before Gforth I used PFE,
         | which shares most of these attributes.
         | 
         | Richard W. M. Jones's Jonesforth is pretty interesting reading,
         | and maybe the best explanation around of how to build a Forth,
         | but keep in mind he wasn't by any means a Forth expert when he
         | wrote it; at first he had the rotation direction backwards for
         | ROT. But he was already a first-class hacker, and that matters
         | more.
         | 
         | But more recently my understanding of Forth has changed. I
         | never did understand why such a janky programming language had
         | such enthusiastic fans; even though C doesn't have closures, C
         | is a better programming language for any situation that doesn't
         | involve an existing Forth codebase, and for many situations
         | that do.
         | 
         | My epiphany was that _Forth isn 't a programming language_. I
         | mean, it does have a programming language _in it_ , but it's
         | not a very good programming language, just the tiniest step
         | past assembly language that can give you structured control
         | flow and nested expressions. What's _excellent_ about Forth is
         | that it contains an interactive programming _system_ with
         | virtual memory, multithreading, compile-time metaprogramming,
         | higher-order run-time programming, and instant recompilation,
         | in about 8 kilobytes of memory. You can even get a substantial
         | fraction of it in much less than that.
         | 
         | You know how it's useful to be able to log into the flaky web
         | or database server and run some commands to see what's going
         | on, maybe restart an errant process or two, or tweak a config
         | file parameter? (Even if you don't actually do this because you
         | push all your config changes through Git and Kubernetes, surely
         | you've at least felt the temptation if you've ever administered
         | a server.) Forth gives you an interactive shell on almost the
         | tiniest microcontrollers, and it's a scriptable interactive
         | shell that has full access to the machine's I/O ports and
         | memory. Which is what you want when you're trying to get a
         | weird new peripheral working. You want an interactive
         | environment (maybe like target debugging with GDB, but with a
         | more efficient scripting language, or OpenOCD), not a batch-
         | mode setup where every new experiment requires waiting for a
         | compile and reflash.
         | 
         | It's in that spirit that Frank Sergeant described his 66-byte
         | target-debugging stub/bootloader for the 68HC11, which has 192
         | bytes of RAM, as a "three-instruction Forth":
         | https://pages.cs.wisc.edu/~bolo/shipyard/3ins4th.html It
         | clearly isn't a _programming language_ he 's after.
         | 
         | And, from that point of view, things like Gforth and Jonesforth
         | are likely to mislead, because they're "Forth without Forth":
         | the Forth language, but without the Forth "operating system",
         | and only runnable in environments that are far too large to
         | justify the tradeoffs Forth makes. They do work, but they
         | aren't compelling.
         | 
         | I think this is sort of like conflating Unix with bash. People
         | who use Unix intensively tend to use bash intensively (or,
         | previously, tcsh or ksh, and nowadays sometimes oil, zsh, or
         | fish, but usually bash). And part of the reason for that is
         | that you can actually whip up some pretty cool stuff pretty
         | quickly as a shell script. For example, here's a thing I wrote
         | in a few minutes the other day which generates a random
         | incorrect acronym expansion for "STC" (reformatted for
         | readability):                   echo stc | while :;         do
         | dd of=/tmp/tmp.c.$$ bs=1 count=1 2>/dev/null;           c=$(cat
         | /tmp/tmp.c.$$);           if [ -z "$c" ]; then break; fi;
         | grep "^$c" /usr/share/dict/words |              shuf -n 1 |
         | tr '\n' ' ';         done; echo
         | 
         | Result:                   spoil transform circumference
         | 
         | But imagine trying to apply bash in an environment without disk
         | caching for your filesystem, multitasking, grep, cat, dd, shuf,
         | tr, or /usr/share/dict/words. All you're left with is the
         | programming language! And bash is honestly a pretty shitty
         | programming language. You'd wonder why anybody ever bothered
         | with Unix in the first place! And that's because Unix isn't
         | bash or the Bourne shell. They're an important part of it but
         | not the bulk of it; bash outside of the context that makes it
         | so insanely useful is a bit like a fish out of water, or maybe
         | an elevator operator in a modern automatic elevator.
         | 
         | I don't know what embedded Forth to recommend, though, because
         | I've never actually used Forth on a microcontroller. The only
         | time I've ever used Forth without another OS under it is in
         | OpenBootPROM/OpenFirmware. So I might be all wrong about this!
         | Hopefully more experienced people can correct me. Paging
         | DonHopkins! Paging abecedarius!
        
           | akkartik wrote:
           | Thank you, wonderful comment. Favorited.
        
             | kragen wrote:
             | I'm delighted you liked it! Your opinion here is especially
             | important to me, given the work you've done.
        
         | abecedarius wrote:
         | See _Starting Forth_ by the same author; it 's good and short.
         | It is even older, so it won't help on choosing an
         | implementation and will be affected by a few differences in
         | dialect.
        
         | nmz wrote:
         | For the forths, pforth is certainly portable, pfe on windows,
         | 8th is ok. ficl is supposed to be for scripting, awhile back
         | (years) measured and it turns out its the fastest one in
         | certain cases.
         | 
         | For the new agey stuff I'd say start with factor if you're on
         | x86. if you're not maybe try retro[0], or write your own.
         | 
         | [0]: http://forthworks.com/retro/
        
       | mud_dauber wrote:
       | Loved the language - first as an embedded developer (late 80s),
       | then with Harris Semi's RTX microcontroller team. I see a Forth
       | reference about once per month on HN but nothing in developer-
       | specific forums, so I have to assume Forth is dead.
       | 
       | What gives? Is there some use case that only Forth can satisfy?
       | Is it just the simplicity and "strangeness"?
        
         | astrobe_ wrote:
         | > I see a Forth reference about once per month on HN but
         | nothing in developer-specific forums, so I have to assume Forth
         | is dead.
         | 
         | Depends on your definition of dead |1].
         | 
         | > Is there some use case that only Forth can satisfy?
         | 
         | Interactive programming with really low resources, or the
         | advantage of having an interpreter that you can tune and adapt
         | at will.
         | 
         | [1] https://forth-standard.org/
        
         | jedimastert wrote:
         | I haven't gone as deep as I'd like to into Forth, but I liken
         | it somewhere in between Assembly and C in terms of level of
         | abstraction, and from what I can see the trends of programming
         | languages are features that move further away from hardware and
         | computer specifics towards higher level concepts (the first
         | thing that jumps to mind is Lisp)
        
       ___________________________________________________________________
       (page generated 2022-11-20 23:02 UTC)