Basicamente, quero aprender muitas linguagens de programação para me tornar um ótimo programador. Eu sei apenas um pouco de profundidade e esperava que alguém pudesse elaborar quantas classes ou tipos de linguagens de programação existem . Por exemplo, como você os agruparia se tivesse que aprendê-los em grupos.
Vindo de Java, estou familiarizado com a digitação estática, mas sei que, além da digitação dinâmica, deve haver uma variedade tão grande de idiomas disponíveis que eu adoraria ver uma quebra de categoria, se possível.
Respostas:
Depende de como você deseja classificar os idiomas. Fundamentalmente, os idiomas podem ser divididos em dois tipos: idiomas imperativos nos quais você instrui o computador como executar uma tarefa e idiomas declarativos nos quais você diz ao computador o que fazer. Linguagens declarativas podem ainda ser divididas em linguagens funcionais , nas quais um programa é construído através da composição de funções e lógica.linguagens de programação, nas quais um programa é construído através de um conjunto de conexões lógicas. Linguagens imperativas parecem mais uma lista de etapas para solucionar um problema, mais ou menos como uma receita. Linguagens imperativas incluem C, C ++ e Java; linguagens funcionais incluem Haskell; linguagens de programação lógica incluem o Prolog.
Às vezes, linguagens imperativas são divididas em dois subgrupos: linguagens procedurais como C e linguagens orientadas a objetos . As linguagens orientadas a objetos são um pouco ortogonais aos agrupamentos, no entanto, como existem linguagens funcionais orientadas a objetos (exemplos de OCaml e Scala).
Você também pode agrupar idiomas digitando: estático e dinâmico . Linguagens de tipo estático são aquelas nas quais a digitação é marcada (e geralmente aplicada) antes da execução do programa (geralmente durante uma fase de compilação); linguagens de tipo dinâmico adiam a verificação de tipo para o tempo de execução. C, C ++ e Java são linguagens de tipo estaticamente; Python, Ruby, JavaScript e Objective-C são linguagens de tipo dinâmico. Existem também linguagens não tipadas , que incluem a linguagem de programação Forth.
Você também pode agrupar idiomas de acordo com a disciplina de digitação : digitação fraca , que suporta conversões de tipo implícitas, e digitação forte , que proíbe conversões de tipo implícitas. As linhas entre os dois são um pouco embaçadas: de acordo com algumas definições, C é uma linguagem de tipo fraco, enquanto outros consideram que é de tipo forte. A disciplina de digitação não é realmente uma maneira útil de agrupar idiomas, de qualquer maneira.
fonte
Estes são os principais, mas existem muitos outros paradigmas por aí, e há muita sobreposição entre eles.
fonte
Para tipos de linguagens de programação (Paradigms), consulte aqui:
http://en.wikipedia.org/wiki/Programming_paradigm
Para outras características das linguagens de programação (por exemplo, sistemas de tipos), consulte aqui: http://en.wikipedia.org/wiki/Programming_language
fonte
Clique na imagem para ver o PDF.
Você deve consultar Paradigmas de programação para manequins: o que todo programador deve saber, de Peter Van Roy. Isso lhe dará uma visão geral de como está acontecendo lá fora.
Se você quiser ir além, pode ler Conceitos, Técnicas e Modelos de Programação por Computador . Você não aprenderá uma série de idiomas dessa maneira, mas aprenderá paradigmas que estão por trás de diferentes tipos de idiomas. Portanto, aprender um novo idioma será mais fácil para você.
fonte
Procedural: Montagem, Java, C #, F #, Lisp, Fortran.
Conjunto baseado: SQL.
Baseado em padrões: Perl, Regex, Snobol.
Baseado em árvore: XSLT.
Baseado em matriz: APL.
fonte
Existem diferentes maneiras de responder a isso, mas em termos eles podem ser categorizados como:
Linguagem de máquina: a linguagem de máquina é uma linguagem de programação de baixo nível. É facilmente compreendido pelos computadores, mas difícil de ler pelas pessoas. É por isso que as pessoas usam linguagens de programação de nível superior. Os programas escritos em linguagens de alto nível também são compilados e / ou interpretados na linguagem de máquina para que os computadores possam executá-los.
Linguagem de montagem: a linguagem de montagem é uma representação da linguagem de máquina. Em outras palavras, cada instrução de idioma de montagem se traduz em uma instrução de idioma de máquina. Embora as instruções da linguagem assembly sejam legíveis, elas ainda são de baixo nível. Uma desvantagem da linguagem assembly é que ela não é portátil, porque cada plataforma vem com uma linguagem assembly específica.
Linguagem de alto nível: as linguagens de alto nível são o que a maioria dos programadores usa atualmente. Idiomas como C, C ++ e Java são todos de alto nível. As vantagens das linguagens de alto nível são que elas são muito legíveis e portáteis. Uma desvantagem das linguagens de alto nível é que elas são menos poderosas que as linguagens de montagem. Como uma única declaração em um idioma de alto nível é traduzida em várias declarações de linguagem de máquina.
Os idiomas de alto nível podem ainda ser classificados como:
Idiomas funcionais: no idioma funcional, um programa é dividido em definições de funções. Linguagens funcionais são um tipo de linguagem declarativa. Eles são baseados principalmente no cálculo lambda digitado com constantes. Algumas das famosas linguagens de funções são Scala, F #, Clojure e Lisp.
Linguagens procedurais: nas linguagens processuais, um programa é escrito em uma sequência de etapas que devem ser seguidas para produzir um resultado. COBOL, FORTRAN e C são algumas linguagens processuais.
Linguagens de programação orientada a objetos: Nas linguagens OOP, um programa é dividido em Objetos que contêm dados, bem como métodos que operam nos dados. Java, C # e C ++ são linguagens OOP.
Idiomas de programação lógica: os idiomas lógicos são usados para criar programas que permitem ao computador raciocinar logicamente. por exemplo: idioma lógico
Para um estudo aprofundado, confira:
fonte
Costumo pensar em termos de recursos:
Sintaxe:
Baseado em C ou o que você tem. Java tem uma sintaxe baseada em C. Eu recomendo experimentar algo como Python ou Ruby para tirar sua cabeça da sintaxe e pensar mais em termos de fundamentos de como uma determinada linguagem funciona. Sou da opinião de que nenhuma sintaxe precisa ser mais volumosa que a baseada em C e não tem nenhum problema em criar blocos em torno do espaço em branco.
Compilado vs. interpretado Processo de compilação vs. Interpretado / console:
Tenho muito pouca familiaridade com as preocupações com o tempo de compilação versus o ambiente de tempo de execução, mas percebo que há uma série de preocupações lá em que raramente penso.
Da mesma forma, existem muitas linguagens interpretadas que ainda possuem um processo de compilação para executar dentro de uma máquina virtual, como o Java. Você ainda precisa reconstruir para ver mudanças nas coisas.
E há JavaScript e Python que você pode executar em tempo real, comando por comando em um console em um ambiente ativo. Todos os três podem levar a maneiras muito diferentes de escrever código.
Digitação dinâmica vs. estrita:
Costumo ver os dois como trocas de design. Quando você está em um nível muito mais baixo e o desempenho é crítico, a digitação estática faz muito sentido. Eu nunca entendi essa noção de que um é "mais seguro" do que outro, mas de alguma forma me deparei com uma linguagem plástica / dinâmica, onde você aprende como o sistema de digitação funciona e o que esperar, basicamente. As travessuras de tipo raramente são uma preocupação para mim em JS. De certa forma, a flexibilidade pode tornar as coisas mais robustas, embora seja um toque mais arcano para um desenvolvedor de nível mais Jr., se você não conhece alguns dos buracos na língua.
Escopo em nível de bloco vs. escopo de função vs.?:
O nível de bloco é o mais comum (qualquer coisa entre {} na maioria das linguagens de sintaxe baseadas em c). O escopo do JavaScript é construído em torno de funções (que também são usadas para criar objetos de maneira tão eficaz). Há também uma grande variação no tipo de acesso que você tem do escopo interno para o escopo externo. Não estou familiarizado com outros esquemas de escopo, mas tenho certeza de que eles existem.
POO clássico vs. PO prototípico vs Quase POO (estruturas em C?) Vs Não POO:
Mesmo no OOP baseado em classe, há muito espaço para variação. Se você pode fazer herança múltipla (ew, muito em excesso, ew), definir interfaces, etc ...
Em JavaScript, temos uma espécie de OOP protótipo híbrido atrofiado, em que os objetos são consideravelmente mais simples, altamente mutáveis, mas ainda temos a capacidade de separar a interface das preocupações internas, que IMO é o aspecto importante do encapsulamento.
A questão do POO é que realmente existem muitas coisas que você pode realizar que são essencialmente orientadas para o POO, sem ser tecnicamente OOP. É claro que existem puristas, mas no final do dia, os Padrões de Design buscam certas abstrações que funcionam bem em determinadas situações. Não seja rápido demais para assumir que as idéias de uma linguagem baseada em OOP não têm utilidade em algo mais orientado a procedimentos. E eu não estou falando sobre JavaScript. Não é de todo limitado por sua versão pateta de um paradigma OOP baseado em protótipo.
Funções de primeira classe:
Não tê-los em um idioma é uma coisa difícil para eu desistir. Você pode transmitir funções como se fossem dados para uso em outros contextos. Isso torna os esquemas de manipulação de eventos em particular muito fáceis de implementar, mas também facilita a adaptação do idioma para que funcione da maneira que você deseja. É, mais do que qualquer coisa que eu suspeito, a coisa que fez do JavaScript o sucesso final, apesar de ter sido projetado em duas semanas e de ter a sintaxe aproximada de Java aplicada como um esquema de marketing.
Encerramentos:
Não sei ao certo onde está o debate sobre o Java, mas sei que muitos desenvolvedores de Java estavam clamando por esse recurso há um ou dois anos. Em uma linguagem sem fechamento, quando uma função é fechada, qualquer coisa que seja capaz de referenciar coisas de dentro dessa função não poderá acessá-lo porque foi coletada de lixo. Em um fechamento, o contexto de execução é vinculado de tal forma que, se você é capaz de referenciar coisas dentro dessa função fechada de outro escopo, como em um objeto ou função retornado, basicamente obtém esses vars como estavam quando a função foi fechada. É como bater com o pé na porta da coleta de lixo, embora eu suspeite que tenha sido implementado mais como cópias desses vars transformados em vars locais da entidade de referência.
Rígido / Rigoroso / Seguro vs. Dando a Você Toda a Corda que Você Quer:
Devs JS e Java devs tendem a não se entender e acho que tem muito a ver com as duas linguagens que caem em lados quase opostos desse espectro de design específico. Não quero que você me proteja de mim ou dos outros desenvolvedores da minha equipe. Quero fazer muito mais em muito menos código e fazer tudo de maneiras muito diferentes (mas consistentes para um determinado domínio), dependendo da situação. Há absolutamente trocas entre os dois e muitos idiomas tendem a cair mais no meio.
fonte
Eu acho que um atalho para tudo isso é aprender Lisp suficiente para fazer algumas coisas semi-úteis. A maioria desses paradigmas começou como maneiras de usar o Lisp, por isso é uma maneira simples de tentar as coisas.
Existem vários "tipos" de idiomas por aí, mas os novos sempre podem aparecer. Basicamente, o objetivo de uma linguagem é permitir a codificação de idéias, conceitos ou requisitos, o mais diretamente possível. Para esse fim, pode haver situações em que os paradigmas existentes estão em falta, e um novo pode ser necessário.
Uma maneira de olhar é em termos de estrutura da superfície. O quão diretamente ele permite que você codifique idéias de forma concisa, para que, se você mudar de idéia sobre o que deseja, a alteração correspondente no código também seja fácil, com poucas chances de introduzir bugs.
Outra maneira de ver isso é em termos de estrutura de controle. Quando o idioma é executado (se for), qual é a ordem na qual as coisas acontecem, para realizar o que você deseja? Exemplos são: execução direta simples, recursão, retorno, paralelismo. Um que eu (tosse modesta) descobri foi a execução diferencial .
Outro ponto de vista útil é que sempre que uma estrutura de dados é projetada, uma linguagem nasce. Os dados são "executados" pelos programas aplicativos que os vasculham e fazem coisas, assim como um programa é apenas um conjunto de dados (como códigos de bytes) que são usados por um intérprete para fazer as coisas.
fonte
Eu tenho que acrescentar que existem linguagens de programação para aplicativos específicos. O que vem à mente é o APT (Automatic Programmed Tool), uma linguagem usada na fabricação de máquinas-ferramentas.
fonte