Biner (рабочее название) - это моя первая попытка разработать язык. Назвать это языком программирования пока язык не поворачивается (уж простите за тавтологию), однако фишки вроде структур, наследования, импортов и многого другого уже реализованы.
Пока что будем называть его языком описания.
Biner - это, в первую очередь, язык описания структур двоичных данных.
На текущий момент имеет встроенные типы:
- int8
- int16
- int32
- uint8
- uint16
- uint32
- float32
- float64
- char как аналог int8
- некоторые строковые структуры (опишу их позже)
Все эти типы данных должны читаться стандартными функциями класса Buffer.
Все примеры буду складывать в папке examples
Пока что я использую расширение .go
для примеров, потому как его подсветка очень близка к концепции разрабатываемого языка.
- Форкаем к себе репку
- Клонируем
$ yarn
$ yarn tw
Запустятся все тесты, которые можно отфильтровать (см. документацию Jest). Я обычно запускаю sandbox.tests.ts
и параллельно играюсь с парсером в examples/sandbox.go
.
Основной код парсера лежит в /src/biner.pegjs
(за подробностями ко мне или в документацию PEGjs)
Пока большинство тестов не проходят, да и написаны криво. К тому же на текущий момент я полностью сломал класс Processor, потому как для столь сложной разработки нужно выполнять большие задачи последовательно: сначала тщательно продумываем синтаксис и работаем только с парсером, а затем навешиваем логику.
Иначе говоря, чем больше примеров будет в /examples
и чем разнообразнее они будут, тем меньше подводных камней мы встретим в ходе разработки.
Важно: не стесняйтесь задавать вопросы. Таким образом я буду знать, что ещё внести в этот README, чтобы он был максимально информативным.
Я задумывал Biner как инструмент для описания и разбора двоичных блоков памяти, коими могут быть области в оперативной памяти или файлах.
Предположим, у нас есть три байта с данными о красном цвете RGB: FF 00 00
. Мы можем описать для него простую структуру:
struct rgb {
r: int8;
g: int8;
b: int8;
}
Таким образом, каждый из полученных байтов будет считан один за другим и прописан в нужные поля на выходе. А на выходе мы получим JSON-объект:
{
"r": 255,
"g": 0,
"b": 0
}
Я предлагаю использовать подход TDD с использованием Jest и его замечательного --watch
.
- Node.js
- Typescript
- TSLint
- Jest
- PEGjs (Его важно изучить. У них в репке есть несколько замечательных примеров)
- Travis CI
- Codecov
https://www.opennet.ru/opennews/art.shtml?num=46244
Есть аналогичный проект: Kaitai, однако там структуры описываются на языке YAML. Этот язык тоже хорош, да и проект довольно объёмный:
- Множество готовых примеров (некоторые из которых, я, к слову, у них подсмотрел)
- Онлайн-песочница
- Хорошая документация
- Возможность генерировать парсеры для разных языков (это вообще огонь)
Имею смелость предположить, что стоит устроить с ними коллаборацию и обменяться, например конвертерами форматов (Biner <-> Kaitai). Ну и получить опыт у вполне состоявшегося проекта. YAML, конечно, хорош в определённых задачах, но лично мне кажется, что он слишком громоздок для описания таких структур. В случае же Biner хочется сделать максимально человекочитаемый язык, с которым будет проще разобраться программисту, владеющему любым Си-подобным языком (Biner всё же можно считать Си-подобным, я так полагаю).
описать
описать
описать
(Это песня про импорты/экспорты)
описать
описать
Я позже опишу чем они могут быть здесь полезны. Однако саму концепцию я пока не продумал.
Структуры можно наследовать от других структур
Замечательная концепция во многих языках программирования. К слову, парсер уже обучен их понимать. Например, вот так это работает в моём любимом C#
На первых этапах нужно реализовать хотя бы основные арифметические операции (+-*/).
На первых этапах мы будем учить Biner только читать данные, но в дальнейшем нужно будет заложить и запись. Я пока смутно представляю себе это, но задача не должна оказаться нерешаемой.
Подсветка, анализ кода и прочие плюшки
Нужно решить, как обозвать проект. Сейчас используется рабочее название Biner, но мне оно не нравится.
- BiSt - от Binary Structurization (созвучно с Beast)
- BiStLang - Binary Structurization Language
- BinLang
- ...предлагайте