FreeBASIC диалекты
 

В FreeBASIC версии 0.17b введен параметр командной строки -lang , используемый для изменения режима совместимости языка для разных диалектов основного языка.

Начиная с версии 0.18.3b  -lang qb диалект был ограничен тем функционалом, который используется только в QuickBASIC.

В версии 0.18.4b был добавлен  -lang fblite диалект . Он предназначен для замены -lang deprecated в будущем.

В версии 0.20.0b  #lang директива и $Lang метакоманда были добавлены, чтобы указать диалект в исходном файле.

-lang опцияописание
fb FreeBASIC совместимость (по умолчанию)
qbqbasic совместимость
fbliteFreeBASIC совместимость, с QBASIC-совместимым стилем кодирования
deprecated совместимый с версией FB 0.16


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

Для компиляции старых GW-BASIC или QuickBASIC/QBasic исходников, требуется не слишком много изменений, используя опцию -lang qb в командной строке при запуске fbc. Эта опция будет развиваться для лучшей совместимости с QuickBASIC / QBasic кодом.

Для компиляции FreeBASIC исходников, из версии 0.16b, используйте -lang deprecated опцию. Эта опция поддерживается для совместимости и не будет развиваться в будущем, и вероятно исчезнет, ​​когда FreeBASIC перестанет быть в качестве бета-версии.

Для программистов, которые хотят получить доступ к некоторым из новых возможностей FreeBASIC, но хотят сохранить QBasic стиль программирования, предназначена -lang fblite опция. Этот диалект не претерпит существенных изменений в будущем, но будет по-прежнему поддерживаться.

Эта опция также наиболее совместима с исходниками, которые были написаны в ранних версиях FreeBASIC.

Рекомендуется использовать -lang fb для новых проектов, потому как новые возможности (классы, наследование ..) будут добавлены исключительно в этом диалекте.


-lang fb (режим по умолчанию)
Не поддерживается:

1) Неявное объявление переменной
    • Все переменные должны быть явно объявлены, используя Dim, ReDim, Var, Const, Extern или Common.

2) Суффиксы (!, #, $, %, &)
    • Они допускаются только для числовых литералов, но рекомендуется использовать Cast или f (single), d (double), ll (longint), ul (uinteger), ull (ulongint) числовые литеральные суффиксы, чтобы разрешить перегрузку.

    • Явный тип ("As T") необходим при объявлении переменных с помощью Dim, ReDim, Extern или Common. Переменные, объявленные с помощью Var или Const имеют свои типы, исходя из значения инициализации (явный тип не является обязательным с использованием Const).

4) все параметры, передаваемые по ссылке по умолчанию
    • По умолчанию, все внутренние скалярные типы - числовые и указатели - передаются по значению (ByVal). Любой другой тип - String или пользовательский тип - передается по ссылке (ByRef).
    • Используя параметр -w pedantic в командной строке, имеется возможность отслеживать написанные параметры без явного ByVal или ByRef указаний.

5) OPTION(ы) любого вида (нет контекстно-чувствительности)
    • Вместо Option NoKeyword, используйте #undef.
    • Вместо Option Escape, используйте: !"some esc seq \n\r" (обратите внимание на '!' символ) . Параметр -w pedantic проходит для проверки возможных управляющих последовательностей.
    • Option Explicit не используется, см. пункт 1.
    • Вместо Option Dynamic,  массивы переменной длины объявляются с помощью ReDim. Dim так же может быть использован для объявления массивов переменной длины, но в указании размерности должна быть либо переменная, либо совсем не указывать индекс.
    • Вместо Option Base, использовать явную нижнюю границу индексов в декларациях массивах .
    • Вместо Option Private, используйте Private для описания процедур с внутренней связью.
    • Вместо Option Gosub или Option Nogosub, используйте процедуры Sub или функции Function.

6) периоды в символах имен
    • Используйте пространства имен вместо этого.
    • Вложенные процедуры могут быть разрешены в будущем.

    • Используйте SELECT CASE.

9) Resume
    • Большинство RinTime процедур и графическая библиотека теперь возвращают код ошибки, например: IF OPEN( "text" FOR INPUT AS #1 ) <> 0 THEN error...

10) '$DYNAMIC, '$STATIC, '$INCLUDE мета-команды, встроенные в комментарии
    • См. пункт 5 о Option Dynamic.
    • Используйте #include "filename" вместо '$include.

11) Call или Let
    • Просто удалите их.

12) Числовые метки
    • Без комментариев.

13) Глобальные символы с тем же именем как и у ключевых слов
    • Объявить их внутри пространства имен.


-lang deprecated

Поддерживается: Все, что разрешено в версии 0.16b, но:

1) GOSUB/RETURN и ON ... GOSUB (даже на уровне модуля)
    • Реализация GOSUB может быть небезопасным потоком в -lang qb режиме, позволяя быстрое выполнение (-lang qb  не поддерживает многопоточность, в то время как -lang deprecated поддерживает).

Не поддерживается:

1) Классы
    • Периоды, разрешенные в символах имен делают это слишком сложно и / или неоднозначно.

2) Перегрузка операторов
    • Периоды, разрешенные в символах имен делают это слишком сложно и / или неоднозначно.

3) Конструкторы, деструкторы и методы в типах.
    • Периоды, разрешенные в символах имен делают это слишком сложно и / или неоднозначно.


-lang fblite

Поддерживается: Все что в -lang deprecated диалекте, плюс..

1) GOSUB/RETURN
- Используя Option Gosub включения. Это отключит RETURN для выхода из процедуры, в связи с неоднозначностью.

Не поддерживается:

1) Scope блоки
    • Всем переменным выдается область процедуры. Явный Scope блок может быть добавлен позже.

-lang qb
Поддерживается: Все что не поддерживается/не допускается в -lang fb диалекте, плюс..

1) Call могут быть использованы для ссылок функций.

2) Shared видны внутри функций. (W.I.P.)

3) Все переменные, явно или неявно объявленные, всегда выделяется в рамках процедуры , как в QuickBASIC.

4) Оператор Data не будет искать символы, каждый токен считается символьной строкой даже без кавычек, как в QuickBASIC.


Не поддерживается:

1) Многопоточность
    • Ни одна из процедур  threading не могут быть использованы..

2) Классы и пространства имен

3) Перегрузка функций и операторов

4) Конструкторы, деструкторы и другие процедуры-методы в Type объявлениях.

5) Scope блоки

6) Extern блоки

7) Инициализация переменных
    • Все переменные перемещены в область процедуры (как в QuickBASIC), делая инициализацию локальных переменных слишком трудным, чтобы поддерживать.