Байтоёбство в javascript



Частенько джбаскриптеры любят называть крестовиков байтоёбами. Типа трахаются они со своими memalloc, байтовыми операция, а нам оно и нахуй не нужно, у нас всё супер высокоуровневенько.

На самом же деле, юные джабаскриптеры просто ещё не подозревают, что в js, этого самого байтоёбства хватает с головой.

Строгая типизация в JS

Неожиданно да? Но её зайчатки имеются. Конечно, у нас нет строгой типизации для примитивов, написать int i= 0 нельзя. Но у нас есть типизированные массивы:

new Uint8Array();
new Uint16Array();
new Uint32Array();

new Int8Array();
new Int16Array();
new Int32Array();

new Float32Array();
new Float64Array();

И тут уже во всю лезут родные фишки с переполнением и ошибками типизации:

let test1 = new Uint8Array(1);
test1[ 0 ] = 256;
console.log(test1[ 0 ]); // выведет 0, а не 256

let test2 = new Int8Array(1);
test2[ 0 ] = 255;
console.log(test2[ 0 ]); // выведет -1, а не 255

Побитовые операции

У нас есть все те же самые побитовые операции, что и в ц++

XOR - ^
AND - &
OR - |
NOT - ~
RSHIFT - >>
LSHIFT - <<
Bitwise RSHIFT - >>>

В дополнение к ним, можем в хексах задавать значения:

console.log(0xff << 8 | 0xff); // 65535

Зная побитовые операции, можно на собеседовании удивить будущих коллег жабаскриптеров:

let a = 10;
let b = 20;
a = a ^ b;
b = b ^ a;
a = b ^ a;
console.log(a, b); // 20 10

Сишники, конечно, тихо посмеются, но щито поделать, мало кто из юных вкатывальщиков понимает что тут происходит.

Ручная аллокация памяти в JS

Да, и она то же есть, в нашем родном, буфере:

Buffer.alloc()
Buffer.allocUnsafe()
Buffer.allocUnsafeSlow()
... ИТД

Бонусом идёт НЕвозможность автоматического расширения:

let buf = Buffer.alloc(1);
buf[ 0 ] = 10;
buf[ 1 ] = 20;
console.log(buf); // <Buffer 0a> - один элемент, как и запросили в alloc

А ещё, увидили в консольке Buffer 0a? Так вот 0a - это ж наши любимые(без сарказма) хексики!

Нафига оно всё нужно

Байтоёбство начинается тогда, когда Вы спускаетесь с небес HTTP и модных фреймворков поближе к железу. И это не зависит от используемого языка программирования.

Например, если начнёте писать что-нить под Bluetooth/BLE, то обнаружите, что пакетик в BLE совсем маленький, и закодировать что-то в json не получится, придётся упаковывать всё в байтики.

Или, если нужно работать с UDP/TCP, например, получать данные с ких-нить iot девайсиков, то придётся окунуться в мир бинари пакетов, битовых флагов и вот этого всего.

Или чтение каких-нить НЕ текстовых файлов, то же видео/картинки/архивы итд.

С чем мне приходилось работать?

Мне почему-то везёт на UDP серваки. Например, пришлось писать upd сервер, для iot девайсиков. Эти девайсики упаковывают всё в маленькие бинари пакеты, чтобы экономить батарейку, обмазывает всё битавыми флагами, а я с этим потом как-то живу.

Ещё приходилось писать UDP прослойку между openresty и redis, чтобы съэкономить на tcp коннектах. И надо сказать очень хорошо съэкономили.

И да, с вышеупомянутым BLE тоже пришлось потрахаться, хоть и не на ноде, а на GO, но не исключено, что и на ноде скоро то же придётся.


Сообщество: AWS

Комментариев(0)


Всего: 0 комментариев на 0 страницах

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



Сообщества