История под названием fasm

Дата: 25/07/05;  Перевод: CodeWorld; 


Расскажите о себе
Меня зовут Томаш Гриштар, сейчас мне 25, живу в Кракове, где я аспирант Ягеллонского университета. Моё обучение сконцентрировано на математике с небольшим применением теории ИТ.

Расскажите про создание и архитектуру вашей ос?
Впервые я попробовал занятся разработкой ос в 1998/1999 году. Одним из плодов этого стал fasm, который первоначально писался как персональный инструмент для разработки моей ОС. Только в 2000 году я опубликовал fasm в интернет решив, что он может оказаться полезным. Что касается моей ос, её звали Титан и была она задумана как некоторое подобие DOS-системы для защищенного режима. Однозадачность и выполнение програм в 0 кольце даёт максимальную свободу как в ДОС-е, системе которая мне очень нравилась. К сожалению сейчас сохранились только очень ранние версии Титана - в результате одного происшествия я потерял позднии исходники ОС, где уже были пару программ, портированный fasm (я написал fasm таким образом, что позволело мне очень легко портировать его в мою ОС, а благодаря этому, значительно позже, я так же легко перенёс fasm в Win32, Linux, Menuet) и редактор с подсветкой. Сохранившиеся исходники занимают около 100 кб. Ядро загружается простым загрузчиком из под ДОС-а и работает только с RAM диском - всё это было улучшено в последующих версиях, но к сожалению они утеряны навсегда. Тем не менее остался fasm и позже сделал себе некоторую славу.

Почему вы решили написать свой ассемблер и какие основные концепции были заложены в него?
Как я упомянул выше, одна из основных причин написания fasm-а была необходимость в хорошем инструменте для разработки моей ОС, с последующей возможностью переноса fasm-а в качестве родной среды разработки. Первоначально я использовал TASM, исключительно в режиме Ideal. Это был замечательный ассемблер, но недостовало некоторых вещей, которые мне были нужны при написании ОС - плоский бинарный формат на выходе, возможность использования редких опкодов и т.п. Потом я наткнулся на NASM и хотя он обладал частью необходимых характеристик, мне он не понравился по очевидной причине: те вещи, которые я использовал в TASM-е отсутвовали в NASM-е - например контроль за размером операндов или именование параметров для макро-инструкций. Всё-же я позаимствовал некоторые идеи у NASM, но главным вдохновителем при проектировании fasm-а оставался режим TASM-а Ideal. Ещё одна из базовых концепций моего ассемблера была легкая переносимость, которую я достиг путём разделения системно-независимого ядра от интерфейса, содержащего в себе элементарные функции доступа к файлам и т.д. Интерфейс может быть переписан для любой ОС, которая может выполнять программы в плоском адресном пространстве. И поскольку это не отъемленная черта всех серьёзных операционных систем для платформ x86, я знаю, что fasm может быть перенесён в любую из них. Но всё-же fasm портиван не во все операционные системы, например я не чувствую реальной необходимости переписывать интерфейс для BSD систем - я использую версию Linux fasm-а в режиме совместимости, даже на OpenBSD он работает безупречно. Также fasm не был портировал в OS/2, так как я никогда не знал об этой системе много и даже о форматах файлов используемых в OS/2 имею поверхностное представление.

Для любопытных: первоначально flat assembler был регистро-чувствительным, в том числе к мнемоническим инструкциям, регистрам и директивам. Все должно было быть в нижнем регистре и все отображаемые сообщения так же были в нижнем регистре. Позже fasm перестал быть регистро-чувствительным, но все сообщения попрежнему выводились в нижнем регистре. И вы можите заметить то, что я продолжаю писать "fasm" и "flat assembler" в нижнем регистре. Это преднамерено.

Перескажите краткую историю развития FASM-a?
В первом же файле, перед тем как написать первую строчку кода я воспользовался функцией редактора DOS Navigator-а для вставки текущей даты и времени в начало файла. Поэтому я могу сказать вам очень точное время, когда я начал разрабатывать flat assembler - 1999-03-23, 14:24:33. А первая версия, которая могла себя перекомпилировать была готова 1999-05-04 (я могу сказать это по дате последних изменений в файлах исходников), в этом состояние он оставался долгое время (именно его я перенёс в свою ос, но эта версия была потеряна со всей системой). Спустя год (в 2000) я вернулся к этому, немного почистил и выложил fasm в интернете на случай если кто нибудь действительно найдёт его полезным (после неудачуи с собственной ОС). Я отправил сообщение об нём в переписку разработчиков FreeDOS и к щастью оно еще в архивах - http://marc.theaimsgroup.com/?l=freedos-dev&m=95311018003959&w=2. Сообщение датировано 2000-03-15. В том архиве больше 2-х моих сообщений о fasm-e и в последнем анонсировался выход 1-ой версии (2000-06-16). Позже, после того как я реализовал выходной формат PE и выпустил Win32 версию (первая такая версия была 1.04 закрепленная датой 2000-08-10), интерес к fasm'у вырос заметно и я переехал на форум Win32ASM Community, где через некоторое время мне дали под форум для fasm-а, продолжительное время именно он являлся главным местом поддержки моего ассемблера, пока я не создал свой собственный официальный форум посвященный полностью fasm-у (это было 2003-06-16).

Почему в FASM-е долгое время небыло оператора dup?
Это может показаться немного странным решением, но хотя я использовал идеал режим TASM-а как основной при проектировании синтаксиса fasm-а, я всё таки решил использовать TIMES в стиле NASM-а вместо оператора DUP. Это одна из характеристик NASM-а, которая мне понравилась своей универсальностью и вообще она намного проще в реализации. Так пробыло очень долго, с тех пор я привык использовать TIMES, из-за чего реализация DUP стала не такой уж критичной и я сконцентрировался на реализации других важных свойств. Потом я вообще забыл про DUP, но недавно, после просмотра нескольких вопросов наподобие "Как сделать DUP в fasm-е", где в ответе обычно предлагалось использовать директиву TIMES, я решил, что пора бы реализовать и DUP наконец-то. Во-первых, это еще один шаг делающей синтаксис fasm-а более похожим на Ideal TASM-а. Во вторых, DUP более понятный и гибкий для определения данных чем TIMES (хотя TIMES всё ещё остаётся очень полезным для повторения каких-нибудь инструкций, чего нельзя сделать с помощью DUP), например с DUP-ом вы можете смешивать повторяющеися и неповторяющеися данные в одном определении. Теперь fasm поддерживает DUP - как это должно было быть с самого начала.

Чем синтаксис FASM-а отличается от других ассемблеров?
Когда я проектировал fasm я опирался не только на TASM, несколько решений были взяты из NASM-а и в результате получилась некоторая смесь, похожая по немногу на каждого из них, но в тоже время отличающаеся от обоих. Кроме того fasm имеет свои специфические возможности, например директива VIRTUAL, обнаружение мертвого кода и синтаксис макроинструкций отличающийся от любого другого ассемблера, хотя первоначально он был основан на синтаксисе Ideal TASM-а, с единственным различием - содержание макросов в fasm-е заключается в квадратные скобки, вместо ключевого слова ENDM. В остальном стандартные правила такие как именование параметров и директива LOCAL такая же как и в TASM. Но когда я совершенствовал макросы, они должны были быть совершенно другими - основаная причина заключается в том , что fasm не работает с исходным текстом напрямую, а токенезирует прежде, чем он будет последовательно пройден препроцессором. По этой причине макросы fasm-а должны базироваться на токенизации, из-за чего их не возможно обработать как простую строку. Первоначально токенизация была сделана с целью ускорения предварительной обработки и парсинга, но синтаксичей анализатор fasm-а обработовал все заново. Теперь же это внутренняя часть fasm-а, благодаря чему модуль ассемблера может показать высокие результаты обработки. И благодаря этому же, даже когда fasm должен сделать несколько проходов, чтобы правильно обработать код, он делает это очень быстро. Вы можете заметить, что многие синтаксические решения fasm-а были сделаны в силу его внутренного устройства, чтобы получить минимальные затраты времени на компиляцию.

Что насчёт других аппаратных платформ?
Благодаря модульной архитектуре, приспособить fasm к генерации кода под другие платформы очень легко. В последнии версии введена поддержка AMD64/EM64T, fasm уже многократно протестирован на создание правильных объектных файлов под Win64, так что он один из немногих открытых средств разработки для платформы Win64.

Какие форматы поддерживает FASM?
Оба поддерживают выходной формат как исполняемых файлов, так и объектных. Но во втором случае вам нужен компоновщик, чтобы сделать конечную программу из объектов, а fasm-y только ассемблер. Я видел мнения, что fasm имеет встроенный компоновщик, поскольку это позволяет генерировать программу напрямую. Задача компоновщика заключается в создании программы из нескольких объектов, слияния секций и т.д. Но я считаю это неправильным, мой ассемблер не делает этого и когда вы компилируете прогамму, программа формируется шаг за шагом - fasm не будет объединять секции, они будут в том порядке и с теми атрибутами, которые вы определили в исходнике. Объектные файлы создаются так же - это чистая трансляция без всяких линкований. Сейчас поддерживаются следующие объектные файлы - COFF, ELF (включая варианты для архитектуры x86-64). Были некоторые жалобы о недостатке опции для компиляции OMF файлов, но я считаю, что этот формат слишком стар, сложен и становится ни кому не нужным - современные системы используют ELF (клоны unix) или COFF (Win32 и Win64). Я ещё незнаю какой объектный формат будет использовать MacOS когда переедет на x86 - возможно придется ввести поддержку еще одного формата (если они используют OMF, это будет забавно).

Вы ощущаете борьбу FASM-а и NASM-а? Как вы относитесь к ней?
Между прочем написание fasm-а частично было моим ответом на разочарование, которое я имел с NASM-ом - у него были хорошие качества, но недоставало важных для меня вещей, таких как контроль размера переменных и автоматическая оптимизация смещений. Еще мне очень ненравиться стиль макросов в NASM-е. В результате fasm получился чем-то средним между TASM-ом и NASM-ом, кроме того со своими свойствами, добавленными позже. Однако основной синтаксис очень похож на синтаксис NASM-а, который легко реализовался в fasm-е. В отличии от синтаксиса MASM. Но недавно я написал новые макро-инструкции для эмуляции синтаксических конструкций TASM/MASM, которые раньше не поддерживал fasm. А вообще макросредства fasm-а способны эмулировать любой синтаксис и недавно я написал макросы для эмуляции макро-синтаксиса NASM-а (пока с фиксированном кол-вом параметров). Но всё таки NASM более популярный, потому что для него написано огромное кол-во материалов, что сделало его широко распространённым - тем неменее fasm меньше, быстрее и имеет достаточный набор качеств чтобы стать твёрдым конкурентом NASM-а. Если быть честным, то я знаю совсем малую часть NASM-овских возможностей, которых нет в fasm-е (на архитектуре не отличной от x86). Кстати fasm на x86 намного портабельней - он может быть перенесён в любую ОС защищенного режима, в то время как для NASM-а критично наличие библиотеки С доступной для этой ОС.

Расскажите о сегодняшних проектах на фасме
Сам я ничего не пишу на fasm-е, если это не имеет отношения к самому fasm-у (например примеры программ). Ещё я начал писать библиотеку для вычисления очень больших цифр, это может мне пригодиться в учёбе, сейчас я приостановил эту разработку.

За какой osdev проект вы болеете?
Ни один из проектов ОС реально не заинтересовал меня. Только если MenuetOS, потому что это первая ОС после моей, которая использовала переносимость fasm-а с теми же целями, что и я.

Вы не собираетесь комерцианолизироваться?
Я думал сделать версию для x86-64 платной, но потом решил оставить бесплатной, решив что fasm еще недостаточно популярный для получения успеха в такой области. Сделав версию для x86-64 бесплатной, когда таких же аналогов почти нет (пробные испытания 64-х битного fasm-а как на Linux так и Windows прошли успешно), я надеюсь повысить популярность fasm-а. Тем не менее я решил написать комерческую библиотеку кодогенерации для разработчиков компиляторов.

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