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.
Respostas:
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!
fonte
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
fonte
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;)
fonte
C
Há 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.
fonte
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
fonte
Estou surpreso que, após 6 meses e centenas de votos, ninguém tenha mencionado o SQL ...
fonte
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:
é 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!
fonte
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).
fonte
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.
fonte
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:
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.)
fonte
Você aprendeu muitas línguas. Agora é a hora de focar em um idioma e dominá-lo.
fonte
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
fonte
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.
fonte
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.
fonte
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)
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
Há também anic :
https://code.google.com/p/anic/
Do seu site:
Não parece mais estar em desenvolvimento ativo, mas parece ter alguns conceitos interessantes (e que, afinal, é o que você parece estar procurando).
fonte
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.
fonte
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.
fonte
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.
fonte