Because you know, in the end everyone wants to create his own programming language.

    I have been interested in parsers and languages for a while. I worked with Xtext, Jetbrains MPS, created a few DSLs etc. etc. I also wrote my PhD thesis on this topic but so far I did not get started creating a complete programming language from scratch.

    Why Creating a New Language?

    Well, there are many wrong answers to this question.

    My (hopefully right) answer is divided in two parts:

    1. first, I think it can be a great experience to learn a few things more
    2. second, a programming language is for me a tool to look at reality, describe it and reason about it to understand it better

    Laugh if you wish, but for me it is mainly a tool for thinking. Often it is a clunky tool, because I get distracted. Either by technical workarounds or details which are hardly relevent or important for what I am trying to do. For example, I am getting tired of clicking here and there to generate equals and hashCode methods (yes, I know about Lombok and some other tricks).

    Ok Kid… But to Make a Language Usable You Need a Lot of Stuff

    I think now the barriers to create a programming language and make it usable by sane persons are significantly lower than they used to be. I think that a language needs a great syntax & semantics, sure, but also a large amount of libraries and decent tool support.

    To get libraries just make it run on the JVM. Really. If it runs on the JVM you can reuse a gazillion of libraries. Your programming language get batteries included. Consider also deployment: I am fascinated by many languages, but every time I try to deploy something outside the JVM I end up regretting it. Ask my co-maintainer of WorldEngine (a python program) how much fun is to support libraries on Linux, Mac, Windows, across Python versions. A lot of fun.

    Of course you need also tool support: it means to me mainly a nice editor and good integration with the platform of reference. I have an advantage here because I have experience developing IDE plugins and I just ended writing a type solver for Java. In addition to that I contribute to JavaParser. So I know a thing or two about tools that I could use down the road for the integration with Java.

    In practice I plan to:

    1. Create a plugin for IntelliJ which is aware of references to file in my language and to Java files. The nice thing is that basically I wrote the libraries for doing that already.
    2. Create a Maven plugin because Maven is awful, but life without Maven is even more awful
    3. Write a parser with ANTLR (that’s the easy part)
    4. Write a bytecode generator with ASM (what a great library!)

    Ok Tell Me More About This Language

    I just started working on it but… I have a basic compiler working and supporting a few constructs.

    The language is named Turin like my hometown and it is available on GitHub.

    It is a static language with type inference and this is an example of a piece of valid code that can be already compiled and run:

    namespace manga
    
    // now print is an alias for call to all the overload variants of println on System.out
    import java.lang.System.out.println as print
    
    // we define this property in generale: a name is a String
    property String : name
    
    // this is our new datatype
    type MangaCharacter {
        // we refer to the property defined above
        has name
        // we define a new property, UInt is an unsigned int
        has UInt : age
    
        // we overload toString. For short methods it can make sense to use 
        // this shorthand. And we have string interpolation
        String toString() = "#{name}, #{age}"
    }
    
    // this define a class with a main method
    program MangaExample(String[] args) {
        // type inference at work: we are instantiating the class defined above
        // note that the constructor is generated for us
        val ranma = MangaCharacter("Ranma", 16)
        // let's call a java method ( System.out.println(String) ) and use more
        // string interpolation
        print("The protagonist is #{ranma}")
    }

    So I have a plan, I have something working already and I am having a lot of fun.
    Could be idiotic, perhaps, to write yet another language but damn… it is so much fun!

    Download the guide with 68 resources on Creating Programming Languages

    Receive the guide to your inbox to read it on all your devices when you have time

    Powered by ConvertKit
     
    Creating a Programming Language

    Learn to Create Programming Languages

    Subscribe to our newsletter to get the FREE email course that teaches you how to create a programming language