Muitas vezes, existem linguagens de programação especializadas para tarefas específicas. Algumas linguagens de programação são excelentes em aritmética de matriz (como matrizes e uso de matrizes multidimensionais), outras ainda são muito melhores em matemática de nível superior que é difícil de reproduzir em outras linguagens (e ainda assim é possível).
Que tal um idioma o torna melhor para uma tarefa ou objetivo final específico do que outros idiomas, já que, de qualquer maneira, ele é compilado para montagem?
Estou falando de linguagens completas de Turing, que são equivalentes a Turing.
programming-languages
esote
fonte
fonte
Respostas:
Há algumas coisas a considerar:
Abstração: o que a linguagem trata como "especial"? As matrizes são valores de primeira classe, como no Matlab, ou você as codifica usando tipos mais simples, como matrizes, como em C? C faz você pensar em como as matrizes são implementadas, o Matlab não.
Da mesma forma, se você possui um sistema complicado de comunicações assíncronas, provavelmente deseja funções de primeira classe para poder fazer retornos de chamada.
Quanto mais recursos forem adicionados, mais complexo o idioma fica. Portanto, embora existam algumas linguagens de "múltiplos paradigmas", como C ++ e D, a maioria das linguagens escolhe um nicho, escolhe as coisas que são importantes para esse nicho e prioriza essas como suas principais abstrações.
Desempenho: toda abstração tem um custo, seja em tempo de compilação ou em tempo de execução. Algumas línguas se limitam de uma maneira que as torna menos abstratas, mas com melhor desempenho.
O Fortran adiantado não permitia ponteiros ou recursão, por isso era ótimo em processamento de números, mais rápido que um idioma como C, onde você executava muitos loops. Mas foi terrível na codificação de grandes estruturas de dados, como árvores, onde você precisava de ponteiros para indireção. (Observe que eu não sei muito sobre o Fortran moderno.)
Essencialmente, sempre existem trocas. Mais abstrato significa tempo de execução mais lento ou mais complexidade em tempo de compilação. Mais recursos significa uma linguagem mais complexa. Alguns recursos tornam certas coisas rápidas e outras lentas, como ponteiros e recursão. Não existe um idioma perfeito; portanto, cada idioma alcançará uma espécie de máximo local no espaço de qualidades do idioma.
fonte
As restrições de algumas linguagens facilitam a implementação de códigos mais rápidos (por exemplo, Fortran vs C e o aliasing de ponteiros), que é uma troca entre desempenho e possibilidades prontas para uso.
A linguagem não é "otimizada" para tarefas específicas, mas a implementação, compiladores e restrições que facilitam a compreensão do código pelo compilador o fazem. O negócio real é sobre bibliotecas específicas; algoritmos implementados para acelerar o processo com comutadores, dependendo do tamanho do problema, o tornam ideal.
Por exemplo, a multiplicação usa vários casos (consulte Multiplicação GMP .
Quando a linguagem especifica as operações matemáticas de nível superior, sua implementação é ótima (eficiente neste caso), mas isso não faz parte da especificação da linguagem.
Por favor, dê uma olhada no cálculo da classificação matricial no Matlab, Mathematica e Maple (não posso realizar todos os testes agora, mas estes são consistentes com os meus testes). Todos esses idiomas (ambientes) implementam a mesma operação de nível superior, mas os detalhes da implementação diferem, o que ocorre várias vezes.
Quando alguma tarefa específica de domínio (aqui também linguagem específica de domínio) é orientada para cálculos específicos, elas são aprimoradas e otimizadas (ao longo dos anos) para o público-alvo. Mas ser ótimo nem sempre é o caso. Por exemplo, o Perl tem um longo histórico de manipulação de strings, mas o PCRE (aqui simplesmente expressões regulares do Perl) não é o mais rápido existente (e usa muita memória), mas é extremamente expressivo e poderoso.
As restrições da linguagem fazem diferença no processo de compilação, o aliasing de ponteiro mencionado evita a possibilidade de reordenação do código e impõe o recarregamento de variáveis.
fonte
Na minha opinião, isso pode realmente ser formulado com muita precisão: Uma ferramenta (por exemplo, uma linguagem de programação juntamente com suas bibliotecas padrão) é a ferramenta ideal para uma classe específica de problemas quando minimiza, sobre todas as ferramentas possíveis que podem ser empregadas, as custo esperado de obter uma solução suficientemente correta e com bom desempenho, em que a expectativa é assumida sobre uma determinada distribuição de probabilidade em todos os problemas da classe de problemas. Principalmente, esse custo vem na forma de tempo do programador e inclui o tempo de projeto esperado, o tempo de depuração esperado, o tempo esperado necessário para educar alguém que ainda não esteja familiarizado com a ferramenta etc.
Na prática, quase nenhuma dessas quantidades pode realmente ser medida. Ainda assim, acho que é o caminho certo para pensar sobre o problema.
fonte
É uma excelente pergunta e não é fácil de responder. Existe algo na linguagem Erlang que a torne adequada para aplicativos de telecomunicações em tempo real? Ou é algo sobre o compilador Erlang? Ou é algo sobre a comunidade e o ecossistema de Erlang? Talvez as pessoas que sabem escrever aplicativos de telecomunicações sejam especialistas em Erlang e as pessoas que conhecem Erlang sejam especialistas em aplicativos de telecomunicações? Eu suspeito que todos esses fatores desempenham um papel.
Provavelmente, existem dois recursos no Erlang que o tornam adequado para esses aplicativos (ressalva: nunca usei o idioma) - ele possui um bom suporte para simultaneidade e suporte para atualização dinâmica de software. Esses recursos também seriam úteis em muitas outras áreas, mas os engenheiros de telecomunicações são fanáticos pelo tempo de atividade. Talvez se as pessoas que criam sites da Web se preocupam tanto com a alta disponibilidade quanto as que fazem trocas telefônicas, Erlang também seria popular lá.
fonte
As outras respostas perdem o objetivo de otimizar um idioma para uma tarefa específica - não se trata apenas do que torna o código mais rápido em um determinado hardware; trata-se de quão clara e sucintamente um determinado idioma permite que você expresse a solução para um problema. Isso depende muito do domínio do problema e (junto com o hype do marketing, a ignorância das soluções existentes e a viagem do ego de escrever uma nova linguagem) é o motivo pelo qual temos várias linguagens - o objetivo é que o programador escreva menos código, o que é menos propenso a erros e mais fácil para o próximo programador ler / entender / corrigir / aprimorar.
Por exemplo, C e C ++ podem ser usados para programação orientada a objetos - e, de fato, a biblioteca GObject é um bom exemplo de OO C. Estrutura de AC que contém ponteiros de função pode servir ao mesmo objetivo que métodos virtuais em uma classe C ++ e pode executar Melhor; a penalidade de desenvolvimento é o código de cola para alocar memória, inicializar os ponteiros de função e escolher uma estratégia para chamar métodos 'pai'. Na maioria das vezes, é mais claro / seguro digitar do
Class klass * = new class()
questruct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ...
.fonte