fbpx
Wikipedia

Compilador Harbour

Harbour es un moderno lenguaje de programación que nace como compilador del lenguaje de programación Clipper (una variante de xBase) desarrollado como software libre. Su objetivo inicial fue soportar todas las sentencias y extensiones de la versión más popular del compilador, Clipper 5.2. Harbour es además un compilador multiplataforma, capaz de compilar para y ejecutarse en DOS (MS-DOS, DR-DOS, etc), Microsoft Windows, OS/2, GNU/Linux, varias variantes de Unix, varios descendientes de BSD, Mac OS X, MINIX 3, Windows CE, Pocket PC, Symbian, iPhone OS, QNX, VxWorks, OS/2 BeOS/Haiku, AIX utilizando el mismo código fuente y ficheros de base de datos.

Harbour Project
Desarrollador(es)
Viktor Szakáts y la comunidad Harbour
https://harbour.github.io/
Información general
Extensiones comunes .prg, .ch, .hbs, .dbf
Paradigma multi-paradigma: imperativa, funcional, orientada a objetos, reflective
Apareció en 1999
Diseñado por Antonio Linares
Última versión estable 3.0.0 (17 de julio de 2011 (11 años, 8 meses y 15 días))
Última versión en pruebas 3.1.x disponible en SVN (Aunque existe una versión llamada "nightly" que se genera diriamente con las últimas modificaciones a Harbour o alguno de sus componentes.
Sistema de tipos opcionalmente duck, dinámico, seguro, tipado fuerte parcial
Dialectos Clipper, Xbase++, Flagship, FoxPro, xHarbour
Influido por dBase, Clipper
Ha influido a xHarbour
Sistema operativo Multiplataforma
Licencia Open source GPL Compatible

A pesar de que es un poderoso lenguaje de programación de propósito general , se utiliza principalmente para crear programas de bases de datos y negocios. Harbour ha mantenido activamente la adición de características mientras mantiene compatibilidad retroactiva con el estilo de Clipper. Ha sufrido muchos cambios y revisiones y recuperado ampliamente popularidad entre los programadores de 1980 y 1990.

La licencia open source de Harbour[1]​ es similar a la GNU General Public License, con la excepción del soporte de aplicaciones propietarias, por lo que las aplicaciones propietarias pueden ser creadas y distribuidas con Harbour.

Historia

La idea de un compilador de software libre de Clipper había estado dando vueltas durante mucho tiempo y era a menudo tema de debate en comp.lang.clipper. El proyecto fue iniciado por Antonio Linares, creador de la biblioteca FiveWin, y fue rápidamente secundado por otras figuras del desarrollo en Clipper. Varias de las casas que desarrollan bibliotecas para Clipper respaldaron el proyecto, soportándolo en sus productos. El nombre Harbour es un juego de palabras con los barcos tipo Clipper que arribaban a un puerto, siendo Harbour el puerto de Clipper.

En 2009 Harbour fue rediseñado sustancialmente, sobre todo por Viktor Szakáts y Przemyslaw Czerpak.

Compatibilidad con base de datos

Harbour extiende la definición Clipper Replaceable Database Drivers (RDD). Ofrece múltiples DDR como DBF, DBFNTX, DBFCDX, DBFDBT y DBFFPT. En Harbour pueden usarse múltiples RDDs en la misma aplicación, y las nuevas lógicas de DDR se pueden definir por la combinación de otros DDRs. La arquitectura de los RDDs permite la herencia, por lo que un RDD dado puede ampliar la funcionalidad de otro RDD existente(s). Desarrollos de terceros, como RDDSQL, RDDSIX, RMDBFCDX, Advantage Database Server, y Mediator ejemplifican algunas de las características de la arquitectura del RDD. La implementación DBFNTX tiene casi las mismas funciones de DBFCDX y RDDSIX. NETIO y LetoDB[2]​ proporcionan acceso remoto a través del protocolo TCP protocol.

Harbour también ofrece soporte ODBC por medio de una sintaxis de programación orientada a objetos, y soporte ADO a través de OLE. MySQL, PostgreSQL, SQLite, Firebird, Oracle son ejemplos de bases de datos con las que se puede conectar Harbour.

Las tecnologías xBase a menudo se confunden con un RDBMS software. Aunque esto es cierto, xBase es más que un sistema de base de datos simple, pues las variantes xBase que utilizan exclusivamente DBF no pueden proporcionar el concepto completo de un verdadero RDBMS.

Filosofía de programación

A diferencia del lenguaje de programación Java, que está destinado a escribir una vez, ejecutar en cualquier lugar, Harbour aspira a ser escribir una vez, compilar en cualquier lugar. A medida que el mismo compilador está disponible para todos los sistemas operativos anteriores, no hay necesidad de recodificación para producir productos idénticos para diferentes plataformas, excepto cuando se utilizan las características dependientes del sistema operativo. Se soporta la compilación cruzada con MinGW32. En Microsoft Windows, Harbour es más estable pero no tan bien documentado como Clipper, pero tiene la capacidad multi-plataforma y es más transparente, personalizable y se puede ejecutar desde una Memoria USB.

En Linux y Windows Mobile, el código fuente Clipper puede ser compilado con Harbour, con muy poca adaptación. La mayoría del software escrito originalmente para funcionar con Xbase++, Flagship, FoxPro, xHarbour y otros dialectos pueden ser compilados con Harbour con algunas adaptaciones. En 2010 se han hecho muchos esfuerzos para hacer la transición de otros dialectos xBase más fácil.

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, tanto para ser generado el compilador Harbour y sus herramientas auxiliares, como también para incluir rutinas en lenguaje C, embebidas en el código de Harbour.

Interfaz Gráfica

Harbour puede hacer uso de múltiples emulaciones de terminal gráfico, incluidos los controladores de la consola, e híbridos consola/GUIs, como GTWvt, y GTWvg.

En el modo consola (ventana DOS), la ejecución de un programa en Harbour es de tipo top-down el programa avanza de arriba hacia abajo, según las directivas de programación que va encontrando.
En cambio en el modo Gráfico, se utiliza el paradigma por eventos y la ejecución no necesariamente sigue con la próxima directiva de programación.
Es muy importante tener en cuenta esto, porque el código fuente debe ser modificado según el tipo de interfaz que se elija.

Harbour soporta interfaces gráficas de usuario externas, por ejemplo:


  • Comerciales:
    • FiveWin
    • Xailer

HBQt es una biblioteca que proporciona enlaces a Qt. La aplicación HBIDE incluida en la distribución oficial y en el repositorio SVN es una muestra del potencial de HBQt.

Harbour es 100% compatible con Clipper[3]​ y soporta muchas extensiones de la sintaxis del lenguaje, incluyendo en gran medida extensiones en tiempo de ejecución, tales como bibliotecas OLE, Blat, OpenSSL, FreeImage, GD, TIP, Tpathy, PCRE, HbZip (zlib y bzip2), cURL, Cairo, su propia implementación de las librerías CA-Tools y NanFor y muchos otros. Harbour cuenta con una activa comunidad de desarrollo y con un amplio apoyo de terceros.

Cualquier lenguaje xBase proporciona una manera muy productiva para construir aplicaciones de negocios y de grandes volúmenes de datos. Harbour no es una excepción.

Operador de Macro (compilación en tiempo de ejecución)

Una de las características más potentes de los lenguajes xBase es el operador de macro '&'. La implementación en Harbour del operador de macro permite la compilación en tiempo de ejecución de cualquier expresión válida Harbour. Una expresión compilada se puede utilizar como un VALUE, es decir, el lado derecho de una asignación (rvalue), pero es más interesante, tal expresión compilada puede utilizarse para resolver el lado izquierdo (lvalue) de una asignación, es decir, variables PRIVATE o PUBLIC, o en un campo de base de datos.

Además, el operador de macro puede compilar y ejecutar llamadas a funciones, tareas completas, o incluso la lista de argumentos, y el resultado de la macro se puede utilizar para resolver cualquiera de los contextos anteriores en la aplicación compilada. En otras palabras, cualquier aplicación Harbour puede ser extendida y modificada en tiempo de ejecución para compilar y ejecutar código adicional bajo demanda.

El compilador de macro puede compilar cualquier código Harbour válido, incluyendo el código de pre-proceso antes de la compilación.

Sintaxis:

 &( ... ) 

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

 &SomeId 

es la forma corta de &( SomeId ).

 &SomeId.postfix 

es la forma corta de &( SomeId + "postfix" ).

Programación Orientada a Objetos

El estilo de programación orientada a objetos es un tema más amplio que el de una biblioteca específica o una interfaz específica, pero la programación orientada a objetos es algo que muchos programadores Clipper han llegado a esperar. CA-Clipper 5.2 y en especial 5.3 añadieron una serie de clases base, y una sintaxis de programación orientada a objetos correspondiente. Bibliotecas, como , FiveWin, Clip4Win y TopClass ofrecen funcionalidad de programación orientada a objetos adicionales.

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

Sintaxis y semántica

 
Código Harbour en HBIDE.

Harbour como cada lenguaje xBase es in-sensible a mayúsculas y, opcionalmente, puede aceptar palabras clave escritas con solo los cuatro primeros caracteres.

Tipos de datos incorporados

Harbour cuenta con 6 tipos escalares: Nil, Cadena, Fecha, Lógico, Numérico, y 4 tipos complejos: Matriz (Array), Objeto, CodeBlock, y Hash. Un escalar tiene un valor único, como una cadena, número o referencia a cualquier otro tipo. Las matrices son listas ordenadas de escalares o tipos complejos, con un índice por número, comenzando por el 1. Hashes, o matrices asociativas, son conjuntos no ordenados de los valores de tipo indexados por la clave de su asociado, que puede ser de cualquier tipo escalar o compleja.

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

  • NIL: Este valor especial es asignado a todas las variables no inicializadas, excepto las públicas, y es también pasado también como un sustituto cuando los argumentos son omitidos en el llamado a una función o procedimiento.
  • Cadena de caracteres: "hola", 'hola', [hola]
  • Fecha: 0d20100405
  • Lógico: .T., .F.
  • Numérico: 1, 1.1, −1, 0xFF

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

  • Array: { "Cadena"", 1, { "Matriz Anidada" }, .T., FunctionCall(), @FunctionPointer() }
  • CodeBlock: { |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
  • Hash: { "Nombre" => "Juan", 1 => "Clave numérica", { "Anidado" => "Hash" } }

Los valores hash puede utilizar cualquier tipo incluyendo otros hashes como la Clave para cualquier elemento. Hashes y arrays pueden contener cualquier tipo como el valor de cualquier miembro, incluidas las matrices de anidación, y hashes.

Los Codeblocks pueden tener referencias a variables del Procedimiento/Función/Método en el que se ha definido. Estos Codeblocks pueden ser devueltos como un valor, o por medio de un argumento pasado por referencia, en tal caso el bloque de código va a "sobrevivir" a la rutina en la que se definió, y las variables de las que hace referencia, será una variable INDEPENDIENTE.

Las variables independientes mantendrán su valor durante el tiempo que un bloque de código (Codeblock) hace referencia a ellos aún exista. Estos valores serán compartidos con cualquier otro bloque de código que puede tener acceso a esas mismas variables. Si el bloque de código no sobrevive a la rutina que contiene, y será evaluado durante la vida de la rutina en la que se define, los cambios en sus variables independientes por medio de su evaluación, se reflejan de vuelta en la rutina de los padres.

Los Codeblocks se pueden evaluar cualquier número de veces, por medio de la función Eval( BlockExp ).

Variables

Todos los tipos se pueden asignar a las variables declaradas. El nombre de una variable tiene de 1 a 63 caracteres de largo, comienza por [A-Z|_] y además constará de caracteres [A-Z|0–9|_] hasta el máximo de 63 caracteres. Los nombres de las variables 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.
  • STATIC: Visible solo dentro de la rutina, que lo declaró. El valor es preservado para las siguientes llamadas a la rutina. Si una variable STATIC (estática) se declara antes de que cualquier procedimiento/función/método se defina, tiene un alcance de MODULE (módulo), y es visible dentro de cualquier rutina definida dentro de ese mismo archivo de origen, que mantendrá su vida durante toda la duración de la aplicación.
  • PRIVATE: Visible dentro de la rutina que lo declaró, y todas las rutinas llamadas por esa rutina.
  • PUBLIC: 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ápidas que las variables PRIVATE y PUBLIC que son entidades dinámicas a las que se accede en tiempo de ejecución por medio de la tabla de símbolos. Por esta misma razón, las variables LOCAL y STATIC no están disponibles para el compilador de macros, y cualquier código de macro que intenta hacer referencia a ellos va a generar un error de ejecución.

Debido a la naturaleza dinámica de las variables PRIVATE y PUBLIC, que pueden ser creados y destruidos en tiempo de ejecución, se puede acceder y modificar por medio de macros en tiempo de ejecución, y pueden ser consultados y modificados por Codeblocks creados sobre la marcha.

Fields (Campos)

Las variables de los campos de las bases de datos están limitados a: Carácter, Numérico, Fecha, Lógico y un tipo especial llamado 'MEMO' que es tratado como una Cadena de caracteres (con algunos caracteres especiales de control).

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 inspirados en las de los lenguajes de programación C o Java :

Bucles

[DO] WHILE ConditionExp ... [LOOP] [EXIT] END[DO] 
FOR Var := InitExp TO EndExp [STEP StepExp] ... [LOOP] [EXIT] NEXT 
FOR EACH Var IN CollectionExp ... [HB_EnumIndex()] [LOOP] [EXIT] NEXT 
  • ... es una secuencia de una o más expresiones Harbour statements, y los corchetes [] indican la sintaxis opcional.
  • HB_EnumIndex() puede ser utilizado opcionalmente para recuperar el índice de iteración actual (basado en 1).
  • La sentencia LOOP reinicia la iteración actual de la estructura de bucle a que pertenece, y si el circuito de cierre es un bucle FOR o FOR EACH, incrementa el contador, pasando a la siguiente iteración del bucle.
  • La sentencia EXIT termina inmediatamente la ejecución de la estructura de bucle a que pertenece.
  • La sentencia NEXT cierra la estructura de control y se traslada a la siguiente iteración de la estructura de bucle.

En la sentencia FOR, la expresión de asignación se evalúa antes de la repetición del bucle en primer lugar. La expresiónTO se evalúa y se compara con el valor de la variable de control, antes de cada iteración, y el bucle se termina si se evalúa como un valor numérico mayor que el valor numérico de la variable de control. La expresión opcional STEP se evalúa después de cada iteración, antes de decidir si se debe realizar 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 una combinación de tipos), una tabla hash, o un Objeto.

Sentencias IF

IF CondExp ... [ELSEIF] CondExp ... [ELSE] ... END[IF] 

... representa 0 o más sentencias.

Las expresiones de condición tiene que evaluar a un valor LOGICAL (lógico).

Sentencias SWITCH

Harbour admite el constructor SWITCH inspirado en la implementación en C de switch().

SWITCH SwitchExp CASE LiteralExp ... [EXIT] 
 [CASE LiteralExp] ... [EXIT] [DEFAULT] ... END 
  • La LiteralExp debe ser una expresión numérica que pueda resolverse en tiempo de compilación, y puede involucrar operadores, siempre y cuando los operadores en cuestión afectan a un valor en tiempo de compilación estática.
  • La sentencia opcional EXIT es el equivalente de la declaración breaken C, y si está presente, la ejecución de la estructura SWITCH termina al alcanzar la sentencia EXIT, de lo contrario se continuará con la primera declaración CASE siguiente (fall through).

Sentencias BEGIN SEQUENCE

BEGIN SEQUENCE ... [BREAK] [Break([Exp])] RECOVER [USING Var] ... END[SEQUENCE] 

o:

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

La estructura BEGIN SEQUENCE permite un aborto ordenado de cualquier secuencia, incluso cuando se utilizan procedimientos y funciones anidadas. Esto significa que un procedimiento/función llamado, puede emitir una sentencia BREAK, o una expresión Break(), para forzar el retorno de cualquier procedimiento/función anidadas, todo el camino de regreso a la primera estructura externa BEGIN SEQUENCE, incluso después de su respectiva declaración END, o a una cláusula RECOVER si está presente. La sentencia Break puede pasar opcionalmente cualquier tipo de expresión, que puede ser aceptado por la sentencia RECOVER para permitir su entrega y posterior recuperación.

Además, el Error Object (objeto de error) de Harbour soporta las propiedades canDefault, canRetry y canSubstitute, que permiten a los controladores de errores llevar a cabo algunos preparativos, y luego solicitar una Retry Operation (operación de reintento), un Resume, o devolver un Valor para sustituir la expresión que dispara la condición de error.

Alternativamente las declaraciones TRY [CATCH] [FINALLY] están disponibles en la biblioteca xHB trabajando como el constructor SEQUENCE.

Procedimientos y funciones

[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] ) 

Procedimientos y Funciones en Harbour puede ser especificadas con la palabra clave PROCEDURE, o FUNCTION. Las reglas de asignación de nombres son los mismos que para las variables (hasta 63 caracteres que mayúsculas y minúsculas). Procedimientos y funciones pueden ser calificados por el calificador de ámbito STATIC para restringir su uso al ámbito de aplicación del módulo donde se define.

Los calificadores opcionales INIT or EXIT, marcarán el procedimiento que se invoca 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 que se pasan a una procedure/function aparecen en la subrutina como variables locales, y puede aceptar cualquier tipo, incluyendo las referencias.

Los cambios en las variables de parámetros no se reflejan en las variables respectivas pasadas en la llamada al procedimiento/función/método a menos que pasen explícitamente BY REFERENCE (por referencia) usando el prefijo @.

Un PROCEDURE no tienen valor de retorno, y si se utiliza en un contexto de expresión va a producir un valor Nulo.

Una FUNCTION puede devolver cualquier tipo por medio de la instrucción RETURN, en cualquier parte del cuerpo de su definición.

A continuación, una llamada a una FUNCTION y la definición de dicha FUNCTION :

 x := Cube( 2 ) FUNCTION Cube( n ) RETURN n ** 3 

Ejemplos de código

El típico programa hola mundo puede implementarse como:

  ? "¡Hola, mundo!" 

O:

 QOut( "¡Hola, mundo!" ) 

O:

 Alert( "¡Hola, mundo!" ) 

O, dentro de un procedimiento explícito:

 PROCEDURE Main()  ? "¡Hola, mundo!" RETURN 

Ejemplos de OOP

 #include "hbclass.ch" PROCEDURE Main() LOCAL oPerson := Person():New( "Dave" ) oPerson:Eyes := "Invalid" oPerson:Eyes := "Blue" Alert( oPerson:Describe() ) RETURN CLASS Person DATA Name INIT "" METHOD New( cName ) CONSTRUCTOR ACCESS Eyes INLINE ::pvtEyes ASSIGN Eyes( x ) INLINE IIF( ValType( x ) == 'C' .AND. x IN "Blue,Brown,Green", ::pvtEyes := x, Alert( "Invalid value" ) ) // Ejemplo de definición de método IN-LINE INLINE METHOD Describe() 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 ENDMETHOD PRIVATE: DATA pvtEyes ENDCLASS // Ejemplo de definición de un método normal. METHOD New( cName ) CLASS Person  ::Name := cName RETURN Self 

Herramientas

  • HBIDE – Entorno de desarrollo integrado para ayudar al desarrollo Harbour y varios dialectos xBase
  • HBMK2 – Potente herramienta de construcción como make
  • HBDoc2 e HBExtern – Crea la documentación para Harbour
  • HPPP – Preprocesador, una poderosa herramienta que evita los problemas típicos que se encuentran en el Preprocesador de C
  • HBFormat – Formatea código fuente escrito en Harbour u otro dialecto a otro según las reglas definidas
  • HBi18n – Herramientas para la localización de texto en las aplicaciones
  • HBRun – intérprete de Shell para Harbour. La macro compilación permite ejecutar cualquier código Harbour válido, ya que se está compilando

Todas las herramientas son multiplataforma.

Nota:
A pesar de no estar incluida la herramienta DBU para crear y manejar tablas en formato DBF (por cuestiones de copyright), aún sigue siendo posible compilar el código original DBU.PRG y generar el ejecutable en cualquiera de las plataformas soportadas.

Desarrollo

 
HBIDE look.

Hoy en día el desarrollo de Habour está liderado por Viktor Szakáts con gran colaboración de Przemysław Czerpak que lleva muchos componentes del núcleo y contribuciones. HBIDE y algunos componentes, especialmente HBQt, son desarrollados por Pritpal Bedi. Otros miembros aportan los cambios de menor importancia al repositorio SVN de Sourceforge.[4]​ En 2010 el desarrollo de Harbour mantiene una vibrante actividad.

Popularidad

Aunque no hay manera de medir la popularidad de Harbour o xBase, el TIOBE Programming Community Index[5]​ situaba a Microsoft Visual FoxPro, un dialecto de alto perfil de xBase, en la 12 posición en el ranking de popularidad de lenguajes de programación en junio de 2006, y a FoxPro/xBase en el puesto 25 en agosto de 2010. En septiembre de 2010, los newsgroups de Usenet sobre Clipper comp.lang.clipper todavía está activo. En agosto de 2010 Harbour figuraba en la posición 16 en descargas semanales en la categoría del compilador y en la posición 132 en la clasificación mundial.[6]

Comparación con xHarbour

xHarbour es un fork[7]​ del primitivo proyecto Harbour. xHarbour tiene un enfoque más agresivo para la aplicación de las nuevas características del lenguaje, mientras que Harbour es más conservador en su planteamiento, con el objetivo en primer lugar por una réplica exacta del comportamiento de Clipper dejando la aplicación de las nuevas características y extensiones como una consideración secundaria. También hay que señalar que Harbour es compatible con una amplia variedad de sistemas operativos , mientras que xHarbour solo está soportado por las versiones de 32 bits de Microsoft Windows y Linux.

Los desarrolladores de Harbour han tratado de documentar todo el comportamiento oculto en el lenguaje Clipper y testeado código compilado con Harbour con el mismo código compilado con Clipper para mantener la compatibilidad.

Los desarrolladores de Harbour rechazan explícitamente extensiones del lenguaje cuando las extensiones rompen la compatibilidad Clipper. Este rechazo se suaviza recientemente ya que la nueva arquitectura de Harbour permite extensiones fuera del núcleo del compilador.

Una comparación detallada entre las extensiones aplicadas en Harbour y xHarbour se puede encontrar en el repositorio SVN del proyecto en SourceForge.[8]

A partir de 2009-2010, Harbour ha visto un enorme aumento en su adopción, mientras que el declive de xHarbour puede verse en su lista de correo.[9][10][11]

Véase también

Referencias

  1. LetoDB
  2. Official Harbour page el 5 de junio de 2012 en Wayback Machine.
  3. http://sourceforge.net/projects/harbour-project/
  4. . Archivado desde el original el 29 de noviembre de 2007. Consultado el 4 de marzo de 2012. 
  5. About xHarbour
  6. xhb-diff.txt
  7. . Archivado desde el original el 13 de marzo de 2012. Consultado el 4 de marzo de 2012. 
  8. . Archivado desde el original el 13 de marzo de 2012. Consultado el 4 de marzo de 2012. 

Enlaces externos

  • Sitio web oficial (inglés)
  • Repositorio en Sourceforge
  • The Oasis Repositorio de las comunidades Clipper, FoxPro y Xbase++
  • HBIDE
  • Un programa musical en Harbour
  •   Datos: Q2544816

compilador, harbour, harbour, moderno, lenguaje, programación, nace, como, compilador, lenguaje, programación, clipper, variante, xbase, desarrollado, como, software, libre, objetivo, inicial, soportar, todas, sentencias, extensiones, versión, más, popular, co. Harbour es un moderno lenguaje de programacion que nace como compilador del lenguaje de programacion Clipper una variante de xBase desarrollado como software libre Su objetivo inicial fue soportar todas las sentencias y extensiones de la version mas popular del compilador Clipper 5 2 Harbour es ademas un compilador multiplataforma capaz de compilar para y ejecutarse en DOS MS DOS DR DOS etc Microsoft Windows OS 2 GNU Linux varias variantes de Unix varios descendientes de BSD Mac OS X MINIX 3 Windows CE Pocket PC Symbian iPhone OS QNX VxWorks OS 2 BeOS Haiku AIX utilizando el mismo codigo fuente y ficheros de base de datos Harbour ProjectDesarrollador es Viktor Szakats y la comunidad Harbourhttps harbour github io Informacion generalExtensiones comunes prg ch hbs dbfParadigmamulti paradigma imperativa funcional orientada a objetos reflectiveAparecio en1999Disenado porAntonio LinaresUltima version estable3 0 0 17 de julio de 2011 11 anos 8 meses y 15 dias Ultima version en pruebas3 1 x disponible en SVN Aunque existe una version llamada nightly que se genera diriamente con las ultimas modificaciones a Harbour o alguno de sus componentes Sistema de tiposopcionalmente duck dinamico seguro tipado fuerte parcialDialectosClipper Xbase Flagship FoxPro xHarbourInfluido pordBase ClipperHa influido axHarbourSistema operativoMultiplataformaLicenciaOpen source GPL Compatible editar datos en Wikidata A pesar de que es un poderoso lenguaje de programacion de proposito general se utiliza principalmente para crear programas de bases de datos y negocios Harbour ha mantenido activamente la adicion de caracteristicas mientras mantiene compatibilidad retroactiva con el estilo de Clipper Ha sufrido muchos cambios y revisiones y recuperado ampliamente popularidad entre los programadores de 1980 y 1990 La licencia open source de Harbour 1 es similar a la GNU General Public License con la excepcion del soporte de aplicaciones propietarias por lo que las aplicaciones propietarias pueden ser creadas y distribuidas con Harbour Indice 1 Historia 2 Compatibilidad con base de datos 3 Filosofia de programacion 3 1 Interfaz Grafica 3 2 Operador de Macro compilacion en tiempo de ejecucion 3 3 Programacion Orientada a Objetos 4 Sintaxis y semantica 4 1 Tipos de datos incorporados 4 2 Variables 4 3 Fields Campos 4 4 Estructuras de control 4 4 1 Bucles 4 4 2 Sentencias IF 4 4 3 Sentencias SWITCH 4 4 4 Sentencias BEGIN SEQUENCE 4 5 Procedimientos y funciones 4 6 Ejemplos de codigo 4 7 Ejemplos de OOP 5 Herramientas 6 Desarrollo 7 Popularidad 8 Comparacion con xHarbour 9 Vease tambien 10 Referencias 11 Enlaces externosHistoria EditarLa idea de un compilador de software libre de Clipper habia estado dando vueltas durante mucho tiempo y era a menudo tema de debate en comp lang clipper El proyecto fue iniciado por Antonio Linares creador de la biblioteca FiveWin y fue rapidamente secundado por otras figuras del desarrollo en Clipper Varias de las casas que desarrollan bibliotecas para Clipper respaldaron el proyecto soportandolo en sus productos El nombre Harbour es un juego de palabras con los barcos tipo Clipper que arribaban a un puerto siendo Harbour el puerto de Clipper En 2009 Harbour fue redisenado sustancialmente sobre todo por Viktor Szakats y Przemyslaw Czerpak Compatibilidad con base de datos EditarHarbour extiende la definicion Clipper Replaceable Database Drivers RDD Ofrece multiples DDR como DBF DBFNTX DBFCDX DBFDBT y DBFFPT En Harbour pueden usarse multiples RDDs en la misma aplicacion y las nuevas logicas de DDR se pueden definir por la combinacion de otros DDRs La arquitectura de los RDDs permite la herencia por lo que un RDD dado puede ampliar la funcionalidad de otro RDD existente s Desarrollos de terceros como RDDSQL RDDSIX RMDBFCDX Advantage Database Server y Mediator ejemplifican algunas de las caracteristicas de la arquitectura del RDD La implementacion DBFNTX tiene casi las mismas funciones de DBFCDX y RDDSIX NETIO y LetoDB 2 proporcionan acceso remoto a traves del protocolo TCP protocol Harbour tambien ofrece soporte ODBC por medio de una sintaxis de programacion orientada a objetos y soporte ADO a traves de OLE MySQL PostgreSQL SQLite Firebird Oracle son ejemplos de bases de datos con las que se puede conectar Harbour Las tecnologias xBase a menudo se confunden con un RDBMS software Aunque esto es cierto xBase es mas que un sistema de base de datos simple pues las variantes xBase que utilizan exclusivamente DBF no pueden proporcionar el concepto completo de un verdadero RDBMS Filosofia de programacion EditarA diferencia del lenguaje de programacion Java que esta destinado a escribir una vez ejecutar en cualquier lugar Harbour aspira a ser escribir una vez compilar en cualquier lugar A medida que el mismo compilador esta disponible para todos los sistemas operativos anteriores no hay necesidad de recodificacion para producir productos identicos para diferentes plataformas excepto cuando se utilizan las caracteristicas dependientes del sistema operativo Se soporta la compilacion cruzada con MinGW32 En Microsoft Windows Harbour es mas estable pero no tan bien documentado como Clipper pero tiene la capacidad multi plataforma y es mas transparente personalizable y se puede ejecutar desde una Memoria USB En Linux y Windows Mobile el codigo fuente Clipper puede ser compilado con Harbour con muy poca adaptacion La mayoria del software escrito originalmente para funcionar con Xbase Flagship FoxPro xHarbour y otros dialectos pueden ser compilados con Harbour con algunas adaptaciones En 2010 se han hecho muchos esfuerzos para hacer la transicion de otros dialectos xBase mas facil 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 tanto para ser generado el compilador Harbour y sus herramientas auxiliares como tambien para incluir rutinas en lenguaje C embebidas en el codigo de Harbour Interfaz Grafica Editar Harbour puede hacer uso de multiples emulaciones de terminal grafico incluidos los controladores de la consola e hibridos consola GUIs como GTWvt y GTWvg En el modo consola ventana DOS la ejecucion de un programa en Harbour es de tipo top down el programa avanza de arriba hacia abajo segun las directivas de programacion que va encontrando En cambio en el modo Grafico se utiliza el paradigma por eventos y la ejecucion no necesariamente sigue con la proxima directiva de programacion Es muy importante tener en cuenta esto porque el codigo fuente debe ser modificado segun el tipo de interfaz que se elija Harbour soporta interfaces graficas de usuario externas por ejemplo Libres HBQt Forma parte de Harbour basada en Qt biblioteca Qth basada en Qt biblioteca MiniGUI OOHG Marinas GUI HwGUI basada en GTK xbGTK basada en GTK xHGTK basada en GTK t gtk basada en GTK Comerciales FiveWin XailerHBQt es una biblioteca que proporciona enlaces a Qt La aplicacion HBIDE incluida en la distribucion oficial y en el repositorio SVN es una muestra del potencial de HBQt Harbour es 100 compatible con Clipper 3 y soporta muchas extensiones de la sintaxis del lenguaje incluyendo en gran medida extensiones en tiempo de ejecucion tales como bibliotecas OLE Blat OpenSSL FreeImage GD TIP Tpathy PCRE HbZip zlib y bzip2 cURL Cairo su propia implementacion de las librerias CA Tools y NanFor y muchos otros Harbour cuenta con una activa comunidad de desarrollo y con un amplio apoyo de terceros Cualquier lenguaje xBase proporciona una manera muy productiva para construir aplicaciones de negocios y de grandes volumenes de datos Harbour no es una excepcion Operador de Macro compilacion en tiempo de ejecucion Editar Una de las caracteristicas mas potentes de los lenguajes xBase es el operador de macro amp La implementacion en Harbour del operador de macro permite la compilacion en tiempo de ejecucion de cualquier expresion valida Harbour Una expresion compilada se puede utilizar como un VALUE es decir el lado derecho de una asignacion rvalue pero es mas interesante tal expresion compilada puede utilizarse para resolver el lado izquierdo lvalue de una asignacion es decir variables PRIVATE o PUBLIC o en un campo de base de datos Ademas el operador de macro puede compilar y ejecutar llamadas a funciones tareas completas o incluso la lista de argumentos y el resultado de la macro se puede utilizar para resolver cualquiera de los contextos anteriores en la aplicacion compilada En otras palabras cualquier aplicacion Harbour puede ser extendida y modificada en tiempo de ejecucion para compilar y ejecutar codigo adicional bajo demanda El compilador de macro puede compilar cualquier codigo Harbour valido incluyendo el codigo de pre proceso antes de la compilacion Sintaxis amp El valor del texto de la expresion sera compilado y el valor resultante de la ejecucion del codigo compilado es el resultado amp SomeId es la forma corta de amp SomeId amp SomeId postfix es la forma corta de amp SomeId postfix Programacion Orientada a Objetos Editar El estilo de programacion orientada a objetos es un tema mas amplio que el de una biblioteca especifica o una interfaz especifica pero la programacion orientada a objetos es algo que muchos programadores Clipper han llegado a esperar CA Clipper 5 2 y en especial 5 3 anadieron una serie de clases base y una sintaxis de programacion orientada a objetos correspondiente Bibliotecas como Class y FiveWin Clip4Win y TopClass ofrecen funcionalidad de programacion orientada a objetos adicionales Harbour tiene extensiones de programacion orientada a objetos con soporte completo para las clases incluyendo la herencia basado en la sintaxis de Class y La sintaxis de programacion orientada a objetos en Harbour es muy similar a la de anteriores bibliotecas de clases de Clipper por lo que deberia ser posible mantener el codigo heredado Clipper con cambios minimos Sintaxis y semantica Editar Codigo Harbour en HBIDE Harbour como cada lenguaje xBase es in sensible a mayusculas y opcionalmente puede aceptar palabras clave escritas con solo los cuatro primeros caracteres Tipos de datos incorporados Editar Harbour cuenta con 6 tipos escalares Nil Cadena Fecha Logico Numerico y 4 tipos complejos Matriz Array Objeto CodeBlock y Hash Un escalar tiene un valor unico como una cadena numero o referencia a cualquier otro tipo Las matrices son listas ordenadas de escalares o tipos complejos con un indice por numero comenzando por el 1 Hashes o matrices asociativas son conjuntos no ordenados de los valores de tipo indexados por la clave de su asociado que puede ser de cualquier tipo escalar o compleja Representacion literal estatica de tipos escalares NIL Este valor especial es asignado a todas las variables no inicializadas excepto las publicas y es tambien pasado tambien como un sustituto cuando los argumentos son omitidos en el llamado a una funcion o procedimiento Cadena de caracteres hola hola hola Fecha 0d20100405 Logico T F Numerico 1 1 1 1 0xFFLos tipos complejos tambien pueden presentarse como valores literales Array Cadena 1 Matriz Anidada T FunctionCall FunctionPointer CodeBlock Arg1 ArgN Arg1 ArgN OuterVar FunctionCall Hash Nombre gt Juan 1 gt Clave numerica Anidado gt Hash Los valores hash puede utilizar cualquier tipo incluyendo otros hashes como la Clave para cualquier elemento Hashes y arrays pueden contener cualquier tipo como el valor de cualquier miembro incluidas las matrices de anidacion y hashes Los Codeblocks pueden tener referencias a variables del Procedimiento Funcion Metodo en el que se ha definido Estos Codeblocks pueden ser devueltos como un valor o por medio de un argumento pasado por referencia en tal caso el bloque de codigo va a sobrevivir a la rutina en la que se definio y las variables de las que hace referencia sera una variable INDEPENDIENTE Las variables independientes mantendran su valor durante el tiempo que un bloque de codigo Codeblock hace referencia a ellos aun exista Estos valores seran compartidos con cualquier otro bloque de codigo que puede tener acceso a esas mismas variables Si el bloque de codigo no sobrevive a la rutina que contiene y sera evaluado durante la vida de la rutina en la que se define los cambios en sus variables independientes por medio de su evaluacion se reflejan de vuelta en la rutina de los padres Los Codeblocks se pueden evaluar cualquier numero de veces por medio de la funcion Eval BlockExp Variables Editar Todos los tipos se pueden asignar a las variables declaradas El nombre de una variable tiene de 1 a 63 caracteres de largo comienza por A Z y ademas constara de caracteres A Z 0 9 hasta el maximo de 63 caracteres Los nombres de las variables no distinguen entre mayusculas y minusculas Las variables tienen uno de los siguientes ambitos LOCAL Visible solo dentro de la rutina que lo declaro El valor se pierde al salir de la rutina STATIC Visible solo dentro de la rutina que lo declaro El valor es preservado para las siguientes llamadas a la rutina Si una variable STATIC estatica se declara antes de que cualquier procedimiento funcion metodo se defina tiene un alcance de MODULE modulo y es visible dentro de cualquier rutina definida dentro de ese mismo archivo de origen que mantendra su vida durante toda la duracion de la aplicacion PRIVATE Visible dentro de la rutina que lo declaro y todas las rutinas llamadas por esa rutina PUBLIC Visible por todas las rutinas en la misma aplicacion LOCAL y STATIC se resuelven en tiempo de compilacion y por lo tanto son mucho mas rapidas que las variables PRIVATE y PUBLIC que son entidades dinamicas a las que se accede en tiempo de ejecucion por medio de la tabla de simbolos Por esta misma razon las variables LOCAL y STATIC no estan disponibles para el compilador de macros y cualquier codigo de macro que intenta hacer referencia a ellos va a generar un error de ejecucion Debido a la naturaleza dinamica de las variables PRIVATE y PUBLIC que pueden ser creados y destruidos en tiempo de ejecucion se puede acceder y modificar por medio de macros en tiempo de ejecucion y pueden ser consultados y modificados por Codeblocks creados sobre la marcha Fields Campos Editar Las variables de los campos de las bases de datos estan limitados a Caracter Numerico Fecha Logico y un tipo especial llamado MEMO que es tratado como una Cadena de caracteres con algunos caracteres especiales de control Estructuras de control Editar Las estructuras de control basicas incluyen todas las estructuras de control estandar de dBase y Clipper asi como otras adicionales inspirados en las de los lenguajes de programacion C o Java Bucles Editar DO WHILE ConditionExp LOOP EXIT END DO FOR Var InitExp TO EndExp STEP StepExp LOOP EXIT NEXT FOR EACH Var IN CollectionExp HB EnumIndex LOOP EXIT NEXT es una secuencia de una o mas expresiones Harbour statements y los corchetes indican la sintaxis opcional HB EnumIndex puede ser utilizado opcionalmente para recuperar el indice de iteracion actual basado en 1 La sentencia LOOP reinicia la iteracion actual de la estructura de bucle a que pertenece y si el circuito de cierre es un bucle FOR o FOR EACH incrementa el contador pasando a la siguiente iteracion del bucle La sentencia EXIT termina inmediatamente la ejecucion de la estructura de bucle a que pertenece La sentencia NEXT cierra la estructura de control y se traslada a la siguiente iteracion de la estructura de bucle En la sentencia FOR la expresion de asignacion se evalua antes de la repeticion del bucle en primer lugar La expresionTO se evalua y se compara con el valor de la variable de control antes de cada iteracion y el bucle se termina si se evalua como un valor numerico mayor que el valor numerico de la variable de control La expresion opcional STEP se evalua despues de cada iteracion antes de decidir si se debe realizar la siguiente iteracion En FOR EACH la variable Var tendra el valor escalar o complejo del elemento respectivo en el valor de la coleccion La expresion de la coleccion puede ser una matriz de cualquier tipo o una combinacion de tipos una tabla hash o un Objeto Sentencias IF Editar IF CondExp ELSEIF CondExp ELSE END IF representa 0 o mas sentencias Las expresiones de condicion tiene que evaluar a un valor LOGICAL logico Sentencias SWITCH Editar Harbour admite el constructor SWITCH inspirado en la implementacion en C de switch SWITCH SwitchExp CASE LiteralExp EXIT CASE LiteralExp EXIT DEFAULT END La LiteralExp debe ser una expresion numerica que pueda resolverse en tiempo de compilacion y puede involucrar operadores siempre y cuando los operadores en cuestion afectan a un valor en tiempo de compilacion estatica La sentencia opcional EXIT es el equivalente de la declaracion breaken C y si esta presente la ejecucion de la estructura SWITCH termina al alcanzar la sentencia EXIT de lo contrario se continuara con la primera declaracion CASE siguiente fall through Sentencias BEGIN SEQUENCE Editar BEGIN SEQUENCE BREAK Break Exp RECOVER USING Var END SEQUENCE o BEGIN SEQUENCE BREAK Break END SEQUENCE La estructura BEGIN SEQUENCE permite un aborto ordenado de cualquier secuencia incluso cuando se utilizan procedimientos y funciones anidadas Esto significa que un procedimiento funcion llamado puede emitir una sentencia BREAK o una expresion Break para forzar el retorno de cualquier procedimiento funcion anidadas todo el camino de regreso a la primera estructura externa BEGIN SEQUENCE incluso despues de su respectiva declaracion END o a una clausula RECOVER si esta presente La sentencia Break puede pasar opcionalmente cualquier tipo de expresion que puede ser aceptado por la sentencia RECOVER para permitir su entrega y posterior recuperacion Ademas el Error Object objeto de error de Harbour soporta las propiedades canDefault canRetry y canSubstitute que permiten a los controladores de errores llevar a cabo algunos preparativos y luego solicitar una Retry Operation operacion de reintento un Resume o devolver un Valor para sustituir la expresion que dispara la condicion de error Alternativamente las declaraciones TRY CATCH FINALLY estan disponibles en la biblioteca xHB trabajando como el constructor SEQUENCE Procedimientos y funciones Editar 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 Procedimientos y Funciones en Harbour puede ser especificadas con la palabra clave PROCEDURE o FUNCTION Las reglas de asignacion de nombres son los mismos que para las variables hasta 63 caracteres que mayusculas y minusculas Procedimientos y funciones pueden ser calificados por el calificador de ambito STATIC para restringir su uso al ambito de aplicacion del modulo donde se define Los calificadores opcionales INIT or EXIT marcaran el procedimiento que se invoca automaticamente justo antes de llamar al procedimiento de inicio de la aplicacion o justo despues de salir de la aplicacion respectivamente Los parametros que se pasan a una procedure function aparecen en la subrutina como variables locales y puede aceptar cualquier tipo incluyendo las referencias Los cambios en las variables de parametros no se reflejan en las variables respectivas pasadas en la llamada al procedimiento funcion metodo a menos que pasen explicitamente BY REFERENCE por referencia usando el prefijo Un PROCEDURE no tienen valor de retorno y si se utiliza en un contexto de expresion va a producir un valor Nulo Una FUNCTION puede devolver cualquier tipo por medio de la instruccion RETURN en cualquier parte del cuerpo de su definicion A continuacion una llamada a una FUNCTION y la definicion de dicha FUNCTION x Cube 2 FUNCTION Cube n RETURN n 3 Ejemplos de codigo Editar El tipico programa hola mundo puede implementarse como Hola mundo O QOut Hola mundo O Alert Hola mundo O dentro de un procedimiento explicito PROCEDURE Main Hola mundo RETURN Ejemplos de OOP Editar include hbclass ch PROCEDURE Main LOCAL oPerson Person New Dave oPerson Eyes Invalid oPerson Eyes Blue Alert oPerson Describe RETURN CLASS Person DATA Name INIT METHOD New cName CONSTRUCTOR ACCESS Eyes INLINE pvtEyes ASSIGN Eyes x INLINE IIF ValType x C AND x IN Blue Brown Green pvtEyes x Alert Invalid value Ejemplo de definicion de metodo IN LINE INLINE METHOD Describe 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 ENDMETHOD PRIVATE DATA pvtEyes ENDCLASS Ejemplo de definicion de un metodo normal METHOD New cName CLASS Person Name cName RETURN SelfHerramientas EditarHBIDE Entorno de desarrollo integrado para ayudar al desarrollo Harbour y varios dialectos xBase HBMK2 Potente herramienta de construccion como make HBDoc2 e HBExtern Crea la documentacion para Harbour HPPP Preprocesador una poderosa herramienta que evita los problemas tipicos que se encuentran en el Preprocesador de C HBFormat Formatea codigo fuente escrito en Harbour u otro dialecto a otro segun las reglas definidas HBi18n Herramientas para la localizacion de texto en las aplicaciones HBRun interprete de Shell para Harbour La macro compilacion permite ejecutar cualquier codigo Harbour valido ya que se esta compilandoTodas las herramientas son multiplataforma Nota A pesar de no estar incluida la herramienta DBU para crear y manejar tablas en formato DBF por cuestiones de copyright aun sigue siendo posible compilar el codigo original DBU PRG y generar el ejecutable en cualquiera de las plataformas soportadas Desarrollo Editar HBIDE look Hoy en dia el desarrollo de Habour esta liderado por Viktor Szakats con gran colaboracion de Przemyslaw Czerpak que lleva muchos componentes del nucleo y contribuciones HBIDE y algunos componentes especialmente HBQt son desarrollados por Pritpal Bedi Otros miembros aportan los cambios de menor importancia al repositorio SVN de Sourceforge 4 En 2010 el desarrollo de Harbour mantiene una vibrante actividad Popularidad EditarAunque no hay manera de medir la popularidad de Harbour o xBase el TIOBE Programming Community Index 5 situaba a Microsoft Visual FoxPro un dialecto de alto perfil de xBase en la 12 posicion en el ranking de popularidad de lenguajes de programacion en junio de 2006 y a FoxPro xBase en el puesto 25 en agosto de 2010 En septiembre de 2010 los newsgroups de Usenet sobre Clipper comp lang clipper todavia esta activo En agosto de 2010 Harbour figuraba en la posicion 16 en descargas semanales en la categoria del compilador y en la posicion 132 en la clasificacion mundial 6 Comparacion con xHarbour EditarxHarbour es un fork 7 del primitivo proyecto Harbour xHarbour tiene un enfoque mas agresivo para la aplicacion de las nuevas caracteristicas del lenguaje mientras que Harbour es mas conservador en su planteamiento con el objetivo en primer lugar por una replica exacta del comportamiento de Clipper dejando la aplicacion de las nuevas caracteristicas y extensiones como una consideracion secundaria Tambien hay que senalar que Harbour es compatible con una amplia variedad de sistemas operativos mientras que xHarbour solo esta soportado por las versiones de 32 bits de Microsoft Windows y Linux Los desarrolladores de Harbour han tratado de documentar todo el comportamiento oculto en el lenguaje Clipper y testeado codigo compilado con Harbour con el mismo codigo compilado con Clipper para mantener la compatibilidad Los desarrolladores de Harbour rechazan explicitamente extensiones del lenguaje cuando las extensiones rompen la compatibilidad Clipper Este rechazo se suaviza recientemente ya que la nueva arquitectura de Harbour permite extensiones fuera del nucleo del compilador Una comparacion detallada entre las extensiones aplicadas en Harbour y xHarbour se puede encontrar en el repositorio SVN del proyecto en SourceForge 8 A partir de 2009 2010 Harbour ha visto un enorme aumento en su adopcion mientras que el declive de xHarbour puede verse en su lista de correo 9 10 11 Vease tambien EditarxHarbour FlagShip de multisoft Visual FoxPro Visual Objects XBase Referencias Editar Harbour license LetoDB Official Harbour page Archivado el 5 de junio de 2012 en Wayback Machine http sourceforge net projects harbour project TIOBE Programming Community Index Archivado desde el original el 29 de noviembre de 2007 Consultado el 4 de marzo de 2012 SourceForge About xHarbour xhb diff txt Harbour developers mailing list statistics Archivado desde el original el 13 de marzo de 2012 Consultado el 4 de marzo de 2012 xHarbour developers mailing list statistics Archivado desde el original el 13 de marzo de 2012 Consultado el 4 de marzo de 2012 ohloh net Activity comparisonEnlaces externos EditarSitio web oficial ingles Repositorio en Sourceforge Disenador de Informes para Harbour The Oasis Repositorio de las comunidades Clipper FoxPro y Xbase HBIDE Un programa musical en Harbour Datos Q2544816 Obtenido de https es wikipedia org w index php title Compilador Harbour amp oldid 147017353, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos