使用 Harbour/Harbour 開發應用程式概述
與旨在一次編寫,隨處執行的 Java 不同,Harbour 旨在實現 **一次編寫,隨處編譯**。由於所有上述作業系統都提供相同的編譯器,因此無需重新編碼即可為不同平臺生成相同的產品,除非使用依賴於作業系統的功能。交叉編譯透過 MinGW32 支援。在 Microsoft Windows 下,Harbour 比 Clipper 更穩定,但文件較少,但具有跨平臺功能,更透明,可定製,並且可以從 USB 快閃記憶體驅動器執行。
在 Linux 和 Windows Mobile 下,Clipper 原始碼可以經過很少的調整,就可以使用 Harbour 編譯。大多數最初編寫用於在 Xbase++、Flagship、FoxPro、xHarbour 和其他方言上執行的軟體都可以透過 Harbour 編譯,只需進行一些調整。到 2010 年,已經做出很多努力來簡化從其他 xBase 方言的過渡。
Harbour 可以使用以下 C 編譯器,包括但不限於:GCC、MinGW、Clang、ICC、Microsoft Visual C++ (6.0+)、Borland C++、Watcom C、Pelles C 和 Sun Studio。
Harbour 可以使用多種圖形終端模擬,包括控制檯驅動程式和混合控制檯/GUI,例如 GTWvt 和 GTWvg。
Harbour 支援外部 GUI,包括免費的(例如 HWGui、MiniGUI 和 Qt)和商業的(例如 FiveWin、Xailer)。HBQt 是一個為 Qt 提供繫結的庫。HBIDE 應用程式包含在官方發行版和 SVN 儲存庫中,是 HBQt 潛力的一個例子。
Harbour 與 Clipper 100% 相容[1],並支援許多語言語法擴充套件,包括大大擴充套件的執行時庫,例如 OLE、Blat、OpenSSL、FreeImage、GD、TIP、Tpathy、PCRE、HbZip(zlib 和 bzip2)、cURL、Cairo、其自身的 CA-Tools 實現和 NanFor 庫,以及許多其他庫。Harbour 擁有一個活躍的開發社群和廣泛的第三方支援。
任何 xBase 語言都提供了一種非常有效的方式來構建業務和資料密集型應用程式。Harbour 也不例外。
xBase 語言最強大的功能之一是 宏 運算子 '&'。Harbour 對宏運算子的實現允許對任何有效的 Harbour 表示式進行執行時編譯。這樣的編譯表示式可以作為 VALUE 使用,即賦值的右側(rvalue),但更有趣的是,這樣的編譯表示式可以用於解析賦值的左側(lvalue),即 PRIVATE 或 PUBLIC 變數,或資料庫 FIELD。
此外,宏運算子可以編譯和執行函式呼叫,完成賦值,甚至執行引數列表,並且宏的結果可以用於解析編譯應用程式中的任何上述上下文。換句話說,任何 Harbour 應用程式都可以擴充套件並在執行時進行修改,以按需編譯和執行額外的程式碼。
最新的宏編譯器可以編譯任何有效的 Harbour 程式碼,包括在編譯之前進行預處理的程式碼。
語法
&( ... )
表示式的文字值 '...' 將被編譯,並且執行編譯程式碼後產生的值是結果。
&SomeId
是 &( SomeId ) 的簡寫形式。
&SomeId.postfix
是 &( SomeId + "postfix" ) 的簡寫形式。
以 OOP 風格程式設計是一個位元定庫或特定介面更廣泛的問題,但 OOP 程式設計是許多 Clipper 程式設計師所期望的。CA-Clipper 5.2 尤其是 5.3 添加了許多基本類和匹配的 OOP 語法。諸如 CLASSy、Fivewin、Clip4Win 和 TopClass 等庫提供了額外的 OOP 功能。
Harbour 具有 OOP 擴充套件,全面支援基於 CLASSy 語法的類,包括繼承。Harbour 中的 OOP 語法與早期 Clipper 類庫非常相似,因此可以透過最少的更改來維護遺留的 Clipper 程式碼。
與所有 xBase 語言一樣,Harbour 不區分大小寫,並且可以選擇接受僅用前四個字元書寫的關鍵字。
Harbour 有 6 種標量型別:Nil、字串、日期、邏輯、數字、指標,以及 4 種複雜型別:陣列、物件、程式碼塊 和 雜湊。標量儲存單個值,例如字串、數字或對任何其他型別的引用。陣列是有序的標量或複雜型別列表,透過數字索引,從 1 開始。雜湊或 關聯陣列 是任何型別值的無序集合,透過其關聯的鍵索引,該鍵可以是任何標量或複雜型別。
標量型別的字面量(靜態)表示
- Nil:NIL
- 字串:"hello",'hello',[hello]
- 日期:0d20100405
- 邏輯:.T.,.F.
- 數字:1,1.1,-1,0xFF
複雜型別也可以表示為字面量值
- 陣列:{ "字串",1,{ "巢狀陣列" },.T.,FunctionCall(),@FunctionPointer() }
- 程式碼塊:{ |Arg1,ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
- 雜湊:{ "姓名" => "John",1 => "數字鍵",{ "巢狀" => "雜湊" } }
雜湊可以使用 *任何* 型別,包括其他雜湊作為任何元素的 *鍵*。雜湊和陣列可以包含 *任何* 型別作為任何成員的 *值*,包括巢狀陣列和雜湊。
程式碼塊可以引用定義它的過程/函式 > 方法的變數。這樣的程式碼塊可以作為值返回,或者透過引用傳遞的引數,在這種情況下,程式碼塊將“超出”定義它的例程,並且它引用的任何變數都將成為 *分離的* 變數。
分離的變數將保留其值,只要引用它們的程式碼塊仍然存在。這些值將與任何其他可能訪問相同變數的程式碼塊共享。如果程式碼塊沒有超出其包含的例程,並且將在定義它的例程的生命週期內進行評估,則透過評估 *分離的變數*(s) 的更改將反映回其父例程。
程式碼塊可以透過 Eval( *BlockExp* ) 函式進行多次評估。
所有型別都可以分配給命名變數。命名變數識別符號長度為 1 到 63 個字元,以 [A-Z|_] 開頭,並且包含 [A-Z|0-9|_] 字元,最多 63 個字元。命名變數不區分大小寫。
變數具有以下範圍之一
- LOCAL:僅在宣告它的例程內可見。值在例程退出時丟失。
- STATIC:僅在宣告它的例程內可見。該值會保留以供後續呼叫該例程。如果在定義任何過程/函式/方法之前聲明瞭 STATIC 變數,則它具有模組範圍,並且在該同一原始檔中定義的任何例程內可見,它將為應用程式生命週期持續時間保持其生命週期。
- PRIVATE:在宣告它的例程及其呼叫的例程內可見。
- PUBLIC:對同一應用程式中的所有例程可見。
LOCAL 和 STATIC 在編譯時解析,因此比透過執行時符號表訪問的動態實體PRIVATE 和 PUBLIC 變數快得多。出於同樣的原因,LOCAL 和 STATIC 變數不會暴露給宏編譯器,任何嘗試引用它們的宏程式碼都會生成執行時錯誤。
由於PRIVATE 和 PUBLIC 變數的動態特性,它們可以在執行時建立和銷燬,可以透過執行時宏訪問和修改,並且可以透過動態建立的程式碼塊訪問和修改。