Jump to content

Гавань (язык программирования)

Проект гавани
Парадигма мультипарадигмальность : императивная , функциональная , объектно-ориентированная , рефлексивная.
Разработано Антонио Линарес
Разработчик Виктор Сакац и сообщество
Впервые появился 1999 год ; 25 лет назад ( 1999 )
Стабильная версия
3.0.0 / 17 июля 2011 г .; 13 лет назад ( 17.07.2011 )
Предварительный выпуск
Дисциплина набора текста Опционально утиный , динамичный , безопасный , частично сильный
ТЫ Кросс-платформенный
Лицензия с открытым исходным кодом Совместимость с GPL
Расширения имен файлов .prg, .ch, .hb, .hbp
Веб-сайт гавань .github .что
Диалекты
Clipper, Xbase++, FlagShip, FoxPro, xHarbour
Под влиянием
dBase, клиппер
Под влиянием
xHarbour

Harbour — язык компьютерного программирования , в основном используемый для создания баз данных/бизнес-программ. Это модернизированная открытым исходным кодом версия с кроссплатформенная старой системы Clipper , которая, в свою очередь, возникла на рынке баз данных dBase 1980-х и 1990-х годов.

Код Harbour использует одни и те же базы данных и может быть скомпилирован под самые разные платформы, включая Microsoft Windows , Linux , варианты Unix , несколько BSD потомков , Mac OS X , MINIX 3 , Windows CE , Pocket PC , Symbian , iOS , Android , QNX. , VxWorks , OS/2 (включая eComStation и ArcaOS ), [1] БеОС / Хайку , AIX и MS-DOS .

Идея бесплатного компилятора Clipper витала в воздухе уже давно, и эта тема часто возникала в дискуссиях на comp.lang.clipper. Антонио Линарес основал проект «Гавань», реализация которого началась в марте 1999 года. Название «Гавань» было предложено Линаресом, это обыгрывание Клипера как типа корабля. Гавань — это синоним слова «порт» (где пришвартовываются корабли), а «Гавань» — это порт на языке Clipper.

В 2009 году гавань была существенно перепроектирована, главным образом Виктором Сакацем и Пшемыславом Черпаком.

Поддержка базы данных

[ редактировать ]

Harbor расширяет подход сменных драйверов базы данных Clipper (RDD). Он предлагает несколько RDD, таких как DBF , DBFNTX, DBFCDX, DBFDBT и DBFFPT. В Harbour в одном приложении можно использовать несколько RDD, а новые логические RDD можно определять путем объединения других RDD. Архитектура RDD допускает наследование, так что данный RDD может расширять функциональность других существующих RDD. Сторонние RDD, такие как RDDSQL, RDDSIX, RMDBFCDX, Advantage Database Server и Mediator, служат примером некоторых особенностей архитектуры RDD. Реализация DBFNTX имеет почти ту же функциональность, что и DBFCDX и RDDSIX. NETIO и LetoDB [2] обеспечить удаленный доступ по TCP протоколу .

Harbor также предлагает поддержку ODBC посредством синтаксиса ООП и поддержку ADO посредством OLE . MySQL , PostgreSQL , SQLite , Firebird , Oracle — примеры баз данных, к которым может подключаться Harbour.

Технологии xBase часто путают с программным обеспечением РСУБД . Хотя это правда, xBase — это нечто большее, чем просто система баз данных, поскольку в то же время языки xBase, использующие исключительно DBF, не могут обеспечить полную концепцию настоящей СУБД.

Философия программирования

[ редактировать ]

Harbour стремится быть написанным один раз и компилироваться где угодно . Поскольку один и тот же компилятор доступен для всех вышеперечисленных операционных систем, нет необходимости перекодировать для создания идентичных продуктов для разных платформ, за исключением случаев, когда используются функции, зависящие от операционной системы. Кросс-компиляция поддерживается MinGW . В Microsoft Windows Harbour более стабилен, но менее хорошо документирован, чем Clipper, но имеет многоплатформенность, более прозрачен, допускает больше настроек и может запускаться с USB-накопителя.

Под Linux и Windows Mobile исходный код Clipper можно скомпилировать с помощью Harbour с минимальной адаптацией. Большинство программ, изначально написанных для работы на диалектах Xbase++, FlagShip, FoxPro, xHarbour и других, можно скомпилировать с помощью Harbor с некоторой адаптацией. По состоянию на 2010 год было приложено много усилий, чтобы облегчить переход с других диалектов xBase .

Харбор может использовать, среди прочего, следующие компиляторы C: ССЗ , МинГВ , Кланг , ИКЦ , Microsoft Visual C++ (6.0+), Борланд С++ , Уотком С , Пеллес С и Студия Солнца .

Harbor может использовать эмуляцию нескольких графических терминалов, включая драйверы консоли, а также гибридные консоли/графические интерфейсы, такие как GTWvt и GTWvg.

Harbour бесплатно поддерживает внешние графические интерфейсы (например, HBQt, HWGui, Mini-GUI (последняя версия на основе Qt и QtContribs). [3] ) и коммерческие (например, FiveWin, Xailer). HBQt — это библиотека, предоставляющая привязки к Qt. Приложение HBIDE представляет собой образец потенциала HBQt.

Harbour на 100% совместим с Clipper [4] и поддерживает множество расширений синтаксиса языка, включая значительно расширенные библиотеки времени выполнения, такие как OLE , Blat, OpenSSL , Free Image, GD , hbtip, hbtpathy, PCRE , hbmzip ( zlib ), hbbz2 ( bzip2 ), cURL , Cairo , собственную реализацию CA-Tools, обновленные библиотеки NanFor и многие другие. Harbour имеет активное сообщество разработчиков и обширную поддержку третьих сторон.

Любой язык xBase обеспечивает очень продуктивный способ создания бизнес-приложений и приложений с интенсивным использованием данных. Харбор не является исключением.

Макрооператор (компилятор времени выполнения)

[ редактировать ]

Одной из наиболее мощных функций языков xBase является макрооператор «&». Реализация оператора макроса в Harbour позволяет компилировать во время выполнения любое допустимое выражение Harbour. Такое скомпилированное выражение может использоваться как ЗНАЧЕНИЕ, т. е. правая часть присваивания (rvalue), или может использоваться для разрешения левой стороны (lvalue) присваивания, т. е. частных или общедоступных переменных или поля базы данных.

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

Последняя версия компилятора макросов может скомпилировать любой допустимый код Harbour, включая код для каждой обработки перед компиляцией.

Синтаксис:

 &( ... )

Текстовое значение выражения '...' будет скомпилировано, а результатом будет значение, полученное в результате выполнения скомпилированного кода.

 &SomeId

это короткая форма для &( SomeId ).

 &SomeId.postfix

— это короткая форма &( SomeId + «постфикс»).

Объектно-ориентированное программирование

[ редактировать ]

Программирование в стиле ООП — это более широкий вопрос, чем конкретная библиотека или конкретный интерфейс, но программирование ООП — это то, чего ожидают многие программисты Clipper. В CA-Clipper 5.2 и особенно 5.3 добавлен ряд базовых классов и соответствующий синтаксис ООП. Такие библиотеки, как Class(y) , FieWin, Clip4Win и Top Class, предоставляют дополнительную функциональность ООП.

Harbor имеет расширения ООП с полной поддержкой классов, включая наследование, основанное на синтаксисе Class(y). Синтаксис ООП в Harbour очень похож на синтаксис более ранних библиотек классов Clipper, поэтому должна быть возможность поддерживать устаревший код Clipper с минимальными изменениями.

Синтаксис и семантика

[ редактировать ]
Код порта на HBIDE

Harbor, поскольку каждый язык xBase нечувствителен к регистру и может при необходимости принимать ключевые слова, записанные только их первыми четырьмя символами.

Встроенные типы данных

[ редактировать ]

Harbor имеет шесть скалярных типов: Nil , String , Date , Logical , Numeric , Pointer и четыре сложных типа: Array , Object , CodeBlock и Hash . Скаляр содержит одно значение, например строку, число или ссылку на любой другой тип. Массивы представляют собой упорядоченные списки скаляров или комплексных типов, индексированные по номеру, начиная с 1. Хэши или ассоциативные массивы представляют собой неупорядоченные коллекции значений любого типа, индексированные соответствующим ключом, который может иметь любой скалярный или комплексный тип.

Литеральное (статическое) представление скалярных типов:

  • Ноль: NIL
  • Нить: "hello", 'hello', [hello]
  • Дата: 0d20100405
  • Логично: .T., .F.
  • Числовой: 1, 1.1, −1, 0xFF

Сложные типы также могут быть представлены как литеральные значения:

  • Множество: { "String", 1, { "Nested Array" }, .T., FunctionCall(), @FunctionPointer() }
  • Кодовый Блок : { |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
  • Хэш: { "Name" => "John", 1 => "Numeric key", "Name2" => { "Nested" => "Hash" } }

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

Кодовые блоки могут иметь ссылки на переменные процедуры/функции>метода, в котором они были определены. Такие кодовые блоки могут быть возвращены как значение или посредством переданного аргумента. ПО ССЫЛКЕ , в таком случае Codeblock «переживет» процедуру, в которой он был определен, и любые переменные, на которые он ссылается, будут ОТДЕЛЕННАЯ переменная.

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

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

Переменные

[ редактировать ]

Все типы могут быть присвоены именованным переменным. Идентификаторы именованных переменных имеют длину от 1 до 63 символов ASCII, начинаются с [A-Z|_] и далее состоят из персонажей [A-Z|0–9|_] до 63 символов. Именованные переменные не чувствительны к регистру.

Переменные имеют одну из следующих областей:

  • LOCAL : Виден только внутри процедуры, которая его объявила. Значение теряется при выходе из процедуры.
  • STATIC : Виден только внутри процедуры, которая его объявила. Значение сохраняется для последующих вызовов процедуры. Если переменная STATIC объявлена ​​до определения какой-либо процедуры/функции/метода, она имеет область действия MODULE и видна в любой подпрограмме, определенной в том же исходном файле, она будет сохранять свое существование в течение всего срока службы приложения.
  • PRIVATE : Виден внутри подпрограммы, которая его объявила, и всех подпрограмм. вызывается этой процедурой.
  • ПУБЛИЧНЫЙ : Видно все процедуры в одном приложении.

МЕСТНЫЙ и STATIC разрешаются во время компиляции и, следовательно, работают намного быстрее, чем ЧАСТНЫЙ и PUBLIC переменные, которые являются динамическими объектами, доступ к которым осуществляется посредством таблицы символов времени выполнения . По этой же причине, МЕСТНЫЙ и СТАТИЧЕСКИЕ переменные не доступны компилятору макросов, и любой код макроса, который пытается ссылаться на них, вызовет ошибку во время выполнения.

В связи с динамичным характером ЧАСТНЫЙ и PUBLIC переменные, их можно создавать и уничтожать во время выполнения, а также получать к ним доступ и изменять с помощью макросов времени выполнения или кодовых блоков, создаваемых на лету.

Структуры управления

[ редактировать ]

Базовые структуры управления включают в себя все стандартные структуры управления dBase и Clipper , а также дополнительные, вдохновленные языками программирования C или Java :

[DO] WHILE ConditionExp
   ...
   [LOOP]
   [EXIT]
END[DO]
FOR Var := InitExp TO EndExp [STEP StepExp]
   ...
   [LOOP]
   [EXIT]
NEXT
FOR EACH Var IN CollectionExp
   ...
   [Var:__enumIndex()]
   [LOOP]
   [EXIT]
NEXT
  • ... . представляет собой последовательность одного или нескольких операторов Harbour и квадратных скобок [] обозначают необязательный синтаксис.
  • Var . :__enumIndex() может опционально использоваться для получения текущего индекса итерации (на основе 1)
  • Оператор LOOP перезапускает текущую итерацию структуры охватывающего цикла, и если охватывающий цикл представляет собой цикл FOR или FOR EACH , он увеличивает итератор, переходя к следующей итерации цикла.
  • Оператор EXIT немедленно прекращает выполнение структуры включающего цикла.
  • Оператор NEXT закрывает структуру управления и переходит к следующей итерации структуры цикла.

В FOR инструкции выражение присваивания вычисляется перед первой итерацией цикла. Выражение TO оценивается и сравнивается со значением управляющей переменной перед каждой итерацией, и цикл завершается, если его значение превышает числовое значение управляющей переменной. Необязательное выражение STEP оценивается после каждой итерации перед принятием решения о выполнении следующей итерации.

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

ЕСЛИ утверждения

[ редактировать ]
IF CondExp
   ...
[ELSEIF] CondExp
   ...
[ELSE]
   ...
END[IF]

... представляет 0 или более утверждений .

Выражения условия должны иметь ЛОГИЧЕСКОЕ значение.

Операторы SWITCH

[ редактировать ]

Harbour поддерживает конструкцию SWITCH, основанную на реализации метода switch() на языке C.

SWITCH SwitchExp
CASE LiteralExp
   ...
   [EXIT]
[CASE LiteralExp]
   ...
   [EXIT]
[OTHERWISE]
   ...
END[SWITCH]
  • LiteralExp должен быть числовым выражением, разрешаемым во время компиляции, и может включать в себя операторы, если такие операторы включают статическое значение времени компиляции.
  • Необязательный оператор EXIT и если он присутствует, выполнение структуры SWITCH завершится при достижении оператора EXIT, в противном случае оно продолжится с первого оператора , эквивалентен оператору Cbreak , расположенного ниже следующего оператора CASE (проваливается).

Операторы BEGIN SEQUENCE

[ редактировать ]
BEGIN SEQUENCE
   ...
   [BREAK]
   [Break( [Exp] )]
RECOVER [USING Var]
   ...
END[SEQUENCE]

или:

BEGIN SEQUENCE
   ...
   [BREAK]
   [Break()]
END[SEQUENCE]

Структура BEGIN SEQUENCE позволяет корректно прерывать любую последовательность, даже при пересечении вложенных процедур/функций. Это означает, что вызываемая процедура/функция может выдать оператор BREAK или выражение Break(), чтобы принудительно развернуть любую вложенную процедуру/функцию вплоть до первой внешней структуры BEGIN SEQUENCE либо после соответствующего оператора END. или предложение RECOVER, если оно присутствует. Оператор Break может опционально передавать выражение любого типа, которое может быть принято оператором RECOVER для обеспечения дальнейшей обработки восстановления.

Кроме того, объект Harbour Error поддерживает свойства canDefault , canRetry и canSubstitute , которые позволяют обработчикам ошибок выполнять некоторые приготовления, а затем запрашивать операцию Retry , Resume или возвращать значение для замены выражения, вызывающего состояние ошибки.

В качестве альтернативы операторы TRY [CATCH] [FINALLY] доступны в библиотеке xhb и работают как конструкция SEQUENCE.

Процедуры и функции

[ редактировать ]
[STATIC] PROCEDURE SomeProcedureName
[STATIC] PROCEDURE SomeProcedureName()
[STATIC] PROCEDURE SomeProcedureName( Param1 [, ParamsN] )
INIT PROCEDURE SomeProcedureName
EXIT PROCEDURE SomeProcedureName
[STATIC] FUNCTION SomeProcedureName
[STATIC] FUNCTION SomeProcedureName()
[STATIC] FUNCTION SomeProcedureName( Param1 [, ParamsN] )

Процедуры и функции в Harbour можно указать с помощью ключевых слов PROCEDURE, или FUNCTION. Правила именования такие же, как и для переменных (до 63 символов без учета регистра). И процедуры, и функции могут быть уточнены квалификатором области STATIC, чтобы ограничить их использование областью модуля, где он определен.

Необязательные квалификаторы INIT . или EXIT помечают процедуру, которая будет автоматически вызываться непосредственно перед вызовом процедуры запуска приложения или сразу после выхода из приложения соответственно Параметры , передаваемые в процедуру/функцию, появляются в подпрограмме как локальные переменные и могут принимать любой тип, включая ссылки.

Изменения переменных аргументов не отражаются в соответствующих переменных, передаваемых вызывающей процедурой/функцией/методом, если они не передаются явно ПО ССЫЛКЕ с использованием префикса @ .

PROCEDURE не имеет возвращаемого значения и, если используется в контексте выражения, выдаст значение NIL .

FUNCTION может возвращать любой тип с помощью оператора RETURN в любом месте тела своего определения.

Ниже приведен пример определения процедуры и вызова функции:

 x := Cube( 2 )

 FUNCTION Cube( n )
    RETURN n ** 3

Пример кода

[ редактировать ]

Типичная программа « hello world » будет такой:

  ? "Hello, world!"

Или:

  QOut( "Hello, world!" )

Или:

  Alert( "Hello, world!" )

Или, заключенный в явную процедуру:

 PROCEDURE Main()

    ? "Hello, world!"

    RETURN

примеры ООП

[ редактировать ]

Основная процедура:

 #include "hbclass.ch"

 PROCEDURE Main()

    LOCAL oPerson

    CLS

    oPerson := Person():New( "Dave" )
    oPerson:Eyes := "Invalid"
    oPerson:Eyes := "Blue"

    Alert( oPerson:Describe() )

    RETURN

Определение класса:

 CREATE CLASS Person

    VAR Name INIT ""

    METHOD New( cName )
    METHOD Describe()

    ACCESS Eyes INLINE ::pvtEyes
    ASSIGN Eyes( x ) INLINE iif( HB_ISSTRING( x ) .AND. x $ "Blue,Brown,Green", ::pvtEyes := x, Alert( "Invalid value" ) )

    PROTECTED:

    VAR pvtEyes

 ENDCLASS

 // Sample of normal Method definition
 METHOD New( cName ) CLASS Person

    ::Name := cName

    RETURN Self

 METHOD Describe() CLASS Person

    LOCAL cDescription

    IF Empty( ::Name )
       cDescription := "I have no name yet."
    ELSE
       cDescription := "My name is: " + ::Name + ";"
    ENDIF

    IF ! Empty( ::Eyes )
       cDescription += "my eyes' color is: " + ::Eyes
    ENDIF

    RETURN cDescription

Инструменты

[ редактировать ]
  • hbmk2 — инструмент сборки, такой как make
  • hbrun — интерпретатор оболочки для Harbour. Компиляция макросов позволяет запускать любой допустимый код Harbour во время его компиляции.
  • hbformat — форматирует исходный код, написанный на Harbour или другом диалекте, в соответствии с определенными правилами.
  • hbpp — препроцессор, мощный инструмент, позволяющий избежать типичных проблем, возникающих в языке C для каждого процессора.
  • hbi18n – Инструменты для локализации текста в приложениях.
  • hbdoc — Создает документацию для Harbour.

Все инструменты мультиплатформенные.

Разработка

[ редактировать ]
ХБИДЕ посмотрите.

Сегодня разработкой Harbour руководит Виктор Сакац в сотрудничестве с Пшемыславом Черпаком, который также вносит множество компонентов основного языка и дополнительных компонентов. HBIDE и некоторые другие компоненты, особенно HBQt, разработаны Притпалом Беди. Другие члены сообщества разработчиков отправляют изменения в репозиторий исходного кода GitHub . [5] По состоянию на 2015 год развитие гавани идет активно и динамично.

Сравнение xHarbour

[ редактировать ]

xHarbour — это форк [6] более раннего проекта Harbour. xHarbour использует более агрессивный подход к реализации новых функций в языке, в то время как Harbour более консервативен в своем подходе, стремясь в первую очередь к точному воспроизведению поведения Clipper, а затем реализуя новые функции и расширения в качестве второстепенного соображения. Следует также отметить, что Harbour поддерживается в самых разных операционных системах , тогда как xHarbour действительно поддерживает только 32-разрядные версии MS Windows и Linux.

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

Разработчики Harbour явно отвергают расширения языка, если эти расширения нарушают совместимость с Clipper. Эти отклонения были недавно смягчены, поскольку новая архитектура Harbour позволяет расширять возможности базового компилятора.

Подробное сравнение расширений, реализованных в Harbor и xHarbour, можно найти в исходном репозитории проекта на GitHub. [7]

Библиотеки и инструменты графического интерфейса

[ редактировать ]

См. также

[ редактировать ]
  1. ^ «Гавань» . Проверено 3 сентября 2020 г.
  2. ^ «ЛетоДБ» . Sourceforge.net . Проверено 9 декабря 2013 г.
  3. ^ «QtContribs — Проекты Harbour Qt» . СоурсФордж .
  4. ^ «Официальная страница порта» . Проект гавани . Проверено 9 декабря 2013 г.
  5. ^ «гавань 路 GitHub» . Гитхаб.com . Проверено 9 декабря 2013 г.
  6. ^ «О xHarbour» . Xharbour.org . Проверено 9 декабря 2013 г.
  7. ^ "xhb-diff.txt" . Гитхаб . Проверено 9 декабря 2013 г.
  8. ^ vailtom (17 августа 2009 г.). «Расширенная версия Harbour MiniGUI. | Бесплатное программное обеспечение для связи можно загрузить на сайте» . Sourceforge.net . Проверено 9 декабря 2013 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 15d1b3bf17687d71ef8ebb0a89cbba32__1722502020
URL1:https://arc.ask3.ru/arc/aa/15/32/15d1b3bf17687d71ef8ebb0a89cbba32.html
Заголовок, (Title) документа по адресу, URL1:
Harbour (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)