Harbour

Harbour
Harbour Project
Класс языка:

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

Автор(ы):

Antonio Linares

Релиз:

3.0.0

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

3.1.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 — для 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, требуется сравнительно небольшая адаптация[источник не указан 536 дней]. Большое количество программ, исходный код которых ранее написан для работы с 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 в 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-м году, его автор — Александр Кресин.[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).

Примечания

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужно сделать НИР?

Полезное


Смотреть что такое "Harbour" в других словарях:

  • Harbour — (Harbor, englisch Hafen ) steht für: Harbour (Compiler), einen Open Source Compiler Harbour ist der Familienname von: David Harbour (* 1975), US amerikanischer Schauspieler Dorothy Harbour (* 1959), US amerikanische Psychotherapeutin Matthew… …   Deutsch Wikipedia

  • harbour — har‧bour [ˈhɑːbə ǁ ˈhɑːrbər] , harbor noun [countable] an area of calm water next to the land, where boats arrive and leave: • The island has a fine modern harbour. • The harbour master (= someone in charge of a harbour ) may request the ship… …   Financial and business terms

  • Harbour — (spr. Harb r), 1) (H. Grace, spr. H. Grehs), Hauptstadt des Districts Conception Bai der Provinz (Insel) Neufundland (Britisch Nordamerika) an der Westküste der Conception Bai; 6000 Ew.; fruchtbare Umgegend; 2) (H. Island, spr. H. Eiländ), Insel… …   Pierer's Universal-Lexikon

  • harbour — British English spelling of HARBOR (Cf. harbor) (n. and v.); for spelling, see OR (Cf. or) …   Etymology dictionary

  • harbour — is spelt our in BrE and harbor in AmE …   Modern English usage

  • harbour — (US harbor) ► NOUN ▪ a place on the coast where ships may moor in shelter. ► VERB 1) keep (a thought or feeling) secretly in one s mind. 2) give a refuge or shelter to. 3) carry the germs of (a disease). ORIGIN Old English, «shelter» …   English terms dictionary

  • harbour — [här′bər] n., vt., vi. Brit. sp. of HARBOR …   English World dictionary

  • Harbour — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. Harbour désigne le plus souvent un port maritime. Sommaire 1 Localités 1.1 Australie …   Wikipédia en Français

  • harbour — (BrE) (AmE harbor) noun ADJECTIVE ▪ deep, deep water ▪ good, safe, sheltered ▪ natural ▪ bus …   Collocations dictionary

  • harbour — I UK [ˈhɑː(r)bə(r)] / US [ˈhɑrbər] noun [countable] Word forms harbour : singular harbour plural harbours ** a) an area of water near the land where it is safe for boats to stay. A port is a harbour where passengers and goods can be taken on and… …   English dictionary


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»