Harbour es un lenguaje de programación de computadoras , utilizado principalmente para crear programas de base de datos / negocios. Es una versión modernizada, de código abierto y multiplataforma del antiguo sistema Clipper , que a su vez se desarrolló a partir del mercado de bases de datos dBase de las décadas de 1980 y 1990.
Paradigma | multi-paradigma : imperativo , funcional , orientado a objetos , reflexivo |
---|---|
Diseñada por | Antonio Linares |
Desarrollador | Viktor Szakáts y la comunidad |
Apareció por primera vez | 1999 |
Lanzamiento estable | 3.0.0 / 17 de julio de 2011 |
Versión de vista previa | |
Disciplina de mecanografía | Opcionalmente pato , dinámico , seguro , parcialmente fuerte |
SO | Multiplataforma |
Licencia | Compatible con GPL de código abierto |
Extensiones de nombre de archivo | .prg, .ch, .hb, .hbp |
Sitio web | puerto |
Dialectos | |
Clipper, Xbase ++, FlagShip, FoxPro, xHarbour | |
Influenciado por | |
dBase, Clipper | |
Influenciado | |
xHarbour |
El código Harbour utilizando las mismas bases de datos se puede compilar en una amplia variedad de plataformas, incluidas Microsoft Windows , Linux , variantes de Unix , varios descendientes de BSD , Mac OS X , MINIX 3 , Windows CE , Pocket PC , Symbian , iOS , Android , QNX , VxWorks , OS / 2 (incluidos eComStation y ArcaOS ), [1] BeOS / Haiku , AIX y MS-DOS .
Historia
La idea de un compilador Clipper de software libre ha estado flotando durante mucho tiempo y el tema ha surgido a menudo en la discusión en comp.lang.clipper. Antonio Linares fundó el proyecto del Puerto y la implementación se inició en marzo de 1999. El nombre "Puerto" fue propuesto por Linares, es un juego de un Clipper como tipo de barco. Harbour es un sinónimo de puerto (donde atracan los barcos) y Harbour es un puerto del idioma Clipper.
En 2009, Harbour fue rediseñado sustancialmente, principalmente por Viktor Szakáts y Przemyslaw Czerpak.
Soporte de base de datos
Harbour amplía el enfoque de Controladores de bases de datos reemplazables (RDD) de Clipper. Ofrece múltiples RDD como DBF , DBFNTX, DBFCDX, DBFDBT y DBFFPT. En Harbour, se pueden usar varios RDD en una sola aplicación, y se pueden definir nuevos RDD lógicos combinando otros RDD. La arquitectura RDD permite la herencia, de modo que un RDD dado puede extender la funcionalidad de otros RDD existentes. Los RDD de terceros, como RDDSQL, RDDSIX, RMDBFCDX, Advantage Database Server y Mediator, ejemplifican algunas de las características de la arquitectura RDD. La implementación de DBFNTX tiene casi la misma funcionalidad que DBFCDX y RDDSIX. NETIO y LetoDB [2] proporcionan acceso remoto a través del protocolo TCP .
Harbour también ofrece soporte ODBC mediante una sintaxis OOP y soporte ADO mediante OLE . MySQL , PostgreSQL , SQLite , Firebird , Oracle son ejemplos de bases de datos que Harbour puede conectar.
Las tecnologías xBase a menudo se confunden con un software RDBMS . Aunque esto es cierto, xBase es más que un simple sistema de base de datos, ya que al mismo tiempo, los lenguajes xBase que utilizan únicamente DBF no pueden proporcionar un concepto completo de un RDBMS real.
Filosofía de programación
A diferencia de Java, que está diseñado para escribirse una vez y ejecutarse en cualquier lugar, Harbour pretende escribirse una vez y compilarse en cualquier lugar . Como el mismo compilador está disponible para todos los sistemas operativos anteriores, no hay necesidad de recodificar para producir productos idénticos para diferentes plataformas, excepto cuando se utilizan características dependientes del sistema operativo. La compilación cruzada es compatible con MinGW . Con Microsoft Windows, Harbour es más estable pero menos documentado que Clipper, pero tiene capacidad multiplataforma y es más transparente, personalizable y puede ejecutarse desde una unidad flash USB.
En Linux y Windows Mobile, el código fuente de Clipper se puede compilar con Harbour con muy poca adaptación. La mayoría del software escrito originalmente para ejecutarse en Xbase ++, FlagShip, FoxPro, xHarbour y otros dialectos se pueden compilar con Harbour con alguna adaptación. En 2010, se han realizado muchos esfuerzos para facilitar la transición de otros dialectos xBase .
Harbour puede utilizar los siguientes compiladores de C, entre otros: GCC , MinGW , Clang , ICC , Microsoft Visual C ++ (6.0+), Borland C ++ , Watcom C , Pelles C y Sun Studio .
Harbour puede hacer uso de múltiples emulaciones de terminal gráfico , incluidos controladores de consola y consolas híbridas / GUI, como GTWvt y GTWvg.
Harbour admite GUI externas, gratuitas (p. Ej. HBQt, HWGui, MiniGUI (última versión basada en Qt y QtContribs [3] )) y comerciales (p. Ej., FiveWin, Xailer). potencial.
Harbour es 100% compatible con Clipper [4] y admite muchas extensiones de sintaxis de idiomas, incluidas bibliotecas de tiempo de ejecución muy extendidas como OLE , Blat , OpenSSL , FreeImage , GD , hbtip, hbtpathy, PCRE , hbmzip ( zlib ), hbbz2 ( bzip2 ) , cURL , Cairo , su propia implementación de CA-Tools, bibliotecas NanFor actualizadas y muchas otras. Harbour tiene una comunidad de desarrollo activa y un amplio soporte de terceros.
Cualquier lenguaje xBase proporciona una forma muy productiva de crear aplicaciones empresariales y de uso intensivo de datos. Harbour no es una excepción.
Operador de macros (compilador en tiempo de ejecución)
Una de las características más poderosas de los lenguajes xBase es el Macro Operador '&'. La implementación de Harbour del Macro Operador permite la compilación en tiempo de ejecución de cualquier expresión válida de Harbour. Dicha expresión compilada puede usarse como VALOR, es decir, el lado derecho de una asignación (rvalue), pero dicha expresión compilada puede usarse para resolver el lado izquierdo (lvalue) de una asignación, es decir, variables privadas o públicas, o un campo de base de datos.
Además, el operador de macro puede compilar y ejecutar llamadas a funciones, completar asignaciones o incluso una lista de argumentos, y el resultado de la macro puede usarse para resolver cualquiera de los contextos anteriores en la aplicación compilada. En otras palabras, cualquier aplicación Harbour puede ampliarse y modificarse en tiempo de ejecución para compilar y ejecutar código adicional bajo demanda.
El último compilador de macros puede compilar cualquier código Harbour válido, incluido el código para preprocesar antes de compilar.
Sintaxis:
& (...)
Se compilará el valor de texto de la expresión '...', y el valor resultante de la ejecución del código compilado es el resultado.
& SomeId
es la forma abreviada de & (SomeId).
& SomeId.postfix
es la forma corta de & (SomeId + "postfix").
Programación orientada a objetos
Programar en un estilo OOP es un tema más amplio que una biblioteca específica o una interfaz específica, pero la programación OOP es algo que muchos programadores de Clipper esperan. CA-Clipper 5.2 y especialmente 5.3 agregaron una serie de clases base y una sintaxis OOP coincidente. Bibliotecas como Class (y) , Fivewin, Clip4Win y TopClass proporcionan funcionalidad OOP adicional.
Harbour tiene extensiones OOP con soporte completo para clases, incluida la herencia, basadas en la sintaxis de Class (y). La sintaxis de OOP en Harbour es muy similar a la de las bibliotecas de clases de Clipper anteriores, por lo que debería ser posible mantener el código heredado de Clipper con cambios mínimos.
Sintaxis y semántica
Harbour, como todos los idiomas xBase, no distingue entre mayúsculas y minúsculas y, opcionalmente, puede aceptar palabras clave escritas solo por sus primeros cuatro caracteres.
Tipos de datos integrados
Harbor tiene seis tipos escalares: Nil , String , Date , Logical , Numeric , Pointer y cuatro tipos complejos: Array , Object , CodeBlock y Hash . Un escalar contiene un solo valor, como una cadena, numérico o referencia a cualquier otro tipo. Las matrices son listas ordenadas de escalares o tipos complejos, indexadas por número, comenzando en 1. Los hashes, o matrices asociativas , son colecciones desordenadas de cualquier tipo de valores indexados por su clave asociada, que puede ser de cualquier tipo escalar o complejo.
Representación literal (estática) de tipos escalares:
- Nulo:
NIL
- Cuerda:
"hello", 'hello', [hello]
- Fecha:
0d20100405
- Lógico:
.T., .F.
- Numérico:
1, 1.1, −1, 0xFF
Los tipos complejos también se pueden representar como valores literales:
- Formación:
{ "String", 1, { "Nested Array" }, .T., FunctionCall(), @FunctionPointer() }
- CodeBlock :
{ |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
- Picadillo:
{ "Name" => "John", 1 => "Numeric key", "Name2" => { "Nested" => "Hash" } }
Los hash pueden usar cualquier tipo, incluidos otros hash, como clave para cualquier elemento. Los hash y las matrices pueden contener cualquier tipo como valor de cualquier miembro, incluidas las matrices anidadas y los hash.
Los bloques de código pueden tener referencias a variables del método Procedimiento / Función> en el que se definió. Tales Codeblocks pueden ser devueltos como un valor, o por medio de un argumento pasado POR REFERENCIA , en tal caso el Codeblock "sobrevivirá" a la rutina en la que fue definido, y cualquier variable a la que haga referencia, será un Variable INDEPENDIENTE .
Las variables separadas mantendrán su valor mientras exista un bloque de código que las haga referencia. Dichos valores se compartirán con cualquier otro Codeblock que pueda tener acceso a esas mismas variables. Si el Codeblock no sobrevivió a la rutina que lo contenía y se evaluará dentro de la vida útil de la rutina en la que está definido, los cambios en sus Variables Separadas mediante su evaluación se reflejarán en su rutina principal.
Los bloques de código pueden evaluarse tantas veces como desee, mediante el Función Eval ( BlockExp ) .
Variables
Todos los tipos se pueden asignar a variables con nombre. Los identificadores de variables con nombre tienen de 1 a 63 caracteres ASCII de longitud, comienzan con [A-Z|_]
y además constan de los caracteres [A-Z|0–9|_]
hasta un máximo de 63 caracteres. Las variables con nombre no distinguen entre mayúsculas y minúsculas.
Las variables tienen uno de los siguientes ámbitos:
- LOCAL : Visible solo dentro de la rutina que lo declaró. El valor se pierde al salir de la rutina.
- ESTÁTICO : Visible solo dentro de la rutina que lo declaró. El valor se conserva para invocaciones posteriores de la rutina. Si una variable ESTÁTICA se declara antes de que se defina cualquier Procedimiento / Función / Método, tiene un alcance de MÓDULO y es visible dentro de cualquier rutina definida dentro de ese mismo archivo fuente, mantendrá su vida mientras dure la vida de la aplicación.
- PRIVADO : Visible dentro de la rutina que lo declaró, y todas las rutinas llamado por esa rutina.
- PÚBLICO : Visible por todas las rutinas en la misma aplicación.
LOCAL y STATIC se resuelven en tiempo de compilación y, por lo tanto, son mucho más rápidos que PRIVADO y Variables PÚBLICAS que son entidades dinámicas a las que se accede mediante una tabla de símbolos en tiempo de ejecución . Por esta misma razón LOCAL y Las variables ESTÁTICAS son no expuestos al compilador de macros, y cualquier código de macro que intente hacer referencia a ellos generará un error de tiempo de ejecución.
Debido a la naturaleza dinámica de PRIVADO y Variables PÚBLICAS , se pueden crear y destruir en tiempo de ejecución, se puede acceder y modificar mediante macros en tiempo de ejecución, y se puede acceder y modificar mediante bloques de código creados sobre la marcha.
Estructuras de Control
Las estructuras de control básicas incluyen todas las estructuras de control estándar de dBase y Clipper , así como otras adicionales inspiradas en los lenguajes de programación C o Java :
Bucles
[HACER] MIENTRAS ConditionExp ... [CÍRCULO] [SALIDA]FIN [HACER]
PARA Var : = InitExp TO EndExp [STEP StepExp ] ... [CÍRCULO] [SALIDA]SIGUIENTE
PARA CADA Var IN CollectionExp ... [ Var : __ enumIndex ()] [CÍRCULO] [SALIDA]SIGUIENTE
- El ... es una secuencia de una o más declaraciones Harbour, y los corchetes [] denotan sintaxis opcional.
- El Var : __ enumIndex () se puede usar opcionalmente para recuperar el índice de iteración actual (1 basado).
- La instrucción LOOP reinicia la iteración actual de la estructura del bucle circundante, y si el bucle circundante es un bucle FOR o FOR EACH , aumenta el iterador, pasando a la siguiente iteración del bucle.
- La instrucción EXIT termina inmediatamente la ejecución de la estructura de bucle circundante.
- La instrucción NEXT cierra la estructura de control y pasa a la siguiente iteración de estructura de bucle.
En la instrucción FOR , la expresión de asignación se evalúa antes de la primera iteración del ciclo. La expresión TO se evalúa y compara con el valor de la variable de control, antes de cada iteración, y el ciclo se termina si se evalúa a un valor numérico mayor que el valor numérico de la variable de control. La expresión STEP opcional se evalúa después de cada iteración, antes de decidir si se realiza la siguiente iteración.
En FOR EACH , la variable Var tendrá el valor (escalar o complejo) del elemento respectivo en el valor de la colección. La expresión de la colección puede ser una matriz (de cualquier tipo o combinación de tipos), una tabla hash o un tipo de objeto.
Declaraciones IF
IF CondExp ... [ELSEIF] CondExp ...[DEMÁS] ...TERMINARA SI]
... representa 0 o más declaraciones .
La (s) expresión (es) de condición tiene que evaluarse a un valor LÓGICO .
Declaraciones SWITCH
Harbour admite una construcción SWITCH inspirada en la implementación en C de switch ().
INTERRUPTOR SwitchExp CASE LiteralExp ... [SALIDA][CASE LiteralExp ] ... [SALIDA][DE LO CONTRARIO] ...FIN [CAMBIAR]
- El LiteralExp debe ser una expresión numérica resoluble vez compilado, y puede involucrar a los operadores, siempre y cuando dichos operadores implican valor estático en tiempo de compilación.
- La instrucción opcional EXIT es equivalente a la ruptura de la instrucción C y, si está presente, la ejecución de la estructura SWITCH finalizará cuando se alcance la instrucción EXIT; de lo contrario, continuará con la primera instrucción debajo de la siguiente instrucción CASE (caída).
Declaraciones BEGIN SEQUENCE
COMENZAR SECUENCIA ... [ROTURA] [Descanso ([ Exp ])]RECUPERAR [USANDO Var ] ...FIN [SECUENCIA]
o:
COMENZAR SECUENCIA ... [ROTURA] [Rotura()]FIN [SECUENCIA]
La estructura BEGIN SEQUENCE permite un aborto con buen comportamiento de cualquier secuencia, incluso cuando se cruzan procedimientos / funciones anidados. Esto significa que un procedimiento / función llamado, puede emitir una instrucción BREAK, o una expresión Break (), para forzar el despliegue de cualquier procedimiento / función anidado, hasta la primera estructura externa BEGIN SEQUENCE, ya sea después de su respectiva instrucción END. , o una cláusula RECOVER si está presente. La instrucción Break puede pasar opcionalmente cualquier tipo de expresión, que puede ser aceptada por la instrucción RECOVER para permitir una mayor gestión de recuperación.
Además, el Harbour Error Object admite las propiedades canDefault , canRetry y canSubstitute , lo que permite a los controladores de errores realizar algunas preparaciones y luego solicitar una operación de reintento , una reanudación o devolver un valor para reemplazar la expresión que desencadena la condición de error.
Alternativamente, las sentencias TRY [CATCH] [FINALLY] están disponibles en la biblioteca xhb que funcionan como la construcción SEQUENCE.
Procedimientos / Funciones
[ESTÁTICO] PROCEDIMIENTO SomeProcedureName [ESTÁTICO] PROCEDIMIENTO SomeProcedureName ()[ESTÁTICO] PROCEDIMIENTO SomeProcedureName ( Param1 [, ParamsN ])
PROCEDIMIENTO INICIAL SomeProcedureName PROCEDIMIENTO DE SALIDA SomeProcedureName
FUNCIÓN [ ESTÁTICA ] SomeProcedureName [ ESTÁTICA ] FUNCIÓN SomeProcedureName ()FUNCIÓN [ ESTÁTICA ] SomeProcedureName ( Param1 [, ParamsN ])
Los procedimientos / funciones en Harbour se pueden especificar con las palabras clave PROCEDURE
o FUNCTION
. Las reglas de nomenclatura son las mismas que las de las variables (hasta 63 caracteres sin distinción entre mayúsculas y minúsculas). Tanto los procedimientos como las funciones pueden ser calificados por el calificador de alcance STATIC para restringir su uso al alcance del módulo donde se define.
Los calificadores opcionales INIT o EXIT marcarán el procedimiento para que se invoque automáticamente justo antes de llamar al procedimiento de inicio de la aplicación o justo después de salir de la aplicación, respectivamente. Los parámetros pasados a un procedimiento / función aparecen en la subrutina como variables locales y pueden aceptar cualquier tipo, incluidas las referencias.
Los cambios en las variables de argumento no se reflejan en las variables respectivas pasadas por el procedimiento / función / método de llamada a menos que sean pasadas explícitamente POR REFERENCIA usando el prefijo @ .
PROCEDURE no tiene valor de retorno y, si se usa en un contexto de expresión, producirá un valor NIL .
FUNCTION puede devolver cualquier tipo mediante la instrucción RETURN, en cualquier parte del cuerpo de su definición.
A continuación, se muestra un ejemplo de definición de procedimiento y una llamada a función:
x : = Cubo (2) FUNCIÓN Cubo (n) RETORNO n ** 3
Código de muestra
El programa típico de " hola mundo " sería:
? "¡Hola Mundo!"
O:
QOut ( "¡Hola, mundo!" )
O:
Alerta ( "¡Hola, mundo!" )
O, incluido en un procedimiento explícito:
PROCEDIMIENTO Principal () ? "¡Hola Mundo!" REGRESO
Ejemplos de programación orientada a objetos
Procedimiento principal:
#include "hbclass.ch" PROCEDIMIENTO Principal () PERSONA LOCAL CLS oPersona : = Pers en (): Nuevo ( "Dave" ) oPersona : Ojos: = "Inválido" oPersona : Ojos: = "Azul" Alerta (oPerson: Describe ()) REGRESO
Definición de clase:
CREAR CLASE Persona VAR Nombre INIT "" MÉTODO Nuevo (cName) MÉTODO Describe () ACCESO a los ojos EN LÍNEA :: pvtEyes ASSIGN Eyes (x) INLINE iif (HB_ISSTRING (x) .AND. X $ "Azul, Marrón, Verde", :: pvtEyes: = x, Alerta ("Valor no válido")) PROTEGIDO: VAR pvtEyes ENDCLASS // Muestra de la definición del método normal MÉTODO Nueva persona de CLASE (cName) :: Nombre: = cName VOLVER Auto MÉTODO Describa () CLASE Persona LOCAL c Descripción SI Vacío (:: Nombre) cDescription: = "Aún no tengo un nombre". DEMÁS cDescription: = "Mi nombre es:" + :: Nombre + ";" TERMINARA SI SI ! Ojos vacíos ) cDescription + = "el color de mis ojos es:" + :: Ojos TERMINARA SI DEVOLUCIÓN c Descripción
Herramientas
- hbmk2 - Herramienta de construcción como make
- hbrun: intérprete de Shell para Harbour. La compilación de macros permite ejecutar cualquier código Harbour válido mientras se compila
- hbformat: formatea el código fuente escrito en Harbour u otro dialecto de acuerdo con reglas definidas
- hbpp: preprocesador, una poderosa herramienta que evita los problemas típicos que se encuentran en el preprocesador del lenguaje C
- hbi18n: herramientas para localizar texto en aplicaciones
- hbdoc: crea documentación para Harbour
Todas las herramientas son multiplataforma.
Desarrollo
Hoy en día, el desarrollo de Harbour está dirigido por Viktor Szakáts en colaboración con Przemysław Czerpak, quien también contribuye con muchos componentes del lenguaje principal y componentes complementarios. HBIDE y algunos otros componentes, especialmente HBQt, son desarrollados por Pritpal Bedi. Otros miembros de la comunidad de desarrollo envían cambios al repositorio de origen de GitHub . [5] A partir de 2015, el desarrollo del puerto es activo y vibrante.
xComparación de puertos
xHarbour es una bifurcación [6] del proyecto Harbour anterior. xHarbour adopta un enfoque más agresivo para implementar nuevas funciones en el lenguaje, mientras que Harbour es más conservador en su enfoque, apuntando en primer lugar a una réplica exacta del comportamiento de Clipper y luego implementando nuevas funciones y extensiones como consideración secundaria. También debe tenerse en cuenta que Harbour es compatible con una amplia variedad de sistemas operativos, mientras que xHarbour solo es compatible con MS Windows y Linux de 32 bits.
Los desarrolladores de Harbour han intentado documentar todo el comportamiento oculto en el lenguaje Clipper y probar el código compilado por Harbour junto con el mismo código compilado con Clipper para mantener la compatibilidad.
Los desarrolladores de Harbour rechazan explícitamente las extensiones del lenguaje donde esas extensiones romperían la compatibilidad con Clipper. Estos rechazos se suavizaron recientemente ya que la nueva arquitectura Harbour permite extensiones fuera del compilador central.
Se puede encontrar una comparación detallada entre las extensiones implementadas en Harbour y xHarbour en el repositorio de origen del proyecto en GitHub. [7]
Bibliotecas y herramientas GUI
- hbide - Entorno de desarrollo integrado para ayudar al desarrollo de Harbour y varios dialectos xBase
- PTSource IDE : el entorno de desarrollo integrado incluye Harbour.
- HwGui : biblioteca de GUI multiplataforma de código abierto para Harbour
- HMG -Sistema de desarrolloxBase Win32 / GUI gratuito / de código abiertopara Harbour
- MiniGUI [8] - Sistema de desarrollo xBase Win32 / GUI gratuito / de código abierto (una bifurcación (desarrollo de software) tanto de HMG como de Harbour)
- ooHG - GUI de puerto orientado a objetos - una bifurcación "basada en clases y programación oop" de HMG
- Marinas-GUI - Paquete de desarrollo de GUI basado en QT multiplataforma para Harbour. Marinas-GUI se descarga como un paquete de instalación completo para la plataforma de destino elegida (IDE, Control de versiones, Compilador Harbour / C, Bibliotecas, etc.) - Básicamente instale y comience a codificar y compilar.
Ver también
- FlagShip por multisoft
- Visual FoxPro
- Objetos visuales
- Xbase ++
- Soporte de lenguaje de programación visual de código abierto gratuito PWCT Harbour a través de Harbour
Referencias
- ^ "Puerto" . Consultado el 3 de septiembre de 2020 .
- ^ "LetoDB" . Sourceforge.net . Consultado el 9 de diciembre de 2013 .
- ^ "QtContribs - Proyectos de Harbour Qt" . SourceForge .
- ^ "Página oficial del puerto" . El proyecto del puerto . Consultado el 9 de diciembre de 2013 .
- ^ "puerto 路 GitHub" . Github.com . Consultado el 9 de diciembre de 2013 .
- ^ "Acerca de xHarbour" . Xharbour.org . Consultado el 9 de diciembre de 2013 .
- ^ "xhb-diff.txt" . Consultado el 9 de diciembre de 2013 .
- ^ vailtom (17 de agosto de 2009). "Harbour MiniGUI Extended Edition. | Descargas de software de comunicaciones gratuitas en" . Sourceforge.net . Consultado el 9 de diciembre de 2013 .
enlaces externos
- Página web oficial
- El repositorio de la comunidad Oasis Clipper, FoxPro y Xbase ++
- HBIDE
- Lista de distribución de Harbour Developers
- Lista de distribución de usuarios del puerto
- Extenso sitio de documentación, bibliotecas y herramientas de Harbour
- Harbour Wiki (Diccionario de funciones de Harbour)