Quantos tipos de linguagens de programação existem? [fechadas]

30

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.

sova
fonte
2
Não seria melhor dizer "Que tipo ..." em vez de quantos?
Amir Rezaei
Bem, eu aprendi que algo como Prolog e C são fundamentalmente diferentes, então eu estava pensando que cada um deles corresponde a um tipo diferente de linguagem de programação e esperava ter uma idéia de quantos tipos.
sova
7
2: o tipo que faz o que você quer e do tipo que não faz
Matt Ellen
1
Aprender sobre diferentes tipos de linguagens de programação é absolutamente construtivo ! Você poderia argumentar que isso deve ser encerrado como uma duplicata, mas acho que são perguntas distintas o suficiente para permanecerem separadas.
Peter Boughton #
1
@Sova, eu recomendo fazer sua primeira escolha de novos idiomas para experimentar algo que não usa sintaxe baseada em c. Isso concentrará sua atenção em como funciona e em como é diferente daquele que você conhece melhor.
Erik Reppen

Respostas:

73

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.

mipadi
fonte
1
Iria colocar algo semelhante, mas adicionará +1 e adicionará comentários. Cada categoria ou combinação também possui numerosos spin-offs criados com foco em elementos específicos. OOP, por exemplo, gera: OOP baseado em protótipo, programação orientada a aspectos, programação baseada em componentes e assim por diante. Os paradigmas funcionais também têm spin-offs, como linguagens em que um processo ou encadeamento assíncrono é a unidade base e o programa é programado compondo processos paralelos juntos.
CodexArcanum
Como as linguagens de script, por exemplo, VBScript, se encaixam nisso? Pode ser um pouco processual e um pouco OO, pois é possível criar vários tipos, então isso o tornaria um híbrido?
JB King
Era exatamente isso que eu estava procurando. Muito obrigado.
sova
3
As linguagens @JB King OOP geralmente são processuais, pelo menos dentro dos órgãos do método. Além disso, é um equívoco comum que OOP significa "objetos". Muitos idiomas têm tipos de dados e objetos. Há muito debate sobre qual é a definição exata de OOP, mas geralmente inclui herança e / ou encapsulamento (estado privado) como temas principais. Um idioma sem qualquer um de alguma forma seria difícil de classificar como um idioma OOP.
CodexArcanum
2
@sova Só consigo pensar em dois idiomas que funcionam dessa maneira. Erlang baseia-se fortemente no processamento paralelo, mas se você quiser mais do que eu estava falando exatamente, deve consultar o C # polifônico. É uma linguagem de pesquisa (agora dobrada em C-ômega) baseada no Pi-Calculus (como a FP é baseada no lambda calc) O Pi-calc é baseado na unidade de um processo e você declara processos e uma combinação de síncrona e asych chama para eles. Veja também Arrows no FP, especialmente Haskell. As setas são muito parecidas com isso.
CodexArcanum
12
  • Montagem
  • Procedural
    • Basic
    • C
  • Orientado a Objeto
    • C #
    • Java
  • Declarativo
    • Prolog
    • SQL
  • Funcional
    • Lisp
    • Haskell

Estes são os principais, mas existem muitos outros paradigmas por aí, e há muita sobreposição entre eles.


fonte
Que tal declarativo (por exemplo, Prolog, SQL)?
Bruce Alderman
@ Bruce, peguei eles agora.
Sim, essa foi a ideia geral que aprendi em algum lugar ao longo do caminho.
Sevenseacat 03/08/2012
6
A montagem não deve ser considerada processual?
precisa saber é o seguinte
2
E quanto a linguagens de programação concatenativas (baseadas em pilha), como Forth e Factor? Você pode considerá-lo um tipo de programação funcional, mas provavelmente é suficientemente distinto para merecer menção. pt.wikipedia.org/wiki/Concatenative_programming_language
KChaloux
11

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

Robert Harvey
fonte
ah! "paradigma", que boa palavra! obrigado #
22610 sova
@sova Eu aceitaria isso como a melhor resposta, porque existem paradigmas demais para listar em uma resposta P.SE, muito menos para descrever as nuances de cada uma.
Rei Miyasaka
9

Clique na imagem para ver o PDF. Cartaz de paradigmas de programação

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ê.

mmdemirbas
fonte
6
  • 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.

Tangurena
fonte
2
+1 por usar um tipo diferente de classificação e também por reconhecer que 'processual' de fato contém a maioria das classificações de outras pessoas. (claro que apenas significa que a palavra tem muito pouco significado, ea carne é em tais subdivisões)
Javier
4

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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:

Badar
fonte
3

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.

Erik Reppen
fonte
Caramba, valeu. É muito bom fazer o esforço para uma votação sem explicação.
Erik Reppen
2

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.

Mike Dunlavey
fonte
Legal. Vou aprender LISP e ser esclarecido. Emitindo: D
sova
No entanto, se você disser que o ato de usar uma estrutura de dados cria uma nova linguagem intermediária, também é possível argumentar que uma nova linguagem nasce em todo algoritmo (todas as operações são necessariamente feitas em uma estrutura de dados) e, com redução, uma nova linguagem nasce em todas as linhas de código. Eu acho que você quer dizer outra coisa, mas ainda não tenho certeza se entendi?
S10
@sova: Para mim, a teoria da informação foi uma grande revelação (Shannon e Kolmogorov). É sobre como os significados são codificados e transmitidos pelos canais, com conceitos de largura de banda, detecção de erros, codificação mínima, aleatoriedade etc. Então, os dados codificam informações e os algoritmos são canais. Os programas codificam informações e a programação é um canal. Então, que informação é codificada? de onde vem e quando? para onde vai? quais são as fontes de erros (ruído)? como eles são corrigidos? Eu achei essa uma perspectiva útil.
Mike Dunlavey
@sova: (continuação) Você não precisa dominar toda a matemática desanimadora. Para mim, o que importava era a estrutura que me dava para pensar sobre as coisas.
Mike Dunlavey
1

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.

Dave
fonte
Eu me lembro disso. Eu posso até ter usado. Rapaz, isso era o estado da arte. Você não precisou orientar manualmente a fresadora, basta pressionar o botão Iniciar. E se houvesse um bug, todo o inferno se abriria.
Mike Dunlavey
Eu trabalhei em programas que geram gcode para fresadoras. Eu literalmente segurei e vi os resultados de erros de programação, freqüentemente meus.
precisa
Passei 20 anos instalando pós-processadores em vários sistemas.
Dave