En Python, y muy probablemente en muchos otros lenguajes de programación, se pueden encontrar estructuras de datos comunes como una parte integrada del lenguaje central con su propia sintaxis dedicada. Si dejamos de lado la sintaxis de lista integrada de LISP, no puedo pensar en ningún otro lenguaje que conozca que proporcione algún tipo de estructura de datos sobre la matriz como parte integrada de su sintaxis, aunque todos ellos (pero C, supongo) parecen proporcionarlos en la biblioteca estándar.
Desde la perspectiva del diseño del lenguaje, ¿cuáles son sus opiniones sobre tener una sintaxis específica para las estructuras de datos en el lenguaje central? ¿Es una buena idea, y el propósito del lenguaje (etc.) cambia lo bueno que esto podría ser una elección?
Editar: siento (aparentemente) causar cierta confusión sobre a qué estructuras de datos me refiero. Hablo de los básicos y de uso común, pero aún no son los más básicos. Esto excluye árboles (demasiado complejos, poco comunes), pilas (muy raramente utilizadas), matrices (demasiado simples) pero incluye, por ejemplo, conjuntos, listas y hashmaps.
Respuestas:
Depende de para qué es el idioma.
Algunos ejemplos (algo robado de otras respuestas):
Creo que depende de cuál sea el propósito / espíritu / audiencia de su idioma; qué tan abstracto y qué tan lejos del hardware quieres que esté. En general, los idiomas que admiten listas como primitivas le permiten crear listas infinitamente largas. Si bien los niveles bajos como C / C ++ nunca los tendrían, porque ese no es el objetivo, el espíritu de esos lenguajes.
Para mí, la recolección de basura sigue la misma lógica: ¿le importa a la audiencia de su idioma saber exactamente cuándo y si se está asignando o liberando memoria? En caso afirmativo, malloc / libre; si no, entonces recolección de basura.
fuente
malloc
ynew
son no-determinista en C / C ++).Perl tiene hashmaps y PL / SQL admite registros, y tengo recuerdos muy confusos de que matlab tiene sintaxis para admitir vectores y matrices de todas las diferentes dimensiones (aunque podría estar equivocado sobre este y podría argumentarse que estos son tipos de datos, no datos estructuras ) ... Diría que es bueno tener algo de soporte nativo para estructuras muy comunes. Por lo general, parece que las matrices y los hashmaps / matrices asociativas son las estructuras admitidas de forma nativa más comunes, y probablemente también sean las más utilizadas.
No olvide que si agrega soporte de sintaxis nativa para otras estructuras, como árboles binarios, esas estructuras también se implementarán mediante las herramientas de soporte del lenguaje (compilador / tiempo de ejecución / etc.). ¿Para cuántas estructuras desea construir soporte?
Tendrá que inventar una nueva notación para las estructuras menos comúnmente soportadas de forma nativa ... Keep It Simple !.
fuente
Mi ejemplo favorito aquí es Lua . Lua solo tiene un tipo de datos incorporado, la " tabla ", pero su flexibilidad y velocidad significa que realmente los usa en lugar de arreglos regulares, listas vinculadas, colas, mapas e incluso son la base de las características orientadas a objetos de Lua (es decir, clases).
Lua es un lenguaje increíblemente simple, pero la flexibilidad de la estructura de datos de la tabla también lo hace bastante poderoso.
fuente
{}
no lo es[]
, en Lua tienes{}
para ambos. Las tablas Lua se comparan mejor con las listas de Lisp.No tiene que tener una sintaxis dedicada para cada tipo de datos de alto nivel. Por ejemplo, es tolerable tener
set([1, 2, 3])
(como lo hizo Python 2.x) en lugar de{1, 2, 3}
.Lo importante es tener algo de manera conveniente para la construcción de una estructura de datos de alto nivel. Lo que quieres evitar es código como:
lo que me molesta mucho cuando uso
std::vector
,std::set
ystd::map
en C ++. Afortunadamente, el nuevo estándar tendrástd::initializer_list
.fuente
En mi opinión, es una adición increíblemente simple que puede ser útil sorprendentemente a menudo, al menos si se hace con precaución, es decir, como máximo para tuplas, listas, mapas y conjuntos, ya que tienen literales bien reconocidos.
someBracket {expr ','} someBracket
osomeBracket {expr ':' expr ','} someBracket
, con algunos extras simples muertos si quieres cosas como comas finales opcionales. Los literales flotantes pueden fácilmente ser más largos en la gramática.{1, 2}
).add
/.append
/.setItem
una vez por expresiones dadas con esa (esas) expresión (s) como argumentos".fuente
Clojure es un lisp pero soporta
fuente
Cuantas más estructuras de datos tenga en el propio lenguaje, más difícil será aprender el idioma. Puede ser una preferencia personal, pero tiendo a preferir un lenguaje más simple y luego las bibliotecas pueden proporcionar cualquier extra.
Los lenguajes diseñados para campos específicos a veces pueden beneficiarse de tener ciertas estructuras de datos integradas en el lenguaje, como Matlab. Pero demasiados pueden abrumarte.
fuente
Para que un lenguaje sea realmente útil, tiene que realizar un cierto grado de tareas fuera de la caja. Porque la programación práctica del día a día requiere herramientas que resuelvan sus problemas en algún nivel genérico. El minimalismo se ve compacto y genial, pero cuando quieres comenzar a usarlo para resolver problemas grandes pero repetidos, necesitas un nivel de abstracción sobre el cual puedas construir.
Por lo tanto, creo que los lenguajes de programación deberían enviar soporte para las estructuras de datos más utilizadas en la sintaxis para las tareas para las que está diseñado el lenguaje.
fuente
En general, me parece conveniente tener literales para listas, conjuntos, etc. Pero a veces me molesta que no sepa nada sobre la implementación real de, digamos, la lista de Python o la matriz de Javascript. De lo único que puedo estar seguro es de que exponen una interfaz determinada.
Tomo como punto de referencia de la expresividad de un lenguaje qué tan bien puede escribir sus propias estructuras de datos como bibliotecas, y qué tan conveniente es usarlas.
Por ejemplo, Scala ofrece varias colecciones con diferentes garantías de implementación y rendimiento. Todos ellos están implementados en Scala, y la sintaxis para usarlos es solo un poco más compleja que si estuvieran incorporados y tuvieran tiempo de ejecución.
La única estructura básica que realmente necesita soporte del propio tiempo de ejecución, al menos en un lenguaje administrado, es la matriz: si no administra la memoria, tendrá dificultades para obtener un montón de bytes adyacentes. Cualquier otra estructura puede construirse a partir de matrices y punteros (o referencias).
fuente
APL (y las variantes modernas relacionadas, A +, J y K) tienen estructuras escalares, vectoriales y matriciales como estructuras de datos de primera clase.
Sí, pueden ser desaprobados como simples variantes en la matriz. Pero también están libres de declaraciones complejas y no provienen de una biblioteca separada, se sienten como estructuras de datos complejas que son una parte de primera clase del lenguaje.
fuente
Los literales de listas y mapas y una conveniente sintaxis de cierre son características esenciales de los lenguajes de alto nivel.
La diferencia entre este código Java:
y este código Groovy:
es enorme Es la diferencia entre un programa de 40,000 líneas y un programa de 10,000 líneas. La sintaxis importa.
fuente
var t = new Thing(foo: 3, bar: 6.3, baz: true);
- solo 4 caracteres más.Claro que depende de la aplicación del lenguaje de programación, pero para los lenguajes de nivel superior debería ser lo más conveniente posible trabajar con cualquier estructura de datos común. Eche un vistazo a la lista de tipos de datos abstractos en Wikipedia para ver ejemplos. Encontré los siguientes principios básicos más comunes (pero también me gustaría escuchar otras opiniones):
Puede emular cualquier estructura con cualquier otra estructura; solo depende de cuán fácil y claro lo permita el lenguaje de programación. Por ejemplo:
La mayoría de los idiomas proporcionan al menos un tipo para secuencias ordenadas, uno para mapas unidimensionales y otro para mapas multidimensionales, limitado a funciones. Personalmente, a menudo extraño conjuntos y estructuras multidimensionales ordenadas en lenguajes como Perl, PHP, JavaScript, Lua ... porque emularlos no es lo suficientemente conveniente.
fuente
Creo que es una mala idea tener demasiados tipos de datos privilegiados que obtienen una sintaxis especial. Esto complica la sintaxis del lenguaje innecesariamente, dificultando la lectura del código, dificultando el aprendizaje de los principiantes y el desarrollo de herramientas para el idioma.
Está bien hacer una excepción para un pequeño número de tipos de estructura de datos muy comunes. Probablemente permitiría como máximo:
Algo más sofisticado que eso probablemente debería dejarse en manos de las bibliotecas, utilizando la sintaxis normal del lenguaje para los tipos de datos personalizados.
En particular, cosas como árboles rojos / negros, colas de prioridad, etc. tienen muchas opciones de implementación posibles, por lo que no es aconsejable hornear una implementación particular en el lenguaje principal. Es mejor dejar que las personas elijan la implementación más adecuada para su situación. Ejemplos de opciones de implementación en las que quizás no quiera que un diseñador de idiomas restrinja mi elección:
fuente