О бедном Basic замолвите слово!
Бейсик повзрослел! Виталий Крячко.
🕛 05.09.2006, 12:26
Готов поспорить, что без языка Бейсик фирма 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