Новый язык программирования — Relax

от автора

Вступление

Всем привет, я являюсь автором языка программирования Relax. На данный момент я разрабатываю RVM(RelaxVirtualMachine) И Relasm(Relax Assembly). Первые попытки сделать свой язык начались в конце лета 2020, тогда я и не думал что делать язык — это так сложно. Сам же проект Relax начался 30 декабря 2020 года. Прошло полтора месяца, а на нем уже можно написать что-нибудь простенькое.

первое лого языка
первое лого языка

Как компилировать код?

Начнем с того, что файлы relasm лучше сохранять с расширением .rasm, файлы байт-кода — .ree. Для того чтобы скомпилировать и запустить код нужно скачать 3 файла: Relasm.exe, RelaxVM.exe, QtCore.dll. Сделать вы это сможете вот по этим ссылкам: https://github.com/UnbelievableDevelopmentCompany/RVM/tree/master/x64/Release
https://github.com/UnbelievableDevelopmentCompany/Relasm/tree/master/x64/Release

После того как скачали, желательно добавить эти 3 файла в любую папку, которая есть в переменной PATH(или же создать новую папку). Далее в cmd переходим в папку с программой на Relasm и вводим следующие команды:

Relasm main.rasm program.ree RelaxVM program.ree

Первая команда компилирует relasm в байт-код, а вторая уже запускает программу.

Примеры кода на Relasm

Как же выглядит код на Relasm?

mclass MainClass method public static void MainClass.Main(): 	.maxstack 1 	push.str "hello world" 	callm std static Relax.Console.Write(Relax.String)

Это самая простая программа — hello world! Давайте пройдемся по коду. Первая строчка создает главный класс, в котором обязана быть функция Main(начало выполнения). Во второй строчке мы как раз таки создаем этот метод. Следующие строчки — это тело метода, так как пишутся с табуляцией в начале. Третья строчка кода указывает, что максимальное количество объектов, которые могут находится на стеке равно 1. Четвертая строчка кода добавляет строку «hello world» в стек. Ну и наконец пятая строчка вызывает метод вывода строки на консоль. Строка берется из стека, как и любые другие аргументы в Relasm. Я не буду подробно останавливаться на каждой детали в этом коде.

Хорошо, мы написали hello world, теперь можно что-нибудь по серьёзнее.

mclass MainClass method public static void MainClass.Main(): 	.maxstack 2 	; Объявление переменных 	local firstNum Relax.Int32 	local secondNum Relax.Int32 	local result Relax.Int32 	local op Relax.String  	; Получение первого числа 	callm std static Relax.Console.Read() 	callm std static Relax.Converter.StringToInt32(Relax.String) 	set firstNum  	; Получение знака операции 	callm std static Relax.Console.Read() 	set op  	; Получение второго числа 	callm std static Relax.Console.Read() 	callm std static Relax.Converter.StringToInt32(Relax.String) 	set secondNum  	; Проверки на знаки операций  	; Проверка на сложение 	get op 	push.str "+" 	callm std instance Relax.String.operator==(Relax.String) 	jmpif opAdd  	; Проверка на вычитание 	get op 	push.str "-" 	callm std instance Relax.String.operator==(Relax.String) 	jmpif opSub  	; Проверка на произведение 	get op 	push.str "*" 	callm std instance Relax.String.operator==(Relax.String) 	jmpif opMul  	; Проверка на деление 	get op 	push.str "/" 	callm std instance Relax.String.operator==(Relax.String) 	jmpif opDiv   	opAdd: ; Сумма чисел 	get firstNum 	get secondNum 	add 	set result 	jmp end  	opSub: ; Разность чисел 	get secondNum 	get firstNum 	sub 	set result 	jmp end  	opMul: ; Произведение чисел 	get firstNum 	get secondNum 	mul 	set result 	jmp end  	opDiv: ; Деление чисел 	get secondNum 	get firstNum 	div 	set result 	jmp end    	end: ; вывод результата на экран 	push.str "\nResult: " 	callm std static Relax.Console.Write(Relax.String) 	get result 	callm std static Relax.Console.Write(Relax.Int32)

Это простой калькулятор. Сначала мы создаем все переменные. Затем считываем данные с консоли. Далее определяем какую операцию нужно выполнять и в зависимости от этого переходим на нужную метку. В каждой метке операции мы получаем 2 числа, выполняем определенную операцию устанавливаем результат в переменную result и переходим в метку end, в которой мы выводим результат в консоль.

Теперь давайте сделаем свой собственный метод.

mclass MainClass  method public static void MainClass.Main(): 	.maxstack 2 	; Помещаем аргументы для нашего метода на стек 	push.int32 10 	push.str "Result - "  	; Вызываем метод 	callm usr static MainClass.StringPlusInt32(Relax.String, Relax.Int32)  	; Возвращаемый результат выводим на консоль 	callm std static Relax.Console.Write(Relax.String)   method public static Relax.String MainClass.StringPlusInt32(Relax.String str, Relax.Int32 num): 	.maxstack 2 	get num 	callm std static Relax.Converter.Int32ToString(Relax.Int32) ; конвертируем число в строку 	get str 	callm std instance Relax.String.Concat(Relax.String) ; добавляем в переменной str конвертированное значение 	return ; возвращаем результат

Метод StringPlusInt32 нужен для того, чтобы конкатенировать строку и число, для этого мы преобразуем число в строку при помощи метода Relax.Converter.Int32ToString и конкатенируем параметр str с числом, преобразованным в строку. И возвращаем результат при помощи инструкции return. Далее в методе Main просто выводим этот результат в консоль.

Вывод

Relax’у всего лишь полтора месяца, а он уже такое может. Он будет развиваться еще долго. Но даже сейчас можно писать простенькие консольные программы.

Репозиторий виртуальной машины(там есть документация relasm) — https://github.com/UnbelievableDevelopmentCompany/RVM

Репозиторий компилятора Relasm — https://github.com/UnbelievableDevelopmentCompany/Relasm

Пакет для sublime text 3 — RelasmST3Package

ссылка на оригинал статьи https://habr.com/ru/post/550610/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *