People are strange when you are stranger. "People Are Strange", The Doors. |
Может ли один-единственный человек написать реально работоспособный и качественный компилятор? Вопрос не такой простой, как может показаться. Да, конечно, компилятор - программа сложная, и не каждый за такой возьмётся. И далеко не каждый из взявшихся доведёт дело до конца. Однако, опять-таки, многое зависит от сложности входного языка и квалификации разработчика.
История, однако, знает немало примеров, когда разработанный одним или двумя людьми компилятор имел в буквальном смысле слова эпохальное значение. Самый, пожалуй, известный пример - компилятор языка Си, разработанный Брайаном Керниганом и Денисом Ритчи в далёких семидесятых годах. Благодаря ему они смогли создать "ЮНИКС", который изменил представление об операционных системах. Подобные случаи в те годы не были редкостью - например, первый компилятор языка Паскаль его разработчик, профессор Никлаус Вирт, написал в одиночку. Нередко компиляторы, разработанные одним или двумя студентами, позволяли своим создателям организовать крупные компьютерные фирмы. За примерами тоже далеко ходить не надо: корпорация Microsoft "выросла" из компилятора Quick Basic, написанного Биллом Гейтсом и Полом Алленом. Аналогично на компиляторе Turbo Pascal "вышла в люди" компания Borland, а на Фортране - почившая ныне в бозе Watcom.
Однако разработчик программы, которой посвящена эта статья, очевидно, не горит желанием основать собственную компьютерную корпорацию. Поэтому компилятор, который он разработал, совершенно бесплатен и, более того, имеет открытый исходный код. Называется же программа "Странник". Впрочем, обо всём по порядку.
Как говорит сам автор проекта, "компилятор "Странник Модула-Си-Паскаль для Win32" - пилотный продукт в проекте под условным названием "Русский компилятор". Проект предусматривает создание многоязыкового компилятора, поддерживающего языки программирования с общей семантической базой". То есть "Странник" - многоязыковой компилятор для 32-битных Windows-платформ, поддерживающий компиляцию программ на языках Модула-2, Си и Паскаль. Впрочем, языки эти в видении автора компилятора (кстати, я до сих пор вам его не представил: знакомьтесь, его зовут Андрей Юрьевич Андреев) несколько отличаются от своих ANSI1 или ISO2 стандартов. Однако подробнее об этом чуточку позже.
До настоящего и полноценного многоязыкового компилятора "Странник" не дотягивает самую малость: не хватает только возможности перевода кода с одного языка программирования на другой. Однако это не мешает ему успешно справляться со всеми остальными своими обязанностями. Причём, что интересно, компилятор прекрасно справляется и с русскоязычными идентификаторами (именами переменных, констант и прочих вещей). Набор ключевых слов для всех трёх языков также может быть русифицирован, так что можно писать и const, и конст. Даже не знаю, хорошо это или плохо - наверное, в целом, полезно.
Компилятор поставляется не один, а вместе со средой разработки. Причём IDE (Integrated Development Environment - интегрированная среда разработки) так тесно связана с компилятором, что по отдельности их использовать не получится: они находятся вместе в одном и том же исполняемом файле Sm.exe. Нельзя сказать, чтобы среда разработки поражала воображение своими безграничными возможностями: скорее, наоборот, всё просто-таки дышит аскетизмом. Но, приглядевшись, понимаешь, что всё необходимое присутствует: и подсветка синтаксиса для всех трёх языков, и встроенный отладчик, и редактор ресурсов, и справочная система. Так что волей-неволей начинаешь верить автору, который считает одним из принципов проекта девиз "ничего лишнего".
Выполнять компиляцию можно в одном из трёх режимов: "Компилировать", "Компилировать всё" и "Компилировать DLL". В первом случае выполняется компиляция активного файла с исходным кодом, во втором - всех файлов, открытых на текущий момент в среде. В отличие от многих других бесплатных компиляторов, "Странник" имеет собственные встроенные в него ассемблер и компоновщик, так что на выходе получается уже готовый исполняемый файл. Никакие промежуточные файлы (вроде OBJ и LIB) при этом не образуются. Таким образом, третий пункт меню "Компилятор" отличается от первых двух только видом исполняемого файла, получаемого на выходе. В одном случае это EXE, а в другом - DLL (динамически подключаемая библиотека).
Как я уже говорил, "Странник" снабжён справочной системой. Выбрав в редакторе кода идентификатор и установив на него курсор, нажмите клавишу F1. Перед глазами появится окно, которое осуществляет поиск по тексту модуля и показывает описание искомого идентификатора. Если это процедура, то указывается список передаваемых параметров, если запись (структура) - список полей и т.п. В этом окне можно провести поиск и по справке из Win32 SDK, которая прилагается к "Страннику". В целом, конечно, нельзя сказать, что это совсем неудобно, но, пожалуй, всплывающие подсказки, реализованные разработчиками других сред программирования, всё же привычнее глазу, да и работают они быстрее. Правда, программа показывает параметры стандартных Win32 API функций внизу, в статусной строке, и это уже хорошо.
Сложно сказать, выполняет ли "Странник" в ходе компиляции какую-либо оптимизацию выдаваемого им кода. Автор на эту тему никаких комментариев и пояснений не даёт как в справке, так и на сайте. Можно, конечно, было бы дизассемблировать программу, сгенерированную "Странником", и посмотреть ассемблерный код, но дизассемблеры отказываются работать с файлами, создаваемыми "Странником". В настройках компилятора тоже нет никаких намёков на оптимизацию, а разобраться в исходном тексте программы, говоря откровенно, тоже не так уж и просто. Так что вопрос об оптимизации остаётся открытым.
Помимо настроек компилятора, в программе можно изменить настройки редактора кода и редактора диалогов. Но настроек не очень много, так что не будем на них подробно останавливаться.
Встроенный редактор ресурсов "Странника" предназначен, прежде всего, для редактирования диалогов. Среди элементов управления, которые с его помощью можно размещать на диалоговом окне, находятся такие: текстовая надпись, кнопка, многострочное и однострочное поля для ввода текста, RTF-редактор (RichEdit Control), список с вертикальной прокруткой, комбинированный список (ComboBox), линейка (Scrollbar), список с иконками, список-дерево, ползунок, индикатор прогресса, элемент для просмотра видео, кнопки up/down, календарь, закладки, элемент для выбора времени и некоторые другие элементы управления, стандартные для операционной системы Windows. В редакторе можно настраивать выравнивание элементов управления, задавать шрифт и атрибуты. Особо красивым редактор ресурсов тоже не назовёшь, но, в целом, он полезен и удобен. Что интересно, диалог, получающийся после редактирования, не сохраняется в отдельный файл, а вставляется прямо в текст программы, куда также добавляется код для его инициализации. То есть, для "Странника" совершенно в порядке вещей, когда посреди кода программы встречается код диалогового окна на языке Resource Script, и компилятор это совершенно спокойно переваривает. Несколько непривычно, но... почему бы и нет?
Кстати, аналогичным образом вставляются в программу и все остальные ресурсы - например, те же битмапы и иконки. Только вот для их редактирования автор предлагает использовать Microsoft Paint, поскольку в "Страннике" не предусмотрен собственный графический редактор. Правда, тот факт, что Paint не умеет работать с иконками, не учитывается. Так что для них нужно искать отдельную программу.
Теперь пару слов о встроенном отладчике "Странника". Ему, в общем, тоже есть куда совершенствоваться, но из всей интегрированной среды это, пожалуй, самая законченная и функциональная часть. Стандартные функции отладки с заходом в подпрограммы и без него отладчиком поддерживаются на все 100 процентов. Для того, чтобы установить точку останова, нужно в меню "Отладка" выбрать пункт "Перейти в текущую строку" (или нажать F4). А для того, чтобы посмотреть значение той или иной переменной, нужно вызвать их список из того же меню. Значения переменных могут показываться как в десятичном, так и в шестнадцатеричном виде. Кстати, отладчик умеет искать ошибки в программе и в том случае, если даже она была запущена не под отладчиком. Для этого нужно посмотреть в сообщении, которое в случае ошибки выдаёт Windows, адрес, по которому возникла ошибка, и ввести этот адрес в окно, вызываемое из меню "Инструменты" -> "Поиск ошибки". Как отмечает сам автор, "Странник" никогда не добавляет в исполняемый файл никакой отладочной информации, поэтому отладка программ при помощи сторонних отладчиков будет довольно затруднительным занятием.
А вот теперь давайте поговорим о языковых особенностях "Странника". Я уже упоминал, что каждый из языков в данном компиляторе несколько изменён. Главный язык "Странника" - Модула-2, и именно на нём написан сам компилятор (а также, естественно, среда разработки, отладчик и редактор ресурсов). Соответственно, остальные языки претерпевали большие изменения, поскольку подгонялись именно под Модулу. Разработчик "Странника", впрочем, замечает, что Модула-2 в "Страннике" - тоже не совсем Модула, а, скорее, надмножество языка Оберон-2, поскольку поддерживает объектно-ориентированное программирование. В целом же, от классической Модулы версия "Странника" отличается отсутствием цикла LOOP и записью строковых констант в стиле Си.
Языку Си досталось больше. Во-первых, был полностью изгнан препроцессор, во-вторых, подогнаны под синтаксис Модулы конструкции if, switch, а также некоторые другие. Ограничено применение директивы define (обратите внимание: define, а не #define). Объектно-ориентированное программирование и работа с классами где-то посередине между Обероном-2 и Си++. Так что совместимость "Странника" и остальных компиляторов Си близка к нулю.
Паскаль, являясь предшественником Модулы, стал, пожалуй, единственным языком из триады, не поимевшим от модернизации никаких убытков. Главные отличия таковы: используется оператор return для выхода из процедуры, вместо типа cardinal введён тип dword. Вот, собственно, и все изменения в Паскале.
Все три языка в компиляторе поддерживают вставку кода на Ассемблере и вставку скриптов с ресурсами. Правда, стандартные языковые библиотеки отсутствуют, вместо них рекомендуется использовать исключительно и только Win32 API.
Что ж, это, пожалуй, всё, что я хотел рассказать о "Страннике". Как видите, разработка весьма своеобразная: с одной стороны, восхищает то, что всё это смог написать один-единственный человек, и то, что программа хорошо и стабильно работает; с другой - явно есть что дорабатывать. Кстати, автор утверждает, что с помощью "Странника" был разработан пакет "Странник-Бухгалтер", исходный текст которого составил около 20 тысяч строк кода. Правда, где на него можно взглянуть, не сообщается. Но достаточно и того, что есть исходный текст самого "Странника" и множество примеров, а также тестов для компилятора.
Кажется, в начале статьи я забыл указать адрес сайта проекта "Странник". Исправляюсь. Адрес такой: home.perm.ru/~strannik. Думаю, сайт заинтересует многих: на нём можно прочитать кое-что о создании компиляторов, посмотреть на сравнение нескольких языков программирования. И, конечно же, скачать дистрибутив "Странника", имеющий объём около мегабайта. Так что всем, кто хочет написать собственный компилятор, и тем, кто заинтересовался "Странником", стоит посетить этот сайт.
Вадим СТАНКЕВИЧ
1 ANSI - стандарт, утверждаемый
Американским национальным
институтом стандартизации
2 ISO - стандарт, утверждаемый международной организацией по стандартизации и сертификации
Комментарии