Ask HN: Have you created a programming language and why?

218 points by jcoffland ↗ HN
Excluding school projects and toy languages, who here has created a programming language and why?

I'll go first. 13 years ago I created a specialized language for processing XML data. XmlPl marries the syntax of C, XML and XPath. It is very fast and efficient. It never caught on. See http://xmlpl.org.

246 comments

[ 4.7 ms ] story [ 331 ms ] thread
Yes, about 10 years ago for a company that was in the financial risk management space.

We were going for a matlab like language but R and Octave weren't deemed ready. For those of you who are already objecting in your head, I'll grant you that I'm not sure we made a good choice here but this was the early 2000s:(

What we were after was a vectorized language that would let you write your quant formulas without having to write loops.

For instance, if you wanted to run say Black Scholes over multiple expiry dates and multiple underlying prices you could pass in a vector of dates and vector of strikes to your model and it would return a grid of results for the permutations of values.

Since this is pretty processor intensive we also had language features for splitting your calculations over multiple machines in your datacenter.

All of this has since been comoditized, but when we started most of this wasn't present.

The company ended up being the calculation engine for calculating risk metrics like VaR for several large banks being acquired by a large financial company, so in that sense it was a success.

The downside of writing our own language was that quants weren't thrilled about having to learn a new language that wasn't a really transferable skill as quants tend to move around from company to company alot.

So the fact that we wrote a language ended up being a barrier to adoption. it also meant that we did a lot of consulting with the banks to get the initial modesl setup, which was good for providing income, but bad in the sense that our good quants soon became our clients good quants.

How close did you get to re-implementing APL?
A few years ago I wrote a proof-of-concept interpreter for a small stack-oriented prefix-notation language inspired by languages like Python, Lisp, io, and GolfScript, written in Python.

I had fun with the project, learned some stuff about interpreters, and also learned that infix notation for things like arithmetic is actually pretty neat and we should probably keep using it.

https://github.com/mtinkerhess/puget

I want to, but I have never done so. Maybe later in my life.

I have 2 ideas.

the first comes from the difficulty of using make. I think the make system lacks debuggability, it's not easy to log, break, step through and watch locals.

I feel that building should be handled by a domain specific language, instead of make.

I haven't researched enough though, there may be something similar, only it is not popular yet.

the second ideas comes from the difficulty of documentation.

I'm thinking of a programming language that allows you to describe the block diagram (modules) of your program easily. You need to specify what the interfaces are, how many threads ....

then a diagram can be automatically generated as a document. you then fill the internals of your module, with classes. The idea is always forcing programmers to describe design first, then implement. code and document are mixed, so the document is always up-to-date.

For your first idea see:

  * cmake
  * premake
  * ant
  * scons
  * ninja
  * gyp
  * jam
  * gn (Google)
  * meson
To name just a few.

Your second idea is basically UML and some of the tools that exist for it.

A really cool replacement for make is tup. It's very fast and figures out dependencies by tracking which files get read or written by each command.
One academic also did make in Prolog. That way it was ddclarative and used logic programming.
Make is declarative. It has rules that you declare; it figures out which ones fire and in what order.
I know that. The imication is they redid a declarative program in a declarative language.
I'm currently working on a DSL for manipulating tables. It's a cross the between smalltalk family (ST, Self, NewSpeak, IO), SQL, and vector languages like Q. The code translates into Java, where it executes tablesaw code. Tablesaw (https://github.com/lwhite1/tablesaw) is a very fast dataframe for java, with pretensions.

I'm mostly doing it for fun, but also to make it easier to use tablesaw for exploratory analytics.

I am working on a draft for something that started off with my discontent with the direction C++ was going in. So, in a few terms, it follows the performance focus principle and philosophically it's being designed to serve you as a tool (i.e. not staying in your way) instead of trying to discipline you (even if that means letting you shoot yourself in the foot). C++ got messy in my view. For now I've been collecting ideas on language design from every piece of info I've stumbled upon, but there's nothing implemented so far.
Still working on one because I think Agent oriented programming has a use and DSLs are closer to how we talk about what a program does than any API.

Sure, http-based rpc mechanisms won, but it seems like agents have a lot of promise for parallelism and code deployment.

I build one around 2000 that was used to program consumer polls; an interpreted language simple enough for non technical people to use. It turned out to be sufficient that the implementors of the polling system used it to manage the underlying system as well by storing the code in a database. No idea what happened to it. It was written in C/Objective-C in a WebObjects environment.
I created a tiny language (assembly level) when I was fifteen years of age. It could convert simple postfix mathematical expressions, including trigonometric functions into machine code for a Zilog Z80 processor inside Sinclair ZX Spectrum+.

I was unaware of compilers at that age, and came across a machine code sample which ran about two orders faster than BASIC. That motivated me to "invent" a compiler and create this proof of concept.

Yes, every time I do something in Forth... :)

The same thing technically applies to any extensible language (i.e. Lisp) but a Forth programmer goes in with the expectation that the first task will be to create an application specific language. Since you have to pretty much create everything you are best off doing that in an efficient way.

I created a language that better expresses server side web programming issues (exactly for that reason).

https://megous.com/wl

I also created language for describing processes (company processes).

Mostly for fun and to scratch my own itches.

I'd love to see work on how to visualize processes
I'm using graphviz for that.
(comment deleted)
I've created three instances of what I'd consider to be programming languages.

The first was something I did in an intro to CS class. I asked the professor if I could use C++ rather than Pascal for the assignment, and was, of course, turned down. I'm not proud to admit to this, but in a fit of pique, I decided to write my own programming language in Pascal than then submit the assignment in that. The result was something called 'SeqTl', for Sequenced Testing Language. It was basically a stack oriented language somewhat analogous to Forth. There were two stacks, one for numbers and the other for strings, and the interpreter worked by continually parsing strings of tokens. (Think Tcl pre-8). (I did get an A, the professor said I should've gotten bonus points, but in retrospect he would've been within his rights to fail me outright.)

The second was about five years later, while working on industrial process control firmware. My company wanted to allow our customers to specify control algorithms that were able to be guaranteed to run within a given time bound. To achieve this, I wrote a simplified language with a C-like syntax. It lacked constructs like unbounded loops, and the compiler would run an analysis of the control flow graph and throw an error if the longest path exceeded a given projected execution time. This language also used value/status tuples rather than raw scalar values, so it could do things like propagate bad data information through a calculation. (Think NaN propagation through floating point math, but more expressive.)

The third was/is an ongoing project to write a Scheme-like language.

https://github.com/mschaef/vcsh

This codebase started out as George Carette's SIOD interpreter, although I've made a bunch of changes since. (There's now a compiler, first-class hash tables, the reader and writer are now in Scheme rather than C, there is a test suite including benchmarks, a decent REPL, etc.) Back in 2001/2, this started out as the core of a shareware calculator program I was attempting to sell online. The tl;dr on that is that the design was way too ambitous, the market didn't support it, and I didn't have remotely the bandwidth necessary for either the development or the sales. It was and is still fun to hack on, however.

> I did get an A, the professor said I should've gotten bonus points, but in retrospect he would've been within his rights to fail me outright

Well, to be fair, in the real world its not too rare for engineers to write custom programming languages to solve their problems (see: this thread). So what you did isn't that far outside of what's really done, assuming you submitted the code for the programming language with the assignment.

That said, I think he would have been within his rights to give you a C for overengineering it :p.

> That said, I think he would have been within his rights to give you a C for overengineering it :p.

Exactly.

Working on automating software development, I created YSLT as part of the YML project: https://fdik.org/yml/yslt – this is just syntactic sugar to make XSLT usable.

Now I'm creating Intrinsic, a programming language with a modifiable grammar while runtime. Because I found no tool chain, I published pyPEG, which is an compiler interpreter https://fdik.org/pyPEG/ Intrinsic will have a generative paradigm.

I worked on a compiled, statically-typed Python-like language, called Runa. It has a compiler in Python which compiles to LLVM IR. It's similar enough to many of the ideas in Rust that I stopped working it and decided to go code Rust instead.

https://github.com/djc/runa/

I created a non-Turing complete programming language for editing animations, implemented as a GIMP Script-Fu script (Scheme, basically). Here's the documentation: http://tshatrov.github.io/animstack

Why? Because in GIMP it's annoying to edit animations with many layers, so I wanted to write a script that would do what I want. But rather than hardcoding a specific action, I wrote it in an extensible way, and the rest is history.

In general, I think non-Turing complete (always terminating) languages are super useful and should be used more often.

Non-Turing complete languages are useful, but it has been my impression that it is difficult to be powerful enough to be useful without being (accidentally!) Turing complete.
As a Computer Scientist, I actually find the distinction Turing and non-Turing to be rather obscure. Perhaps I am in the ignorant minority on this.
Isn't it just possessing both conditionals and loops?
One more thing - memory.

A Turing Machine is literally just a tape, a movable reader/writer, and a bunch of states that dictate what the reader/writer does.

As long as you have memory, the ability to write to memory, conditionals, and some form of looping, whether it's a `while` loop, a `for` loop, or a `jmp` or `GOTO` instruction, it's Turing complete.

Note that a conditional jump (`jne`, for example) satisfies both of the latter.

yup memory. yup.

I forgot...

"Conditionals, loops, and memory" is an interesting list of requirements, because "memory" can be abstracted into anything. Functional Languages rely on the fact that the same code shall always produce the same outcome, and thus the "tape" has been changed into a series of concrete blocks. That said, I don't think anyone would argue that functional languages are not TC, but it is interesting to consider that the Tape becomes code in Lisp...
"Turing Complete" refers to a system which can be configured to be come any Turing Machine. When we write a particular program in some language and run it on some input, we have a Turing Machine. If the language lets us create any Turing Machine (i.e. do any Turing computation), then it is a Universal Turing Machine, and Turing Complete.

Turing's Tape Machine is a UTM because the tape can be initialized with contents to turn it into any TM. Any calculation for which there is a TM can be done by the UTM (if someone can figure out what to put on the tape).

Not necessarily. Purely functional languages, like Lisp, do not have loops. Instead they have recursion. Any iterative algorithm (I.e. one with loops) can provably be converted to a recursive algorithm with out iteration.
Lisp has loops:

For instance, the do operator:

  (do ((i 0 (+ i 1))) ((> i 10)) (print i))
Or the loop macro:

  (loop for x below 5 and y in '(a b c d e)
        collecting (list x y))
The 1965 manual for Lisp 1.5 describes the prog construct, which persists into ANSI CL. Inside prog we can have labeled statements to which we can branch unconditionally with go in any direction. Lisp also has mutable variables. The following example from the Lisp 1.5 Programmer's Manual is still valid code today:

  (LAMBDA (A)
    (PROG (B)
  S   (SETQ B A)
      (COND ((NULL B) (RETURN C)))
      (SETQ C (CONS (CAR A) C))
      (GO S)))
While another commenter has mentioned that this is technically not correct with Lisp, it holds for the lambda calculus. You don't need loops to be TC if you have recursion. And for that you don't even need named functions-- note the URL of this site!
However, lambda calculus doesn't have code made of data, QUOTE or any of that. Lambda calculus isn't Lisp; it captures the gist of some of the evaluation semantics of Lisp only.
Lisp is more multi-paradigm than pure functional. And we like it that way. It can be functional, object oriented, aspect oriented, etc.
(comment deleted)
A Turing-complete programming language just means that you can compute anything that can be computed using that language. In other words, it can be used to write arbitrary computations. You don't need much to achieve this; off the top of my head, I think that being able to read and write to storage, basic addition, conditionals and loops are enough. (Formally, it means that your language can be used to simulate a single-taped Turing machine.)

A non-Turing-complete language is any language which does not have one of those capabilities. Because the bar is so low, most languages you have used in your life are Turing-complete. For example, you can imagine a simple calculator-like language for just writing mathematical expressions. It can do all basic math operations, has conditions, but no ability to repeat things (no loops or recursion). That language is not Turing-complete. You can trivially prove that programs from such a language will finish - they can't not! there's no ability to impede progress.

Well, always-terminating implies non-Turing-complete, so that's a way to guarantee it.

The proof is easy: just set for all n, f(n) to be the nth program in your toy language in lexicographical order and then set for all n, g(n):=f(n)(n) + 1. This g is clearly Turing-computable (you can modify an interpreter to compute it) and not in your language (a la Cantor).

Actually non-Turing languages are very useful and can be quite powerful.

Consider for example TensorFlow and/or Theano. Before they added the loop and conditional Ops, they were non-Turing Complete. And you could do amazing things with it as it were.

In fact, I took a lesson from that when working on Gorgonia (https://github.com/chewxy/gorgonia) - I don't ever want it to be a Turing Complete language.

> In general, I think non-Turing complete (always terminating) languages are super useful and should be used more often.

yup, always-terminating functions are also called total functions (if they're defined for every input). Which is a related concept to Total functional programming

http://docs.idris-lang.org/en/latest/tutorial/theorems.html#...

While Idris is turing complete for example, it's possible to mark functions and whole modules as total, and let the compiler prove it for you. Wish that more people knew that we have such tools available nowadays

Nice one, I wish there was a Haskell extension for that! (Can't risk switching existing/pending code-bases over to Idris just for that feature though)
Deep down I believe GIMP's ergonomy is a plot to push people to write Scheme DSLs.
That they are always terminating is very useful for programs that generate proofs, or otherwise don't have to be evaluated.

But if you can encode the Ackermann function, proof of termination is not very useful in practice - as it may consume arbitrarily large amounts of space and time to evaluate (easily more than the age/size of the universe).

In college I did a project where I created a visual programming language. I thought it would make the program easier to read, but in hindsight it's pretty clear that these systems would be too cumbersome to use except when teaching basic programming concepts.

Professionally, no, but I've taken the approach of "I'm writing a compiler" when ingesting someone else's xml schema.

It's very useful when you need to identify and report errors very early.

I'm currently making a programming language that tries not to be a programming language.

To give some background: I'm working on a program to allow anyone to create video games. But to add custom functionality, my users need to use some kind of programming/scripting language. Since these are non-technical people, it must be as easy and simple as possible.

Therefore I'm now making a language (called Screenplay) where you don't really have to learn anything. You click 'add action' and a wizard guides you through making your action. You select the subject, then the verb (or action), and then some parameters. Translated to OO: you select the object, method and parameters.

I considered using a visual programming paradigm, but still text gives you the most freedom in expression. It's also easier to create new concepts in text than making a new image that makes sense.

In the long run I want my Screenplay language to resemble OO, where users can define their own objects with methods. It kind of looks like this (remember it's game related):

  Hero walks to Professor
  Professor says "Hi there, how are you?"
  if Hero chooses "Fine"
      Professor says "Nice to hear that."
  else if Hero chooses "Not good"
      Professor says "I thought so, let me show you something"
      Professor walks 2 tiles to the left
Methods could be defined as:

  How <actor> says "<text>"
      GUI opens text dialog with "<text>" and image 'face image' of <actor>.
I want anyone who can read, but not program, to read such a program and kind of make sense out of it.
Inform was a huge inspiration for me! But there are some things I didn't like and so try to improve:

- It comes with a manual. You shouldn't need a manual for something simple.

- Too much prose, I like more structural things. If inform is a book, my Screenplay is technical documentation.

Inform is great for what it does, but I guess I needed something slightly different.

Don't forget: computers have no true intelligence, and thus require humans to put things into some form of structure in order for the computer to understand it. The type of structure you can get away with using for simple tasks can often look beautiful, but beyond a certain point, you need to impose distinction and isolation so you can compartmentalize separation of concerns and so forth. This structure is the foundation of programming language design.

The major issue with all of this is that program code is built through a process of iteration: one brick on top of another. But once you hit the wall I just described, you have to face the scientifically organized structure of programming in order for the language itself to not be a mess (see PHP) or the programs written in it to be spaghetti (see BASIC and particularly GOTO).

I say this not to be a downer, just as strong encouragement to take this into account and try your best to factor this into your design. If you can make something that lets people scale really high before hitting that wall (if at all!), that would be awesome.

> You shouldn't need a manual for something simple.

That's like saying "Everyone knows how to drive a car, you just keep it pointing forward and engage the engine".

Everything needs some sort of documentation, whether it be through examples (the way love2d.org/wiki is done, for example, is both informative and useful), documentation, BNF, etc. The fact that a manual exists is not a detriment, but a success -- you have enough features and complexity worthy of documenting it (although I don't mean to imply that larger is bigger :) ).

How does this compare to Unreal Engine's visual programming language?
This is the same set of design principles that was behind COBOL, as I understand them.

It is probably fine for the purpose of simple gaming scripts.

I don't think the marketing concept of non-technical programing makes sense. Its like trying to sell atonal arrhythmic music. Or randomization as an interior design strategy. You've already embedded learning in the design where the user has to understand its Subject-Verb not Verb-Subject. Also my experience with OO design is non-technical non-logical people will have truly weird arguments trying to convince you that your objects should be methods and vice versa due to lack of skill at being able to design. By analogy someone who knows how, can always convert a PDA to a CFG, its mathematically proven if you know how you can always do the transform or even write a program (compiler?) to do the transform for you in either direction. But if you don't know how it works or what any of that automata theory jargon means, well, then you just can't, thats it, game over. Likewise your end user can either program at some level, where they can convert culture and emotions and brain waves and other stuff into code, or they can't. And if they can't, well, they just can't.

I'd suggest you market it as a really simple programming language. That'll work. What you've got technically looks good an sounds like it could be useful, so, cool, but you just need to change how you're selling it. Realize that people who can't logically structure and rationally think and technically design will continue to be unable to program, of course, no matter how easy the tool is to use.

Remember most people are functionally illiterate and can't read at a high cognitive level. That probably correlates very strongly with being unable to program BTW.

(edited to add, this was the wisdom of the GUI. Plenty of people are too illiterate and non-technical to ever be able to use languages, including even English prose, as a computer UI. But if you strip out most of the functionality and change it from linguistic IQ skill points to 2-D spatial manipulation, lots more people can "use" that UI... Nobody ever got noobs to use computers via every "simpler" and dumber CLIs, that madness leads to CPM and msdos, the trick was to get lower intellectual functioning people to use computers by taking away power/complexity and abandoning language and literacy entirely by going spatial with GUIs, I'm just saying as a strategy making the tool weaker never helped people who can't use tools as a historical strategy)

This doesn't seem all that different from the various scripts inside RPGMaker or, for that matter, the scripting language that I remember from the custom map makers in Starcraft and Warcraft 3.
I worked on a similar problem! (But much, much narrower and less ambitious.) It's designed for games like dating sims. It takes a spec, written mostly as dialogue, and converts it to gamemaker code. I wrote it to help some friends avoid tedious manual translation, which apparently saved them a lot of time.
You should check out Alice, developed at cmu. It was a programming environment designed to build interactive 3D stories.
The problem is that there is still a syntax that's required to know. Look at AppleScript. It uses keywords that sound like easy English but knowing how to use AppleScript still takes a lot of reading.

After reading the article about RUST, I have been thinking about how a compiler could take source code and write it back with fixes/suggestions right into the source so if you make a silly mistake, the compiler can just say "I think you meant..." and offer to fix it for you.

In your language, it would be beneficial to avoid "Syntax error!" and implement something like "Did you mean...", or have synonyms like "says", "exclaims", "talks", etc that compile to the same thing but add flexibility (or the compiler automatically re-writes to the preferred syntax)

Like someone said, every time I write Forth or Lisp :) So I took the next logical step and implemented Forth in Lisp (https://github.com/codr4life/foonline). Why? Because it gives me more leverage, it's like having one more dimension on top of macros. The other reason is that it gives me facts to go with opinions on language design, allows me to see the compromises others made in a new light.
I created a DSL for WebSphere application deployments while working as a contractor for a local company. There were 4 people on the team, and typically each update would take at least a half hour, and was quite error-prone because nothing was automated and each deployment would touch multiple servers.

Fairly simple language, parsed and executed in Perl. I doubt it survived long after I left, sadly.

I tried writing a lang called Slang where every statement was a search query against an corpus of data and methods that were either imported or generated by the active program. Under a certain threshold of query-match accuracy, it would abort with an exception. I could never make it work and it's probably a bad idea that I should try 5 or 6 more times.
I created http://jogolang.org, mostly because I was interested in learning how compilers worked. I was also motivated by the lack of simple, type-safe, ahead-of-time-compiled programming languages for writing video games. Now the project is kind of dead, but I certainly learned a lot about parsers, code generation, optimizations, SSA, and register allocation!
When I was in college, I was addicted to Starcraft II. Luckily, I primarily played 4v4s so the brainpower necessary to win wasn't nearly as high as 1v1s (which left far less room to meme, so I didn't enjoy them nearly as much).

However, while playing game after game in the evenings, I was always frustrated that I was using the inputs and outputs of my body so inefficiently. Starcraft tied up my eyes and my hands, but I still had time to think about the things I'd be coding if I weren't playing, and wished wholeheartedly that I had a few extra hands so I could play AND code at the same time.

This frustration crept into other activities like the drive to and from classes (and, even more frustratingly so, the long drive to and from home when I visited) and I eventually came up with a plan to let me code while multitasking with things that require my hands (primarily starcraft and driving).

I had taken the traditional compilers class the previous year so I had some experience with lexing and grammars, and set out to make my own voice-first programming language. I called it Bespoke (ha) and uploaded a proof of concept to GitHub[1][2] after it was featureful enough to solve a couple Project Euler problems.

I decided to use Javascript in the beginning so I could take advantage of webkit's native speech to text and get right into the logic without having to deal with processing sound or extracting words from it. After getting a proof of concept up, I expanded the flow control and data structures it supported (piggybacking on JS) and eventually wrote some fun (albeit simple) programs while gaming, but eventually gave up on the project when I realized I could code things up in a similar amount of time by just outlining code structure while gaming (also using STT) and coding up the necessary snippets in brief downtimes (between games, at stoplights, etc).

Now, I still pretty much do the same: I use a prose-like DSL that's evolved over the years to outline what to code, in what order, and how to tie it in to other pieces. I now take the train/bus instead of driving (and code at will), and outline what to code while I'm dead in Dota 2 games.

[1] https://github.com/drusepth/voice2code/blob/master/voice2cod... [2] https://gist.github.com/drusepth/3134188

This is really interesting. How are you able to multitask so well? I can't hardly listen to a podcast and code at the same time, let alone play a game.
When something becomes habitual, it frees up the cognitive load for you to think about other things. I assume parent has played so much starcraft, that many of the routine aspects of the game such as bootstrapping a base, farming resources, and building a military has become engrained. Especially in 4v4's the risk of an enemy trying to pull an early cheese is so low, that the beginning of the game is basically almost always the same.

When I was playing Diablo II, I used to be able to complete the Secret Cow Level runs with a nova sorc almost by rote. I would often be thinking about other things, chatting with friends, calling into internet radio shows while doing this

As the other response mentioned, at that point gaming was pretty habitual (and way more "thoughtless" than when I first started). I'd start up a game with a general plan and adjust mildly as needed, but in 4v4s it's basically 10-15 minutes of rushing an economy (which is pretty rote after a while) into massing up your army (which is pretty must just reflex APM of "select all barracks, queue up another marine/marauder in each; select all factories, queue up a few tanks/thors; select all starports, queue up a few medivacs/ravens") and then filling any empty space with random drops and harassment. I think there's a _lot_ more thought that goes into 1v1s since you're in a two-sided equilibrium and can't start losing much, but in 4v4s there's so much room for comebacks and throwing (and/or teams working together or not) that it doesn't matter nearly as much.

I couldn't listen to a podcast and code at the same time either, probably. If I'm listening to a podcast, I'm mentally trying to process it. If I'm coding, I'm mentally trying to plan/process what I've done. Any mental processing from one takes away from the other.

Podcasts, though, don't require any use of your hands. I actually feel guilty _just_ listening to podcasts (or similar) unless I'm also doing something like painting or paperwork that requires hands but not brainpower. I recognize it's kind of irrational, but it just feels like a waste of time and potential when I'm (probably) not going to live forever.

I think it's just a matter of recognizing what your potential inputs (seeing, hearing, touch, processing) and outputs (hands, voice, mental "caches" like outlines that you can context switch back into later) are and choosing activities to multitask that take advantage of the maximum amount of each without overlapping.

This is really cool. You should think about doing a startup around this, especially given the new tech ecosystem with AR/VR and good voice recognition.

I would love to be able to code, using a headset+phone combo, while wandering around in a park.

The first time I read about voice programming (in Heinlin's 'Number of the Beast', the flying car they use is voice programmable[1]) I considered how you'd implement it and figured what they do in the book was too cumbersome - essentially natural language. What they did do though, was create shortcut commands for sequences of commands, then shortcuts based on shortcuts... and this to me suggested a Forth-like language might be a better fit.

I think it's still the case, C-like languages have too much grammar going on to deal with without visuals, forth is grammar-free. Also, it's naturally shell-like; instead of your 'run the code', just say the function you need to execute; you can test and redefine each function as you go.

I attempted to build this on a ZX Spectrum in 1983, based on some voice recognition code from a magazine...needless to say I didn't get too far with that hardware. I should have another go.

[1] Sample:

    "Program. L axis add speed vector three point
    six klicks per second. Paraphrase acknowledge."
    "Increase forward speed three and six tenths
    kilometers per second."
    "Chief Pilot?"
    "Level."
    "Execute." Deety glanced at the board. "Gay Deceiver,
    H-above-G will soon stop decreasing, then increase
    very slowly. In about fifty minutes it will maximize.
    Program. When H-above-G is maximum, alert me."
    "Roger Wilco."
    "If-when one hundred klicks H-above-G, alert me."
    "Roger Wilco."
    "If-when air drag exceeds zero, alert me."
    "Roger Wilco."
    "Remain in piloting mode. Ignore voices including
    program code words until you are called by your
    full name. Acknowledge by reporting your full name."
    "`Gay Deceiver,'" answered Gay Deceiver.
I created the Bloomberg Equity Screening (EQS) query language. It was mostly backward compatible with a previous generation, but added a lot of new things like chained conditionals (Python has these, most languages do not). It is meant to be familiar to users of the Excel formula language.

Most users do not want to write their queries by hand, so I also built round tripping of the language to/from a GUI query builder. You can build a query graphically, edit it as text, then go back to the graphical form. Certain things cannot be displayed however, and generating good error messages was very difficult.

A weird fact is that the backend which evaluates the queries has a totally different language of its own, so there is a transpiler for that.

Thousands of people have used this language, but 99% of them did not know it.

I created https://github.com/onnlucky/hotel for a few different reasons.

1) I wanted to see how far you can go by making every language concept first class, because only first class things can be an abstractions.

2) But another big motivation was that languages usually grow towards building large systems in. I wanted every tradeoff to go to the human side, making it more suitable for beginners. For example, 0.1 + 0.2 = 0.3, slower by not using native floating point numbers, but much more humane. Similar motivation to remove the import statements. Or no difference between object fields or methods, e.g. string.length is the same as string.length().

Do you really think that those things make it easier? It seems like when languages do these kind of "beginner friendly" features, they just end up as gotchas and quirks. (Like in JS or SQL)
I also teach programming, and see many of the beginner mistakes made.

Part of what I tried is that the smallest subsections of the language would be complete and useful by themselves. Without ever having to say: "this part you do not need to understand yet". That is where the "beginner friendly" part focused on.

Not by making it "simpler" if that would sacrifice first class-ness. Say JS with its global scope promotion, maybe easier, but not first-class, clashes are inevitable.

And for example, the no import thing is based on very predictable scope rules, which can be postponed while learning, but later are completely deterministic and predictable, while still first class, so that the programmer can have control over it if needed.

But in a way it was mostly an experiment to get my thoughts clear on these matters. And for instance the concurrency things in there have less to do with beginner focus.

Nope, but have always loved playing around with compilers for languages like PL/0, Pascal (subset) and such. I have many books on compiler design[0] but my itch is usually scratched by implementing a subset of a Wirth language as opposed to creating my own. I don't keep anything I write because it's fun to do it all over again later.

[0] I think my oldest is "Compiler Construction for Digital Computers" by David Gries. My favorite isn't really a compiler book, it's Wirth's "Algorithms + Data Structures = Programs" because he implements PL/0. I used to have some PDFs by Thomas Christopher that used matrices to computer first, follow, etc sets that I thought was interesting, but have since lost those.

I've just started writing my own PL/0 compiler, I found the best resource for it (apart from the Wikipedia articles on EBNF, PL/0 and P-Code) is Wirth's book "Compiler Construction" (http://www.ethoberon.ethz.ch/WirthPubl/CBEAll.pdf). I don't think later versions of "Algorithms + Data Structures = Programs" contains anything about PL/0 (or a I could not find anything in the contents page). Eitherway, I find Wirth's writing amazingly clear.
Yes, my understanding is later editions of the book didn't include it.