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

Fechado . Esta questão precisa ser mais focada . Atualmente não está aceitando respostas.

Comentários

  • Não seria ' melhor dizer " Qual tipo .. " em vez de quantos?
  • Bem, eu aprendi que algo como Prolog e C são fundamentalmente diferentes, então pensei que cada um deles corresponde a um tipo diferente de linguagem de programação, e eu esperava obter uma compreensão de quantos tipos.
  • 2: o tipo que faz o que você deseja e o tipo que não ' t
  • Aprender sobre diferentes tipos de linguagens de programação absolutamente é construtivo ! Você poderia argumentar que isso deveria ser encerrado como uma duplicata disso , mas acho que ' são questões distintas o suficiente para permaneçam separados.
  • @Sova, eu ' d recomendo fazer sua primeira escolha de novos idiomas para experimentar algo que não ' t usa sintaxe baseada em c. Isso fará com que sua cabeça se concentre mais em como funciona do que em como ' é diferente daquele que você conhece melhor.

Resposta

Depende de como você deseja classificar os idiomas. Fundamentalmente, os idiomas podem ser divididos em dois tipos: imperativos idiomas em que você instrui o computador como para fazer uma tarefa e linguagens declarativas nas quais você diz ao computador o que fazer. As linguagens declarativas podem ser subdivididas em linguagens funcionais , nas quais um programa é construído por funções de composição e linguagens de programação de lógica , nas quais um programa é construído por meio de um conjunto de conexões lógicas. As linguagens imperativas parecem mais uma lista de etapas para resolver um problema, uma espécie de receita. As linguagens imperativas incluem C, C ++ e Java; linguagens funcionais incluem Haskell; as linguagens de programação lógica incluem Prolog.

As linguagens imperativas às vezes são divididas em dois subgrupos: procedural linguagens como C e linguagens orientadas a objetos . As linguagens orientadas a objetos são um pouco ortogonais aos agrupamentos, pois existem linguagens funcionais orientadas a objetos (OCaml e Scala são exemplos).

Você também pode agrupar linguagens digitando: static e dynamic . Linguagens tipadas estaticamente são aquelas nas quais a digitação é verificada (e geralmente aplicada) antes de executar o programa (normalmente durante uma fase de compilação); linguagens digitadas dinamicamente adiam a verificação de tipo para o tempo de execução. C, C ++ e Java são linguagens tipadas estaticamente; Python, Ruby, JavaScript e Objective-C são linguagens tipadas dinamicamente. Existem também linguagens não digitadas , que incluem a linguagem de programação Forth.

Você também pode agrupar linguagens por sua disciplina de digitação: tipagem fraca, que oferece suporte a conversões de tipo implícitas e tipagem forte, que proíbe conversões de tipo implícitas. As linhas entre os dois são um pouco borradas: de acordo com algumas definições, C é uma linguagem fracamente tipada, enquanto outros a consideram como fortemente tipada. A disciplina de digitação não é realmente uma maneira útil de agrupar idiomas, de qualquer maneira.

Comentários

  • Ia apresentar algo semelhante, mas marcaria com +1 e em vez disso, adicione comentários. Cada categoria ou combinação também tem diversos derivados 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. Paradigmas funcionais também têm spin-offs, como linguagens em que um processo assíncrono ou thread é a unidade base e você programa compondo processos paralelos.
  • Como as linguagens de script, por exemplo, VBScript, se encaixam nisso? Pode ser um um pouco procedural e um pouco OO, já que se pode criar vários tipos, isso o tornaria um híbrido?
  • Isso é exatamente o que eu estava procurando. Muito obrigado.
  • @ As linguagens OOP da JB King geralmente são procedurais, pelo menos dentro dos corpos dos métodos.Além disso, é ' um equívoco comum que OOP significa " objetos ". Muitas linguagens 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. Uma linguagem sem nenhum dos dois de alguma forma seria difícil de classificar como linguagem OOP.
  • @sova Eu só consigo pensar em duas linguagens que funcionam mais ou menos assim. Erlang é fortemente baseado em processamento paralelo, mas se você quiser mais parecido com o que eu estava falando exatamente, você deve olhar para Polyphonic C #. É ' uma linguagem de pesquisa (agora dobrada em C-omega) baseada em Pi-Calculus (como o FP é baseado em lambda calc) Pi-calc é baseado em torno da unidade de um processo , e você declara processos e uma combinação de chamadas síncronas e asych para eles. Veja também Arrows em FP, especialmente Haskell. As setas são muito parecidas com isso.

Resposta

  • Montagem
  • Procedural
    • Básico
    • C
  • Orientado a objetos
    • C #
    • Java
  • Declarativo
    • Prolog
    • SQL
  • Funcional
    • Lisp
    • Haskell

Esses são os principais, mas existem muitos outros paradigmas por aí e há muitas sobreposições entre eles.

Comentários

  • Que tal declarativo (por exemplo, Prolog, SQL)?
  • @Bruce, comprei agora.
  • Sim, esta foi a ideia geral que aprendi em algum lugar ao longo do caminho.
  • Deveria t assembly ser considerado procedural?
  • Que tal linguagens de programação concatenativas (baseadas em pilha), como Forth e Factor? Você poderia considerá-lo um tipo de programação funcional, mas ' é provavelmente distinto o suficiente para merecer menção. en.wikipedia.org/wiki/Concatenative_programming_language

Resposta

Para tipos de linguagens de programação (Paradigmas), veja aqui:
http://en.wikipedia.org/wiki/Programming_paradigm

Para outras características das linguagens de programação (por exemplo, sistemas de tipos), veja aqui: http://en.wikipedia.org/wiki/Programming_language

Comentários

  • ah! " paradigm " que palavra boa! obrigado
  • @sova Eu aceitaria esta como a melhor resposta, porque simplesmente existem muitos paradigmas para listar em uma resposta P.SE, muito menos para descrever as nuances de cada um.

Resposta

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

Você deve consultar Paradigmas de programação para leigos: o que todo programador deve saber de Peter Van Roy. Isso lhe dará uma visão geral de como as coisas estão acontecendo lá fora.

Se quiser ir mais longe, você pode ler Conceitos, técnicas e modelos de Programação de computador . Você não aprenderá um banch de línguas dessa maneira, mas aprenderá paradigmas que estão por trás de diferentes tipos de línguas. Portanto, aprender um novo idioma será mais fácil para você.

Resposta

  • Processual: Montagem, Java, C #, F #, Lisp, Fortran.

  • Baseado em conjunto: SQL.

  • Baseado em padrões: Perl, Regex, Snobol.

  • Baseado em árvore: XSLT.

  • Baseado em array: APL.

Comentários

  • +1 por usar um tipo diferente de classificação e também por reconhecer que ' procedural ' na verdade contém a maioria das outras classificações ' s. (é claro que isso significa apenas que a palavra tem muito pouco significado e a carne está nessas subdivisões)

Resposta

Existem diferentes maneiras de responder a isso, mas em termos elas podem ser categorizadas como:

Linguagem de máquina: A linguagem de máquina é uma linguagem de programação de baixo nível. É facilmente compreendido por computadores, mas difícil de ser lido por 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 em linguagem de máquina para que os computadores possam executá-los.

Linguagem assembly: A linguagem assembly é uma representação da linguagem de máquina. Em outras palavras, cada instrução em linguagem assembly se traduz em uma instrução em linguagem de máquina. Embora as instruções em assembly sejam legíveis, as instruções 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: Linguagens de alto nível são o que a maioria dos programadores usa hoje em dia. Linguagens como C, C ++ e Java são todas linguagens 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 do que as linguagens assembly. Porque uma única instrução em uma linguagem de alto nível é traduzida em muitas instruções em linguagem de máquina.

Linguagens de alto nível podem ser classificadas como:

  1. Linguagens funcionais: Na linguagem funcional, um programa é dividido em definições de função. As 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: Em linguagens procedurais, 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 procedurais.

  3. Linguagens de programação orientada a objetos: Em linguagens OOP, um programa é dividido em Objetos que contêm dados e também métodos que operam nos dados. Java, C # e C ++ são linguagens OOP.

  4. Linguagens de programação de lógica: Linguagens de lógica são usadas para criar programas que permite que o computador raciocine logicamente. Por exemplo: Linguagem lógica

Para um estudo aprofundado, verifique:

Resposta

Eu tendo a pensar em termos de recursos:

Sintaxe:

Baseado em C ou o que você quiser. Java tem uma sintaxe baseada em C. Eu recomendo fortemente tentar 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. Eu sou da opinião que nenhuma sintaxe precisa ficar mais volumosa do que a baseada em C e não tenho problemas para construir blocos em torno do espaço em branco.

Compilado vs. interpretado com Build-Process vs. Interpreted / Console:

Tenho muito pouca familiaridade com questões de tempo de compilação vs. ambiente de tempo de execução, mas entendo isso há uma série de preocupações sobre as quais raramente penso.

Da mesma forma, existem muitas linguagens interpretadas que ainda têm um processo de compilação para execução dentro de uma máquina virtual como o Java. Você ainda tem que reconstruir para ver as mudanças nas coisas.

E então há JavaScript e Python que você pode executar instantaneamente, comando por comando em um console em um ambiente ao vivo. Todos os três podem levar a maneiras muito diferentes de escrever código.

Tipagem dinâmica vs. estrita:

Eu tendo a ver os dois como compensações 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 um ser “mais seguro” do que outro de alguma forma, mas eu surgiu em uma linguagem muito plástica / dinâmica onde você apenas aprende como funciona o sistema de digitação 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 reconhecidamente um pouco mais misterioso para um desenvolvedor de nível Jr. se você não souber sobre alguns dos buracos da linguagem.

Escopo de nível de bloco vs. Escopo de função vs.?:

O nível de bloco é o mais comum (qualquer 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 construir objetos de forma eficaz também). Também há uma grande variação no tipo de acesso que você tem do escopo interno para um escopo externo. Não estou familiarizado com outros esquemas de escopo, mas tenho certeza que eles existem.

OOP clássico vs. OOP prototípico vs. Quase-OOP (estruturas em C ?) vs Non-OOP:

Mesmo em OOP baseado em classe, há uma grande margem para variação. Se você pode fazer herança múltipla (ew, bem em excesso, ew), definir interfaces, etc …

Em JavaScript, temos uma espécie de OOP prototípico híbrido atrofiado onde os objetos são consideravelmente mais simples, altamente mutáveis, mas ainda temos a capacidade de separar a interface de interesses internos, que IMO, é o aspecto importante do encapsulamento .

A coisa sobre OOP é que realmente há muitas coisas que você pode fazer que são essencialmente orientadas para OOP sem ser tecnicamente OOP. Existem puristas, é claro, mas no final do dia, Design Patterns trata de alcançar certas abstrações que funcionam bem em certas situações. Não se precipite ao supor que as idéias de uma linguagem baseada em OOP não têm uso em algo que é mais orientado por procedimentos. E eu não estou falando sobre JavaScript. Ele não é de forma alguma limitado por sua versão estúpida de um paradigma OOP baseado em protótipo.

Funções de primeira classe :

Não ter isso em um idioma é difícil para mim desistir. Você pode passar 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 torna muito fácil adaptar a linguagem para funcionar da maneira que você gostaria. É, mais do que qualquer coisa que eu suspeito, o que tornou o JavaScript um sucesso que foi definitivo, apesar de ter sido projetado em duas semanas e ter uma sintaxe Java aproximada aplicada a ele como um esquema de marketing.

Fechamentos:

Não tenho certeza de onde está o debate sobre Java, mas sei que muitos desenvolvedores de Java clamavam por esse recurso um ou dois anos atrás. Em uma linguagem sem fechamento, quando uma função fecha, qualquer coisa que seja de alguma forma capaz de fazer referência a coisas de dentro dessa função não será capaz de acessá-la porque foi coletada como lixo. Em um fechamento, o contexto de execução é limitado de forma que se você “Ser capaz de fazer referência a coisas dentro daquela função fechada de outro escopo, como em um objeto ou função retornado, você basicamente obtém esses vars como estavam quando a função foi fechada. É como enfiar o pé na porta da coleta de lixo, embora eu suspeite que seja implementado mais como cópias desses vars feitas em vars locais da entidade de referência.

Rígido / Estrito / Seguro vs. Dando a você toda a corda que você deseja:

Devs JS e devs Java tendem a não entender cada um outro e eu acho que tem muito a ver com as duas linguagens caindo em lados opostos desse espectro de design específico. Não quero que você me proteja de mim mesmo ou de outros desenvolvedores da minha equipe. Quero fazer muito mais com muito menos código e fazer tudo de maneiras muito diferentes (mas consistentes para um determinado domínio), dependendo sobre a situação. Há compensações absolutas para ambos e muitos idiomas tendem a ficar mais no meio.

Comentários

  • Puxa, obrigado. ' é muito bom passar pelo esforço de uma votação negativa sem nenhuma explicação.

Resposta

Acho que um atalho para tudo isso é aprender Lisp o suficiente para fazer algumas coisas semiaúteis. A maioria desses paradigmas começou como formas de usar Lisp, então é uma maneira simples para tentar coisas.

Existem vários “tipos” de idiomas, mas novos sempre podem aparecer. Basicamente, o propósito de uma linguagem é permitir a codificação de ideias, conceitos ou requisitos, o mais diretamente possível. Para esse fim, pode haver situações em que os paradigmas existentes são insuficientes e um novo pode ser necessário.

Uma maneira de olhar é em termos de estrutura de superfície. Como isso permite que você codifique ideias de forma concisa, de modo que, se mudar de ideia sobre o que deseja, a mudança correspondente no código também seja fácil, com pouca chance de introduzir bugs.

Outra maneira de olhe para isso em termos de estrutura de controle. Quando a linguagem é executada (se for) qual é a ordem em que as coisas acontecem, para realizar o que você deseja? Os exemplos são: execução direta simples, recursão, retrocesso, 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 é nascermos. Os dados são “executados” pelos programas aplicativos que os vasculham e fazem coisas, assim como um programa é apenas um monte de dados (como códigos de byte) que são usados por um intérprete para fazer coisas.

Comentários

  • Legal. Vou aprender LISP e ser iluminado. Emocionante: D
  • No entanto, se você disser que o ato de usar uma estrutura de dados cria uma nova linguagem intermediária, você também pode argumentar que uma nova linguagem nasce em cada algoritmo (todas as operações são necessariamente feitas em um dado estrutura), e com a redução, uma nova linguagem nasce em cada linha de código. Mas acho que você quer dizer outra coisa, mas ' não tenho certeza se entendi ainda?
  • @sova: Para mim, a teoria da informação foi uma grande revelação (Shannon e Kolmogorov). É ' como os significados são codificados e passados pelos canais, com conceitos de largura de banda, detecção de erros, codificação mínima, aleatoriedade, etc. Portanto, dados codificam informações e algoritmos são canais . Os programas codificam informações e a programação é um canal. Então, quais informações são codificadas? de onde vem e quando? para onde vai? quais são as fontes de erros (ruído)? como eles são corrigidos? Achei essa uma perspectiva útil.
  • @sova: (continuação) Você não ' não precisa dominar toda a matemática desagradável. Para mim, o que importou foi a estrutura que me deu para pensar sobre as coisas.

Resposta

Eu preciso adicione que existem linguagens de programação para aplicativos específicos. O que vem à mente é APT (Automatic Programmed Tool), uma linguagem usada na manufatura para máquinas-ferramenta.

Comentários

  • Eu me lembro desse. Posso até ter usado. Rapaz, isso era o que há de mais moderno. Você não ' não precisou guiar manualmente a fresadora, apenas aperte o botão Iniciar. E se houvesse um bug, seria um inferno.
  • Eu ' trabalhei em programas que geram gcode para fresadoras. Eu ' literalmente segurei e vi os resultados de bugs de programação, frequentemente meus.
  • Passei 20 anos instalando pós-processadores em muitos sistemas.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *