Harbour Compiler

Havneprosjekt
Utvikler(e)
Viktor Szakáts og havnesamfunnet
https://harbour.github.io/
Generell informasjon
Vanlige utvidelser .prg, .ch, .hbs, .dbf
Paradigme multi-paradigme: imperativ , funksjonell , objektorientert , reflekterende
Dukket opp i 1999
Designet av Antonio Linares
Siste stabile versjon 3.0.0 (17. juli 2011 (11 år og 3 måneder))
Siste versjon i tester 3.1.x tilgjengelig i SVN (selv om det er en versjon kalt "nightly" som genereres daglig med de siste modifikasjonene til Harbor eller noen av dens komponenter.
type system valgfritt duck , dynamisk, sikker, delvis sterk skriving
dialekter Clipper, Xbase++, Flagship, FoxPro, xHarbour
påvirket av dBase, Clipper
har påvirket xHarbour
Operativsystem Multiplattform
Tillatelse GPL-kompatibel med åpen kildekode

Harbor er et moderne programmeringsspråk som ble født som en kompilator for programmeringsspråket Clipper (en variant av xBase ) utviklet som gratis programvare . Det opprinnelige målet var å støtte alle uttalelsene og utvidelsene til den mest populære versjonen av kompilatoren, Clipper 5.2. Harbor er også en kompilator på tvers av plattformer , i stand til å kompilere for og kjøre under DOS ( MS-DOS , DR-DOS , etc), Microsoft Windows , OS/2 , GNU/Linux , forskjellige Unix - varianter , forskjellige BSD - etterkommere , Mac OS X , MINIX 3 , Windows CE , Pocket PC , Symbian , iPhone OS , QNX , VxWorks , OS/2 BeOS / Haiku , AIX med samme kildekode og databasefiler.

Selv om det er et kraftig programmeringsspråk for generell bruk, brukes det hovedsakelig til å lage forretnings- og databaseprogrammer. Harbor har aktivt fortsatt å legge til funksjoner samtidig som den opprettholder bakoverkompatibilitet med Clipper-stilen. Den har gjennomgått mange endringer og revisjoner og har gjenvunnet popularitet blant programmerere på 1980- og 1990-tallet.

Harbor open source -lisensen [ 1 ] ligner på GNU General Public License , med unntak av proprietær applikasjonsstøtte, slik at proprietære applikasjoner kan opprettes og distribueres med Harbor.

Historikk

Ideen om en gratis programvare Clipper kompilator hadde eksistert i lang tid og var ofte gjenstand for diskusjon på comp.lang.clipper. Prosjektet ble startet av Antonio Linares, skaperen av FiveWin- biblioteket , og ble raskt utsendt av andre utviklingsfigurer hos Clipper. Flere av husene som utvikler biblioteker for Clipper støttet prosjektet, og støttet det i sine produkter. Navnet Harbour er et ordspill på Clipper -skip som ankommer en havn , og Harbor er Clipper-havnen.

I 2009 ble Harbour vesentlig redesignet, spesielt av Viktor Szakáts og Przemyslaw Czerpak.

Databasestøtte

Harbor utvider definisjonen av Clipper Replaceable Database Drivers (RDD). Den tilbyr flere DDR-er som DBF , DBFNTX, DBFCDX, DBFDBT og DBFFPT. I Harbor kan flere RDD-er brukes i samme applikasjon, og nye DDR-logikker kan defineres ved kombinasjonen av andre DDR-er. Arkitekturen til RDD-er gir mulighet for arv, slik at en gitt RDD kan utvide funksjonaliteten til andre eksisterende RDD(er). Tredjepartsutviklinger, som RDDSQL, RDDSIX, RMDBFCDX, Advantage Database Server og Mediator, eksemplifiserer noen av funksjonene til RDD-arkitekturen. DBFNTX-implementeringen har nesten samme funksjonalitet som DBFCDX og RDDSIX. NETIO og LetoDB [ 2 ] gir fjerntilgang gjennom TCP - protokollen.

Harbor tilbyr også ODBC -støtte gjennom objektorientert programmeringssyntaks , og ADO -støtte gjennom OLE . MySQL , PostgreSQL , SQLite , Firebird , Oracle er eksempler på databaser som Harbor kan koble seg til.

xBase-teknologier forveksles ofte med en programvare - RDBMS . Selv om dette er sant, er xBase mer enn bare et enkelt databasesystem, ettersom xBase-varianter som utelukkende bruker DBF ikke kan gi hele konseptet til en ekte RDBMS.

Programmeringsfilosofi

I motsetning til programmeringsspråket Java , som er ment å skrive én gang, kjøre hvor som helst, ønsker Harbor å skrive én gang, kompilere hvor som helst . Siden den samme kompilatoren er tilgjengelig for alle de ovennevnte operativsystemene, er det ikke behov for omkoding for å produsere identiske produkter for forskjellige plattformer, bortsett fra når operativsystemavhengige funksjoner brukes. Krysskompilering med MinGW 32 støttes. På Microsoft Windows er Harbor mer stabil, men ikke like godt dokumentert som Clipper, men den er kompatibel med flere plattformer og er mer gjennomsiktig, tilpassbar og kan kjøres fra en USB-pinne .

På Linux og Windows Mobile kan Clipper-kildekoden kompileres med Harbour, med svært liten tilpasning. Mest programvare som opprinnelig er skrevet for å fungere med Xbase++, Flagship, FoxPro, xHarbour og andre dialekter kan kompileres med Harbor med noen tilpasninger. I 2010 har det blitt gjort mange anstrengelser for å gjøre overgangen fra andre xBase- dialekter enklere.

Harbor kan blant annet bruke følgende C-kompilatorer: GCC , MinGW , Clang , ICC , Microsoft Visual C++ (6.0+), Borland C++ , Watcom C , Pelles C og Sun Studio , begge skal genereres av Harbor-kompilatoren og dens verktøy hjelpere, samt å inkludere rutiner på C-språk, innebygd i Havnekoden.

Grafisk grensesnitt

Harbor kan benytte seg av flere grafiske terminalemuleringer, inkludert konsolldrivere og konsoll/GUI-hybrider, som GTWvt og GTWvg.

I konsollmodus (DOS-vindu) er kjøringen av et program i Harbor av typen ovenfra og ned, programmet går fra topp til bunn, i henhold til programmeringsdirektivene det møter.
På den annen side, i grafisk modus, brukes hendelsesparadigmet og utførelsen fortsetter ikke nødvendigvis med neste programmeringsdirektiv.
Det er svært viktig å ta hensyn til dette, fordi kildekoden må endres i henhold til hvilken type grensesnitt som velges.

Harbor støtter eksterne grafiske brukergrensesnitt, for eksempel:


HBQt er et bibliotek som gir bindinger til Qt. HBIDE-applikasjonen inkludert i den offisielle distribusjonen og i SVN-depotet er et utvalg av potensialet til HBQt.

Harbor er 100 % Clipper-kompatibel [ 3 ] og støtter mange utvidelser til språksyntaksen, inkludert stort sett kjøretidsutvidelser som OLE-biblioteker, Blat , OpenSSL , FreeImage , GD , TIP, Tpathy, PCRE , HbZip ( zlib og bzip2 ), cURL , Cairo , sin egen implementering av CA-Tools og NanFor-bibliotekene, og mange andre. Harbour har et aktivt utviklingsfellesskap og omfattende tredjepartsstøtte.

Ethvert xBase-språk gir en veldig produktiv måte å bygge forretnings- og big data-applikasjoner på. Havnen er intet unntak.

Makrooperatør (kjøretidskompilering)

En av de kraftigste funksjonene til xBase-språkene er '&'- makrooperatøren . Harbors implementering av makrooperatoren tillater kjøretidskompilering av alle gyldige Harbor-uttrykk. Et kompilert uttrykk kan brukes som en VERDI, dvs. høyre side av en oppgave (rvalue), men mer interessant, et slikt kompilert uttrykk kan brukes til å løse venstre side (lvalue) av en oppgave, dvs. PRIVATE variabler eller OFFENTLIG, eller i et databasefelt.

I tillegg kan makrooperatøren kompilere og utføre funksjonskall, hele oppgaver eller til og med argumentlisten, og resultatet av makroen kan brukes til å løse alle ovennevnte kontekster i den kompilerte applikasjonen. Med andre ord, enhver Harbor-applikasjon kan utvides og modifiseres ved kjøretid for å kompilere og utføre tilleggskode på forespørsel.

Makrokompilatoren kan kompilere hvilken som helst gyldig Harbor-kode, inkludert forhåndsprosesskode før kompilering.

Syntaks:

&(...)

Verdien av teksten til uttrykket '...' vil bli kompilert, og verdien som kommer fra kjøringen av den kompilerte koden er resultatet.

&SomeId

er den korte formen av &( SomeId ).

&SomeId.postfix

er den korte formen av &( SomeId + "postfix" ).

Objektorientert programmering

Objektorientert programmeringsstil er et bredere emne enn et spesifikt bibliotek eller et spesifikt grensesnitt, men objektorientert programmering er noe mange Clipper-programmerere har kommet til å forvente. CA-Clipper 5.2 og spesielt 5.3 la til en rekke basisklasser, og en tilsvarende objektorientert programmeringssyntaks. Biblioteker som Class(y) , FiveWin , Clip4Win og TopClass tilbyr ekstra objektorientert programmeringsfunksjonalitet.

Harbor har objektorienterte programmeringsutvidelser med full støtte for klasser, inkludert arv, basert på Class(y)-syntaksen. Den objektorienterte programmeringssyntaksen i Harbor er veldig lik tidligere Clipper-klassebiblioteker, så det bør være mulig å beholde eldre Clipper-kode med minimale endringer.

Syntaks og semantikk

Harbor som alle xBase-språk skiller mellom store og små bokstaver og kan valgfritt godta nøkkelord skrevet med bare de fire første tegnene.

Innebygde datatyper

Harbor har 6 skalartyper: Null , String , Date , Logical , Numeric , og 4 komplekse typer: Array , Object , CodeBlock og Hash . En skalar har en enkelt verdi, for eksempel en streng, tall eller referanse til en hvilken som helst annen type. Matriser er ordnede lister over skalarer eller komplekse typer, indeksert etter tall, som starter på 1. Hashes, eller assosiative matriser , er uordnede sett med typeverdier indeksert med nøkkelen til partneren deres, som kan ha en hvilken som helst verdi. skalar eller kompleks type.

Bokstavelig (statisk) representasjon av skalartyper:

Komplekse typer kan også presenteres som bokstavelige verdier:

Hashes kan bruke alle typer, inkludert andre hashes som nøkkelen for ethvert element. Hashes og arrays kan inneholde hvilken som helst type som verdien til ethvert medlem, inkludert nesting arrays og hashes.

Kodeblokker kan ha referanser til variabler for prosedyren/funksjonen/metoden der de er definert. Disse kodeblokkene kan returneres som en verdi, eller via et argument sendt ved referanse, i så fall vil kodeblokken "overleve" rutinen den ble definert i, og variablene den refererer til vil være en UAVHENGIG variabel.

Uavhengige variabler vil beholde verdien så lenge en kodeblokk (kodeblokk) refererer til dem, fortsatt eksisterer. Disse verdiene vil bli delt med andre kodeblokker som kan ha tilgang til de samme variablene. Hvis kodeblokken ikke overlever rutinen den inneholder, og vil bli evaluert i løpet av levetiden til rutinen den er definert i, vil endringer i dens uavhengige variabler gjennom evalueringen reflekteres tilbake i den overordnede rutinen.

Kodeblokker kan evalueres et hvilket som helst antall ganger ved å bruke Eval( BlockExp ) funksjonen.

Variabler

Alle typer kan tilordnes til deklarerte variabler. Et variabelnavn er 1 til 63 tegn langt, begynner med [AZ|_], og vil i tillegg bestå av tegn [AZ|0–9|_] opptil maksimalt 63 tegn. Variabelnavn skiller ikke mellom store og små bokstaver.

Variabler har ett av følgende omfang:

LOCAL og STATIC løses på kompileringstidspunktet, og er dermed mye raskere enn PRIVATE og PUBLIC variabler som er dynamiske enheter som åpnes under kjøring via symboltabellen . Av samme grunn er ikke variablene LOCAL og STATIC tilgjengelig for makrokompilatoren, og enhver makrokode som prøver å referere til dem, vil mislykkes.

På grunn av den dynamiske naturen til PRIVATE og OFFENTLIGE variabler kan de opprettes og ødelegges under kjøring, åpnes og endres av makroer under kjøring, og spørres og modifiseres av kodeblokker som er opprettet i farten.

Felter

Databasefeltvariabler er begrenset til: Tegn, Numerisk, Dato, Logisk og en spesiell type kalt 'MEMO' som behandles som en streng (med noen spesielle kontrolltegn).

Kontrollstrukturer

De grunnleggende kontrollstrukturene inkluderer alle standard dBase- og Clipper -kontrollstrukturer , så vel som flere inspirert av programmeringsspråkene C eller Java  :

Loops [DO] WHILE ConditionExp ... [LØKKE] [EXIT] END[DO] FOR Var  := InitExp TO EndExp [STEP StepExp ] ... [LØKKE] [EXIT] NESTE FOR HVER Var IN CollectionExp ... [HB_EnumIndex()] [LØKKE] [EXIT] NESTE

I FOR -setningen evalueres tilordningsuttrykket før loop-iterasjonen først. TO - uttrykket evalueres og sammenlignes med verdien til kontrollvariabelen før hver iterasjon, og sløyfen avsluttes hvis den evalueres til en numerisk verdi som er større enn den numeriske verdien til kontrollvariabelen. Det valgfrie STEP- uttrykket evalueres etter hver iterasjon, før det bestemmes om neste iterasjon skal utføres.

I FOR EACH vil Var - variabelen holde verdien (skalær eller kompleks) til det respektive elementet i samlingsverdien. Samlingsuttrykket kan være en matrise (av hvilken som helst type eller en kombinasjon av typer), en hashtabell eller et objekt.

IF-uttalelser IF CondExp ... [ELSEIF] CondExp ... [ELLERS] ... SLUTT OM]

... representerer 0 eller flere utsagn .

Betingelsesuttrykk må evalueres til en LOGISK verdi .

SWITCH uttalelser

Harbor støtter SWITCH-konstruktøren inspirert av C-implementeringen av switch().

SWITCH SwitchExp CASE LiteralExp ... [EXIT] [CASE LiteralExp ] ... [EXIT] [MISLIGHOLDE] ... SLUTT BEGIN SEQUENCE uttalelser BEGYNN SEKVENS ... [GÅ I STYKKER] [Pause([ Exp ])] GJENNINN [BRUKE Var ] ... END[SEKVENS]

enten:

BEGYNN SEKVENS ... [GÅ I STYKKER] [gå i stykker()] END[SEKVENS]

BEGIN SEQUENCE-strukturen tillater en ordnet avbrytelse av enhver sekvens, selv når du bruker nestede prosedyrer og funksjoner. Dette betyr at en kalt prosedyre/funksjon kan utstede en BREAK-setning, eller et Break()-uttrykk, for å tvinge tilbake til enhver nestet prosedyre/funksjon helt tilbake til den første ytre BEGIN SEQUENCE-strukturen, selv etter dens respektive END-setning, eller til en RECOVER-klausul hvis den finnes. Break-setningen kan valgfritt passere alle typer uttrykk, som kan aksepteres av RECOVER-setningen for å tillate levering og påfølgende henting.

I tillegg støtter Harbor Error Object egenskaper canDefault , canRetry og canSubstitute , som lar feilbehandlere gjøre noen forberedelser og deretter be om en Retry Operation , Resume eller returnere en verdi for å erstatte uttrykket som utløser feiltilstanden.

Alternativt PRØV [CATCH] [FINALLY]-setninger er tilgjengelige i xHB-biblioteket som fungerer som SEQUENCE-konstruktøren.

Prosedyrer og funksjoner

[STATIC] PROCEDURE SomeProcedureName [STATIC] PROCEDURE SomeProcedureName () [STATISK] PROSEDYRE SomeProcedureName ( Param1' [, ParamsN ] ) INIT PROCEDURE SomeProcedureName EXIT PROCEDURE SomeProcedureName [STATISK] FUNKSJON SomeProcedureName [STATIC] FUNCTION SomeProcedureName () [STATISK] FUNKSJON SomeProcedureName ( Param1' [, ParamsN ] )

Prosedyrer og funksjoner i Harbor kan spesifiseres med nøkkelordet PROCEDURE eller FUNCTION. Navnereglene er de samme som for variabler (opptil 63 tegn som skiller mellom store og små bokstaver). Prosedyrer og funksjoner kan kvalifiseres av STATIC scope qualifier for å begrense bruken til omfanget av modulen der den er definert.

De valgfrie INIT- eller EXIT -kvalifikatorene vil markere prosedyren som blir automatisk påkalt rett før du kaller opp programmets oppstartsprosedyre, eller rett etter at programmet avsluttes. Parametere som sendes til en prosedyre/funksjon vises i subrutinen som lokale variabler, og kan godta alle typer, inkludert referanser.

Endringer i parametervariabler gjenspeiles ikke i de respektive variablene som sendes i prosedyre-/funksjons-/metodekallet med mindre det er eksplisitt sendt BY REFERENCE med @ -prefikset .

EN PROSEDYRE har ingen returverdi, og hvis den brukes i en uttrykkskontekst, vil den produsere en Null-verdi.

En FUNKSJON kan returnere hvilken som helst type via RETURN-setningen, hvor som helst i definisjonens brødtekst.

Her er et kall til en FUNKSJON og definisjonen av den FUNKSJONEN:

x  := Kube( 2 ) FUNKSJON Kube( n ) RETURN n ** 3

Kodeeksempler

Det typiske hello world- programmet kan implementeres som:

 ? "Hei Verden!"

ENTEN:

QOut ( "Hei, verden!" )

ENTEN:

Alert ( "Hei, verden!" )

Eller, innenfor en eksplisitt prosedyre:

PROSEDYREHoved ()  ? "Hei Verden!" KOMME TILBAKE

OOP eksempler

#include "hbclass.ch" PROSEDYREHoved () LOKAL oPerson := Pers ():Ny( "Dave" ) oPerson :Eyes := "Ugyldig" oPerson :Øyne := "Blå" Varsel ( oPerson:Describe() ) RETUR KLASSE Person DATA Navn INIT "" METODE Ny( cName ) KONSTRUKTØR TILGANG Eyes IN LINE  ::pvtEyes TILDELE Eyes ( x ) IN LINE IIF ( Val Type ( x ) == 'C' .AND. x IN "Blue,Brown,Green" , ::pvtEyes := x, Alert( "Ugyldig verdi" )) // Eksempel på IN- LINE metodedefinisjon INLINE METODE Describe() LOCAL cDescription IF Empty ( ::Name ) cDescription  := "Jeg har ikke noe navn ennå." ELSE cDescription  := "Mitt navn er: " + ::Navn + ";" SLUTT OM JA  ! Tom ( ::Eyes ) cBeskrivelse += "mine øynes farge er: " + ::Eyes ENDIF ENDMETHOD PRIVAT : DATA pvtEyes ENDKLASSE // Eksempel på en normal metodedefinisjon. METODE Ny( cName ) KLASSE Person  :: Navn:= cNavn RETUR Selv

Verktøy

  • HBIDE – Integrert utviklingsmiljø for å hjelpe havneutvikling og ulike xBase-dialekter
  • HBMK2 – Kraftig byggeverktøy som make
  • HBDoc2 og HBExtern – Lag dokumentasjon for Harbor
  • HPPP – Preprocessor, et kraftig verktøy som unngår de typiske problemene som finnes i C Preprocessor
  • HBFormat – Formaterer kildekode skrevet i Harbor eller en annen dialekt til en annen i henhold til definerte regler
  • HBi18n – Verktøy for tekstlokalisering i applikasjoner
  • HBRun – Shell-tolk for Harbor. Byggmakroen lar enhver gyldig havnekode kjøres mens den bygges

Alle verktøyene er på tvers av plattformer.

Merk:
Selv om DBU-verktøyet for å lage og administrere tabeller i DBF-format ikke er inkludert (av opphavsrettslige årsaker), er det fortsatt mulig å kompilere den originale DBU.PRG-koden og generere den kjørbare filen på alle de støttede plattformene.

Utvikling

I dag ledes utviklingen av Habour av Viktor Szakáts med gode innspill fra Przemysław Czerpak som leder mange kjernekomponenter og bidrag. HBIDE og noen komponenter, spesielt HBQt, er utviklet av Pritpal Bedi. Andre medlemmer bidrar med mindre endringer i Sourceforge SVN-depotet . [ 4 ] I 2010 opprettholder havneutbyggingen en levende aktivitet.

Popularitet

Selv om det ikke er noen måte å måle populariteten til Harbor eller xBase, rangerte TIOBE Programming Community Index [ 5 ] Microsoft Visual FoxPro , en høyprofilert dialekt av xBase, på nummer 12 i popularitetsrangeringen av programmeringsspråk i verden juni 2006, og FoxPro / xBase rangert som nummer 25 i august 2010. Fra september 2010 er Clipper Usenet - nyhetsgruppene comp.lang.clipper fortsatt aktiv. Fra august 2010 ble Harbour oppført som nummer 16 i ukentlige nedlastinger i kompilatorkategorien og nummer 132 på verdensrankingen. [ 6 ]

Sammenligning med xHarbour

xHarbour er en gaffel [ 7 ] av det tidlige havneprosjektet. xHarbour tar en mer aggressiv tilnærming til å implementere nye språkfunksjoner, mens Harbour er mer konservativ i sin tilnærming, og sikter først og fremst på en nøyaktig replikering av Clippers oppførsel ved å la implementering av nye funksjoner og utvidelser være en sekundær vurdering. Det bør også bemerkes at Harbor er kompatibel med en lang rekke operativsystemer, mens xHarbour kun støttes av 32-biters versjoner av Microsoft Windows og Linux.

Harbor-utviklerne har prøvd å dokumentere all skjult oppførsel i Clipper-språket og testet Harbor-kompilert kode med samme Clipper-kompilerte kode for å opprettholde kompatibilitet.

Harbor-utviklere tillater eksplisitt språkutvidelser når utvidelsene bryter Clipper-kompatibiliteten. Denne fornektelsen er nylig mildnet ettersom den nye Harbor-arkitekturen tillater utvidelser utenfor kompilatorkjernen.

En detaljert sammenligning mellom utvidelsene implementert i Harbor og xHarbour finnes i prosjektets SVN-depot på SourceForge. [ 8 ]

Fra 2009-2010 har Harbour sett en enorm økning i adopsjonen, mens xHarbours nedgang kan sees i e-postlisten. [ 9 ]​ [ 10 ]​ [ 11 ]

Se også

Referanser

  1. Havnelisens
  2. LetoDB
  3. Offisiell havneside arkivert 2012-06-05Wayback Machine
  4. http://sourceforge.net/projects/harbour-project/
  5. TIOBE Programming Community Index
  6. SourceForge
  7. Om xHarbour
  8. xhb-diff.txt
  9. ^ "Havneutvikleres postlistestatistikk" . Arkivert fra originalen 13. mars 2012 . Hentet 4. mars 2012 . 
  10. ^ "xHarbour-utviklernes e-postlistestatistikk" . Arkivert fra originalen 13. mars 2012 . Hentet 4. mars 2012 . 
  11. ohloh.net Aktivitetssammenligning

Eksterne lenker