O que torna um idioma "otimizado" para uma tarefa específica?

15

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.

esote
fonte
11
Esta é uma pergunta enciclopédica. Sugiro que você o descreva de alguma forma, torne-o mais específico.
André Souza Lemos
5
Seria errado dizer "marketing"?
corsiKa
2
@corsiKa Sim, acho que é mais do que uma questão de marketing.
Jeremy Oeste

Respostas:

18

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.

jmite
fonte
8

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.

Mal
fonte
9
A maioria dos idiomas é Turing completa por especificação, pois nem todos especificam tamanhos de endereços fixos em suas especificações. E é bastante limitador perder a distinção entre coisas como C, que são o tamanho do endereço do módulo Turing Complete, e coisas como Coq, Agda ou System F, que não são Turing Complete.
jmite
11
@jmite obrigado. Espero que isso não é mais sombreamento as diferenças
Mal
@ Evil: Bem, acho que sua afirmação sobre idiomas não deve ser otimizada para tarefas está errada. você está vendo a palavra otimizar do ponto de vista do computador. Mas algumas linguagens são projetadas para facilitar apenas o programador e permitir que os implementadores descubram como fazê-lo funcionar.
TheDoctor
Isso é do ponto de vista da eficiência, portanto, não está errado, apenas peguei esse ângulo, você pode considerar o outro (otimizado, o que significa que é mais fácil escrever algumas tarefas específicas). "O que dizer de um idioma o torna melhor para uma tarefa específica ou objetivo final do que outros idiomas [...]", estou muito confiante de que: mais fácil escrever, mais rápido, mais barato etc. pode ser incluído no "melhor". O autor não aceitou alguma resposta nem incluiu esclarecimentos ou comentários de que alguma das respostas dadas não é sobre o que foi solicitado. Além disso, é um dos fatores que, para algumas pessoas mais importante do que a outra
Mal
5

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.

j_random_hacker
fonte
4

É 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á.

Michael Kay
fonte
3

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()que struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....

Phil Lello
fonte
Bem, a resposta do jmite fornece um marcador de pontos que estão faltando. Escrevi sobre tarefas específicas de domínio otimizadas para esse assunto. Eu gosto de C, conheço coisas como OCC, mas isso não torna o C Object Oriented (o compilador não ajuda nisso e muitas otimizações são evitadas, não há coletor de lixo etc.). Você não pode sobrecarregar funções C como no C ++, mas é claro que pode emular qualquer comportamento (o jmite escreveu sobre isso também). Não vejo como isso responde à pergunta declarada.
Mal
2
@ Evil: programação orientada a objetos e linguagem de programação orientada a objetos são dois conceitos diferentes. A programação orientada a objetos não requer uma linguagem orientada a objetos. Indiscutivelmente, isso requer apenas a existência de papel ou quadros brancos para que você possa fazer seu design UML.
precisa saber é
@slebetman Eu não vi isso chegando. Pode-se argumentar que você não precisa do papel e do quadro branco; pode apenas imaginar objetos e, de acordo com algumas pessoas, é assim que pensamos, mas isso não se aproxima do suporte de linguagem dos conceitos de OOP. Sinto muito, mas esta é uma disputa que não quero escolher.
Mal
@Evil: Não tenho tanta certeza de poder acompanhar tudo isso mentalmente sem alguma abstração para ajudá-lo. Meu primeiro trabalho foi receber um grande pedaço de código C que parecia todas as matrizes com ponteiros de função (demorei um pouco para entender o que a sintaxe estranha significava - nenhum google naquela época) e eu estava lutando com ele até começar a ver um padrão e percebemos que essas matrizes eram objetos e esses indicadores de função eram métodos. Comprei um pequeno quadro branco e usou-se um monte de papel A4, mas finalmente consegui entender o código
slebetman
11
@slebetman Dado que a programação orientada a objetos antecede a UML por pelo menos 20 anos, sua afirmação de que os projetos UML são necessários para a orientação a objetos parece ser completamente falsa.
precisa saber é o seguinte