Articulo de referencia

Lenguaje de programación

Comprobado El código fuente de un programa informático en C. Las líneas grises son comentarios que explican el programa a los humanos. Al compilarlo y ejecutarlo , mostrará el m...

Comprobado
Página protegida con cambios pendientes

El código fuente de un programa informático en C. Las líneas grises son comentarios que explican el programa a los humanos. Al compilarlo y ejecutarlo , mostrará el mensaje " ¡Hola, mundo! ".

Un lenguaje de programación es un lenguaje diseñado para expresar programas informáticos , [ 1 ] que normalmente permite escribir software de una manera legible para los humanos .

La ejecución de un programa requiere una implementación . Existen dos enfoques principales para implementar un lenguaje de programación: la compilación , donde los programas se compilan previamente a código máquina , y la interpretación , donde los programas se ejecutan directamente. Además de estos dos extremos, algunas implementaciones utilizan enfoques híbridos, como la compilación justo a tiempo y los intérpretes de bytecode . [ 2 ]

El diseño de los lenguajes de programación ha estado fuertemente influenciado por la arquitectura de computadoras , y la mayoría de los lenguajes imperativos se diseñaron en torno a la omnipresente arquitectura de von Neumann . [ 3 ] Si bien los primeros lenguajes de programación estaban estrechamente ligados al hardware , los lenguajes modernos a menudo ocultan los detalles del hardware mediante la abstracción , con el fin de permitir un mejor software con menos esfuerzo. Estos lenguajes se conocen como lenguajes de alto nivel . [ 4 ]

Relación con los lenguajes naturales

Los lenguajes de programación tienen cierta similitud con los lenguajes naturales, ya que permiten la comunicación de ideas entre personas. Es decir, los programas suelen ser legibles para los humanos y pueden expresar ideas complejas. Sin embargo, el tipo de ideas que pueden expresar los lenguajes de programación se limita, en última instancia, al ámbito de la computación. [ 5 ]

El término lenguaje informático se usa a veces indistintamente con lenguaje de programación [ 6 ] , pero algunos sostienen que son conceptos diferentes. Algunos afirman que los lenguajes de programación son un subconjunto de los lenguajes informáticos [ 7 ] . Otros usan el término lenguaje informático para clasificar un lenguaje utilizado en la computación que no se considera un lenguaje de programación. Algunos consideran que un lenguaje de programación es una construcción teórica para programar una máquina abstracta , y un lenguaje informático es el subconjunto del mismo que se ejecuta en una computadora física, la cual tiene recursos de hardware finitos [ 8 ] .

John C. Reynolds subraya que un lenguaje de especificación formal es un lenguaje de programación tanto como cualquier lenguaje destinado a la ejecución. Argumenta que los formatos de entrada textuales e incluso gráficos que afectan el comportamiento de una computadora son lenguajes de programación, a pesar de que comúnmente no son Turing-completos, y señala que la ignorancia de los conceptos de los lenguajes de programación es la razón de muchos fallos en los formatos de entrada. [ 9 ]

Historia

Primeros desarrollos

Las primeras computadoras programables se inventaron durante la década de 1940, y con ellas, los primeros lenguajes de programación. [ 10 ] [ 11 ] Las primeras computadoras se programaron en lenguajes de programación de primera generación (1GL), lenguaje máquina (instrucciones simples que podían ser ejecutadas directamente por el procesador). Este código era muy difícil de depurar y no era portable entre diferentes sistemas informáticos. [ 12 ] Para mejorar la facilidad de programación, se inventaron los lenguajes ensamblador (o lenguajes de programación de segunda generación —2GL—), que divergieron del lenguaje máquina para hacer que los programas fueran más fáciles de entender para los humanos, aunque no aumentaron la portabilidad. [ 13 ]

Inicialmente, los recursos de hardware eran escasos y costosos, mientras que los recursos humanos eran más baratos. Por lo tanto, se favorecieron los lenguajes engorrosos que consumían mucho tiempo de uso, pero que estaban más cerca del hardware para una mayor eficiencia. [ 14 ] La introducción de los lenguajes de programación de alto nivel ( lenguajes de programación de tercera generación —3GL—) revolucionó la programación. Estos lenguajes abstrajeron los detalles del hardware, y en su lugar se diseñaron para expresar algoritmos que los humanos pudieran entender más fácilmente. Por ejemplo, las expresiones aritméticas ahora podían escribirse en notación simbólica y luego traducirse a código máquina que el hardware podía ejecutar. [ 13 ] En 1957, se inventó Fortran (FORmula TRANslation). A menudo considerado el primer lenguaje de programación de alto nivel compilado , [ 13 ] [ 15 ] Fortran se ha mantenido en uso hasta el siglo XXI. [ 16 ]

Décadas de 1960 y 1970

Dos personas utilizando un ordenador central IBM 704 —el primer hardware compatible con aritmética de punto flotante— en 1957. Fortran fue diseñado para esta máquina. [ 17 ] [ 16 ]

Hacia 1960, se desarrollaron las primeras computadoras centrales (computadoras de propósito general), aunque solo podían ser operadas por profesionales y su costo era extremadamente alto. Los datos y las instrucciones se ingresaban mediante tarjetas perforadas , lo que significaba que no se podía agregar ninguna entrada mientras el programa se ejecutaba. Por lo tanto, los lenguajes desarrollados en ese momento están diseñados para una interacción mínima. [ 18 ] Tras la invención del microprocesador , las computadoras en la década de 1970 se volvieron mucho más económicas. [ 19 ] Las nuevas computadoras también permitieron una mayor interacción del usuario, lo cual fue posible gracias a los lenguajes de programación más recientes. [ 20 ]

Lisp , implementado en 1958, fue el primer lenguaje de programación funcional . [ 21 ] A diferencia de Fortran, admitía recursión y expresiones condicionales , [ 22 ] e introdujo la gestión dinámica de memoria en un montón y la recolección automática de basura . [ 23 ] Durante las décadas siguientes, Lisp dominó las aplicaciones de inteligencia artificial . [ 24 ] En 1978, otro lenguaje funcional, ML , introdujo tipos inferidos y parámetros polimórficos . [ 20 ] [ 25 ]

Después de que ALGOL (ALGOrithmic Language) se publicó en 1958 y 1960, [ 26 ] se convirtió en el estándar en la literatura de computación para describir algoritmos . Aunque su éxito comercial fue limitado, la mayoría de los lenguajes imperativos populares —incluidos C , Pascal , Ada , C++ , Java y C# — descienden directa o indirectamente de ALGOL 60. [ 27 ] [ 16 ] Entre sus innovaciones adoptadas por lenguajes de programación posteriores se incluyeron una mayor portabilidad y el primer uso de gramática libre de contexto , BNF . [ 28 ] Simula , el primer lenguaje en admitir programación orientada a objetos (incluidos subtipos , despacho dinámico y herencia ), también desciende de ALGOL y alcanzó éxito comercial. [ 29 ] C, otro descendiente de ALGOL, ha mantenido su popularidad hasta el siglo XXI. C permite el acceso a operaciones de máquina de nivel inferior que otros lenguajes contemporáneos. Su potencia y eficiencia, generadas en parte con operaciones de punteros flexibles , tienen el costo de dificultar la escritura de código correcto. [ 20 ]

Prolog , diseñado en 1972, fue el primer lenguaje de programación lógica , que se comunicaba con una computadora mediante notación lógica formal . [ 30 ] [ 31 ] Con la programación lógica, el programador especifica un resultado deseado y permite que el intérprete decida cómo lograrlo. [ 32 ] [ 31 ]

Década de 1980 a década de 2000

Una pequeña selección de libros de texto sobre lenguajes de programación.

Durante la década de 1980, la invención de la computadora personal transformó los roles para los que se utilizaban los lenguajes de programación. [ 33 ] Entre los nuevos lenguajes introducidos en la década de 1980 se encontraba C++, un superconjunto de C que puede compilar programas C pero que también admite clases y herencia . [ 34 ] Ada y otros nuevos lenguajes introdujeron soporte para la concurrencia . [ 35 ] El gobierno japonés invirtió fuertemente en los llamados lenguajes de quinta generación que añadieron soporte para la concurrencia a las construcciones de programación lógica, pero estos lenguajes fueron superados por otros lenguajes que admitían la concurrencia. [ 36 ] [ 37 ]

Debido al rápido crecimiento de Internet y la World Wide Web en la década de 1990, se introdujeron nuevos lenguajes de programación para dar soporte a las páginas web y las redes . [ 38 ] Java , basado en C++ y diseñado para una mayor portabilidad entre sistemas y seguridad, gozó de un gran éxito porque estas características son esenciales para muchas aplicaciones de Internet. [ 39 ] [ 40 ] Otro desarrollo fue el de los lenguajes de scripting de tipado dinámicoPython , JavaScript , PHP y Ruby — diseñados para producir rápidamente pequeños programas que coordinan aplicaciones existentes . Debido a su integración con HTML , también se han utilizado para construir páginas web alojadas en servidores . [ 41 ] [ 42 ]

Desde la década de 2000 hasta la actualidad

Durante la década de 2000, hubo una desaceleración en el desarrollo de nuevos lenguajes de programación que alcanzaron una popularidad generalizada. [ 43 ] Una innovación fue la programación orientada a servicios , diseñada para explotar sistemas de computación distribuida cuyos componentes están conectados por una red. Los servicios son similares a los objetos en la programación orientada a objetos, pero se ejecutan en un proceso separado. [ 44 ] C# y F# polinizaron ideas entre la programación imperativa y la funcional. [ 45 ] Después de 2010, varios lenguajes nuevos — Rust , Go , Swift , Zig y Carbon — compitieron por el software crítico en rendimiento para el cual históricamente se había utilizado C. [ 46 ] La mayoría de los nuevos lenguajes de programación utilizan tipado estático, mientras que algunos lenguajes nuevos utilizan tipado dinámico como Julia . [ 47 ]

Algunos de los nuevos lenguajes de programación se clasifican como lenguajes de programación visual, como Scratch y LabVIEW . Además, algunos de estos lenguajes combinan el uso de programación textual y visual, como Ballerina . [ 48 ] [ 49 ] [ 50 ] Asimismo, esta tendencia ha llevado al desarrollo de proyectos que ayudan a desarrollar nuevos lenguajes visuales, como Blockly de Google . [ 51 ] Muchos motores de juegos, como Unreal y Unity , admiten la programación visual. [ 52 ] [ 53 ]

Definición

Un lenguaje se puede definir en términos de sintaxis (forma) y semántica (significado), y a menudo se define mediante una especificación formal del lenguaje .

Sintaxis

Árbol de análisis sintáctico de código Python con tokenización insertada
El resaltado de sintaxis se usa a menudo para ayudar a los programadores a reconocer elementos del código fuente. El lenguaje mencionado anteriormente es Python .

La forma superficial de un lenguaje de programación se conoce como su sintaxis . La mayoría de los lenguajes de programación son puramente textuales; utilizan secuencias de texto que incluyen palabras, números y signos de puntuación, al igual que los lenguajes naturales escritos. En cambio, algunos lenguajes de programación son gráficos y utilizan relaciones visuales entre símbolos para especificar un programa.

La sintaxis de un lenguaje describe las posibles combinaciones de símbolos que conforman un programa sintácticamente correcto. El significado que se le otorga a una combinación de símbolos se gestiona mediante la semántica (ya sea formal o codificada en una implementación de referencia ). Dado que la mayoría de los lenguajes son textuales, este artículo trata sobre la sintaxis textual.

La sintaxis de un lenguaje de programación se define generalmente mediante una combinación de expresiones regulares (para la estructura léxica ) y la forma de Backus-Naur (para la estructura gramatical ). A continuación se muestra una gramática simple, basada en Lisp :

expresión ::= átomo | lista átomo ::= número | símbolo número ::= [+-]?['0'-'9']+ símbolo ::= ['A'-'Z''a'-'z'].* lista ::= '(' expresión* ')' 

Esta gramática especifica lo siguiente:

  • una expresión es un átomo o una lista ;
  • Un átomo es un número o un símbolo ;
  • Un número es una secuencia ininterrumpida de uno o más dígitos decimales, precedida opcionalmente por un signo más o menos;
  • Un símbolo es una letra seguida de cero o más caracteres alfabéticos (excluyendo los espacios en blanco); y
  • Una lista es un par de paréntesis emparejados, con cero o más expresiones en su interior.

Los siguientes son ejemplos de secuencias de tokens bien formadas en esta gramática: 12345, ()y (a b c232 (1)).

No todos los programas sintácticamente correctos son semánticamente correctos. Muchos programas sintácticamente correctos, sin embargo, están mal formados según las reglas del lenguaje y pueden (dependiendo de la especificación del lenguaje y la solidez de la implementación) generar un error durante la traducción o la ejecución. En algunos casos, dichos programas pueden presentar un comportamiento indefinido . Incluso cuando un programa está bien definido dentro de un lenguaje, puede tener un significado distinto al que pretendía quien lo escribió.

Tomando como ejemplo el lenguaje natural , puede que no sea posible asignar un significado a una oración gramaticalmente correcta, o que la oración sea falsa:

El siguiente fragmento de código C es sintácticamente correcto, pero realiza operaciones que no están definidas semánticamente (la operación *p >> 4no tiene significado para un valor de tipo complejo y p->imno está definida porque el valor pes el puntero nulo ):

complejo * p = NULL ; complejo abs_p = sqrt ( * p >> 4 + p -> im );

Si se omitiera la declaración de tipo en la primera línea, el programa generaría un error de variable indefinida pdurante la compilación. Sin embargo, el programa seguiría siendo sintácticamente correcto, ya que las declaraciones de tipo solo proporcionan información semántica.

La gramática necesaria para especificar un lenguaje de programación se puede clasificar según su posición en la jerarquía de Chomsky . La sintaxis de la mayoría de los lenguajes de programación se puede especificar mediante una gramática de tipo 2, es decir, son gramáticas libres de contexto . [ 54 ] Algunos lenguajes, como Perl y Lisp, contienen construcciones que permiten la ejecución durante la fase de análisis sintáctico. Los lenguajes que tienen construcciones que permiten al programador alterar el comportamiento del analizador sintáctico hacen que el análisis sintáctico sea un problema indecidible y, en general, difuminan la distinción entre análisis sintáctico y ejecución. [ 55 ] A diferencia del sistema de macros de Lisp y los bloques de Perl BEGIN, que pueden contener cálculos generales, las macros de C son simplemente reemplazos de cadenas y no requieren la ejecución de código. [ 56 ]

Semántica

La semántica se refiere al significado del contenido que se ajusta a la sintaxis de un idioma.

Semántica estática

La semántica estática define restricciones en la estructura de textos válidos que son difíciles o imposibles de expresar en formalismos sintácticos estándar. [ 57 ] Para lenguajes compilados, la semántica estática incluye esencialmente aquellas reglas semánticas que se pueden verificar en tiempo de compilación. Algunos ejemplos incluyen verificar que cada identificador se declare antes de usarse (en lenguajes que requieren tales declaraciones) o que las etiquetas en los brazos de una sentencia case sean distintas. [ 58 ] Muchas restricciones importantes de este tipo, como verificar que los identificadores se usen en el contexto apropiado (por ejemplo, no agregar un entero al nombre de una función), o que las llamadas a subrutinas tengan el número y tipo de argumentos apropiados, se pueden aplicar definiéndolas como reglas en una lógica llamada sistema de tipos . Otras formas de análisis estático, como el análisis de flujo de datos, también pueden formar parte de la semántica estática. Lenguajes de programación como Java y C# tienen análisis de asignación definida , una forma de análisis de flujo de datos, como parte de su respectiva semántica estática. [ 59 ]

semántica dinámica

Una vez especificados los datos, se debe instruir a la máquina para que realice operaciones sobre ellos. Por ejemplo, la semántica puede definir la estrategia mediante la cual se evalúan las expresiones a valores, o la manera en que las estructuras de control ejecutan condicionalmente las instrucciones . La semántica dinámica (también conocida como semántica de ejecución ) de un lenguaje define cómo y cuándo las diversas construcciones de un lenguaje deben producir un comportamiento del programa. Existen muchas maneras de definir la semántica de ejecución. El lenguaje natural se utiliza a menudo para especificar la semántica de ejecución de los lenguajes comúnmente utilizados en la práctica. Una cantidad significativa de investigación académica se centra en la semántica formal de los lenguajes de programación , lo que permite especificar la semántica de ejecución de manera formal. Los resultados de este campo de investigación han tenido una aplicación limitada en el diseño e implementación de lenguajes de programación fuera del ámbito académico. [ 59 ]

Características

Un lenguaje de programación proporciona a los programadores las herramientas necesarias para desarrollar software. A continuación se describen algunas de sus características más destacadas.

Sistema de tipos

Un tipo de dato es un conjunto de valores permitidos y operaciones que se pueden realizar sobre estos valores. [ 60 ] El sistema de tipos de cada lenguaje de programación define qué tipos de datos existen, el tipo de una expresión y cómo funcionan la equivalencia y la compatibilidad de tipos en el lenguaje. [ 61 ]

Según la teoría de tipos , un lenguaje es completamente tipado si la especificación de cada operación define los tipos de datos a los que se aplica dicha operación. [ 62 ] Por el contrario, un lenguaje no tipado, como la mayoría de los lenguajes ensamblador , permite realizar cualquier operación sobre cualquier dato, generalmente secuencias de bits de diversas longitudes. [ 62 ] En la práctica, si bien pocos lenguajes son completamente tipados, la mayoría ofrece cierto grado de tipado. [ 62 ]

Debido a que los diferentes tipos (como enteros y números de coma flotante ) representan valores de manera diferente, se producirán resultados inesperados si se utiliza un tipo cuando se espera otro. La comprobación de tipos detectará este error, generalmente en tiempo de compilación (la comprobación de tipos en tiempo de ejecución es más costosa). [ 63 ] Con el tipado fuerte , los errores de tipo siempre se pueden detectar a menos que las variables se conviertan explícitamente a un tipo diferente. El tipado débil se produce cuando los lenguajes permiten la conversión implícita, por ejemplo, para habilitar operaciones entre variables de diferentes tipos sin que el programador realice una conversión de tipo explícita. Cuantos más casos en los que se permita esta coerción de tipos , menos errores de tipo se podrán detectar. [ 64 ]

Tipos comúnmente admitidos

Los primeros lenguajes de programación a menudo solo admitían tipos numéricos integrados, como el entero (con signo y sin signo) y el punto flotante (para admitir operaciones con números reales que no son enteros). La mayoría de los lenguajes de programación admiten varios tamaños de números de punto flotante (a menudo llamados float y double ) y enteros, según el tamaño y la precisión requeridos por el programador. Almacenar un entero en un tipo demasiado pequeño para representarlo produce un desbordamiento de enteros . La forma más común de representar números negativos con tipos con signo es el complemento a dos , aunque también se utiliza el complemento a uno . [ 65 ] Otros tipos comunes incluyen el booleano —que es verdadero o falso— y el carácter —tradicionalmente de un byte , suficiente para representar todos los caracteres ASCII . [ 66 ]

Los arreglos son un tipo de datos cuyos elementos, en muchos lenguajes, deben consistir en un solo tipo de longitud fija. Otros lenguajes definen los arreglos como referencias a datos almacenados en otro lugar y admiten elementos de diferentes tipos. [ 67 ] Dependiendo del lenguaje de programación, las secuencias de múltiples caracteres, llamadas cadenas , pueden ser admitidas como arreglos de caracteres o su propio tipo primitivo . [ 68 ] Las cadenas pueden ser de longitud fija o variable, lo que permite una mayor flexibilidad a costa de un mayor espacio de almacenamiento y una mayor complejidad. [ 69 ] Otros tipos de datos que pueden ser admitidos incluyen listas , [ 70 ] arreglos asociativos (no ordenados) a los que se accede mediante claves, [ 71 ] registros en los que los datos se asignan a nombres en una estructura ordenada, [ 72 ] y tuplas , similares a los registros pero sin nombres para los campos de datos. [ 73 ] Los punteros almacenan direcciones de memoria, que normalmente hacen referencia a ubicaciones en el montón donde se almacenan otros datos. [ 74 ]

El tipo definido por el usuario más simple es un tipo ordinal , a menudo llamado enumeración , cuyos valores se pueden asignar al conjunto de enteros positivos. [ 75 ] Desde mediados de la década de 1980, la mayoría de los lenguajes de programación también admiten tipos de datos abstractos , en los que la representación de los datos y las operaciones están ocultas para el usuario , quien solo puede acceder a una interfaz . [ 76 ] Los beneficios de la abstracción de datos pueden incluir mayor confiabilidad, complejidad reducida, menor potencial de colisión de nombres y permitir que la estructura de datos subyacente se cambie sin que el cliente necesite alterar su código. [ 77 ]

Tipografía estática y dinámica

En el tipado estático , todos los tipos de expresiones se determinan antes de que se ejecute un programa, normalmente en tiempo de compilación. [ 62 ] La mayoría de los lenguajes de programación de tipado estático más utilizados requieren que los tipos de las variables se especifiquen explícitamente. En algunos lenguajes, los tipos son implícitos; una forma de esto es cuando el compilador puede inferir los tipos basándose en el contexto. La desventaja del tipado implícito es la posibilidad de que los errores pasen desapercibidos. [ 78 ] La inferencia de tipos completa se ha asociado tradicionalmente con lenguajes funcionales como Haskell y ML . [ 79 ]

Con el tipado dinámico , el tipo no se asocia a la variable, sino solo al valor codificado en ella. Una misma variable puede reutilizarse para un valor de un tipo diferente. Si bien esto proporciona mayor flexibilidad al programador, se consigue a costa de una menor fiabilidad y una menor capacidad del lenguaje de programación para detectar errores. [ 80 ] Algunos lenguajes permiten variables de tipo unión a las que se puede asignar cualquier tipo de valor, como excepción a sus reglas habituales de tipado estático. [ 81 ]

Concurrencia

En informática, se pueden ejecutar varias instrucciones simultáneamente. Muchos lenguajes de programación admiten la concurrencia a nivel de instrucción y de subprograma. [ 82 ] Para el siglo XXI, la potencia de procesamiento adicional en las computadoras provenía cada vez más del uso de procesadores adicionales, lo que requiere que los programadores diseñen software que utilice varios procesadores simultáneamente para lograr un mejor rendimiento. [ 83 ] Los lenguajes interpretados como Python y Ruby no admiten el uso concurrente de varios procesadores. [ 84 ] Otros lenguajes de programación sí admiten la gestión de datos compartidos entre diferentes hilos controlando el orden de ejecución de las instrucciones clave mediante el uso de semáforos , controlando el acceso a los datos compartidos mediante un monitor o habilitando el paso de mensajes entre hilos. [ 85 ]

Manejo de excepciones

Muchos lenguajes de programación incluyen manejadores de excepciones, una sección de código que se activa por errores de tiempo de ejecución y que puede manejarlos de dos maneras principales: [ 86 ]

  • Terminación: apagar el equipo y ceder el control al sistema operativo . Esta opción se considera la más sencilla.
  • Reanudación: reanudar el programa cerca del punto donde ocurrió la excepción. Esto puede provocar que la excepción se repita, a menos que el gestor de excepciones pueda modificar los valores para evitar que la excepción vuelva a ocurrir.

Algunos lenguajes de programación permiten dedicar un bloque de código para que se ejecute independientemente de si se produce una excepción antes de que se alcance dicho código; esto se denomina finalización. [ 87 ]

Existe una compensación entre una mayor capacidad para manejar excepciones y un rendimiento reducido. [ 88 ] Por ejemplo, aunque los errores de índice de matriz son comunes, [ 89 ] C no los verifica por razones de rendimiento. [ 88 ] Si bien los programadores pueden escribir código para capturar excepciones definidas por el usuario, esto puede sobrecargar un programa. Las bibliotecas estándar en algunos lenguajes, como C, utilizan sus valores de retorno para indicar una excepción. [ 90 ] Algunos lenguajes y sus compiladores tienen la opción de activar y desactivar la capacidad de manejo de errores, ya sea de forma temporal o permanente. [ 91 ]

Diseño e implementación

Una de las influencias más importantes en el diseño de lenguajes de programación ha sido la arquitectura de computadoras . Los lenguajes imperativos , el tipo más común, fueron diseñados para funcionar bien en la arquitectura von Neumann , la arquitectura de computadoras digitales más común. [ 92 ] En la arquitectura von Neumann, la memoria almacena tanto datos como instrucciones, mientras que la CPU que ejecuta las instrucciones sobre los datos es independiente, y los datos deben enviarse y recibirse a través de tuberías. Los elementos centrales en estos lenguajes son las variables, la asignación y la iteración , que es más eficiente que la recursión en estas máquinas. [ 93 ]

Muchos lenguajes de programación se han diseñado desde cero, se han modificado para satisfacer nuevas necesidades y se han combinado con otros lenguajes. Muchos han caído en desuso. El surgimiento de los lenguajes de programación en la década de 1950 fue impulsado por el deseo de crear un lenguaje de programación universal, apto para todas las máquinas y usos, evitando así la necesidad de escribir código para diferentes computadoras. [ 94 ] A principios de la década de 1960, la idea de un lenguaje universal fue rechazada debido a los diferentes requisitos de los diversos propósitos para los que se escribía el código. [ 95 ]

Compensaciones

Entre las cualidades deseables de los lenguajes de programación se incluyen la legibilidad, la facilidad de escritura y la fiabilidad. [ 96 ] Estas características pueden reducir el costo de la formación de programadores en un lenguaje, el tiempo necesario para escribir y mantener programas en dicho lenguaje, el costo de compilación del código y aumentar el rendimiento en tiempo de ejecución. [ 97 ]

  • Aunque los primeros lenguajes de programación a menudo priorizaban la eficiencia sobre la legibilidad, esta última ha cobrado mayor importancia desde la década de 1970. Tener múltiples operaciones para lograr el mismo resultado puede ser perjudicial para la legibilidad, al igual que la sobrecarga de operadores , de modo que un mismo operador pueda tener múltiples significados. [ 98 ] Otra característica importante para la legibilidad es la ortogonalidad , que limita la cantidad de construcciones que un programador debe aprender. [ 99 ] Una estructura sintáctica fácil de entender y palabras especiales inmediatamente obvias también favorecen la legibilidad. [ 100 ]
  • La capacidad de escritura es la facilidad de uso para escribir código que resuelva el problema deseado. Junto con las mismas características esenciales para la legibilidad, [ 101 ] la abstracción —interfaces que permiten ocultar detalles al cliente— y la expresividad —que permite programas más concisos— también ayudan al programador a escribir código. [ 102 ] Los primeros lenguajes de programación estaban muy ligados al hardware subyacente de la computadora, pero con el tiempo el soporte para la abstracción ha aumentado, lo que permite a los programadores expresar ideas que están más alejadas de la simple traducción a instrucciones de hardware subyacentes. Debido a que los programadores están menos ligados a la complejidad de la computadora, sus programas pueden realizar más cálculos con menos esfuerzo por parte del programador. [ 103 ] La mayoría de los lenguajes de programación vienen con una biblioteca estándar de funciones de uso común. [ 104 ]
  • La fiabilidad significa que un programa se comporta según lo especificado en una amplia gama de circunstancias. [ 105 ] La comprobación de tipos , el manejo de excepciones y el alias restringido (múltiples nombres de variables que acceden a la misma región de memoria) pueden mejorar la fiabilidad de un programa. [ 106 ]

El diseño de lenguajes de programación a menudo implica concesiones. [ 107 ] Por ejemplo, las características para mejorar la confiabilidad generalmente se obtienen a costa del rendimiento. [ 108 ] Una mayor expresividad debido a un gran número de operadores facilita la escritura de código, pero se obtiene a costa de la legibilidad. [ 108 ]

La programación en lenguaje natural se ha propuesto como una forma de eliminar la necesidad de un lenguaje especializado para la programación. Sin embargo, este objetivo aún está lejos de alcanzarse y sus beneficios son objeto de debate. Edsger W. Dijkstra sostuvo que el uso de un lenguaje formal es esencial para evitar la introducción de construcciones sin sentido. [ 109 ] Alan Perlis también rechazó la idea. [ 110 ]

Especificación

La especificación de un lenguaje de programación es un documento que los usuarios del lenguaje y los implementadores pueden usar para ponerse de acuerdo sobre si un fragmento de código fuente es un programa válido en ese lenguaje y, de ser así, cuál debería ser su comportamiento.

La especificación de un lenguaje de programación puede adoptar varias formas, entre ellas las siguientes:

Implementación

Una implementación de un lenguaje de programación es la conversión de un programa a código máquina que puede ser ejecutado por el hardware. El código máquina puede luego ejecutarse con la ayuda del sistema operativo . [ 114 ] La forma más común de interpretación en el código de producción es mediante un compilador , que traduce el código fuente a través de un lenguaje de nivel intermedio a código máquina, conocido como ejecutable . Una vez compilado el programa, se ejecutará más rápidamente que con otros métodos de implementación. [ 115 ] Algunos compiladores pueden proporcionar optimizaciones adicionales para reducir el uso de memoria o computación cuando se ejecuta el ejecutable, pero aumentando el tiempo de compilación. [ 116 ]

Otro método de implementación consiste en ejecutar el programa con un intérprete , que traduce cada línea de software a código máquina justo antes de su ejecución. Si bien puede facilitar la depuración, la desventaja de la interpretación es que se ejecuta de 10 a 100 veces más lento que un ejecutable compilado. [ 117 ] Los métodos de interpretación híbridos proporcionan algunos de los beneficios de la compilación y algunos de los beneficios de la interpretación mediante compilación parcial. Una forma de esto es la compilación justo a tiempo , en la que el software se compila con anticipación en un lenguaje intermedio y luego en código máquina inmediatamente antes de la ejecución. [ 118 ]

Lenguajes propietarios

Aunque la mayoría de los lenguajes de programación más utilizados tienen especificaciones e implementaciones completamente abiertas, muchos existen únicamente como lenguajes propietarios, cuya implementación solo está disponible a través de un único proveedor, que puede alegar que dicho lenguaje es de su propiedad intelectual. Los lenguajes de programación propietarios suelen ser lenguajes específicos de dominio o lenguajes de scripting internos para un solo producto; algunos se utilizan solo internamente dentro de un proveedor, mientras que otros están disponibles para usuarios externos.

Algunos lenguajes de programación se encuentran en la frontera entre el software propietario y el software abierto; por ejemplo, Oracle Corporation afirma tener derechos de propiedad sobre algunos aspectos del lenguaje de programación Java , [ 119 ] y el lenguaje de programación C# de Microsoft , que tiene implementaciones abiertas de la mayor parte del sistema, también tiene Common Language Runtime (CLR) como un entorno cerrado. [ 120 ]

Muchos lenguajes propietarios se utilizan ampliamente, a pesar de su naturaleza propietaria; ejemplos de ello son MATLAB , VBScript y Wolfram Language . Algunos lenguajes pueden pasar de ser cerrados a abiertos; por ejemplo, Erlang fue originalmente el lenguaje de programación interno de Ericsson. [ 121 ]

Los lenguajes de programación de código abierto son particularmente útiles para las aplicaciones de ciencia abierta , ya que mejoran la capacidad de replicación y el intercambio de código. [ 122 ]

Usar

Se han creado miles de lenguajes de programación diferentes, principalmente en el campo de la informática. [ 123 ] Los proyectos de software individuales suelen utilizar cinco o más lenguajes de programación. [ 124 ]

Los lenguajes de programación se diferencian de la mayoría de las demás formas de expresión humana en que requieren un mayor grado de precisión y exhaustividad. Al comunicarse con otras personas mediante el lenguaje natural, los autores y hablantes humanos pueden ser ambiguos y cometer pequeños errores, y aun así esperar que su intención se entienda. Sin embargo, figuradamente hablando, las computadoras "hacen exactamente lo que se les ordena" y no pueden "entender" el código que el programador pretendía escribir. La combinación de la definición del lenguaje, un programa y sus entradas debe especificar completamente el comportamiento externo que se produce al ejecutarse el programa, dentro del dominio de control del mismo. En cambio, las ideas sobre un algoritmo pueden comunicarse a los humanos sin la precisión necesaria para su ejecución mediante el uso de pseudocódigo , que intercala el lenguaje natural con código escrito en un lenguaje de programación.

Un lenguaje de programación proporciona un mecanismo estructurado para definir datos y las operaciones o transformaciones que se pueden realizar automáticamente sobre ellos. Un programador utiliza las abstracciones presentes en el lenguaje para representar los conceptos involucrados en un cálculo. Estos conceptos se representan como una colección de los elementos más simples disponibles (llamados primitivos ). [ 125 ] La programación es el proceso mediante el cual los programadores combinan estos primitivos para componer nuevos programas o adaptar los existentes a nuevos usos o a un entorno cambiante.

Programs for a computer might be executed in a batch process without any human interaction, or a user might type commands in an interactive session of an interpreter. In this case the "commands" are simply programs, whose execution is chained together. When a language can run its commands through an interpreter (such as a Unix shell or other command-line interface), without compiling, it is called a scripting language.[126]

Measuring language usage

Determining which is the most widely used programming language is difficult since the definition of usage varies by context. One language may occupy the greater number of programmer hours, a different one has more lines of code, and a third may consume the most CPU time. Some languages are very popular for particular kinds of applications. For example, COBOL is still strong in the corporate data center, often on large mainframes;[127][128]Fortran in scientific and engineering applications; Ada in aerospace, transportation, military, real-time, and embedded applications; and C in embedded applications and operating systems. Other languages are regularly used to write many different kinds of applications.

Various methods of measuring language popularity, each subject to a different bias over what is measured, have been proposed:

  • counting the number of job advertisements that mention the language[129]
  • the number of books sold that teach or describe the language[130]
  • estimates of the number of existing lines of code written in the language – which may underestimate languages not often found in public searches[131]
  • counts of language references (i.e., to the name of the language) found using a web search engine.

Combining and averaging information from various internet sites, stackify.com reported the ten most popular programming languages (in descending order by overall popularity): Java, C, C++, Python, C#, JavaScript, VB .NET, R, PHP, and MATLAB.[132]

A junio de 2024, los cinco lenguajes de programación más importantes según el índice TIOBE son Python , C++ , C , Java y C# . TIOBE proporciona una lista de los 100 lenguajes de programación más importantes según su índice y la actualiza mensualmente. [ 133 ]

Según el personal de IEEE Spectrum, los lenguajes de programación más populares de la actualidad podrían seguir dominando debido al funcionamiento de la IA. Como resultado, a los nuevos lenguajes les resultará más difícil ganar popularidad, ya que los programadores no escribirán muchos programas en ellos. [ 134 ]

Dialectos, sabores e implementaciones

Un dialecto de un lenguaje de programación o un lenguaje de intercambio de datos es una variación o extensión (relativamente pequeña) del lenguaje que no cambia su naturaleza intrínseca. Con lenguajes como Scheme y Forth , los estándares pueden ser considerados insuficientes, inadecuados o ilegítimos por los implementadores, por lo que a menudo se desviarán del estándar, creando un nuevo dialecto . En otros casos, un dialecto se crea para su uso en un lenguaje específico de dominio , a menudo un subconjunto. En el mundo de Lisp , la mayoría de los lenguajes que usan la sintaxis básica de expresiones S y semántica similar a Lisp se consideran dialectos de Lisp, aunque varían enormemente como, por ejemplo, Racket y Clojure . Como es común que un lenguaje tenga varios dialectos, puede ser bastante difícil para un programador inexperto encontrar la documentación correcta. El lenguaje BASIC tiene muchos dialectos .

Clasificaciones

Los lenguajes de programación se pueden describir según las siguientes clasificaciones de alto nivel, aunque a veces superpuestas: [ 135 ]

Imperativo

Un lenguaje de programación imperativo admite la implementación de lógica codificada como una secuencia de operaciones ordenadas. La mayoría de los lenguajes más utilizados se clasifican como imperativos. [ 136 ]

Funcional

A functional programming language supports successively applying functions to the given parameters. Although appreciated by many researchers for their simplicity and elegance, problems with efficiency have prevented them from being widely adopted.[137]

Logic

A logic programming language is designed so that the software, rather than the programmer, decides what order in which the instructions are executed.[138]

Object-oriented

Object-oriented programming (OOP) is characterized by features such as data abstraction, inheritance, and dynamic dispatch. OOP is supported by most popular imperative languages and some functional languages.[136]

Markup

Although a markup language is not a programming language per se, it might support integration with a programming language.

Special

There are special-purpose languages that are not easily compared to other programming languages.[139]

See also

References

  1. ^Information technology — Vocabulary.
  2. ^Sebesta, Robert W. (2023). Concepts of Programming Languages (12th global ed.). Pearson. pp. 46–51. ISBN 978-1-292-43682-1.
  3. ^Sebesta, Robert (2022). Concepts of Programming Languages: Global Edition (12th global ed.). Harlow: Pearson. p. 41. ISBN 978-1-292-43682-1.
  4. ^"High-level languages". ada computer science. 11 May 2026.
  5. ^Chauhan, Sharad (2013). "10". Programming Languages - Design and Constructs. University Science Press. p. 235. ISBN 978-93-81159-41-5. Retrieved 10 September 2025. Like our natural languages, programming languages facilitate the expression and communication between people. However, programming languages differ from natural languages in two ways. First, programming languages also enables communication of ideas between people and computing machines. Second, programming languages have a narrower expressive domain than our natural languages. That is, they facilitate only the communication of computational ideas.
  6. ^Robert A. Edmunds, The Prentice-Hall standard glossary of computer terminology, Prentice-Hall, 1985, p. 91
  7. ^Pascal Lando, Anne Lapujade, Gilles Kassel, and Frédéric Fürst, Towards a General Ontology of Computer ProgramsArchived 7 July 2015 at the Wayback Machine, ICSOFT 2007Archived 27 April 2010 at the Wayback Machine, pp. 163–170
  8. ^R. Narasimhan, Programming Languages and Computers: A Unified Metatheory, pp. 189–247 in Franz Alt, Morris Rubinoff (eds.) Advances in computers, Volume 8, Academic Press, 1994, ISBN 0-12-012108-5, p.215: "[...] the model [...] for computer languages differs from that [...] for programming languages in only two respects. In a computer language, there are only finitely many names—or registers—which can assume only finitely many values—or states—and these states are not further distinguished in terms of any other attributes. [author's footnote:] This may sound like a truism but its implications are far-reaching. For example, it would imply that any model for programming languages, by fixing certain of its parameters or features, should be reducible in a natural way to a model for computer languages."
  9. ^John C. Reynolds, "Some thoughts on teaching programming and programming languages", SIGPLAN Notices, Volume 43, Issue 11, November 2008, p.109
  10. ^Hierso, Severine (10 June 2022). "Coding From 1849 to 2022: a Guide to The Timeline of Programming Languages". IEEE Computer Society. Retrieved 1 March 2026.
  11. ^Gabbrielli & Martini 2023, p. 519.
  12. ^Gabbrielli & Martini 2023, pp. 520–521.
  13. ^ abcGabbrielli & Martini 2023, p. 521.
  14. ^Gabbrielli & Martini 2023, p. 522.
  15. ^Sebesta 2012, p. 42.
  16. ^ abcGabbrielli & Martini 2023, p. 524.
  17. ^Sebesta 2012, pp. 42–44.
  18. ^Gabbrielli & Martini 2023, pp. 523–524.
  19. ^ Gabbrielli y Martini 2023 , pag. 527.
  20. ^ a b c Gabbrielli y Martini 2023 , p. 528.
  21. ^ "Cómo Lisp se convirtió en el lenguaje de programación de Dios" . twobithistory.org . Archivado del original el 10 de abril de 2024. Consultado el 10 de abril de 2024 .
  22. ^ Sebesta 2012 , págs. 47–48.
  23. ^ Gabbrielli y Martini 2023 , pag. 526.
  24. ^ Sebesta 2012 , pág. 50.
  25. ^ Sebesta 2012 , págs. 701–703.
  26. ^ Gabbrielli y Martini 2023 , págs.
  27. ^ Sebesta 2012 , págs. 56–57.
  28. ^ Gabbrielli y Martini 2023 , pag. 525.
  29. ^ Gabbrielli y Martini 2023 , págs.
  30. ^ Gabbrielli y Martini 2023 , pag. 531.
  31. ^ a b Sebesta 2012 , pág. 79.
  32. ^ Gabbrielli y Martini 2023 , pag. 530.
  33. ^ Gabbrielli y Martini 2023 , págs.
  34. ^ Gabbrielli y Martini 2023 , pag. 534.
  35. ^ Gabbrielli y Martini 2023 , págs.
  36. ^ Gabbrielli y Martini 2023 , pag. 535.
  37. ^ Sebesta 2012 , pág. 736.
  38. ^ Gabbrielli y Martini 2023 , pag. 536.
  39. ^ Gabbrielli y Martini 2023 , págs.
  40. ^ Sebesta 2012 , págs. 91–92.
  41. ^ Gabbrielli y Martini 2023 , págs.
  42. ^ Sebesta 2012 , págs. 97–99.
  43. ^ Gabbrielli y Martini 2023 , pag. 542.
  44. ^ Gabbrielli y Martini 2023 , págs. 474–475, 477, 542.
  45. ^ Gabbrielli y Martini 2023 , págs.
  46. ^ Gabbrielli y Martini 2023 , pag. 544.
  47. ^ Bezanson, Jeff; Karpinski, Stefan; Shah, Viral B.; Edelman, Alan (2012). "Julia: Un lenguaje dinámico rápido para la computación técnica". arXiv : 1209.5145 [ cs.PL ].
  48. ^ Sáez-López, JM, Román-González, M. y Vázquez-Cano, E., 2016. Lenguajes de programación visual integrados en todo el currículo de la escuela primaria: Un estudio de caso de dos años utilizando "Scratch" en cinco escuelas. Computers & Education, 97, pp.129-141.
  49. ^ Kodosky, J., 2020. LabVIEW. Actas de la ACM sobre lenguajes de programación, 4(HOPL), pp.1-54.
  50. ^ Fernando, A. y Warusawithana, L., 2020. Programación para principiantes de ballet: De principiante a profesional. Apress.
  51. ^ Baluprithviraj, KN, Bharathi, KR, Chendhuran, S. y Lokeshwaran, P., marzo de 2021. Puerta inteligente basada en inteligencia artificial con detección de mascarilla. En Conferencia Internacional de 2021 sobre Inteligencia Artificial y Sistemas Inteligentes (ICAIS) (págs. 543-548). IEEE.
  52. ^ Sewell, B., 2015. Blueprints: programación visual para Unreal Engine. Packt Publishing Ltd.
  53. ^ Bertolini, L., 2018. Desarrollo práctico de juegos sin programación: crea juegos 2D y 3D con programación visual en Unity. Packt Publishing Ltd.
  54. ^ Michael Sipser (1996). Introducción a la teoría de la computación . PWS Publishing. ISBN 978-0-534-94728-6.Sección 2.2: Autómatas de pila, págs. 101-114.
  55. ^ Jeffrey Kegler, " Perl y la indecidibilidad Archivado el 17 de agosto de 2009 en Wayback Machine ", The Perl Review . Los artículos 2 y 3 demuestran, utilizando respectivamente el teorema de Rice y la reducción directa al problema de la parada , que el análisis sintáctico de los programas Perl es, en general, indecidible.
  56. ^ Marty Hall, 1995, Apuntes de clase: Macros Archivados el 6 de agosto de 2013 en Wayback Machine , versión PostScript archivada el 17 de agosto de 2000 en Wayback Machine
  57. ^ Aaby, Anthony (2004). Introducción a los lenguajes de programación . Archivado del original el 8 de noviembre de 2012. Recuperado el 29 de septiembre de 2012 .
  58. ^ Michael Lee Scott, Pragmática del lenguaje de programación , 2.ª edición, Morgan Kaufmann, 2006, ISBN 0-12-633951-1págs. 18-19
  59. ^ a b Winskel, Glynn (5 de febrero de 1993). La semántica formal de los lenguajes de programación: una introducción . MIT Press. ISBN 978-0-262-73103-4.
  60. ^ Sebesta 2012 , pág. 244.
  61. ^ Sebesta 2012 , pág. 245.
  62. ^ a b c d Andrew Cooke. "Introducción a los lenguajes de programación" . Archivado del original el 15 de agosto de 2012. Recuperado el 13 de julio de 2012 .
  63. ^ Sebesta 2012 , págs. 15, 408–409.
  64. ^ Sebesta 2012 , págs. 303–304.
  65. ^ Sebesta 2012 , págs.
  66. ^ Sebesta 2012 , pág. 249.
  67. ^ Sebesta 2012 , pág. 260.
  68. ^ Sebesta 2012 , pág. 250.
  69. ^ Sebesta 2012 , pág. 254.
  70. ^ Sebesta 2012 , págs. 281–282.
  71. ^ Sebesta 2012 , págs. 272-273.
  72. ^ Sebesta 2012 , págs.
  73. ^ Sebesta 2012 , pág. 280.
  74. ^ Sebesta 2012 , págs. 289-290.
  75. ^ Sebesta 2012 , pág. 255.
  76. ^ Sebesta 2012 , págs.
  77. ^ Sebesta 2012 , pág. 477.
  78. ^ Sebesta 2012 , pág. 211.
  79. ^ Leivant, Daniel (1983). Inferencia de tipos polimórficos . Simposio ACM SIGACT-SIGPLAN sobre principios de lenguajes de programación. Austin, Texas: ACM Press. pp.  88–98 . doi : 10.1145/567067.567077 . ISBN 978-0-89791-090-3.
  80. ^ Sebesta 2012 , págs.
  81. ^ Sebesta 2012 , págs. 284–285.
  82. ^ Sebesta 2012 , pág. 576.
  83. ^ Sebesta 2012 , pág. 579.
  84. ^ Sebesta 2012 , pág. 585.
  85. ^ Sebesta 2012 , págs. 585–586.
  86. ^ Sebesta 2012 , págs.630, 634.
  87. ^ Sebesta 2012 , pág. 635.
  88. ^ a b Sebesta 2012 , pág. 631.
  89. ^ Sebesta 2012 , pág. 261.
  90. ^ Sebesta 2012 , pág. 632.
  91. ^ Sebesta 2012 , págs. 631, 635–636.
  92. ^ Sebesta 2012 , pág. 18.
  93. ^ Sebesta 2012 , pág. 19.
  94. ^ Nofre, Priestley y Alberts 2014 , pág. 55.
  95. ^ Nofre, Priestley y Alberts 2014 , pág. 60.
  96. ^ Sebesta 2012 , pág. 8.
  97. ^ Sebesta 2012 , págs. 16–17.
  98. ^ Sebesta 2012 , págs. 8–9.
  99. ^ Sebesta 2012 , págs. 9–10.
  100. ^ Sebesta 2012 , págs. 12–13.
  101. ^ Sebesta 2012 , pág. 13.
  102. ^ Sebesta 2012 , págs. 14–15.
  103. ^ Frederick P. Brooks, Jr.: El hombre-mes mítico , Addison-Wesley, 1982, págs. 93-94
  104. ^ Busbee, Kenneth Leroy; Braunschweig, Dave (15 de diciembre de 2018). "Bibliotecas estándar" . Fundamentos de programación: un enfoque modular estructurado . Recuperado el 27 de enero de 2024 .
  105. ^ Sebesta 2012 , pág. 15.
  106. ^ Sebesta 2012 , págs. 8, 16.
  107. ^ Sebesta 2012 , págs. 18, 23.
  108. ^ a b Sebesta 2012 , pág. 23.
  109. ^ Dijkstra, Edsger W. Sobre la insensatez de la "programación en lenguaje natural". Archivado el 20 de enero de 2008 en Wayback Machine EWD667.
  110. ^ Perlis, Alan (septiembre de 1982). "Epigramas sobre programación" . SIGPLAN Notices, vol. 17, n.º 9 , págs.  7-13 . Archivado del original el 17 de enero de 1999.
  111. ^ Milner, R .; M. Tofte ; R. Harper ; D. MacQueen (1997). La definición de ML estándar (revisada) . MIT Press. ISBN 978-0-262-63181-5.
  112. ^ Kelsey, Richard; William Clinger; Jonathan Rees (febrero de 1998). "Sección 7.2 Semántica formal" . Informe revisado 5 sobre el esquema del lenguaje algorítmico . Archivado del original el 6 de julio de 2006.
  113. ^ ANSI – Lenguaje de programación Rexx, X3-274.1996
  114. ^ Sebesta 2012 , págs. 23–24.
  115. ^ Sebesta 2012 , págs. 25–27.
  116. ^ Sebesta 2012 , pág. 27.
  117. ^ Sebesta 2012 , pág. 28.
  118. ^ Sebesta 2012 , págs. 29–30.
  119. ^ Véase: Oracle America, Inc. contra Google, Inc.
  120. ^ "Guía de lenguajes de programación | ComputerScience.org" . ComputerScience.org . Archivado del original el 13 de mayo de 2018. Consultado el 13 de mayo de 2018 .
  121. ^ "Lo básico" . ibm.com . 10 de mayo de 2011. Archivado del original el 14 de mayo de 2018. Consultado el 13 de mayo de 2018 .
  122. ^ Abdelaziz, Abdullah I.; Hanson, Kent A.; Gaber, Charles E.; Lee, Todd A. (2023). "Optimización del análisis de grandes conjuntos de datos del mundo real con archivos parquet en R: un tutorial paso a paso" . Farmacoepidemiología y seguridad de los medicamentos . 33 (3) e5728. doi : 10.1002/pds.5728 . PMID 37984998 . 
  123. ^ "HOPL: un listado interactivo de lenguajes de programación" . Australia: Universidad Murdoch . Archivado del original el 20 de febrero de 2011. Consultado el 1 de junio de 2009. Este sitio enumera 8512 lenguajes.
  124. ^ Mayer, Philip; Bauer, Alexander (2015). «Análisis empírico de la utilización de múltiples lenguajes de programación en proyectos de código abierto». Actas de la 19.ª Conferencia Internacional sobre Evaluación y Valoración en Ingeniería de Software . Actas de la 19.ª Conferencia Internacional sobre Evaluación y Valoración en Ingeniería de Software – EASE '15. Nueva York, NY, EE. UU.: ACM. págs. 4:1–4:10. doi : 10.1145/2745802.2745805 . ISBN 978-1-4503-3350-4Resultados : Encontramos (a) un promedio de 5 lenguajes por proyecto, con un lenguaje principal de propósito general claramente dominante y 5 tipos de DSL de uso frecuente; (b) una influencia significativa del tamaño, el número de commits y el lenguaje principal en el número de lenguajes, así como ninguna influencia significativa de la edad y el número de colaboradores; y (c) tres ecosistemas de lenguajes agrupados en torno a XML, Shell/Make y HTML/CSS. Conclusiones: La programación multilingüe parece ser común en proyectos de código abierto y es un factor que debe considerarse en las herramientas y al evaluar el desarrollo y el mantenimiento de dichos sistemas de software.
  125. ^ Abelson, Sussman y Sussman. "Estructura e interpretación de programas informáticos" . Archivado del original el 26 de febrero de 2009. Consultado el 3 de marzo de 2009 .{{cite web}}: CS1 maint: multiple names: authors list (link)
  126. ^ Vicki, Brown; Morin, Rich (1999). "Lenguajes de scripting" . MacTech . Archivado del original el 2 de diciembre de 2017.
  127. ^ Georgina Swan (21 de septiembre de 2009). "COBOL cumple 50 años" . Computerworld. Archivado del original el 19 de octubre de 2013. Recuperado el 19 de octubre de 2013 .
  128. ^ Ed Airey (3 de mayo de 2012). "7 mitos de COBOL desmentidos" . developer.com. Archivado del original el 19 de octubre de 2013. Recuperado el 19 de octubre de 2013 .
  129. ^ Nicholas Enticknap. "Encuesta salarial de TI de SSL/Computer Weekly: el auge financiero impulsa el crecimiento del empleo en TI" . Computer Weekly . Archivado del original el 26 de octubre de 2011. Recuperado el 14 de junio de 2013 .
  130. ^ "Conteo de lenguajes de programación por ventas de libros" . Radar.oreilly.com. 2 de agosto de 2006. Archivado del original el 17 de mayo de 2008.
  131. ^ Bieman, JM; Murdock, V., Búsqueda de código en la World Wide Web: una investigación preliminar, Actas del Primer Taller Internacional IEEE sobre Análisis y Manipulación de Código Fuente, 2001
  132. ^ "Lenguajes de programación más populares e influyentes de 2018" . stackify.com. 18 de diciembre de 2017. Archivado del original el 30 de agosto de 2018. Consultado el 29 de agosto de 2018 .
  133. ^ "Índice TIOBE" . Consultado el 24 de junio de 2024 .
  134. ^ "IEEE Spectrum" . Consultado el 25 de septiembre de 2025 .
  135. ^ Sebesta 2012 , pág. 21.
  136. ^ Sebesta 2012 , págs . 21-22.
  137. ^ Sebesta 2012 , pág. 12.
  138. ^ Sebesta 2012 , pág. 22.
  139. ^ Sebesta 2012 , págs. 22–23.

Lecturas adicionales

  • Abelson, Harold ; Sussman, Gerald Jay (1996). Estructura e interpretación de programas informáticos (2.ª ed.). MIT Press. Archivado del original el 9 de marzo de 2018.
  • Raphael Finkel : Diseño avanzado de lenguajes de programación , Addison Wesley, 1995.
  • Daniel P. Friedman , Mitchell Wand , Christopher T. Haynes : Fundamentos de los lenguajes de programación , The MIT Press, 2001.
  • David Gelernter , Suresh Jagannathan : Lingüística de la programación , The MIT Press, 1990.
  • Ellis Horowitz (ed.): Lenguajes de programación, un gran recorrido (3.ª ed.), 1987.
  • Ellis Horowitz: Fundamentos de los lenguajes de programación , 1989.
  • Shriram Krishnamurthi : Lenguajes de programación: aplicación e interpretación , publicación en línea archivada el 30 de abril de 2021 en Wayback Machine .
  • Gabbrielli, Maurizio; Martini, Simone (2023). Lenguajes de programación: principios y paradigmas (2.ª ed.). Springer. ISBN 978-3-031-34144-1.
  • Bruce J. MacLennan : Principios de los lenguajes de programación: diseño, evaluación e implementación , Oxford University Press , 1999.
  • John C. Mitchell : Conceptos en lenguajes de programación , Cambridge University Press, 2002.
  • Nofre, David; Priestley, Mark; Alberts, Gerard (2014). "Cuando la tecnología se convirtió en lenguaje: los orígenes de la concepción lingüística de la programación informática, 1950-1960". Technology and Culture . 55 (1): 40-75 . doi : 10.1353/tech.2014.0031 . ISSN  0040-165X . JSTOR  24468397. PMID  24988794 .
  • Benjamin C. Pierce : Tipos y lenguajes de programación , The MIT Press, 2002.
  • Terrence W. Pratt y Marvin Victor Zelkowitz : Lenguajes de programación: diseño e implementación (4.ª ed.), Prentice Hall 2000.
  • Peter H. Salus . Manual de lenguajes de programación (4 vols.). Macmillan 1998.
  • Ravi Sethi : Lenguajes de programación: conceptos y estructuras , 2.ª ed., Addison-Wesley, 1996.
  • Michael L. Scott y Jonathan Aldrich: Pragmática de los lenguajes de programación , 5.ª ed., Morgan Kaufmann Publishers, 2025.
  • Sebesta, Robert W. (2012). Conceptos de lenguajes de programación (10.ª ed.). Addison-Wesley. ISBN 978-0-13-139531-2.
  • Franklyn Turbak y David Gifford con Mark Sheldon: Conceptos de diseño en lenguajes de programación , The MIT Press, 2009.
  • Peter Van Roy y Seif Haridi . Conceptos, técnicas y modelos de programación informática , The MIT Press, 2004.
  • David A. Watt . Conceptos y paradigmas de los lenguajes de programación . Prentice Hall, 1990.
  • David A. Watt y Muffy Thomas . Sintaxis y semántica de los lenguajes de programación . Prentice Hall, 1991.
  • David A. Watt. Procesadores de lenguajes de programación . Prentice Hall, 1993.
  • David A. Watt. Conceptos de diseño de lenguajes de programación . John Wiley & Sons, 2004.
  • Wilson, Leslie B. (2001). Lenguajes de programación comparativos, tercera edición . Addison-Wesley. ISBN 0-201-71012-9.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Programming_language&oldid=1355574374 "