Articulo de referencia

Puerto (lenguaje de programación)

Harbour es un lenguaje de programación que se utiliza principalmente para crear bases de datos y programas empresariales. Es una versión modernizada y multiplataforma del antigu...

Harbour es un lenguaje de programación que se utiliza principalmente para crear bases de datos y programas empresariales. Es una versión modernizada 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. Es software libre y de código abierto, con una licencia compatible con la Licencia Pública General de GNU (GPL).

El código de Harbour utiliza las mismas bases de datos y se puede compilar en una amplia variedad de plataformas, incluyendo Windows , Linux , variantes de Unix , varios descendientes de Berkeley Software Distribution (BSD), macOS , Windows CE , Symbian , iOS , Android , VxWorks , OS/2 (incluyendo eComStation y ArcaOS ), [ 1 ] BeOSHaiku y AIX .

Historia

La idea de un compilador Clipper de software libre llevaba tiempo gestándose y el tema surgía con frecuencia en las discusiones de comp.lang.clipper. Antonio Linares fundó el proyecto Harbour y su implementación comenzó en marzo de 1999. El nombre "Harbour" fue propuesto por Linares; se trata de un juego de palabras con " Clipper ", un tipo de barco. Harbour es sinónimo de puerto (donde atracan los barcos), y Harbour es una versión del lenguaje Clipper.

En 2009, el puerto fue remodelado 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 dBase (DBF), DBFNTX, DBFCDX, DBFDBT y DBFFPT. En Harbour, se pueden usar varios RDD en una misma 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 las funciones 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 de Control de Transmisión (TCP).

Harbour también ofrece compatibilidad con ODBC mediante una sintaxis de programación orientada a objetos (POO) y compatibilidad con ActiveX Data Objects (ADO) mediante OLE Automation (OLE). MySQL , PostgreSQL , SQLite , Firebird y Oracle son ejemplos de bases de datos a las que Harbour puede conectarse.

Las tecnologías xBase suelen confundirse con el software de sistemas de gestión de bases de datos relacionales (RDBMS). Si bien xBase se promocionó como relacional, es más que un simple sistema de bases de datos, ya que los lenguajes xBase que utilizan exclusivamente DBF no ofrecen todas las funcionalidades de un RDBMS completo.

Filosofía de programación

Harbour pretende escribirse una vez y compilarse en cualquier plataforma . Dado que el mismo compilador está disponible para todos los sistemas operativos mencionados, no es necesario volver a codificar para obtener productos idénticos para diferentes plataformas, salvo cuando se utilizan funciones dependientes del sistema operativo. La compilación cruzada es compatible con MinGW . En Microsoft Windows, Harbour es más estable pero menos documentado que Clipper, pero ofrece compatibilidad multiplataforma, es más transparente, permite una mayor personalización 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 pocas adaptaciones. La mayoría del software originalmente escrito para ejecutarse en Xbase++, FlagShip, FoxPro, xHarbour y otros dialectos se puede compilar con Harbor con algunas adaptaciones. Desde 2010, se han realizado muchos esfuerzos para facilitar la transición desde otros dialectos de xBase .

Harbour puede utilizar los siguientes compiladores de C, entre otros: GCC , MinGW , Clang , Intel C++ Compiler (ICC), Microsoft Visual C++ (6.0+), Borland C++ , Watcom C , Pelles C y Sun Studio .

Harbour puede utilizar múltiples emulaciones de terminal gráfica, incluidos controladores de consola y consolas/GUI híbridas, como GTWvt y GTWvg.

Harbour admite interfaces gráficas de usuario externas, tanto gratuitas (por ejemplo, HBQt, HWGui, Mini-GUI (última versión basada en Qt y QtContribs [ 3 ] ) como comerciales (por ejemplo, FiveWin, Xailer). HBQt es una biblioteca que proporciona enlaces a Qt. La aplicación HBIDE es un ejemplo del potencial de HBQt.

Harbour es 100% compatible con Clipper [ 4 ] y admite numerosas extensiones de sintaxis de lenguaje, incluyendo bibliotecas de tiempo de ejecución muy ampliadas como OLE , Blat, OpenSSL , Free Image, GD , hbtip, hbtpathy, PCRE , hbmzip ( zlib ), hbbz2 ( bzip2 ), cURL , Cairo , su propia implementación de CA-Tools, bibliotecas NanFor actualizadas y muchas otras. Harbour cuenta con una comunidad de desarrollo activa y un amplio soporte de terceros.

Operador macro (compilador en tiempo de ejecución)

Una de las características más potentes de los lenguajes xBase es el operador macro '&'. La implementación de este operador en Harbour permite la compilación en tiempo de ejecución de cualquier expresión válida de Harbour. Dicha expresión compilada puede utilizarse como VALOR, es decir, como el lado derecho de una asignación (rvalue), o para resolver el lado izquierdo (lvalue) de una asignación, como variables privadas o públicas, o un campo de base de datos.

Además, el operador de macros puede compilar y ejecutar llamadas a funciones, completar asignaciones o incluso listas de argumentos, y el resultado puede utilizarse para resolver cualquiera de los contextos anteriores en la aplicación compilada.

El compilador de macros más reciente puede compilar cualquier código Harbour válido, incluido el código para cada proceso, antes de la compilación.

Sintaxis:

&( ... ) 

El valor de texto de la expresión '...' se compilará, y el valor resultante de la ejecución del código compilado será el resultado.

&Alguna identificación 

es la forma abreviada de &( SomeId ).

&SomeId.postfijo 

es la forma abreviada de &( SomeId + "postfijo").

Programación orientada a objetos

La programación orientada a objetos (POO) abarca más que una biblioteca o interfaz específica, pero muchos programadores de Clipper ya la dan por sentada. CA-Clipper 5.2 y, sobre todo, la versión 5.3 añadieron varias clases base y una sintaxis POO correspondiente. Bibliotecas como Class(y) , FieWin, Clip4Win y Top Class ofrecen funcionalidad POO adicional.

Harbour cuenta con extensiones de programación orientada a objetos (POO) con soporte completo para clases, incluyendo herencia, basadas en la sintaxis Class(y). La sintaxis de POO en Harbour es muy similar a la de las bibliotecas de clases Clipper anteriores, por lo que debería ser posible mantener el código Clipper heredado con cambios mínimos.

Sintaxis y semántica

Código del puerto en HBIDE

Harbour, al igual que todos los lenguajes de xBase, no distingue entre mayúsculas y minúsculas y, opcionalmente, puede aceptar palabras clave escritas solo con sus primeros cuatro caracteres.

Tipos de datos integrados

Harbour tiene seis tipos escalares: Nil , String , Date , Logical , Numeric , Pointer , y cuatro tipos complejos: Array , Object , CodeBlock y Hash . Un escalar almacena un único valor, como una cadena, un número o una referencia a cualquier otro tipo. Los arrays son listas ordenadas de escalares o tipos complejos, indexadas por número, comenzando en 1. Los hashes, o arrays asociativos , son colecciones no ordenadas de valores de cualquier tipo indexadas por su clave asociada, que puede ser de cualquier tipo escalar o complejo.

Representación literal (estática) de tipos escalares:

  • Nulo:NIL
  • Cadena:"hello", 'hello', [hello]
  • Fecha:0d20100405
  • Lógico:.T., .F.
  • Numérico:1, 1.1, −1, 0xFF

Los tipos complejos también pueden representarse como valores literales:

  • Formación:{ "String", 1, { "Nested Array" }, .T., FunctionCall(), @FunctionPointer() }
  • Bloque de código :{ |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
  • Picadillo:{ "Name" => "John", 1 => "Numeric key", "Name2" => { "Nested" => "Hash" } }

Los hashes pueden usar cualquier tipo, incluyendo otros hashes, como clave para cualquier elemento. Los hashes y los arrays pueden contener cualquier tipo como valor de cualquier miembro, incluyendo arrays anidados y hashes.

Los bloques de código pueden hacer referencia a variables del procedimiento/función/método en el que se definieron. Dichos bloques de código pueden devolverse como un valor o mediante un argumento BY REFERENCE; en tal caso, el bloque de código sobrevivirá a la rutina en la que se definió, y cualquier variable a la que haga referencia será una DETACHEDvariable.

Las variables independientes conservarán su valor mientras exista un bloque de código que las referencie. Dichos valores se compartirán con cualquier otro bloque de código que tenga acceso a esas mismas variables. Si el bloque de código no sobrevive a la rutina que lo contiene y se evalúa dentro del ciclo de vida de la rutina en la que se define, los cambios realizados en sus variables independientes durante su evaluación se reflejarán en la rutina principal.

Los bloques de código se pueden evaluar cualquier número de veces, mediante la función. Eval( BlockExp )

Variables

Se pueden asignar todos los tipos a las variables con nombre. Los identificadores de variables con nombre tienen una longitud de 1 a 63 caracteres ASCII, comienzan con [A-Z|_]y siguen con 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 únicamente dentro de la rutina que lo declaró. Su valor se pierde al finalizar la rutina.
  • STATIC: Visible únicamente dentro de la rutina que la declaró. Su valor se conserva para las invocaciones posteriores de la rutina. Si una variable STATIC se declara antes de que se defina cualquier procedimiento, función o método, tiene un ámbito de módulo y es visible dentro de cualquier rutina definida en ese mismo archivo fuente; mantendrá su valor durante toda la vida útil de la aplicación.
  • PRIVATE: Visible dentro de la rutina que lo declaró y todas las rutinas calledderivadas de esa rutina.
  • PUBLIC: Visible mediante allrutinas en la misma aplicación.

LOCALy STATICse resuelven en tiempo de compilación, y por lo tanto son mucho más rápidas que las variables PRIVATEy PUBLICque 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, las variables LOCALy STATICestán notexpuestas al compilador de macros, y cualquier código de macro que intente hacer referencia a ellas generará un error en tiempo de ejecución.

Debido a la naturaleza dinámica de PRIVATElas PUBLICvariables, estas pueden crearse y destruirse en tiempo de ejecución, y pueden ser accedidas y modificadas mediante macros de tiempo de ejecución o 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 ... [BUCLE] [SALIDA] FIN[HACER] 
PARA Var  := InitExp HASTA EndExp [PASO StepExp ] ... [BUCLE] [SALIDA] PRÓXIMO 
PARA CADA Var EN CollectionExp ... [ Var :__enumIndex()] [BUCLE] [SALIDA] PRÓXIMO 
  • La cadena ... es una secuencia de una o más declaraciones de Harbour, y los corchetes []indican sintaxis opcional.
  • La función Var :__enumIndex() puede utilizarse opcionalmente para recuperar el índice de iteración actual (basado en 1).
  • La instrucción LOOP reinicia la iteración actual de la estructura de bucle que la contiene, y si el bucle que la contiene es un bucle FOR o FOR EACH , incrementa el iterador, pasando a la siguiente iteración del bucle.
  • La instrucción EXIT finaliza inmediatamente la ejecución de la estructura de bucle que la contiene.
  • La instrucción NEXT cierra la estructura de control y pasa a la siguiente iteración de la estructura del bucle.

En la instrucción FOR , la expresión de asignación se evalúa antes de la primera iteración del bucle. La expresión TO se evalúa y compara con el valor de la variable de control antes de cada iteración, y el bucle finaliza si su resultado es 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.

En FOR EACH , la variable Var contendrá el valor (escalar o complejo) del elemento correspondiente en el valor de la colección. La expresión de la colección puede ser un Array (de cualquier tipo o combinación de tipos), una tabla hash o un objeto.

Sentencias IF

SI CondExp ... [SI NO] CondExp ... [DEMÁS] ... FIN[SI] 

... representa 0 o más instrucciones .

La(s) expresión(es) de condición debe(n) evaluarse a un valor LÓGICO .

Sentencias SWITCH

Harbour admite una construcción SWITCH inspirada en la implementación de switch() en C.

INTERRUPTOR SwitchExp CASO LiteralExp ... [SALIDA] [CASE LiteralExp ] ... [SALIDA] [DE LO CONTRARIO] ... FIN[INTERRUPTOR] 
  • LiteralExp debe ser una expresión numérica resoluble en tiempo de compilación y puede incluir operadores, siempre que dichos operadores incluyan un valor estático en tiempo de compilación.
  • La instrucción opcional EXIT es el equivalente a la instrucción break de C , y si está presente, la ejecución de la estructura SWITCH terminará cuando se alcance la instrucción EXIT; de lo contrario, continuará con la primera instrucción debajo de la siguiente instrucción CASE (continuación secuencial).

Instrucciones de COMIENZO DE SECUENCIA

BEGIN SEQUENCE... [ROMPER] [Break( [ Exp ] )] RECOVER [USINGVar ] ...END[SEQUENCE]

o:

COMIENZA LA SECUENCIA ... [ROMPER] [Romper()] FIN [SECUENCIA] 

La estructura BEGIN SEQUENCE permite la interrupción controlada de cualquier secuencia, incluso al cruzar procedimientos/funciones anidados. Esto significa que un procedimiento/función llamado puede emitir una instrucción BREAK o una expresión Break() para forzar la ejecución de cualquier procedimiento/función anidado, hasta la primera estructura BEGIN SEQUENCE externa, ya sea después de su instrucción END o de una cláusula RECOVER , si está presente. La instrucción Break puede, opcionalmente, pasar cualquier tipo de expresión, que la instrucción RECOVER puede aceptar para permitir una gestión de recuperación posterior.

Además, el objeto Harbour Error admite las propiedades canDefault , canRetry y canSubstitute , lo que permite a los manejadores de errores realizar algunos preparativos y luego solicitar una operación de reintento , una reanudación o devolver un valor para reemplazar la expresión que desencadenó la condición de error.

Como alternativa, TRY [CATCH] [FINALLY]existen instrucciones disponibles en la biblioteca xhb que funcionan de forma similar a la construcción SEQUENCE .

Procedimientos y funciones

[ESTÁTICO] PROCEDIMIENTO NombreProcedimiento [ESTÁTICO] PROCEDIMIENTO NombreProcedimiento () [ESTÁTICO] PROCEDIMIENTO NombreProcedimiento ( Param1 [, ParamsN ] ) 
PROCEDIMIENTO DE INICIO NombreDelProcedimiento PROCEDIMIENTO DE SALIDA NombreDelProcedimiento
[ESTÁTICA] FUNCIÓN NombreProcedimiento [ESTÁTICA] FUNCIÓN NombreProcedimiento () [ESTÁTICA] FUNCIÓN NombreProcedimiento ( Param1 [, ParamsN ] ) 

En Harbour, los procedimientos y funciones se pueden especificar con las palabras clavePROCEDURE , o FUNCTION. Las reglas de nomenclatura son las mismas que para las variables (hasta 63 caracteres, sin distinción entre mayúsculas y minúsculas). Tanto los procedimientos como las funciones pueden estar calificados con el calificador de ámbito STATIC para restringir su uso al ámbito del módulo donde se definen.

Los calificadores opcionales INIT o EXIT indican que el procedimiento se invocará automáticamente justo antes de llamar al procedimiento de inicio de la aplicación o justo después de cerrarla, respectivamente. Los parámetros que se pasan a un procedimiento o función aparecen en la subrutina como variables locales y pueden aceptar cualquier tipo, incluidas referencias.

Los cambios en las variables de argumento no se reflejan en las variables respectivas pasadas por el procedimiento/función/método que realiza la llamada, a menos que se pasen explícitamente POR REFERENCIA usando el prefijo @ .

El PROCEDIMIENTO no devuelve ningún valor y, si se utiliza en un contexto de expresión, producirá un valor NIL .

La función 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 una función:

x  := Cubo( 2 ) FUNCIÓN Cubo( n ) DEVUELVE n ** 3 

Código de ejemplo

El programa típico " hola mundo " sería:

  ? "¡Hola Mundo!"

O:

QOut ( "¡Hola, mundo!" ) 

O:

Alerta ( "¡Hola, mundo!" ) 

O bien, incluido en un procedimiento explícito:

PROCEDIMIENTO Principal()  ? "¡Hola Mundo!"DEVOLVER

Ejemplos de POO

Procedimiento principal:

#incluir "hbclass.ch"PROCEDIMIENTO Principal() LOCAL oPersona CLSoPersona  := Pers en ():Nuevo( "Dave" ) oPersona :Ojos := "Inválido" oPersona :Ojos := "Azul"Alerta ( oPersona:Describe() ) DEVOLVER

Definición de clase:

CREAR CLASE Persona Nombre de la variable INICIALIZAR "" MÉTODO Nuevo(cName) MÉTODO Describir() ACCESO Ojos EN LÍNEA ::pvtEyes ASIGNAR Eyes( x ) EN LÍNEA iif( HB_ISSTRING( x ) .AND. x $ "Azul,Marrón,Verde", ::pvtEyes := x, Alerta( "Valor no válido" ) ) PROTEGIDO: VAR pvtEyes FIN DE CLASE // Ejemplo de definición de método normal MÉTODO Nuevo(cName) CLASE Persona  ::Nombre := cName DEVOLVER Yo mismo MÉTODO Describe() CLASE Persona Descripción local SI Vacío( ::Nombre ) cDescripción := "Aún no tengo nombre." DEMÁS cDescripción := "Mi nombre es: " + ::Nombre + ";" FIN SI SI ! Vacío( ::Ojos ) cDescripción += "El color de mis ojos es: " + ::Ojos FIN SI DEVOLVER cDescripción 

Herramientas

  • hbmk2 – Herramienta de compilación similar a 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 según reglas definidas.
  • hbpp – Preprocesador, una potente herramienta que evita los problemas típicos que se encuentran en los preprocesadores del lenguaje C.
  • hbi18n – Herramientas para localizar texto en aplicaciones
  • hbdoc – Crea documentación para Harbour

Todas las herramientas son multiplataforma.

Desarrollo

Aspecto HBIDE.

Actualmente, el desarrollo de Harbour está liderado por Viktor Szakáts en colaboración con Przemysław Czerpak, quien también contribuye con muchos componentes del lenguaje principal y componentes suplementarios. 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 código fuente de GitHub . [ 5 ] A partir de 2015, el desarrollo de Harbour es activo y dinámico.

Comparación de xHarbour

xHarbour es una bifurcación [ 6 ] del proyecto Harbour. xHarbour adopta un enfoque más agresivo para implementar nuevas características en el lenguaje, mientras que Harbour es más conservador, buscando ante todo una replicación exacta del comportamiento de Clipper y considerando secundariamente la implementación de nuevas características y extensiones. Cabe destacar que Harbour es compatible con una amplia variedad de sistemas operativos, mientras que xHarbour solo es compatible con MS Windows y Linux.

Los desarrolladores de Harbour han intentado documentar todos los comportamientos ocultos del lenguaje Clipper y probar el código compilado con 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 que rompan la compatibilidad con Clipper. Estas restricciones se suavizaron recientemente, ya que la nueva arquitectura de Harbour permite extensiones fuera del compilador principal.

Una comparación detallada entre las extensiones implementadas en Harbour y xHarbour se puede encontrar en el repositorio de código fuente del proyecto en GitHub. [ 7 ]

Bibliotecas y herramientas de interfaz gráfica de usuario (GUI)

  • hbide Entorno de desarrollo integrado para facilitar el desarrollo de Harbour y diversos dialectos de xBase.
  • PTSource IDE Entorno de desarrollo integrado que incluye Harbour
  • HwGui – Biblioteca GUI multiplataforma de código abierto para Harbour
  • HMG – Sistema de desarrollo xBase Win32 / GUI gratuito y de código abierto para Harbour
  • MiniGUI [ 8 ] – Sistema de desarrollo de interfaz gráfica de usuario (GUI) gratuito y de código abierto basado en xBase Win32 (una bifurcación (desarrollo de software) de HMG y Harbour)
  • ooHG – Interfaz gráfica de usuario orientada a objetos para Harbour – una bifurcación de HMG basada en "clases y programación orientada a objetos".
  • Marinas-GUI : paquete de desarrollo de interfaz gráfica de usuario (GUI) multiplataforma basado en QT 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.). Simplemente instálelo y comience a programar y compilar.

Véase también

Referencias

  1. ^ "Puerto" . Consultado el 3 de septiembre de 2020 .
  2. ^ "LetoDB" . Sourceforge.net . Consultado el 9 de diciembre de 2013 .
  3. ^ "QtContribs - Proyectos Qt de Harbour" . SourceForge . 6 de julio de 2023.
  4. ^ "Página oficial del puerto" . El Proyecto del Puerto . Consultado el 9 de diciembre de 2013 .
  5. ^ "puerto 路 GitHub" . Github.com . Consultado el 9 de diciembre de 2013 .
  6. ^ "Acerca de xHarbour" . Xharbour.org . Consultado el 9 de diciembre de 2013 .
  7. ^ "xhb-diff.txt" . GitHub . Consultado el 9 de diciembre de 2013 .
  8. ^ 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 .
  • Sitio web oficial
  • El repositorio de la comunidad de Oasis Clipper, FoxPro y Xbase++
  • HBIDE
  • Lista de correo de desarrolladores de puertos
  • Lista de correo de usuarios de Harbour
  • Amplia documentación, bibliotecas y sitio web de herramientas de Harbour.
  • harbour-core en GitHub , Wiki del Diccionario de Funciones de Harbour
Obtenido de " https://en.wikipedia.org/w/index.php?title=Harbour_(programming_language)&oldid=1360377941 "