Giter Club home page Giter Club logo

biner's Introduction

Build Status codecov issues issues

issues issues

Biner

Biner (рабочее название) - это моя первая попытка разработать язык. Назвать это языком программирования пока язык не поворачивается (уж простите за тавтологию), однако фишки вроде структур, наследования, импортов и многого другого уже реализованы.

Пока что будем называть его языком описания.

Для чего он нужен

Biner - это, в первую очередь, язык описания структур двоичных данных.

На текущий момент имеет встроенные типы:

  • int8
  • int16
  • int32
  • uint8
  • uint16
  • uint32
  • float32
  • float64
  • char как аналог int8
  • некоторые строковые структуры (опишу их позже)

Все эти типы данных должны читаться стандартными функциями класса Buffer.

Демо

Все примеры буду складывать в папке examples

Пока что я использую расширение .go для примеров, потому как его подсветка очень близка к концепции разрабатываемого языка.

Как начать разработку

  1. Форкаем к себе репку
  2. Клонируем
  3. $ yarn
  4. $ 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.

Что под капотом

Kaitai

https://www.opennet.ru/opennews/art.shtml?num=46244

Есть аналогичный проект: Kaitai, однако там структуры описываются на языке YAML. Этот язык тоже хорош, да и проект довольно объёмный:

  • Множество готовых примеров (некоторые из которых, я, к слову, у них подсмотрел)
  • Онлайн-песочница
  • Хорошая документация
  • Возможность генерировать парсеры для разных языков (это вообще огонь)

Имею смелость предположить, что стоит устроить с ними коллаборацию и обменяться, например конвертерами форматов (Biner <-> Kaitai). Ну и получить опыт у вполне состоявшегося проекта. YAML, конечно, хорош в определённых задачах, но лично мне кажется, что он слишком громоздок для описания таких структур. В случае же Biner хочется сделать максимально человекочитаемый язык, с которым будет проще разобраться программисту, владеющему любым Си-подобным языком (Biner всё же можно считать Си-подобным, я так полагаю).

Что есть

Структуры

описать

Скалярные типы

описать

Условные блоки (пока только switch)

описать

Модульность

(Это песня про импорты/экспорты)

Константы

описать

Директивы

описать

Декораторы

Я позже опишу чем они могут быть здесь полезны. Однако саму концепцию я пока не продумал.

Наследование

Структуры можно наследовать от других структур

Generics

Замечательная концепция во многих языках программирования. К слову, парсер уже обучен их понимать. Например, вот так это работает в моём любимом C#

Что планируется

Простейшая арифметика

На первых этапах нужно реализовать хотя бы основные арифметические операции (+-*/).

Запись блоков памяти обратно в буфер

На первых этапах мы будем учить Biner только читать данные, но в дальнейшем нужно будет заложить и запись. Я пока смутно представляю себе это, но задача не должна оказаться нерешаемой.

Плагины для IDE / Линтеры

Подсветка, анализ кода и прочие плюшки

Варианты названия

Нужно решить, как обозвать проект. Сейчас используется рабочее название Biner, но мне оно не нравится.

  • BiSt - от Binary Structurization (созвучно с Beast)
  • BiStLang - Binary Structurization Language
  • BinLang
  • ...предлагайте

biner's People

Contributors

dependabot[bot] avatar serabass avatar

Watchers

 avatar  avatar

biner's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.