[C++, Assembler, Qt] Новый язык программирования — Relax
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
ВступлениеВсем привет, я являюсь автором языка программирования Relax. На данный момент я разрабатываю RVM(RelaxVirtualMachine) И Relasm(Relax Assembly). Первые попытки сделать свой язык начались в конце лета 2020, тогда я и не думал что делать язык - это так сложно. Сам же проект Relax начался 30 декабря 2020 года. Прошло полтора месяца, а на нем уже можно написать что-нибудь простенькое.
первое лого языкаКак компилировать код?Начнем с того, что файлы relasm лучше сохранять с расширением .rasm, файлы байт-кода - .ree. Для того чтобы скомпилировать и запустить код нужно скачать 3 файла: Relasm.exe, RelaxVM.exe, QtCore.dll. Сделать вы это сможете вот по этим ссылкам: https://github.com/UnbelievableDevelopmentCompany/R...ster/x64/Release
https://github.com/UnbelievableDevelopmentCompany/R...ster/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
===========
Источник:
habr.com
===========
Похожие новости:
- [Системы сборки] Сборка (CI/CD) проектов
- [Data Mining, Алгоритмы, Big Data, Машинное обучение] Рекомендации с обоснованием (2020). Часть первая (перевод)
- [Законодательство в IT, Компьютерное железо, Ноутбуки, IT-компании] Суд признал, что Apple знала о дефекте Flexgate в продаваемых в 2016-2017 годах ноутбуках MacBook Pro
- [IT-инфраструктура, Графический дизайн, История IT, Биографии гиков, IT-компании] Почему ПК – не сервер
- [Ненормальное программирование, Я пиарюсь, C++, ООП] CDD — Cli Driven Development
- [C++, Qt] Пишем свою навигацию в Qt
- [Алгоритмы] OpenCV ищет студентов для Google Summer of Code-2021
- [Информационная безопасность, Антивирусная защита, Реверс-инжиниринг] Пока расследование не разлучит нас: малварь, которая может сидеть в сети компании годами
- [HTML, Usability, Дизайн, Звук] «Радио, погода, время всегда под рукой» или история одного решения (железо, софт, интерфейс)
- [Законодательство в IT, Смартфоны, Софт, IT-компании] Apple добавила в App Store рекомендуемые для установки российские приложения и предлагает их ставить на новые iPhone
Теги для поиска: #_c++, #_assembler, #_qt, #_relax, #_relasm, #_bajtkod (байт-код), #_c++, #_qt, #_jap (ЯП), #_pl, #_udc, #_lofectr, #_c++, #_assembler, #_qt
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:42
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
ВступлениеВсем привет, я являюсь автором языка программирования Relax. На данный момент я разрабатываю RVM(RelaxVirtualMachine) И Relasm(Relax Assembly). Первые попытки сделать свой язык начались в конце лета 2020, тогда я и не думал что делать язык - это так сложно. Сам же проект Relax начался 30 декабря 2020 года. Прошло полтора месяца, а на нем уже можно написать что-нибудь простенькое. первое лого языкаКак компилировать код?Начнем с того, что файлы relasm лучше сохранять с расширением .rasm, файлы байт-кода - .ree. Для того чтобы скомпилировать и запустить код нужно скачать 3 файла: Relasm.exe, RelaxVM.exe, QtCore.dll. Сделать вы это сможете вот по этим ссылкам: https://github.com/UnbelievableDevelopmentCompany/R...ster/x64/Release https://github.com/UnbelievableDevelopmentCompany/R...ster/x64/Release После того как скачали, желательно добавить эти 3 файла в любую папку, которая есть в переменной PATH(или же создать новую папку). Далее в cmd переходим в папку с программой на Relasm и вводим следующие команды: Relasm main.rasm program.ree
RelaxVM program.ree mclass MainClass
method public static void MainClass.Main(): .maxstack 1 push.str "hello world" callm std static Relax.Console.Write(Relax.String) 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) 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 ; возвращаем результат Репозиторий компилятора Relasm - https://github.com/UnbelievableDevelopmentCompany/Relasm Пакет для sublime text 3 - RelasmST3Package =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:42
Часовой пояс: UTC + 5