Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Harbour - это язык компьютерного программирования , который в основном используется для создания баз данных / бизнес-программ. Это модернизированный, с открытым исходным кодом и кросс-платформенная версия старой Clipper системы, которая , в свою очередь , разработанной с Dbase рынка баз данных 1980 - х и 1990 - х годов.

Код Harbor с использованием одних и тех же баз данных может быть скомпилирован на самых разных платформах, включая Microsoft Windows , Linux , варианты Unix , несколько потомков BSD , Mac OS X , MINIX 3 , Windows CE , Pocket PC , Symbian , iOS , Android , QNX , VxWorks , OS / 2 (включая eComStation и ArcaOS ), [1] BeOS / Haiku , AIX и MS-DOS.

История [ править ]

Идея бесплатного программного компилятора Clipper витала в воздухе в течение долгого времени, и эта тема часто возникала при обсуждениях на comp.lang.clipper. Антонио Линарес основал проект «Гавань», и его реализация началась в марте 1999 года. Название «Гавань» было предложено Линаресом, это игра на Clipper как на типе корабля. Гавань - синоним порта (где швартуются корабли), а гавань - это порт на языке Клиппер.

В 2009 году гавань была существенно модернизирована, в основном Виктором Шакатсом и Пшемыславом Черпаком.

Поддержка базы данных [ править ]

Harbour расширяет подход к заменяемым драйверам баз данных (RDD) Clipper. Он предлагает несколько RDD, таких как DBF , DBFNTX, DBFCDX, DBFDBT и DBFFPT. В Harbour несколько RDD могут использоваться в одном приложении, а новые логические RDD могут быть определены путем объединения других RDD. Архитектура RDD допускает наследование, так что данный RDD может расширять функциональность других существующих RDD. Сторонние RDD, такие как RDDSQL, RDDSIX, RMDBFCDX, Advantage Database Server и Mediator, являются примерами некоторых функций архитектуры RDD. Реализация DBFNTX имеет почти такую ​​же функциональность, что и DBFCDX и RDDSIX. NETIO и LetoDB [2] обеспечивают удаленный доступ по протоколу TCP .

Harbour также предлагает поддержку ODBC с помощью синтаксиса ООП и поддержку ADO с помощью OLE . MySQL , PostgreSQL , SQLite , Firebird , Oracle - это примеры баз данных, к которым Harbour может подключаться.

Технологии xBase часто путают с программным обеспечением РСУБД . Хотя это правда, xBase - это больше, чем простая система баз данных, поскольку в то же время языки xBase, использующие только DBF, не могут предоставить полную концепцию реальной СУБД.

Философия программирования [ править ]

В отличие от Java, которая предназначена для однократной записи и запуска в любом месте, Harbor стремится к однократной записи и компиляции где угодно . Поскольку один и тот же компилятор доступен для всех вышеперечисленных операционных систем, нет необходимости в перекодировании для создания идентичных продуктов для разных платформ, за исключением случаев, когда используются функции, зависящие от операционной системы. Кросс-компиляция поддерживается с помощью MinGW . В Microsoft Windows Harbour более стабилен, но менее хорошо документирован, чем Clipper, но имеет многоплатформенные возможности, более прозрачный, настраиваемый и может запускаться с USB-накопителя.

Под Linux и Windows Mobile исходный код Clipper может быть скомпилирован с помощью Harbour с очень небольшой адаптацией. Большая часть программного обеспечения, изначально написанного для работы на диалектах Xbase ++, FlagShip, FoxPro, xHarbour и других, может быть скомпилирована с помощью Harbor с некоторой адаптацией. В 2010 году было приложено много усилий, чтобы упростить переход с других диалектов xBase .

Harbour может использовать, среди прочего, следующие компиляторы C: GCC , MinGW , Clang , ICC , Microsoft Visual C ++ (6.0+), Borland C ++ , Watcom C , Pelles C и Sun Studio .

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

Harbor поддерживает внешние графические интерфейсы, бесплатные (например, HBQt, HWGui, MiniGUI (последняя версия на основе Qt и QtContribs [3] ) и коммерческие (например, FiveWin, Xailer). HBQt - это библиотека, обеспечивающая привязки к Qt. Приложение HBIDE является образцом HBQt потенциал.

Harbour на 100% совместим с Clipper [4] и поддерживает множество расширений синтаксиса языка, включая значительно расширенные библиотеки времени выполнения, такие как OLE , Blat , OpenSSL , FreeImage , GD , hbtip, hbtpathy, PCRE , hbmzip ( zlib ), hbbz2 ( bzip2 ) , cURL , Cairo , собственная реализация CA-Tools, обновленные библиотеки NanFor и многие другие. Harbour имеет активное сообщество разработчиков и обширную стороннюю поддержку.

Любой язык xBase обеспечивает очень продуктивный способ создания бизнес-приложений и приложений, интенсивно использующих данные. Гавань не исключение.

Оператор макроса (компилятор времени выполнения) [ править ]

Одна из самых мощных функций языков xBase - это макрос «&». Реализация макроса оператора Harbour позволяет выполнять компиляцию любого допустимого выражения Harbour. Такое скомпилированное выражение может использоваться как ЗНАЧЕНИЕ, т. Е. Правая сторона присваивания (rvalue), но такое скомпилированное выражение может использоваться для разрешения левой стороны (lvalue) присваивания, то есть частных или общедоступных переменных, или поле базы данных.

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

Последний компилятор макросов может скомпилировать любой допустимый код Harbour, включая код для предварительной обработки перед компиляцией.

Синтаксис:

 & (...)

Текстовое значение выражения '...' будет скомпилировано, и значение, полученное в результате выполнения скомпилированного кода, будет результатом.

 & SomeId

это краткая форма для & (SomeId).

 & SomeId.postfix

является краткой формой & (SomeId + "постфикс").

Объектно-ориентированное программирование [ править ]

Программирование в стиле ООП - это более широкий вопрос, чем конкретная библиотека или конкретный интерфейс, но программирование ООП - это то, чего ожидают многие программисты Clipper. В CA-Clipper 5.2 и особенно 5.3 добавлен ряд базовых классов и соответствующий синтаксис ООП. Такие библиотеки, как Class (y) , Fivewin, Clip4Win и TopClass, предоставляют дополнительную функциональность ООП.

Harbour имеет расширения ООП с полной поддержкой классов, включая наследование, на основе синтаксиса Class (y). Синтаксис ООП в Harbour очень похож на синтаксис более ранних библиотек классов Clipper, поэтому должна быть возможность поддерживать устаревший код Clipper с минимальными изменениями.

Синтаксис и семантика [ править ]

Код гавани на HBIDE

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

Встроенные типы данных [ править ]

Harbour имеет шесть скалярных типов: Nil , String , Date , Logical , Numeric , Pointer и четыре сложных типа: Array , Object , CodeBlock и Hash . Скаляр содержит одно значение, например строку, число или ссылку на любой другой тип. Массивы представляют собой упорядоченные списки скаляров или сложных типов, индексированных по номеру, начиная с 1. Хэши или ассоциативные массивы - это неупорядоченные коллекции значений любого типа, индексированные по их связанному ключу, который может быть любого скалярного или сложного типа.

Буквальное (статическое) представление скалярных типов:

  • Ноль: NIL
  • Нить: "hello", 'hello', [hello]
  • Дата: 0d20100405
  • Логично: .T., .F.
  • Числовой: 1, 1.1, −1, 0xFF

Сложные типы также могут быть представлены как буквальные значения:

  • Множество: { "String", 1, { "Nested Array" }, .T., FunctionCall(), @FunctionPointer() }
  • CodeBlock :{ |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
  • Хеш: { "Name" => "John", 1 => "Numeric key", "Name2" => { "Nested" => "Hash" } }

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

Кодовые блоки могут иметь ссылки на переменные метода "процедура / функция>", в котором он был определен. Такие кодовые блоки могут быть возвращены как значение или с помощью аргумента, переданного посредством REFERENCE , в таком случае кодовый блок «переживет» подпрограмму, в которой он был определен, и любые переменные, на которые он ссылается, будут переменной DETACHED .

Отсоединенные переменные сохранят свое значение до тех пор, пока существует ссылающийся на них кодовый блок. Такие значения будут использоваться совместно с любым другим кодовым блоком, который может иметь доступ к тем же переменным. Если кодовый блок не пережил содержащуюся в нем подпрограмму и будет оцениваться в течение срока жизни подпрограммы, в которой он определен, изменения в его отдельных переменных посредством его оценки будут отражены обратно в его родительской подпрограмме.

Кодовые блоки можно оценивать любое количество раз с помощью функции Eval ( BlockExp ) .

Переменные [ править ]

Все типы могут быть присвоены именованным переменным. Идентификаторы именованных переменных имеют длину от 1 до 63 символов ASCII, начинаются с [A-Z|_]и далее состоят из символов [A-Z|0–9|_]до 63 символов. Именованные переменные не чувствительны к регистру.

Переменные имеют одну из следующих областей:

  • ЛОКАЛЬНЫЙ : виден только внутри подпрограммы, которая его объявила. Значение теряется при выходе из процедуры.
  • СТАТИЧЕСКИЙ : виден только в подпрограмме, которая его объявила. Значение сохраняется для последующих вызовов подпрограммы. Если переменная STATIC объявляется до того, как будет определена какая-либо процедура / функция / метод, она имеет область действия MODULE и видна в любой подпрограмме, определенной в том же исходном файле, она будет поддерживать свою жизнь в течение всего времени существования приложения.
  • ЧАСТНЫЙ : виден внутри подпрограммы, которая ее объявила, и всех подпрограмм, вызываемых этой подпрограммой.
  • PUBLIC : виден для всех подпрограмм в одном приложении.

LOCAL и STATIC разрешаются во время компиляции и, следовательно, намного быстрее, чем переменные PRIVATE и PUBLIC, которые являются динамическими объектами, доступ к которым осуществляется посредством таблицы символов времени выполнения . По этой же причине переменные LOCAL и STATIC не доступны компилятору макросов, и любой код макроса, который пытается ссылаться на них, вызовет ошибку времени выполнения.

Из-за динамической природы переменных PRIVATE и PUBLIC они могут создаваться и уничтожаться во время выполнения, могут быть доступны и изменены с помощью макросов времени выполнения, а также могут быть доступны и изменены с помощью кодовых блоков, созданных на лету.

Структуры управления [ править ]

Базовые управляющие структуры включают в себя все стандартные управляющие структуры dBase и Clipper, а также дополнительные, вдохновленные языками программирования C или Java :

Петли [ править ]

[DO] ПОКА ConditionExp  ... [ПЕТЛЯ] [ВЫХОД]КОНЕЦ [ДЕЛАТЬ]
FOR Var  : = InitExp TO EndExp [STEP StepExp ] ... [ПЕТЛЯ] [ВЫХОД]СЛЕДУЮЩИЙ
ДЛЯ КАЖДОЙ Var IN CollectionExp  ... [ Var : __ enumIndex ()] [ПЕТЛЯ] [ВЫХОД]СЛЕДУЮЩИЙ
  • ... представляет собой последовательность одного из нескольких операторов - Харбора, и квадратные скобки [] обозначает необязательный синтаксис.
  • Вар : __ enumIndex () может быть необязательно использован для получения индекса текущей итерации (1) на основе.
  • Оператор LOOP перезапускает текущую итерацию структуры включающего цикла, и если включающий цикл является циклом FOR или FOR EACH , он увеличивает итератор, переходя к следующей итерации цикла.
  • Оператор EXIT немедленно завершает выполнение структуры включающего цикла.
  • Оператор NEXT закрывает структуру управления и переходит к следующей итерации структуры цикла.

В операторе FOR выражение присваивания вычисляется до первой итерации цикла. К выражение вычисляется и сравнивается со значением переменной управления, перед каждой итерации, и цикл завершается , если он имеет значение большее , чем значение числового числового значения управляющей переменной. Необязательное выражение STEP оценивается после каждой итерации до принятия решения о выполнении следующей итерации.

В ДЛЯ КАЖДОЙ , то вар переменная будет иметь значение (скалярное, или сложный) соответствующего элемента в стоимости сбора. Выражение коллекции может быть массивом (любого типа или комбинаций типов), хэш-таблицей или типом объекта.

Операторы IF [ править ]

ЕСЛИ CondExp  ...
[ELSEIF] CondExp  ...[ЕЩЕ] ...КОНЕЦ [ЕСЛИ]

... представляет 0 или более утверждений .

Выражение (я) условия должно оцениваться как ЛОГИЧЕСКОЕ значение.

Операторы SWITCH [ править ]

Harbour поддерживает конструкцию SWITCH, вдохновленную реализацией switch () в языке C.

ПЕРЕКЛЮЧАТЕЛЬ SwitchExp
CASE LiteralExp  ... [ВЫХОД][CASE LiteralExp ] ... [ВЫХОД][ИНАЧЕ] ...КОНЕЦ [ПЕРЕКЛЮЧЕНИЕ]
  • LiteralExp должно быть выражение разрешимо числовое скомпилированное время и может включать в себя оператор, до тех пор , как такие операторы включают значение статического времени компиляции.
  • EXIT Необязательный оператор является эквивалентом заявления C перерыва , и если они присутствуют, выполнение структуры ПЕРЕКЛЮЧАТЕЛЯ закончится , когда будет достигнуто заявление EXIT, в противном случае он будет продолжать с первым утверждением ниже следующим оператором Case (провалиться).

Операторы BEGIN SEQUENCE [ править ]

НАЧАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ ... [ПЕРЕРЫВ] [Перерыв ([ Exp ])]ВОССТАНОВИТЬ [ИСПОЛЬЗОВАНИЕ Var ] ...КОНЕЦ [ПОСЛЕДОВАТЕЛЬНОСТЬ]

или же:

НАЧАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ ... [ПЕРЕРЫВ] [Перерыв()]КОНЕЦ [ПОСЛЕДОВАТЕЛЬНОСТЬ]

Структура BEGIN SEQUENCE позволяет корректно прервать любую последовательность, даже при пересечении вложенных процедур / функций. Это означает, что вызываемая процедура / функция может выдавать оператор BREAK или выражение Break (), чтобы принудительно развернуть любую вложенную процедуру / функции, вплоть до первой внешней структуры BEGIN SEQUENCE, либо после соответствующего оператора END. или предложение RECOVER, если оно есть. Оператор Break может дополнительно передавать любой тип выражения, которое может быть принято оператором RECOVER, чтобы обеспечить дальнейшую обработку восстановления.

Кроме того, объект ошибки Harbor поддерживает свойства canDefault , canRetry и canSubstitute , которые позволяют обработчикам ошибок выполнить некоторые приготовления, а затем запросить операцию Retry , возобновить или вернуть значение для замены выражения, запускающего условие ошибки.

В качестве альтернативы операторы TRY [CATCH] [FINALLY] доступны в библиотеке xhb, работающей как конструкция SEQUENCE.

Процедуры / функции [ править ]

[СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName
[СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName ()[СТАТИЧЕСКОЕ] ПРОЦЕДУРА SomeProcedureName ( Param1 [, ParamsN ])
INIT ПРОЦЕДУРА SomeProcedureName
EXIT ПРОЦЕДУРА SomeProcedureName
[СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName
[СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName ()[СТАТИЧЕСКОЕ] ФУНКЦИЯ SomeProcedureName ( Param1 [, ParamsN ])

Процедуры / функции в Harbour можно указать с помощью ключевых слов PROCEDURE , или FUNCTION. Правила именования такие же, как и для переменных (до 63 символов без учета регистра). И процедуры, и функции могут быть квалифицированы квалификатором области действия STATIC, чтобы ограничить их использование областью действия модуля, где они определены.

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

Изменения переменных аргументов не отражаются в соответствующих переменных, передаваемых вызывающей процедурой / функцией / методом, если они явно не переданы BY REFERENCE с использованием префикса @ .

PROCEDURE не имеет возвращаемого значения, и при использовании в контексте Expression выдаст значение NIL .

FUNCTION может возвращать любой тип с помощью оператора RETURN в любом месте тела его определения.

Ниже приводится пример определения процедуры и вызова функции:

 x  : = Куб (2) ФУНКЦИЯ Куб (n) ВОЗВРАТ n ** 3

Пример кода [ править ]

Типичная программа " hello world " будет выглядеть так:

  ? "Привет мир!"

Или же:

 QOut ( «Привет, мир!» )

Или же:

 Оповещение ( «Привет, мир!» )

Или заключенный в явную процедуру:

 ПРОЦЕДУРА Главная ()  ? "Привет мир!" ВОЗВРАЩАТЬСЯ

Примеры ООП [ править ]

Основная процедура:

 #include  "hbclass.ch" ПРОЦЕДУРА Главная () МЕСТНЫЙ ОПЕРАТОР CLS oPerson  : = Pers на (): New ( "Dave" ) oPerson : Глаза: = "Недопустимый"  oPerson : Глаза: = "Blue" Оповещение (oPerson: Describe ()) ВОЗВРАЩАТЬСЯ

Определение класса:

 СОЗДАТЬ КЛАСС человека Имя VAR INIT "" МЕТОД Новый (cName) МЕТОД Опишите () ACCESS Eyes INLINE :: pvtEyes ASSIGN Eyes (x) INLINE iif (HB_ISSTRING (x) .AND. X $ "Синий, коричневый, зеленый", :: pvtEyes: = x, Alert ("Недопустимое значение")) ЗАЩИЩЕН: VAR pvtEyes КОНЕЦ // Пример обычного определения метода МЕТОД Новый (cName) CLASS Человек  :: Имя: = cName ВОЗВРАТ МЕТОД Describe () CLASS Person МЕСТНЫЙ c Описание ЕСЛИ Пусто (:: Имя) cDescription: = "У меня еще нет имени." ЕЩЕ cDescription: = "Меня зовут:" + :: Name + ";" ENDIF ЕСЛИ ! Пусто (:: Глаза) cDescription + = "Цвет моих глаз:" + :: Глаза ENDIF ВОЗВРАТ cОписание

Инструменты [ править ]

  • hbmk2 - Инструмент сборки, такой как make
  • hbrun - интерпретатор оболочки для Harbour. Компиляция макроса позволяет запускать любой допустимый код Harbour по мере его компиляции.
  • hbformat - форматирует исходный код, написанный на Harbour или другом диалекте, в соответствии с определенными правилами.
  • hbpp - препроцессор, мощный инструмент, позволяющий избежать типичных проблем, обнаруживаемых в препроцессоре языка C.
  • hbi18n - Инструменты для локализации текста в приложениях
  • hbdoc - Создает документацию для Harbour

Все инструменты мультиплатформенные.

Развитие [ править ]

HBIDE посмотрите.

Сегодня разработкой Harbour руководит Виктор Шакатс в сотрудничестве с Пшемыславом Черпаком, который также вносит вклад во многие компоненты основного языка и дополнительных компонентов. HBIDE и некоторые другие компоненты, особенно HBQt, разработаны Pritpal Bedi. Другие участники сообщества разработчиков отправляют изменения в исходный репозиторий GitHub . [5] По состоянию на 2015 год развитие гавани идет активно и активно.

Сравнение xHarbour [ править ]

xHarbour - это ответвление [6] более раннего проекта Harbour. xHarbour использует более агрессивный подход к реализации новых функций в языке, в то время как Harbor более консервативен в своем подходе, стремясь, прежде всего, к точному воспроизведению поведения Clipper, а затем внедрять новые функции и расширения в качестве второстепенного соображения. Следует также отметить, что Harbour поддерживается множеством операционных систем, в то время как xHarbour поддерживает только 32-разрядные версии MS Windows и Linux.

Разработчики Harbour попытались задокументировать все скрытое поведение на языке Clipper и протестировать код, скомпилированный Harbour, вместе с тем же кодом, скомпилированным с помощью Clipper, для обеспечения совместимости.

Разработчики Harbour явно отвергают расширения языка, в которых эти расширения нарушили бы совместимость с Clipper. Эти отклонения были смягчены недавно, поскольку новая архитектура Harbour допускает расширения из основного компилятора.

Подробное сравнение расширений, реализованных в Harbour и xHarbour, можно найти в исходном репозитории проекта на GitHub. [7]

Библиотеки и инструменты графического интерфейса [ править ]

  • hbide - Интегрированная среда разработки для помощи в разработке Harbor и различных диалектах xBase
  • PTSource IDE - интегрированная среда разработки включает Harbour.
  • HwGui - кроссплатформенная библиотека графического интерфейса с открытым исходным кодом для Harbour
  • HMG - Бесплатная / с открытым исходным кодом xBase Win32 /система разработки с графическим интерфейсом для Harbour
  • MiniGUI [8] - Бесплатная система разработки xBase Win32 / GUI с открытым исходным кодом ( форк (разработка программного обеспечения) как HMG, так и Harbour)
  • ooHG - объектно-ориентированный графический интерфейс гавани - форк HMG, предназначенный для "программирования на основе классов и операций".
  • Marinas-GUI - многоплатформенный пакет разработки графического интерфейса на основе QT для Harbour. Marinas-GUI загружается как полный установочный пакет для выбранной целевой платформы (IDE, Version Control, Harbour / C Compiler, Libraries и т. Д.). В основном установите и начните кодирование и компиляцию.

См. Также [ править ]

  • FlagShip от multisoft
  • Visual FoxPro
  • Визуальные объекты
  • Xbase ++
  • Поддержка бесплатного языка визуального программирования с открытым исходным кодом PWCT Harbour через HarbourPWCT

Ссылки [ править ]

  1. ^ «Гавань» . Дата обращения 3 сентября 2020 .
  2. ^ "LetoDB" . Sourceforge.net . Проверено 9 декабря 2013 года .
  3. ^ "QtContribs - Харбор проектов Qt" . SourceForge .
  4. ^ "Официальная страница гавани" . Проект гавани . Проверено 9 декабря 2013 года .
  5. ^ "гавань 路 GitHub" . Github.com . Проверено 9 декабря 2013 года .
  6. ^ "О xHarbour" . Xharbour.org . Проверено 9 декабря 2013 года .
  7. ^ "xhb-diff.txt" . Проверено 9 декабря 2013 года .
  8. ^ vailtom (17 августа 2009 г.). "Harbour MiniGUI Extended Edition. | Бесплатное программное обеспечение для загрузки" . Sourceforge.net . Проверено 9 декабря 2013 года .

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Репозиторий сообщества Oasis Clipper, FoxPro и Xbase ++
  • HBIDE
  • Список рассылки разработчиков Harbour
  • Список рассылки пользователей порта
  • Обширная документация по гавани, библиотеки, сайт инструментов
  • Harbour Wiki (Словарь функций гавани)