2010-01-24 15 views

Respuesta

8

Esta idea fue original con Roberto Ierusalimschy y el resto del equipo de Lua.Escuché a Roberto dar una conferencia al respecto en el taller de Lenguas Ligeras del MIT en 2003, y en esta charla discutió el trabajo previo y argumentó convincentemente que la idea era nueva. No sé si otros idiomas lo han copiado desde entonces.

El Awk original tiene un modelo de lenguaje algo más restringido que Lua; ya sea un número o una cadena se puede utilizar como una clave en una matriz, pero las matrices en sí no son valores de primera clase: una matriz debe tener un nombre, y una matriz no se puede utilizar como una clave en la matriz.

En cuanto a la implementación, he comprobado las fuentes para el Awk original mantenido por Brian Kernighan, y la implementación de Awk utiliza una tabla hash, no la estructura de tabla/matriz híbrida de Lua. La distinción es importante porque en Lua, cuando se usa una tabla con claves enteras consecutivas, la sobrecarga del espacio es la misma que para una matriz en C. Esto es no verdadero para Awk original.

No me he molestado en investigar todas las implementaciones posteriores de awk, por ejemplo, Gnu Awk, mawk, etc.

2

Lo más cercano que puedo pensar es en Javascript - se crea una matriz con new Array(), y luego proceder al índice ya sea por número o por valor de cadena. Podría ser por razones de rendimiento que algunas implementaciones de Javascript elijan hacerlo usando dos matrices, por los motivos indicados en la documentación de Lua a la que se vinculó.

4

EDITAR: Esto no responde a la pregunta, que fue sobre la implementación.

AWK también lo hizo.

Es interesing cómo algunos idiomas confunden las operaciones que son diferentes en otros:

  • Lista de indexación - a[10]
  • indexación asociativa - a['foo']
  • de acceso a objetos de campo - a.foo
  • Función/Método llama - a('foo')/a.foo()

ejemplos muy incompleta:

  • Perl es el lenguaje raros donde la indexación secuencial/asociativo tiene la sintaxis separada - a[10]/a{'foo'}. AFAIK, los campos de objeto se asignan a una de las otras operaciones, dependiendo de cómo el implementador de la clase haya deseado usar.

  • En Python, los 4 son distintos; la indexación secuencial/asociativa usa la misma sintaxis, pero los tipos de datos separados están optimizados para ellos.

  • En Ruby, los campos de objeto son métodos sin argumentos - a.foo.

  • En JavaScript, los campos de objeto a.foo son sintaxis de azúcar para la indexación asociativa a['foo'].

  • En Lua y AWK, las matrices asociativas también se utilizan para la indexación secuencial - a[10].

  • En Arc, indexación secuencial y asociativa se parece a las llamadas de función - (a 10)/(a "foo"), y creo que es el azúcar a.foo sintaxis para esto también (?).

+0

Fortress y Clojure también tratan los mapas como funciones de sus claves y matrices como funciones de sus índices. Que, después de todo, ellos * son *. –

+0

La pregunta es acerca de la implementación, no del modelo de lenguaje. El awk original, mantenido por Brian Kernighan, usa una tabla hash. –

+0

Tienes razón, ¡me perdí por completo la marca! No puedo rechazar mi voto, así que +1 a tu respuesta. –

0

ArrayWithHash es una implementación rápida de array-hashtable hybrid en C++.

Dado que C++ es un lenguaje estáticamente tipado, solo se permiten las claves enteras en ArrayWithHash (no hay forma de insertar la cadena o la tecla del puntero). En otras palabras, es algo así como una matriz con copia de seguridad de la tabla hash para índices grandes. También usa una implementación de tabla hash diferente que es menos eficiente en la memoria que la implementación de la tabla Lua.

Cuestiones relacionadas