- Harbour
-
Harbour Project Класс языка: Автор(ы): Antonio Linares
Релиз: 3.0.0
Тестовая версия: 3.1.x доступна из SVN
Типизация данных: необязательная неявная, динамическая, защищенная, частично строгая
Диалекты: Clipper, Xbase++, Flagship, FoxPro, xHarbour
Испытал влияние: dBase, Clipper
Повлиял на: xHarbour
Лицензия Open source GPL-совместимая
Сайт: 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 — для Windows и GNU/Linux).
Harbour распространяется под свободной лицензией, схожей с GNU General Public License, за исключением того, что на Harbour возможно свободно разрабатывать и распространять коммерческие приложения (как пример тиражируемого коммерческого ПО − Система для учёта и управления предприятием БЭСТ-4+ [1]). См. также в конце статьи Тиражируемое ПО, написанное на Harbour.
Содержание
История создания
Первые версии Harbour в 1999 году создал основатель проекта испанский программист Антонио Линарес (исп. Antonio Linares). Название Harbour (рус. бухта, гавань) было дано проекту Линаресом по общности «морского контекста» с названием компилятора Clipper (рус. клиппер) (в смысле «безопасная гавань для клиппера»). Первое сообщение о «мыслях, витающих в воздухе» относительно адаптации ПО, написанного для Clipper, к новым реалиям, инициировав тем самым дискуссию, приведшую к созданию Harbour, Антонио Линарес опубликовал в Usenet-группе comp.lang.clipper 16 марта 1999 года. [2] англ.
В 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. Известные сторонние RDD — RDDSQL, RDDSIX, RMDBFCDX, ADS (англ. Advantage Database Server), Mediator. Такие RDD, как NETIO и LetoDB[1] дают возможность удаленного доступа к базам данных через TCP-протокол путем создания Web-приложений, функционирующих на стороне сервера локальной сети либо Web-сервера, с доступом пользователя к данным через сеть, используя любой Интернет-браузер и любую операционную систему.
Harbour также обеспечивает поддержку ODBC путем OOP-синтаксиса, и поддержку ADO через OLE. MySQL, PostgreSQL, SQLite, Firebird, Oracle Database — системы управления базами данных, с которыми также можно работать, используя Harbour.Концепции
В проекте Harbour стремятся к обеспечению кроссплатформенности на уровне исходных кодов при специфической компиляции под каждую платформу (написано однажды — компилируется везде, англ. write once, compile anywhere, в сравнении с написано однажды — работает везде, Write once, run anywhere (англ.) в языке Java). Если для некоего набора операционных систем есть подходящие для использования с Harbour компиляторы, то нет препятствий к тому чтобы создавать идентичные программы для всех этих платформ, написав исходный текст один раз — за исключением случаев, когда используются возможности, специфичные для разных операционных систем. Кросс-компиляция возможна благодаря MinGW32. Для переноса Clipper-приложения, работающего под DOS на другие платформы, например, Linux или Windows Mobile, требуется сравнительно небольшая адаптация . Большое количество программ, исходный код которых ранее написан для работы с 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, MiniGUI и Qt), так и коммерческие (например, FiveWin или Xailer). Взаимодействие с Qt производится через библиотеку HBQt.
Разработчиками проекта утверждается, что Harbour на 100 % совместим с Clipper на уровне исходного кода[2].
Макро-оператор (компилятор времени выполнения)
Одна из наиболее мощных возможностей 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 — как любой 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-м году, его автор — Александр Кресин.[3] В 2011-м году Letodb был существенно доработан и продолжает дорабатываться сообществом разработчиков, разработка координируется через сайт проекта LetoDB[1].
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).
ТаблицаПримечания
Ссылки
- Репозитарий дистрибутивов, документации и кода сообщества разработчиков Harbour на Sourceforge (англ.)
- Русскоязычное сообщество разработчиков по Clipper, Harbour, MiniGUI, Fivewin (рус.)
- Usenet-группа по Harbour/xHarbour на Google Groups (англ.)
- On-line документация по Harbour: «Harbour Reference Guide. 1st document to read» (последнее обновление — 28 января 2012) (англ.)
- Сообщество xHarbour User Group на Facebook (англ.)
Язык программирования xBase Реализации dBase · Clipper · Visual Objects · Visual FoxPro · Harbour Project · XBase++ · Flagship · xHarbour · Recital · Vulcan.NET · Cule.Net · CLIP · VP-Info Frameworks FiveWin · Class(y) · Harbour MiniGui · LetoDB · CA-Tools · Nantucket Forum · ooHG · HBQt · HBWxW · DBFree · Apollo · HwGUI · WxHarbour · xbGTK · xHGtk · T-Gtk IDE HBIDE · dBase · Xailer · Visual Objects Инструменты Mediator · DBFView · Advantage Database Server · EasyReport · Clip2Win Для улучшения этой статьи по информационным технологиям желательно?: - Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
- Переработать оформление в соответствии с правилами написания статей.
- Викифицировать статью.
- Исправить статью согласно стилистическим правилам Википедии.
Категории:- Программное обеспечение по алфавиту
- Языки программирования по алфавиту
- Языки программирования семейства xBase
Wikimedia Foundation. 2010.