2010-01-24 6 views

risposta

8

Questa idea era originale con Roberto Ierusalimschy e il resto del team Lua.Ho sentito Roberto parlarne al workshop del MIT Lightweight Languages ​​nel 2003, e in questo discorso ha discusso del lavoro precedente e ha sostenuto in modo convincente che l'idea era nuova. Non so se altre lingue lo abbiano copiato da allora.

L'Awk originale ha un modello di linguaggio un po 'più ristretta di Lua; un numero o una stringa può essere utilizzato come una chiave in una matrice, ma array stessi non sono valori di prima classe: un array deve avere un nome, e una matrice non possono essere utilizzati come chiave nell'array.

Riguardo all'implementazione, ho controllato i sorgenti per l'originale Awk come mantenuto da Brian Kernighan, e l'implementazione di Awk utilizza una tabella hash, non la struttura ibrida di matrice/tabella di Lua. La distinzione è importante perché in Lua, quando una tabella viene utilizzata con chiavi intere consecutive, l'overhead dello spazio è lo stesso di un array C. Questo è non true per Awk originale.

non ho preso la briga di indagare su tutte le implementazioni successive di awk, per esempio, Gnu Awk, mawk, e così via.

2

La cosa più vicina che posso pensare è Javascript - si crea un array con new Array(), e poi procedere per indicizzare sia per numero o per valore stringa. Potrebbe essere per ragioni di prestazioni che alcune implementazioni di Javascript scelgono di farlo utilizzando due array, per i motivi indicati nella documentazione Lua a cui sei collegato.

4

MODIFICA: Questo non risponde alla domanda, che riguardava l'implementazione.

AWK anche fatto.

E 'interesing come alcune lingue confondono operazioni che sono diverse in altri:

  • Lista di indicizzazione - a[10]
  • Associative indicizzazione - a['foo']
  • oggetto campo accesso - a.foo
  • Funzione chiamate/Method - a('foo')/a.foo()

esempi incompleti:

  • Perl è il linguaggio raro dove indicizzazione sequenziale/associativo ha sintassi separato - a[10]/a{'foo'}. AFAIK, i campi degli oggetti si associano a una delle altre operazioni, a seconda di come l'implementatore della classe ha ritenuto di utilizzare.

  • In Python, tutti e 4 sono distinti; l'indicizzazione sequenziale/associativa utilizza la stessa sintassi ma i tipi di dati separati sono ottimizzati per loro.

  • In Ruby, i campi oggetto sono metodi senza argomenti - a.foo.

  • In JavaScript, i campi oggetto a.foo sono zucchero di sintassi per l'indicizzazione associativa a['foo'].

  • In Lua e AWK, gli array associativi sono utilizzati anche per l'indicizzazione sequenziale - a[10].

  • In Arc, indicizzazione sequenziale e associativo si presenta come chiamate di funzione - (a 10)/(a "foo"), e penso a.foo è lo zucchero sintassi per questo troppo (?).

+0

Forte e Clojure anche trattano mappe come funzioni delle loro chiavi e array come funzioni dei loro indici. Che, dopo tutto, loro * sono *. –

+0

La domanda riguarda l'implementazione, non il modello linguistico. L'awk originale, mantenuto ancora da Brian Kernighan, usa un hash table. –

+0

Hai ragione, ho completamente mancato il bersaglio! Non posso downvotare me stesso, quindi +1 alla tua risposta. –

0

ArrayWithHash è un'implementazione veloce di ibrido array-hashtable in C++.

Poiché C++ è un linguaggio a tipizzazione statica, solo chiavi intere sono ammessi in ArrayWithHash (nessun modo per inserire la chiave di stringa o un puntatore). In altre parole, è qualcosa di simile a un array con backup di tabelle hash per indici di grandi dimensioni. Inoltre, utilizza un'implementazione diversa della tabella hash che è meno efficiente della memoria rispetto all'implementazione della tabella Lua.