Как стать автором
Обновить

Комментарии 16

Погодите. Парсинг строк, ввод строк и т.п. для форта ведь делается (точнее, берётся готовый) на форте, ядро — совсем крохотное, нет?
Не совсем понял вопрос. Я не брал ничего готового, даже каких-то библиотек. Все с полного нуля. Под парсингом строк на форте я понимаю слово word и подобные, которые берут для обработки информацию из входного буфера. Все это нужно создавать на ассемблере — буфер, его парсинг, заполнение буфера из стандартного ввода системными вызовами, и другое. Под ядром в форте обычно понимают то, что написано не на форте — обычно на C или ассемблере. В данном случае на ассемблере. Да, оно небольшое, думаю, несколько килобайт.
Ну вот мне и казалось, что парсинг буфера — не в ядре. Смысл его в ядро выносить? Достаточно функции получения буфера.
Насчёт «ввода строк» я, может, и погорячился — но при наличии функций ввода символа, отображения символа и стирания символа или позиционирования курсора — почему нет?
Можно сделать и не в ядре, но тогда в ядре надо будет сделать строковые операции. А уже на на них делать парсинг. Но парсинг на форте очень прост. Там либо читается следующее слово, либо строка до определенного разделителя. Я хочу максимально быстро сделать интерпретатор, а потом компилятор. Сделать несколько слов для парсинга на ассемблере проще, чем делать строковые операции, а на них уже эти слова парсинга. И работать они будут быстрее. К тому же, если делать через строковые операции в ядре, придется много писать байт-кода вручную.
В общем, сделать несколько слов парсинга в ядре проще, работать они будут быстрее, и цель — создать компилятор, будет достигнута быстрее.
Как-то так :)
Не зняю, что за команда var. В первом приближении,
во всех процедурах работающие с памятью,
достаточно к адресам прибавить базовый адрес.
не пример:
b_get = 0x40
bcmd_get: pop rcx
push [rcx+start]
jmp _next

b_set = 0x41
bcmd_set: pop rcx
pop rax
mov [rcx+start], rax
jmp _next
Описал эту команду по максимуму. Думал, даже самые непонятливые поймут) прибавлять точно ничего не нужно :)
Не только в переменных дело, если ставится задача переносимости
на уровне бинарных модулей. В бинарном модуле не допустимо
появления ни одного прямого адреса. В принципе, эту задачу
можно возложить на пользователей системы. Но думаю, пользователи
с этим не согласятся.
Тут следует вычесть базу:
b_var0 = 0x28
bcmd_var0:
mov rax,r8
sub rax,start
push rax

Иначе, что собой будут представлять список указателей?
Например, список указателей на словари.
Спасибо за интерес!
В следующей статье подробно опишу этот момент.
b_bad = 0x00
bcmd_bad: mov rax, 1 # системный вызов № 1 — sys_write

mov rax, 60 # системный вызов № 1 — sys_exit
mov rbx, 1 # выход с кодом 1
syscall # вызов ядра

b_bye = 0x01
bcmd_bye: mov rax, 1 # системный вызов № 1 — sys_write
mov rdi, 1 # поток № 1 — stdout
mov rsi, offset msg_bye # указатель на выводимую строку
mov rdx, msg_bye_len # длина строки
syscall # вызов ядра
mov rax, 60 # системный вызов № 60 — sys_exit
mov rdi, 0 # выход с кодом 0
syscall # вызов ядра
Да, ошибка.

Должно быть так:

mov rax, 60 # системный вызов № 1 — sys_exit
mov rdi, 1 # выход с кодом 1
syscall # вызов ядра

Первый параметр в 64-х битном syscall — это RDI.
В 32-х битном был EBX, видимо, на автомате, исправил на RBX.

Спасибо! :)
Планируются ли какие фишки (байт-коды) добавить в систему, помимо стандартных слов Форт-системы? (насколько система будет покрывать существующие стандарты Форта)
Один из примеров Форт-подобного языка имеющего нестандартные байт-кода home.hccnet.nl/anij/nof/noforth.html
Существуют и другие разные варианты.

P.S. Есть и такая статья о Форте на нейронных сетях
Programming with a Differentiable Forth Interpreter
arxiv.org/abs/1605.06640

Ого, не думал, что что-то общее может быть между фортом и нейронными сетями :)
Спасибо за ссылки, обязательно прочитаю.

Вообще, я начал просто писать байт-машину для экспериментов. Но если есть интерес, помещу на гитхаб, и можно будет сделать все что нужно.

Никаких упрощений не делаю, при желании можно будет развить в полноценную форт-систему.
Форт ориентированный байт-код можно много где встретить (неплохо, если бы был дополнительно какой то обзор этого в рамках данного цикла статей)
P.S. Например в Radare2, язык промежуточного представления реверсируемой программы ESIL использует Форт-подобный процессор (и для симуляции логики кода)
radare.gitbooks.io/radare2book/disassembling/esil.html
OpenBios ещё одно «широко» известное использование Форта+байт-кода github.com/openbios

P.S. Большее количество информации Форт направленности можно найти в сообщениях рускоязычного Форт-форума fforum.winglion.ru/index.php (активного c 2006 года)
Отдельно интересен вопрос нативного ускорения байт-кода в целевом устройстве и оптимизации его по параметру быстродействие/размер_кода.
Один из примеров в этом направлении github.com/mic-/forthec (Форт-подобный язык транслируется в ассемблерный код целевого процессора с некоторыми оптимизациями) язык реализации проекта Euphoria (язык программирования)
Запуск примера из этого проекта в рамках KolibriOS системы board.kolibrios.org/viewtopic.php?f=38&t=3268
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории