Por que existem tantas linguagens de programação?


130

Sou bastante fluente em C / C ++ e posso me orientar nas várias linguagens de script (awk / sed / perl). Comecei a usar muito mais o python porque combina alguns dos aspectos bacanas do C ++ com os recursos de script do awk / sed / perl.

Mas por que existem tantas linguagens de programação diferentes? Suponho que todas essas linguagens podem fazer as mesmas coisas, então por que não usar apenas uma linguagem e usá-la para programar computadores? Em particular, há alguma razão que eu deveria saber uma linguagem funcional como um programador de computador?

Algumas leituras relacionadas:


2
também há uma diferença entre OO e não OO. Além disso, alguns idiomas vêm com pacotes interessantes: R, Maple, Matlab, Mathematica que geralmente não existem em outros idiomas.
Artem Kaznatcheev 17/03/12


4
Já perguntar sobre programadores programmers.stackexchange.com/q/7551/45322
alain.janinm

2
Para implementar algoritmos paralelos, a programação funcional é melhor; em geral, quando você tem objetos mutáveis, é melhor usar o paradigma OO; caso contrário (se você deseja lidar com objetos imutáveis ), é melhor alterá-lo para o modelo funcional. Esse cenário existe amplamente no processamento paralelo. Além disso, alguns padrões excelentes de OO, como interface fluente e encadeamento de métodos, estão funcionando como paradigma funcional.

4
Por que existem tantos carros? Por que existem tantos aviões? E o que dizer de BARCOS! Quero dizer, sério! Você desce para o oceano e há, tipo, todos os tipos de coisas ruins! Qual é o sentido de todos esses tipos diferentes de coisas?!?!? É ineficiente! É um desperdício !! E qual é o ponto de todas essas escolhas diferentes?!?!? Nossa - pessoas sábias! Ninguém poderia precisar de nada, exceto um Yugo, um F-150 e um transatlântico! Ah, sim, aviões - os MD-80 funcionarão bem para praticamente tudo. Lá. Agora que que está tudo resolvido ... :-)
Bob Jarvis

Respostas:


116

As linguagens de programação evoluem e são aprimoradas com o tempo (inovação).

As pessoas pegam idéias de diferentes idiomas e as combinam em novos idiomas. Alguns recursos foram aprimorados (mecanismos de herança, sistemas de tipos), outros foram adicionados (coleta de lixo, manipulação de exceções), alguns foram removidos ( gotoinstruções, manipulações de ponteiro de baixo nível).

Os programadores começam a usar uma linguagem de uma maneira específica que não é suportada por nenhuma construção de linguagem. Os designers de idiomas identificam esses padrões de uso e introduzem novas abstrações / construções de linguagem para suportar esses padrões de uso. Não houve procedimentos na linguagem assembly. Nenhuma classe em C. Nenhuma exceção manipulando em C ++ (inicial). Não há maneira segura de carregar novos módulos em idiomas antigos (fácil em Java). Nenhum encadeamento interno (fácil de usar em Java).

Os pesquisadores pensam em formas alternativas de expressar cálculos. Isso levou o Lisp e o ramo da linguagem funcional da árvore de idiomas, o Prolog e o ramo de programação lógica, Erlang e outros modelos de programação baseados em atores, entre outros.

Com o tempo, os designers / pesquisadores de linguagem passam a entender melhor todas essas construções, e como elas interagem, e projetam linguagens para incluir muitas das construções populares, todas projetadas para trabalhar perfeitamente juntas. Isso resulta em linguagens maravilhosas como o Scala, que possui objetos e classes (expressos usando traços em vez de herança única ou múltipla), recursos de programação funcional, tipos de dados algébricos integrados de maneira agradável ao sistema de classes e à correspondência de padrões e simultaneidade baseada em ator.

Pesquisadores que acreditam em sistemas de tipo estático se esforçam para melhorar sua expressividade, permitindo coisas como classes genéricas digitadas em Java (e todas as coisas maravilhosas em Haskell), para que um programador obtenha mais garantias antes de executar um programa de que as coisas não vão acontecer. dar errado. Os sistemas de tipo estático geralmente impõem um grande ônus ao programador (digitando os tipos); portanto, a pesquisa foi realizada para aliviá-lo. Idiomas como Haskell e ML permitem que o programador omita todas as anotações de tipo (a menos que estejam fazendo algo complicado). Scala permite que o programador omita os tipos no corpo dos métodos, para simplificar o trabalho do programador. O compilador infere todos os tipos ausentes e informa o programador sobre possíveis erros.

Finalmente, alguns idiomas são projetados para oferecer suporte a domínios específicos. Exemplos incluem SQL, R, Makefiles, a linguagem de entrada Graphviz, Mathmatica, LaTeX. Integrar o que as funcionalidades dessas linguagens nas linguagens de uso geral (diretamente) seria bastante complicado. Esses idiomas são baseados em abstrações específicas para seu domínio específico.

Sem a evolução no design da linguagem de programação, todos nós ainda estaríamos usando a linguagem assembly ou C ++.

Quanto ao conhecimento de uma linguagem de programação funcional : as linguagens funcionais permitem expressar cálculos de maneira diferente, geralmente mais concisa do que usar outras linguagens de programação. Considere a diferença entre C ++ e Python e multiplique por 4. Mais seriamente, como já mencionado em outra resposta, a programação funcional fornece uma maneira diferente de pensar sobre os problemas. Isso se aplica a todos os outros paradigmas; alguns são mais adequados a alguns problemas e outros não. É por isso que as linguagens com vários paradigmas estão se tornando mais populares: você pode usar construções de um paradigma diferente se precisar, sem alterar a linguagem e, mais desafiadoramente, pode misturar paradigmas em um único software.


11
Concordo plenamente. Estou interessado em saber onde as línguas multiparadigma (por exemplo, Scala) estarão daqui a alguns anos. Se eles permitirem uma fácil integração DSL, poderemos ver um declínio gradual nos números de idiomas.
Raphael

2
Resposta muito detalhada! Podemos reconhecer que a maioria das linguagens de programação pode ser equivalente a Turing, mas isso não significa que a abstração suportada seja adequada para todos os domínios de problemas.
21412 CyberFonic

Colocar assembly e C ++ na mesma caixa dói meu coração. C ++ evoluiu muito !! Especialmente desde C ++ 11 e para a frente.
Peregring-lk

66

tldr: Não há linguagem de bala de prata.

Espero que eles não me processem, mas aqui está uma foto de uma das apresentações de Stanford.

insira a descrição da imagem aqui

Ao decidir escolher um idioma, você pode escolher apenas dois desses três recursos .

E é por isso que as pessoas estão tristes e querem inventar uma superlíngua que cubra todos os três.

Na verdade, há uma lista enorme de requisitos (alguns deles você pode ver em outras respostas), mas eles apenas adicionam detalhes aos principais recursos. Além disso, existem razões históricas e políticas para preferir um idioma a outro.

Combinações de tais fatores produzem um novo idioma.

( E ouvi dizer que todo bom programador deve criar seu próprio idioma;) )


11
Com o tempo, o triângulo está encolhendo, no sentido de que os cantos estão se aproximando ... Espero / sonho.
21812 Dave Clarke

11
Desempenho e generalidade podem ser comparados mais ou menos, mas acrescentarei que a experiência em um idioma oferece mais produtividade do que um determinado idioma; não é justo comparar "produtividade de idiomas" sozinho, porque você precisa da suposição de conhecimento e experiência todos eles, uma hipótese muito improvável.
Hernan_eche

Essa é uma afirmação interessante e meio que me lembra o teorema da PAC. Isso é apenas uma argumentação informal ou o triângulo pode ser provado?
evnu

11
@evnu, aqui está um argumento quase normal de uma parte: supondo que generalidade significa que programas válidos de qualquer tamanho n na linguagem L cobrem um espaço maior de problemas, cada subespaço de problemas é coberto apenas por algumas frações dos programas de comprimento n. Se os programas de comprimento n fora do seu subespaço específico estivessem dentro do seu subespaço, você teria maiores chances de encontrar um programa mais curto que resolvesse o seu problema (para que você presumivelmente fosse mais produtivo), mas o idioma seria menos geral. - resolveria problemas em outros subespaços menos bem (isto é, com programas mais longos).
Jonas Kölker 02/02

Esse é um bom argumento de que você precisa de pelo menos duas linguagens de programação, além de um grande número de linguagens específicas de domínio, cobrindo assim todos os três lados do triângulo. Temos muito, muito, muito mais que isso. (E eu ia colocar c no topo vértice do triângulo, mas isso é um bastante pequena coisinha.)
Peter Shor

25

O mundo está cheio de coisas com muitas variações diferentes: processadores de texto, carros, designs de casas, bebidas, doces, canetas, pás, etc. As razões pelas quais temos tantas podem ser resumidas em alguns princípios:

  • Alguém acha que pode melhorar os produtos existentes
  • Um projeto diferente é necessário por considerações locais (pense: casas sobre palafitas versus casas com lajes de concreto)
  • Uma nova categoria de produto preenche uma necessidade em que não existia antes

Entre em qualquer loja de material de escritório e consulte a seção "instrumento de escrita" - existem centenas de variedades de canetas. Todos eles fazem aproximadamente a mesma coisa: entregar tinta a uma superfície de escrita. Mas cada caneta que você vê exibida para venda está lá por uma das três razões acima.

  • As canetas-tinteiro são uma melhoria nas canetas-tinteiro, que são uma melhoria nas penas de penas.
  • A NASA precisava de uma caneta que pudesse escrever na ausência de gravidade, de modo que a caneta rollerball pressurizada foi inventada.
  • A própria primeira caneta pode muito bem ter sido uma vara pontiaguda embebida em alcatrão ou sangue; antes disso, as pessoas estavam raspando pedras ou manchando pigmentos nas paredes com pelo. (Apenas um palpite.)

A evolução das canetas continuará, pois nenhum produto atende às necessidades de todos os usuários. Algumas canetas são baratas e descartáveis, outras caras e construídas com materiais de alta qualidade; alguns usam géis, outros usam tinta, outros usam pigmentos; alguns têm gorros, outros nem sequer; barris largos, estreitos, redondos, quadrados; curto longo; vermelho, branco, preto, azul Etc etc.

Mas chega de canetas.

Nossa miríade atual de linguagens de programação pode ser rastreada até as primeiras: os códigos numéricos de máquinas para computadores antigos na década de 1940. Primitivo, difícil de usar e trabalhoso para entrar no computador, mas eles fizeram o trabalho. Não demorou muito para que os programadores atribuíssem palavras mnemônicas (como ADD, CALL, LOAD) aos códigos de máquina, dando origem à classe de idiomas denominada "linguagens assembly".

Arquiteturas de processador diferentes pediam códigos mnemônicos diferentes, dependendo dos recursos específicos das máquinas subjacentes. Levar essas diferenças em consideração significava inventar diferentes linguagens assembly.

(Talvez agora você possa ver para onde isso está indo ...)

Os programadores examinavam seus programas de linguagens assembly e via padrões: as mesmas seqüências de instruções seriam usadas para formar loops, condicionais, atribuição de variáveis, chamadas de função e assim por diante. Assim, nasceram as linguagens de programação procedural. Esses idiomas encapsularam grupos de instruções sob termos genéricos, como "se", "enquanto", "deixe" etc.

De uma análise matemática da programação de computadores, surgiram as linguagens funcionais - uma nova maneira de ver a computação. Nem melhor, nem pior, apenas diferente.

E também há linguagens orientadas a objeto, estaticamente tipadas, dinamicamente, vinculativas tardias, vinculadas antecipadamente, baixo uso de memória, alto uso de memória, paralelizável, linguagens para usos específicos e assim por diante.

Por fim, temos diferentes linguagens de programação porque queremos diferentes linguagens de programação. Todo designer de idiomas tem suas próprias idéias sobre como a linguagem dos "sonhos" será exibida e operada. Diversidade é uma coisa boa .


Não vejo aqui nenhuma razão convincente para explicar por que deveríamos ter vários idiomas além do que as pessoas desejam por qualquer motivo.
Raphael

É exatamente isso. Programadores são, por natureza, solucionadores de problemas. Para resolver problemas, eles precisam de ferramentas que geralmente assumem a forma de linguagens de programação. Se as ferramentas não puderem ajudá-los a resolver o problema da maneira que desejam, eles inventam novas ferramentas. Pense da seguinte maneira: como as ferramentas são software e o novo software é escrito para solucionar novos problemas, as próprias ferramentas podem ser problemas a serem resolvidos. Esses problemas são resolvidos com a criação de novas ferramentas.
Barry Brown

Apenas um detalhe: o ramo funcional das linguagens é um ofshot das idéias do matemático de como expressar o que hoje chamamos de "computação", que começou a ser considerado cerca de 50 anos antes dos primeiros computadores. Não é à toa que o LISP (de alguma forma) é o segundo idioma mais antigo ainda existente, o primeiro sendo o FORTRAN.
vonbrand

20

As linguagens de programação funcional geralmente são baseadas no modelo de computação diferente (mas equivalente em potência): cálculo lambda . Existem algumas linguagens não tipadas (com digitação semelhante ao Python) como LISP, Scheme (usada no livro / curso Estrutura e Interpretação de Programas de Computador amplamente reconhecido ) e linguagens de tipo estatístico como Haskell, ML, F #.

O SICP foi o que me levou à programação funcional, mas outras pessoas recomendam este artigo de John Hughes e esta entrevista com ele.

A programação funcional agora está sendo implementada pela Microsoft, por exemplo, que incluiu o F # (sua linguagem funcional para .NET) no VS2010 e 11; eles também empregam alguns desenvolvedores Haskell em MSR, IIRC.

Observe que também existem algumas linguagens de programação funcionais que não são de cálculo lambda, como Refal , que se baseia na correspondência e reescrita de padrões.

Como o nível de abstração nas linguagens funcionais é diferente, sua atitude para resolver problemas muda quando você usa técnicas de programação funcional. Alguns dizem que isso pode torná-lo um programador melhor em geral.


11
Outra classe interessante de linguagens são as linguagens de programação lógica, como o Prolog. Eu só tinha uma experiência muito limitada com o DataLog, então talvez alguém mais pudesse escrever uma resposta sobre isso?
21712 Daniil

2
Concordo que precisamos de uma linguagem de programação para cada paradigma de programação: imperativo, OO, declarativo, funcional etc. Mas isso não explica por que temos tantas, digamos, linguagens OO.
Dai

@Dai, bem, nós realmente? O fundamento teórico não é a única característica de uma linguagem. Por exemplo, pode-se dizer que um recurso importante do Java ou C # é (comparando com o C ++) a máquina virtual, o que torna o Java significativamente diferente.
Daniil

Mas se C # e Java usam o conceito de máquina virtual, por que não usamos sintaxe idêntica para ambas as linguagens? Eu acho que todo designer tem suas fortes idéias sobre como deve ser sua linguagem e tem a tendência de criar seu próprio padrão.
Dai

@Dai, existem muitas pequenas diferenças entre C # e Java, afinal. Além disso, acho que houve alguma disputa legal sobre a Java VM para Windows ou algo desse tipo.
21712 Daniil

19

Em particular, há alguma razão para eu conhecer uma linguagem funcional como programador de computador?

Sim. Porque haskell mudou a minha maneira de pensar. Pode mudar a maneira como você pensa também.

História: Eu costumava pensar que posso aprender qualquer linguagem de programação em um dia. Um dia eu comecei o Haskell. Eu terminei tudo o que veio antes das mônadas em meio dia. Agora faz um ano desde aquele dia e ainda estou irremediavelmente preso no Monads.

Ler:

  1. Wiki de idiomas e pensamento

  2. Notação como uma ferramenta para o pensamento de Kenneth E. Iversion, palestra do Prêmio Turing

Mas por que existem tantas linguagens de programação diferentes?

A notação é uma ferramenta para o pensamento. Precisamos de diferentes notações feitas sob medida para lidar confortavelmente com diferentes pensamentos. Então criamos novos idiomas.

Além disso, ler . ;-)


5
Retribuir é divino!
Pratik Deoghare 21/03

4
iterar é humano?
Suresh

11
Não tenho certeza se esse foi um bom anúncio para Haskell. ;)
Barry Brown

@Pratik Deoghare. Aprender Haskell em um dia provavelmente não era uma boa ideia. Eu diria, leia um bom livro sobre programação funcional, como Bird e Wadler, e não se apresse em fazê-lo. Então as mônadas podem não ser tão difíceis.
Uday Reddy

"Eu terminei tudo o que veio antes das mônadas em meio dia." Realmente? Você aprendeu aulas, tipos, functores, ADTs, tipos etc. em meio dia? Isso é impossível. Lyah tem monads no capítulo 12 dos 14. RAC não tem mônadas até o capítulo 6, e eles são introduzidos muito gradualmente - definição completa está no capítulo 14.
sdcvvc

13

Dificilmente poderia haver um programador que em algum momento não se frustrasse com as restrições da linguagem que estava usando e decidiu coçar a coceira. Assim, um novo idioma - ou dialeto de um existente - nasce.

Abadi e Cardelli em "A Theory of Objects" desenvolvem toda uma família de linguagens de programação a partir de fundações orientadas a objetos. Eles provam que a programação funcional é um caso especial de OO, mas não o contrário.

Inventar algo novo é divertido, por isso é mais provável que as pessoas criem outro idioma do que contribuam para melhorar um idioma existente. Obviamente, existem guardiões de idiomas que não aceitam mudanças em sua visão. O melhor exemplo é o abismo entre os apoiadores do Common Lisp e do Scheme.


3
Uma teoria dos objetos não apresenta uma família inteira de linguagens de programação utilizáveis. Ele apresenta uma base para linguagens de programação orientadas a objetos, e uma estranha, por não ser baseada em classes. Não vejo a conexão entre "A Theory of Objects" e programação funcional. O cálculo do objeto não tem noção de preguiça, por exemplo. Há também pesquisas que codificam conceitos de OO em termos de funções e registros, por exemplo, o trabalho de Pierce no final dos anos 90.
Dave Clarke


11

Por que existem tantos países no mundo? Não seria mais fácil se tivéssemos 5 ou 6 superpotências, ou mesmo um reino universal da Terra? É fácil argumentar por que não seria melhor --- para começar, a concorrência de diferentes países pode levar ao progresso e, do ponto de vista da democracia, direitos humanos etc., muitos países podem ser melhores do que um - - mas isso não explica por que temos muitos países. Explica apenas por que muitos países seriam melhores .

Da mesma forma, você pode perguntar, por que tantas línguas humanas diferentes? Polonês, árabe, mandarim ... Não seria mais fácil se houvesse apenas um idioma? Você poderia argumentar de qualquer maneira, mas essas seriam razões pelas quais seria melhor se a vida fosse de um jeito ou de outro. Não explicaria as causas por trás de tantas línguas humanas diferentes.

O fato é que existem muitas pessoas no planeta, e todos nós estamos fazendo o que fazemos, todos temos nossas opiniões, todos queremos estar no comando e ter nosso próprio país ou linguagem de programação, e muitas vezes pensamos que sabemos melhor do que outros, ou pelo menos não se incomode em entender o que os outros têm a oferecer.

Leia este post de blog muito esclarecedor: Por que tantas estruturas da Web Python? Aparentemente, existem cerca de 50 estruturas da Web em Python. Isso é ridículo; não existe absolutamente nenhuma razão racional sensata para isso. Mas o autor do post responde: existem muitas estruturas da Web Python porque é muito fácil criar uma . Você não precisa de um motivo racional para haver mais estruturas da web em python ou mais linguagens de programação. As pessoas continuarão criando novas porque não sabem o que já está disponível, ou porque esperam ganhar dinheiro, ou apenas porque criar coisas novas é divertido!

Deixe-me descrever um exemplo pessoal. Cerca de 10 anos atrás, eu estava escrevendo um código C ++ para uma empresa finlandesa. Você sabe, na Finlândia, eles têm aqueles caminhões enormes que, bem, percorrem longas distâncias e entregam muitas coisas de um lugar para o outro. Tenho certeza de que também existem caminhões na América. Portanto, um problema típico é garantir que todos os 24 pneus estejam bem. Obviamente, existe uma tecnologia testada pelo tempo: pressão e temperatura podem ser monitoradas, e mudanças drásticas indicariam que algo deu errado. Obviamente, toda essa tecnologia é proprietária, patenteada, com todas as implicações. (Lembre-se: as patentes devem promover a inovação!) Portanto, essa empresa finlandesa queria detectar o estado dos pneus por ... som. A idéia era instalar microfones para ouvir o som de todos os pneus e fazer algum tipo de mágica de processamento de sinal nesses sons, a fim de verificar se um dos pneus tinha algum tipo de problema, e eu estava fazendo um protótipo dessa loucura. (Eles ainda tinham um laboratório dedicado para gravar sons de amostra; uma vez eles me enviaram um impressionante vídeo de uma ocasião em particular, quando eles conseguiram explodir um pneu de amostra depois de submetê-lo a 5 ou 10 toneladas de pressão e aquecê-lo até uma temperatura ridícula .) Claramente, novamente, não havia uma razão racional específica para esse desenvolvimento, exceto que era divertido e algumas pessoas queriam ganhar dinheiro. Entenda também que existem muitas razões para alguém começar a desenvolver uma nova linguagem de programação. Não há necessidade ou mesmo possibilidade de aprender todos eles. (Eles ainda tinham um laboratório dedicado para gravar sons de amostra; uma vez eles me enviaram um impressionante vídeo de uma ocasião em particular, quando eles conseguiram explodir um pneu de amostra depois de submetê-lo a 5 ou 10 toneladas de pressão e aquecê-lo até uma temperatura ridícula .) Claramente, novamente, não havia uma razão racional específica para esse desenvolvimento, exceto que era divertido e algumas pessoas queriam ganhar dinheiro. Entenda também que existem muitas razões para alguém começar a desenvolver uma nova linguagem de programação. Não há necessidade ou mesmo possibilidade de aprender todos eles. (Eles ainda tinham um laboratório dedicado para gravar sons de amostra; uma vez eles me enviaram um impressionante vídeo de uma ocasião em particular, quando eles conseguiram explodir um pneu de amostra depois de submetê-lo a 5 ou 10 toneladas de pressão e aquecê-lo até uma temperatura ridícula .) Claramente, novamente, não havia uma razão racional específica para esse desenvolvimento, exceto que era divertido e algumas pessoas queriam ganhar dinheiro. Entenda também que existem muitas razões para alguém começar a desenvolver uma nova linguagem de programação. Não há necessidade ou mesmo possibilidade de aprender todos eles. uma vez que eles me enviaram um impressionante vídeo de uma ocasião em particular, quando eles conseguiram explodir um pneu de amostra após submetê-lo a 5 ou 10 toneladas de pressão e aquecê-lo a uma temperatura ridícula.) Claramente, novamente, não havia um racional específico razão para esse desenvolvimento, exceto que era divertido e algumas pessoas queriam ganhar dinheiro. Entenda também que existem muitas razões para alguém começar a desenvolver uma nova linguagem de programação. Não há necessidade ou mesmo possibilidade de aprender todos eles. uma vez que eles me enviaram um impressionante vídeo de uma ocasião em particular, quando eles conseguiram explodir um pneu de amostra após submetê-lo a 5 ou 10 toneladas de pressão e aquecê-lo a uma temperatura ridícula.) Claramente, novamente, não havia um racional específico razão para esse desenvolvimento, exceto que era divertido e algumas pessoas queriam ganhar dinheiro. Entenda também que existem muitas razões para alguém começar a desenvolver uma nova linguagem de programação. Não há necessidade ou mesmo possibilidade de aprender todos eles.

Obviamente, tudo isso se aplica apenas se você acredita em evolução. Se você acredita em alguma forma de design inteligente, que Deus também criou todas as linguagens de programação, teria que encontrar um propósito por trás dessa multidão. Talvez Deus quisesse promover a competição entre diferentes linguagens de programação para que a arte do desenvolvimento de software alcançasse seu estado mais alto possível.

Em conclusão, existem muitas pessoas, muitos países, muitas linguagens de programação. Esta é apenas a natureza da vida! Sejamos gratos por isso: isso significa apenas que o campo da programação / ciência da computação está muito vivo e florescendo.


resposta muito perfeita, não sei por que não foi aceita!
Am_I_Helpful

8

Por que existem tantas linguagens de programação diferentes?

Porque existem escolhas a serem feitas:

  • Modo de especificação: Imperativo vs. funcional
  • Digitação: digitada estaticamente x digitada dinamicamente
  • Ordem de avaliação: chamada por valor vs. chamada por nome
  • Modularidade: baseado em classe x abstrato baseado em tipo de dados
  • Modelo de execução: sequencial vs. concorrente

Felizmente, as duas últimas são dicotomias não essenciais, ou seja, é possível colocar as duas opções em uma única linguagem de programação. Mas, as três primeiras dicotomias dão origem a 8 combinações. Assim, mesmo em um mundo ideal, haveria pelo menos 8 linguagens de programação. Quando você faz uma pesquisa detalhada, há outras opções de design diferenciadas dentro de paradigmas específicos. Por exemplo, se alguém decide fazer uma linguagem estaticamente tipada com base em classe, existem diferentes maneiras de projetar o sistema de tipos. Ainda não existe uma maneira canônica de fazê-lo. Se alguém decide fazer uma linguagem de programação simultânea, existem várias maneiras de representar a simultaneidade: semáforos, regiões críticas condicionais, monitores, passagem de mensagens (síncrona vs. assíncrona). Na passagem síncrona de mensagens,

Parte da pesquisa que fazemos em teoria da linguagem de programação é dedicada à resolução dessas dicotomias. Por exemplo, trabalhei na resolução da dicotomia entre programação imperativa e funcional em um artigo chamado " Designações para linguagens aplicativas " e nosso método agora foi adotado por Haskell, tornando-a uma linguagem funcional e imperativa. Isso não significa que a dicotomia esteja totalmente resolvida. Um programador de Haskell ainda enfrenta a opção de resolver seu problema funcional ou imperativamente. Luca Cardelli trabalhou na resolução de dicotomia estática versus dinâmica de digitação. Paul Levy trabalhou na resolução da dicotomia chamada por valor vs. chamada por nome . Nem todos esses resultados foram implementados em linguagens de programação da vida real.


Se todas essas linguagens podem fazer as mesmas coisas, por que não usar apenas uma linguagem e usá-la para programar computadores?

Porque para um programador no mundo real, não basta fazer algo. Também importa como é feito. Quando isso é feito corretamente, o domínio do problema é representado fielmente no programa, a modularidade do problema é mantida e os programas se tornam fáceis de entender, modificar e manter. Todas essas coisas afetam o custo do desenvolvimento e manutenção do programa. Eles também afetam a confiabilidade e a segurança do software.

Por exemplo, muitas pessoas usam um programa chamado " Quicken " para contas financeiras. O programa original foi desenvolvido em alguma versão interna do Visual Basic e foi bastante bom. No entanto, tem sido difícil estendê-lo e mantê-lo. Ao longo dos anos, à medida que a empresa tentava estendê-lo para novos recursos, o programa tornou-se cada vez mais problemático, com milhões de clientes insatisfeitos em todos os lugares. Eles provavelmente se beneficiarão com a reengenharia do software em uma linguagem de programação orientada a objetos fortemente tipada.


Em particular, há alguma razão para eu conhecer uma linguagem funcional como programador de computador?

Historicamente, a "programação funcional" foi inventada por Godel, Kleene e Church, seguindo a prática matemática padrão, e a "programação imperativa" foi inventada por Turing para definir a noção de computação mecânica. Antes de Turing, não há evidências de que a matemática tenha analisado idéias imperativas de programação. (Embora todos os algoritmos matemáticos tradicionais tenham sido expressos em um "estilo imperativo", seu conteúdo essencial ainda era funcional.) Portanto, a programação imperativa é muito nova para a civilização humana, e sua matemática ainda não é muito bem compreendida. A principal razão pela qual todos devem conhecer alguma programação funcional é entender como a programação pode ser matemática. (Não admito que a programação imperativa não seja matemática, é nisso que os programadores funcionais querem que você acredite. Mas eu concordaria que, com o estado da arte atual, ainda não sabemos como fazer a programação imperativa matematicamente. Muitos de nós estamos trabalhando exatamente nesse problema.)


1

Você pode ver isso como evolução.

No começo, os computadores eram programados exclusivamente com códigos binários. Depois disso, os mnemônicos foram introduzidos e as linguagens assembly foram introduzidas, dependendo principalmente da CPU usada.

Após a introdução das linguagens de nível superior (3º nível) (Pascal, C, ADA, Cobol), algumas muito genéricas (como C), outras mais adequadas para manipulação de dados (Cobol), outras para cálculos (Fortran).

Depois disso, surgiram as linguagens do 4º nível, como as lógicas (como o Prolog). Os idiomas mais genéricos são sucessores de idiomas de terceiro nível; alguns deles são Java, C #.

Também vemos idiomas específicos para internet / web, como ASP.NET, PHP.

E idiomas para um domínio específico (DSL), que funcionam principalmente em conjunto com um idioma genérico.

Depois, há idiomas para as crianças aprenderem programação, como o LOGO.

Também linguagens para escrever códigos rapidamente, como Python, Ruby etc., linguagens para manipular XML (XSLT).

E provavelmente esqueci muitas línguas e até categorias de línguas.


11
Sua cronologia está confusa. Prolog é de 1972, mais jovem que Ada (1983). Não sei o que você quer dizer com "sucessores de línguas de terceiro nível"; poucas línguas não são descendentes de Fortran, incluindo C e Pascal (que geraram Ada).
prosfilaes

11
@prosfilaes, muito confuso. FORTRAN foi o primeiro idioma ainda em uso, depois veio o LISP, depois o COBOL. Algol foi definido para a publicação de algoritmos, não para o uso de máquinas (mas compiladores chegaram a ser assim), com imagens Pascal e mais tarde C. PL / 1 era uma estranha mistura de FORTRAN e COBOL com estruturas de controle de Algol.
vonbrand

1

outras respostas são boas, adicionará alguns novos ângulos. enquanto o DC escreve as linguagens evoluem exatamente como as linguagens humanas reais! e emprestam conceitos e sintaxe um do outro novamente como linguagens humanas reais. em outras palavras, há também um estudo bastante real da etimologia das linguagens de computador.

isso também significa que houve uma longa história e cronograma que começaram principalmente por volta dos anos 30 com o cálculo lambda .

existe uma forte interação / sinergia / simbiose entre teoria e aplicação com linguagens de programação. novas aplicações são inventadas, o que leva a novas teorias e vice-versa. uma linguagem de programação é, sob muitos aspectos, uma ponte entre teoria e aplicação .

um estudo de caso interessante da história é Fortran. não é bem conhecido, mas as versões anteriores do Fortran (principalmente antes do Fortran77) tinham uma gramática ambígua . isso significa que o mesmo comando pode ser legitimamente "interpretado" / compilado de diferentes maneiras pelo compilador, porque havia várias "interpretações" válidas (esse não é o mesmo sentido técnico das linguagens "interpretadas").

então a teoria sobre gramáticas formais estava sendo desenvolvida na época em que Fortran foi inventado, e foi uma pequena crise quando a questão da ambiguidade da linguagem foi descoberta. A sintaxe de Fortan foi reformulada para evitar essa ambiguidade e os idiomas posteriores tiveram mais sensibilidade à ambiguidade gramatical em seu design. OOP também é um exemplo muito importante / principal de um conceito / avanço teórico em linguagens de programação que "impacta" ou "ondula" em muitas linguagens existentes, transformando-as.

outros estudos de caso são a invenção de novas tecnologias. por exemplo, a invenção do banco de dados relacional teve um grande impacto nas linguagens de computador, por exemplo, com SQL e interfaces de linguagem de computador (por exemplo, em java, "JDBC"). Da mesma forma, a rede mundial de computadores com um impacto ainda maior. parecia haver uma explosão de idiomas cronometrada em torno do boom das pontocom que coincidiu amplamente com o crescimento inicial da WWW e pode ser comparada com explosões evolucionárias .

também parece haver uma longa tendência de aumento de novas linguagens de programação em conjunto com o enorme poder de processamento exponencialmente crescente da lei de Moores, que alguns acham que pode estar diminuindo.

as tendências atuais de longo alcance nas linguagens de programação parecem estar voltadas para Big Data e Paralelização, por exemplo, com o MapReduce . também existe um interesse atual em fechamentos .

Outro aspecto importante das linguagens é que elas representam níveis crescentes de abstração . eles constroem abstrações de nível inferior para criar abstrações de nível superior (semelhante a uma pirâmide). dessa maneira, o progresso da evolução da linguagem de computador provavelmente é interminável e podemos ter certeza de que novas importantes continuarão sendo inventadas por muito tempo no futuro. isso provavelmente é análogo a um conceito semelhante em psicologia chamado chunking - geralmente dito, construindo conceitos mentais de nível superior a partir de blocos de construção de nível inferior.

qualquer um que tenha estudado muitas linguagens de computador deve admitir que uma mentalidade de rebanho pode ser observada, na qual alguns aspectos se transformam em modismos exagerados, ou seja, não são tão críticos quanto preconizados, ou até desaparecem (em uso) ao longo do tempo! algumas das idéias / mudanças principais permanecem, mas o (excesso) hype desaparece. nesse sentido, as linguagens de programação também ficam fora de moda . na minha opinião, na última meia década, dois casos que são realmente úteis, mas foram exagerados:

cada vez mais, uma auto-similaridade pode ser observada em muitos idiomas principais, de modo que todos tendem a convergir para a implementação de muitos recursos semelhantes à sua maneira, ou seja, como nos gráficos de comparação de produtos que "marcam" vários recursos em uma grade.


veja também padrões de design que geralmente cruzam idiomas e são implementados em idiomas. Outro aspecto fundamental da linguagem estudo / funcionalidade são características implementadas em bibliotecas
vzn

FORTRAN nunca teve uma descrição formal, muito menos a complexidade da expressão que poderia levar a ambiguidades gramaticais (sim, eu comecei a programar em uma abominação chamada PDQ FORTRAN e, mais tarde, FORTRAN IV) a linguagem na qual a ambiguidade (muito embaraçosa) do a gramática veio à tona com o algol, o primeiro idioma definido com uma gramática.
vonbrand

ponto levado por FORTRAN original / inicial, mas as versões posteriores foram mais formalizadas com definições gramaticais mais rigorosas. é um estudo de caso mostrando a evolução de uma linguagem junto com a teoria da linguagem.
vzn

FORTRAN recebeu uma gramática forçada, mas nunca foi projetada em torno de uma. Algol iniciou essa tendência, que foi continuada por Pascal, a família Modula, Oberon, C e, muitas vezes, PL / 1, Ada e outras. Dada a tecnologia de gramática livre de contexto e a compreensão da análise, hoje a definição de uma gramática e a tradução em um analisador sem erros é quase trivial, nenhum idioma mais novo fica sem.
vonbrand

adendo, estudo de caso em linguagens mais recentes / emergentes: Google ir , node.js , a Apple rápida
vzn

-3

Eles não eram, é apenas um truque de marketing - se você faz a linguagem meio que se parecer com "C", isso reduz a aparente barreira à entrada.

Alguns que não têm influência de C: SQL, Pascal, Delphi, FORTRAN, COBOL, Ada, PowerBuilder, HyperTalk, Lisp, Simula, FOCAL, BASIC, PL / I, Algol, Algol-68, SNOBOL, Modula, Visual BASIC, Tutor, logotipo, adiante, DIBOL, hélice, AppleScript, Python, Erlang, Ruby, paleta, inglês, RPG, PL / SQL, ASP, Prolog, SmallTalk, Perl, bash, Wand BASIC, REXX, linguagem de lote do DOS.

Aqueles que se parecem com C, mas têm muito pouco em comum: JavaScript, Java, C #, (sem dúvida) Objective-C.

É tudo marketing, Java, C ++ e JavaScript meio que se parece com C, mas dificilmente poderia ser mais diferente nos bastidores.


5
"Eles não eram" - o que não eram o que? De qualquer forma, não vejo como isso responde à pergunta. É simplesmente uma lista de idiomas, juntamente com uma afirmação completamente infundada de que o marketing está de alguma forma envolvido.
David Richerby

2
"Alguns que não têm influência de C: Algol, Algol-68, ..." - Engraçado você deve dizer isso, já que C surgiu de Algol. "se você faz o idioma meio que se parecer com" C ", isso diminui a aparente barreira à entrada" - iirc, isso foi provado errado. Alunos sem exposição prévia à programação aprendem mais rápido com outras línguas (acho que usaram Haskell nesse estudo).
Raphael
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.