But, honestly, should it be? I personally find the idea of programming through text editors and files to be archaic and primitive. Superior models have been presented (Smalltalk, Lisp), but unfortunately have never caught on.
> I personally find the idea of programming through text editors and files to be archaic and primitive.
You have to think about 9p as an RPC protocol with files representing objects within the file server program. Reading/writing those files is how you interact with said objects. And it doesn't have to be text, it can be binary. Though text is used when a human has to interact with something. This is why you can do a lot of neat tricks using just a shell script as you can directly interact with a program using a standardized interface. No other operating system can claim such a high level of homogeneity.
As a hypothetical example, take the game Doom. We modify it to serve a file system to expose all of the players stats as a file tree. So a file called health is an rpc call to read and write the players health. This means you can '% echo 100 >/n/doom/player/health' to set your health to 100. It also means you eliminated the need to reinvent the wheel and integrate a console shell in the game. This saves the programmer invaluable time and eliminates duplicate code. Now we can use shell scripts or helper programs to interact with the game. And they can be in any language as all they have to do is open(/path/to/file) and read() write(). Imagine how much code you can eliminate and how much flexibility you gain by exposing your programs innards in such a standard manner? At this point, you might be thinking "So, if it's a file server, does that mean I can export it to the network?" Yes. You can have another computer mount that doom file server and interact with it.
You can also export your USB controller or other hardware using the same method. The level of flexibility is intoxicating and I don't care if it doesn't play youtube (that's what archaic and primitive 70's os's running in vmx(3) are for :-).
I agree. Program execution is rarely linear too in a codebase of any real size, so viewing the source of a program as a linear page of text doesn't make much sense.
I think there's an opportunity for a big player in the dev tools space to create a mainstream visual programming language and associated tooling. Many are trying, like Luna (https://github.com/luna/luna-studio) and Dark (https://darklang.com/) but I'm worried they're not established enough to gain traction.
Unfortunately programming with a text editor has become so mainstream that investing time in learning potentially better tools nets a lot of friction and not to much gain.
> viewing the source of a program as a linear page of text doesn't make much sense.
I don’t think we really view a file of source code as a linear page of text though, right? It’s a tree. Sibling nodes are often laid out either horizontally or vertically, and children are often wrapped in some type of brace and/or indented, maybe delimited.
I think the fact that editors usually a) align the textual boundaries of tree nodes, and b) allow syntactically/semantically-invalid states, sometimes gets people thinking about editing a character stream instead of a semantic tree.
As far as I'm concerned, that the source code is divided into files of linear streams of characters is a technical detail. My navigation isn't linear and my editing often isn't, and the editor I use goes through great lengths to enable just that.
Having used node-based programming environments extensively (Max, Reaktor) I am not convinced that that there is a ergonomically sound alternative to just writing the code in linear text files, but admit that there are probably domains where it is more suitable. I found it tedious and straining, particularly when you have to use both mouse and keyboard.
True, but I don’t think there’s a general purpose programming language whose tooling expresses source code as visual flows of data, that people would use in place of Go, Python etc.
It's not purely graphical, but MATLAB with Simulink definitely qualifies as both mainstream and general purpose from my perspective. A feature equivalent FOSS alternative would be nice though...
I've never dabbled with MATLAB or Simulink before (and I don't think I have the background to do so, at least for Simulink!) but I did just skim some of the tutorial videos.
What stood out to me was the instant feedback that's provided when the pipeline was modified; you can immediately see the ramifications of your actions.
I'll agree that graphical languages don't seem to have caught on for general purpose programming, but some reasonably powerful ones certainly exist at this point.
Speculating as to why, I admit I have no intention of picking up a graphical language for my next project. Partly it's familiarity (I don't know what I'm missing), partly it's learning curve (expending effort when my current tools already work), and there's definitely concern about the ecosystem (manually writing bindings is never fun). There are also existing tools whose functionality overlaps to some extent - I've seen (and briefly played with) tools for some languages that will create flow diagrams from your source code. It seems like graphic-centric languages exist, but only gain widespread adoption for specific tasks that are frustrating or tedious to address without them.
When I had to suffer through LabVIEW (2009ish) my notion was that it LabVIEW-the-language might have potential to be a decent language, and that it was a shame that the only possible IDE for it (LabVIEW-the-program) was so horrible. The expensive license can't be helping mindshare, either.
(Now, that was long enough ago that I forget most of my specific opinions, and many of them are probably now outdated.)
I believe I was primarily using Architexa (https://github.com/i3labs/architexa), but it was a number of years ago when I was working exclusively in Java.
JetBrains also provides a few diagramming plugins, but I've never used them.
I haven't yet come across tooling that does the same for C, C++, or D. This response inspired me to take a look though, and I did find something for Python (https://stackoverflow.com/questions/45238329). Thinking about it, the instrumentation approach taken there might actually work fairly well for most systems languages assuming you don't have any dead (or rarely called) code. Graphviz could be combined with the "-finstrument-functions" GCC flag and a few supporting data structures. Templated code would be tricky to deal with though.
As someone that also has a background in digital circuits tooling, I think that the problem is the spaghetti codding that usually leads to monoliths.
While on text based languages, lack of modularity is kind of hidden and only jumps at you when you try to actually change anything, on visual languages it jumps right at you when you open a project.
Ideally, anything that requires panning or zooming, should be packed into their own little reusable building block, instead many try to package as much as they can into a single screen.
> While on text based languages, lack of modularity is kind of hidden and only jumps at you when you try to actually change anything, on visual languages it jumps right at you when you open a project.
I've worked on some projects using Node RED (https://nodered.org/) and have found this to be very true. It's painfully obvious that you're in for a fun ride when the code is literally spaghetti.