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.
Respuestas:
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.
fuente
Estos son los principales, pero hay muchos otros paradigmas por ahí, y hay mucha superposición entre ellos.
fuente
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
fuente
Haga clic en la imagen para ver el PDF.
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.
fuente
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.
fuente
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:
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.
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.
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.
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:
fuente
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.
fuente
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.
fuente
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.
fuente