Книга: The History of the Fortran Programming Language (2019)

nil

Во время чтения литературы на тему мне случайно попалась книга про историю Фортрана. После чтения материалов по устройству оптимизирующих компиляторов вообще неизбежно проявление интереса к одному из старейших, если не старейшему, активно используемого языку программирования.

The History of the Fortran Programming Language за авторством Марка Лоренцо (англ. Mark Lorenzo) старается одновременно рассказывать истории людей, ключевых компиляторов и языковых стандартов. Начинается с истории людей, вошедших в легендарную команду компиляторщиков (касаясь не только Бэкуса, но даже того же фон Неймана), и компьютеров, для которых была предназначена их разработка.

Первым шагом Бэкуса стал его опыт в разработке компиляторов стала система Speedcoding, реализующая числа с плавающей и фиксированной запятой на ранних компьютерах от IBM. Система была относительно медленной, заставляла понимать детали работы конкретных машин. В истоге числа с плавающей запятой были реализованы в железе, а Бэкус смогу сформулировать собственное видение касательно будущего программирования.

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

В последующие десятилетия разработчики Фортрана заложат все основы и связанную с оптимизирующими компиляторами терминологию. Например, прорывным был компилятор Fortran H, авторы которого сформулировали отношения доминирования, находили и двигали константные выражения, общие подвыражения и т.д.

Чувствуется, что написание книги предварялось серьезным исследованием. Автор, отступая от небрежных традиций популярной литературы, даже включил длинный список первоисточников. С другой стороны, ссылок внутри текста нет, поэтому использовать уже саму книгу как отправную точку для исследований не получится…

А еще, признаться, серьезной редакторской работы тексту все же не хватает. Материал объединяет в себе очень разные вещи и истории: нововведения в языке, компьютеры, перфокарты, фон Нейман, масса каких-то почти не вполне связанных с темой личных историй. Такое чувство, что автор, собрав массу материала, очень боялся выбросить хоть что-то… Или просто раздувал объем?

Я б сказал, что книга к прочтению не обязательная, но и жалеть не придется.

Книга: Code the Classics, Vol. 1 (2020)

nil

На Рождественских выходых выдались свободные часы и я прочитал приятную книжечку: Code the Classics, Vol.1, в которой описываются 4 упрощенных клона классических игр (Pong, Centipede, Frogger, Sensible Soccer). К книге прилагается все необходимое для запуска клонов: код, звуки, музыка и картинки. Сами игры написаны на Pygame Zero, предельно упрощенном фреймворке для любительской разработки игр.

Книга оформлена необычно дорого: на толстых цветных страницах показаны скриншоты из оригинальных игр, фото разработчиков, моменты из клонированных игр, даже сам код. Книга несколько неожиданно включает в себя не только код, но даже все картинки для игр. Странное решение! Тем более что все материалы выложены на Github.

Реального текста в книге немного, буквально по несколько страниц на игру плюс пояснения к коду клонов. Интересней всего было читать историю разработки оригинальных игр, ну и разбирать код клонов.

Развлечения ради я портировал код клона Pong с Python/Pygame (300-400 строк) на чистый C/SDL (600 строк) и, надо сказать, удовольствие получил.

Книгу можно рекомендовать, например, начинающим программистам (студентам или школьникам) в качестве ознакомления с стройством простейших игр. Но и просто любителям может быть приятно быстро собрать игрушку из предоставленных материалов.

Книга: Multiplayer Game Programming: Architecting Networked Games (2015)

nil

Перед новым годом я неожиданно для себя самого закончил все личные микропроектики и дочитал последнюю из запланированных на уходящий год книг, и руки дошли до Multiplayer Game Programming за авторством Джошуа Глейзера и Санджая Мархава (англ. Joshua Glazer и Sanjay Madhav).

Заходят авторы издалека, начиная с устройства сетей в целом, потом - стека TCP/IP, в результате представляя код оберток вокруг интерфейсов TCP- и UDP-сокетов.

После сетей объясняются центральные задачи движков многопользовательских игр: синхронизация состояния игрового мира, и следующие из нее топология сетей (p2p или клиент-серверная архитектура) сериализация объектов, преодоление задержек и так далее. По ходу дела разрабатываемая библиотека начинает использоваться в коде демонстрационных игр.

Сам для себя из книги я вынес два основных архитектурных решения для синхронизации состояния мира: распространение команд и распространение положения игровых сущностей.

  1. В распространении команд состояние синхронизируется передачей на все машины команд игроков, после чего каждая машина проигрывает результаты выполнения команд у себя. Подход этот используется обычно в стратегиях в реальном времени (real-time strategies), когда юнитов слишком много, чтобы можно было синхронизировать все их перемещения.
  2. Если юнитов немного, и каждому соответствует единственный игрок, то проще состояние распространять в сети для каждого из активных юнитов-игроков. Подход популяризован играми компании idSoftware и до сих считается стандартом для шутеров от первого лица.

Баланс теории и практики, как мне кажется, соблюдается; пускай финальные главы, обсуждающие большие фреймворки, играют роль наполнителя.

Резюме: материал качественный, примеры рабочие, преподавательский опыт авторов чувствуется, и для для начинающих игроделов книга вполне подходит. Каждая глава, что достойно как минимум поощрения, сопровождается ссылками на источники и дополнительные материалы, в том числе статьи, книги или даже код.

Впрочем, лично мне было скучновато в очередной раз читать про сокеты и сети, тем более что по-настоящему тема здесь не раскрывается; но любопытно было ознакомиться с типовыми подходами в играх.

Книга: Fractal Programming in C (1989)

Несколько месяцев назад я прочитал знаменитую The Go Programming Language, в которой отдельные возможности языка Go демонстрировались на примере вычисления фракталов. В отличие от (в хорошем смысле) скучноватого Go тема фракталов меня зацепила. В результате нашлась на Амазоне случайная книгу о программировании фракталов на языке C (Fractal Programming in C) 1989-го года и прочиталась за 2-3 недели.

Книга оказалась строго прикладной, автор не вдается в математику и делает акцент именно на предельно быстром получении классических фракталоподобных структур: множество Мандельброта, треугольника Серпинского, кривых Пеано…

Код в книге старомодный и не без ошибок, но все пределах разумного: модернизация каждого из примеров заняла не больше 30-60 минут, плюс написал простенькую библиотечку для формирования файлов Netpbm.

Результаты экспериментов выложил на Github, если будет время и желание - еще чего туда из фракталов добавлю.

Статья: The Rules for Data Processing Pipeline Builders

Опубликовал в корпоративном блоге на Хабре статью про то, как надо структурировать конвееры для обработки данных. Текст, написанный под руководством корпоративным тренером по техписательство, вышел чрезмерно упрощенный и выхолощенным, поэтому читать стоит только если совсем уж нечего делать.

Книга: Effective C: An Introduction to Professional C Programming

nil

Сменилось уже несколько поколений языков, стремившихся заменить собой C: появился, завоевал популярность и стал ее терять C++; корпоративная разработка ушла на сторону Java и C#; Go захватил умы поколения микросервисов; D, Rust, Zig и прочие прицелились на низкоуровневую разработку.

Тем не менее, C жив. И в последнюю пару лет случился своего рода Ренессанс, когда одна за другой вышли интересные книги продвинутого уровня от известных специалистов.

В частности, я особенно ждал выхода книги Effective C за авторством Роберта Сикорда (англ. Robert C. Seacord), активного участника языкового Комитета, автора стандарта по безопасному программированию на C/С++ (CERT C Coding Standard) и пользователя Emacs.

И книга не подвела!

Быстро бросается в глаза, насколько автор бережно обращается с терминологией. Например, никогда не путаются неопределенное (undefined), неуказанное (unspecified) и специфичное для реализаций (implementation-specific) или локалей (locale-specific) поведения. Для всех фундаментальных определений приводятся ссылки на стандарт или разъясняющие статьи.

Обсуждаются сложные, неочевидные или новые особенности языка:

  • выравнивание по памяти (ключевое слово _Alignas),
  • повышение целочисленных значений (integer promotion),
  • явные и неявные преобразования,
  • порядок вычисления выражений,
  • гибкие члены массивов (flexible array members),
  • массивы изменяемой длины (variable-length arrays),
  • катастрофа с кодированием Unicode (особенно wchart),
  • популярные приемы работы с макросами,
  • и т.д., и т.п.

По каждой из тем автор приводит практичные примеры и упоминает типичные программистские ошибки. Язык изложения и точный, и читаемый, что редко не встречается в текстах языковых бюрократов (прости, Комитет).

Кому-то может не понравиться, что в книги почти нет упражнений. Лично мне они и не были нужны, все же большую часть вопросы уже разбирал, кому-то практики будет не хватать.

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

Электронная читалка мечты

Onyx Boox Note 2

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

У меня уже был похожий агрегат - Amazon Paperwhite. Но в свое время быстро выяснилось, что на семи дюймах крайне неудобно читать техническую литературу и научные публикации, да и работа с неродными форматами у амазоновского аппарата, прямо скажем, ограниченная.

И вот год-два назад стали появляться альтернативные читалки на электронных чернилах с большой диагональю экрана: Sony, Remarkable, разные модели от Onyx Boox и других китайских производителей. Помимо, собственно, отображения документов они позволяют оставлять стилусом на документах заметки.

Последнее поколение читалок от Onyx так вообще включает в себя модели с диагональю до 13 дюймов, то есть размером с лист формата А4. Посомневавшись и поломавшись немного я все же купил недешевый Onyx Boox Note 2.

И не разочаровался! Писать на документах действительно можно, читать их же на большом экране удобно, батарея живет неделями, глаза не устают. Нирвана!

Книга: The Go Programming Language

Закончил, наконец, чтение и решение заданий из книги The Go Programming Language и, соответственно, с языком программирования Go.

Название и один из авторов - тот самый Брайан Керниган - очевидным образом отсылают к главной книге по языку С (The C Programming Language).

Первая глава быстро знакомит с Go; последущие 9 глав излагают все аспекты языка уже подробно; финальные же несколько глав показывают, как пользоваться сопутствующими инструментами . Узнается фирменный стиль Кернигана - лаконичный и точный; примеры кода немного синтетические, но суть языка отражают точно.

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

Что же до самого Golang... скучный, простой и предсказуемый. Его создатели много думали над тем, что не включать в язык. И список тех вещей, что добавлены не были, определенно не может устроить всех. Но лично мне простота Go симпатична. Да и горутины - штука очень и очень удобная, ни в какое сравнение не идущая с кашей, с которой приходится работать во множестве других языков.

На первый взгляд Go хорошо подходит для сетевого программирования, создания распределенных приложений и околосистемной разработки. Скажем, на роль Java в каком-нибудь Hadoop, или Python при написании небольших серверов, или Php, или...