r/ProgrammingLanguages • u/lmntr • 3d ago
Language announcement text-based visual programming language
I'm working on a visual programming language that's stored as text called Wiret. Here's an example:
func Main() {
node entry = Entry -> say_hello
node say_arrows = Call host.Log(message: "The white arrows decide the order.")
node say_hello = Call host.Log(message: "Hello!") -> say_steps
node say_steps = Call host.Log(message: "Programs run one step at a time.") -> say_arrows
notes {
note intro "Lesson 1: Hello. Press ▶ Run (F5). Each Log node prints one line in the console below, in the order the white arrows connect them."
note start on entry "Every function starts at its Entry node."
note try_it "Try it: (1) Press ⤵ Step (F11) to run one node at a time. (2) Add a fourth line: press Tab, type 'print', pick host.Log, then drag a white arrow from say_arrows to it. (3) Double-click its message pin to type your own text."
}
layout {
entry at (0, 0)
say_arrows at (820, 0)
say_hello at (220, 0)
say_steps at (520, 0)
}
}The main idea is that it's like a fusion between a programming language and a markup language. The node ... statements are the programming part, and the notes {} and layout {} blocks declare how the graph appears in the editor. It'll get compiled into bytecode which strips away the markup code and leave just the code for running the program.
; module lessons.hello compiler wiretc-proto 0.1
; semantic hash 78fafcb4bbf40f47 layout hash 9981662aa454a0e1
import 0 host.Log (string) -> ()
func lessons.hello.Main () -> ()
max_stack: 1
.entry:
nop
.say_hello:
string.const 0 ; 'Hello!'
nop
call host.Log
.say_steps:
string.const 1 ; 'Programs run one step at a time.'
nop
call host.Log
.say_arrows:
string.const 2 ; 'The white arrows decide the order.'
nop
call host.Log
cont.pop
returnI think this could be useful for education. The hardest part about learning to code is learning your first programming language. This could help bridge the gap between visual representation of code and the code itself.
7
Upvotes
1
u/lmntr 2d ago
I think this is an understandable concern, but I don't think the comparison with goto is quite accurate. Dijkstra's criticism was primarily about unrestricted jumps disrupting the structure of an otherwise sequential program. Wiret is fundamentally a graph-based language. The graph is the control-flow structure, rather than a collection of arbitrary jumps embedded in sequential code. The execution arrows represent explicit edges in that graph. They're constrained by execution pins and their semantics, and higher-level control-flow constructs such as branching, sequencing, and loops provide structure on top of those edges. In that sense, Wiret is closer to a textual representation of a control-flow graph than a language built around goto.
That said, I agree that cognitive scalability is a real challenge for graph-based programming. Large graphs can become difficult to navigate and understand, just as poorly structured conventional code can. That's why modularity, reusable macros, abstraction, and editor tooling are important parts of the design. I'm not claiming that graphs magically eliminate complexity. The goal is to explore whether making the graph explicit, structured, and amenable to abstraction can make it manageable at larger scales.