Falcon

Falcon 程式語言（The Falcon Programming Language），又稱 Falcon P.L.、Falconpl 或 Falcon，是一個開源、多正規化程式語言，其設計和推廣由 Giancarlo Niccolai 領導。

歷史

Haste 於 2002 年編寫一個小型專案，用以實現一小型虛擬機器，該專案很快的發展成 Falcon 語言。2008 年，此語言以開源專案的方式成為 Ubuntu 的附加軟體，並且被包含在 Kross。

核心

不同於關注於一個程式設計風格或正規化（paradigm），Falcon 在一個簡單的框架（framework）裡融合了幾種不同的風格。在實現級別上，Falcon 是「服務概念」驅動，當不作為一個單一的工具被使用時指令碼引擎被看做一個服務指令碼，模組和內嵌的應用。

Hello Falcon

儘管有各種形式的基本 I/O，一個 "hello world"（全世界朋友你好！）例子使用 fast print (快速列印):

> "Hello World!"

Unicode 支援，下面是一個國際化例子的介紹：

// International class; name and street

class 國際 (なまえ，Straße)

//set class name and street address

नाम = なまえ

شَارِع = Straße

// Say who am I!

function 言え！>@"I am $(self.नाम) from",self.شَارِع

end

end

//all the people of the world!

民族 = 國際 ("高田 Friederich", "臺灣"),

國際 ("Smith Σωκράτης", "Cantù"),

國際 ("Stanisław Lec", "południow")

for garçon in 民族：garçon. 言え！

3.1 資料型別

Nil - The nil 關鍵字，一個空值.

Integer - 一個 64 位整數值.

Numeric - 一個 IEEE 64 位浮點值.

Range - 一組上限，下限和步長.

MemBuf - Raw 記憶體緩衝，每一個地址是一個無符號的 1,2,3, 或者 4 位元組整數.

Function - 函式（可呼叫實體）.

String - 不定長的 UNICODE 字元序列 (但是它們能作為位元組緩衝被使用).

Array - 不定長的元素序列.

Dictionary - 不定長有序鍵 / 值對的集合；鍵能是任何 Falcon 元素.

Object - 來源於類的例項或者單一的非類物件.

Class - 能建立例項的類，實體.

Method - 例項的不變部分，使用函式形式關聯.

正規化

Falcon 融合六種主流程式設計正規化。

過程式（procedural）
函式式（functional）
面向物件（object oriented）
面向原型物件（prototype OOP）
面向訊息（message oriented）
表格化程式設計（tabular programming）

4.1 過程式

程序式程式設計透過典型的函式宣告和呼叫被支援。每一個函式支援隱式變數引數呼叫和佔位引數（Positional Parameters）命名引數（Named Parameters）。提供了一套過程式風格的語句（如 for, while, if, switch 語句）。

下面，一個完整的過程式程式，突出一部分在 Falcon 裡用來減少一些程式設計任務中固有的 pre-body-post（前置 - 本體 - 後置）處理的困擾的設計理念

function sayList (saying)

for elem in saying

>> elem

formiddle: >> " "

forlast: > "!"

end

end

sayList (List ("Have", "a", "nice", "day") )

4.2 函式式

Falcon 有個稱為 Sigma-reductor 的求值引擎，它允許程式人員編寫純函式式程式，看起來和用 Lisp 沒什麼不同。混合式程式設計風格允許在函式式語句序列使用不同的正規化（例如 OOP 或者過程化），或者在不同的過程化方式期間中使用函式式求值。

函式式語句序列被描述為標準語言陣列；交叉不同的求值和在 Sigma-reduction 求值方式期間這都意味著語句序列能被程式本身建立，審查和被動態修改。下面的例子在列表迴圈呼叫 late binding 修改一個指定變數的引用。

pnext = printl, '"', &value, '"'

dolist (function (p); seq.value = p; eval (seq); end,

"Have", "a", "nice", "day" )

如果他們第一個成員變數是一個自身可呼叫元素，標準陣列作為函式被呼叫，如下面的例子。

printl "Prompt>"("Real data to print")

同一個級別函式式語句序列（如在上面例子）能被作為儲存的呼叫來按照定義處理，並且一次性分配給一個變數，它們在語意上等同於一個函式符號。

函式式正規化包含一個 out of band 元素標記。元素能接收一個透過語言運算子和函式被測試的 oob 特徵標記，並且當在函式式語句序列中移動時指明一個特殊含義的值。例如，很多函式式迴圈，如 floop 和 times，能重新開始執行迴圈，或者被從包含的函式返回的無論 1 或 0 的 out of band 中斷。map 函式透過一個對映函式轉換一個數組中的所有值，如果它是一個 nilout of band 將忽略返回值（丟棄它）；透過這個方法可以在某處執行對映和過濾。

4.3 面向物件

透過類，一個繼承模型，靜態類成員，屬性初始化和例項構造器，Falcon 程式語言提供一個 OOP 正規化。在至多一個潛在的父類是被反射成原生資料的條件下支援多繼承。訪問基類成員被支援。

例項的結構是固定和不變的，但是由於 Falcon 函式式特質，函式看上去就是一種特定種類的資料，它能動態設定例項成員為無格式資料或者函式（變成他們的方法）。

Falcon 支援單一物件，可能是 classless 或者父類派生，在虛擬機器執行主指令碼之前例項化和被準備。在可能涉及程式模組中一個在其他的物件時，例項消除順序由 Falcon 連結器追蹤以確保單一物件的適當的初始化。

透過函式式語句序列類例項能被建立，如例項化的一個類在語意上等於呼叫它的符號，因此，對一個第一個元素是一個類的函式式語句序列求值，它有建立一個例項的效果。

Falcon 的 OOP 模型完整支援運算子過載，它允許建立一個針對數學和邏輯的擁有指定的行為運算子的類。

4.4 面向原型物件

原型 OOP 比 OOP 更簡單，但它去掉類的概念。例項全是 classless，他們的結構能被動態改變。Falcon 語言字典（排列好的鍵 / 值集合）能包含函式，那時字典能被祝福，通知語言他們作為 classless 例項被處理，並且使用點訪問符使他們的值作為屬性或方法被處理。在下面的例子，一個字典變成一個物件：

dict = bless ('state' => 0, 'incme' = > function ; self.state++; end)

dict.incme > dict.state //will print '1'

簡單地執行繫結的陣列。

array = 1,2,3

array.showMe = function

for item in self

> item

end

end

array.showMe

4.5 面向訊息

當一個訊息被廣播時面向訊息程式設計允許間接呼叫一個或者更多註冊的監聽器。訊息的內容是任意的並且能包含任何語言元素，包括但不限於哪個建立建立例項的類，函式序列或者表。監聽器不是完整接受訊息和執行他們，就是透過有次序的步驟分享在構建中的一個訊息的通用應答。訊息能被廣播和包含一個即時的應答或者能被儲存在環境用來接收和處理更多的後來者（在 Falcon 裡被稱作斷言）。

面向訊息程式設計擁有一個在虛擬機器裡的直接介面，關於擴充套件原生模組和嵌入應用能相互作用。例如，一個多執行緒應用可能拋給虛擬機器來自不同的執行緒訊息，為了在指令碼級別上序列化處理和稍後廣播直接來自指令碼的處理解決方案。

4.6 表格化

表格式程式設計能看做是一種 OOP 程式設計的特殊擴充套件，一個類透過一個表格被描述，他們的列是屬性，每一行是一個例項。不同於一起保持全部例項，允許每個例項影響父表周圍的行，關於表的修改被動態反射到每個例項。

表格提供一個方法來在有限選擇的集合之間選擇行為，或者混合行為併合並它們，提供模糊邏輯引擎。如每一行，實質上的一個 Falcon 陣列，能包含表中資料和邏輯或者私有邏輯（透過陣列繫結），在表格裡一個透過全域性選擇邏輯選擇的實體能提供專門的處理能力。

特性

隨著多正規化程式設計，Falcon 為程式設計人員呈現多種多樣的特色。

5.1 模板檔案

透過預處理符號或者，Falcon 允許指令碼成為文字文件的一部分，、。儲存為 ".ftd" 的指令碼被作為一個文字檔案來處理並且在遇到其中一個預處理符號之前簡單輸出。下面的.ftd 例子裡包含其中的指令碼被執行：

You called this script with parameters.

FTD 檔案能透過標準 Falcon 指令碼被整合到各式應用，在動態模板（FTD 檔案）中的是表現邏輯，應用邏輯被儲存在 Falcon 模組。

FTD 檔案能被用來驅動動態網站，一些流行的網頁伺服器（當前的 Apache 2），擁有直接分析和執行 ".fal" 和 ".ftd" 指令碼的模組，提供整合到網頁伺服器引擎的一個 API。用 CGI 指令碼也能使用動態 FTD 頁面。

5.2 異常

Falcon 由 raise, try 和 catch 語句支援錯誤處理。raise 語句能丟擲任何 Falcon 元素，包括 Nil，numbers, strings, objects 等等。庫函式和擴充套件模組將通常引發錯誤類的例項，或者派生自他的例項。

catch 語句能捕獲任何型別的元素，一個某種型別（如 string（字串）或 interger（整數）），或者某種類的例項。捕獲的類被按層次組織，所以它能像下面的例子一樣支援更多一般性錯誤處理（TypeError 是一個派生自 Error 類庫）:

try

... code that can raise ...

catch TypeError in error

... if we mixed up types ...

catch Error in error

... another generic error ...

catch StringType in error

... an explicit raise "something" was issued ...

catch in error

... no idea of what has been raised.

end

catch 語句中的 in 子句是可選的（這意味著錯誤可以忽略自身）。

catch 語句模仿 select 語句，能被用一個給出的型別或者類轉向。

5.3 可嵌入執行時

使用可連結執行時庫 libfalcon，Falcon 被設計成可嵌入和可擴充套件其他系統的。

5.4 文件生成器

Falcon 裝載著一個整合的文件系統，叫做 faldoc，是特別設計來提供可維護的文件的 Falcon 基礎庫（是原生 C++ 程式碼或者用 Falcon 編寫的模組）。

5.5 虛擬檔案系統

所有發生在引擎或者虛擬機器（指令碼執行器）等級的 I/O 操作被委派給一箇中央虛擬檔案系統元件（centralized Virtual Filesystem Provider），外部模組或者可嵌入的應用裝置被允許動態註冊。訂閱的虛擬檔案系統抽象 I/O 操作如目錄讀取，建立檔案和開啟流，透過 URI 能在指令碼內部定址。這使得他能從任何 VFS（如網路資源或者壓縮加密的檔案）讀取模組或者開啟資源，透過第三方模組且或透過嵌入引擎的應用程式可以包含特殊的虛擬位置的支援。

5.6 併發支援

在更新到 0.8.x 版本，Threading 模組提供指令碼完整多執行緒。執行緒模型是面向代理（agent oriented），跨執行緒資料必須通過幾種可行共享機制明確地共享。每一個執行緒執行一個不同的虛擬機器，分離的執行發生在其內部任何操作（如垃圾回收）。這允許有效的並行處理和在指令碼開發者控制之外的 0 競爭。

5.7 協同處理

Falcon 支援準併發協同處理。協同處理是指透過虛擬機器在同一時間片或者在空閒時間裡執行程式碼。它們支援一個接近於完整執行緒模組的更輕量級的併發處理，透過不同的協同處理允許程式的全域性資料完全可見。除了每個協同處理的合作，（如在排程讀取之前每個協同處理必須檢查資料可用性）。

5.8 元編譯器

Falcon 編譯器有一個支援宏展開的元編譯器，在一個標準編譯器中元編譯器由 Falcon 虛擬機器驅動；自元編譯器生成的輸出被髮送到語言的語法分析器就像他是原始程式碼的一部分。使用 \ ...\ 退出序列，透過列印他能動態記錄被編譯的程式內容。

\ printl ("printl ( 'Hello world')" ) \

macro 關鍵字提供一個簡單的轉到編譯時超程式設計的語法糖果（candy-grammar）介面。

5.9 原生國際化

用一個字首 'i' 的字串被認為是一個輸出（國際化）字串。在一個模組中透過使用 directive 語句宣告使用的語言，它能指示哪個字串用什麼自然語言編寫，如下面的例子：

directive lang=fr_FR //uses 5 characters ISO language code

> i"Bonjour à tout le monde!"

一個命令列工具 fallc 被用來輸出 'i' 字串到 XML 定義檔案，能被作為模板來支援翻譯到不同的語言。

在讀取模組的時候一個已翻譯的字元表被應用到模組。

特色

完整地支援模組化程式設計，Falcon 裝載著特色（Feathers），標準模組套件。特色（Feathers）模組當前包括：

編譯器 - 反射型編譯器和動態外掛引導器。
配置分析器 - 完成配置檔案分析支援。
MXML - 非常快速和簡潔的迷你 XML 分析器（相容 XML 1.0）。
正則表示式 - PCRE 7.x 相容正則表示式庫介面。
套接字（Socket） - BSD 套接字跨平臺網路支援。
ZLib - 簡潔的壓縮程式介面。

實現

核心 VM 和官方模組，（包括特色模組和社群提供支援的模組）都是用 C++ 編寫。一些非常底層的模組和引擎元素是用 C 和彙編編寫。