Todas as línguas são basicamente iguais?

39

Recentemente, eu tive que entender o design de um pequeno programa escrito em um idioma que eu não tinha idéia ( ABAP , se você deve saber). Eu poderia descobrir isso sem muita dificuldade.

Sei que dominar um novo idioma é um jogo completamente diferente, mas entender puramente a intenção do código (especificamente o código padrão de produção, que não é necessariamente complexo) em qualquer idioma é simples, se você já conhece alguns idiomas (de preferência um processual / OO e um funcional).

Isso geralmente é verdade? Todas as linguagens de programação são compostas de construções semelhantes, como loops, instruções condicionais e passagem de mensagens entre funções? Existem linguagens não esotéricas que um programador Java / Ruby / Haskell típico não seria capaz de entender? Todos os idiomas têm uma origem comum?

Anirudh
fonte
4
Vou direcioná-lo para Beating the Averages, de Paul Graham. Você pode ou não querer ler a coisa toda, mas, na parte relevante, procure o cabeçalho "The Blub Paradox". O Sr. Graham não pode se incomodar em colocar âncoras em sua parede de texto, então não posso vincular diretamente a ela.
kwatford
4
Os idiomas não têm origem comum. Mas todas as línguas tentam resolver algum problema. Eu acho que é um pouco análogo à linguagem falada. O objetivo é se expressar. Não posso dizer que é simples entender idiomas com base no conhecimento de 1 procedimento / OO / funcional. Eu não fiz isso, mas se eu fizesse essa pergunta, eu veria perl ou lisp com muitos colchetes e não seria capaz de dizer que conhecer 1 idioma de todos os tipos é suficiente.
28610 shahkalpesh #
1
Nesse caso: cálculo Lambda. Talvez não seja uma linguagem "real", mas é a mãe de todas as linguagens de programação em certo sentido. Certa vez, tive que implementar uma linguagem funcional para que ela fosse compilada em expressões lambda (que eram então diretamente interpretadas). Os resultados foram (para mim, pelo menos) ilegíveis, apesar de preservar todos os identificadores relevantes. Funções especialmente recursivas usando o combinador Y. A única maneira prática de descobrir o que algumas das expressões de exemplo fizeram foi avaliá-las manualmente. Coisas simples como fibonnaci e tipo de mesclagem eram ilegíveis.
Kwatford
2
Se você conhece idiomas funcionais, deve saber que loops não são possíveis em todos os idiomas.
jalf
Piet é bem diferente. :)

Respostas:

88

O básico da maioria das linguagens processuais é praticamente o mesmo.

Eles oferecem:

  • Tipos de dados escalares: geralmente booleanos, inteiros, flutuantes e caracteres
  • Tipos de dados compostos: matrizes (seqüências de caracteres são caso especial) e estruturas
  • Construções básicas de código: aritmética sobre escalares, acesso a matriz / estrutura, atribuições
  • Estruturas de controle simples: if-then, if-then-else, while, para loops
  • Pacotes de blocos de código: funções, procedimentos com parâmetros
  • Escopos: áreas nas quais identificadores têm significados específicos

Se você entende isso, tem uma boa compreensão de 90% das línguas do planeta. O que torna essas línguas um pouco mais difíceis de entender é a incrível variedade de sintaxe ímpar que as pessoas usam para dizer as mesmas coisas básicas. Alguns usam notação concisa envolvendo pontuação ímpar (APL sendo um extremo). Alguns usam muitas palavras-chave (COBOL é um excelente representante). Isso não importa muito. O que importa é se a linguagem é completa o suficiente por si só para executar tarefas complexas sem fazer com que você arranque os cabelos. (Tente codificar alguns hackers graves no script de shell do Windows DOS: ele é capaz de Turing, mas é muito ruim em tudo).

Oferta de linguagens procedurais mais interessantes

  • Escopos aninhados ou lexicais, namespaces
  • Ponteiros que permitem que uma entidade se refira a outra, com alocação dinâmica de armazenamento
  • Empacotamento de código relacionado: pacotes, objetos com métodos, características
  • Controle mais sofisticado: recursão, continuações, fechamentos
  • Operadores especializados: operações de string e array, funções matemáticas

Embora tecnicamente não seja uma propriedade do idioma, mas uma propriedade do ecossistema em que esses idiomas vivem, são as bibliotecas que são facilmente acessíveis ou fornecidas com o idioma como parte da ferramenta de desenvolvimento. Ter uma ampla variedade de recursos de bibliotecas simplifica / agiliza os aplicativos de gravação simplesmente porque não é necessário reinventar o que as bibliotecas fazem. Embora Java e C # sejam amplamente considerados boas linguagens por si só, o que os torna realmente úteis são as enormes bibliotecas que os acompanham e as bibliotecas de extensão facilmente obtidas.

As línguas que são mais difíceis de entender são as não processuais:

  • Linguagens puramente funcionais, sem atribuições ou efeitos colaterais
  • Linguagens lógicas, como Prolog, nas quais ocorrem computação e unificação simbólicas
  • Linguagens de correspondência de padrões, nas quais você especifica formas correspondentes ao problema e, muitas vezes, ações são acionadas por uma correspondência
  • Linguagens de restrição, que permitem especificar relações e resolver automaticamente equações
  • Linguagens de descrição de hardware, nas quais tudo é executado em paralelo
  • Linguagens específicas do domínio, como SQL, redes de Petri coloridas etc.

Existem dois estilos representacionais principais para idiomas:

  • Baseado em texto, no qual identificadores nomeiam entidades e fluxos de informações são codificados implicitamente em fórmulas que usam os identificadores para nomear as entidades (Java, APL, ...)
  • Gráfico, em que entidades são desenhadas como nós e as relações entre entidades são desenhadas como arcos explícitos entre esses nós (UML, Simulink, LabView)

As linguagens gráficas geralmente permitem sub-linguagens textuais como anotações em nós e arcos. Linguagens gráficas mais estranhas permitem recursivamente gráficos (com texto :) em nós e arcos. Linguagens gráficas realmente estranhas permitem que os gráficos de anotação apontem para os gráficos que estão sendo anotados.

A maioria dessas linguagens é baseada em um número muito pequeno de modelos de computação:

  • O cálculo lambda (base para Lisp e todas as linguagens funcionais)
  • Sistemas de postagem (ou técnicas de reescrita de string / árvore / gráfico)
  • Máquinas de Turing (modificação de estado e seleção de novas células de memória)

Dado o foco da maior parte da indústria em linguagens processuais e estruturas de controle complexas, você estará bem servido se aprender bem uma das linguagens mais interessantes desta categoria, especialmente se ela incluir algum tipo de orientação a objetos.

Eu recomendo o esquema de aprendizagem, em particular de um livro realmente maravilhoso: Estrutura e Interpretação de Programas de Computador . Isso descreve todos esses conceitos básicos. Se você conhece essas coisas, outros idiomas parecerão bem diretos, exceto pela sintaxe pateta.

Ira Baxter
fonte
3
Ótima resposta! Como acompanhamento (existe uma maneira de fazer uma pergunta de acompanhamento no SO?), Existe um idioma que eu poderia dominar e afirmar entender todos os conceitos em software de programação? Seria Lisp (ou um dialeto como Scheme)?
@Anirudh: Não há mecanismo formal de acompanhamento, mas você pode abrir uma nova pergunta. Se ele contiver uma justificativa e um link para essa pergunta, talvez nem seja fechado. ;) Para responder ao seu acompanhamento, acredito sinceramente que não existe apenas um idioma, pois os paradigmas são muito diferentes.
@ Anirudh: Concordo com John Y, não há apenas um. Mas se você é relativamente novo em campo, gaste energia considerável para dominar o paradigma processual (considero OO apenas uma especialização). Não faria mal procurar outros paradigmas (lógica, restrição, fluxo de dados) para ter uma noção de como eles funcionam, mas, para a maioria dos trabalhos industriais do dia-a-dia, as linguagens procedurais são praticamente o rei.
Ira Baxter
1
Assim como nas línguas naturais, "mais difícil de entender" é subjetivo e depende da primeira língua que você aprende.
NullUserException 10/09
1
@NullUserException: isso sugere que você escolha seu primeiro idioma com cuidado, para maximizar a facilidade de entender os outros. Esse é o objetivo do Scheme, e em particular o livro do SICP.
Ira Baxter
6

Linguagens de descrição de hardware são linguagens de programação, mas são conceitualmente muito diferentes. Experimente o VHDL ou Verilog para obter o tamanho. Eles são comuns para a programação de FPGAs. (Ok, então eles não são processadores, mas são dispositivos de computação de uso geral. E isso deve ser considerado um hardware válido para tópicos de ciência da computação.) Você precisa explicitamente fazer as coisas acontecerem em série. É um modelo completamente diferente. Você pensa nas coisas que ocorrem paralelamente como regra, não como exceção. Para loops no verilog, expanda para hardware paralelo. Portanto, o comportamento "esperado" pode não ser o que você espera.

NoMoreZealots
fonte
Este é um bom ponto. Vou procurar Verilog / VHDL.
Eu sempre pensei que as linguagens de programação convencionais eram apenas maneiras muito ruins de codificar programas que eram naturalmente paralelos, como o VHDL. Quando você começa como designer de hardware, esse pouco de tudo o que ocorre de maneira serial parece incrivelmente desajeitado. (Estamos ensinando os idiomas de programação errados para as pessoas como seu primeiro idioma: deve ser o Verilog!).
Ira Baxter
4

Depende do que você quer dizer com "basicamente". Todos os idiomas de qualquer flexibilidade são completos em Turing. Nesse sentido: sim, todos são basicamente iguais.

Em um nível baixo, todos eles executam sequências de operações semelhantes e todos os itens do Windows, Linux e OS X (recentes) são executados em processadores compatíveis com Intel, usando os mesmos conjuntos de instruções. Dessa forma, eles também são basicamente os mesmos.

Percebo que você meio que definiu "basicamente" em sua pergunta, mas, para realmente responder, essa definição terá que ser muito mais refinada. De muitas maneiras, eles são todos iguais. De muitas maneiras, eles são distintos. É muito fácil dizer "depende". Se você for um dos extremos, a pergunta provavelmente não responderá ao que você pretende, portanto, para onde a linha é traçada é crucial para responder à sua pergunta como você pretende.

Dinah
fonte
3

Eu diria que uma linguagem codifica significado. Se o significado tiver algum sentido em algum contexto, todas as línguas que possam expressar o significado poderão ser consideradas equivalentes limitadas pelo significado e pelo contexto.

Se você limitar esse contexto a uma máquina Von Neumann padrão, pode-se dizer que os significados computacionais de mudança de memória e computação em uma CPU são a origem - e possivelmente o único significado que todas as línguas têm em comum. Todas as outras coisas são abstrações construídas sobre elas.

Preet Sangha
fonte
1
John von Neumann. E NÃO é pronunciado como "newman", mais como "noyman".
Obrigado pela correção - eu pronuncio é como você disse.
Preet Sangha
Quando alguém sugere uma correção, basta editar sua postagem para refleti-la.
Phil Miller
2

Linguagens de programação também são ferramentas para pensar. Com outra perspectiva de pensamento, alguns problemas desaparecem ou são transformados para tipos diferentes e mais gerenciáveis ​​(por exemplo, muitos padrões de design no estilo C ++ simplesmente desaparecem quando você está pensando no Lisp (veja, por exemplo, a apresentação de Peter Norvik ) e Erlang o libera de pensar de alguma simultaneidade de baixo nível ou construções de computação distribuída e permite que você se concentre apenas na lógica do aplicativo).

Note, no entanto, que às vezes os "novos" paradigmas podem ser parcialmente aplicados a linguagens de programação "antigas", o que explica por que, por exemplo, temos livros ensinando programação funcional para programadores Java . Mas apoiar e integrar nativamente um paradigma mais poderoso no nível da linguagem permite uma aplicação mais natural do paradigma (e, consequentemente, torna impossível entender os programas em uma linguagem que suporte paradigmas desconhecidos, como sugerido por outras respostas - @Ira Baxter listando linguagens não processuais e @kwatford se referindo a Paul Graham ).

FooF
fonte
2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

No nível mais baixo, toda linguagem de programação é a "mesma", mas isso não significa que elas sejam as mesmas no nível em que você realmente interage. Eles abstraem problemas para você; isso não significa que eles abstraem os mesmos problemas ou que abstraem cada problema da mesma maneira.

asthasr
fonte
1

Os idiomas maduros geralmente têm alguns objetivos e fazem trocas onde sacrificam uma coisa por outra. Uma linguagem de uso geral pode ser usada para qualquer coisa, mas nenhuma linguagem pode se destacar em todas as áreas. Alguns exemplos:

C tenta ser uma linguagem de programação de sistemas ideal. Para isso, sacrifica a legibilidade e a segurança para controle e velocidade de baixo nível.

O Python pretende ser uma linguagem de script ideal. Para isso, sacrifica velocidade e verificabilidade por produtividade e portabilidade.

Haskell tenta ser uma linguagem segura e matematicamente pura. Para esse fim, sacrifica a capacidade de aprendizagem e as convenções por verificabilidade e confiabilidade.

Esses sacrifícios e benefícios fazem uma enorme diferença no idioma. Sim, a maioria das linguagens de programação pode ser usada para qualquer coisa que possa ser feita por um computador, mas nenhuma dessas mesmas linguagens deve ser usada para tudo. Todos os idiomas acima são aqueles que eu escolheria para determinadas tarefas, mas não para outras. Se eu estivesse programando um sistema operacional, escolheria C. Se estivesse escrevendo um back-end para um site, usaria o Python. E se eu estivesse escrevendo um sistema financeiro, usaria Haskell.

No final, sua escolha como programador é qual é a ferramenta certa para o trabalho.

Imagist
fonte