Io (程式語言)
編程範型 | 面向對象、基於原型、同像性 |
---|---|
設計者 | Steve Dekorte |
實作者 | Steve Dekorte, Jonathan Wright, Jeremy Tregunna |
面市時間 | 2002年 |
型態系統 | 動態, 強類型 |
網站 | iolanguage |
主要實作產品 | |
Io, Io.NET | |
啟發語言 | |
Smalltalk, NewtonScript, Self, Lua, LISP, Act1 | |
影響語言 | |
Ioke[1], Potion |
Io語言是一門計算機高級編程語言,其發展歷史並不長,2002年3月7日由Steve Dekorte研發出來。 Io語言因為沒有關鍵字,因而很容易進行擴展,並很靈活。
特點
Io語言並非主流編程語言,但其學習價值和啟發價值都很高。這門語言吸收了LISP、Lua、Smalltalk等語言的特點。
Io語言是純面向對象的原型繼承語言,它的創造過程是綜合了Smalltalk、Self、NewtonScript、Act1、LISP和Lua等語言的特點[3];
Io語言主要吸取了這些語言的如下特點:
- Smalltalk,所有的變量均為對象、所有的消息都是動態的。
- Self,基於原型的面向對象設計。
- NewtonScript,差異化繼承。
- Act1,並發行為和特徵。
- LISP,代碼是運行時間可內省/可修改的樹。
- Lua,小巧且具有可嵌入能力。
歷史
Io語言大約是由Steve Dekorte在2002年3月7日創造的,創造初衷則是Steve Dekorte為了幫助他的朋友Dru Nelson,改造另一門稱作「Cel」的語言,Steve Dekorte發現自己對編程語言的原理並不是很了解,於是決定寫一個簡單的語言,來幫助自己理解相關的問題[4]。
語法
在它的最簡單形式下,它可以構成自一個單一標識符:
doStuff
假定上述doStuff
是一個方法,它被以零個實際參數來調用,因而不需要顯式的圓括號。
如果doStuff
有實際參數,它可能如下這樣調用:
doStuff(42)
消息
Io是一種消息傳遞語言,因為在Io中所有東西都是一個消息(不包括注釋),每個消息都被發送給一個接收者。上述例子展示的並不完全。要更好的描述這一點,請看下面的例子:
System version
這個例子展示了Io中的消息傳遞,version
消息被發送到System
對象。
運算符
運算符是特殊情況,這裡的語法不像上述例子那樣業已定型。Io的解析器檢視由解釋器定義的一組運算符,並把它們轉譯成方法調用,例如:
1 + 5 * 8 + 1
被轉譯成:
1 + (5 *(8)) +(1)
在Io中所有運算符都是方法,它們不需要顯式圓括號的事實是一種方便。如你所見,這裡仍存在一點運算符優先級,它們同於C運算符優先級。
對象
新對象是通過克隆其他對象來創建的。特別是在Io中,一個新的空對象在創建後,其中只保存了與其父對象的不同之處,這種行為被稱為差別繼承。下面是一個例子:
A := Object clone // 创建一个新的空对象,命名为"A"
方法和塊
在Io語言中有兩種方法來創建匿名函數:方法和塊。這兩種方法除了作用域不同外,幾乎是沒有區別的。塊擁有詞法作用域,方法擁有動態作用域。方法和塊都是高階函數。
示例
Hello, World!
經典的Hello, World!程序:
"Hello, world!" println
非遞歸的階乘
Io語言中一個簡單的非遞歸的階乘方法:
factorial := method(n,
if(n == 0, return 1)
res := 1
Range 1 to(n) foreach(i, res = res * i)
)
由於將res * i
賦值給res
是方法的最後一個操作,這個函數會隱式地返回這個結果,因此不需要顯式地加上一個返回語句。上面這段代碼展示了Range
的用法,而沒有用for()
,後者會更快一些。
引用
- ^ 存档副本. [2023-01-19]. (原始內容存檔於2021-01-30).
- ^ Io Releases. [2020-02-06]. (原始內容存檔於2020-11-24).
- ^ Io Programming Guide. [2013-08-16]. (原始內容存檔於2013-08-06).
- ^ Tate, Bruce. Chapter 3: Io. Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages 1st. Raleigh, North Carolina: Pragmatic Bookshelf. 2010: 60, 72. ISBN 978-1934356593.