Harbour (язык программирования) - Harbour (programming language)

Проект гавани
Парадигмамультипарадигма: императив, функциональный, объектно-ориентированный, отражающий
РазработаноАнтонио Линарес
РазработчикВиктор Сакатс и сообщество
Впервые появился1999; 21 год назад (1999)
Стабильный выпуск
3.0.0 / 17 июля 2011 г.; 9 лет назад (2011-07-17)
Предварительный выпуск
Печатная дисциплинаНеобязательно утка, динамичный, безопасный, частично сильный
Операционные системыКроссплатформенность
ЛицензияОткрытый исходный код GPL-совместимый
Расширения имени файла.prg, .ch, .hb, .hbp
Интернет сайтгавань.github.io
Диалекты
Клипер, Xbase ++, FlagShip, FoxPro, xHarbour
Под влиянием
dBase, клиппер
Под влиянием
xHarbour

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

Код гавани, использующий одни и те же базы данных, может быть скомпилирован на самых разных платформах, включая Майкрософт Виндоус, Linux, Unix варианты, несколько BSD потомки, Mac OS X, МИНИКС 3, Windows CE, Карманные ПК, Symbian, iOS, Android, QNX, VxWorks, OS / 2 (включая eComStation и ArcaOS ),[1] BeOS /Хайку, AIX и MS-DOS.

История

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

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

Поддержка базы данных

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

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

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

Философия программирования

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

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

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

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

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

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

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

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

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

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

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

Синтаксис:

 &( ... )

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

 & SomeId

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

 & SomeId.postfix

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

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

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

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

Синтаксис и семантика

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

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

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

Гавань имеет 6 скалярных типов: Ноль, Нить, Дата, Логический, Числовой, Указатель и 4 сложных типа: Множество, Объект, CodeBlock, и Хеш. Скаляр содержит одно значение, такое как строка, число или ссылка на любой другой тип. Массивы - это упорядоченные списки скаляров или сложных типов, индексированные по номеру, начиная с 1. Хэши или ассоциативные массивы, являются неупорядоченными коллекциями значений любого типа, проиндексированных их связанным ключом, который может быть любого скалярного или сложного типа.

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

  • Ноль: Ноль
  • Нить: "Привет привет привет]
  • Дата: 0d20100405
  • Логично: .T., .F.
  • Числовой: 1, 1.1, -1, 0xFF

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

  • Множество: { "Нить", 1, { «Вложенный массив» }, .T., FunctionCall (), @FunctionPointer ()}
  • CodeBlock: {| Arg1, ArgN | Arg1: = ArgN + OuterVar + FunctionCall ()}
  • Хеш: { "Имя" => "Джон", 1 => «Цифровой ключ», "Имя2" => { "Вложенный" => "Хеш" } }

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

Кодовые блоки могут иметь ссылки на переменные метода "процедура / функция>", в котором он был определен. Такие кодовые блоки могут быть возвращены как значение или с помощью переданного аргумента. ПО ССЫЛКЕ, в таком случае кодовый блок «переживет» подпрограмму, в которой он был определен, и любые переменные, на которые он ссылается, будут ОТДЕЛЕННЫЙ Переменная.

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

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

Переменные

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

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

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

МЕСТНЫЙ и СТАТИЧЕСКИЙ разрешаются во время компиляции и поэтому намного быстрее, чем ЧАСТНЫЙ и ОБЩЕСТВЕННЫЙ переменные, которые являются динамическими объектами, доступ к которым осуществляется посредством среды выполнения Таблица символов. По этой же причине МЕСТНЫЙ и СТАТИЧЕСКИЙ переменные нет подвергаются компилятору макросов, и любой код макроса, который пытается ссылаться на них, вызовет ошибку времени выполнения.

Из-за динамического характера ЧАСТНЫЙ и ОБЩЕСТВЕННЫЙ переменные, они могут быть созданы и уничтожены во время выполнения, к ним можно получить доступ и изменить с помощью макросов времени выполнения, а также к ним можно получить доступ и изменить кодовые блоки, созданные на лету.

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

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

Петли

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

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

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

IF заявления

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

... представляет 0 или более заявления).

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

SWITCH заявления

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

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

Операторы BEGIN SEQUENCE

НАЧАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ ...   [BREAK] [Перерыв ([Опыт])] ВОССТАНОВЛЕНИЕ [ИСПОЛЬЗОВАНИЕ Вар]   ...КОНЕЦ [ПОСЛЕДОВАТЕЛЬНОСТЬ]

или же:

НАЧАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ ...   [BREAK] [Break ()] END [SEQUENCE]

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

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

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

Процедуры / функции

[СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName[СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName() [СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName( Param1 [, ParamsN] )
НАЧАЛЬНАЯ ПРОЦЕДУРА SomeProcedureNameПРОЦЕДУРА ВЫХОДА SomeProcedureName
[СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName[СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName() [СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName( Param1 [, ParamsN] )

Процедуры /Функции в гавани можно указать с помощью ключевые слова ПРОЦЕДУРА, или же НАЗНАЧЕНИЕ. Правила именования такие же, как и для Переменные (до 63 символов без учета регистра). И процедуры, и функции могут быть квалифицированы квалификатором области действия. СТАТИЧЕСКИЙ чтобы ограничить их использование областью модуля, где они определены.

В В ЭТОМ или же ВЫХОД необязательные квалификаторы, будут отмечать процедуру, которая будет автоматически вызываться непосредственно перед вызовом процедуры запуска приложения или сразу после выхода из приложения, соответственно. Параметры переданные в процедуру / функцию появляются в подпрограмме как локальные переменные и могут принимать любой тип, включая ссылки.

Изменения переменных аргументов не отражаются в соответствующих переменных, передаваемых вызывающей процедурой / функцией / методом, если они явно не переданы ПО ССЫЛКЕ с использованием @ префикс.

ПРОЦЕДУРА не имеет возвращаемого значения, и при использовании в контексте выражения выдаст Ноль ценить.

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

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

 Икс : = Куб (2) НАЗНАЧЕНИЕ Куб (сущ.) ВОЗВРАЩАТЬСЯ n ** 3

Образец кода

Типичный "Привет, мир "программа будет:

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

Или же:

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

Или же:

  Тревога( "Привет, мир!" )

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

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

Примеры ООП

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

 #включают "hbclass.ch" ПРОЦЕДУРА Главный() МЕСТНЫЙ oPerson CLS    oPerson : = Челна():Новый( "Дэйв" )    oPerson: Глаза: = "Инвалид"    oPerson: Глаза: = "Синий"    Тревога(oPerson: Describe ()) ВОЗВРАЩАТЬСЯ

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

 CREATE CLASS Person VAR Name INIT "" МЕТОД Новый (cName) МЕТОД Describe () ACCESS Eyes INLINE :: pvtEyes ASSIGN Eyes (x) INLINE iif (HB_ISSTRING (x) .AND. X $ "Blue, Brown, Green", :: pvtEyes: = x, Alert ("Invalid value")) PROTECTED: VAR pvtEyes ENDCLASS // Образец обычного определения метода METHOD Новый (cName) CLASS Person :: Name: = cName RETURN Self METHOD Describe () CLASS Person LOCAL cDescription IF Empty (:: Name) cDescription: = "У меня еще нет имени." ELSE cDescription: = "Меня зовут:" + :: Name + ";" ENDIF IF! Пусто (:: Eyes) cDescription + = "Цвет моих глаз:" + :: Eyes ENDIF RETURN cDescription

Инструменты

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

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

Разработка

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

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

xHarbour сравнение

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

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

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

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

Библиотеки и инструменты GUI

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

Смотрите также

Рекомендации

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

внешняя ссылка