Harbour — Википедия

Harbour Project
Тип язык программирования, процедурный язык программирования, декларативный язык программирования и мультипарадигмальный
Первый выпуск 1999
Сайт harbour.github.io
Harbour
Класс языка императивный, структурированный, объектно-ориентированный
Появился в 1999
Автор Antonio Linares
Разработчик Przemyslaw Czerpak, Viktor Szakáts и сообщество
Выпуск 3.0.0
Тестовая версия 3.2.x доступна из SVN
Система типов необязательная неявная, динамическая, защищённая, частично строгая
Диалекты Clipper, Xbase++, Flagship, FoxPro, xHarbour
Испытал влияние dBase, Clipper
Повлиял на xHarbour
Лицензия Open source GPL-совместимая
Сайт harbour.github.io

Harbour — язык программирования и кроссплатформенный компилятор с препроцессором, полностью совместимый с Clipper. Он позволяет создавать 16-, 32- и 64-разрядные приложения для DOS, Windows, Unix/Linux, OS/2, Mac OS X, Windows CE, BSD, Pocket PC, Symbian, iOS, QNX, VxWorks, eComStation, Haiku/BeOS, AIX. Harbour является свободным программным обеспечением.

Кроме работы с локально расположенными данными, 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 используется доступ к данным посредством технологий ODBC и ADO, созданы специальные библиотеки для доступа к некоторым популярным СУБД: MySQL, PostgreSQL, SQLite, Firebird, Oracle Database, используя программный интерфейс приложения на языке C.

В проекте Harbour стремятся к обеспечению кроссплатформенности на уровне исходных кодов при специфической компиляции под каждую платформу, согласно концепции (написано однажды — компилируется везде). Если для некоего набора операционных систем есть подходящие для использования компиляторы Harbour, то нет препятствий к тому чтобы создавать идентичные программы для всех этих платформ, написав исходный текст один раз, за исключением случаев, когда используются возможности, специфичные для разных операционных систем. Кросс-компиляция возможна благодаря MinGW32. Большое количество программ, исходный код которых ранее написан для работы с Xbase++, Flagship[уточнить], FoxPro, xHarbour и другими диалектами xBase, могут быть также достаточно легко адаптированы для компиляции через Harbour.

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

В проекте 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 в HBIDE.

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

Составные типы тоже можно представить в виде значений-литералов:

  • Array: { «Строка», 1, { «Вложенный массив» }, .T., FunctionCall(), @FunctionPointer() }
  • CodeBlock: { |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
  • Hash: { «Имя» => «Джон», 1 => «Числовой ключ», { «Вложенная» => «Хеш-таблица» } }

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

Блоки кода могут содержать ссылки на переменные процедуры, функции или метода, в котором определён блок кода. Такие блоки кода могут возвращаться в виде значения или в аргументе, передаваемом по ссылке; в этом случае блок кода «переживёт» подпрограмму, в которой он определён, и все переменные, на которые он ссылается, будут «отсоединенными (detached)» переменными.

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

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

Разработка клиент-серверных и Web-приложений

[править | править код]

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).

Примечания

[править | править код]
  1. 1 2 HwGUI на SourceForge.Net Архивная копия от 15 сентября 2013 на Wayback Machine (англ.)
  2. [1] англ. 
  3. 1 2 LetoDB на SourceForge.Net Архивная копия от 6 января 2010 на Wayback Machine (англ.)
  4. Official Harbour page Архивировано 5 июня 2012 года.
  5. Harbour для начинающих. Дата обращения: 17 декабря 2019. Архивировано 24 декабря 2019 года.
  6. Сайт Александра Кресина, автора Leto DB server. Дата обращения: 9 мая 2022. Архивировано 2 апреля 2022 года.