2010-01-24 10 views

回答

8

這個想法原來是Roberto Ierusalimschy和Lua團隊的其他成員。在2003年的MIT輕量級語言研討會上,我聽羅伯託講過這個話題,在這次演講中,他討論了之前的工作,並且令人信服地爭辯說這個想法是新的。我不知道其他語言是否已經複製過。

最初的Awk比Lua的語言模型更受限制;數組或字符串都可以用作數組中的鍵,但是數組本身並不是第一類值:數組必須有名稱,並且數組不能用作數組中的鍵。

關於實現,我檢查了由Brian Kernighan維護的原始Awk的源代碼,並且Awk的實現使用了散列表,而不是Lua的混合數組/表結構。區別非常重要,因爲在Lua中,當一個表與連續的整數鍵一起使用時,空間開銷與C數組相同。原始Awk爲而不是

我沒有打算研究awk的所有後來的實現,例如,Gnu Awk,mawk等等。

2

我能想到的最接近的是使用Javascript - 創建一個數組new Array(),然後或者是通過編號或字符串值進行索引。由於性能方面的原因,一些Javascript實現選擇使用兩個數組,因爲您鏈接到的Lua文檔中提到的原因。

4

編輯:這並沒有回答這個問題,這是關於實施。

AWK也做到了。

它interesing某些語言如何混爲一談是在其他國家不同的操作:

  • 列表索引 - a[10]
  • 關聯索引 - a['foo']
  • 對象字段訪問 - a.foo
  • 函數/方法調用 - a('foo')/a.foo()

非常不完整的例子:

  • Perl是罕見的語言,其中連續/關聯索引有單獨的語法 - a[10]/a{'foo'}。 AFAIK中,對象字段映射到其他操作之一,具體取決於該類的實現者感覺如何使用。

  • 在Python中,所有4個都是不同的;順序/關聯索引使用相同的語法,但單獨的數據類型針對它們進行了優化。

  • 在Ruby中,對象字段是沒有參數的方法 - a.foo

  • 在JavaScript中,對象字段a.foo是用於關聯索引的語法糖a['foo']

  • 在Lua和AWK中,關聯數組也用於順序索引 - a[10]

  • Arc,順序和關聯索引看起來像函數調用 - (a 10)/(a "foo"),我覺得a.foo是語法糖這也太(?)。

+0

Fortress和Clojure還將地圖作爲它們的鍵和數組的函數作爲其索引的函數。畢竟,他們*是*。 – 2010-01-25 04:30:53

+0

問題是關於實現,而不是語言模型。原來的awk,仍然由Brian Kernighan維護,使用一個哈希表。 – 2010-01-26 01:53:59

+0

你是對的,我完全錯過了印記!不能downvote自己,所以+1給你的答案。 – 2010-01-27 17:23:24

0

ArrayWithHash是在C++中快速實現array-hashtable混合。

由於C++是一種靜態類型語言,ArrayWithHash中只允許使用整數鍵(無法插入字符串或指針鍵)。換句話說,它就像一個具有大型索引散列表備份的數組。它也使用不同的哈希表實現,這比Lua表實現具有更低的內存效率。