No Python, e provavelmente em muitas outras linguagens de programação, estruturas comuns de dados podem ser encontradas como uma parte integrada da linguagem principal com sua própria sintaxe dedicada. Se colocarmos de lado a sintaxe da lista integrada do LISP, não consigo pensar em outras linguagens que conheço que forneçam algum tipo de estrutura de dados acima da matriz como uma parte integrada de sua sintaxe, embora todas elas (mas C, eu acho) parecem fornecê-los na biblioteca padrão.
Do ponto de vista do design da linguagem, quais são suas opiniões sobre ter uma sintaxe específica para estruturas de dados na linguagem principal? É uma boa ideia e o objetivo do idioma (etc.) muda o quão bom isso pode ser uma escolha?
Edit: Me desculpe por (aparentemente) causar alguma confusão sobre quais estruturas de dados eu quero dizer. Eu falo sobre os básicos e comumente usados, mas ainda não os mais básicos. Isso exclui árvores (muito complexas, incomuns), pilhas (raramente usadas), matrizes (muito simples), mas inclui, por exemplo, conjuntos, listas e hashmaps.
Respostas:
Depende para que serve o idioma.
Alguns exemplos (um pouco roubados de outras respostas):
Eu acho que depende de qual é o propósito / espírito / público da sua língua; quão abstrato e a que distância do hardware você deseja que ele seja. Geralmente os idiomas que suportam listas como primitivas permitem criar listas infinitamente longas. Embora um nível baixo como C / C ++ nunca os tenha, porque esse não é o objetivo, o espírito dessas linguagens.
Para mim, a coleta de lixo segue a mesma lógica: o público do seu idioma se importa em saber exatamente quando e se a memória está sendo alocada ou liberada? Se sim, malloc / free; se não, coleta de lixo.
fonte
malloc
enew
não determinístico em C / C ++).O Perl tem hashmaps e o PL / SQL suporta registros, e eu tenho memórias muito nebulosas do matlab com sintaxe para suportar vetores e matrizes de todas as dimensões diferentes (embora eu possa estar errado sobre isso e possa ser argumentado que esses são tipos de dados e não dados) estruturas ) ... eu diria que é bom ter algum suporte nativo para estruturas muito comuns. Geralmente, parece que matrizes e hashmaps / matrizes associativas são as estruturas suportadas nativamente mais comuns e provavelmente são as mais usadas também.
Não esqueça que se você adicionar suporte à sintaxe nativa para outras estruturas, como árvores binárias, essas estruturas também serão implementadas pelas ferramentas de suporte da linguagem (compilador / tempo de execução / etc). Para quantos estruturas você deseja criar suporte?
Você terá que inventar uma nova notação para as estruturas com suporte nativo menos comum ... Keep It Simple !.
fonte
Meu exemplo favorito aqui é Lua . Lua possui apenas um tipo de dados embutido, a " tabela ", mas sua flexibilidade e velocidade significam que você realmente os usa no lugar de matrizes regulares, listas vinculadas, filas, mapas e são até a base para os recursos orientados a objetos de Lua (ou seja, aulas).
Lua é uma linguagem incrivelmente simples, mas a flexibilidade da estrutura de dados da tabela também a torna bastante poderosa.
fonte
{}
não[]
, no Lua você tem{}
para ambos. As tabelas Lua se comparam melhor às listas no Lisp.Você não precisa ter sintaxe dedicada para todos os tipos de dados de alto nível. Por exemplo, é aceitável ter
set([1, 2, 3])
(como o Python 2.x) em vez de{1, 2, 3}
.O importante é ter alguma forma conveniente para a construção de uma estrutura de dados de alto nível. O que você deseja evitar é um código como:
o que me irrita muito quando eu uso
std::vector
,std::set
estd::map
em C ++. Felizmente, o novo padrão terástd::initializer_list
.fonte
Na minha opinião, é uma adição incrivelmente simples que pode ser útil surpreendentemente com frequência, pelo menos se for feita com cautela - ou seja, no máximo para tuplas, listas, mapas e conjuntos, pois possuem literais bem reconhecidos.
someBracket {expr ','} someBracket
ousomeBracket {expr ':' expr ','} someBracket
, com alguns extras simples, se você quiser coisas como vírgulas finais à direita. Os literais flutuantes podem facilmente ser mais longos na gramática.{1, 2}
).add
/.append
/.setItem
uma vez por expressões especificadas com essa (essas) expressão (s) como argumento".fonte
Clojure é um cisco, mas suporta
fonte
Quanto mais estruturas de dados você tiver no próprio idioma, mais difícil será o aprendizado do idioma. Pode ser uma preferência pessoal, mas eu tendem a preferir uma linguagem mais simples e, em seguida, quaisquer extras podem ser fornecidos pelas bibliotecas.
Às vezes, os idiomas projetados para campos específicos podem se beneficiar da incorporação de determinadas estruturas de dados no idioma, como o Matlab. Mas muitos podem sobrecarregar você.
fonte
Para que um idioma seja realmente útil, ele precisa executar um certo grau de tarefas imediatamente. Porque a programação prática diária requer ferramentas que resolvam seus problemas em algum nível genérico. O minimalismo parece compacto e legal, mas quando você deseja começar a usar para solucionar problemas grandes, mas repetidos, precisa de um nível de abstração sobre o qual possa desenvolver.
Então, acho que as linguagens de programação devem fornecer suporte para as estruturas de dados mais usadas na sintaxe para as tarefas para as quais a linguagem foi projetada.
fonte
Em geral, acho conveniente ter literais para listas, conjuntos e assim por diante. Mas às vezes me incomoda que eu não saiba nada sobre a implementação real - digamos - da lista Python ou da matriz Javascript. A única coisa que posso ter certeza é que eles expõem uma determinada interface.
Tomo como referência de uma expressividade da linguagem o quão bem ele pode escrever suas próprias estruturas de dados como bibliotecas e quão conveniente é usá-las.
Por exemplo, o Scala fornece várias coleções com diferentes garantias de implementação e desempenho. Todos eles são implementados no próprio Scala, e a sintaxe para usá-los é apenas um pouco mais complexa do que se eles estivessem embutidos e tivessem suporte ao tempo de execução.
A única estrutura básica que realmente precisa de suporte do próprio tempo de execução, pelo menos em uma linguagem gerenciada, é a matriz: se você não gerenciar a memória, será difícil obter vários bytes adjacentes. Qualquer outra estrutura pode ser construída com matrizes e ponteiros (ou referências).
fonte
APL (e variantes modernas relacionadas, A +, J e K) têm escalar, vetor e matriz como estruturas de dados de primeira classe.
Sim, eles podem ser preteridos como meras variantes na matriz. Mas eles também estão livres de declarações complexas e não vêm de uma biblioteca separada; eles se parecem com estruturas de dados complexas que são uma parte de primeira classe da linguagem.
fonte
Literais de lista e mapa e uma sintaxe de fechamento conveniente são recursos essenciais de idiomas de alto nível.
A diferença entre este código Java:
e este código Groovy:
é enorme. É a diferença entre um programa de 40.000 linhas e um programa de 10.000 linhas. A sintaxe é importante.
fonte
var t = new Thing(foo: 3, bar: 6.3, baz: true);
- apenas mais 4 caracteres.Claro que depende da aplicação da linguagem de programação, mas para linguagens de nível superior, deve ser o mais conveniente possível trabalhar com qualquer estrutura de dados comum. Dê uma olhada na lista de tipos de dados abstratos na Wikipedia para exemplos. Encontrei os seguintes princípios básicos mais comuns (mas também gostaria de ouvir outras opiniões):
Você pode emular qualquer estrutura com qualquer outra estrutura - isso depende apenas de quão fácil e clara a linguagem de programação permite. Por exemplo:
A maioria dos idiomas fornece pelo menos um tipo para seqüências ordenadas, um para mapas unidimensionais e outro para mapas multidimensionais, limitado a funções. Pessoalmente, muitas vezes sinto falta de conjuntos e ordeno estruturas multidimensionais em linguagens como Perl, PHP, JavaScript, Lua ... porque emulá-las não é conveniente o suficiente.
fonte
Eu acho que é uma má idéia ter muitos tipos de dados privilegiados que obtêm sintaxe especial. Isso complica desnecessariamente a sintaxe da linguagem, dificultando a leitura do código, dificultando a aprendizagem dos iniciantes e dificultando o desenvolvimento de ferramentas para a linguagem.
Não há problema em abrir uma exceção para um pequeno número de tipos de estrutura de dados muito comuns. Eu provavelmente permitiria no máximo:
Qualquer coisa mais sofisticada que isso provavelmente deve ser deixada para as bibliotecas manipularem, usando a sintaxe normal da linguagem para tipos de dados personalizados.
Em particular, coisas como árvores Vermelho / Preto, Filas Prioritárias etc. têm muitas opções de implementação possíveis, portanto, não é aconselhável incluir uma implementação específica no idioma principal. É melhor permitir que as pessoas escolham a implementação mais apropriada para sua situação. Exemplos de opções de implementação nas quais eu talvez não queira que um designer de idioma restrinja minha escolha:
fonte