하버(프로그래밍 언어)
Harbour (programming language)![]() |
패러다임 | 멀티플렉스: 명령형, 기능형, 객체 지향형, 반사형 |
---|---|
설계자 | 안토니오 리나레스 |
개발자 | 빅토르 사카츠 및 커뮤니티 |
처음 등장한 | 전( |
안정된 릴리스 | 3.0.0 / 2011년 7월 17일; 전( |
프리뷰 릴리즈 | |
타이핑 분야 | 옵션인 오리, 다이내믹, 세이프, 부분 강성 |
OS | 크로스 플랫폼 |
면허증. | 오픈 소스 GPL 호환 |
파일 이름 확장자 | .prg, .ch, .hb, .hbp |
웹 사이트 | harbour |
사투리 | |
Clipper, Xbase++, FlagShip, FoxPro, xHarbour | |
영향을 받다 | |
dBase, 클리퍼 | |
영향받은 | |
하바루 |
하버는 주로 데이터베이스/비즈니스 프로그램을 만드는 데 사용되는 컴퓨터 프로그래밍 언어입니다.1980년대와 1990년대의 dBase 데이터베이스 시장에서 발전한 오래된 Clipper 시스템의 현대화된 오픈 소스 및 크로스 플랫폼 버전입니다.
동일한 데이터베이스를 사용하는 하버 코드는 Microsoft Windows, Linux, Unix 버전, 여러 BSD 하위 버전, Mac OS X, MINIX 3, Windows CE, Pocket PC, Symbian, iOS, Android, QNX, VxWorks, OS/2(eComStation [1]ArCa 포함) 등 다양한 플랫폼에서 컴파일할 수 있습니다.
역사
무료 소프트웨어 Clipper 컴파일러에 대한 아이디어는 오랫동안 떠돌았고 comp.lang.clipper에 대한 논의에서 자주 언급되었습니다.Antonio Linares는 Harbour 프로젝트를 설립하여 1999년 3월에 실시하기 시작했습니다."하버"라는 이름은 리나레스가 제안한 것으로, 배의 한 종류로서 클리퍼 위에서 하는 놀이입니다.하버는 항구(배들이 정박하는 곳)의 동의어이고 하버는 클리퍼 언어의 항구입니다.
2009년에 하버는 주로 Victor Szakats와 Przemyslaw Czerpak에 의해 실질적으로 재설계되었습니다.
데이터베이스 지원
Harbor는 Clipper Replaceable Database Drivers(RDD; 클리퍼 교환 가능 데이터베이스 드라이버)DBF, DBFNTX, DBFCDX, DBFDBT 및 DBFFT와 같은 여러 RDD를 제공합니다.Harbor에서는, 1개의 애플리케이션으로 복수의 RDD 를 사용할 수 있습니다.또, 다른 RDD 를 조합하는 것으로, 새로운 논리 RDD 를 정의할 수 있습니다.RDD 아키텍처는 상속을 허용하기 때문에 특정 RDD가 다른 기존 RDD의 기능을 확장할 수 있습니다.RDDSQL, RDDIX, RMDBFCDX, Advantage Database Server, Mediator 등의 서드파티제 RDD는 RDD 아키텍처 기능의 일부를 나타냅니다.DBFNTX 구현은 DBFCDX 및 RDDIX와 거의 동일한 기능을 가지고 있습니다. NETIO 및 LetoDB는[2] TCP 프로토콜을 통해 원격 액세스를 제공합니다.
Harbor는 OOP 구문을 통한 ODBC 지원 및 OLE를 통한 ADO 지원도 제공합니다.MySQL, PostgreSQL, SQLite, Firebird, Oracle은 Harbour가 연결할 수 있는 데이터베이스의 예입니다.
xBase 테크놀로지는 RDBMS 소프트웨어와 혼동되는 경우가 많습니다.이는 사실이지만 xBase는 단순한 데이터베이스 시스템이 아닙니다.이는 DBF만을 사용하는 xBase 언어로는 실제 RDBMS의 완전한 개념을 제공할 수 없기 때문입니다.
프로그래밍 철학
자바가 한 번 쓰고 어디서나 실행되도록 되어 있는 것과 달리 하버는 한 번 쓰고 어디서나 컴파일하는 것을 목표로 하고 있다.위의 모든 운영체제에서 동일한 컴파일러를 사용할 수 있으므로 운영체제 의존기능을 사용하는 경우를 제외하고 다른 플랫폼용으로 동일한 제품을 생성하기 위해 재코딩할 필요가 없습니다.크로스 컴파일은 MinGW에서 지원됩니다.Microsoft Windows에서 Harbor는 Clipper에 비해 안정성은 높지만 문서화는 잘 되어 있지 않지만 멀티 플랫폼 기능을 갖추고 있으며 보다 투명하고 커스터마이즈 가능하며 USB 플래시 드라이브에서 실행할 수 있습니다.
Linux 및 Windows Mobile에서는 거의 적응하지 않고 Harbour를 사용하여 클리퍼 소스 코드를 컴파일할 수 있습니다.원래 Xbase++, FlagShip, FoxPro, xHarbour 및 기타 방언에서 실행되도록 작성된 대부분의 소프트웨어는 약간의 개작과 함께 하버를 사용하여 컴파일할 수 있습니다.2010년에는 다른 xBase 사투리로부터의 이행을 용이하게 하기 위한 많은 노력이 행해지고 있습니다.
Harbor는 GCC, MinGW, Clang, ICC, Microsoft Visual C++(6.0+), Borland C++, Watcom C, Pelles C 및 Sun Studio 등의 컴파일러를 사용할 수 있습니다.
Harbor는 콘솔 드라이버를 포함한 여러 그래픽 터미널 에뮬레이션과 GTWvt, GTWvg 등의 하이브리드 콘솔/GUI를 사용할 수 있습니다.
Harbor는 외부 GUI(예: HBQt, HWGUI, MiniGUI(Qt 및 QtControls[3] 기반 최신 버전) 및 상용 GUI(예: FiveWin, Xailer)를 지원합니다.HBQt는 Qt에 바인딩을 제공하는 라이브러리입니다.HBIDE 적용은 HBQt 전위의 샘플입니다.
Harbour는 100% Clipper[4] 호환성이 있으며 OLE, Blat, OpenSSL, FreeImage, GD, hbtip, hbtpathy, PCRE, hbmzip(zlib), hbbz2(bzip2), cURL, 카이로 등 많은 언어 구문 확장을 지원합니다.하버는 활발한 개발 커뮤니티와 광범위한 서드파티 지원을 가지고 있습니다.
모든 xBase 언어를 통해 비즈니스 및 데이터 집약적인 애플리케이션을 구축할 수 있습니다.하버도 예외는 아니다.
매크로 연산자(런타임 컴파일러)
xBase 언어의 가장 강력한 기능 중 하나는 매크로 오퍼레이터 '&'입니다.Harbor의 매크로 연산자 구현은 유효한 Harbor 식의 런타임 컴파일을 허용합니다.이러한 컴파일된 표현식은 VALUE, 즉 할당(rvalue)의 우측으로 사용할 수 있지만 이러한 컴파일된 표현식은 할당의 좌측(lvalue), 즉 개인 변수 또는 공용 변수 또는 데이터베이스 필드를 해결하기 위해 사용할 수 있습니다.
또한 매크로 오퍼레이터는 함수 호출, 할당 완료 또는 인수 목록을 컴파일 및 실행할 수 있으며 매크로의 결과는 컴파일된 응용 프로그램에서 위의 컨텍스트 중 하나를 해결하기 위해 사용될 수 있습니다.즉, 임의의 Harbour 어플리케이션은 실행 시 확장 및 수정하여 추가 코드를 온디맨드로 컴파일 및 실행할 수 있습니다.
최신 매크로 컴파일러는 컴파일 전 처리할 코드를 포함하여 유효한 하버 코드를 컴파일할 수 있습니다.
구문:
& ( ... )
식 '...'의 텍스트 값이 컴파일되고 컴파일된 코드 실행에 따른 값이 결과입니다.
& SomeId
는 &(SomeId)의 줄임말입니다.
&SomeId.postfix
는 & ( SomeId + "postfix" )의 줄임말입니다.
객체 지향 프로그래밍
OOP 스타일의 프로그래밍은 특정 라이브러리나 특정 인터페이스보다 광범위한 문제이지만 OOP 프로그래밍은 많은 클리퍼 프로그래머들이 기대하는 것입니다.CA-Clipper 5.2 및 특히 5.3에서는 다수의 기본 클래스와 일치하는 OOP 구문이 추가되었습니다.Class(y), FiveWin, Clip4Win 및 TopClass 등의 라이브러리는 추가 OOP 기능을 제공합니다.
Harbor에는 클래스(y) 구문에 기반한 상속을 포함한 클래스를 완전히 지원하는 OOP 확장 기능이 있습니다.Harbour의 OOP 구문은 이전 Clipper 클래스 라이브러리와 매우 유사하므로 최소한의 변경으로 레거시 Clipper 코드를 유지할 수 있습니다.
구문 및 의미론
모든 xBase 언어는 대소문자를 구분하지 않으며 처음 4글자로 작성된 키워드를 선택적으로 받아들일 수 있으므로 Harbour.
내장 데이터형
Harbor에는 Nil, String, Date, Logical, Numeric, Pointer 및 4가지 복잡한 스칼라 유형이 있습니다.어레이, 오브젝트, 코드 블록 및 해시.스칼라에는 문자열, 숫자 또는 다른 유형에 대한 참조와 같은 단일 값이 포함됩니다.어레이는 1부터 시작하는 숫자로 색인화된 스칼라 또는 복합 유형의 순서 목록입니다.해시 또는 연관 배열은 연관된 키로 인덱싱된 모든 유형 값의 정렬되지 않은 모음으로, 스칼라 또는 복합 유형일 수 있습니다.
스칼라 타입의 리터럴(스태틱) 표현:
- 없음:
NIL
- 문자열:
"hello", 'hello', [hello]
- 날짜:
0d20100405
- 논리:
.T., .F.
- 숫자:
1, 1.1, −1, 0xFF
복합 유형은 리터럴 값으로 표시될 수도 있습니다.
- 어레이:
{ "String", 1, { "Nested Array" }, .T., FunctionCall(), @FunctionPointer() }
- 코드 블록:
{ Arg1, ArgN Arg1 := ArgN + OuterVar + FunctionCall() }
- 해시:
{ "Name" => "John", 1 => "Numeric key", "Name2" => { "Nested" => "Hash" } }
해시는 다른 해시를 포함한 모든 유형을 모든 요소의 키로 사용할 수 있습니다.해시 및 배열에는 네스트 배열을 포함한 모든 멤버의 값 및 해시를 포함할 수 있습니다.
코드 블록에는 정의된 프로시저/함수 > 메서드의 변수에 대한 참조가 있을 수 있습니다.이러한 코드 블록은 값 또는 전달된 인수를 통해 반환될 수 있습니다.참조에 따르면, 이 경우 코드 블록은 정의된 루틴과 코드 블록이 참조하는 모든 변수가 AJECTED 변수가 됩니다.
분리된 변수는 해당 변수를 참조하는 코드 블록이 존재하는 한 해당 값을 유지합니다.이러한 값은 동일한 변수에 액세스할 수 있는 다른 모든 코드 블록과 공유됩니다.코드 블록이 포함된 루틴보다 오래 지속되지 않고 정의된 루틴의 수명 내에 평가될 경우, 코드 블록의 평가에 의한 분리 변수에 대한 변경은 상위 루틴으로 반영됩니다.
코드 블록은 Eval(BlockExp) 함수를 사용하여 몇 번이라도 평가할 수 있습니다.
변수
모든 유형을 명명된 변수에 할당할 수 있습니다.이름 있는 변수 식별자는 1 ~63자의 ASCII 문자로 시작합니다.[A-Z _]
그리고 캐릭터로 구성되어 있다.[A-Z 0–9 _]
최대 63글자입니다.명명된 변수는 대소문자를 구분하지 않습니다.
변수에는 다음 범위 중 하나가 있습니다.
- 로컬: 선언한 루틴 내에서만 볼 수 있습니다.루틴 종료 시 값이 손실됩니다.
- 정적: 선언한 루틴 내에서만 표시됩니다.값은 루틴의 후속 호출을 위해 유지됩니다.절차/함수/방법이 정의되기 전에 STATIC 변수가 선언되고 모듈 스코프가 있으며 동일한 소스 파일 내에서 정의된 루틴 내에서 볼 수 있는 경우 응용 프로그램 수명 동안 지속 시간이 유지됩니다.
- 프라이빗: 선언한 루틴과 해당 루틴에 의해 호출된 모든 루틴에 표시됩니다.
- PUBLIC: 동일한 응용 프로그램의 모든 루틴에 표시됩니다.
LOCAL 및 STATIC은 컴파일 시 해결되므로 런타임 기호 테이블을 통해 액세스하는 동적 엔티티인 PRIVATE 및 PUBLIC 변수보다 훨씬 빠릅니다.같은 이유로 LOCAL 변수와 STATIC 변수는 매크로 컴파일러에 노출되지 않으며 참조를 시도하는 매크로 코드는 런타임 오류를 생성합니다.
PRIVATE 변수와 PUBLIC 변수의 동적인 특성으로 인해 런타임에 생성 및 파기할 수 있으며 런타임 매크로를 통해 액세스 및 수정할 수 있으며, 즉석에서 생성된 Codeblocks에 의해 액세스 및 수정이 가능합니다.
제어 구조
기본 제어 구조에는 모든 표준 dBase 및 Clipper 제어 구조뿐만 아니라 C 또는 Java 프로그래밍 언어에서 영감을 받은 추가 구조도 포함됩니다.
루프
[DO] WHIT ConditionExp...[루프] [종료] 종료 [DO]
Var : = InitExp to EndExp [STEP StepExp]...[루프] [종료] 다음
각 Var IN CollectionExp에 대해...[Var:_enumIndex()][LOOP] [EXIT] 다음
- ...는 여러 Harbour 문의 시퀀스 중 하나이며, 각 괄호입니다.
[]
는 옵션의 구문을 나타냅니다. - Var:_enumIndex()를 옵션으로 사용하여 현재 반복 인덱스(1 기반)를 가져올 수 있습니다.
- LOUP 문은 폐쇄 루프 구조의 현재 반복을 재시작합니다.폐쇄 루프가 FOR 또는 FOR ROUP인 경우 반복기를 증가시켜 루프의 다음 반복으로 이동합니다.
- EXIT 문은 둘러싸인 루프 구조의 실행을 즉시 종료합니다.
- NEXT 문은 제어 구조를 닫고 루프 구조의 다음 반복으로 이동합니다.
FOR 문에서는 첫 번째 루프 반복 전에 할당식이 평가됩니다.TO 표현식은 각 반복 전에 평가되고 제어 변수의 값과 비교되며, 제어 변수의 숫자 값보다 큰 수치로 평가될 경우 루프가 종료됩니다.옵션의 STEP 식은 반복 후 다음 반복 실행 여부를 결정하기 전에 평가됩니다.
FOR EACH에서 Var 변수는 수집 값에서 각 요소의 값(scalar 또는 complex)을 가집니다.컬렉션 표현식은 배열(모든 유형의 조합), 해시 테이블 또는 개체 유형일 수 있습니다.
IF문
IF CondExp...[ELSEIF] CondExp...[ELSE]...종료[만일]
...는 0 이상의 문을 나타냅니다.
조건식은 논리값으로 평가해야 합니다.
SWITCH 문
Harbor는 스위치()의 C 구현에서 영감을 얻은 SWITCH 구성을 지원합니다.
SWITCH SwitchExp CASE LiteralExp...[EXIT] [CASE Literal Exp]...[종료] [그렇지 않으면]...종료[스위치]
- LiteralExp는 컴파일된 시간 해결 가능한 숫자 표현식이어야 하며 이러한 연산자가 컴파일 시간 정적 값을 포함하는 한 연산자를 포함할 수 있습니다.
- EXIT 옵션의 스테이트먼트는 C 스테이트먼트의 브레이크와 동등합니다.존재하는 경우, EXEC에 의해 SWITCH 구조의 실행은 종료됩니다.IT 스테이트먼트에 도달하지 않으면 다음 CASE 스테이트먼트 아래의 첫 번째 스테이트먼트(폴 스루)로 넘어갑니다.
BEGIN SEQUENCE 문
BEGIN SEQUENCE ... [ BREAK ][ BREAK ( [ Exp ] )회복 [Var ]...종료[시퀀스]
또는 다음과 같이 입력합니다.
BEGIN SEQUENCE ... [ BREAK ][ BREAK ( ) ]END [ SEQUENCE ]
BEGIN SEQUENCE 구조에서는 중첩된 프로시저/함수를 교차하는 경우에도 모든 시퀀스를 적절하게 중단할 수 있습니다.즉, 호출된 프로시저/함수는 BREAK 문 또는 BREAK() 식을 발행하여 네스트된 프로시저/함수의 전개를 각각의 END 문 뒤에 있는 첫 번째 외부 BEGIN SEQUENCE 구조체 또는 RECOVER 구(존재하는 경우)로 되돌릴 수 있습니다.Break 문장은 임의로 모든 유형의 식을 전달할 수 있으며, RECOVER 문에서는 추가 복구 처리를 허용하기 위해 이 식을 받아들일 수 있습니다.
또한 Harbour Error Object는 canDefault, canRetry 및 canSubstitute 속성을 지원합니다.이를 통해 오류 핸들러는 몇 가지 준비를 수행하고 Retry Operation 또는 Resume를 요구하거나 값을 반환하여 오류 상태를 트리거하는 식을 대체할 수 있습니다.
또는 SEQUENCE 구성처럼 작동하는 xhb 라이브러리에서 TRY [CATCH] [FINDLY] 문을 사용할 수 있습니다.
순서/기능
[STATIC] 프로시저 SomeProcedureName [STATIC] 프로시저 SomeProcedureName() [STATIC] 프로시저 SomeProcedureName (Param1 [, ParamSN])
INIT 프로시저 Some Procedure Name 종료 프로시저 Some Procedure Name
[STATIC] FUNCTION SomeProcedureName [STATIC] FUNCTION SomeProcedureName() [STATIC] FUNCTION SomeProcedureName (Param1 [, ParamSN])
하버의 절차/기능은 키워드로 지정할 수 있습니다. PROCEDURE
, 또는FUNCTION
. 명명 규칙은 변수 규칙과 동일합니다(최대 63자까지 대소문자를 구분하지 않음).절차와 기능은 모두 정의된 모듈의 범위로 사용을 제한하기 위해 스코프 한정자 STATIC에 의해 검증될 수 있습니다.
INIT 또는 EXIT 옵션의 한정자는, 애플리케이션 기동 순서를 호출하기 직전 또는 애플리케이션을 종료한 직후에 자동적으로 기동하도록 플래그를 설정합니다.프로시저/함수에 전달된 파라미터는 로컬 변수로 서브루틴에 표시되며 참조를 포함한 모든 유형을 받아들일 수 있습니다.
인수 변수에 대한 변경은 @ 프레픽스를 사용하여 BY REFERENCE를 명시적으로 전달하지 않는 한 호출 절차/함수/메서드에 의해 전달된 각 변수에 반영되지 않습니다.
PROCEDOR에는 반환값이 없습니다.Expression 컨텍스트에서 사용하면 NIL 값이 생성됩니다.
함수는 RETURN 스테이트먼트를 사용하여 정의 본문 중 어디에 있든 모든 유형을 반환할 수 있습니다.
프로시저 정의와 함수 호출의 예를 다음에 나타냅니다.
x : = 큐브 ( 2 ) FUNTION 큐브 ( n ) RETURN N ** 3
샘플코드
일반적인 "hello world" 프로그램은 다음과 같습니다.
"안녕, 세상아!"
또는 다음 중 하나를 선택합니다.
QOut ("Hello, world!")
또는 다음 중 하나를 선택합니다.
Alert ("Hello, world!")
또는 명시적 절차로 둘러싸인 경우:
프로시저 메인()? "안녕하세요, 월드!" 리턴
OOP의 예
주요 절차:
#http "hbclass.ch" PROCEDURE Main() LOCAL oPerson CLS oPerson : = Person() :신규 ("Dave") o 사용자:눈:= "잘못된" o 사람:눈:= "파란색" 경고(oPerson:설명() 리턴
클래스 정의:
CREATE CLASS Person VAR Name INIT " MEADORNE New ( cName ) MEADORDescript ( ) MEADORYES INLINE : : : pvtEEYES ANSIGH EYESS ( x ) INLINE iif ( HB _ ISTRINE ( x )AND. x $ "Blue, Brown, Green", ::pvtEyes := x, Alert("Invalid value") ) PROTECTED: VAR pvtEyes ENDCLASS // 일반 방법 정의 MATDORY New(cName) 클래스 사람:: 이름:= cName Self MATDESCLASS 설명() 로컬 사람 설명()t." ELSE cDescription : = "My name is : " + : Name + " ; " ENDIF IF ! Empty ( : Eyes ) cDescription + = " my ey eyes' color is : " + : : Eyes ENDIF RETURN cDescription"
도구들
- hbmk2 – 제조사와 같은 도구 구축
- hbrun : 하버의 셸 인터프리터.매크로 컴파일에서는 컴파일 중에 유효한 하버 코드를 실행할 수 있습니다.
- hbformat – 정의된 규칙에 따라 Harbour 또는 다른 방언에 작성된 소스 코드를 포맷합니다.
- hbpp – 프리프로세서C 언어 프리프로세서에서 볼 수 있는 일반적인 문제를 회피하는 강력한 도구
- hbi18n –어플리케이션 텍스트 현지화 도구
- hbdoc – Harbour 관련 문서를 만듭니다.
모든 공구는 멀티플랫폼입니다.
발전
오늘날 항구 개발은 Viktor Szakatts가 Przemyswaw Czerpak과 협력하여 주도하고 있으며, 이 또한 핵심 언어와 보조 구성 요소의 많은 구성요소에 기여하고 있습니다.HBIDE와 다른 성분들, 특히 HBQt는 Pritpal Bedi에 의해 개발되었습니다.개발 커뮤니티의 다른 구성원은 GitHub 소스 [5]저장소에 변경 내용을 보냅니다.2015년 현재 하버 개발은 활발하고 활기차다.
xHarbour 비교
xHarbour는 초기 하버 프로젝트의 분기점이다[6].xHarbour는 언어로 새로운 기능을 구현하기 위해 보다 적극적인 접근법을 취하지만, Harbour는 가장 먼저 Clipper 동작의 정확한 복제를 목표로 하고 다음으로 새로운 기능과 확장 기능을 2차 고려 사항으로 구현하기 위해 보다 보수적인 접근법을 취합니다.또한 Harbour는 다양한 운영 체제에서 지원되지만 xHarbour는 MS Windows 및 Linux 32비트만 지원합니다.
Harbor 개발자들은 모든 숨겨진 동작을 Clipper 언어로 문서화하고 호환성을 유지하기 위해 Clipper로 컴파일된 동일한 코드와 함께 Harbor 컴파일된 코드를 테스트하려고 시도했습니다.
Harbor 개발자는 Clipper의 호환성을 해치는 언어의 확장을 명시적으로 거부합니다.새로운 Harbour 아키텍처가 코어 컴파일러에서 확장을 허용하기 때문에 이러한 거부 사항은 최근에 완화되었습니다.
Harbour와 xHarbour에서 구현된 확장의 자세한 비교는 GitHub에 [7]있는 프로젝트의 소스 저장소에서 찾을 수 있습니다.
GUI 라이브러리 및 도구
- hbide – 항구 개발과 다양한 xBase 사투리를 지원하는 통합 개발 환경
- PTSource IDE – 통합 개발 환경에는 하버가 포함되어 있습니다.
- HwGui – Harbour용 오픈소스 크로스 플랫폼 GUI 라이브러리
- HMG – 무료/오픈 소스 xBase Win32/Harbour용 GUI 개발 시스템
- MiniGUI[8] – 무료 / 오픈소스 xBase Win32 / GUI 개발 시스템 (HMG와 Harbour 양쪽의 포크(소프트웨어 개발))
- oHG – 객체 지향 Harbor GUI – HMG의 "클래스 기반 및 oop 프로그래밍" 포크
- Marinas-GUI - 하버용 멀티플랫폼 QT 기반 GUI 개발 패키지.Marinas-GUI는 선택한 타깃 플랫폼(IDE, 버전 제어, 하버/C 컴파일러, 라이브러리 등)의 완전한 설치 패키지로 다운로드됩니다.기본적으로 설치 및 코딩과 컴파일을 시작합니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "Harbour". Retrieved 3 September 2020.
- ^ "LetoDB". Sourceforge.net. Retrieved 9 December 2013.
- ^ "QtContribs - Harbour Qt Projects". SourceForge.
- ^ "Official Harbour page". The Harbour Project. Retrieved 9 December 2013.
- ^ "harbour 路 GitHub". Github.com. Retrieved 9 December 2013.
- ^ "About xHarbour". Xharbour.org. Retrieved 9 December 2013.
- ^ "xhb-diff.txt". Retrieved 9 December 2013.
- ^ vailtom (17 August 2009). "Harbour MiniGUI Extended Edition. Free Communications software downloads at". Sourceforge.net. Retrieved 9 December 2013.
외부 링크
- 공식 웹사이트
- Oasis Clipper, FoxPro 및 Xbase+ 커뮤니티 저장소
- HBide
- 항만 개발자 메일링 리스트
- 항만 사용자 메일링 리스트
- 광범위한 항구 문서, 라이브러리, 도구 사이트
- 하버 위키 (하버 함수 사전)