Статьи

Создать язык программирования для JVM

Потому что вы знаете, в конце концов, каждый хочет создать свой собственный язык программирования.

Я давно интересовался парсерами и языками. Я работал с Xtext, Jetbrains MPS, создал несколько DSL и т. Д. И т. Д. Я также написал свою кандидатскую диссертацию на эту тему, но до сих пор я не начал создавать полный язык программирования с нуля.

Зачем создавать новый язык?

Ну, есть много неправильных ответов на этот вопрос. Мой разделен на две части: во-первых, я думаю, что это может быть большим опытом, чтобы выучить еще несколько вещей, и, во-вторых, язык программирования для меня — это инструмент, позволяющий смотреть на реальность, описывать ее и рассуждать о ней, чтобы лучше ее понять , Смейся, если хочешь, но для меня это в основном инструмент мышления. Часто это неуклюжий инструмент, потому что меня отвлекают технические обходные пути или детали, которые вряд ли подходят или важны для того, что я пытаюсь сделать. Например, мне надоело щелкать здесь и там, чтобы генерировать методы equals и hashCode (да, я знаю о Lombok и некоторых других приемах).

Хорошо, малыш … но чтобы сделать язык пригодным для использования, нужно много вещей

Я думаю, что сейчас барьеры для создания языка программирования и использования его разумными людьми значительно ниже, чем раньше. Я думаю, что язык нуждается в отличном синтаксисе и семантике, конечно, но также в большом количестве библиотек и приличной поддержке инструментов.

Чтобы получить библиотеки, просто запустите его на JVM. В самом деле. Если он работает на JVM, вы можете повторно использовать gazzillion библиотек. Ваш язык программирования включает батареи. Рассмотрим также развертывание: я увлечен многими языками, но каждый раз, когда я пытаюсь развернуть что-то за пределами JVM, я в конечном итоге сожалею об этом. Спросите моего со-сопровождающего WorldEngine (программа на Python), насколько интересно поддерживать библиотеки в Linux, Mac, Windows, в разных версиях Python. Много веселья.

Конечно, вам также нужна поддержка инструментов: для меня это в основном хороший редактор и хорошая интеграция с эталонной платформой. У меня есть преимущество, потому что у меня есть опыт разработки плагинов IDE, и я только что закончил писать решатель типов для Java . В дополнение к этому я участвую в JavaParser . Итак, я знаю кое-что об инструментах, которые я мог бы использовать в будущем для интеграции с Java.

На практике я планирую:

  1. Создайте плагин для IntelliJ, который знает ссылки на файл на моем языке и на файлы Java. Приятно то, что в основном я написал библиотеки для этого.
  2. Создайте плагин Maven, потому что Maven ужасен, но жизнь без Maven еще более ужасна
  3. Напишите парсер с ANTLR (это самая простая часть)
  4. Написать генератор байт-кода с ASM (какая замечательная библиотека!)

Хорошо, расскажи мне больше об этом языке

Я только начал работать над этим, но … у меня есть основной компилятор, работающий и поддерживающий несколько конструкций.

Это статический язык с выводом типа, и это пример фрагмента корректного кода, который можно уже скомпилировать и запустить:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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}")
}

Итак, у меня есть план, у меня уже кое-что работает, и мне очень весело.
Может быть, идиотизм, возможно, писать еще на одном языке, но, черт возьми … это так весело!