Todas as linguagens são basicamente iguais?

38

Recentemente, 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 sem muita dificuldade.

Eu percebo que dominar uma nova linguagem é um jogo completamente diferente, mas entender 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 (preferencialmente um procedural / 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 típico de Java / Ruby / Haskell não seria capaz de fazer sentido? Todos os idiomas têm uma origem comum?

    
por Anirudh 28.07.2009 / 04:49
fonte

7 respostas

87

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

Eles oferecem:

  • Tipos de dados escalares: geralmente booleano, inteiros, flutuantes e caracteres
  • Tipos de dados compostos: matrizes (cadeias são casos especiais) 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, for loops
  • Pacotes de blocos de código: funções, procedimentos com parâmetros
  • Escopos: áreas nas quais os identificadores têm significados específicos

Se você entende isso, você tem uma boa compreensão de 90% dos idiomas do planeta. O que torna essas linguagens um pouco mais difíceis de entender é a incrível variedade de sintaxe estranha 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 fazer tarefas complexas sem causar rasgos no cabelo. (Tente codificar alguns hacks graves no script de shell do Windows: ele é capaz de Turing, mas é muito ruim em tudo).

Mais linguagens procedurais interessantes oferecem

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

Embora não seja tecnicamente uma propriedade do langauge, mas uma propriedade do ecossistema no qual esses idiomas residem, estã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 biblioteca simplifica / acelera a gravação de aplicativos simplesmente porque não é necessário reinventar o que as bibliotecas fazem. Embora Java e C # sejam amplamente considerados bons idiomas por si mesmos, o que os torna realmente úteis são as enormes bibliotecas que os acompanham e as bibliotecas de extensão facilmente obtidas.

As linguagens 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 a computação simbólica e a unificação ocorrem
  • Idiomas de correspondência de padrões, nos quais você especifica formas que correspondem ao problema e, geralmente, ações são acionadas por uma correspondência
  • Linguagens de restrição, que permitem especificar relações e resolver automaticamente equações
  • Idiomas de descrição de hardware, nos quais tudo é executado em paralelo
  • Idiomas específicos do domínio, como SQL, Redes de Petri coloridas, etc.

Existem dois estilos principais de representação para idiomas:

  • Baseado em texto, em que entidades de nomes de identificadores e fluxos de informações são codificados implicitamente em fórmulas que usam os identificadores para nomear as entidades (Java, APL, ...)
  • Gráfica, na qual as 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 sublínguas textuais como anotações em nós e em arcos. Linguagens gráficas mais estranhas permitem recursivamente gráficos (com texto :) em nós e em 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 o Lisp e todas as linguagens funcionais)
  • Sistemas de postagem (ou técnicas de reconfiguração de sequência / á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 maioria das indústrias em linguagens procedurais e estruturas de controle complexas, você está bem servido se aprender uma das linguagens mais interessantes nesta categoria, especialmente se incluir algum tipo de orientação a objetos.

Eu recomendo altamente aprender Scheme, em especial 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, outras linguagens parecerão bem simples, exceto pela sintaxe pateta.

    
por 28.07.2009 / 05:02
fonte
6

As linguagens de descrição de hardware são linguagens de programação, mas são conceitualmente muito diferentes. Tente VHDL ou Verilog em tamanho. Eles são comuns para programar FPGAs. (Ok, então eles não são processadores, mas são dispositivos de computação de uso geral. E tal deve ser considerado um hardware válido para tópicos de ciência da computação.) Você precisa explicitamente fazer com que as coisas ocorram em série. É um modelo completamente diferente. Você pensa em coisas ocorrendo em paralelo como regra e não como exceção. Para loops em verilog expandir em hardware paralelo. Assim, o comportamento "esperado" pode não ser o esperado.

    
por 28.07.2009 / 05:02
fonte
4

Depende do que você quer dizer com "basicamente". Todas as linguagens de qualquer flexibilidade são completas. Nesse sentido: sim, eles são basicamente os mesmos.

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

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

    
por 28.07.2009 / 05:50
fonte
3

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

Se você limitar esse contexto a uma máquina Von Neumann padrão, os significados computacionais de alterar a memória e a computação em uma CPU podem ser considerados como a origem - e possivelmente o único significado que todas as linguagens têm em comum. Todas as outras coisas são abstrações baseadas nelas.

    
por 02.07.2012 / 12:06
fonte
2

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

Note, no entanto, que às vezes os "novos" paradigmas podem ser parcialmente aplicados a linguagens de programação "antigas", o que explica por que temos, por exemplo, 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 programas em uma linguagem que suporta paradigma desconhecido, como sugerido por outras respostas - @Ira Baxter listando linguagens não procedurais e @kwatford referindo-se a Paul Graham .

    
por 29.06.2012 / 09:52
fonte
2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

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

    
por 02.07.2012 / 13:55
fonte
1

Os idiomas maduros geralmente têm poucos objetivos, e eles fazem concessões onde sacrificam uma coisa pela outra. Uma linguagem de propósito geral pode ser usada para qualquer coisa, mas nenhuma linguagem pode se sobressair em todas as áreas. Alguns exemplos:

C tenta ser uma linguagem de programação de sistemas ideal. Para este fim, 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 este fim, sacrifica a velocidade e a verificabilidade para produtividade e portabilidade.

Haskell tenta ser uma linguagem segura e matematicamente pura. Para esse fim, sacrifica a capacidade de aprendizado e a convenção quanto à verificabilidade e confiabilidade.

Esses sacrifícios e benefícios fazem uma diferença enorme na linguagem. 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 outros. Se eu estivesse programando um sistema operacional, escolheria o C. Se eu estivesse escrevendo um back-end para um site, usaria o Python. E se eu estivesse escrevendo um sistema financeiro, usaria o Haskell.

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

    
por 13.08.2009 / 05:28
fonte