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?
fonte
Respostas:
O básico da maioria das linguagens processuais é praticamente o mesmo.
Eles oferecem:
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
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:
Existem dois estilos representacionais principais para idiomas:
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:
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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 ).
fonte
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.
fonte
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.
fonte