Кроме работы с локально расположенными данными, Harbour позволяет работать с данными как в режиме «файл-сервер», так и в режиме клиент-сервер (в том числе, в режиме запросов к удалённой системе управления базами данных, поддерживающей SQL).
Язык использует традиционные конструкции Clipper, объектную нотацию, принятую в языке C++, а также дает возможность писать на языке C. Harbour активно развивается и в язык включаются некоторые современные технологии программирования.
xHarbour (англ.extended Harbour) — ответвление проекта Harbour, существует как в коммерческом, так и в свободном вариантах.
Имеются GUI-библиотеки — как коммерческие, так и бесплатные (в частности, MiniGUI — для Windows; HwGUI[1] — для Windows и GNU/Linux).
Harbour распространяется под свободной лицензией, схожей с GNU General Public License, за исключением того, что на Harbour возможно свободно разрабатывать и распространять коммерческие приложения (как пример тиражируемого коммерческого ПО − Система для учёта и управления предприятием БЭСТ-5 [2]). См. также в конце статьи Тиражируемое ПО, написанное на Harbour.
Основателем проекта является испанский программист Антонио Линарес (исп.Antonio Linares). Первое сообщение о «мыслях, витающих в воздухе» относительно адаптации программного обеспечения, написанного для Clipper, к новым реалиям, инициировав тем самым дискуссию, приведшую к созданию Harbour, он опубликовал в Usenet-группе comp.lang.clipper 16 марта 1999 года[2]. Название Harbour (рус.бухта, гавань) было предложено проекту Линаресом по общности «морского контекста» с названием компилятора Clipper (рус.клиппер) (в смысле «безопасная гавань для клипера»). В том же 1999 году группой разработчиков, среди которых, помимо Линареса, особенно следует отметить Рышарда Глаба (пол.Ryszard Glab), были выпущены первые версии компилятора.
В 2009 году Harbour был глубоко переработан международным сообществом разработчиков под руководством Виктора Сакаца (венг.Viktor Szakáts) и Пшемыслава Черпака (пол.Przemysław Czerpak), по состоянию на 2021 год ведётся активное развитие и разработка, имеются как международное, так и языково-ориентированные сообщества разработчиков и пользователей (русское, испанское, португальское, итальянское и на прочих языках).
В настоящее время с использованием Harbour создаются как бесплатные, так и коммерческие приложения.
Работа с базами данных
Harbour расширяет возможности использовавшихся в Clipper драйверов баз данных (RDD, англ.Replaceable Database Drivers). Он поддерживает традиционные для Clipper RDD — такие как DBF, DBFNTX, DBFCDX, DBFDBT и DBFFPT. В Harbour можно использовать разные драйверы в одном приложении (например, брать данные из традиционной для Clipper базы данных в формате DBFNTX и записывать их в формате FoxPro — DBFCDX), а также создавать новые («логические») RDD из комбинации нескольких имеющихся. Архитектура RDD разрешает наследование, то есть новый драйвер может использовать функциональные возможности уже имеющихся. Для Harbour переписаны наиболее популярные драйверы сторонних производителей: RDDSQL, RDDSIX, RMDBFCDX, ADS (англ.Advantage Database Server), Mediator. Такие RDD, как NETIO и LetoDB[3] дают возможность удаленного доступа к базам данных через TCP-протокол путём создания Web-приложений, функционирующих на стороне сервера локальной сети либо Web-сервера, с доступом пользователя к данным через сеть, используя любой Интернет-браузер и любую операционную систему.
В проекте Harbour стремятся к обеспечению кроссплатформенности на уровне исходных кодов при специфической компиляции под каждую платформу, согласно концепции (написано однажды — компилируется везде). Если для некоего набора операционных систем есть подходящие для использования компиляторы Harbour, то нет препятствий к тому чтобы создавать идентичные программы для всех этих платформ, написав исходный текст один раз, за исключением случаев, когда используются возможности, специфичные для разных операционных систем. Кросс-компиляция возможна благодаря MinGW32. Большое количество программ, исходный код которых ранее написан для работы с Xbase++, Flagship[уточнить], FoxPro, xHarbour и другими диалектами xBase, могут быть также достаточно легко адаптированы для компиляции через Harbour.
В проекте Harbour используется эмуляция многих графических терминалов, включая драйверы консоли, а также гибридные консольно-графические — такие как GTWvt и GTWvg.
Harbour поддерживает внешние библиотеки графического пользовательского интерфейса, как свободно распространяемые (наиболее известные — HWGui[1], MiniGUI и Qt), так и коммерческие (например, FiveWin или Xailer). Взаимодействие с Qt производится через библиотеку hbQt.
Разработчиками проекта утверждается, что язык Harbour на 100 % совместим с Clipper на уровне исходного кода[4].
Макро-оператор (компилятор времени выполнения)
Одна из наиболее мощных возможностей xBase-языков — это Макро-оператор '&'. Реализация макро-оператора в Harbour позволяет создавать любое допустимое в Harbour выражение прямо во время выполнения программы (компиляция времени выполнения). Такое скомпилированное выражение может быть использовано как значение, то есть в правой части операции присваивания (rvalue), но также — что более интересно — и как левая часть операции присваивания (lvalue), то есть как PRIVATE или PUBLIC переменная, или как поле (FIELD) базы данных.
Кроме того, макро-оператор может компилировать «на лету» и выполнять вызовы функций, выполнять присваивания значений или даже создавать список аргументов — а результат выполнения макро-оператора может использоваться в любом из указанных контекстов в скомпилированной прикладной программе. Иными словами, любое Harbour-приложение может изменять логику своей работы во время выполнения, создавая и выполняя необходимый код «по запросу».
Последний макро-компилятор может компилировать любой допустимый в Harbour код, включая код для препроцессора, обрабатываемый до компиляции.
Синтаксис макро-оператора:
&( ...)
Текстовое значение выражения в скобках '…' будет скомпилировано во время выполнения программы, а результатом макроса будет значение, полученное в результате выполнения скомпилированного кода.
&SomeId
это более короткая форма макро-оператора &(SomeId).
&SomeId.postfix
это более короткая форма макро-оператора &(SomeId + «postfix»).
Возможности, предоставляемые макро-оператором, в сильной степени упрощают программирование.
Например, представим ситуацию, когда программа должна считывать в переменную «data1» некие данные из поля «FIELD1» одной из многочисленных имеющихся баз данных (например, различающихся только именами, но одинаковых по структуре, баз-справочников). Имя базы-источника данных вводится пользователем (или получается каким-либо иным путём) в переменную «bd».
Не используя макро-оператор, нам пришлось бы расписать в исходном коде программы все возможные значения, которые могла бы получать в ходе работы программы переменная «bd», и описывать, какую базу открыть в данном конкретном случае — нечто вроде:
if bd == "BAZA1"
use BAZA1 alias BAZASP new
endif
if bd == "BAZA2"
use BAZA2 alias BAZASP new
endif
.... (и так много-много раз, для всех возможных значений)
....
data1 := BAZASP->FIELD1
....
В случае же применения макро-оператора нам достаточно написать просто:
use &(bd) alias BAZASP new
data1 := BAZASP->FIELD1
и этого достаточно!.. Ну, может быть, ещё предварительно, до попытки открытия, проверить существование базы с таким именем:
if .not. file( bd + ".DBF" )
? "База данных с именем " + bd + ".DBF не найдена!"
... (и здесь обработка этой ситуации -
... что при этом должны делать программа или пользователь)
endif
Объектно-ориентированное программирование
В Harbour для использования классов не требуется подключать дополнительные библиотеки, объектно-ориентированное программирование является здесь частью языка и Harbour предоставляет большие возможности, чем Clipper со всеми сторонними библиотеками.[5]
Синтаксис и семантика языка
Harbour — как любой xBase-язык — регистронезависим (то есть команды или имена переменных воспринимаются одинаково при написании заглавными или строчными буквами: например, «sStr», «sstr» и «SStr» — это одна и та же переменная; «DbCreate()» и «dbCREATE()» — одна и та же функция) и содержит опцию распознавания зарезервированных ключевых слов (например, команды) по первым четырём буквам (например, вместо команды «COPY STRUCTURE EXTENDED …» можно писать просто «COPY STRU EXTE …»).
Встроенные типы данных
В Harbour есть 6 скалярных типов данных: ничто Nil, строка String, дата Date, логический тип Logical, число Number, указатель Pointer, и 4 составных типа: массив Array, объект Object, блок кода CodeBlock и хеш Hash. Скалярные данные содержат единичное значение — такое как строка, число или ссылка на переменную любого другого типа. Массивы — это упорядоченные списки скалярных или составных значений (то есть элементом массива может быть в том числе и другой массив, а его элементом — другой и т. п.), индексированный по номеру, начиная с 1 (а не с 0, как в некоторых других языках). Хеш-таблицы, или ассоциативные массивы — неупорядоченные собрания значений любых типов, индексируемые по ключу, связанному с каждым значением, который может быть любого скалярного или составного типа.
Литеральное (статическое) представление скалярных типов:
Nil: NIL
String: «hello», 'hello', [hello], E"hello\n"
Date: 0d20100405
Logical: .T., .F.
Number: 1, 1.1, −1, 0xFF
Составные типы тоже можно представить в виде значений-литералов:
В хеш-таблицах в качестве ключа для любого элемента может использоваться значение любого типа, включая другую хеш-таблицу. Хеш-таблицы и массивы могут содержать в качестве значения любого элемента значение любого типа, в том числе вложенные массивы и хеш-таблицы.
Блоки кода могут содержать ссылки на переменные процедуры, функции или метода, в котором определён блок кода. Такие блоки кода могут возвращаться в виде значения или в аргументе, передаваемом по ссылке; в этом случае блок кода «переживёт» подпрограмму, в которой он определён, и все переменные, на которые он ссылается, будут «отсоединенными (detached)» переменными.
Отсоединенные переменные сохраняют своё значение, пока существует ссылающийся на них блок кода. Эти значения будут общими для всех блоков кода, у которых есть доступ к тем же самым переменным. Если блок кода не переживает содержащую его подпрограмму и вычисляется за время жизни подпрограммы, в которой он определён, изменения в его отсоединённых переменных, вызванные его вычислением, отражаются в этой подпрограмме.
Блок кода можно вычислять неограниченное количество раз с помощью функции Eval(Блок кода).
Разработка клиент-серверных и Web-приложений
Leto DB server
Leto DB Server (letodb) — это 32/64-разрядный многоплатформенный сервер баз данных, в основном предназначенный для клиентских программ, написанных на языке Harbour, для доступа к файлам формата dbf. Проект Letodb стартовал в 2008 году, его автор — Александр Кресин[6]. В 2011 году Letodb был существенно доработан и продолжает дорабатываться сообществом разработчиков, разработка координируется через сайт проекта LetoDB[3].
Letodb — это высокоэффективный реляционной СУБД c архитектурой клиент-сервер для сетевых, автономных (локальных) и интернет — приложений базы данных. Является открытым программным обеспечением, разработанным под лицензией GPL, дающей право на его свободное использование. Преимуществом letodb является объединение традиционных средств среды xBase для доступа к базам данных и клиент-серверной технологии. Сервер letodb ответственен за весь доступ к базе данных (от имени клиентов). С оптимизированной методологией доступа к данным Letodb обеспечивает безопасность, стабильность и целостность данных при минимальных требованиях к обслуживанию.
Сервер Базы данных letodb улучшает работу с базой данных сети. Letodb разгружает большую часть работы, обычно выполняемой каждым автоматизированным рабочим местом клиента. Работая с сетью, letodb обрабатывает запросы данных и возвращает информацию клиентам сети. Сервер базы данных letodb использует архитектуру клиент-сервер, улучшая многопользовательскую работу, стабильность базы данных, и безопасность базы данных. Сервер letodb поддерживает транзакции. При этом есть гарантия того, что сложная операция обновления базы данных будет выполнена целиком. Также имеется возможность создания серверных процедур, которые вызываются с клиента и выполняются на сервере.
Сервер Letodb (как серверная, так и клиентская часть) может использоваться для операционных систем MS Windows, Linux и MacOS. Для MS Windows поддерживаются операционные системы Windows 98/ME, Windows NT/2000/2003, Windows XP 32/64 бит, Windows Vista 32/64 и Windows 7 32/64 бит.
Под управлением MS Windows сервер letodb запускается как служба, но есть возможность собрать его как приложение. Для всей линейки разрядных ОС Windows: от Windows 98 до Windows 7 используется одна и та же сборка сервера. Под управлением операционной системы Linux сервер letodb запускается как демон. Как правило, для различных версий Linux сервер letodb надо собирать отдельно для каждой. Сервер letodb (как и Harbour) поставляется с исходными текстами и правилами сборки. Сервер letodb прост в настройке: достаточно указать папку, в которой располагаются базы данных, и некоторые другие настройки. В процессе работы сервер letodb не требует специального обслуживания. Letodb соединяется с клиентскими приложениями по протоколу TCP/IP. По умолчанию при этом используется порт 2812, хотя допускается работа и через другой порт. Соединение с сервером возможно как через локальную сеть, так и через интернет и интранет сети.
Сервер letodb обеспечивает безопасность доступа к данным. Имеется возможность включить режим шифрования передаваемого трафика. Также есть средства авторизации пользователей. В этом случае сервер letodb будет обслуживать только те соединения, в которых указаны параметры авторизации: имя пользователя и пароль. Для пользователей можно установить права на администрирование сервера, управление сервером, а также право на изменение данных.
Клиентская часть letodb — это библиотека, содержащая драйвер letodb для Harbour — модуль rdd, который удовлетворяет стандарту замещаемых драйверов баз данных языка Harbour, совместимых с драйверами dbfcdx/dbfntx, и поддерживающих их базовую функциональность. Клиентская библиотека letodb также содержит набор функций для управления и администрирования сервером letodb, функции работы с транзакциями, а также набор дополнительных функций для оптимизации работы с базой данных. Клиентская библиотека letodb позволяет собрать приложение, работающее с сервером letodb, как для ОС MS Windows, так для Linux. Клиентское приложение может работать в гетерогенной сети, в которой используются сервера letodb, работающие под управлением различных ОС: как MS Windows, так и Linux.
Для настройки клиентского приложения достаточно указать IP-адрес или имя компьютера, на котором запущен сервер letodb, номер используемого порта, а также папки на сервере, в которых располагается база данных. Для работы с базой данных нет необходимости открывать сетевые ресурсы.
Доступ к различным метаданным (шаблонам документов, скриптам, отчётам) также выполняется не через файловые операции, а с помощью запросов к серверу letodb. Возможно соединение приложений, использующих клиентскую библиотеку letodb, с удаленными базами данных через интернет и интранет.
Для управления сервером предоставляется отдельная утилита, которую можно запустить как на клиенте, так и на компьютере, на котором запущен сервер. С помощью этой утилиты можно просмотреть все клиентские приложения, которые соединились с сервером letodb, а также открытые таблицы базы данных. При необходимости есть возможность управления (отключения) соединениями.
Тиражируемое ПО, написанное на Harbour
В перечень включены разработки (как коммерческие, так и свободные) тиражируемого программного обеспечения, написанного с использованием Harbour (xHarbour).
Таблица
Статус (К = коммер-ческое, СПО = свободное, ОПО = open source)
Наименование
Год начала поставки
Область применения
Разработчик, страна
Обзор
Что из Harbour и относящегося к нему использовано
К
Система для учёта и управления предприятием «БЭСТ - 4+»
Информационно-поисковая система учёта граждан, нуждающихся в улучшении жилищных условий, и предоставление жилых помещений в Дмитровском районе − «Учёт жилья» Дмитровский район (Московская область)
1996 (Harbour - с 2003)
Муниципальный учёт
Верченко А. Г., Россия
xHarbour
К
Информационно-поисковая система учёта граждан, нуждающихся в улучшении жилищных условий, и предоставление жилых помещений по сельским округам в Дмитровском районе − «Учёт жилья сельских округов» Дмитровский район (Московская область)
2006
Муниципальный учёт
Верченко А. Г., Россия
xHarbour
К
Информационно-поисковая система учёта приватизированного жилого фонда в Дмитровском районе − «Приватизация жилья» Дмитровский район (Московская область)
Информационно-расчётная система подведения итогов распределения жилой площади, постановки граждан на очередь, распределение и т. д. в Дмитровском районе − «Справка-анализ» Дмитровский район (Московская область)
2003
Муниципальный учёт
Верченко А. Г., Россия
xHarbour
К
Информационно-поисковая расчётная система «Абонент4» для автоматизации учёта по обслуживанию домофонов и видеосистем