О бедном Basic замолвите слово! |
Автор Administrator | |||||||||||||||||||||||||||||||||||||||||||||
16.06.2006 г. | |||||||||||||||||||||||||||||||||||||||||||||
Сравнительный анализ производительности современных компиляторов Бейсика между собой, а так же их краткие характеристики.
" О бедном Basic замолвите слово!"
Статью Дейва Джюэла "Бейсик повзрослел!" я прочитал в прошлом веке, где то в начале 90-х годов. В тот момент казалось, что утверждение о серьёзности программирования на Бейсике мягко говоря несколько преувеличено. Но время шло, оперативные системы сменяли одну за другой, рождались и умирали языки программирования, менялись и корректировались диалекты старых языков, подстраиваясь под ритм и внешний вид новых "Окошек". И Бейсик действительно взрослел, вбирая в себя все лучшие качества от собратьев, однако оставаясь доступным для понимания миллионов людей различных профессий и интересов. Благодаря тесной интеграции с таким популярным пакетом программ как Microsoft Office (VBA), а так же поддержка современными ОС семейства Microsoft Windows языка сценариев (VBS), теперь и профессиональные программисты вряд ли могут считаться таковыми, не обладая достаточными навыками в работе с Бейсиком. Из отечественных разработчиков широко известна фирма "1С" своими программами в области бухгалтерского учёта, внутренний язык которых ни что иное как Бейсик (причём даже в русифицированном варианте). Бейсик критиковали практически во все времена - вначале, что это интерпретатор, а не компилятор, то подвергался нападкам оператор безусловного перехода GOTO (и почему это ни кого не раздражает JMP в ассемблере ?), то за возможность предварительно не объявлять переменные. От этих недостатков Бейсик избавился ещё при ОС DOS, причём, не потеряв достоинств. Обзаведясь полноценным компилятором, однако в среде разработке всё еще использует интерпретатор, который на стадии ввода кода программы с лёгкостью выявляет синтаксические ошибки. К стати, этого не умели делать IDE "профессиональных " языков вплоть до новой платформы ,NET. Бейсик пробрался и на эту платформу, хотя прежний BASIC в нём уже не узнать, а по сему речь сегодня не о нём. Все эквиваленты ключевых слов языка Си "switch", "while" и "do", трансформировались в SELECT CASE, WHILE, WEND и DO LOOP но и про GOTO не забыли - вдруг пригодиться, для совместимости со старыми версиями. Теперь во многих реализациях языка компилятор следит за переменными - просто набери Option Explicit и объявляй переменные на здоровье! Следующий недостаток - отсутствие единой сертификации на язык, множество диалектов. Да, тут время и темпы развития сыграли не добрую шутку - действительно, сейчас можно насчитать не менее 2-х десятков различных рабочих компиляторов Бейсика, а сколько версий в пределах одного компилятора? Так вот, горькая правда в том, что если попытаться откомпилировать один и тот же код в десятке различных компиляторов, то можно с уверенностью сказать, удастся это только в одном случае - там, для какого компилятора мы этот код писали. В остальных случаях скорее всего не получиться, ну конечно, если код серьёзный и содержит операторы ввода-вывода к примеру. Но с другой стороны, время на отладку потребуется минимальное, особенно если она будет происходить в интеллектуальной IDE. В прочем, особенно зацикливаться на этой проблеме не стоит - даже такой строгий в этом отношении Паскаль и то имеет этот грех - попробуйте откомпилировать проект в разных версиях Паскаля или Дельфи. А вот с СИ поступили круче - просто расширили язык до С++ - вроде основы те, а концепция уже другая... Пожалуй одна из самых главных претензий к Бейсику - его медлительность скомпилированных файлов. Видимо, это утверждение целиком и полностью было справедливо для интерпретаторов. Истину в этом вопросе можно установить, испытав несколько компиляторов различных версий Бейсика.
В связи с тестами мне вспомнилась ещё одна книга из прошлого века которая называлась " От микрокалькулятора к персональному компьютеру" , издания 1990 г. У неё два автора В.Ф. Очков и В.А. Хмелюк. В конце первой части, которую написал Хмелюк, есть пример программы "Бенчмарк", написанный на Бейсике. Вот его исходный вариант:
По данным из этой же книги интерпретатор Бейсика СМ-1800 отрабатывает эту программу за 104 сек. Но как говориться, с той поры много времени утекло, компьютеры стали быстрее, а Бейсик, как мы выяснили, повзрослел. Но было очень интересно проверить быстродействие компиляторов именно при помощи этого теста, изменив его с учетом вышеизложенного. Путем нескольких пробных вариантов приемлемое время выполнения программы установлено при изменении 110 строки к виду If K<90000000 THEN 50. В тестах использовался компьютер на базе процессора AMD ATHLON 64 3000+(1800MHz, 512 k, Socket 939). В тестах использовались следующие компиляторы языка Бейсик:
Исключительно для сравнительного анализа текст этого бенчмарка был перенесён еще на два популярных компилятора - Microsoft Visual С++ v6.0 и Delphi v7, причем максимально приближённо к Бейсику, на сколько это было возможно для синтаксиса этих языков. Microsoft QuickBasic v4.5 Эта версия компилятора, единственная в моём обзоре, среда разработки и исполняемый exe код которой предназначалась для DOS. Код бенчмарка можно было не менять вообще - QuickBasic поддерживает работу с номерами строк. Единственное изменение в коде, которое не влияет на скорость работы, это замер времени выполнения бенчмарка. Возможно Бейсик в СМ -1800 не работал с таймером, а возможно по другим причинам, скорость работы программы измеряли по наручным часам.
Оператор INPUT служит только для того, что бы окошко DOS программы не закрывалось самостоятельно в среде Windows. Следует отметить, что этот бенчмарк под управлением DOS работает примерно на 15% быстрее. Время работы программы составило 56 сек. По сравнению с СМ -1800 не плохо, если ещё учесть, что задача усложнилась в 90 тысяч раз! Microsoft Visual Basic v6.0 Пожалуй, это самый популярный из современных Бейсиков. Дружественная среда разработки позволяет очень быстро писать программы с современным интерфейсом. В виду того, что консольное приложение не является основным для VB6, и для его создания пришлось бы использовать Win API, пришлось создать обыкновенное оконное.
Как видно из листинга программы код практически не изменился. Для запуска бенчмарка на форме нарисована кнопка Command1. Я добавил описание переменных, хотя этого можно было и не делать, но скорее всего, время работы программы несколько увеличилось бы, тип переменных по умолчанию variant самый медленный. Интересно, что вместо меток для переходов я просто оставил нумерацию строк, и VB6 понял, что я имел в виду... Время работы программы зависит от занятости системы и колеблется около 5 сек. (+- 0.3 сек). Размер исполняемого файла 20.48 Кб. И если бы не огромная библиотека(MSVBVM60.DLL ок 1.2Мб), без которой этот файл работать не может, то всё было бы просто хорошо. Хотя наличие такой библиотеки это всё таки благо - во всех современных ОС она встроена изначально, а где её нет, можно установить один раз. К примеру Delphi "таскает" всё нужное с собой в каждом исполняемом файле (с Win GUI), а по этому их размер 300-400 Кб! PowerBASIC Windows Compiler 7.0 Компилятор, создающий "полноценный" 32-битный код, не требующий ни каких внешних DLL. Может использоваться для создания DLL. Есть дополнительное приложение PowerForms, которое позволяет создавать окна , диалоги, меню и т.п. почти так же просто как и VB6.
"Чистота" exe кода файла достигается по истине Паскалевской скорпулёзностью. Подключаемые внешние библиотеки, обязательное декларирование переменных, наличие основной функции (PBMAIN), даже стыдливо спрятан оператор GOTO ! Куда катится наш старый добрый Бейсик ? Но зато посмотрите как просто используются Win API. Что бы использовать GetTickCount() в VB6 нужно писать достаточно длинную декларацию, а тут просто оптом подключил библиотеку Win32API и всё. К стати, этот компилятор нередко используют для написания DLL для VB, якобы для ускорения кода, но в моём исследовании работают программы примерно одинаково, те же 5 сек( +- трамвайная остановка), хотя размер exe значительно меньше, даже без учёта MSVBVM60.DLL , всего 10.752 Кб. Blitz3D V1.83 Позиционируется как необычайно лёгкий в использовании язык для написания 2D и 3D игр. Множественные примеры, присутствующие в комплекте, это подтверждают - игры, написанные на этом языке работают, особенно понравилась демка с птичками в каньоне - даже голова закружилась от скорости!. Но коварный бенчмарк развеял хорошее впечатление от Blitz3D буквально за 75 секунд... Именно столько выполнялся вот этот код:
Код почти стандартный, единственное отличие - используется своя функция подсчета миллисекунд. При выполнении программы нет как такового консольного окна, а его графическая эмуляция. Ну и конечно, размер в 1.2 Мб это очень много! Хотя для игрушек этот параметр не критичен. Но для простых вычислительных задач я бы вам этот компилятор не советовал... PureBasic v3.94 Этот компилятор собственно не компилятор как таковой - он не делает непосредственно байт-код, а транслирует бейсик коды в коды ассемблера, и компилируются все эти коды в Fasm подобном компиляторе. Такой подход позволяет создавать очень эффективные приложения которые по скорости работы и размерам сопоставимы с программами на Fasm, TASM, NASM. Создание программ просто, как нажатие на кнопку. Высокая скорость компилирования - 300000 строк кода в минуту на Pentium 200. Это современный, постоянно развивающийся язык. Новая версия V4 выпушена буквально весной 2006г. Поддерживаются указатели, структуры, процедуры, динамически связанные списки, при желании можно реализовать ООП, и т.п. современные атрибуты профессионального языка программирования высокого уровня. Прибавьте к этому OGRE OpenSource 3D движок, визуальный редактор и вы получите почти идеальный инструмент.
Внешние библиотеки полностью написаны в ручную на ассемблере, в результате этого некоторые функции выполняются быстрее, чем эквивалентные на С или С++. Что самое приятное, все библиотеки, как пользовательские, так и стандартной поставки подключаются автоматически, на стадии загрузки среды программирования, но в выходной exe файл будут скомпилированы только те, которые реально используются. Время выполнения бенчмарка 0.965 секунды, размер файла 5.632Кб ! Это уже можно назвать отличным результатом. FreeBASIC v0.15
FreeBASIC - это единственный в моём обзоре полностью свободный (бесплатный) 32-разрядный компилятор языка программирования Бейсик с поддержкой синтаксиса MS-QuickBASIC. В качестве проекта FreeBASIC появился в 2004 году. Основал его Andre Victor, который и является ведущим разработчиком FreeBASIC. К особенностям этого языка относятся поддержка указателей, расширенный набор встроенных типов, пользовательские типы, перегрузка функций, о поддержка инструкций на языке ассемблера (X86) и т.п., что делает FreeBASIC полноценным средством разработки программ. Приложения могут разрабатываться для 32-разрядных операционных систем: MS DOS, Windows, Linux.
Как видно из листинга, код практически не отличается от исходного. Подключив библиотеку windows.bi можно полноценно использовать WIN32API, и оконный интерфейс. Размер скомпилированного файла 29.184 Кб, но размер консольного приложения не превысит и 10 Кб, если не подключать вышеуказанную библиотеку. Время работы программы всего 0.578 сек. это абсолютный лидер моего обзора. Теперь наверное понятно, почему тест был усложнён мною в 90 тысяч раз - при меньших значениях он исполняется просто мгновенно. Выводы Осталось только распечатать сводную таблицу результатов. Я не хочу здесь делать ни каких выводов, хвалить одни языки, или ругать другие - универсального инструмента не существует, искусство программирования заключается в том, что бы в зависимости от ситуации, воспользоваться наиболее подходящим. В общем, если вдруг вам понадобиться срочно написать очень быструю программу, выбирайте Бейсик!
Виталий Крячко. 15.06.06 г. |