Нынешнее положение Паскаля
Паскаль, разработанный в 1970-х гг. Никлаусом Виртом как язык обучения программированию, претерпел за прошедшее время довольно много изменений в лучшую сторону. Основная заслуга в этом принадлежит фирме Borland International, долгое время выпускавшей линейку Turbo Pascal. Одно из основных усовершенствований, внесенных ею, — дополнение языка разнообразными и мощными средствами ввода-вывода. Другое связано с языком Модула-2 (автором которого также стал Н. Вирт): фирма Borland отказалась от распространения компилятора этого языка, применив вместо этого модульный принцип построения в Turbo Pascal. Кроме того, в Паскаль были введены средства непосредственного доступа к портам и ячейкам памяти, а позднее — возможность включать в текст программы фрагменты, написанные на ассемблере. Все это превратило Паскаль из средства обучения в достаточно мощный универсальный язык.
Сейчас признанными лидерами в области профессионального программирования стали Си-подобные языки. В течение долгого периода Паскаль был, пожалуй, почти единственной альтернативой им в качестве универсального языка. Однако когда труд большинства профессиональных программистов стал практически сводиться лишь к манипуляциям с вызовами более или менее стандартного API-инструментария (Application Programming Interface — интерфейс прикладного программирования), остро встал вопрос выбора единственного языка программирования, на котором (и для которого) будет писаться этот API. Вследствие различных причин — как объективных, так и субъективных — выбор пал на Си/Си++. Во-первых, Си, как и Паскаль, оказался одним из первых языков высокого уровня (ЯВУ), разрешившим проблему «курицы и яйца»: его компилятор был написан на нем же. Во-вторых, компиляторы для Си делать, пожалуй, легче, чем для любого другого языка (что, собственно, и было одной из целей его разработки), поэтому именно их выпуск экономически наиболее целесообразен. Впрочем, не обошлось и без субъективных факторов: значительную долю сегодняшнего API производит фирма Microsoft, уже давно разграничившая с фирмой Borland «сферы влияния» в этой области. Сейчас Borland не выпускает компиляторы для Бейсика и Фортрана, а Microsoft - для Паскаля, и, естественно, не ориентирует свои API на те языки, компиляторы которых сама не выпускает.
Поэтому лидерство Си в области профессионального программирования обусловлено в основном тем, что только на нем можно использовать новый API-интерфейс сразу же после его выхода, тогда как программистам, работающим на других языках, приходится либо ждать, когда появятся нужные интерфейсные модули, либо самостоятельно их писать.
Однако в области создания СУБД Паскаль до сих пор входит в число лидеров, поскольку продолжается разработка инструментального ПО для работы с объектными версиями этого языка (Delphi). Кроме того, Паскаль и его диалекты зачастую применяются в качестве «внутреннего» языка СУБД.
Сильные стороны Паскаля
Посмотрим на Паскаль, а также на Си и Бейсик с точки зрения обучения программированию. О дидактической несостоятельности языка Си уже много написано. Бейсик также мало подходит для обучения из-за отсутствия общепринятого стандарта и «беспорядочности» стиля работы, который он прививает. Основным преимуществом Бейсика была чрезвычайная нетребовательность к ресурсам компьютера, что стало уже неактуальным. Раньше, когда были ПК с 16-64-Кбайт оперативной памятью и ЗУ в виде магнитофона, можно было говорить, что Бейсик — лучший ЯВУ, поскольку не было выбора. При наличии 640-Кбайт памяти и дисковода такой выбор появился.
Итак, сегодня практически весь рынок программных продуктов ориентирован на многозадачные операционные системы (Windows, UNIX и др.) и интенсивно использует API-инструментарий, а также визуальные средства программирования.
Это, конечно, удобно, но вряд ли рационально для обучения, ведь нужно научиться разрабатывать и/или воплощать алгоритм, а не просто «складывать программу из кирпичиков». Кроме того, любой начинающий сталкивается с довольно значительным объемом информации, которую необходимо запомнить, прежде чем начинать программирование. Да и процесс постоянного обновления API затрудняет работу и преподавателя, и ученика. Текстовый интерфейс командной строки, принятый в DOS, дает возможность, не особенно заботясь о вводе-выводе, уделять основное внимание разработке и реализации алгоритма. А те, кто уже немного разобрался с компьютером, могут осваивать основы компьютерной графики, не изменяя платформы.
Медицинские рецепты принято выписывать на латыни. От всех живых языков она отличается тем, что уже не изменяется. К тому же медики, на каком бы языке они ни говорили, имеют в латыни общий язык. То же самое можно сказать и про DOS. Его API достаточно лаконичен и практически перестал изменяться. Кроме того, все операционные системы (на платформе Intel) позволяют работать с программами DOS, а вот программа, написанная, скажем, для Linux, в Windows уже не запустится.
Рассмотрим Паскаль для DOS. В сфере образования до сих пор широко используется последняя 7-я версия Паскаля фирмы Borland, созданная более восьми лет назад. Со своей основной задачей компилятор Паскаля справляется, однако зачастую даже школьники, постигшие азы программирования, натыкаются на его ограничения. Одним из основных недостатков компилятора является его 16-разрядность. Ограничение в 64 Кбайт на все статические данные выглядит слишком жестким при типичных сегодня 32-128 Мбайт оперативной памяти. То же касается и графических режимов: максимальное разрешение, с которым способен работать Turbo/Borland Pascal, требует лишь 150-Кбайт видеопамяти, в то время как появляются видеоадаптеры, несущие «на борту» уже 64 Мбайт.
Сравнение компиляторов Паскаля
В нашей стране все большее внимание стало уделяться легальному использованию программных продуктов. Так что теперь за Turbo/Borland Pascal приходится платить и частным лицам, и общеобразовательным учреждениям. И мало кто знает о том, что есть 32-разрядные компиляторы Паскаля, бесплатные для некоммерческого применения и к тому же более полно использующие оперативную память компьютера и возможности видеоадаптера (табл. 1).
Среди компиляторов, достигших определенной степени «зрелости», — TMT Pascal (www.tmt.com) и Free Pascal Compiler (FPC, www.ru.freepascal.org). В числе других проектов стоит упомянуть P32V Джона Принса (surf.to/p32) и Virtual Pascal (www.vpascal.com), недавно ставший бесплатным. Последний, пожалуй, наиболее тщательно проработан, но в исходном виде не позволяет делать DOS-приложения.
Примечательно, что в разработке TMT и Free Pascal участвовали наши соотечественники.
Версия 3.50 компилятора ТМТ производит впечатление вполне отлаженного продукта — большая часть выявленных ошибок устранена, сам он и его интегрированная среда работают стабильно и просты в установке. Сказывается, правда, немногочисленность коллектива разработчиков: интегрированная среда как две капли воды похожа на аналогичные GUI-ориентированные IDE и обладает довольно ограниченными возможностями — она не имеет даже встроенного отладчика. Во встроенном ассемблере до сих пор нет поддержки SSE, хотя есть 3DNow! и MMX. Полные зарегистрированные версии компилятора начиная с 1.0 содержали IDE-среду в текстовом режиме, с которой из-за множества ошибок все равно нельзя было работать, а свободно распространяемые — ограничения на объем используемой памяти, но их можно было элементарно обойти. Поэтому в версии 3.50 они были сняты, а в последнюю бесплатно предоставляемую добавлена IDE-среда.
Free Pascal был разработан довольно большим коллективом энтузиастов. Он поставлялся вместе с исходными текстами, поэтому любой желающий мог принять участие в процессе его создания. Кстати, написан Free Pascal на Паскале, так что для него проблема «курицы и яйца» не возникает.
Версия компилятора обозначается не двузначным, как обычно, а трехзначным числом, поскольку значение 99 в младшей части версии появилось задолго до того, как основной было присвоено 1.0. Сейчас 1.0 наконец вышла, но она оказалась чуть ли не более сырой, чем предыдущая. Затем почти сразу же была выпущена версия 1.02, содержащая лишь исправления замеченных ошибок, а на момент написания статьи готовилась к выходу версия 1.04. В комплект поставки компилятора входит интегрированная среда, работающая в текстовом режиме. В его документации честно предупреждается о том, что это пока отладочная версия. Да и сама IDE требует настройки, которая к сожалению описана неверно. Эта IDE является по сути текстовым редактором со встроенным компилятором (почему-то не внешним), в ней отсутствует даже контекстная подсказка, не говоря об отладчике.
Оба компилятора в определенной степени напоминают диалект Turbo/Borland Pascal, хотя и есть некоторые различия. В основном они касаются усовершенствований языка: нет ограничений, связанных с 16-разрядной сегментированной моделью памяти, есть Си-подобные комментарии. Кстати, ТМТ дополнился Си-подобными операциями: «+:=», «-:=». В Free Pascal появились перегружаемые функции, а у ТМТ — перегружаемые операторы и множество усовершенствований, что отражено и в документации. У Free Pascal желаемое нередко выдается за действительное. Так, в одной из предыдущих версий он наотрез отказался компилировать MMX-инструкции, в том числе и пример из документации.
Естественно, оба компилятора не во всем схожи. У ТМТ отсутствует 64-разрядный целый тип comp. Притом, скорее всего, его введение и не предполагается, так как существует дополнительный модуль для обработки комплексных чисел, имеющий то же самое название. В Free Pascal же не предусмотрено предопределенных массивов Port и PortW, а в ТМТ есть даже PortD.
Поскольку оба компилятора используют 32-разрядную плоскую модель памяти, функция seg у обоих возвращает 0, однако в системе программирования Free Pascal неправильно работает функция ptr. Например, в выражении longint(ptr($40,$6c)^) мы можем получить все что угодно, но только не значение счетчика времени BIOS (видимо, программа прекратит работу по ошибке обращения к памяти). У TMT же такая конструкция выполняется правильно.
После компиляции минимальный размер исполняемого файла для ТМТ составляет около 15 Кбайт, а для Free Pascal — 55 Кбайт. Кроме того, второй требует еще внешнего DPMI-сервера на 20 Кбайт, тогда как у ТМТ он содержится внутри исполняемого файла.
Чтобы сравнить скорости работы исполняемых файлов, полученных с помощью этих компиляторов, можно использовать тест Ветстоуна по определению производительности системы с точки зрения выполнения операций над числами с плавающей запятой, переписанный с Фортрана на Паскаль (табл. 2). Значительно уступая TMT по оптимизации размера, Free Pascal работает в полтора раза быстрее. В то же время оба компилятора оставляют далеко позади Borland Pascal, особенно на современных процессорах.
Однако некоторые результаты при измерении производительности выглядят довольно странно. Написанная на ассемблере процедура поиска кратчайшего пути в графе при помощи алгоритма Дейкстры, будучи откомпилированной тем же Free Pascal, выполнялась на 20% быстрее, чем ТМТ. При заполнении таблицы весов дуг графа использовался датчик случайных чисел, измерения повторялись 1000 раз и полученные значения усреднялись, а процедуры чтения, записи и пересылки содержимого оперативной памяти выполнялись в обоих случаях с одинаковой скоростью.
Среднее время выполнения этого теста для компилятора ТМТ Pascal составило 2,20 с, а для Free Pascal — 1,81 с.
Кроме оптимизации, которую делает сам компилятор, интересно также посмотреть, насколько оптимально написаны библиотечные процедуры. Это было решено сделать на примере графической библиотеки. Следует сказать, что в обоих случаях состав процедур значительно отличался от прототипа, особенно у ТМТ. Впрочем, и Free Pascal оказался не на высоте. Хотя дисплей и видеоадаптер позволяли работать в режиме 1600x1200 точек (а среди констант, описывающих разрешение, было предусмотрено даже 2048x1536 точек), однако в действительности заявленное разрешение установить при помощи Free Pascal не удалось. Поэтому скорость вывода графических примитивов проверялась в режиме 1280x1024 точки при 256 цветах (табл. 3). По скорости вывода на экран заштрихованных фигур ТМТ почти на порядок превосходит своего конкурента, что, видимо, объясняется более совершенным алгоритмом. При рисовании линий ТМТ практически во всем отстает от FPC. Правда, в некоммерческой версии ТМТ, где производились измерения, в отличие от коммерческой не используется LFB, что при рисовании без экранного буфера должно приводить к ощутимой потере производительности. Возможно, что различие результатов объясняется этим.
При выводе текста ТМТ втрое отстает от FPC, однако не следует этого пугаться. Дело в том, что тогда как Free Pascal вслед за Borland применяет шрифт размером 8x8, в ТМТ резонно предположили, что при разрешениях 640x480 точек и больше гораздо лучше будет смотреться шрифт размером 8x16. Так что замедление вывода в значительной степени связано с увеличением размера шрифта вдвое.
В целом реализация графической библиотеки ТМТ производит впечатление более продуманной и отлаженной (хотя и менее полной по отношению к Borland Pascal).
Кстати, раздел документации Free Pascal, посвященный описанию различий реализации графических библиотек для разных платформ, остался пустым, а графическая программа, работавшая в DOS и перекомпилированная в графическое приложение Windows, сразу же завершилась по ошибке.
Бесплатная версия TMT Pascal позволяет делать исполняемые файлы только для DOS, зато при использовании коммерческой один и тот же текст, будучи откомпилированным и для DOS, и для Windows, работает визуально совершенно одинаково, хотя внутренний механизм для DOS реализован через VESA, а для Windows — через DirectDraw.
Рекомендации
Что же, хотя крупные фирмы и отказались от ведения разработок Паскаля для DOS, небольшие компании, коллективы энтузиастов и даже отдельные программисты весьма успешно продолжили это дело, создавая вполне достойную замену проверенному компилятору Turbo Pascal. Так что если вам нужен надежный компилятор и вы не хотите возиться с установкой и настройкой его самого и прилагаемой к нему среды, а также если при вашей работе предъявляются жесткие требования к объему кода, то лучше остановить свой выбор на ТМТ. Кстати, при применении внешнего DOS-расширителя памяти, например DOS4GW, минимальный объем исполняемого файла можно сократить до 3 Кбайт. Если же вам не терпится самому принять участие в разработке компилятора Паскаля, если вам нужен транслятор, настраиваемый на ваши конкретные задачи и вы согласны над ним поработать, то следует отдать предпочтение FPC. Впрочем, вместе с исходными текстами также поставляется Р32V, однако он в отличие от FPC компилируется в среде Borland Pascal. Правда, P32V — не полный компилятор, так как переводит текст на Паскале не в объектный код, а в текст на языке ассемблера, и поэтому потребуется внешний ассемблер. Если же вы работаете с OS/2, то целесообразнее предпочесть Virtual Pascal.