I had to design a simple general purpose language for university, so I tried creating "ZoomerScript" with Jetbrains MPS
Insert <it's not much but it's honest work> meme. It only supports ints and bools, some logic and simple arithmetics and it compiles to Java but damn was it hard to get that far.
Compilers are a specialized topic - and syntax design is fiddly - but it really is no harder than any other sort of program. A lot of the hard theoretical work was done back in the sixties and seventies. You don't have to start from scratch. These days it's "only" a matter of implementing the features you want and making sure your syntax doesn't leave itself open to multiple interpretations. (just as arithmetic, e.g. '5 × 4 - 1' requires some rules to make sure there's only one correct interpretation, so do language syntaxes need to be unambiguous to parse. )
Don't get me wrong - writing a language is a lot of work and it's super cool that OP has done this! I just want to stress that language development is 100% doable with an undergrad degree. If you understand recursion and how to parse a string you already have all the theory you need to get started.
Valuable input! I actually am an undergrad student.
There are a lot of frameworks out there that support writing languages, with MPS being one of them.
If I'd start from scratch again and had a little more time, I'd frankly try writing an interpreter myself, instead of trying to conform to weird framework syntax, which I won't be able to reuse in any other context.
Saying syntax design is fiddly is an understatement. I focused very hard on getting an abstract syntax somehow finished before working on generation in my first iteration. Then I had so much technical debt, that I couldn't get anything to work and had to rewrite a lot. So I scrapped it all and started again, starting with top level concepts including generation and only implementing some lower level ones, once everything around it worked properly.
We have the dual education system here (swiss) and a pal created a compiler in assembler in his 3rd (of 4) year apprenticeship as software developer. Yes, same guy who played codegolf in assembler.
It’s likely transpiring and not compiling, so it’s a lot easier than it seems. Source: made a language that adds features to Python and transpiles to valid Python.
It doesn't compile or transpile in actuality. It generates Java based on an abstract syntax tree. The concrete syntax is not considered in Java generation by MPS.
People are designing languages with JetBrains MPS and I am making an AWK interpreter in C with Yacc, Lex and my own implementation of ASDL. Why do I do this to myself? It seems like the technology I like is way behind. Like C is a language created for freaking mini-computers like VAX and PDP-11 and I still use it? I knew about MPS, I just felt a strong dislike towards it. Now that I am no longer a pill addict, I have to reconsider the technology I choose to implement my stuff. C lacks portability, and QoL features.
(Psyche! All you n000bz can be stuck with your Fischer-Price toys --- I'll do it MY way, the 70s WAY!!!!1)
don't worry , it can always get worse . source : I implemented a esoteric programming language of my own making with just a parser (no lexer !) and a tree walking interpreter while reimplementing a standard library and depending on undefined behavior in python . honestly I fear that code more each time I look at it
It’s really cool, but the example doesn’t produce any sensible output? If you have created something like this, why wouldn’t you have your demo output something sensible like Fibonacci or 1337 or whatever.
Very cool, I'd be interested in your publications once you're done. I like metaprogramming, but once you realise you might have needed it, you're already knee deep in fresh legacy code.
You essential have a compiler written through metaprogramming. For your implementation, did you use a find and replace or did you define and parse a grammar like a true compiler.
You're correct, but it doesn't really matter for demo purposes.
In an actual use case (whatever that would be for this language) you would of course want to use some kind of variable or expression there instead of a constant.
Does it compile into JVM bytecode or Java source code?
JVM bytecode is one of the most infuriating IRs I ever had the displeasure to work with, and if you managed to make a compiler for that, I applaud you.
Fortunately I generate Java source code from it. However MPS generates both source and byte code when you build the solution. For some reason I can't get the byte code to run though, but the source code does, so I don't care too much.