Just code IT

@justcodeit_channel


Верим в everything-as-code. Обсуждаем, как писать чище, ревьюить объективнее, деплоить быстрее.

Just code IT

01 Aug, 15:23


3D ландшафт в 256 байт

Существуют разные виды intro — небольших динамических сцен, генерируемых программно в реальном времени. Мы уже писали про классику жанра, intro размером в 64 килобайта; но существуют и более компактные варианты — например, с исполняемым файлом, размер которого не превышает 512 или даже 256 байт.

Казалось бы, что можно уместить в 256 байт? Но авторы 256b intro умудряются упаковать в них достаточно нетривиальный видеоряд. Например, на демопати Revision 2024 в номинации 256b intro победила команда ALCATRAZ с их шедевром Remnants. Программа запускается в DOS и написана на языке ассемблера. Разобраться в тонкостях реализации реймаршера, что создает столь реалистичную для такого небольшого бинарника картинку, можно, скачав исходный код программы, любезно предоставленный авторами.

#digest

Just code IT

17 Jul, 16:14


Практическое погружение в метакомпиляторы

Практически у каждого из наших читателей с образованием в ИТ был курс теории трансляции или компиляторов. Помните, как в рамках этого курса у доски расписывали порождение строк формальными грамматиками, заданными в EBNF? Как изучали нисходящий и восходящий разборы, упражнялись с генераторами парсеров вроде YACC (BISON)?

Казалось очень необычным, что программа по описанию грамматики может породить достаточно сложный парсер и даже примитивный транслятор входного языка. Удивительно, но идеям метакомпиляторов, т.е. программ, которые создают по формальному описанию компиляторы, уже много лет. Например, метакомпилятор META II был описан в 1964 году, только представьте, как давно это было, и какими были тогда компьютеры!

Еще более удивительно, что META II или его ближайшие потомки могут быть полезны нам и сегодня — например, для прототипирования или быстрой разработки предметно-ориентированных языков. В статье «Tutorial: Metacompilers Part 1» можно в интерактивной форме познакомиться с META II и его внутренним устройством. К концу прочтения материала читатель разработает компилятор META II с расширениями на нём самом.

Несмотря на свою простоту, эта компактная система — чудо инженерной мысли. Код метакомпилятора, записанный на специализированном низкоуровневом языке, невероятно компактен и переносим между системами, но позволяет строить довольно нетривиальные трансляторы за минуты!

Идеи META, конечно, никуда не пропали. Например, они живы в OMeta, современном объектно-ориентированном метакомпиляторе.

#digest

Just code IT

03 Jul, 16:58


Как создаются 64 intro

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

Разработать хорошую demo, достойную презентации на demoparty, непросто. Но куда более интересно уместить такую нетривиальную программу в ограниченный по объему бинарник — например, в 64 или даже 4 килобайта.

Шедевральных примеров таких 64k и 4k intro существует немало, и хорошо, что их авторы пробуют делиться тем, как они добиваются таких удивительных результатов.

Занимательна статья о создании 64k intro с названием Guberniya, которая была презентована на demoparty Revision 2017. Авторы делятся, как выглядел процесс разработки этого чуда, занявший примерно 4 месяца.

Вообще, информации именно по демомейкингу в сети не слишком много, плюс она сильно разрознена, приходится искать по крупицам. А по относительно небольшим форматам, таким как 64k intro, информации вообще почти нет. Но для наших читателей мы нашли ссылку на довольно интересный ресурс, где собрана информация как раз о разработке таких компактных произведений компьютерного искусства.

Время творить, особенно учитывая скорую демопати, проходящую в Санкт-Петербурге! 🙂

#digest

Just code IT

14 Jun, 16:48


Создание программы 3D моделирования за неделю

Недавно обнаружили на просторах сети занимательную статью одного из постоянных резидентов Handmade Network Дэниэла Хупера (Daniel Hooper). Дэниэл решил разработать минималистичный 3D-редактор, в котором можно было бы создавать достаточно нетривиальные объекты.

Дэниэл потратил примерно одну неделю, а редактор получился действительно компактным. Основной функционал удалось утрамбовать в 2024 строки на языке C и 250 строк шейдерного кода на GLSL. Программа использует минималистичную raylib для создания окна с рабочим OpenGL контекстом.

Текст сопровождается видеороликами с объяснениями по отдельным темам, а весь код выложен на GitHub.

#literature

Just code IT

28 May, 16:48


VPN, созданный по принципам Secure-by-design

Много кто пишет про подход SbD (Secure-by-design), но в традиционном мире Unix встречается не так много программ, следующих базовым принципам этого подхода.

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

#digest

Just code IT

24 Apr, 16:48


Наследие Никлауса Вирта

Как известно, 1 января 2024 года не стало Никлауса Вирта (Niklaus Wirth), ученого из Швейцарии, лауреата премии Тьюринга, известного большинству благодаря своему детищу — языку программирования Pascal.

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

Первая книга называется “Algorithms and Data Structures” и является неплохим введением в предмет «Алгоритмы и структуры данных». В книге разобраны алгоритмы сортировки, рекурсия, списки, бинарные деревья поиска, B-деревья и хеширование. Книга хорошо иллюстрирована. Примеры программ приведены на языке Oberon, разработанном Никлаусом Виртом. Этот язык будет понятен большинству студентов, знакомых хотя бы с одним императивным языком программирования.

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

Авторству Вирта принадлежит и одна из наиболее часто рекомендуемых вводных книг по конструированию компиляторов — “Compiler Construction” (часть 1, часть 2). Книга повествует о разработке простого компилятора для подмножества Oberon, которое транслируется в код минималистичного RISC-процессора, реализация эмулятора которого занимает всего страницу печатного текста! Иллюстрации и упражнения значительно упрощают погружение в тему.

Вообще, школа Вирта — отдельный маленький мир со своими языками программирования, операционными системами и даже аппаратными архитектурами. Да, в ETHZ (Швейцарская высшая техническая школа в Цюрихе) создали много самобытных технологий, и Никлаус повлиял на многие из них, выступая автором и вдохновителем большинства проектов. Существует книга, описывающая внутреннее устройство Oberon-технологий, от ОС до железа. Самая свежая книга была многократно упрощена Виртом для обучения студентов. Чтобы сохранить это наследие, энтузиасты перенабрали текст книги в TeX, что позволит исправлять в ней ошибки, а также генерировать удобочитаемые документы — например, в PDF. Даже если вы не планируете разбираться в довольно ограниченной по возможностям учебной системе, чтение этой книги может навести на интересные мысли, а также мотивировать читателя разрабатывать минималистичное программное обеспечение, экономно использующее ресурсы машины.

К виртовской школе можно отнести и другие публикации, например книгу Ханспетера (Hanspeter Mössenböck) Мёссенбока “Object Oriented Programming in Oberon-2”. Эта книга не о языке, а о парадигме программирования. Сам автор пишет, что язык не важен, и все то же самое можно написать на любом другом, если хорошо понять базовые концепции. Книга учит мыслить в ООП-парадигме и проектировать модульное и легко поддерживаемое программное обеспечение. В книге много реалистичных рабочих примеров условно полезных систем, притом, что объем книги весьма небольшой.

#literature

Just code IT

11 Apr, 12:43


«Моим основным страхом было непонимание, в каком сервисе мою ошибку простят, а в каком будет все печально. И в итоге — боязнь что-либо случайно сломать.»

Интересный пост, способный вернуть вас в детство на N лет назад, в самое начало вашей карьеры. В нем — о первых страхах тех, кто когда-то был стажером, а теперь либо специалист, либо тимлид, либо руководитель целой функции.

Если рядом с вами есть стажер или студент, обязательно покажите ему эту статью: помогите с пониманием, что страх — это нормально, и он не один.

#literature

Just code IT

21 Mar, 13:49


Literate Style Unix

Вероятно, некоторые читатели слышали про так называемое «Грамотное программирование» (Literate programming), активно пропагандируемое Дональдом Кнутом. Смысл этого подхода в том, что программа не пишется линейно, как мы привыкли, а создается в порядке размышлений автора. При этом код перемежается с прозой, объясняющей, как этот код работает. Это не то же самое, что хорошо прокомментированный код, ведь «грамотная» программа может использовать довольно высокие уровни абстракции за счет использования механизмов подстановки и сбора кода из отдельных кусочков, раскиданных по всему документу.

Не так много известных программ написаны в этом стиле. Самая знаменитая из них — издательская система TeX, которая используется при верстке большинства научных статей в рецензируемых журналах. Эта система была создана самим Кнутом с использованием WEB — системы программирования на основе языке Pascal, конструкции которого встраиваются в TeX-документ. Тулинг WEB позволяет преобразовать исходный документ в формат, пригодный для печати, и в исходник, который можно скомпилировать в исполняемый файл. Таким образом, это сразу и программа, и книга про устройство программы.

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

Только представьте, если бы большинство современных open source программ писались в таком стиле! Идеальная документация всегда под рукой 🙂

#digest

Just code IT

05 Mar, 16:24


Минималистичная библиотека с абстракцией «фреймбуфера»

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

Существует множество библиотек, позволяющих сделать что-то подобное, и наиболее популярная среди них — SDL 2 (Simple DirectMedia Layer). Эта библиотека очень неплоха, но для многих задач она может показаться слишком универсальной и довольно тяжелой.

На выручку может прийти ультракомпактная библиотека TIGR (Tiny GRaphics Library), предоставляющая примитивы для рисования, вывода текста и обработки ввода. Программы, разработанные с использованием этой библиотеки, можно запускать на Windows, MacOS, Linux, iOS и Android — очень неплохой список доступных платформ.

На наш взгляд, библиотека хорошо подойдет для любительского инди-геймдева, например для прохождения game jams на itch.io.

#digest

Just code IT

21 Feb, 05:20


Учебный компилятор подмножества Cи с оптимизациями

В полку небольших компиляторов языка Cи, пригодных для обучения, прибыло. Встречайте shecc. В отличие от других миниатюрных учебных компиляторов, shecc использует промежуточное представление на основе SSA, умеет выполнять регистровую аллокацию, поддерживает сразу два бекенда для популярных платформ (ARMv7-A и RV32IM), выполняет peephole-оптимизации, а также легко бутстрапится при наличии в системе стандартного компилятора Cи.

Подмножество языка, поддерживаемое компилятором, позволяет писать серьезные программы. Работают даже некоторые конструкции препроцессора! Самое время поковыряться и добавить поддержку x86, не так ли?

#digest

Just code IT

08 Feb, 16:33


Baremetal игра на C#

Играми, разработанными на C#, сегодня никого не удивить: этот язык очень популярен в геймдеве, и доступен для большинства популярных игровых движков. А можно ли на C# написать операционную систему или программу, которая запускается вовсе без операционной системы?

Благодаря возможности ahead of time компиляции в нативный код, что не так давно существует в .NET, стало возможным писать C# код, выполняющийся без рантайма или с его минимальной заменой.
Михал Стреховский (Michal Strehovsky), инженер из команды рантайма .NET, разработал интересный пример, демонстрирующий прототип игры, основанной на рейкастере и загружаемый без операционной системы. Игра написана на C# и компилируется в бинарник без рантайма, который может быть запущен на любом современной x86-совместимом компьютере с UEFI boot.

У автора также есть реализация аналогичной игры на C# без внешних зависимостей, которая работает в Windows и занимает меньше 2 килобайт.

Если хотите попробовать любительский osdev, а выбор C или Rust покажется заурядным, — почему не обратить внимание на C#?

#fun

Just code IT

24 Jan, 16:37


Самый маленький PNG в мире

Мы, авторы канала, работаем с кодом системного уровня, и нам периодически приходится ковыряться с hex-дампами в поисках той или иной проблемы. Большинству из нас это ещё и нравится 🙂

Нашим читателям сегодня предлагаем погрузиться в побайтовый разбор однопиксельной картинки в формате PNG, длиной всего 67 байт.

#literature

Just code IT

11 Jan, 16:39


Бесплатные книги и статьи по безопасной разработке

В рейтинге TIOBE небезопасные языки программирования C и C++ традиционно занимают вторую и третью позиции, уступая только Python.

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

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

Продолжение 👉 по ссылке 

#digest

Just code IT

27 Dec, 16:57


Маленькие Unix-системы

Еще недавно мы писали про Tilck, учебное ядро ОС, частично совместимое с Linux, а также вспоминали про xv6, столь хорошо известную в кругах хоббийного osdev. А теперь решили порекомендовать еще парочку минималистичных Unix-систем, которые способны запускать под собой вполне взрослое программное обеспечение, например bash, gcc и make.

Fiwix — небольшая учебная POSIX-совместимая система для i386. Да, она не поддерживает SMP, ее ядро невытесняемо, да и устроено оно довольно примитивно. Тем не менее, эта маленькая система может запускать вполне привычное для нас GNU-окружение, более того, она частично совместима с ABI старых версий Linux.

Sortix — еще один интересный проект self-hosted операционной системы. Эта Unix-подобная ОС позволяет запускать под собой довольно много GNU-программ, например binutils, gcc, nasm, python, bison, и многие другие. В первую очередь автор фокусируется именно на возможности разрабатывать и собирать Sortix на нем же самом. Другие фичи, например поддержку сети или SMP, откладываются на более поздние релизы.

А знаете ли вы какие-нибудь Unix-системы с компактной и обозримой реализацией?

#digest

Just code IT

18 Dec, 16:43


Бесплатные книги по архитектуре программных систем

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

В первую очередь, это два тома книги «The Architecture of Open Source Applications», где описываются красивые архитектурные решения, найденные в известном открытом ПО, например в LLVM, Sendmail, PyPy, Git и других.

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

Отличное дополнение к уже названным книгам — брошюра «500 Lines or Less», демонстрирующая компактные реализации решений для нетривиальных задач: создание MVP программы трехмерного моделирования, объектной модели, табличного редактора, или интерпретатора байт-кода Python.

#literature

Just code IT

13 Dec, 08:54


Кажется, вы больше не должны давать тестовые задания кандидатам на дом

Наткнулись на интересную статью, где через призму AI рассматриваются тестовые задания, которые компании нынче дают кандидатам.

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

#digest

Just code IT

07 Dec, 11:42


Исходный код Elite с комментариями

Elite — известная серия космических симуляторов с открытым миром, которая зародилась в далеких 80-х. Творение Дэвида Брэбена и Яна Белла стало мегапопулярным, поскольку в те годы игра позволяла путешествовать по трехмерному, хотя и довольно примитивному, случайно сгенерированному миру, сражаться с космическими пиратами, торговать, пристыковываться к заправочным станциям, апгрейдить корабль на заработанные кредиты. И все это на домашних восьмибитных компьютерах вроде BBC Micro!

Была реализация Elite и для Nintendo Entertainment System, известной в СНГ в основном благодаря китайским клонам этой приставки. Мы не встречали ее на китайских пиратских картриджах, но у обеспеченных обладателей настоящей Nintendo такую игру можно было встретить.

Как же разработчики уместили столь продвинутые игровые механики в программе для такой примитивной игровой системы?
Естественно, чтение исходников столь продвинутого проекта может натолкнуть на интересные мысли, научить оптимизировать код, выжимать из примитивного железа все возможное. И сегодня это возможно, конечно, если вы не боитесь ассемблера MOS 6502.

Исходный код, выложенный на Github, прокомментирован невероятно подробно — уверены, что опытному программисту будет легко справиться с чтением, даже если вы плохо знакомы с архитектурой NES. А туториал для освоения ассемблера 6502 мы уже рекомендовали ранее.

Приятного погружения!

#digest

Just code IT

23 Nov, 09:12


Еще один lowtech шифр

Мы уже описывали один занятный криптографический алгоритм, который можно применять без использования компьютера, он назывался ElsieFour(LC4). Напомним, что относительно других «ручных» шифров, этот предоставлял довольно серьезные гарантии.

Сегодня мы хотели бы упомянуть другой практичный ручной потоковый шифр, который использует колоду карт — Solitaire cypher. Если следовать некоторым ограничениям на переиспользование ключей и длину сообщений, то можно добиться вполне приличных гарантий и от столь простой lowtech системы шифрования.

#digest

Just code IT

17 Nov, 10:14


Microsoft Open Source and Rust

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

С недавних пор компания также активно вкладывается в развитие Rust на своей платформе, так как хорошо понимает выгоды от перевода своих системных компонентов на memory- и type-safe язык.

Ну а совсем недавно Microsoft анонсировала следующий шаг — публикацию инструментария для разработки драйверов Windows на Rust. Теперь WDM/WDF-интерфейсы, привычные для системного разработчика, доступны хоть и в ржавом, но безопасном и современном языке! 🙂

#digest

Just code IT

02 Nov, 16:29


Низкоуровневый бутстрап языков программирования

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

Но как быть с доверием к компилятору? Кен Томпсон в статье "Reflections on Trusting Trust" упоминал, что компилятор, которому мы доверяем, может быть "зараженным" и продуцировать зараженный код. Есть ли способ получить доверенный компилятор сразу?

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

Примерно так устроен проект Картика Агарама (Kartik Agaram) Mu. В рамках этого проекта автор разработал несколько языков программирования, каждый из которых может исполняться на платформе x86 и собирать компилятор языка более высокого уровня, пока не получится компилятор ЯВУ наподобие C.

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

Не менее интересны и проекты, пытающиеся создать минимальный интерпретатор языка Forth.

StoneKnifeForth представляет собой примитивный Forth, все слова которого записываются одним ASCII символом. Компилятор для такого языка написать несложно даже без ассемблера под рукой. Для упрощения бутстрапа автор использует примитивный интерпретатор, разработанный на языке Python. Первая рабочая копия компилятора, полученная благодаря бутстрапу, уже является исполняемым файлом ELF и позволяет расширять набор конструкций языка привычными словами Forth.

Не менее интересен проект PlanckForth, реализацию которого скрупулезно написали в машинных кодах (уж точно никто кроме авторов не оставит закладки). Файл с HEX-дампом достаточно пропустить через утилиту xxd и на выходе получится исполняемый файл компилятора минималистичного Forth. Этот примитивный язык может быть расширен уже своими внутренними средствами до приемлемого уровня, позволяющего написать что-то более сложное.

#digest