Falcon程式語言(英語:The Falcon Programming Language),又稱Falcon P.L.FalconplFalcon,是一個開源、多範式程式語言,其設計和推廣由Giancarlo Niccolai領導。

Falcon
編程範型多重編程範式程序式編程物件導向程式設計, prototype based, 函數程式語言, tabular, message passing
設計者Giancarlo Niccolai
實作者Falcon Committee
釋出時間2003年2月3日
型態系統動態檢查
作業系統跨平台
特許條款GPLv2, FPLLv1.1[1]
副檔名.ftd, .fal
網站falconpl.org
啟發語言
C++, Perl, Lua, Smalltalk, PHP, Lisp, Python, Ruby
影響語言
to be seen

歷史

編輯

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.言え!()

資料類型

編輯
  • 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)

程序式

編輯

程序式編程通過典型的函數聲明和呼叫被支援。每一個函數支援隱式變數參數呼叫和佔位參數(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") )

函數式

編輯

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特徵標記,並且當在函數式陳述式序列中移動時指明一個特殊含義的值。例如,很多函數式迴圈,如flooptimes,能重新開始執行迴圈,或者被從包含的函數返回的無論10的out of band中斷。map函數通過一個對映函數轉換一個陣列中的所有值,如果它是一個nilout of band將忽略返回值(丟棄它);通過這個方法可以在某處執行對映和過濾。

物件導向

編輯

通過類,一個繼承模型,靜態類別成員,屬性初始化和實例構造器,Falcon程式語言提供一個OOP範式。在至多一個潛在的父類別是被反射成原生數據的條件下支援多繼承。訪問基礎類別成員被支援。

實例的結構是固定和不變的,但是由於Falcon函數式特質,函數看上去就是一種特定種類的數據,它能動態設置實例成員為無格式數據或者函數(變成他們的方法)。

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

通過函數式陳述式序列類別實例能被建立,如實例化的一個類在語意上等於呼叫它的符號,因此,對一個第一個元素是一個類的函數式陳述式序列求值,它有建立一個實例的效果。

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

面向原型對象

編輯

原型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()

訊息導向

編輯

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

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

表格化

編輯

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

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

特性

編輯

隨着多範式編程,Falcon為編程人員呈現多種多樣的特色。

模板檔案

編輯

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

  You called this script with <? print( args.len() ) ?> parameters.

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

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

異常

編輯

Falconraise, trycatch陳述式支援錯誤處理。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陳述式,能被用一個給出的類型或者類轉向。

可嵌入執行時

編輯

使用可連結執行時庫libfalconFalcon被設計成可嵌入和可延伸其他系統的。

文件生成器

編輯

Falcon裝載着一個整合的文件系統,叫做faldoc,是特別設計來提供可維護的文件的Falcon基礎庫(是原生C++代碼或者用Falcon編寫的模組)。

虛擬檔案系統

編輯

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

並行支援

編輯

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

協同處理

編輯

Falcon支援准並行協同處理。協同處理是指通過虛擬機器在同一時間片或者在空閒時間裏執行代碼。它們支援一個接近於完整線程模組的更輕量級的並行處理,通過不同的協同處理允許程式的全域數據完全可見。除了每個協同處理的合作,(如在排程讀取之前每個協同處理必須檢查數據可用性)。

元編譯器

編輯

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

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

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

原生國際化

編輯

用一個字首'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和組譯編寫。

可用資源

編輯

Mac OS XMS-Windows系統上Falcon通過安裝程式釋出,構建和安裝是一個清晰的過程,或者在各種開源系統如LinuxOpenSolaris上通過自構建原始碼包。

在後者系統上,Falcon程式語言通常支援各種發行版本並保持更新的,其中有:

在基於Solaris系統的發行版本上通過Blastwave專案和OpenSolaris系統的(英文) [AuroraUX http://en.wikipedia.org/wiki/AuroraUX[永久失效連結]] 發行版本Falcon程式語言是可用的。

參考

編輯

外部連結

編輯