7 ms·
As you learn Forth, it learns from you (1981)
- asguy 2y agoProgramming Forth caused the most massive change in my programming mindset (the LSD of programming languages). Even more so than Lisp. Thinking of the rapid rise of the base language to the problem domain (i.e. it's a DSL construction kit) opened my eyes to how to design useful and extensible APIs. https://thinking-forth.sourceforge.net https://thinking-forth.sourceforge.net is worth reading, even if you have no desire to ever program any Forth.
- nequo 2y agoWhat are your main lessons from Forth for API design? Is it something you could summarize?
- saulpw 2y agoThey just said it was like the LSD of programming languages. Your question is kind of like "What are your main takeaways from LSD? Can you summarize?" which realllly misses the point.
- nequo 2y agoI don’t think so. There are many ways to describe how a mind altering experience with LSD would change how you relate to yourself and your environment. I am curious how Forth changed parent’s approach to programming.
- immibis 2y agoProbably in a similar way to learning Haskell, assembly, Erlang, data-oriented design, 4k demo programming, or any other thing that is unconventional enough that your normal patterns don't work and you are forced to expand the set of ways you know how to program.
- nequo 2y agoThis is both vague and speculative though. Vague because you have made no specific claims that could be evaluated one way or the other. Speculative because you have said nothing about Forth. You cannot make engineering decisions based on "it'll change how you program." There are several concrete examples of turning imperative code into pure monadic code that contains less boilerplate and is less noisy with Haskell's do notation. Exhaustiveness checking, encoding invariants in types, those all have good examples that one can read and agree or disagree with. Surely there are concrete examples that one can give about Forth too?
- skydhash 2y agoIt's metaphysical. Like learning a foreign language widen your perspective. It's a particular insight you gain about the act of programming that makes you realize that you've been boxing yourself to a very small imperative/oop space. Writing C code feels like writing a rule book, writing java feels like designing a lego set, writing lisp feels like writing proof, writing prolog feels like writing puzzles. Writing forth feels like writing a dictionary, then after that you write a few sentences. They're different feeling, but forth is one of the most flexible as you can go up and down from the most basic units to the high level ones. As another comment has mentioned, you can program forth where the basic units are elements from another language, and construct a dsl/dictionary out of it. Then switch the basic units while retaining your business logic for a faster implementation without a full rewrite.
- immibis 2y agoNot just the realization you were boxed into a space, but also knowledge of stuff inside a different box. The more boxes you have the ability to access, the better.
- saulpw 2y agoThe creator of Forth wrote this: > I wish I knew what to tell you that would lead you to write good Forth. I can demonstrate. I have demonstrated in the past, ad nauseam, applications where I can reduce the amount of code by 90% percent and in some cases 99%. It can be done, but in a case by case basis. The general principle still eludes me. -- Chuck Moore https://www.ultratechnology.com/moore4th.htm https://www.ultratechnology.com/moore4th.htm You might appreciate other quotes from the above page.
- sph 2y agoYou can describe LSD, or a novel programming paradigm, just as well as you can describe Beethoven's 5th symphony in words. The amount of lost bits of information makes the explanation totally worthless, even though you technically can explain it. The point is it's a waste of time. You won't understand LSD, Beethoven or Forth until you have tried them.
- samatman 2y agoSeveral literary careers have been made on summarizing the main takeaways from LSD.
- immibis 2y agoIf several literary careers have been made summarizing it, and it still is not adequately summarized, that proves the point.
- klyrs 2y agoIn my experience, the value of a trip isn't what you take away from it; it's the things that you can't take with you. Nobody really wants to see a whole slideshow of your vacation photos; it'll never compare to being there.
- sph 2y agoThere is a large contingent of people that claim to know about X because they read a good book on it, which is ludicrous nonsense. Indeed the most unique things of any experience is what you cannot put into words. Language is a very lossy compression algorithm, and some concepts aren't even computable in the first place (i.e feeling and emotions)
- deleted 2y ago[deleted]
- LudwigNagasena 2y agoAPI design is something relatively concrete though. One can provide examples of pre-Forth and post-Forth design.
- diffxx 2y agoNot the OP, but for me one of the main lessons from Forth is that the boundary between high and low level code can be as thin as you make it. With Forth, you can define high level words using low level primitive words. You then weave these low level words together at a high level. After you have written a correct solution at a high level, bottlenecks can be optimized out by introducing new low level words. It's like you are solving a problem by designing an instruction set specifically for that problem. But unlike a hardware ISA, you can add new instructions tailor made for the specific problem you are presently solving. Paul Graham has described lisp as a tool for writing fast programs fast (that's the gist at least). IIRC, he clarifies that each fast is a phase. Lisp allows you to write a fast, high level, prototype that might have poor runtime performance and then you refine the prototype so that the compiler can generate fast machine code. Forth is similar but feels closer to the machine than Lisp because of the stack based threading model. In Forth, you often don't need manual memory management _or_ garbage collection and you can easily extend the system with new low level words. But it does require you to think differently about your program design so that it fits the stack based vm model. Historically, Forth has been implemented in assembly but you can write a Forth that targets any host. The truly mind expanding thing is that you, an individual, can write a Forth compiler and you can also write it in such a way that it has multiple targets. For example, you can generate native, jvm and js targets from the same underlying source. Usually this can be done by translating the forth generated AST to source code for another high level language. This allows you to write a fast high level language quickly without getting bogged down in writing, say, fast x86 codegen or a garbage collector. To get started, you just target the host language with the best high level properties that you need (which will be problem and context specific). I don't enjoy writing c, but I have no problem translating to c if I need to for performance or for syscall access. To illustrate the practical power of this. Suppose that you have an important subcomponent of your system that was written in, say, Node.js. It turns out that this is a critical bottleneck that cannot easily be optimized in javascript. You don't want to rewrite the whole system, but you do want to rewrite that component and have it seamlessly interoperate with the existing system. You could write a small Forth DSL for that subcomponent. This Forth will target javascript initially. You translate the subcomponent into Forth and reuse all of the existing tests (that were presumably also written in javascript). Then you rewrite the tests in Forth so that the entire subcomponent is now written in Forth. Now you write a new backend that translates to say, c or rust with node bindings. You can run the native implementation against a native implementation of the test suite since they're both written in high level Forth at this point. Then you can flip the switch between the native or javascript implementations and be confident that both implementations are identical because they have the same high level description. Once you start seeing things this way though, you start realizing that you can write Forth style code in any language (and the reverse is also true). Forth is as much about a process for solving programming problems as it is a specific, concrete language. This is also why there is the old adage "once you've seen one Forth, you've seen one Forth."
- asguy 2y agoThere have been some great responses that cover the gist of it, but to add a couple more mundane specifics: - Build up the thinnest abstraction that lets you express a solution in the problem domain. - Allow the API user to express their intent, and not be focused on mechanics they don't need to understand to get the job done. - Focus on getting the interfaces right before the implementation is perfect. - A clean interface will allow you to make drastic changes to the implementation without the API consumer becoming aware.
- detourdog 2y agoHere is a link to the byte magazine issue that inspired the above article. https://archive.org/details/byte-magazine-1980-08/page/n2/mode/1up https://archive.org/details/byte-magazine-1980-08/page/n2/mo...
- ralphc 2y agoI'm a vintage computer collector and the Jupiter Ace would be the holy grail of my collection. Has anyone seen one in real life?
- tengwar2 2y agoDo you have any OpenBoot/OpenFirmware machines like the Sun4 or early SPARCstations? I was wondering what they were like as pure Forth machines.
- shrubble 2y agoMitch Bradley was the author of a great deal of that Forth; his CForth is on GitHub : https://github.com/MitchBradley/cforth https://github.com/MitchBradley/cforth (It might be easier than finding an old Sun machine)
- adrianmonk 2y agoI'm not a Forth programmer, but I used to be a Sun sysadmin. From what I recall, the Forth code on a SPARCstation is interpreted and pretty slow. These docs support that: https://docs.oracle.com/cd/E19455-01/816-1177-10/816-1177-10.pdf https://docs.oracle.com/cd/E19455-01/816-1177-10/816-1177-10... The system supports FCode, which is processor-independent byte code. This allows expansion devices (like a card or peripheral) to bring with them their own platform-independent device drivers, which is pretty cool. So you could make a disk controller card and then any system that you plug it into could boot off it, no matter the CPU architecture. Anyway, the point is, since it was mainly used for booting and diagnostics, I don't think they put much effort into performance. For it to be an actually good Forth environment, I think you'd want to have some way to run Forth programs as native code, either by adding the option to JIT the FCode instead of interpreting it or by adding a compiler that compiles Forth source to native. Also, I believe the old PowerPC Macs (like G3, G4, and G5) used Open Firmware, so if you wanted this Forth experience, you have that option in addition to Sun workstations.
- tengwar2 2y agoThe G4 did indeed support Open Firmware: I had an MDD.
- rhelz 2y agoWhen I read old articles like this, I start wondering what the story was behind all those companies mentioned. Stackworks Forth, Alan Ashley Assembler. You almost never hear of a company which is still around. Was it actually possible, back then, to make a living selling Forth for CP/M computers? Or Assemblers? Did Stackworks have an office, with a jaded-looking middle-aged secretary who put out her cigarettes in an ashtray on her desk, before she picked up when the phone rang? A glad-handling salesman who came back to the office every few weeks before going out to sell? I don't think it has been possible to sell a compiler which isn't a loss-leader in a bundle for what, 30 years? Or were these side hustles? Alan Ashley, was his day job being a math teacher or something, and he did this to round out his budget? The industry was a heck of a lot smaller back then, but these old articles mention way more different companies. Seems like before all these behemoth monopolies there was a lot more air to breathe.
- diffxx 2y ago> I don't think it has been possible to sell a compiler which isn't a loss-leader in a bundle for what, 30 years? I agree and personally feel that this is unfortunate and that we are in some ways imprisoned using mediocre to bad compilers by our collective refusal to pay for better ones.
- convolvatron 2y agoi agree that we should have a better model as a society to produce things like compilers, but having a direct retail relationship with a closed source provider was pretty nasty. because of tooling, large code bases, and weak standardization they had a huge amount of lockin. and only a single narrow funnel in which to address deficiencies. and while certainly on a lower tier than EDA seats, werent super cheap. they usually had limited platform support. while they did optimize better for their targets, otherwise they were poorer systems than gcc, with all its warts.
- Falkon1313 2y agoEh, the ones made by one or two people working part time and selling them as shareware weren't necessarily better than what we have available now. They may have been good enough for their time, but probably wouldn't cut it today. And the ones made by corporations were prohibitively expensive. As a teenager wanting to learn, or a hobbyist making programs for fun, would you really pay $4500 for a compiler to tinker with projects in your spare time? There's one reason hardly anyone uses Delphi anymore. By the time they finally released a Community Edition, there was no community left that had grown up learning Pascal.
- aquariusDue 2y agoFor people interested in Forth I think this is a nice intro: https://ratfactor.com/forth/the_programming_language_that_writes_itself.html https://ratfactor.com/forth/the_programming_language_that_wr...
- 7810905574 2y ago[flagged]
- simplify 2y agoAre there any Forth variants that have static typing? Or more generally, are there any interesting type systems that target stack-based machines?
- cess11 2y agoForth has integers and that's about it. You can have words that interpret the integers and e.g. show you characters instead, but it's usually just a thin cover over the numbers. The JVM is stack-based and static typing rather common in the languages that runs on it. Factor has dynamic typing, though I haven't thought much about that, it kind of stays in the background. It's more a tool for problem solving than a description of some type theory: https://factorcode.org/ https://factorcode.org/
- klyrs 2y agoThere are Forths with richer types than just that -- it's not just one language, after all. I've never heard of statically typed Forth; the stack is a filthy pile, after all. But nothing stops you from writing an allocator, container types, etc..
- cess11 2y agoI think one could macro in some type system on top of a collection type in Factor if one wanted to. Don't really see the point, though. Static on-the-nose typing tends to shine when a lot of people need to do quick edits to large amounts of code, settings where code is never done, and that's not exactly where Forth-like languages are a good fit. They're more for settings where few people think long and hard and experiment a lot until the right solution is found and then it's done, I think. In practice I often find the shape of data to be good enough and don't feel a need to also put names to it. It might be convenient to invent a type to carry some constraint, like UserNicknameString that can only be up to 200 4 byte characters (or whatever the big emoji chars in Unicode are) and no more, but that can also be solved functionally. As far as I'm aware no one has yet created a serious ERP or social media product in a Forth-like language, so maybe the perks that come with having an ontology of ten thousand types keeping things in check are still illusory for the hardcore forthers.
- deterministic 2y agoDoing the opposite works for me. I always start out defining the ideal API I want to solve a problem and then solve the problem using the not-yet-implemented API. I then implement the API recursively by adding lower level API’s that makes it easy to solve the higher level API problem. And most of the time I already have a lower level API from a previous project I can easily reuse and perhaps expand. So I don’t start with the database moving towards the biz logic. I start with the biz logic moving towards the DB (if needed). It works really well. I think this is similar to how experienced Lisp developers work. Starting out defining a new “language” (a bunch of functions) that makes it easy to solve the problem and then recursively implementing it. However I work in C++ and Typescript not Lisp.