Cerrado . Esta pregunta debe estar más
centrada . Actualmente no acepta respuestas.
Comentarios
Respuesta
Depende de cómo quieras clasificar los idiomas. Básicamente, los idiomas se pueden dividir en dos tipos: imperativo idiomas en los que instruye a la computadora cómo para hacer una tarea y declarativos idiomas en los que le dice a la computadora qué hacer. Los lenguajes declarativos se pueden dividir en lenguajes funcionales, en los que un programa se construye componiendo funciones, y lógica lenguajes de programación, en los que 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; los lenguajes funcionales incluyen Haskell; Los lenguajes de programación lógica incluyen Prolog.
Los lenguajes imperativos a veces se dividen en dos subgrupos: procedural lenguajes 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 lenguajes escribiendo: estático y dinámico . Los lenguajes de tipado estático son aquellos en los que se verifica la escritura (y generalmente se aplica) antes de ejecutar el programa (generalmente durante una fase de compilación); Los lenguajes de tipado 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 tipado 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 tipos implícitas. Las líneas entre los dos son un poco borrosas: de acuerdo con algunas definiciones, C es un lenguaje de tipado débil, mientras que otros lo consideran de tipado fuerte. De todos modos, la disciplina de escritura no es realmente una forma útil de agrupar idiomas.
Comentarios
Responder
- Ensamblaje
- Procesal
- Orientado a objetos
- Declarativo
- Funcional
Estos son los principales, pero hay muchos otros paradigmas por ahí, y hay mucha superposición entre ellos.
Comentarios
Respuesta
Para los tipos de lenguajes de programación (paradigmas), consulte aquí:
http://en.wikipedia.org/wiki/Programming_paradigm
Para conocer otras características de los lenguajes de programación (por ejemplo, sistemas de tipos), consulte aquí: http://en.wikipedia.org/wiki/Programming_language
Comentarios
- ¡ah! " paradigma " ¡qué buena palabra! gracias
- @sova Aceptaría esto como la mejor respuesta, porque simplemente hay demasiados paradigmas para enumerar en una respuesta P.SE, y mucho menos para describir los matices de cada uno.
Responder
Respuesta
-
Procedimiento: Ensamblaje, Java, C #, F #, Lisp, Fortran.
-
Basado en conjunto: SQL.
-
Basado en patrones: Perl, Regex, Snobol.
-
Basado en árbol: XSLT.
-
Basado en matriz: APL.
Comentarios
Responder
Hay diferentes formas de responder a 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. Es fácil de entender por las computadoras pero difícil de leer por las personas. Es por eso que la gente usa lenguajes de programación de nivel superior. Los programas escritos en lenguajes de alto nivel también se compilan y / o interpretan en lenguaje de máquina para que las computadoras puedan ejecutarlos.
Lenguaje ensamblador: El lenguaje ensamblador es una representación del lenguaje de 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 aún son 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 utilizan hoy en día. Los 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 ensambladores. Porque una sola declaración en un lenguaje de alto nivel se traduce a muchas declaraciones en lenguaje de máquina.
Los idiomas de alto nivel se pueden clasificar además como:
-
Idiomas funcionales: En lenguaje funcional, un programa se divide en definiciones de funciones. Los lenguajes funcionales son una especie de lenguaje declarativo. En su mayoría se basan en el cálculo lambda tipificado con constantes. Algunos de los lenguajes de función más famosos son Scala, F #, Clojure y Lisp.
-
Idiomas de procedimiento: En los idiomas de procedimiento, un programa está escrito en una secuencia de pasos que deben seguirse para producir un resultado. COBOL, FORTRAN y C son algunos lenguajes de procedimiento.
-
Lenguajes de programación orientados a objetos: En lenguajes OOP, un programa es dividido en Objeto que contiene datos, así como métodos que operan en los datos. Java, C # y C ++ son lenguajes de programación orientada a objetos.
-
Lenguajes de programación lógica: Los lenguajes lógicos se utilizan para crear programas que permite a la computadora razonar lógicamente. por ejemplo: lenguaje lógico
Para un estudio en profundidad, consulte:
Respuesta
Tiendo a pensar en términos de características:
Sintaxis:
Basado en C o lo que sea. Java tiene una sintaxis basada en C. Recomiendo encarecidamente probar algo como Python o Ruby para sacar su cabeza de la sintaxis y pensar más en términos de los fundamentos de cómo funciona un lenguaje dado. Soy de la opinión de que ninguna sintaxis necesita ser más voluminosa que la basada en C y no tiene problemas para construir bloques alrededor del espacio en blanco.
Compilado vs. interpretado con proceso de compilación frente a interpretado / consola:
Tengo muy poca familiaridad con el tiempo de compilación frente a las preocupaciones del entorno de tiempo de ejecución, pero lo entiendo Hay una gran cantidad de preocupaciones en las que rara vez pienso.
Asimismo, hay muchos lenguajes interpretados que todavía tienen algo así como un proceso de compilación para ejecutarse dentro de una máquina virtual como lo hace Java. Todavía tienes que reconstruir para ver cambios en las cosas.
Y luego están JavaScript y Python que puedes ejecutar sobre la marcha, comando a comando en una consola en un entorno en vivo. Los tres pueden conducir a formas muy diferentes de escribir código.
Escritura dinámica o estricta:
Tiendo a ver los dos como compensaciones de diseño. Cuando estás 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 en el que simplemente aprendes cómo funciona el sistema de escritura y qué esperar, básicamente. Las travesuras de tipo rara vez me preocupan en JS. De alguna manera, la flexibilidad puede hacer que las cosas sean más sólidas, aunque es cierto que un toque más arcano para un desarrollador de nivel más Jr. si no conoce algunos de los baches en el lenguaje.
Alcance de nivel de bloque vs. Alcance de función vs.?:
El nivel de bloque es el más común (cualquier 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 alcance interno a un alcance externo. No estoy familiarizado con otros esquemas de alcance, pero estoy seguro de que existen.
OOP clásica frente a OOP prototípica frente a Almost-OOP (estructuras en C ?) vs Non-OOP:
Incluso en la programación orientada a objetos basada en clases hay mucho espacio para la variación. Si puede hacer herencia múltiple (ew, bien en exceso, ew), definir interfaces, etc.
En JavaScript tenemos una especie de OOP prototípico híbrido atrofiado donde los objetos son considerablemente más simples, altamente mutables, pero todavía tenemos la capacidad de separar la interfaz de las preocupaciones internas, que en mi opinión, es el aspecto importante de la encapsulación .
Lo que pasa con la programación orientada a objetos es que realmente hay muchas cosas que puede realizar y que están esencialmente orientadas a la programación orientada a objetos sin ser técnicamente OOP. Hay puristas, por supuesto, pero al final del día, los patrones de diseño se 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á en absoluto limitado por su versión tonta de un paradigma de programación orientada a objetos basado en prototipos.
Funciones de primera clase :
No tenerlos en un idioma es algo que me cuesta renunciar. Puede pasar funciones como si fueran datos para su uso 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 como a usted le gustaría. Es, más que nada, sospecho, lo que ha hecho que JavaScript sea el éxito que ha sido definitivo a pesar de que se diseñó en dos semanas y se le incorporó una sintaxis aproximada a 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 clamaban por esta característica hace uno o dos años. En un lenguaje de no cierre, cuando una función se cierra, cualquier cosa que de alguna manera sea capaz de hacer referencia a cosas desde dentro de esa función no podrá acceder a ella porque fue recolectada como basura. En un cierre, el contexto de ejecución está limitado de tal manera que si «Si puedes hacer referencia a cosas dentro de esa función cerrada desde otro ámbito, como en un objeto o función devuelta, básicamente obtienes esas vars como estaban cuando se cerró la función. Es como meter el pie en la puerta de la recolección de basura, aunque sospecho que se implementa más como copias de esas vars convertidas en vars locales de la entidad de referencia.
Rígido / Estricto / Seguro frente a darle todo lo que quiere:
Los desarrolladores de JS y los desarrolladores de Java tienden a no entender cada uno otros en absoluto y creo que tiene mucho que ver con los dos lenguajes 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 con mucho menos código y hacerlo todo de formas muy diferentes (pero coherentes para un dominio determinado) según sobre la situación. Hay compensaciones absolutas para ambos y muchos idiomas tienden a quedar más en el medio.
Comentarios
Respuesta
Creo que un atajo a 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 sencilla para probar cosas.
Hay 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 falten paradigmas existentes y se necesite uno nuevo.
Una forma de verlo es en términos de estructura superficial. ¿Qué tan directamente te permite codificar ideas de manera concisa, de modo que si cambias de opinión sobre lo que quieres, el cambio correspondiente en el código también es fácil, con pocas posibilidades de introducir errores?
Otra forma de Míralo en términos de estructura de control. Cuando se ejecuta el lenguaje (si lo es), ¿cuál es el orden en el que suceden las cosas, para lograr lo que quieres? Algunos ejemplos son: ejecución simple y directa, recursividad, retroceso, paralelismo. Una que yo (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, un lenguaje es nacido. Los datos son «ejecutados» por los programas de aplicación que los revisan y hacen cosas, al igual que un programa es solo un montón de datos (como códigos de bytes) que un intérprete usa para hacer cosas.
Comentarios
Responder
Tengo que Agregue que existen lenguajes de programación para aplicaciones específicas. El que me viene a la mente es APT (Automatic Programmed Tool) un lenguaje utilizado en la fabricación de máquinas-herramienta.
Comentarios