Русский
Русский
English
Статистика
Реклама

Relasm

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

04.04.2021 14:14:58 | Автор: admin

Вступление

Всем привет, я являюсь автором языка программирования 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.reeRelaxVM program.ree

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

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

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

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

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

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

mclass MainClassmethod public static void MainClass.Main():.maxstack 2; Объявление переменныхlocal firstNum Relax.Int32local secondNum Relax.Int32local result Relax.Int32local 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 oppush.str "+"callm std instance Relax.String.operator==(Relax.String)jmpif opAdd; Проверка на вычитаниеget oppush.str "-"callm std instance Relax.String.operator==(Relax.String)jmpif opSub; Проверка на произведениеget oppush.str "*"callm std instance Relax.String.operator==(Relax.String)jmpif opMul; Проверка на делениеget oppush.str "/"callm std instance Relax.String.operator==(Relax.String)jmpif opDivopAdd: ; Сумма чиселget firstNumget secondNumaddset resultjmp endopSub: ; Разность чиселget secondNumget firstNumsubset resultjmp endopMul: ; Произведение чиселget firstNumget secondNummulset resultjmp endopDiv: ; Деление чиселget secondNumget firstNumdivset resultjmp endend: ; вывод результата на экранpush.str "\nResult: "callm std static Relax.Console.Write(Relax.String)get resultcallm std static Relax.Console.Write(Relax.Int32)

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

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

mclass MainClassmethod public static void MainClass.Main():.maxstack 2; Помещаем аргументы для нашего метода на стекpush.int32 10push.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 2get numcallm std static Relax.Converter.Int32ToString(Relax.Int32) ; конвертируем число в строкуget strcallm 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

Подробнее..
Категории: C++ , Qt , Assembler , Байт-код , Relax , Relasm , Яп , Pl , Udc , Lofectr

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru