Писать о культовых проектах, не затронув чувства верующих и сохранив при этом здоровую долю скептицизма и объективизма не так-то просто, особенно если ты сам являешься апологетом веры, за которую готов если не отдать жизнь, то уж точно порвать любого критика на куски, а потом прихлопнуть дампом памяти или своп-файлом. FASM (расшифровывается как Flat Assembler - Ассемблер Плоского Режима) - это крайне необычный транслятор с экзотичными возможностями, которых все мы давно (и безуспешно!) ждали от крупных производителей, но те были слишком далеки от практического программирования и пытались формировать новые потребности (например, путем введения поддержки ООП), вместо того, чтобы удовлетворять те, что есть.
Рисунок 3. Неофициальный логотип FASM'a.
Так продолжалось до тех пор, пока Томаш Гриштар (Tomasz Grysztar) - аспирант Ягеллонского университета в Кракове - не задумал написать свою собственную ось, названную Титаном и представляющую некоторое подобие DOS-системы для защищенного режима. Перебрав несколько ассемблерных трансляторов, но так и не обнаружив среди них подходящего, Томаш пошел на довольно амбициозный шаг, решив разработать необходимый инструментарий самостоятельно. Это произошло в 1999-03-23, 14:24:33 (дата создания первого файла) и уже к началу мая 1999 года появилась версия, способная транслировать сама себя (FASM написан на FASM'е). Операционная система в результате одной случайной катастрофы пала смертью храбрых, а вот исходные тексты FASM'а - остались и с тех пор он продолжает активно развиваться.
Что же такое FASM? Это ассемблер с предельно упрощенным синтаксисом (никаких offset'ов и прочих захламляющих листинг директив), полной поддержкой всех процессорных команд (в том числе и jmp 0007:00000000), качественным кодогенератором, мощным макропроцессором и гибкой системой управления за форматом выходных файлов.
FASM распространяется в исходных текстах на бесплатной основе и к настоящему моменту перенесен на MS-DOS, Windows 9x/NT, Linux, BSD, поддерживает уникод и все x86-процессоры вплоть до Pentium-4 с наборами мультимедийных инструкций MMX, SSE, SSEII, SSEIII, AMD 3DNow!, а так же платформу AMD x86-64, позволяя генерировать не только Microsoft coff, но и готовые bin, mz, pe и elf файлы. То есть, фактически, FASM позволяет обходиться без линкера, однако при этом раскладку секций в PE-файле и таблицу импорта приходится создавать "вручную" с помощью специальных директив ассемблера, что выглядит очень заманчиво, но на практике все же намного удобнее сгенерировать coff и скомпоновать его с модулями, написанными на языках высокого уровня.
Макроязык FASM'а настолько мощный, что позволяет писать программы на себе самом без единой ассемблерной строки, вот например (см. листинг 1). И пускай кто-то ворчит - ну вот, мол, еще одна попытка опустить ассемблер до уровня Бейсика. Ничего подобного! Макросы - вещь добровольная. Хочешь - пользуйся, не хочешь - не надо.
file 'interp.asm' repeat $ load A byte from %-1 if A>='a' & A<='z' A = A-'a'+'A' end if store byte A at %-1 end repeat
Листинг 1. Программа, целиком написанная на интерпретируемом языке FASM'a.
Все это были достоинства. Теперь поговорим о недостатках. Ни на что не похожий синтаксис FASM'а напрягает даже матерых программистов, заставляя их вгрызаться в плохо структурированную документацию и небольшое количество демонстрационных примеров, поставляемых вместе с транслятором. На это требуется время, которое в конечном счете ничем не компенсируется, поскольку круг задач, на которых FASM реально рвет MASM, крайне мал. Категорическая несовместимость с MASM'ом чрезвычайно затрудняет разработку Windows-драйверов (в большинстве своем создаваемых на основе примеров из DDK). Прикладным задачам в свою очередь требуется SDK и желательно первой свежести, а не второй, да и программы, целиком написанные на ассемблере, - это совсем не то, чего требует бизнес-машина. "Математические" задачи, перемножающие матрицы, вычисляющие координаты пересечения кривых в N-мерном пространстве или трансформирующие графику легко пишутся на FASM'е, поскольку не привязаны к конкретной операционной системе, никаких API-функций они не вызывают и вообще не лезут туда, где можно обойтись Си/Си++.
Если бы FASM поддерживал генерацию отладочной информации, его (с некоторой натяжкой) еще было бы можно рассматривать как серьезный инструмент, а так... он остается игрушкой, пригодной для мелких задач типа "hello, world", вирусов, демок и прочих произведений хакерского творчества.
Наконец, ни у кого нет гарантий, что создатель FASM'а не утратит к нему интереса, а ведь без поддержки новых процессорных инструкций всякий транслятор обречен на медленное, но неизбежное вымирание. Открытость исходных текстов тут не поможет, помимо них нужна еще и команда. Нужны "носители знания", способные удержать детали проекта у себя в голове, а тот факт, что FASM написан на себе самом, увы, читаемости листингам отнюдь не добавляет.