В этой статье я хочу рассказать о небольшой библиотеке, которая упрощает работу с бинарными данными структур и массивов из C/С++ в JavaScript коде.

В статье про универсальный интерфейс я говорил о преимуществах использования Web-socket. Единственным неудобным моментом в процессе разработки для меня был обмен данными между JavaScript и C/С++ кодом. Первое, что тогда пришло в голову, использовать JSON-объекты, которые можно очень просто сгенерировать и интерпретировать в Qt. Однако на практике это оказалось не очень удобным решением. Нужно постоянно заворачивать структуры данных из C/С++ в JSON-объекты, а потом ещё и разворачивать их. Согласитесь, не самое приятное занятие.

Спустя некоторое время я начал мечтать. А вот бы мне иметь возможность «сишную» структуру напрямую передавать в JavaScript и обратно, без всяких JSON-объектов и других телодвижений. Поискав немного на просторах интернета, я набрёл на подделку Mozilla. В силу значительного количества ограничений этой библиотеки я отказался от её использования.

После более глубокого знакомства с типизированными массивами в JavaScript и веб-сокетами я решил написать библиотеку своей мечты, с «документацией и примерами». Как вы наверное догадались, я написал эту библиотеку и хочу услышать отзывы профессионалов.

Для знакомства с библиотекой милости прошу в мой github.
Какие потенциальные недостатки у представленной библиотеки?

Проголосовал 21 человек. Воздержалось 68 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Комментарии (13)


  1. x512
    16.12.2015 14:37
    +1

    я решил написать библиотеку своей мечты
    А чем вам protobuf не угодил?


    1. Voronar
      16.12.2015 14:43

      Плохо искал, наверное. Буду смотреть, что там есть для JavaScript.


    1. rumkin
      16.12.2015 16:48

      Protobuf плох обязательным наличием схемы.


  1. mwizard
    16.12.2015 15:47

    1. ProtoBuf — github.com/google/protobuf
    2. MessagePack — msgpack.org
    3. BSON — bsonspec.org


  1. rumkin
    16.12.2015 16:14

    4. UBJSON – ubjson.org


  1. Voronar
    16.12.2015 17:08

    Насколько я понял, все вышеперечисленные решения — это вариация бинарного JSON-формата для представления данных, кроме protobuf. Не могу поспорить в ограниченности функционала этих решений.
    Но мне было нужно что-то более простое и специфичное. В своей библиотечке я хотел без посторонней помощи прочитать байтовое представление «сишной» структуры или массива(получаемого просто с помощью memcpy) в JavaScript объекте или типизированном массиве.


    1. Dima_Sharihin
      16.12.2015 20:05

      Как решаются вопросы ссылочных типов, выравнивания структур и разных размеров типов на разных хостах? Или предлагаемое решение прибито гвоздями к x86?


      1. Voronar
        16.12.2015 21:09

        Там написано в документации, что необходимо обязательное 1-битное выравнивание, ссылочных типов и указателей нет.
        Я не тестировал на других архитектурах, только x86(x86_64). Думаю, что на других архитетурах нет смысла запускать «тормознутые» веб-двигатели.
        Спасибо за полезный комментарий.


      1. Voronar
        16.12.2015 23:13

        В общем исходил из вот таких размеров типов данных языка Си.
        long long не поддерживается, так как в JS нету нативного Int64Array(Uint64Array).


      1. Voronar
        18.12.2015 13:34

        По поводу разных размеров типов на разных хостах.
        Тут ответственность лежит на разработчике C++, объявляющем в своём коде структуры или массивы. При объявлении он должен исходить из того, чтобы его 32-битный int должен быть именно такого размера, а не 16 или 8 бит. А если не уверен, то пусть делает #ifdef.
        JS-код же может гарантировать, что ctype.int32 будет именно 32-битный.


  1. MTonly
    17.12.2015 01:34
    +2

    Библиотека не работает с моим веб-двигателем
    Веб-двигателем?


  1. Voronar
    17.12.2015 11:51

    Web browser engine, если быть более точным.
    Вас смутило название или смысл вопроса?


    1. MTonly
      17.12.2015 15:02
      -1

      Термин. Теперь понятно. По-русски это обычно называют браузерным движком, а в случае варианта ответа в вашем опросе, вероятно, было бы достаточно просто «браузер».