Базовый CS с нуля
Значения и типы: собери инспектор значений
Ты прочитал, что один паттерн битов означает разное под разными правилами типа. Сделай это конкретным: напиши небольшую программу, которая сохраняет байт один раз и показывает, чем он становится под каждым правилом — затем дожми числа JS туда, где их единый 64-битный формат начинает проявляться.
Преврати ментальную модель юнита в рабочий инструмент: сохрани сырые байты, декодируй те же байты под несколькими правилами типа и докажи реальным выводом, что смысл живёт в чтении, а не в битах — включая места, где кусаются хранение IEEE 754 и coercion.
Собери небольшой консольный инспектор значений на TypeScript или JavaScript (Node, Deno или Bun), который сохраняет сырые байты в буфере, декодирует те же байты под несколькими правилами типа и печатает отчёт бок о бок, доказывающий, что биты не меняются, а интерпретация — да; затем расширь его, чтобы показать пределы единого типа number в JS.
- Запуск программы печатает размеченный отчёт, где один и тот же байт появляется единожды, но декодируется в как минимум три разных значения, с показанным исходным паттерном битов, чтобы читатель видел: биты не изменились.
- Область из 4 байт декодируется и как integer, и как float из одного неизменного буфера, с обоими выводами и общими байтами на виду.
- Секция typeof печатает все пять повседневных примитивов и явно отмечает, что typeof null — 'object', с заметкой, что корректная проверка null — это x === null.
- Секции точности и coercion печатают реальный вывод рантайма (а не угаданное значение) рядом с однострочным объяснением, основанным на 'один тип number — 64-битный IEEE 754' и 'coercion на каждый оператор'.
- Добавь демо 'неверного типа': запиши байты, которые являются валидным integer, намеренно прочитай их как float (и наоборот) и покажи бессмысленное значение, чтобы сделать цену неверной интерпретации конкретной.
- Добавь крошечное сравнение static-vs-dynamic: напиши один сниппет, который не компилируется под strict mode TypeScript (например const x: number = '9.99'), и эквивалентный JS, который выполняется и молча приводит, и зафиксируй оба исхода в README.
- Поддержи little-endian vs big-endian для чтения 4 байт (DataView принимает флаг) и покажи, как порядок байт меняет декодированное integer, тогда как хранимые байты остаются теми же.
- Расширь инспектор, чтобы декодировать область из 2 байт как знаковое vs беззнаковое 16-битное integer и показать, как одни и те же биты становятся отрицательным или положительным числом под two's complement vs обычным place-value.
Это юнит, ставший исполняемым: ты сохранил байты один раз и наблюдал, как они становятся integer, символом, каналом цвета и float в зависимости лишь от применённого правила — доказательство, что смысл в чтении. Ты также встретил края единого типа number в JS (0.1 + 0.2, потолок safe integer) и увидел, как coercion выбирает правило типа за тебя на каждый оператор. Собери инспектор один раз — и ‘биты не несут встроенного смысла’ перестанет быть лозунгом и станет тем, что ты увидел собственным выводом.