Quais são as línguas importantes para aprender a entender diferentes abordagens e conceitos? [fechadas]


172

Quando tudo que você tem é um par de alicates e uma garrafa de vodka, tudo se parece com a fechadura na porta da casa de barcos de Wolf Blitzer. (Substitua isso por um martelo e um prego, se você não ler xkcd)

Atualmente, programo Clojure, Python, Java e PHP, por isso estou familiarizado com a sintaxe C e LISP, bem como com o espaço em branco. Conheço sistemas imperativos, funcionais, imutáveis, POO e alguns tipos e outras coisas. Agora eu quero mais!

Quais são os idiomas que adotam uma abordagem diferente e que seriam úteis para a escolha prática de ferramentas ou para o entendimento teórico?

Não sinto vontade de aprender outra linguagem funcional (Haskell) ou outra linguagem imperativa OOP (Ruby), nem quero praticar linguagens divertidas e práticas como Brainfuck.

Uma coisa muito interessante que me vi são linguagens monoicônicas baseadas em pilha como o Factor.

Somente quando sinto que entendo a maioria dos conceitos e tenho respostas para todas as minhas perguntas, quero começar a pensar na minha própria linguagem de brinquedos para conter todas as minhas preferências pessoais.


3
Eu +1 para referência xkcd sozinho, mas a pergunta também é interessante.

63
Você parece ser um programador de sucesso, o resto é incremental. Não tentando ser um idiota, mas ... como é a sua vida em termos financeiros, relacionamentos, saúde, diversão, diversão e hobby? Talvez agora seja a hora de buscar algumas dessas coisas. Não acredito que você precise conhecer mais de uma dúzia de idiomas ao mesmo tempo. Se você é pago para usar um - aprenda. Se você quiser escrever um livro sobre um - aprenda. Fora isso, você tem uma boa base de programação. Por que aprender algo (como J - minha opinião subjetiva :)) que você não usará seriamente (leia make $) em qualquer lugar? Não seja o hacker mais legal do cemitério.
Hamish Grubijan 18/10/10

6
Sim, sou um programador de sucesso de acordo com meus próprios padrões. Atualmente, não ganho muito dinheiro, mas tenho 19 anos. Investi tempo em todos esses pontos e muito mais, mas acho o hobby e a diversão em programação. Eu também quero dizer que há uma diferença entre entender um idioma e dominá-lo. Dominar Python e Clojure é suficiente para mim. Eu quero entender as outras opções, porque ele melhorará meu código, ajudará a entender meu computador e a definir minha própria linguagem de programação.
Pepijn

5
Você já viu Programmers.SE ? Isso se enquadra no tipo de pergunta mais bem feita lá.

Respostas:


287

As questões de praticidade são altamente subjetivas, portanto, direi simplesmente que aprender diferentes paradigmas de linguagem servirá apenas para torná-lo um programador melhor. O que é mais prático que isso?

Funcional, Haskell - Eu sei que você disse que não queria, mas deveria realmente reconsiderar. Você conseguiu alguma exposição funcional com o Clojure e até o Python, mas não a experimentou ao máximo sem Haskell. Se você é realmente contra Haskell, bons compromissos são ML ou OCaml.

Declarative, Datalog - Muitas pessoas recomendariam o Prolog neste slot, mas acho que o Datalog é um exemplo mais limpo de uma linguagem declarativa.

Matriz, J - Acabei de descobrir J, mas acho que é uma linguagem impressionante. Isso transformará sua mente em um pretzel. Você agradecerá a J por isso.

Stack, Factor / Forth - Factor é muito poderoso e pretendo cavar nele o mais rápido possível. Quarto é o avô das linguagens Stack e, como um bônus adicional, é simples de se implementar . Há algo a ser dito sobre o aprendizado através da implementação.

Dataflow, Oz - Eu acho que a influência de Oz está na alta e só continuará a crescer no futuro.

JavaScript / Io / Self - Self baseado em protótipo é o avô e altamente influente em todas as linguagens baseadas em protótipo. Isso não é o mesmo que OOP baseado em classe e não deve ser tratado como tal. Muitas pessoas chegam a uma linguagem de protótipo e criam um sistema de classes ad-hoc, mas se seu objetivo é expandir sua mente, acho que é um erro. Use o idioma em sua capacidade total. Leia Organizar programas sem classes para obter idéias.

Sistema especialista, CLIPS - eu sempre recomendo isso. Se você conhece o Prolog, provavelmente terá a vantagem de acelerar, mas é um idioma muito diferente.

Frink - Frink é uma linguagem de uso geral, mas é famosa por seu sistema de conversões de unidades. Acho que essa linguagem é muito inspiradora em seu esforço incansável de ser a melhor no que faz. Além disso ... é realmente divertido!

Tipos funcionais + opcionais, Qi - Você diz ter experiência com alguns sistemas de tipos, mas você tem experiência com sistemas do tipo "skinnable *? Ninguém tem ... mas eles deveriam. O Qi é como Lisp de várias maneiras, mas é sistema de tipos vai explodir sua mente.

Atores + tolerância a falhas, Erlang - O modelo de processo de Erlang recebe muita atenção, mas seus mecanismos de tolerância a falhas e de troca de códigos quentes mudam o jogo. Você não aprenderá muito sobre FP que não aprenderia com o Clojure, mas seus recursos de FT farão você se perguntar por que mais idiomas parecem não conseguir fazer isso direito.

Aproveitar!


8
+1 - uma ótima resposta.
Duffymo 18/10/10

2
Obrigado por me indicar tantas línguas para aprender.

2
Eu adicionaria Erlang para programação baseada em ator e Fortress para coisas de programação paralela.
Nick16:

2
+1 para o hot swap de Erlang e o reconhecimento de tolerância a falhas
Mic

14
Nenhuma montagem? É bom entender como os processadores funcionam para aprender que tipo de código eles gostam.
Nick T

33

E quanto ao Prolog (para unificação / retorno etc), Smalltalk (para "tudo é uma mensagem"), Adiante (polimento reverso, intérpretes encadeados etc.), Esquema (continuações)?

Não é um idioma, mas a Arte do Metaobject Protocol é algo alucinante


Corrija-me se estiver errado, mas acho que o Python já faz continuações. E pelo que li, prefiro aprender Fator e Objetivo-C do que Forth e Smalltalk, mas posso estar cortando cantos por lá.
Pepijn

1
@pepijn, python não tem continuações de primeira classe (embora eu estou trabalhando em um hack bytecode que fingir)
aaronasterling

1
O Objective-C extrai do Smalltalk, mas acho que o verdadeiro argumento do ST é o dinamismo do próprio ambiente.
John

33

Eu segundo Haskell. Não pense "eu conheço um Lisp, então eu sei programação funcional". Já ouviu falar de classes de tipos? Tipos de dados algébricos? Mônadas? As linguagens funcionais "modernas" (com mais ou menos - pelo menos 50 anos;)), especialmente Haskell, exploraram uma infinidade de novos e úteis conceitos muito poderosos. As classes de tipo adicionam polimorfismo ad-hoc, mas a inferência de tipo (ainda outra coisa que os idiomas que você já conhece não tem) funciona como um encanto. Os tipos de dados algébricos são simplesmente incríveis, especialmente para modelar estruturas de dados semelhantes a árvores, mas também funcionam bem para enumerações ou registros simples. E mônadas ... bem, digamos que as pessoas as usem para fazer exceções, E / S, analisadores, compreensão de listas e muito mais - de maneiras puramente funcionais!

Além disso, todo o tópico é profundo o suficiente para manter alguém ocupado por anos;)


"Além disso, todo o tópico é profundo o suficiente para manter alguém ocupado por anos;)" - eu me pergunto, por que isso seria uma coisa boa? Afinal, nossas vidas são finitas.
vegai

1
@ vegai: Por que seria uma coisa ruim? Existem maneiras piores de passar a vida inteira do que aprender. E ninguém disse que você precisa estudar por anos apenas para usar o idioma corretamente - apenas que o tópico não se esgota após um curto período de tempo. (Além disso, observe o emoticon - essa parte não é totalmente sério.)

32

Atualmente, programo Clojure, Python, Java e PHP [...] Quais são as linguagens que adotam uma abordagem diferente e seriam úteis para a escolha prática de ferramentas ou para o entendimento teórico?

C

muito código C por aí --- é definitivamente prático. Se você também aprender C ++, há muito mais código por aí (e o salto é breve quando você conhece C e Java).

Também oferece a você (ou obriga a ter) uma grande compreensão de algumas questões teóricas; por exemplo, cada programa em execução vive em uma matriz de 4 GB de bytes, em algum sentido. Os ponteiros em C são realmente apenas índices nessa matriz - eles são apenas um tipo diferente de número inteiro. Não é diferente em Java, Python, PHP, exceto oculto sob uma camada de superfície.

Além disso, você pode escrever código orientado a objetos em C, você só precisa ser um pouco manual sobre vtables e tal. A coleção de quebra-cabeças portáteis de Simon Tatham é um ótimo exemplo de código C orientado a objetos bastante acessível; também é razoavelmente bem projetado e vale a pena ler para um programador iniciante / intermediário em C. É o que acontece também em Haskell - as classes de tipo são, em certo sentido, "apenas mais uma tabela".

Outra grande coisa sobre C: participar de perguntas e respostas com programadores qualificados em C oferece muitas respostas que explicam C em termos de construções de nível inferior, o que constrói sua base de conhecimento mais próxima do ferro.

Talvez eu esteja perdendo o argumento do OP - acho que estou, julgando pelas outras respostas -, mas acho que pode ser uma resposta útil para outras pessoas que têm uma pergunta semelhante e leem este tópico.


1
Isso precisa de mais votos. C é o idioma número um quando você precisa ou deseja ir direto ao ponto e entender o funcionamento da máquina - ou linguagens de programação de nível superior - desde o início. Além disso, também é muito universal, existem compiladores C para (quase) todas as arquiteturas de CPU já criadas.
dietr

27

No site de Peter Norvig:

"Aprenda pelo menos meia dúzia de linguagens de programação. Inclua uma linguagem que suporte abstrações de classe (como Java ou C ++), uma que suporte abstração funcional (como Lisp ou ML), uma que suporte abstração sintática (como Lisp), uma que suporte declarativa especificações (como modelos Prolog ou C ++), uma que suporte corotinas (como Icon ou Scheme) e outra que suporte paralelismo (como Sisal). "

http://norvig.com/21-days.html


13

Estou surpreso que, após 6 meses e centenas de votos, ninguém tenha mencionado o SQL ...


10

Nos tipos como teoremas / sistemas de tipos avançados: Coq (acho que a Agda também se enquadra nessa categoria).

Coq é um assistente de prova incorporado a uma linguagem de programação funcional.

Você pode escrever provas matemáticas e o Coq ajuda a criar uma solução. Você pode escrever funções e provar propriedades sobre isso.

Tem tipos dependentes, que soaram em minha mente. Um exemplo simples:

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

é a assinatura de uma função que concatena duas matrizes de tamanho nem dos elementos de A e retorna uma matriz de tamanho (n + m). Não será compilado se a função não retornar isso!

É baseado no cálculo de construções indutivas e tem uma sólida teoria por trás disso. Não sou inteligente o suficiente para entender tudo, mas acho que vale a pena dar uma olhada, especialmente se você se inclina para a teoria dos tipos.

Edição: Eu preciso mencionar: você escreve uma função em Coq e, em seguida, você pode provar que está correto para qualquer entrada, isso é incrível!


Eu segundo coq. Ao aprender a maioria dos idiomas, você ainda pode usar suas técnicas antigas, mas a coq obriga a escrever programas totais que sempre funcionam.
Bruno Martinez

Tentei aprender Coq no verão passado, mas desisti porque achei difícil encontrar uma boa documentação para aprender e usá- la. Alguma sugestão?

Eu aprendi em um curso na minha universidade e depois li "Coq'Art: O cálculo das construções indutivas" Não é o suficiente para realmente dominá-lo, mas o suficiente para apreciá-lo.
Bruno Martinez

6

Uma das línguas que estou interessado em ter um ponto muito de vista diferente (incluindo um novo vocabulário para definir os elementos de linguagem e uma sintaxe diff radical) é J . Haskell seria a escolha óbvia para mim, embora seja um lang funcional, porque seu sistema de tipos e outros recursos exclusivos abrem sua mente e fazem você repensar seu conhecimento anterior em programação (funcional).


5

Assim como o fogus sugeriu a você em sua lista, também aconselho a olhar para a linguagem OzML / Mozart Muitos paradigmas, principalmente direcionados à concorrência / programação multi-agente.

Em relação à simultaneidade e cálculo distribuído, o equivalente ao cálculo Lambda (que está por trás da programação funcional) é chamado de cálculo Pi.

Eu apenas comecei a examinar algumas implementações do cálculo Pi. Mas eles já ampliaram minhas concepções de computação.


5

A programação de fluxo de dados, também conhecida como programação baseada em fluxo, é um bom passo à frente na estrada. Algumas palavras-chave: processamento paralelo, prototipagem rápida, programação visual (não tão ruim quanto parece primeiro).

Os artigos da Wikipedia são bons:

Na ciência da computação, a programação baseada em fluxo (FBP) é um paradigma de programação que define aplicativos como redes de processos de "caixa preta", que trocam dados através de conexões predefinidas por transmissão de mensagens, onde as conexões são especificadas externamente aos processos. Esses processos de caixa preta podem ser reconectados infinitamente para formar aplicativos diferentes sem precisar ser alterado internamente. O FBP é, portanto, naturalmente orientado a componentes.

Leia o livro do JPM: http://jpaulmorrison.com/fbp/

(Escrevemos uma implementação simples em C ++ para fins de automação residencial e estamos muito felizes com isso. A documentação está em construção.)


+1, acredito que o fluxo de dados e a programação baseada em fluxo (possivelmente também programação reativa funcional) se tornará uma parte importante do nosso futuro multicore.

5

Você aprendeu muitas línguas. Agora é a hora de focar em um idioma e dominá-lo.


3

talvez você queira experimentar o LabView para sua programação visual, embora seja para fins de engenharia.

no entanto, você parece bastante interessado em tudo o que existe, daí a sugestão

Além disso, você pode tentar o appinventor do Android para criar coisas visualmente


O LabView tem uma 'sintaxe' engraçada, mas é muito difícil clicar e arrastar todo o seu código. Eu não recomendaria a um programador.
Ishtar

É isso que acompanha o Lego NXT, certo? Totalmente não funcionou para mim. Obrigado pela sugestão embora.
Pepijn

é da National Instruments. O LabVIEW é um ambiente de desenvolvimento gráfico que torna cientistas e engenheiros mais produtivos.
Belun 18/10/10

2

Bruce A. Tate, em uma página do The Pragmatic Programmer, escreveu um livro exatamente sobre isso: Sete idiomas em sete semanas: um guia pragmático para aprender idiomas de programação

No livro, ele aborda Clojure, Haskell, Io, Prolog, Scala, Erlang e Ruby.


2
Esteja avisado de que o livro está repleto de referências a filmes que aparentemente se tornaram parte da cultura pop dos EUA. Se você ainda não viu os filmes, ficará pensando no que Tate está falando. Se você assistiu aos filmes, ainda pode se deixar levar pela constante antropomorfização das linguagens de programação ou simplesmente não gostar dos personagens em questão (não gosto de Mary Poppins; por coincidência, também não gosto de Ruby, então a analogia pode estar ligado a algo).
Alan Plum

2

Mercúrio : http://www.mercury.csse.unimelb.edu.au/

É um Prolog digitado, com tipos e modos exclusivos (ou seja, especificar que o append(X,Y,Z)significado predicado X anexado a Y é Z produz um Z dado um X e Y, mas pode gerar vários X / Ys para um dado Z). Além disso, nenhum corte ou outros predicados extra-lógicos.

Se você quiser, é Prolog como Haskell é Lisp.


1
  1. A programação não cobre a tarefa dos programadores.
  2. Coisas novas são sempre interessantes, mas há coisas antigas muito legais.

O primeiro sistema de banco de dados foi o dBaseIII para mim, eu estava gastando cerca de um mês para escrever pequenos exemplos (o dBase / FoxPro / Clipper é um db baseado em tabela com índices). Então, no meu primeiro local de trabalho, conheci o MUMPS e fiquei com dor de cabeça. Eu era jovem e inteligente, mas demorou duas semanas para entender o modelo de banco de dados MUMPS. Houve um momento, como nos quadrinhos: depois de duas semanas, um botão foi ligado e a lâmpada acendeu em minha mente. O MUMPS é natural, de nível baixo e muito, muito, muito rápido. (É um btree desequilibrado e não-formatado, sem tipos.) As tendências de hoje mostram o caminho de volta: NoSQL, db de valor-chave, db multidimensional - portanto, restam apenas alguns passos e chegamos ao Mumps.

Aqui está uma apresentação sobre as vantagens do MUMPS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

Um pequeno documento sobre o banco de dados hierárquico: http://www.cs.pitt.edu/~chang/156/14hier.html

Uma introdução aos MUMPS globais (em MUMPS, variáveis ​​locais, short: locals são as variáveis ​​de memória e as variáveis ​​globais, short: globals são as "variáveis ​​db", definir uma variável global vai para o disco imediatamente): http: // gradvs1.mgateway.com/download/extreme1.pdf (PDF)


1

Digamos que você queira escrever um poema de amor ...

Em vez de usar um martelo só porque já existe um na sua mão, aprenda as ferramentas adequadas para a tarefa: aprenda a falar francês.

Depois de atingir o nível de fala quase nativa, você estará pronto para começar seu poema.


4
Obviamente, será um poema inútil, porque você precisa falar bem acima do nível nativo comum para escrever poesia. E sua namorada precisará aprender francês para lê-lo. A menos que ela já seja francesa, nesse caso, provavelmente a achará embaraçoso.
John Lawrence Aspden

Deliciosa ironia, John, eu gosto (eu sou francês, btw)
Vinzz

1

Enquanto aprender novos idiomas em nível acadêmico é um hobby interessante, IMHO você não pode realmente aprender a usar um até tentar aplicá-lo a um problema do mundo real. Portanto, em vez de procurar um novo idioma para aprender, primeiro procurei coisas novas para construir, e só então procuraria o idioma certo para esse projeto específico. Primeiro escolha o problema, depois a ferramenta, e não o contrário.


1

Para quem não existe desde meados dos anos 80, sugiro aprender o BASIC de 8 bits. É de nível muito baixo, muito primitivo e é um exercício interessante para programar em torno de seus buracos.

Na mesma linha, eu escolheria uma calculadora da série HP-41C (ou emulador, embora nada supere o hardware real). É difícil envolver seu cérebro, mas vale a pena. Uma TI-57 serve, mas será uma experiência completamente diferente. Se você conseguir resolver equações de segundo grau em uma TI-55, será considerado um mestre (não tinha condicionais nem ramificações, exceto um RST, que saltou o programa para a etapa 0).

E por último, eu escolheria QUARTA (foi mencionado antes). Ele tem uma ótima coisa Lisp-ish "construa seu idioma", mas é muito mais bare metal. Ele ensinará por que o Rails é interessante e quando as DSLs fazem sentido e você terá uma idéia do que sua calculadora não-RPN está pensando enquanto você digita.


1

PostScript. É uma linguagem bastante interessante, pois é baseada em pilhas, e é bastante prática quando você quer colocar as coisas no papel e quer fazê-las ou solucionar problemas por que não está sendo feito.

Erlang. O paralelismo intrínseco dá uma sensação bastante incomum e você pode novamente aprender coisas úteis com isso. Não tenho tanta certeza quanto à praticidade, mas pode ser útil para algumas tarefas rápidas de prototipagem e sistemas altamente redundantes.

Tente programar GPUs - CUDA ou OpenCL. São apenas extensões C / C ++, mas o modelo mental da arquitetura é novamente completamente diferente da abordagem clássica e definitivamente se torna prático quando você precisa realizar uma trituração de número real.


1

Erlang, Forth e alguns trabalhos incorporados com linguagem assembly. Realmente; compre um kit Arduino ou algo semelhante e crie um bipe polifônico na montagem. Você realmente aprenderá alguma coisa.


1

Há também anic :

https://code.google.com/p/anic/

Do seu site:

Mais rápido que C, mais seguro que Java, mais simples que * sh

anic é o compilador de implementação de referência para a ANI de linguagem de programação de fluxo geral de dados de uso geral experimental, de alto desempenho, implicitamente paralela e sem conflitos de conflito.

Não parece mais estar em desenvolvimento ativo, mas parece ter alguns conceitos interessantes (e que, afinal, é o que você parece estar procurando).


1

Embora não atenda à sua exigência de "diferente" - aposto que o Fantom é uma linguagem que um programador profissional deve considerar. Por sua própria admissão, os autores da fantom chamam de uma linguagem chata. Ele apenas reforça os casos de uso mais comuns de Java e C #, com algumas sintaxes de fechamento emprestadas de ruby ​​e linguagens mais recentes semelhantes.

E, no entanto, ele consegue ter seu próprio compilador de inicialização, fornece uma plataforma que possui uma queda na instalação sem dependências externas, acerta os pacotes - e funciona em Java, C # e agora na Web (via js).

Pode não ampliar seus horizontes em termos de novas formas de programação, mas certamente mostrará melhores formas de programação.


1

Uma coisa que vejo faltando nas outras respostas: idiomas baseados na reescrita de termos.

Você pode dar uma olhada no Pure - http://code.google.com/p/pure-lang/ .

O Mathematica também é baseado em reescrita, embora não seja tão fácil descobrir o que está acontecendo, pois é bastante fechado.


0

APL, Forth e Assembly.

Se divirta. Pegue um kit de robô Lego Mindstorm e o RobotC da CMU e escreva um código de robótica. As coisas acontecem quando você escreve um código que precisa "sujar" e interage com o mundo real que você não pode aprender de outra maneira. Sim, a mesma linguagem, mas com uma perspectiva muito diferente.

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.