В 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 совместимость (по умолчанию) |
qb | qbasic
совместимость |
fblite | FreeBASIC
совместимость, с 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) Неявное объявление переменной
2) Суффиксы (!, #, $, %, &)
- Они допускаются только для числовых литералов, но
рекомендуется использовать Cast
или f (single), d (double), ll (longint), ul (uinteger), ull (ulongint)
числовые литеральные суффиксы, чтобы разрешить перегрузку.
3)
DefByte,
DefUByte,
DefShort,
DefUShort,
DefInt,
DefUInt,
DefLng,
Deflongint,
Defulongint,
DefSng,
DefDbl,
DefStr
- Явный тип ("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) периоды в символах имен
- Используйте пространства имен вместо этого.
- Вложенные процедуры могут быть разрешены в будущем.
- Большинство RinTime процедур и
графическая библиотека теперь возвращают код ошибки,
например: IF OPEN( "text" FOR INPUT AS #1 ) <> 0 THEN error...
10) '$DYNAMIC, '$STATIC, '$INCLUDE
мета-команды, встроенные в комментарии
- См. пункт 5 о Option Dynamic.
- Используйте #include "filename" вместо '$include.
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), делая инициализацию локальных переменных
слишком трудным, чтобы поддерживать.