0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>15 мар 2022</li>
2
<ul><li>15 мар 2022</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Разработчик-любитель и участник демосцены Евгений Красников - о том, чем хорош ассемблер, нужно ли его учить в вузах и где узнать о нём больше.</p>
4
</ul><p>Разработчик-любитель и участник демосцены Евгений Красников - о том, чем хорош ассемблер, нужно ли его учить в вузах и где узнать о нём больше.</p>
5
<p>Кадр: фильм "Игра в имитацию"</p>
5
<p>Кадр: фильм "Игра в имитацию"</p>
6
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
6
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
7
<p>Я начал программировать в девять лет - сперва на BASIC, а потом на Pascal. Со временем я разобрался в компьютерах лучше учительницы информатики, и она разрешила мне не ходить на её уроки.</p>
7
<p>Я начал программировать в девять лет - сперва на BASIC, а потом на Pascal. Со временем я разобрался в компьютерах лучше учительницы информатики, и она разрешила мне не ходить на её уроки.</p>
8
<p>Уже в двенадцать я начал писать на языке ассемблера. У меня тогда не было интернета, поэтому я купил несколько самоучителей, пользовался электронными справочниками и тем, что находил в Фидонете.</p>
8
<p>Уже в двенадцать я начал писать на языке ассемблера. У меня тогда не было интернета, поэтому я купил несколько самоучителей, пользовался электронными справочниками и тем, что находил в Фидонете.</p>
9
<p>К девятому классу я уже знал, что буду поступать на программиста. Как раз тогда к нам в школу пришли люди из строительного университета - они сказали, что открывают трёхгодичные подготовительные курсы, после которых мы сможем поступить на факультет программирования. Вместе с парой одноклассников мы сдали тест на сообразительность, и нас приняли.</p>
9
<p>К девятому классу я уже знал, что буду поступать на программиста. Как раз тогда к нам в школу пришли люди из строительного университета - они сказали, что открывают трёхгодичные подготовительные курсы, после которых мы сможем поступить на факультет программирования. Вместе с парой одноклассников мы сдали тест на сообразительность, и нас приняли.</p>
10
<p>Я честно отучился на курсах и поступил в университет, но была проблема - оказалось, что на факультете "Информационные системы и технологии" дают только несколько предметов по программированию. И все они были больше связаны с наукой, чем с разработкой. Я даже собирался перевестись в другой вуз, но в итоге передумал и окончил магистратуру в 2004 году. Получилось, что поступал я на программиста, а выучился на инженера.</p>
10
<p>Я честно отучился на курсах и поступил в университет, но была проблема - оказалось, что на факультете "Информационные системы и технологии" дают только несколько предметов по программированию. И все они были больше связаны с наукой, чем с разработкой. Я даже собирался перевестись в другой вуз, но в итоге передумал и окончил магистратуру в 2004 году. Получилось, что поступал я на программиста, а выучился на инженера.</p>
11
<p>После учёбы я не пробовал устроиться программистом - боялся, что и так чересчур много сижу за компьютером, а с такой работой вообще перестану бывать на улице, и всю жизнь буду писать скучный код. Жаль, тогда я не понимал, что в IT есть много вариантов карьеры.</p>
11
<p>После учёбы я не пробовал устроиться программистом - боялся, что и так чересчур много сижу за компьютером, а с такой работой вообще перестану бывать на улице, и всю жизнь буду писать скучный код. Жаль, тогда я не понимал, что в IT есть много вариантов карьеры.</p>
12
<p>После университета я сразу устроился по специальности, но инженером пробыл недолго - на первой работе продержался полтора года, на второй - полгода, а потом не задерживался больше нескольких месяцев.</p>
12
<p>После университета я сразу устроился по специальности, но инженером пробыл недолго - на первой работе продержался полтора года, на второй - полгода, а потом не задерживался больше нескольких месяцев.</p>
13
<p>Когда мне разонравилось строительство, я решил уйти в организацию праздников - помогло, что я завершил театральные курсы и занимался вокалом. Я подрабатывал аниматором, был Дедом Морозом и там же познакомился с будущей женой. Уже вместе мы вели детские праздники, реже - свадьбы.</p>
13
<p>Когда мне разонравилось строительство, я решил уйти в организацию праздников - помогло, что я завершил театральные курсы и занимался вокалом. Я подрабатывал аниматором, был Дедом Морозом и там же познакомился с будущей женой. Уже вместе мы вели детские праздники, реже - свадьбы.</p>
14
<p>До 2013 года мы с женой работали по найму, а потом открыли своё агентство детских праздников. До пандемии этим и зарабатывали. Но детская тематика мне надоела, и с началом локдаунов я решил больше этим не заниматься.</p>
14
<p>До 2013 года мы с женой работали по найму, а потом открыли своё агентство детских праздников. До пандемии этим и зарабатывали. Но детская тематика мне надоела, и с началом локдаунов я решил больше этим не заниматься.</p>
15
<p>Последние пару лет я самозанятый - в основном пишу программы и курсовые по программированию на заказ. Иногда организую мероприятия, но только для старых клиентов. Я считаю, что зря не искал работу в IT после университета.</p>
15
<p>Последние пару лет я самозанятый - в основном пишу программы и курсовые по программированию на заказ. Иногда организую мероприятия, но только для старых клиентов. Я считаю, что зря не искал работу в IT после университета.</p>
16
<p>За всю жизнь я пробовал разные языки, в том числе и <a>эзотерические</a>. Кроме ассемблера я знаю Pascal и Delphi, пишу на С++, но не могу сказать, что выучил его на отлично - этот язык сложно освоить идеально. На среднем уровне разбираюсь в Python и PHP, могу кодить на JavaScript, немного владею Ruby. Писал на Visual Basic, в том числе на VBA для Excel.</p>
16
<p>За всю жизнь я пробовал разные языки, в том числе и <a>эзотерические</a>. Кроме ассемблера я знаю Pascal и Delphi, пишу на С++, но не могу сказать, что выучил его на отлично - этот язык сложно освоить идеально. На среднем уровне разбираюсь в Python и PHP, могу кодить на JavaScript, немного владею Ruby. Писал на Visual Basic, в том числе на VBA для Excel.</p>
17
<p>Как-то мне попалась задача из Telegram-канала<a>UniLecs</a>, и я ради интереса реализовал одинаковый алгоритм более чем на двадцати языках программирования. Это не значит, что я знал каждый из них: я просто нашёл документацию и быстро прикинул, как всё сделать.</p>
17
<p>Как-то мне попалась задача из Telegram-канала<a>UniLecs</a>, и я ради интереса реализовал одинаковый алгоритм более чем на двадцати языках программирования. Это не значит, что я знал каждый из них: я просто нашёл документацию и быстро прикинул, как всё сделать.</p>
18
<p>Но среди других языков ассемблер выделяется - я люблю его за безграничные возможности. На нём можно написать всё что угодно: от небольшой программки до операционной системы. Вот некоторые из моих кейсов:</p>
18
<p>Но среди других языков ассемблер выделяется - я люблю его за безграничные возможности. На нём можно написать всё что угодно: от небольшой программки до операционной системы. Вот некоторые из моих кейсов:</p>
19
<p><strong>Загрузчик для DOS.</strong>Во времена DOS иногда приходилось загружать компьютер с дискеты, чтобы не запускать основную систему с жёсткого диска. Для этого я заходил в BIOS и менял приоритет устройств для загрузки. Сейчас это делается при старте системы, но тогда такой функции не было. Захотел запуститься с дискеты - перезагрузил компьютер, зашёл в BIOS, поменял устройство, снова перезагрузил. Хочешь запуститься с жёсткого диска - повторяй всё заново.</p>
19
<p><strong>Загрузчик для DOS.</strong>Во времена DOS иногда приходилось загружать компьютер с дискеты, чтобы не запускать основную систему с жёсткого диска. Для этого я заходил в BIOS и менял приоритет устройств для загрузки. Сейчас это делается при старте системы, но тогда такой функции не было. Захотел запуститься с дискеты - перезагрузил компьютер, зашёл в BIOS, поменял устройство, снова перезагрузил. Хочешь запуститься с жёсткого диска - повторяй всё заново.</p>
20
<p>Моя программа работала просто - если при включении компьютера ты нажимаешь Ctrl, система грузится с дискеты. Если нет - с жёсткого диска. Моя программа загружалась раньше операционной системы, поэтому позволяла проделывать такое. На высокоуровневом языке без использования ассемблера такое написать получилось бы вряд ли.</p>
20
<p>Моя программа работала просто - если при включении компьютера ты нажимаешь Ctrl, система грузится с дискеты. Если нет - с жёсткого диска. Моя программа загружалась раньше операционной системы, поэтому позволяла проделывать такое. На высокоуровневом языке без использования ассемблера такое написать получилось бы вряд ли.</p>
21
<p><strong>Приколы (а-ля "вирусы").</strong>Мне было интересно изучать низкоуровневое программирование и вирусы, поэтому в старших классах я ставил эксперименты на компьютере друга - заражал его машину "трояном", который выводил текст или создавал эффект, например, будто изображение на экране трясётся. Это было весело.</p>
21
<p><strong>Приколы (а-ля "вирусы").</strong>Мне было интересно изучать низкоуровневое программирование и вирусы, поэтому в старших классах я ставил эксперименты на компьютере друга - заражал его машину "трояном", который выводил текст или создавал эффект, например, будто изображение на экране трясётся. Это было весело.</p>
22
<p><strong>Небольшие программы.</strong>На ассемблере можно сделать то, что на других языках сложно реализовать. Вспомним DOS, в котором не предусмотрена многозадачность, но есть резидентные программы, которые запускаются параллельно с основным процессом. Можно включать эффект падающего снега, назначать определённую клавишу и запускать по её нажатии нужную программу, добавить в угол экрана часы или изменить работу стандартной функции системы.</p>
22
<p><strong>Небольшие программы.</strong>На ассемблере можно сделать то, что на других языках сложно реализовать. Вспомним DOS, в котором не предусмотрена многозадачность, но есть резидентные программы, которые запускаются параллельно с основным процессом. Можно включать эффект падающего снега, назначать определённую клавишу и запускать по её нажатии нужную программу, добавить в угол экрана часы или изменить работу стандартной функции системы.</p>
23
<p><strong>Демосцена.</strong>Впервые я узнал про демосцену ещё в школе, но увлёкся ею только четыре года назад. Я занимаюсь этим, когда есть свободное время и желание. Демосцена больше похожа на спортивное программирование, потому что приходится умещать интересные эффекты в файл размером от нескольких байт до нескольких килобайт.</p>
23
<p><strong>Демосцена.</strong>Впервые я узнал про демосцену ещё в школе, но увлёкся ею только четыре года назад. Я занимаюсь этим, когда есть свободное время и желание. Демосцена больше похожа на спортивное программирование, потому что приходится умещать интересные эффекты в файл размером от нескольких байт до нескольких килобайт.</p>
24
Локатор - одна из моих первых демок на ассемблере, которая уместилась в 64 байта. Исходный код есть на <a>GitHub</a><p>Ещё ассемблер помогает что-нибудь изучить - например, я могу залезть во внутренности Windows и достать оттуда нужные параметры. С этим справится и язык С, но ассемблер бывает удобнее и интереснее.</p>
24
Локатор - одна из моих первых демок на ассемблере, которая уместилась в 64 байта. Исходный код есть на <a>GitHub</a><p>Ещё ассемблер помогает что-нибудь изучить - например, я могу залезть во внутренности Windows и достать оттуда нужные параметры. С этим справится и язык С, но ассемблер бывает удобнее и интереснее.</p>
25
<p>У меня много идей - например, написать операционную систему на ассемблере (для специфических целей и ради интереса) или даже сделать свою версию языка. Это было бы интересно, хоть и трудозатратно.</p>
25
<p>У меня много идей - например, написать операционную систему на ассемблере (для специфических целей и ради интереса) или даже сделать свою версию языка. Это было бы интересно, хоть и трудозатратно.</p>
26
<p>В своём ассемблере я бы устранил недостатки и собрал все преимущества популярных сейчас<a>FASM</a>(flat assembler),<a>NASM</a>(Netwide Assembler) и <a>MASM</a>(Microsoft Macro Assembler). Конечно, я добавил бы в язык и кое-что от себя - в ассемблере несложно расширить синтаксис.</p>
26
<p>В своём ассемблере я бы устранил недостатки и собрал все преимущества популярных сейчас<a>FASM</a>(flat assembler),<a>NASM</a>(Netwide Assembler) и <a>MASM</a>(Microsoft Macro Assembler). Конечно, я добавил бы в язык и кое-что от себя - в ассемблере несложно расширить синтаксис.</p>
27
<p>Но я бы не стал писать всё на старом ассемблере - это трудоёмкая задача, да и код потом придётся поддерживать. На ассемблере бессмысленно разрабатывать крупные проекты, потому что код нельзя сделать кросс-платформенным - он не будет одновременно работать на Linux и Windows, на 32- и 64-битной системе и на другом железе. На ассемблере для всех этих случаев придётся делать отдельную версию программы. А это серьёзное ограничение.</p>
27
<p>Но я бы не стал писать всё на старом ассемблере - это трудоёмкая задача, да и код потом придётся поддерживать. На ассемблере бессмысленно разрабатывать крупные проекты, потому что код нельзя сделать кросс-платформенным - он не будет одновременно работать на Linux и Windows, на 32- и 64-битной системе и на другом железе. На ассемблере для всех этих случаев придётся делать отдельную версию программы. А это серьёзное ограничение.</p>
28
<p>Конечно, можно расставить условные директивы компиляций и в зависимости от выбранной платформы компилировать только нужные участки кода. Но проще уж сделать версию программы под каждую платформу. Поэтому C++ в этом плане гораздо практичнее - код достаточно написать один раз, и он будет работать везде.</p>
28
<p>Конечно, можно расставить условные директивы компиляций и в зависимости от выбранной платформы компилировать только нужные участки кода. Но проще уж сделать версию программы под каждую платформу. Поэтому C++ в этом плане гораздо практичнее - код достаточно написать один раз, и он будет работать везде.</p>
29
<p>На ассемблере я часто делаю студенческие работы, и это помогает понять, чему современные вузы учат будущих программистов. Меня удивляет, что им до сих пор преподают DOS, и <a>TASM</a>(Turbo Assembler), который уже не развивается 25 лет (последняя версия TASM вышла в 1996 году).</p>
29
<p>На ассемблере я часто делаю студенческие работы, и это помогает понять, чему современные вузы учат будущих программистов. Меня удивляет, что им до сих пор преподают DOS, и <a>TASM</a>(Turbo Assembler), который уже не развивается 25 лет (последняя версия TASM вышла в 1996 году).</p>
30
<p>Тем не менее TASM популярен, на нём пишут под DOS, и он очень похож на более актуальный сегодня MASM. Думаю, на первых курсах он помогает освоить историю программирования и понять, как развивались процессоры. Но на старших курсах точно нужно учить ассемблер под Windows и Linux, но такое в учебной программе бывает редко.</p>
30
<p>Тем не менее TASM популярен, на нём пишут под DOS, и он очень похож на более актуальный сегодня MASM. Думаю, на первых курсах он помогает освоить историю программирования и понять, как развивались процессоры. Но на старших курсах точно нужно учить ассемблер под Windows и Linux, но такое в учебной программе бывает редко.</p>
31
<p>Уже 2022 год, но у меня в основном заказывают работы под DOS. Но от ребят из топовых вузов типа МФТИ или Бауманки приходят заказы поинтереснее - они там учат NASM, пишут программы для Linux и решают интересные и непростые задачи.</p>
31
<p>Уже 2022 год, но у меня в основном заказывают работы под DOS. Но от ребят из топовых вузов типа МФТИ или Бауманки приходят заказы поинтереснее - они там учат NASM, пишут программы для Linux и решают интересные и непростые задачи.</p>
32
<p>В последние несколько лет я иногда публикую материалы про ассемблер, в том числе и подборки с книгами и инструментами для начинающих и опытных разработчиков:</p>
32
<p>В последние несколько лет я иногда публикую материалы про ассемблер, в том числе и подборки с книгами и инструментами для начинающих и опытных разработчиков:</p>
33
<ul><li>"<a>За что я люблю ассемблер?</a>" - в этой статье на "Хабре" я рассказываю, как пришёл к ассемблеру, чем он хорош и где его используют. Там же моя краткая подборка книг, компиляторов и других инструментов.</li>
33
<ul><li>"<a>За что я люблю ассемблер?</a>" - в этой статье на "Хабре" я рассказываю, как пришёл к ассемблеру, чем он хорош и где его используют. Там же моя краткая подборка книг, компиляторов и других инструментов.</li>
34
<li><a>Подборка литературы по низкоуровневому программированию</a> - тема на форуме "Исходники.RU", в которой я собрал литературу, гайды, документацию по ассемблеру, системному программированию, операционным системам, драйверам и микроконтроллерам.</li>
34
<li><a>Подборка литературы по низкоуровневому программированию</a> - тема на форуме "Исходники.RU", в которой я собрал литературу, гайды, документацию по ассемблеру, системному программированию, операционным системам, драйверам и микроконтроллерам.</li>
35
<li><a>Инструменты для низкоуровневого программирования</a> - ссылки на компиляторы, SDK, среды разработки, отладчики, эмуляторы, файловые менеджеры и другие инструменты, которые пригодятся тем, кто собирается писать на ассемблере.</li>
35
<li><a>Инструменты для низкоуровневого программирования</a> - ссылки на компиляторы, SDK, среды разработки, отладчики, эмуляторы, файловые менеджеры и другие инструменты, которые пригодятся тем, кто собирается писать на ассемблере.</li>
36
</ul><p>Недавно я сделал для демосцены рекомпилятор байт-кода для операций над числами с плавающей запятой. Смысл в том, чтобы значительно сократить размер кода за счёт использования байт-кода и компилятора, который переводит его в нативный код прямо во время работы программы. Каждая инструкция процессора размером 2-3 байта сокращается до одного байта или чаще даже до полубайта.</p>
36
</ul><p>Недавно я сделал для демосцены рекомпилятор байт-кода для операций над числами с плавающей запятой. Смысл в том, чтобы значительно сократить размер кода за счёт использования байт-кода и компилятора, который переводит его в нативный код прямо во время работы программы. Каждая инструкция процессора размером 2-3 байта сокращается до одного байта или чаще даже до полубайта.</p>
37
<p>Поскольку в сайзкодинге (sizecoding) каждый байт на счету, периодически в сообществах ведутся обсуждения о попытках сжатия кода. Например, для программ размером до 256 или 512 байт это большая проблема - сжать такой код весьма сложно, особенно учитывая то, что в программу при этом добавляется ещё и код распаковщика, который тоже занимает драгоценные байты. Для программ от четырёх килобайт есть уже готовые решения (например,<a>Crinkler</a>), а вот для совсем маленьких программ таких стандартных решений нет - да и отдельных реализаций крайне мало, плюс все они создаются индивидуально под каждую работу.</p>
37
<p>Поскольку в сайзкодинге (sizecoding) каждый байт на счету, периодически в сообществах ведутся обсуждения о попытках сжатия кода. Например, для программ размером до 256 или 512 байт это большая проблема - сжать такой код весьма сложно, особенно учитывая то, что в программу при этом добавляется ещё и код распаковщика, который тоже занимает драгоценные байты. Для программ от четырёх килобайт есть уже готовые решения (например,<a>Crinkler</a>), а вот для совсем маленьких программ таких стандартных решений нет - да и отдельных реализаций крайне мало, плюс все они создаются индивидуально под каждую работу.</p>
38
<p>Мои демосценические работы можно посмотреть<a>на сайте</a>. Под каждую из них добавлено видео. Вот несколько самых интересных и залипательных (все они занимают не больше 256 байт!):</p>
38
<p>Мои демосценические работы можно посмотреть<a>на сайте</a>. Под каждую из них добавлено видео. Вот несколько самых интересных и залипательных (все они занимают не больше 256 байт!):</p>
39
<p>DEEP TRIP (256b intro)Chaos Equations (256b intro by Jin X) - DOSBox hi-res (1024×768)</p>
39
<p>DEEP TRIP (256b intro)Chaos Equations (256b intro by Jin X) - DOSBox hi-res (1024×768)</p>
40
<p>StarLine (256b intro)Tower of Hanoi 3D (256b intro by Jin X)</p>
40
<p>StarLine (256b intro)Tower of Hanoi 3D (256b intro by Jin X)</p>
41
<p>А вот моя полноценная игрушка - "Змейка" размером в 64 байта:</p>
41
<p>А вот моя полноценная игрушка - "Змейка" размером в 64 байта:</p>
42
<p>Монстры демосцены (например, Rrrola) делают куда более выдающиеся вещи в 256 байтах:</p>
42
<p>Монстры демосцены (например, Rrrola) делают куда более выдающиеся вещи в 256 байтах:</p>
43
<p>pulsPyrit</p>
43
<p>pulsPyrit</p>
44
<p>Sseraf (в этой работе автор применил сжатие кода)Lightcrypt by Alcatraz</p>
44
<p>Sseraf (в этой работе автор применил сжатие кода)Lightcrypt by Alcatraz</p>
45
250 Byte Intro "gyere kislány, gyere! a diszkó klubban szól már a zene!" (сделано под процессор ARM)<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
45
250 Byte Intro "gyere kislány, gyere! a diszkó klubban szól már a zene!" (сделано под процессор ARM)<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>