Harbour

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Harbour Project
Тип

язык программирования

Класс языка:

императивный, структурированный, объектно-ориентированный

Автор(ы):

Antonio Linares

Релиз:

3.0.0

Тестовая версия:

3.2.x доступна из SVN

Система типов:

необязательная неявная, динамическая, защищенная, частично строгая

Диалекты:

Clipper, Xbase++, Flagship, FoxPro, xHarbour

Испытал влияние:

dBase, Clipper

Повлиял на:

xHarbour

Лицензия

Open source GPL-совместимая

Сайт:

http://www.harbour-project.org/

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 возможно свободно разрабатывать и распространять коммерческие приложения (как пример тиражируемого коммерческого ПО − Система для учёта и управления предприятием БЭСТ-4+ [1]). См. также в конце статьи Тиражируемое ПО, написанное на 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), по состоянию на настоящее время ведётся активное развитие и разработка, имеются как международное, так и языково-ориентированные (русский, испанский, португальский, итальянский и пр. языки) комьюнити разработчиков и пользователей.

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

Работа с базами данных[править | править вики-текст]

Harbour расширяет возможности использовавшихся в Clipper драйверов баз данных (RDD, англ. Replaceable Database Drivers). Он поддерживает традиционные для Clipper RDD — такие как DBF, DBFNTX, DBFCDX, DBFDBT и DBFFPT. В Harbour использовать разные RDD в одном приложении (например, брать данные из традиционной для Clipper базы данных в формате DBFNTX и записывать их в формате FoxPro — DBFCDX), а также создавать новые («логические») RDD из комбинации нескольких имеющихся. Архитектура RDD разрешает наследование, то есть новый RDD может использовать функциональные возможности уже имеющихся RDD. Для Harbour переписаны наиболее популярные RDD сторонних производителей: RDDSQL, RDDSIX, RMDBFCDX, ADS (англ. Advantage Database Server), Mediator. Такие RDD, как NETIO и LetoDB[2] дают возможность удаленного доступа к базам данных через TCP-протокол путем создания Web-приложений, функционирующих на стороне сервера локальной сети либо Web-сервера, с доступом пользователя к данным через сеть, используя любой Интернет-браузер и любую операционную систему.


Harbour также обеспечивает доступ к данным посредством ODBC и ADO. Созданы специальные библиотеки для доступа к некоторым популярным СУБД: MySQL, PostgreSQL, SQLite, Firebird, Oracle Database, используя C - API.

Концепции[править | править вики-текст]

В проекте Harbour стремятся к обеспечению кроссплатформенности на уровне исходных кодов при специфической компиляции под каждую платформу (написано однажды — компилируется везде, англ. write once, compile anywhere, в сравнении с написано однажды — работает везде, Write once, run anywhere (англ.) в языке Java). Если для некоего набора операционных систем есть подходящие для использования с Harbour компиляторы, то нет препятствий к тому чтобы создавать идентичные программы для всех этих платформ, написав исходный текст один раз — за исключением случаев, когда используются возможности, специфичные для разных операционных систем. Кросс-компиляция возможна благодаря MinGW32. Для переноса Clipper-приложения, работающего под DOS на другие платформы, например, Linux или Windows Mobile, требуется сравнительно небольшая адаптация[источник не указан 1113 дней]. Большое количество программ, исходный код которых ранее написан для работы с 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 на уровне исходного кода[3].

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

Одна из наиболее мощных возможностей 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

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

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

В Harbour наличествуют расширения, базирующиеся на синтаксисе CLASSy, для ООП-программирования с полной поддержкой классов, включая наследование. ООП-синтаксис в Harbour практически одинаков с тем, что ранее использовался в библиотеках классов для Clipper, в т.ч. вполне возможно без особых переделок использовать «унаследованный» Clipper-код.

Синтаксис и семантика языка[править | править вики-текст]

Код на 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[править | править вики-текст]

Leto DB Server (letodb) — это 32/64-разрядный многоплатформенный сервер Баз Данных, в основном предназначенный для клиентских программ, написанных на языке Harbour, для доступа к файлам dbf. Проект Letodb стартовал в 2008-м году, его автор — Александр Кресин.[4] В 2011-м году Letodb был существенно доработан и продолжает дорабатываться сообществом разработчиков, разработка координируется через сайт проекта LetoDB[2].

Letodb — это высокоэффективный RDBMS клиент-сервер для сетевых, автономных (локальных) и интернет — приложений базы данных. Letodb представлен как Open Source проект, разработанный под лицензией GPL, дающей право на его свободное использование. Преимуществом letodb является объединение традиционных средств xBase для доступа к Базам Данных и клиент-серверной технологии. Сервер letodb ответственен за весь доступ к базе данных (от имени клиентов). С оптимизированной методологией доступа к данным 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).

Примечания[править | править вики-текст]

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