" О бедном Basic замолвите слово!"
Бейсик повзрослел! Готов поспорить, что без языка Бейсик фирма Microsoft никогда не достигла бы тех вершин, на которых она сейчас находится. Прези- дент фирмы Билл Гейтс начал свою профессиональную карьеру в прог- раммировании, создав интерпретатор Бейсика для одного из самых первых персональных компьютеров, и уже не смог остановиться. Есть люди, которые все еще считают, что слово "профессиональ- ный" серьезно не может быть применено к какой-либо системе прог- раммирования на Бейсике. Вот ведь и название его расшифровывается как Универсальный Символьный Код для Начинающих (Beginners All purpose Symbolic Instruction Code). Мне кажется, что этот взгляд несколько устарел, хотя бы в свете широкого диапазона средств, предлагаемых новым компилятором. Выпустив недавно седьмую версию системы Microsoft Basic Professional, фирма Microsoft хочет показать, что Бейсик по-преж- нему остается серьезным претендентом на звание "профессионального" языка программирования. Дэйв Джюэл |
Статью Дейва Джюэла "Бейсик
повзрослел!" я прочитал в прошлом веке, где то в начале 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 г. У неё два автора В.Ф. Очков и В.А. Хмелюк. В
конце первой части, которую написал Хмелюк, есть пример программы
"Бенчмарк", написанный на Бейсике. Вот его исходный вариант:
10 REM БЕНЧМАРК 20 PRINT "НАЧАЛО" 30 K=0 40 Dim M(5) 50 K=K+l 60 A=K/2*3+4-5 70 G0SUB 140 80 For L=1 To 5 90 M(L)=A 100 Next L 110 If K<1000 THEN 50 120 PRINT "КОНЕЦ" 130 End 140 Return |
По данным из этой же книги интерпретатор
Бейсика СМ-1800 отрабатывает эту программу за 104 сек. Но как
говориться, с той поры много времени утекло, компьютеры стали быстрее, а
Бейсик, как мы выяснили, повзрослел. Но было очень интересно проверить
быстродействие компиляторов именно при помощи этого теста, изменив его с учетом
вышеизложенного. Путем нескольких пробных вариантов приемлемое время выполнения
программы установлено при изменении 110 строки к виду If K<90000000 THEN
50. В тестах использовался компьютер на базе процессора AMD
ATHLON 64 3000+(1800MHz, 512 k, Socket 939).
В тестах использовались следующие компиляторы языка Бейсик:
- Microsoft QuickBasic v4.5
- Microsoft Visual Basic v6.0
- FreeBASIC v0.15
- PowerBASIC Windows Compiler 7.0
- PureBasic v3.94
- Blitz3D V1.83
Исключительно для сравнительного анализа текст этого бенчмарка
был перенесён еще на два популярных компилятора - Microsoft Visual С++ v6.0 и
Delphi v7, причем максимально приближённо к Бейсику, на сколько это было
возможно для синтаксиса этих языков.
Microsoft
QuickBasic v4.5
Эта версия компилятора, единственная в моём обзоре, среда
разработки и исполняемый exe код которой предназначалась для DOS. Код бенчмарка
можно было не менять вообще - QuickBasic поддерживает работу с
номерами строк. Единственное изменение в коде, которое не влияет на скорость
работы, это замер времени выполнения бенчмарка. Возможно Бейсик в СМ
-1800 не работал с таймером, а возможно по другим причинам, скорость работы
программы измеряли по наручным часам.
REM БЕНЧМАРК PRINT "НАЧАЛО" start = TIMER K = 0 DIM M(5) t50: K = K + L A = K / 2 * 3 + 4 - 5 GOSUB g140 FOR L = 1 TO 5 M(L) = A NEXT L IF K < 90000000 THEN GOTO t50 finis = TIMER - start PRINT "КОНЕЦ - " + STR$(finis) INPUT ; q END g140: RETURN |
Оператор INPUT служит только для того, что бы
окошко DOS программы не закрывалось самостоятельно в среде Windows. Следует
отметить, что этот бенчмарк под управлением DOS работает примерно на 15%
быстрее. Время работы программы составило 56 сек. По сравнению с СМ
-1800 не плохо, если ещё учесть, что задача усложнилась в 90 тысяч раз!
Microsoft
Visual Basic v6.0
Пожалуй, это самый популярный из современных Бейсиков.
Дружественная среда разработки позволяет очень быстро писать программы с
современным интерфейсом. В виду того, что консольное приложение не является
основным для VB6, и для его создания пришлось бы использовать Win
API, пришлось создать обыкновенное оконное.
Rem БЕНЧМАРК Dim K As Long, L As Long, A As Long Dim M(5) As Long Private Sub Command1_Click() Print "Start" start = Timer K = 0 50 K = K + L A = K / 2 * 3 + 4 - 5 GoSub 140 For L = 1 To 5 M(L) = A Next L If K < 90000000 Then GoTo 50 finis = Timer - start Print "End - " + Str$(finis) Exit Sub 140 Return End Sub |
Как видно из листинга программы код практически не изменился.
Для запуска бенчмарка на форме нарисована кнопка 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.
REM bencm #COMPILE EXE #DIM ALL #INCLUDE "Win32API.inc" FUNCTION PBMAIN () AS LONG LOCAL K AS LONG LOCAL A AS LONG LOCAL L AS LONG LOCAL TimeGO AS LONG LOCAL timeEnd AS LONG MSGBOX ("Начать?") timeGo=GetTickCount() K=0 DIM M(5) AS LONG g50: K=K+1 A=K/2*3+4-5 GOSUB proc1 FOR L=1 TO 5 M(L)=A NEXT L IF K<90000000 THEN g50 timeEnd=GetTickCount() - timeGO MSGBOX ("Конец - "+ STR$(timeEnd)+" ms") proc1: RETURN END FUNCTION |
"Чистота" exe кода файла достигается по истине
Паскалевской скорпулёзностью. Подключаемые внешние библиотеки, обязательное
декларирование переменных, наличие основной функции (PBMAIN), даже
стыдливо спрятан оператор GOTO ! Куда катится наш старый добрый Бейсик ? Но
зато посмотрите как просто используются Win API. Что бы
использовать GetTickCount() в VB6 нужно писать достаточно
длинную декларацию, а тут просто оптом подключил библиотеку Win32API и
всё. К стати, этот компилятор нередко используют для написания DLL для
VB, якобы для ускорения кода, но в моём исследовании работают программы
примерно одинаково, те же 5 сек( +- трамвайная остановка), хотя размер exe
значительно меньше, даже без учёта MSVBVM60.DLL , всего 10.752 Кб.
Blitz3D V1.83
Позиционируется как необычайно лёгкий в использовании язык для
написания 2D и 3D игр. Множественные примеры, присутствующие в комплекте,
это подтверждают - игры, написанные на этом языке работают, особенно
понравилась демка с птичками в каньоне - даже голова закружилась от скорости!.
Но коварный бенчмарк развеял хорошее впечатление от Blitz3D
буквально за 75 секунд... Именно столько выполнялся вот этот код:
Print "Start" Newtimer=MilliSecs() k = 0 Dim M(5) .g50 k=k + 1 a=k/2*3+4-5 Gosub s140 For l=1 To 5 M(l)=a Next If k<90000000 Then Goto g50 Lasttimer=MilliSecs() - Newtimer Print "End " + Lasttimer q= Input("Press Enter") End .s140 Return |
Код почти стандартный, единственное отличие
- используется своя функция подсчета миллисекунд. При выполнении программы
нет как такового консольного окна, а его графическая эмуляция. Ну и конечно,
размер в 1.2 Мб это очень много! Хотя для игрушек этот параметр не
критичен. Но для простых вычислительных задач я бы вам этот компилятор не
советовал...
PureBasic v3.94
Этот компилятор собственно не компилятор как таковой - он не
делает непосредственно байт-код, а транслирует бейсик коды в коды ассемблера, и
компилируются все эти коды в Fasm подобном компиляторе. Такой подход
позволяет создавать очень эффективные приложения которые по скорости работы и
размерам сопоставимы с программами на Fasm, TASM, NASM. Создание программ
просто, как нажатие на кнопку. Высокая скорость компилирования - 300000 строк
кода в минуту на Pentium 200. Это современный, постоянно развивающийся язык.
Новая версия V4 выпушена буквально весной 2006г. Поддерживаются указатели,
структуры, процедуры, динамически связанные списки, при желании можно
реализовать ООП, и т.п. современные атрибуты профессионального языка
программирования высокого уровня. Прибавьте к этому OGRE OpenSource 3D движок,
визуальный редактор и вы получите почти идеальный инструмент.
;БЕНЧМАРК OpenConsole() PrintN ("Nacalo") timeGo=GetTickCount_() K=0 Dim M(5) g50: K=K+l A=K/2*3+4-5 Gosub r140 For L=1 To 5 M(L)=A Next L If K<90000000: Goto g50:EndIf timeEnd=GetTickCount_()-timeGO PrintN ("End - " + Str(timeEnd) + " ms") Input() CloseConsole() End r140: Return |
Внешние библиотеки полностью написаны в ручную на ассемблере,
в результате этого некоторые функции выполняются быстрее, чем эквивалентные на
С или С++. Что самое приятное, все библиотеки, как пользовательские, так и
стандартной поставки подключаются автоматически, на стадии загрузки среды
программирования, но в выходной exe файл будут скомпилированы только те,
которые реально используются. Время выполнения бенчмарка 0.965 секунды,
размер файла 5.632Кб ! Это уже можно назвать отличным результатом.
FreeBASIC v0.15
FreeBASIC - это единственный в моём обзоре полностью
свободный (бесплатный) 32-разрядный компилятор языка программирования Бейсик с
поддержкой синтаксиса MS-QuickBASIC. В качестве проекта FreeBASIC
появился в 2004 году. Основал его Andre Victor, который и является ведущим
разработчиком FreeBASIC. К особенностям этого языка
относятся поддержка указателей, расширенный набор встроенных
типов, пользовательские типы, перегрузка функций, о поддержка
инструкций на языке ассемблера (X86) и т.п., что делает FreeBASIC
полноценным средством разработки программ. Приложения могут разрабатываться для
32-разрядных операционных систем: MS DOS, Windows, Linux.
#include once "windows.bi" REM БЕНЧМАРК rem start = TIMER start = GetTickCount() PRINT "Start" K = 0 DIM M(5) 50 K = K + L A = K / 2 * 3 + 4 - 5 GOSUB 140 FOR L = 1 TO 5 M(L) = A NEXT L IF K < 90000000 THEN GOTO 50 finis = GetTickCount() - start PRINT "End - " + STR$(finis) INPUT "?", q END 140 RETURN |
Как видно из листинга, код практически не отличается от
исходного. Подключив библиотеку windows.bi можно полноценно
использовать WIN32API, и оконный интерфейс. Размер скомпилированного файла
29.184 Кб, но размер консольного приложения не превысит и 10 Кб, если не
подключать вышеуказанную библиотеку. Время работы программы всего 0.578 сек.
это абсолютный лидер моего обзора. Теперь наверное понятно, почему тест был
усложнён мною в 90 тысяч раз - при меньших значениях он исполняется просто
мгновенно.
Выводы
Осталось только распечатать сводную таблицу
результатов. Я не хочу здесь делать ни каких выводов, хвалить одни языки, или
ругать другие - универсального инструмента не существует, искусство
программирования заключается в том, что бы в зависимости от ситуации,
воспользоваться наиболее подходящим. В общем, если вдруг вам понадобиться
срочно написать очень быструю программу, выбирайте Бейсик!
Компиляторы
|
Операционная
система
|
Размер EXE
файла ,(Kb)
|
Время
выполнения,(cек)
|
Microsoft QuickBasic v4.5
|
DOS \ Windows XP sp2
|
34.488
|
56.13
|
Microsoft Visual Basic v6.0
|
Windows XP sp2
|
20.480
|
5.12
|
FreeBASIC v0.15
|
Windows XP sp2
|
29.184
|
0.578
|
PowerBASIC Windows Compiler 7.0
|
Windows XP sp2
|
10.752
|
5.14
|
PureBasic v3.94
|
Windows XP sp2
|
5.632
|
0.965
|
Blitz3D V1.83
|
Windows XP sp2
|
1 241.088
|
74.94
|
Microsoft Visual С++ v6.0
|
Windows XP sp2
|
192.569
|
4.0
|
Delphi v7
|
Windows XP sp2
|
16.896
|
3.33
|
Виталий Крячко.
15.06.06 г.