FreeBASIC: рожденный летать?

Дата публикации:2006
Twitter Facebook Vkontakte

Прежде чем...

Прежде чем перейти непосредственно к предмету этой публикации, оговоримся, что публикация предназначена для тех, кого по тем или иным причинам интересует тема программирования на языке Бейсик. Делаете ли вы первые шаги в программировании; используете ли вы Бейсик как подручное средство для проведения расчетов (экономических, радиотехнических, статистических и т.п.); собираетесь ли вы приступить к созданию полноценных приложений под Windows, Linux или DOS, но вас не удовлетворяют возможности "классического" Бейсика; программируете ли вы на коммерческом варианте Бейсика, но хотели бы избавиться от необходимости пользоваться нелицензионными копиями, -- в этих и многих других случаях вас может заинтересовать и вам может помочь FreeBASIC. Пожалуй, не стоит читать эту статью лишь тем, кто страдает стойкой формой неприятия Бейсика как языка программирования высокого уровня.

Первые штрихи

FreeBASIC - это не только открытый, но и полностью свободный (бесплатный) 32-разрядный компилятор языка программирования Бейсик с поддержкой (насколько это возможно) синтаксиса MS-QuickBASIC. В качестве проекта FreeBASIC появился в 2004 году. Основал его Andre Victor, который и является ведущим разработчиком FreeBASIC.

FreeBASIC распространяется на условиях лицензии GNU General Public License (GPL) и на официальном сайте доступны исходные коды компилятора и run-time библиотеки. Как и сам компилятор, так и входящие в его состав библиотеки написаны на самом FreeBASIC. По состоянию на март 2006 г. существуют две версии компилятора:

  1. версия 0.15 является стабильной и рекомендована для использования;
  2. версия 0.16 является тестовой и рекомендована для бета-тестирования.

Кроме обычных для Бейсика элементов языка, в этом компиляторе реализован ряд возможностей, существенно расширяющих базовый синтаксис . Речь идет о поддержке указателей, о расширенном наборе встроенных типов, о пользовательских типах, о перегрузке функций, о поддержке инструкций на языке ассемблера (X86) и о многом другом, что делает FreeBASIC полноценным средством разработки программ. Приложения могут разрабатываться для 32-разрядных операционных систем: MS Windows, Linux и DOS.

Компилятор FreeBASIC позволяет создавать бинарные файлы различных форматов: OBJ, LIB, DLL, а также EXE (например, консольные и GUI-приложения для Win32). Так, для создания статической или динамической библиотеки достаточно добавить лишь один ключ в командную строку компилятора: -lib или -dll.

Все компоненты FreeBASIC (в том числе и сторонних разработчиков) являются свободными (то есть не предусматривают лицензионных сборов за их использование в коммерческих или некоммерческих целях), исключая только библиотеку GoRC для Win32. Ассемблер, компоновщик, архиватор и другие утилиты, входящие в инсталляционный пакет, взяты из GNU binutil programming tools.

Замечание: Все ссылки, необходимые для загрузки инсталляционного пакета с официального сайта собраны в заключительном разделе статьи.

Подробности...

Дальше речь пойдет исключительно о специфических возможностях FreeBASIC, которые и превращают его из языка программирования, созданного для учебных целей, в средство разработки приложений. Стоит сразу сказать, что FreeBASIC концептуально в нынешнем своем виде относится к средствам структурного программирования, то есть не имеет специализированных элементов языка, поддерживающих объектно-ориентированное программирование (хотя объектно-ориентированный подход -- это своего рода мировоззрение и никакие ограничения на языковом уровне ему не страшны, но все же для ООП лучше выбрать что-нибудь другое). В то же время FreeBASIC сохранил всю легкость и прозрачность построения кода, которые и сделали его столь популярным среди тех, кто совершает первые шаги в программировании .

Новые встроенные типы данных

Расширен базовый набор типов, которые поддерживает компилятор FreeBASIC. Так, теперь программисту доступны:

  • Подмножество целочисленных типов - BYTE, UBYTE, SHORT, USHORT, INTEGER, UINTEGER, LONGINT и ULONGINT (64-разряда).
  • Два вещественных типа - SINGLE и DOUBLE.
  • Строковые типы: фиксированной длины (STRING *), переменной длины (STRING) или строки с завершающим нулевым байтом (ZSTRING), потенциально размером до 2Гб). Строки могут рассматриваться как массивы символов, с которыми удобно работать при помощи индексов:
     DIM text AS STRING
     text = "BAR"
     print text[0]
    
  • Строки в формате Unicode - WSTRING. Этот тип подобен строкам с завершающим нулевым байтом, но для каждого символа предусмотрено два байта (wide characters). Поддержка Unicode-строк позволяет использовать в программах FreeBASIC Unicode-версии функций из Windows API . Все строковые функции из run-time библиотеки (например, LEFT, TRIM и т.д.) могут работать и с wide-строками. Файлы в кодировке UTF-8, UTF-16LE and UTF-32LE могут быть прочитаны при помощи INPUT # или LINE INPUT # и записаны при помощи PRINT # или WRITE #. Все преобразования из Unicode в ASCII (и обратно) при необходимости могут выполняться автоматически.
  • Перечисления (ENUM). Вот пример объявления перечисляемого типа:
     ENUM MyEnum
     A
     B = 3
     C
     END ENUM
     DIM E AS MyEnum
     E = C
    
  • Типы данных, определяемые пользователем (UDT). Этот тип напоминает тип struct в языке C. Описание пользовательского типа данных помещается между ключевыми словами TYPE и END TYPE или между UNION и END UNION. Допускается определение пользовательского типа внутри определения типа и глубина таких вложений теоретически ничем не ограничена. В качестве полей (членов) пользовательского типа могут быть переменные любого базового типа, битовые поля, массивы (размерностью не более 4), а также функции.
     TYPE MyType
     A AS SHORT
     B AS INTEGER
     C AS LONG
     D AS OtherUDT
     UNION
     E AS DOUBLE
     F AS SINGLE
     G AS OtherUDT
     END UNION
     H AS BYTE
     MyFunction AS FUNCTION (BYVAL ArgumentA AS INTEGER) AS INTEGER
     flag_0 : 1 as integer
     flag_1 : 1 as integer
     END TYPE
    

Работа с массивами

FreeBASIC поддерживает расширенный набор действий с массивами:

  • Программист может использовать и статические, и динамические массивы, при этом поддерживается неограниченная размерность массива (то есть неограниченное число индексов).
  • Максимальный размер массива составляет 2 Гб.
  • Индекс массива может изменяться в произвольных границах.
  • При помощи оператора REDIM PRESERVE можно переопределить размер динамических массивов с сохранением их содержимого.

Совместимость с синтаксисом языка Бейсик

FreeBASIC - это не новый диалект языка Бейсик. Достаточно знать один из вариантов Бейсика от Microsoft (например, QuickBASIC или Visual Basic), чтобы программировать на FreeBASIC.

Компилятор FreeBASIC является нечувствительным к регистру символов. Имена переменных скалярных типов могут содержать суффиксы для указания типа переменных(как это было в классическом Бейсике), также поддерживается нумерация строк и нет необходимости в функции MAIN.

Большинство операторов и функций для работы с графикой и консолью, которые были реализованы в QuickBASIC, поддерживаются FreeBASIC, что облегчает перенос программ, разработанных при помощи QuickBASIC.

Синтаксис FreeBASIC был расширен небольшим количеством ключевых слов. Новые функции реализованы в виде библиотек, что снижает вероятность совпадения имен при переносе старых программ на FreeBASIC. Например, использование функции MessageBox в Windows будет выглядеть так:

 '$include: 'windows.bi'
 MessageBox NULL, "Text", "Title", MB_ICONASTERISK

Замечание: поскольку синтаксис FreeBASIC допускает вольное обращение с регистром символов, то можно при желании использовать:

MESSAGEBOX NULL, "Text", "Title", MB_ICONASTERISK

Встроенная библиотека функций работы с графикой (gfx-библиотека)

Библиотека графических функций FreeBASIC полностью совместима с графическими функциями из QuickBasic (CIRCLE, DRAW, LINE, PAINT и т.д.), но предоставляет программисту гораздо больше возможностей и является более гибкой и быстрой (для ускорения работы используются инструкции mmx, если они поддерживаются процессором).

Функции графической библиотеки FreeBASIC могут напрямую обращаться к видео-памяти, оперировать любой глубиной цвета, любым разрешением экрана и поддерживают работу с любым количеством экранных страниц. Функции отрисовки могут работать как с активной страницей, так и со скрытыми (неактивными) страницами любого размера (GET/PUT ).

Существуют функции работы со спрайтами, например, возможны следующие действия: отсечение, изменение прозрачности, alpha и custom blending). Кроме того, реализована загрузка и сохранение изображений в формате .bmp (BLOAD, BSAVE).

FreeBASIC позволяет практически напрямую работать с функциями OpenGL, для этого в дистрибутив включены необходимые заголовочные файлы и библиотеки , а также несколько примеров работы с OpenGL.

В графическую библиотеку FreeBASIC дополнительно включены Функции поддержки клавиатуры, мыши и джойстика.

При использовании функций графической библиотеки размер исполняемого файла увеличивается лишь на 30-40 Кб (а без этих функций размер простого оконного приложения под Win32 составляет около 10 Кб). При этом никаких дополнительных библиотек (dll) для сопровождения программы не требуется (достаточно тех библиотек, которые входят в состав операционной системы).

Библиотека графических функций(как и весь FreeBASIC) является многоплатформенной: под Windows используется DirectX или GDI (если DirectX не установлен) под DOS используется прямой доступ к VGA/ModeX/VESA, под Linux -- raw Xlib.

Поддержка средств отладки

FreeBASIC позволяет отлаживать программы. Эта возможность реализована при помощи GDB (GNU debugger) или Insight (GUI-надстройки для GDB).

При включенной опции -exx в командной строке компилятора, FreeBASIC осуществляет проверку индексов массивов на предмет выхода за границы допустимых значений, а также осуществляет контроль Null указателей .

Обработка Escape последовательностей

Escape последовательности обрабатываются так же, как в языке C. Разница состоит лишь в том, что числовое значение после обратного лсэша интерпретируется как десятичное, а не как восьмеричное. Можно воспользоваться инструкцией OPTION ESCAPE, чтобы включить такую обработку escape последовательностей:

'Без обработки символов Escape
 PRINT "First line"+CHR$(13)+CHR$(10)+"Second line"
'С обработкой символов Escape
 OPTION ESCAPE
 PRINT "Firstline\r\nSecond line"

Перегрузка функций

FreeBASIC включает в сигнатуру функции еще тип и количество аргументов, что позволяет осуществлять перегрузку функций так же, как, например, в языке C++. Отличие состоит в том, что при объявлении первого варианта перегружаемой функции необходимо использовать ключевое слово OVERLOAD:

 DECLARE SUB Test OVERLOAD (a AS DOUBLE)
 DECLARE SUB Test (a AS SINGLE)
 DECLARE SUB Test (a AS INTEGER, b AS INTEGER = 1234)
 DECLARE SUB Test (a AS BYTE, b AS SHORT)

Встраиваемые ассемблерные инструкции

В текст программы можно добавлять ассемблерные инструкции (спецификация Intel для семейства x86). Это более удобно, чем размещение в тексте программы шестнадцатиричных (или десятичных) кодов операций. В ассемблерных инструкциях можно использовать имена переменных. Ограничения накладываются лишь на инструкции, выполнение которых запрещено в защищенном режиме.

Ассемблерные инструкции помещаются на отдельных строках после ключевого слова ASM или между ключевыми словами ASM и END ASM.

Поддержка наиболее известных открытых библиотек

FreeBASIC может использовать большинство известных библиотек, написанных на языке C, и не требует для этого промежуточные функции-обертки. Заголовочные файлы и примеры работы с такими библиотеками входят в состав дистрибутива версии 0.15. Вот список поддерживаемых библиотек (ссылки на сайты разработчиков этих библиотек можно найти на официальном сайте FreeBASIC в разделе Links):

  • GTK+ 2.0: кросс-платформенные GUI Toolkit (более 1Мб заголовочных файлов, включая поддержку Glade, libart и glGtk)
  • libxml и libxslt: XML и XSL библиотеки, ставшие стандартом де-факто.
  • GSL - GNU Scientific library: комплексные числа, векторы, матрицы, быстрое преобразование Фурье, линейная алгебра, статистика, сортировка, дифференциальные уравнения и множество других математических подпрограмм.
  • GMP - GNU Multiple Precision Arithmetic Library: известна, как самая быстрая библиотека для работы с большими числами.
  • SDL - Simple DirectMedia Layer: библиотека для работы с мультимедиа (звук, пользовательский ввод, 3D и 2D графика и т.д.
  • OpenGL: портируемая библиотека для создания интерактивных игр и программ с использованием 2D и 3D графики.
  • Allegro: библиотека для создания игр (графика, звук, пользовательский ввод).
  • GD, DevIL, FreeImage, GRX и другие графические библиотеки.
  • OpenAL, Fmod, BASS: 2D и 3D звуковые библиотеки, поддерживающие форматы mod, mp3, ogg, и т.д.
  • ODE и Newton: библиотеки для моделирования динамики твердых тел.
  • cgi-util и FastCGI: разработка web-приложений.
  • DirectX и Windows API - самый полный набор заголовочных файлов (среди известных компиляторов Бейсика), включая функции для работы с Unicode.
  • DispHelper: работа с COM IDispatch интерфейсами.
  • И многое другое...

Аргументы функции по умолчанию

Для целочисленных, вещественных и строковых аргументов поддерживается присваивание значений по умолчанию при вызове функций:

 DECLARE SUB Test(a AS DOUBLE = 12.345, BYVAL b AS BYTE = 255, BYVAL s AS STRING = "abc")
 Test
 Test , 128
 Test ,
 Test 44,
 Test 44
 Test ( )

Указатели

FreeBASIC предоставляет программисту возможность работать с указателями в стиле языков C и C++ (отличие лишь в том, что для обозначения операции взятия адреса вместо символа "&" используется символ "@"). Поддерживаются указатели на все базовые типы, а также на типы, определяемые пользователем, массивы и функции.

FreeBASIC поддерживает арифметику указателей и допускает неограниченное число уровней иерархии указателей, то есть указатель на указатель, который является указателем на указатель, который... и так далее.

Для указания того, что переменная является указателем, в ее описании после типа добавляют ключевое слово ptr или pointer. Для указателей поддерживается операция приведения типов:

 cptr(byte ptr, intptr) += 1
 cptr(myudt1 ptr, @udt2)->foo = *cptr(integer ptr, bar)

Preprocessor

FreeBASIC поддерживает обработку директив препроцессора, которые позволяют выполнять условную компиляцию, подключать необходимые файлы, создавать макросы и многое другое. В большинстве случаев директивы препроцессора напоминают синтаксис, принятый в языке C:

 #DEFINE SOMEDEF 1234
 #DEFINE OTHERDEF 5678
 #IFDEF SOMEDEF
 # IF NOT DEFINED(OTHERDEF)
 # DEFINE OTHERDEF SOMEDEF
 # ELSE
 # IF OTHERDEF <> SOMEDEF
 # UNDEF OTHERDEF
 # DEFINE OTHERDEF SOMEDEF
 # ENDIF
 # ENDIF
 #ELSE
 # DEFINE OTHERDEF 5678
 #ENDIF
 #PRINT OTHERDEF

Вот пример объявления макроса:

 #DEFINE bar(x,y) ((x) * (y))
 #DEFINE foo(x,y) bar(x-y,y-x)
 a = foo(b, c)

Неограниченные имена переменных и функций

Компилятор FreeBASIC способен "переварить" исходный код размером до 2 Гб. Причем длина имен переменных, констант и функций ограничена лишь размером памяти, доступной во время компиляции программы.

Инициализация переменных

FreeBASIC поддерживает инициализацию переменных (то есть присваивание начальных значений при объявлении переменной), в том числе и для массивов, и для переменных пользовательских типов, и для статических, модульных и локальных переменных.

DIM flat as Integer = 5
DIM array(1 to 2, 1 to 5) as Integer => {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}}

Состав дистрибутива

Договоримся, что в дальнейшем речь будет идти о FreeBASIC версии 0.15 для платформы Win32. Размер инсталляционного пакета этой версии составляет чуть больше четырех мегабайт (4.27 Мб). В состав пакета входят следующие компоненты:

  • bin -- папка, в которой находятся ассемблер, компоновщик и другие файлы, необходимые для компиляции программ.
  • docs -- папка с текстовыми файлами. Это тексты лицензионных соглашений, относящихся к компонентам FreeBASIC, а также описание библиотеки графических функций и список ключевых слов. Не стоит искать в этой папке полный пакет документации, его нужно загрузить с официального сайта отдельно.
  • examples -- папка с примерами программ на FreeBASIC. Здесь представлены примеры работы с функциями FreeBASIC, со многими свободно распространяемыми библиотеками, а также примеры приложений для Win32 (examples/Windows).
  • inc -- папка с файлами заголовков.
  • lib -- папка с файлами библиотек.
  • В корне папки FreeBASIC расположены компилятор fbc.exe, который и следует запускать для компиляции bas-файлов, текстовые файлы readme.txt и changelog.txt (хронология последних изменений), а также ссылки на официальный сайт и тематический форум FreeBASIC.

Установка

На официальном сайте проекта в разделе Download можно загрузить нужный дистрибутив, выбрав тот вариант, который подходит для соответствующей операционной системы. Инсталляционный пакет для Win32 представляет собой исполняемый файл (exe), при запуске которого появляется диалог мастера установки. Во время установки пользователь должен указать папку, куда будет установлен пакет (по умолчанию это "C:\Program Files\FreeBASIC\"), а также выбрать тип установки. Рекомендуется во всех диалогах принимать параметры по умолчанию (то есть нажимать кнопку "Next").

Создание исходного кода и компиляция программ

В состав пакета FreeBASIC не входит интегрированная среда разработки, что позволяет программисту решить вопрос о способах написания исходного кода по своему усмотрению. На сайте FreeBASIC представлены два текстовых редактора и одна интегрированная среда, которые можно использовать для разработки приложений (все программы бесплатны). Подбирая текстовый редактор или интегрированную среду разработки, программист должен учитывать, что, кроме файлов в кодировке ASCII с Unicode escape последовательностями (\u), FreeBASIC может обрабатывать исходные (.bas) и заголовочные (.bi) файлы, созданные в кодировках UTF-8, UTF-16LE, UTF-16BE, UTF-32LE и UTF-32BE , которые могут безконфликтно сосуществовать в одном проекте(и с файлами ASCII). Это позволяет использовать в программе строковые константы и комментарии, состоящие из символов национальных алфавитов, но только при условии, что выбранный пользователем текстовый редактор поддерживает хотя бы одну из вышеназванных кодировок.

Компилятор FreeBASIC представляет собой программу, запускаемую из командной строки и имеющую ряд ключей, которые управляют процессом компиляции. Можно создать пакетный файл (bat-файл), в который поместить командную строку для запуска компилятора с нужными ключами.

Рассмотрим процесс компиляции на примере создания простого GUI-приложения для Win32. Файл с исходным кодом такого приложения можно взять из папки примеров, входящих в состав FreeBASIC. Скопируйте файл fileopen.bas из папки "C:\Program Files\FreeBASIC\examples\Windows\gui\" (предполагается, что FreeBASIC был установлен в папку "C:\Program Files") в папку, где будут располагаться ваши проекты (например, "D:\MyProgs\"). Можно компилировать исходные коды примеров непосредственно в той папке, куда они были помещены в процессе установки FreeBASIC, но если вы собираетесь менять исходный код, то лучше работать с копиями этих примеров в отдельной папке.Для компиляции GUI-приложения под Win32 достаточно в папке с вашими проектами создать bat-файл (например, make.bat) следующего содержания:

set app=fileopen.bas
"%ProgramFiles%\FreeBasic\fbc.exe" -s gui %app% 
if errorlevel 1 pause

Если возникнет сообщение об ошибке, то вывод на экран будет происходить порциями с ожиданием нажатия клавиши. Это позволит прочитать сообщение скринридером (например, Jaws for Windows -- следует только переключиться на Jaws-курсор).

Вывод сообщений об ошибках можно перенаправить в текстовый файл, который после компиляции можно прочитать в текстовом редакторе (если сообщений об ошибках не будет, то файл останется пустым). Сделать это можно так:

set app=fileopen.bas
"%ProgramFiles%\FreeBasic\fbc.exe" -s gui %app% > errors.txt

Запустите один из этих bat-файлов и, если не будет ошибок, в папке появится файл fileopen.exe. Ваше первое приложение на FreeBASIC готово к запуску. Скорее всего, размер получившегося исполняемого файла (exe) вас приятно удивит. Дальнейшие эксперименты с примерами на FreeBASIC вы можете выполнять самостоятельно.

Ссылки по теме

  1. www.freebasic.net - Официальная траница проекта На этой странице рекомендуется посетить не только раздел Download, но и разделы ссылок и галерею проектов (преимущественно игровых), разрабатываемых с использованием FreeBASIC.
  2. Прямая ссылка для загрузки инсталляционного пакета FreeBASIC версии 0.15 для Win32. Ссылка предназначена для тех, кто не желает в поисках нужной ссылки пройти по двум-трем страницам на sourceforge. Однако рекомендуется все же использовать ссылки на официальной странице проекта.
  3. Документация к FreeBASIC в формате chm (~500 Кб). По поводу актуальности этой ссылки см. комментарий в предыдущем пункте.
  4. Русскоязычное сообщество любителей FreeBASIC


Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2017