Как стать автором
Поиск
Написать публикацию
Обновить
15
0.6
Дмитрий Гарбузов @SystemSoft

Просто разработчик

Отправить сообщение

Всем привет!

Как вы помните: я говорил что хочу сделать свою лисп машину.

Проект не удался из-за корпуса и проводов. Но после этого я взялся делать микрокомпьютер на графической операционной системе.

Этот проект уже получился.

Сейчас решил всё усложнить и сделал ассемблер машину.

Ввод и вывод желают оставлять всего лучшего потому что ввод идёт с помощью двух кнопок (на самом деле limit switch это называют). А эти две кнопки это 0 и 1.

Результат программы не выводится но отображается в светодиодах:

  1. Зеленый - всё правильно.

  2. Желтый - правильно но с ошибками.

  3. Красный - не правильно.

Назвал я первую ассемблер машину как "pear 8800". Почему именно груша? Во первых я люблю груши :-). Во вторых мне нравится везде ставить название "pear" и дальше что-то.

Но можно вводить код по типу такого (не один не скомпилирует ведь мой это интерпретатор но на самом деле это не так):

section .data
hello: 1
section .code
mov ret hello

Вывод: 1.

3 регистра: rsi и rdi для данных и ret для данных которые возвращает программа.

Вот так.

Теги:
+2
Комментарии0

Всем привет.

Хочу вам рассказать о том что я делаю LISP машину на Raspberry Pi Pico W.

Изначально я хочу сделать её похожую на эту:

Вот такой.
Вот такой.

Конечно не такой, но по виду схожую.

Я ещё называю это холодильником.

И. На данный момент я сделал аппаратную часть и перехожу к программной.

Дальше сделаю корпус и всё.

Скажу когда сделаю.

Удачи.

Теги:
Всего голосов 10: ↑9 и ↓1+10
Комментарии2

Всем привет!

Представляю вам мой новый проект: Terpinal.

Также я называл его "терпи нал".

Это терминальная операционная система для Raspberry Pi Pico. Который выводит на SSD1306.

Вот ссылка:

https://github.com/SystemSoftware2/Terpinal

Прочитайте README.md и узнайте что и как подключить.

Также я называю операционку как PicoOS Firmware (не знаю почему так).

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии3

Я доделал компилятор C на Python.

Баги всё ещё есть но их намного меньше

Его я назвал pycc.

Если хотите попробовать, вот гитхаб: https://github.com/SystemSoftware2/pycc

Всё остальное смотрите там.

[UPD]: А за что минусуете?

Теги:
Всего голосов 7: ↑6 и ↓1+6
Комментарии2

Всем привет.

Как вы знаете я пишу компилятор C на Python.

Сегодня я исправил баг с типизацией, который случайно нашёл когда делал ошибки.

Вот этот отрывок: void main() { int x = "h"; } обрабатывался как правильный синтатикс. Теперь нет.

И я добавил цикл do-while. Правда в нём есть проблема: в конце если выражения = false то он ещё раз выполняет и потом останавливает цикл do-while. Ну, пока что так.

Пример цикла do-while:

void main() {
  int a = 10;
  do {
    a = a + 1;
  } while (a > 2);
}

Только вывод не то что "a" это 1 а 0. Правда, сил нету добавлять ненужные части кода для исправления.

Ну. Хотя бы работает как то. А то когда в первый раз делал этот цикл то вообще нечего не работало.

Всем пока.

Теги:
Всего голосов 4: ↑3 и ↓1+3
Комментарии0

Снова всем привет. В прошлом посту я писал о том что пишу компилятор C (на Python).

Вчера я добавил функции, вот пример программы вычисления факториала с функциями:

void fac(n) {
  int f = 1;
  while (n > 1) {
    f = f * n;
    n = n - 1;
  }
}

void main() {
  fac(5);
}

Что можно заметить нового и чего нету:

  • Функция main стала обязательной

  • Не обрабатывается тип данных у аргументов (не везде)

  • Все переменные и параметры - глобальные

  • Оператора return не существует

  • Функции объявляются только с помощью void

Вот как компилятор создаёт функции:

  1. Добавляет в словарь self.funcs данные о функции

  2. Когда видит вызов функции то компилирует код функции но перед компиляцией создаёт переменные со значениями аргументов

Получается мы не заставляем виртуальную машину работать с функциями ВООБЩЕ.

Но и в этом есть свой минус: return сделать будет невозможно.

Самым сложным это сделать нормальный парсер для этого чуда.

Из-за этого я испортил код парсера. Главное работает 😅.

Всем пока.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Всем привет.

Сегодня на данный момент я пишу компилятор C в байткод.

Вы скажете: но C же в машинный код компилируется? В моём случае нет. Лишь в байткод.

Вот правила которые мой C поддерживает:

  • цикл do-while, цикл while, условие if-else, цикл for (возможно)

  • Из операций: +, -, /, *, ==, !=, <, >

  • Декларация переменных только с инициализацией (не int x;) а (int x = 5;)

  • Присваивание (типо a = a + 1;) можно при созданной переменной

  • Из типов данных только два: int, char

  • Функции не обещаю но возможно будут

А то что уже есть:

  • if-else, while

  • Декларация переменных

  • Присваивание переменных

  • Все типы данных

  • Все операции

Сделать факториал уже можно. Вот пример факториала 5:

int n = 5;
int f = 1;
while (n > 1) {
  f = f * n;
  n = n - 1;
}

Вывод:

Execution finished
n: 0
f: 120

Вот как он работает:

  • С помощью регулярок лексер получает нужный токен и тег

  • Парсер строит AST

  • Компилятор делает байткод

  • Виртуальная машина выполняет его

Вот так всё работает.

Все инструкции байткода (на данный момент):

FETCH переменная - положить на стек значение переменной
PUSH число - положить на стек число
POP - я не помню зачем это ведь это не нужно будет нам
ADD, SUB, MUL, DIV - бинарные операции
NOTEQ, EQ, LT, GT - реляционные операции
JMP адрес - перейти по адресу
JNZ адрес - перейти по адресу если на вершине стека не 0
JZ адрес - перейти по адресу если на вершине стека 0
PASS - игнорировать
STORE имя - сделать переменную если она есть и её тип данных
      соответствует типу данных значения
TSTORE имя - декларация переменной
HALT - конец программы

Вот так. На данный момент в проекте где-то 400 строчек кода но это с комментариями и всеми пустыми строками.

Конец. Всем пока.

Теги:
Всего голосов 3: ↑3 и ↓0+4
Комментарии1

Информация

В рейтинге
1 569-й
Откуда
Адыгейск, Адыгея, Россия
Зарегистрирован
Активность

Специализация

Software Developer
Python
Compilers
System Programming
C
Object-oriented design