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.

Los programas para una computadora pueden ejecutarse en un proceso por lotes sin interacción humana, o un usuario puede escribir comandos en una sesión interactiva de un intérprete . En este caso, los "comandos" son simplemente programas cuya ejecución se encadena. Cuando un lenguaje puede ejecutar sus comandos a través de un intérprete (como un intérprete de comandos de Unix u otra interfaz de línea de comandos ) sin compilar, se denomina lenguaje de scripting . [ 126 ]

Medición del uso del lenguaje

Determinar cuál es el lenguaje de programación más utilizado es difícil, ya que la definición de uso varía según el contexto. Un lenguaje puede ocupar la mayor cantidad de horas de programación, otro tiene más líneas de código y un tercero puede consumir más tiempo de CPU. Algunos lenguajes son muy populares para tipos específicos de aplicaciones. Por ejemplo, COBOL sigue siendo fuerte en los centros de datos corporativos, a menudo en grandes mainframes ; [ 127 ] [ 128 ] Fortran en aplicaciones científicas y de ingeniería; Ada en aplicaciones aeroespaciales, de transporte, militares, en tiempo real y embebidas; y C en aplicaciones embebidas y sistemas operativos. Otros lenguajes se utilizan regularmente para escribir muchos tipos diferentes de aplicaciones.

Se han propuesto diversos métodos para medir la popularidad de un idioma, cada uno sujeto a un sesgo diferente en cuanto a lo que se mide:

  • contando el número de anuncios de trabajo que mencionan el idioma [ 129 ]
  • el número de libros vendidos que enseñan o describen el idioma [ 130 ]
  • estimaciones del número de líneas de código existentes escritas en el lenguaje , que pueden subestimar los lenguajes que no se encuentran con frecuencia en las búsquedas públicas [ 131 ] 
  • recuento de referencias a idiomas (es decir, al nombre del idioma) encontradas mediante un motor de búsqueda web.

Al combinar y promediar información de varios sitios de Internet, stackify.com informó los diez lenguajes de programación más populares (en orden descendente según su popularidad general): Java , C , C++ , Python , C# , JavaScript , VB.NET , R , PHP y 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

Un lenguaje de programación funcional permite aplicar sucesivamente funciones a los parámetros dados. Si bien muchos investigadores aprecian su simplicidad y elegancia, los problemas de eficiencia han impedido su adopción generalizada. [ 137 ]

Lógica

Un lenguaje de programación lógica está diseñado de tal manera que el software, en lugar del programador, decide en qué orden se ejecutan las instrucciones. [ 138 ]

Orientado a objetos

La programación orientada a objetos (POO) se caracteriza por rasgos como la abstracción de datos , la herencia y el despacho dinámico . La POO es compatible con la mayoría de los lenguajes imperativos más populares y algunos lenguajes funcionales. [ 136 ]

Margen

Si bien un lenguaje de marcado no es un lenguaje de programación propiamente dicho, puede permitir la integración con un lenguaje de programación.

Especial

Existen lenguajes de propósito especial que no se pueden comparar fácilmente con otros lenguajes de programación. [ 139 ]

Véase también

Referencias

  1. Tecnología de la información — Vocabulario .
  2. Sebesta, Robert W. (2023). Conceptos de lenguajes de programación (12.ª ed. global). Pearson. págs. 46–51 . ISBN   978-1-292-43682-1.
  3. ^ Sebesta, Robert (2022). Conceptos de lenguajes de programación: edición global (12ª edición global). Harlow: Pearson. pag. 41.ISBN   978-1-292-43682-1.
  4. "Lenguajes de alto nivel" . Informática ADA . 11 de mayo de 2026.
  5. Chauhan, Sharad (2013). "10". Lenguajes de programación: diseño y construcciones . University Science Press. pág. 235. ISBN  978-93-81159-41-5Consultado el 10 de septiembre de 2025. Al igual que nuestros lenguajes naturales, los lenguajes de programación facilitan la expresión y la comunicación entre personas. Sin embargo, se diferencian de los lenguajes naturales en dos aspectos. Primero, permiten la comunicación de ideas entre personas y máquinas. Segundo, tienen un dominio expresivo más limitado que los lenguajes naturales; es decir, solo facilitan la comunicación de ideas computacionales.
  6. Robert A. Edmunds, Glosario estándar de terminología informática de Prentice-Hall, Prentice-Hall, 1985, pág. 91
  7. Pascal Lando, Anne Lapujade, Gilles Kassel y Frédéric Fürst, Hacia una ontología general de programas informáticos Archivado el 7 de julio de 2015 en Wayback Machine , ICSOFT 2007 Archivado el 27 de abril de 2010 en Wayback Machine , págs. 163–170
  8. R. Narasimhan, Lenguajes de programación y computadoras: una metateoría unificada, págs. 189-247 en Franz Alt, Morris Rubinoff (eds.) Avances en computadoras, Volumen 8, Academic Press, 1994, ISBN 0-12-012108-5pág. 215: «[...] el modelo [...] para lenguajes informáticos difiere del [...] para lenguajes de programación en solo dos aspectos. En un lenguaje informático, solo hay un número finito de nombres —o registros— que pueden asumir solo un número finito de valores —o estados—, y estos estados no se distinguen además en términos de ningún otro atributo. [Nota del autor:] Esto puede parecer una obviedad, pero sus implicaciones son de gran alcance. Por ejemplo, implicaría que cualquier modelo para lenguajes de programación, al fijar ciertos parámetros o características, debería ser reducible de forma natural a un modelo para lenguajes informáticos.»
  9. John C. Reynolds, "Algunas reflexiones sobre la enseñanza de la programación y los lenguajes de programación", SIGPLAN Notices , Volumen 43, Número 11, noviembre de 2008, pág. 109
  10. Hierso, Severine (10 de junio de 2022). "Coding From 1849 to 2022: a Guide to The Timeline of Programming Languages" . IEEE Computer Society . Consultado el 1 de marzo de 2026 .
  11. Gabbrielli y Martini 2023 , pág. 519.
  12. ^ Gabbrielli y Martini 2023 , págs .
  13. ^ Gabbrielli y Martini 2023 , pág.521. 
  14. Gabbrielli y Martini 2023 , pág. 522.
  15. Sebesta 2012 , pág. 42.
  16. ^ Gabbrielli y Martini 2023 , pág.524. 
  17. Sebesta 2012 , págs. 42–44.
  18. ^ Gabbrielli y Martini 2023 , págs .
  19. Gabbrielli y Martini 2023 , pág. 527.
  20. ^ Gabbrielli y Martini 2023 , pág.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 , pág. 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 , pág. 525.
  29. ^ Gabbrielli y Martini 2023 , págs .
  30. Gabbrielli y Martini 2023 , pág. 531.
  31. 1 2 Sebesta 2012 , pág. 79.
  32. Gabbrielli y Martini 2023 , pág. 530.
  33. ^ Gabbrielli y Martini 2023 , págs .
  34. Gabbrielli y Martini 2023 , pág. 534.
  35. ^ Gabbrielli y Martini 2023 , págs .
  36. Gabbrielli y Martini 2023 , pág. 535.
  37. Sebesta 2012 , pág. 736.
  38. Gabbrielli y Martini 2023 , pág. 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 , pág. 542.
  44. ^ Gabbrielli y Martini 2023 , págs. 474–475, 477, 542.
  45. ^ Gabbrielli y Martini 2023 , págs .
  46. Gabbrielli y Martini 2023 , pág. 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. 1 2 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. 1 2 3 4 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 .
  71. Sebesta 2012 , págs .
  72. Sebesta 2012 , págs .
  73. Sebesta 2012 , pág. 280.
  74. Sebesta 2012 , págs .
  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 .
  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. 1 2 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. 1 2 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 .
  115. ^ Sebesta 2012 , págs. 25-27.
  116. Sebesta 2012 , pág. 27.
  117. Sebesta 2012 , pág. 28.
  118. Sebesta 2012 , págs .
  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: varios nombres: lista de autores ( enlace )
  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. Consultado 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. Consultado 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., Finding code on the World Wide Web: a preliminary investigation, Proceedings First IEEE International Workshop on Source Code Analysis and Manipulation, 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 .

Lecturas adicionales