Код
#статьи

Зачем писать на ассемблере 27 лет подряд: личный опыт

Разработчик-любитель и участник демосцены Евгений Красников — о том, чем хорош ассемблер, нужно ли его учить в вузах и где узнать о нём больше.

Кадр: фильм «Игра в имитацию»

Евгений Красников


С детства кодит на ассемблере и Pascal, пишет на C/C++, Delphi, Python, PHP, иногда на других языках. Увлекается демосценой, изредка публикует статьи на «Хабре», сделал подборку инструментов и литературы о низкоуровневом программировании.


Ссылки


Я начал программировать в девять лет — сперва на BASIC, а потом на Pascal. Со временем я разобрался в компьютерах лучше учительницы информатики, и она разрешила мне не ходить на её уроки.

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

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

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

После учёбы я не пробовал устроиться программистом — боялся, что и так чересчур много сижу за компьютером, а с такой работой вообще перестану бывать на улице, и всю жизнь буду писать скучный код. Жаль, тогда я не понимал, что в IT есть много вариантов карьеры.

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

Когда мне разонравилось строительство, я решил уйти в организацию праздников — помогло, что я завершил театральные курсы и занимался вокалом. Я подрабатывал аниматором, был Дедом Морозом и там же познакомился с будущей женой. Уже вместе мы вели детские праздники, реже — свадьбы.

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

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

Чем ассемблер бывает лучше десятков других языков

За всю жизнь я пробовал разные языки, в том числе и эзотерические. Кроме ассемблера я знаю Pascal и Delphi, пишу на С++, но не могу сказать, что выучил его на отлично — этот язык сложно освоить идеально. На среднем уровне разбираюсь в Python и PHP, могу кодить на JavaScript, немного владею Ruby. Писал на Visual Basic, в том числе на VBA для Excel.

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

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

Загрузчик для DOS. Во времена DOS иногда приходилось загружать компьютер с дискеты, чтобы не запускать основную систему с жёсткого диска. Для этого я заходил в BIOS и менял приоритет устройств для загрузки. Сейчас это делается при старте системы, но тогда такой функции не было. Захотел запуститься с дискеты — перезагрузил компьютер, зашёл в BIOS, поменял устройство, снова перезагрузил. Хочешь запуститься с жёсткого диска — повторяй всё заново.

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

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

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

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

Локатор — одна из моих первых демок на ассемблере, которая уместилась в 64 байта. Исходный код есть на GitHub

Ещё ассемблер помогает что-нибудь изучить — например, я могу залезть во внутренности Windows и достать оттуда нужные параметры. С этим справится и язык С, но ассемблер бывает удобнее и интереснее.

Почему свой ассемблер лучше писать на C++

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

В своём ассемблере я бы устранил недостатки и собрал все преимущества популярных сейчас FASM (flat assembler), NASM (Netwide Assembler) и MASM (Microsoft Macro Assembler). Конечно, я добавил бы в язык и кое-что от себя — в ассемблере несложно расширить синтаксис.

Но я бы не стал писать всё на старом ассемблере — это трудоёмкая задача, да и код потом придётся поддерживать. На ассемблере бессмысленно разрабатывать крупные проекты, потому что код нельзя сделать кросс-платформенным — он не будет одновременно работать на Linux и Windows, на 32- и 64-битной системе и на другом железе. На ассемблере для всех этих случаев придётся делать отдельную версию программы. А это серьёзное ограничение.

Конечно, можно расставить условные директивы компиляций и в зависимости от выбранной платформы компилировать только нужные участки кода. Но проще уж сделать версию программы под каждую платформу. Поэтому C++ в этом плане гораздо практичнее — код достаточно написать один раз, и он будет работать везде.

Зачем студенты до сих пор учат ассемблер

На ассемблере я часто делаю студенческие работы, и это помогает понять, чему современные вузы учат будущих программистов. Меня удивляет, что им до сих пор преподают DOS, и TASM (Turbo Assembler), который уже не развивается 25 лет (последняя версия TASM вышла в 1996 году).

Тем не менее TASM популярен, на нём пишут под DOS, и он очень похож на более актуальный сегодня MASM. Думаю, на первых курсах он помогает освоить историю программирования и понять, как развивались процессоры. Но на старших курсах точно нужно учить ассемблер под Windows и Linux, но такое в учебной программе бывает редко.

Уже 2022 год, но у меня в основном заказывают работы под DOS. Но от ребят из топовых вузов типа МФТИ или Бауманки приходят заказы поинтереснее — они там учат NASM, пишут программы для Linux и решают интересные и непростые задачи.

С чего начать осваивать ассемблер

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

Материалы по демосцене

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

Поскольку в сайзкодинге (sizecoding) каждый байт на счету, периодически в сообществах ведутся обсуждения о попытках сжатия кода. Например, для программ размером до 256 или 512 байт это большая проблема — сжать такой код весьма сложно, особенно учитывая то, что в программу при этом добавляется ещё и код распаковщика, который тоже занимает драгоценные байты. Для программ от четырёх килобайт есть уже готовые решения (например, Crinkler), а вот для совсем маленьких программ таких стандартных решений нет — да и отдельных реализаций крайне мало, плюс все они создаются индивидуально под каждую работу.

Мои демосценические работы можно посмотреть на сайте. Под каждую из них добавлено видео. Вот несколько самых интересных и залипательных (все они занимают не больше 256 байт!):

DEEP TRIP (256b intro)
Chaos Equations (256b intro by Jin X) — DOSBox hi-res (1024×768)
StarLine (256b intro)
Tower of Hanoi 3D (256b intro by Jin X)

А вот моя полноценная игрушка — «Змейка» размером в 64 байта:

Монстры демосцены (например, Rrrola) делают куда более выдающиеся вещи в 256 байтах:

puls
Pyrit
Sseraf (в этой работе автор применил сжатие кода)
Lightcrypt by Alcatraz
250 Byte Intro «gyere kislány, gyere! a diszkó klubban szól már a zene!» (сделано под процессор ARM)
Онлайн-школа для детей Skillbox Kids
Учим детей программированию, созданию игр, сайтов и дизайну. Первое занятие бесплатно! Подробности — по клику.
Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована