Создание нового языка для микроконтроллеров
Некоторое время я был занят написанием простенького редактора для языка ассемблер под ARM Cortex семейства микроконтроллеров (подробности в моих статьях), и вот сейчас, поднакопив некоторый опыт как в части самого ассемблера так и способов написания программ в них решился на написание нового редактора.
Плюс еще подоспел интерес к RISC‑V архитектуре и было принято решением делать редактор который смог бы редактировать программы на ассемблере для различных архитектур (в том числе может быть и с лагеря AVR кто нить захочет присоединиться).
Беглое изучение синтаксиса асм инструкций архитектуры RISC‑V дал довольно удручающее впечатление. Если многие хейтеры ARM ассемблер считают излишне сложным (типа слишком много сложный инструкций для запоминания и оперирования ими), то у RISC‑V наоборот все слишком уже просто, настолько просто что я как то принял мысль что RISC‑V это архитектура созданная под компиляцию с языков высокого уровня, поскольку даже элементарные действия на ARM Cortex на RISC‑V превращается в какой то квест с двумя\тремя инструкциями...
Плюс, конечно же в RISC‑V пошли по пути введения новых мнемоник инструкций ассемблера (реальным ведь пользователям все равно как они пишутся, это задача для компилятора транслировать с Си на ассемблер, и потом отдать на компиляцию).
Плюс вспоминая про AVR...
В общем подумалось: а что если попытаться создать asm‑base`д язык программирования который при выборе архитектуры просто бы транслировался автоматически в асм инструкции выбранной платформы?
Плюсом, дополнительно есть желание реализовать некий уровень абстракции от периферии микроконтроллеров, чтобы оставаясь в том же псевдокоде управлять стандартной периферией микроконтроллера не сваливаясь в настройку регистров конкретного mcu.
Причем тут даже не надо менять архитектуру, банально GPIO в STM32F1 и STM32F4 настраивается по разному, хотя суть настроек остается плюс минус такой же. И вот от этого и хочется уйти. За более чем год использования первого редактора ассмеблера (ArmAsmEdit) я и сообщество накопили некоторое количество библиотек кода, и самое занятное что например для драйверов дисплея под разные микроконтроллеры надо создавать свои варианты этих библиотек — банально с cortex-m0 нет битбандинга, или в STM32F1 GPIO настраивается по другому (в том числе на работу с SPI).
Планируемое решение должно максимально облегчить такие задачи, в идеале рабочий драйвер должен получаться просто сменой микроконтроллера причем вне зависимости от архитектуры.
Вот такой примерно был ход мыслей.
Сразу скажу — я не желаю создавать очередной си‑подобный язык высокого уровня! (и не надо об этом писать в комментариях). Цель создать именно язык ассемблера, но с человеческим лицом, в идеале чтобы программисту который захочет его использовать не приходилось бы учить как пишется та или иная инструкция ассемблера в конкретной архитектуре и как она работает...
Задача не простая, но такое преимущество как быстродействие ассемблера терять не хочется (и не надо писать как здорово си компилирует код, смотрели уже, причем ни на какой то логике, где си действительно способен генерить почти прямой асм код, а в целом по программе... вывод — не способен), так что это должны быть достаточно простые инструкции, интуитивно понятные в наборе и одновременно транслируемые в асм инструкции (возможно несколько).
Например, инструкция присваивания может выглядеть вот так:
R0=5
и будет автоматически транслироваться в зависимости от значения присваивания в
MOV R0, 5
Или, если аргумент 16ти битный:
MOVW R0, 0x1234
Или, если значение превышает 16 бит
LDR R0, =0x12345678
Одновременно, при арифметических операциях так же хочется остаться в таком формате написания инструкций
R0=R1+10
будет преобразовано в
ADD R0, R1, 10
или иной формат если слагаемое выйдет за формат Operand2 или imm12. И так далее.
Это все мысли сходу.
Одновременно решил обратиться с вопросом каким бы вы хотели видеть синтаксис этого макроязыка и к тем кто возможно уже имеет опыт создания каких то языков программирования (ведь мало придумать синтаксис, потом еще нужно организовать его быстрый разбор и трансляцию): может быть есть более удачные языковые конструкции для асм‑base`д языка.
Основное пожелание (и цель) — не уйти в придумывание нового множества названий инструкций, а реализовать на интуитивно понятном синтаксисе систему команд например cortex‑m4.
Для участников группы телеграмм записал небольшое видео части мыслей, которые требуют проверки и корректировки:
https://youtu.be/cuKhXBF6tdA
Ну и если кто решит присоединиться или просто высказать свое авторитетное мнение то всегда можете приходить в телеграмм https://t.me/ArmAsmEditor раздел называется ASM2Concept.
P.S. в комментах спорить по ненужности\бесполезности\тупости\убогости не собираюсь.
Jl
Источник