¿Cuántos tipos de lenguajes de programación hay? [cerrado]

30

Básicamente, quiero aprender muchos lenguajes de programación para convertirme en un gran programador. Solo conozco un puñado de profundidad y esperaba que alguien pudiera explicar cuántas clases o tipos de lenguajes de programación hay . Como cómo los agruparías si tuvieras que aprenderlos en grupos.

Viniendo de un fondo de Java, estoy familiarizado con la escritura estática, pero sé que, además de la escritura dinámica, debe haber tanta variedad en los idiomas disponibles que me encantaría ver un desglose categórico si es posible.

sova
fuente
2
¿No sería mejor decir "Qué tipo ..." en lugar de cuántos?
Amir Rezaei el
Bueno, he aprendido que algo como Prolog y C son fundamentalmente diferentes, por lo que pensaba que cada uno de ellos corresponde a un tipo diferente de lenguaje de programación, y esperaba comprender cuántos tipos.
sova
77
2: el tipo que hace lo que quieres y el tipo que no
Matt Ellen
1
¡Aprender sobre diferentes tipos de lenguajes de programación es absolutamente constructivo ! Podría argumentar que esto debería cerrarse como un duplicado de esto, pero creo que son preguntas lo suficientemente distintas como para permanecer separadas.
Peter Boughton
1
@Sova, recomendaría que haga su primera elección de nuevos lenguajes para probar algo que no use la sintaxis basada en c. Eso hará que tu cabeza se concentre más en cómo funciona que en cómo es diferente de la que mejor conoces.
Erik Reppen

Respuestas:

73

Depende de cómo quieras clasificar los idiomas. Básicamente, los lenguajes se pueden dividir en dos tipos: lenguajes imperativos en los que le indica a la computadora cómo realizar una tarea, y lenguajes declarativos en los que le dice a la computadora qué hacer. Los lenguajes declarativos pueden desglosarse en lenguajes funcionales , en los que un programa se construye mediante funciones de composición y lógica.lenguajes de programación, en los cuales un programa se construye a través de un conjunto de conexiones lógicas. Los lenguajes imperativos se leen más como una lista de pasos para resolver un problema, como una receta. Los lenguajes imperativos incluyen C, C ++ y Java; lenguajes funcionales incluyen Haskell; Los lenguajes de programación lógica incluyen Prolog.

Los lenguajes imperativos a veces se dividen en dos subgrupos: lenguajes de procedimiento como C y lenguajes orientados a objetos . Sin embargo, los lenguajes orientados a objetos son un poco ortogonales a las agrupaciones, ya que hay lenguajes funcionales orientados a objetos (OCaml y Scala son ejemplos).

También puede agrupar idiomas escribiendo: estático y dinámico . Los lenguajes de tipo estático son aquellos en los que se verifica el tipeo (y generalmente se aplica) antes de ejecutar el programa (generalmente durante una fase de compilación); los idiomas de tipo dinámico difieren la verificación de tipos al tiempo de ejecución. C, C ++ y Java son lenguajes de tipo estático; Python, Ruby, JavaScript y Objective-C son lenguajes de tipo dinámico. También hay lenguajes sin tipo , que incluyen el lenguaje de programación Forth.

También puede agrupar idiomas por su disciplina de escritura : escritura débil , que admite conversiones de tipo implícitas, y escritura fuerte , que prohíbe las conversiones de tipo implícitas. Las líneas entre los dos son un poco borrosas: según algunas definiciones, C es un lenguaje débilmente tipado, mientras que otros lo consideran fuertemente tipado. La disciplina de escritura no es realmente una forma útil de agrupar idiomas, de todos modos.

mipadi
fuente
1
Iba a plantear algo similar, pero hará +1 y agregará comentarios en su lugar. Cada categoría o combinación también tiene numerosas escisiones creadas al enfocarse en elementos particulares. OOP, por ejemplo, engendra: OOP basada en prototipos, programación orientada a aspectos, programación basada en componentes, etc. Los paradigmas funcionales también tienen spin-offs, como lenguajes donde un proceso asincrónico o hilo es la unidad base y usted programa componiendo procesos paralelos juntos.
CodexArcanum
¿Cómo encajarían en esto los lenguajes de script, por ejemplo, VBScript? Puede ser un poco procesal y un poco OO ya que uno puede crear varios tipos, entonces ¿eso lo haría un híbrido?
JB King el
Esto es exactamente lo que estaba buscando. Muchas gracias.
sova
3
Los lenguajes @JB King OOP generalmente son de procedimiento, al menos dentro de los cuerpos de los métodos. Además, es un error común pensar que OOP significa "objetos". Muchos idiomas tienen tipos de datos y objetos. Hay mucho debate sobre cuál es la definición exacta de OOP, pero generalmente incluye la herencia y / o la encapsulación (estado privado) como temas principales. Un lenguaje sin ninguno de los dos sería difícil de clasificar como lenguaje OOP.
CodexArcanum
2
@sova Solo puedo pensar en dos idiomas que funcionan de esa manera. Erlang se basa en gran medida en el procesamiento paralelo, pero si quieres más de lo que estaba hablando exactamente, deberías buscar en Polyphonic C #. Es un lenguaje de investigación (ahora doblado en C-omega) basado en Pi-Calculus (como cómo FP se basa en lambda calc) Pi-calc se basa en la unidad de un proceso, y usted declara procesos y una combinación de síncrono y asíquico llama a ellos. También mire las flechas en FP, especialmente Haskell. Las flechas son muy parecidas.
CodexArcanum el
12
  • Montaje
  • Procesal
    • BASIC
    • do
  • Orientado a objetos
    • DO#
    • Java
  • Declarativo
    • Prólogo
    • SQL
  • Funcional
    • Ceceo
    • Haskell

Estos son los principales, pero hay muchos otros paradigmas por ahí, y hay mucha superposición entre ellos.


fuente
¿Qué hay de declarativo (por ejemplo, Prolog, SQL)?
Bruce Alderman el
@Bruce, los tengo ahora.
Sí, esta fue la idea general que aprendí en algún lugar del camino.
sevenseacat
66
¿No debería considerarse el montaje como de procedimiento?
MattDavey
2
¿Qué hay de los lenguajes de programación concatenativos (basados ​​en pila), como Forth y Factor? Podría considerarlo un tipo de programación funcional, pero probablemente sea lo suficientemente distinto como para merecer una mención. en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux
11

Para tipos de lenguajes de programación (Paradigms), mira aquí:
http://en.wikipedia.org/wiki/Programming_paradigm

Para otras características de los lenguajes de programación (por ejemplo, sistemas de tipos), consulte aquí: http://en.wikipedia.org/wiki/Programming_language

Robert Harvey
fuente
ah! "paradigma" ¡qué buena palabra! gracias
sova
@sova Aceptaría esto como la mejor respuesta, porque simplemente hay demasiados paradigmas para enumerar en una respuesta de P.SE, mucho menos para describir los matices de cada uno.
Rei Miyasaka
9

Haga clic en la imagen para ver el PDF. Cartel de paradigmas de programación

Deberías mirar Paradigmas de programación para tontos: lo que todo programador debe saber por Peter Van Roy. Esto le dará una visión general sobre cómo está sucediendo afuera.

Si desea ir más allá, puede leer Conceptos, Técnicas y Modelos de programación de computadoras . No aprenderá una gran cantidad de idiomas de esta manera, pero aprenderá paradigmas que se encuentran detrás de diferentes tipos de idiomas. Entonces, aprender un nuevo idioma será más fácil para usted.

mmdemirbas
fuente
6
  • De procedimiento: Asamblea, Java, C #, F #, Lisp, Fortran.

  • Conjunto basado: SQL.

  • Patrón basado: Perl, Regex, Snobol.

  • Basado en árbol: XSLT.

  • Basado en matriz: APL.

Tangurena
fuente
2
+1 por usar un tipo diferente de clasificación, y también por reconocer que 'procesal' de hecho contiene la mayoría de las clasificaciones de otras personas. (por supuesto, eso solo significa que la palabra tiene muy poco significado, y la carne está en tales subdivisiones)
Javier
4

Hay diferentes formas de responder esto, pero en términos se pueden clasificar como:

Lenguaje de máquina: el lenguaje de máquina es un lenguaje de programación de bajo nivel. Las computadoras lo entienden fácilmente pero las personas lo entienden con dificultad. Es por eso que las personas usan lenguajes de programación de nivel superior. Los programas escritos en lenguajes de alto nivel también se compilan y / o interpretan en lenguaje máquina para que las computadoras puedan ejecutarlos.

Lenguaje ensamblador: el lenguaje ensamblador es una representación del lenguaje máquina. En otras palabras, cada instrucción en lenguaje ensamblador se traduce en una instrucción en lenguaje máquina. Aunque las declaraciones en lenguaje ensamblador son legibles, las declaraciones siguen siendo de bajo nivel. Una desventaja del lenguaje ensamblador es que no es portátil, porque cada plataforma viene con un lenguaje ensamblador particular.

Lenguaje de alto nivel: los lenguajes de alto nivel son lo que la mayoría de los programadores usan hoy en día. Lenguajes como C, C ++ y Java son todos lenguajes de alto nivel. Las ventajas de los lenguajes de alto nivel son que son muy legibles y portátiles. Una desventaja de los lenguajes de alto nivel es que son menos potentes que los lenguajes de ensamblaje. Porque una sola declaración en un lenguaje de alto nivel se traduce en muchas declaraciones en lenguaje de máquina.

Los idiomas de alto nivel se pueden clasificar además como:

  1. Lenguajes funcionales: en el lenguaje funcional, un programa se divide en definiciones de funciones. Los lenguajes funcionales son una especie de lenguaje declarativo. Se basan principalmente en el cálculo lambda tipificado con constantes. Algunos de los famosos lenguajes de funciones son Scala, F #, Clojure y Lisp.

  2. Lenguajes de procedimiento: en lenguajes de procedimiento, un programa se escribe en una secuencia de pasos que se deben seguir para producir un resultado. COBOL, FORTRAN y C son algunos lenguajes de procedimiento.

  3. Lenguajes de programación orientados a objetos: en los lenguajes OOP, un programa se divide en objetos que contienen datos, así como métodos que operan en los datos. Java, C # y C ++ son lenguajes OOP.

  4. Lenguajes de programación lógica: los lenguajes lógicos se utilizan para crear programas que permiten que la computadora razone lógicamente. Por ejemplo: lenguaje lógico

Para un estudio en profundidad, consulte:

Badar
fuente
3

Tiendo a pensar en términos de características:

Sintaxis:

Basado en C o lo que tienes. Java tiene una sintaxis basada en C. Recomiendo probar algo como Python o Ruby para sacar la cabeza de la sintaxis y pensar más en términos de los fundamentos de cómo funciona un lenguaje determinado. Soy de la opinión de que ninguna sintaxis necesita ser más voluminosa que la basada en C y no tener problemas para construir bloques alrededor del espacio en blanco.

Compilado vs. interpretado w. Proceso de compilación vs. Interpretado / Consola:

Tengo muy poca familiaridad con las preocupaciones sobre el tiempo de compilación frente al entorno de tiempo de ejecución, pero entiendo que hay una gran cantidad de preocupaciones allí en las que rara vez pienso.

Del mismo modo, hay muchos lenguajes interpretados que todavía tienen algo de un proceso de compilación para ejecutarse dentro de una máquina virtual como Java. Todavía tiene que reconstruir para ver cambios en las cosas.

Y luego está JavaScript y Python que puede ejecutar sobre la marcha, comando por comando en una consola en un entorno en vivo. Los tres pueden conducir a formas muy diferentes de escribir código.

Escritura dinámica versus estricta:

Tiendo a ver los dos como compensaciones de diseño. Cuando se encuentra en un nivel mucho más bajo y el rendimiento es crítico, la escritura estática tiene mucho sentido. Nunca he entendido esta noción de que uno sea "más seguro" que otro de alguna manera, pero surgió en un lenguaje muy plástico / dinámico donde simplemente aprendes cómo funciona el sistema de mecanografía y qué esperar, básicamente. Las travesuras de tipo rara vez son una preocupación para mí en JS. De alguna manera, la flexibilidad puede hacer que las cosas sean más robustas, aunque ciertamente es un poco más arcano para un desarrollador de nivel Jr. más si no conoce algunos de los baches en el idioma.

Alcance de nivel de bloque vs. Alcance de función vs.

Block-Level es el más común (cualquier cosa entre {} en la mayoría de los lenguajes de sintaxis basados ​​en c). El alcance de JavaScript se basa en funciones (que también se utilizan para construir objetos de manera tan efectiva). También hay una gran variación en el tipo de acceso que tiene desde el ámbito interno a un ámbito externo. No estoy familiarizado con otros esquemas de alcance, pero estoy seguro de que existen.

OOP clásica versus OOP prototípica versus casi OOP (estructuras en C?) Vs no OOP:

Incluso en la OOP basada en la clase, hay mucho margen de variación. Si puede hacer herencia múltiple (ew, bien en exceso, ew), definir interfaces, etc.

En JavaScript tenemos una especie de OOP prototípica atrofiada donde los objetos son considerablemente más simples, altamente mutables, pero aún tenemos la capacidad de separar la interfaz de las preocupaciones internas, lo cual es el aspecto importante de la encapsulación.

Lo que pasa con OOP es que realmente hay muchas cosas que puedes lograr que están esencialmente orientadas a OOP sin ser técnicamente OOP. Hay puristas, por supuesto, pero al final del día, los patrones de diseño tratan de lograr ciertas abstracciones que funcionan bien en ciertas situaciones. No se apresure a asumir que las ideas de un lenguaje basado en OOP no tienen uso en algo que esté más orientado a los procedimientos. Y no estoy hablando de JavaScript. No está limitado en absoluto por su versión tonta de un paradigma basado en prototipos OOP.

Funciones de primera clase:

No tenerlos en un idioma es algo difícil de abandonar. Puede pasar funciones como si fueran datos para usar en otros contextos. Esto hace que los esquemas de manejo de eventos en particular sean muy fáciles de implementar, pero también hace que sea muy fácil adaptar el lenguaje para que funcione de la manera que le gustaría. Es, más que nada, lo que sospecho, lo que ha hecho que JavaScript sea el éxito, a pesar de haber sido diseñado en dos semanas y obtener una sintaxis aproximada de Java como un esquema de marketing.

Cierres:

No estoy seguro de dónde está el debate para Java, pero sé que muchos desarrolladores de Java estaban clamando por esta característica hace uno o dos años. En un lenguaje sin cierre, cuando una función se cierra, cualquier cosa que de alguna manera pueda hacer referencia a cosas desde dentro de esa función no podrá acceder a ella porque se recogió basura. En un cierre, el contexto de ejecución está limitado de tal manera que si puede hacer referencia a cosas dentro de esa función cerrada desde otro ámbito, como en un objeto o función devuelto, básicamente obtiene esos vars tal como estaban cuando la función se cerró. Es como meter el pie en la puerta de la recolección de basura, aunque sospecho que se implementa más como copias de esos vars hechos en vars locales de la entidad de referencia.

Rígido / estricto / seguro frente a darle toda la cuerda que desea:

Los desarrolladores de JS y Java tienden a no entenderse entre sí y creo que tiene mucho que ver con los dos idiomas que caen en lados casi opuestos de este espectro de diseño en particular. No quiero que me protejas de mí mismo o de los otros desarrolladores de mi equipo. Quiero hacer mucho más en mucho menos código y hacerlo de maneras muy diferentes (pero consistentes para un dominio dado) dependiendo de la situación. Hay absolutamente compensaciones para ambos y muchos idiomas tienden a caer más en el medio.

Erik Reppen
fuente
Gee gracias. Es realmente agradable pasar por el esfuerzo de un voto negativo sin explicación.
Erik Reppen
2

Creo que un atajo para todo esto es aprender suficiente Lisp para hacer algunas cosas semi-útiles. La mayoría de estos paradigmas comenzaron como formas de usar Lisp, por lo que es una forma simple de probar cosas.

Existen varios "tipos" de idiomas, pero siempre pueden aparecer nuevos. Básicamente, el propósito de un lenguaje es permitir la codificación de ideas, conceptos o requisitos, lo más directamente posible. Con ese fin, puede haber situaciones en las que los paradigmas existentes son insuficientes, y podría ser necesario uno nuevo.

Una forma de mirar es en términos de estructura de superficie. ¿Cómo directamente le permite codificar ideas de manera concisa, de modo que si cambia de opinión sobre lo que quiere, el cambio correspondiente en el código también es fácil, con pocas posibilidades de introducir errores?

Otra forma de verlo es en términos de estructura de control. Cuando se ejecuta el lenguaje (si lo es), ¿cuál es el orden en que suceden las cosas para lograr lo que quieres? Los ejemplos son: ejecución directa simple, recursividad, retroceso, paralelismo. Uno que (tos modesta) descubrí fue la ejecución diferencial .

Otro punto de vista útil es que cada vez que se diseña una estructura de datos, nace un lenguaje. Los datos son "ejecutados" por los programas de aplicación que los combinan y hacen cosas, así como un programa es solo un conjunto de datos (como códigos de bytes) que utiliza un intérprete para hacer cosas.

Mike Dunlavey
fuente
Guay. Aprenderé LISP y me iluminaré. Emocionante: D
sova
Sin embargo, si dice que el acto de usar una estructura de datos crea un nuevo lenguaje intermedio, entonces también podría argumentar que nace un nuevo lenguaje en cada algoritmo (todas las operaciones se realizan necesariamente en una estructura de datos), y con reducción, un nuevo lenguaje nace en cada línea de código. Sin embargo, creo que te refieres a algo más, pero todavía no estoy seguro de entender.
sova
@sova: Para mí, la teoría de la información fue una gran revelación (tanto Shannon como Kolmogorov). Se trata de cómo los significados se codifican y pasan a través de canales, con conceptos de ancho de banda, detección de errores, codificación mínima, aleatoriedad, etc. Por lo tanto, los datos codifican información y los algoritmos son canales. Los programas codifican información y la programación es un canal. Entonces, ¿qué información está codificada? de donde viene y cuando a donde va ¿Cuáles son las fuentes de errores (ruido)? ¿Cómo se corrigen? Me pareció una perspectiva útil.
Mike Dunlavey
@sova: (continúa) No tienes que dominar todas las matemáticas desagradables. Para mí, lo que importaba era el marco que me daba para pensar sobre las cosas.
Mike Dunlavey, el
1

Tengo que agregar que hay lenguajes de programación para aplicaciones específicas. El que viene a la mente es APT (Herramienta Programada Automática), un lenguaje utilizado en la fabricación de máquinas herramienta.

Dave
fuente
Me acuerdo de eso. Puede que incluso lo haya usado. Chico, eso era lo último. No tuvo que guiar manualmente la fresadora, solo presione el botón de inicio. Y si hubiera un error, todo el infierno se desataría.
Mike Dunlavey, el
He trabajado en programas que generan gcode para fresadoras. Literalmente he mantenido y visto los resultados de errores de programación, con frecuencia los míos.
David Thornley
Pasé 20 años instalando postprocesadores en montones de sistemas.
Dave