stringtranslate.com

Lenguaje de programación

El código fuente de un programa informático en C. Las líneas grises son comentarios que explican el programa a los humanos. Cuando se compila y ejecuta , dará el resultado " ¡Hola, mundo! ".

Un lenguaje de programación es un sistema de notación para escribir programas de computadora . [1]

Los lenguajes de programación se describen en términos de su sintaxis (forma) y semántica (significado), generalmente definidos por un lenguaje formal . Los lenguajes normalmente proporcionan características tales como un sistema de tipos , variables y mecanismos para el manejo de errores . Una implementación de un lenguaje de programación en forma de compilador o intérprete permite ejecutar programas , ya sea directamente o produciendo lo que en programación se conoce como ejecutable .

La arquitectura informática ha influido fuertemente en el diseño de los lenguajes de programación, y el tipo más común ( lenguajes imperativos , que implementan operaciones en un orden específico) se desarrolló para funcionar bien en la popular arquitectura von Neumann . Si bien los primeros lenguajes de programación estaban estrechamente vinculados al hardware , con el tiempo han desarrollado una mayor abstracción para ocultar los detalles de implementación para una mayor simplicidad.

Se han desarrollado miles de lenguajes de programación, a menudo clasificados como imperativos, funcionales , lógicos u orientados a objetos , para una amplia variedad de usos. Muchos aspectos del diseño de lenguajes de programación implican compensaciones; por ejemplo, el manejo de excepciones simplifica el manejo de errores, pero a un costo de rendimiento. La teoría de los lenguajes de programación es el subcampo de la informática que estudia el diseño, implementación, análisis, caracterización y clasificación de los lenguajes de programación.

Definiciones

Hay una variedad de criterios que se pueden considerar al definir qué constituye un lenguaje de programación.

Lenguajes informáticos vs lenguajes de programación

El término lenguaje informático a veces se utiliza indistintamente con lenguaje de programación. [2] Sin embargo, el uso de ambos términos varía entre los autores, incluido el alcance exacto de cada uno. Un uso describe los lenguajes de programación como un subconjunto de lenguajes informáticos. [3] De manera similar, los lenguajes utilizados en informática que tienen un objetivo diferente al de expresar programas informáticos se denominan genéricamente lenguajes informáticos. Por ejemplo, a los lenguajes de marcado a veces se les denomina lenguajes de computadora para enfatizar que no están destinados a usarse para programación. [4] Una forma de clasificar los lenguajes informáticos es mediante los cálculos que son capaces de expresar, como lo describe la teoría de la computación . La mayoría de los lenguajes de programación prácticos son Turing completo , [5] y todos los lenguajes Turing completo pueden implementar el mismo conjunto de algoritmos . ANSI/ISO SQL-92 y Charity son ejemplos de lenguajes que no son completos de Turing, pero que a menudo se denominan lenguajes de programación. [6] [7] Sin embargo, algunos autores restringen el término "lenguaje de programación" a los lenguajes completos de Turing. [1] [8]

Otro uso considera los lenguajes de programación como construcciones teóricas para programar máquinas abstractas y los lenguajes informáticos como el subconjunto de los mismos que se ejecuta en computadoras físicas, que tienen recursos de hardware finitos. [9] John C. Reynolds enfatiza que los lenguajes de especificación formal son tanto lenguajes de programación como los lenguajes destinados a la ejecución. También sostiene 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 del lenguaje de programación es la razón de muchas fallas en los formatos de entrada. [10]

Dominio y destino

En la mayoría de los contextos prácticos, un lenguaje de programación implica una computadora; en consecuencia, los lenguajes de programación suelen definirse y estudiarse de esta manera. [11] Los lenguajes de programación se diferencian de los lenguajes naturales en que los lenguajes naturales solo se utilizan para la interacción entre personas, mientras que los lenguajes de programación también permiten a los humanos comunicar instrucciones a las máquinas.

También vale la pena considerar el dominio del idioma. Los lenguajes de marcado como XML , HTML o troff , que definen datos estructurados , no suelen considerarse lenguajes de programación. [12] [13] [14] Sin embargo, los lenguajes de programación pueden compartir la sintaxis con los lenguajes de marcado si se define una semántica computacional. XSLT , por ejemplo, es un lenguaje completo de Turing que utiliza enteramente sintaxis XML. [15] [16] [17] Además, LaTeX , que se utiliza principalmente para estructurar documentos, también contiene un subconjunto completo de Turing. [18] [19]

abstracciones

Los lenguajes de programación suelen contener abstracciones para definir y manipular estructuras de datos o controlar el flujo de ejecución . La necesidad práctica de que un lenguaje de programación admita abstracciones adecuadas se expresa mediante el principio de abstracción . [20] Este principio a veces se formula como una recomendación al programador para que haga un uso adecuado de dichas abstracciones. [21]

Historia

Primeros desarrollos

A finales de los años 40 se inventaron los primeros ordenadores programables y, con ellos, los primeros lenguajes de programación. [22] Las primeras computadoras se programaron en lenguajes de programación de primera generación (1GL), lenguaje de máquina (instrucciones simples que el procesador podía ejecutar directamente). Este código era muy difícil de depurar y no era portátil entre diferentes sistemas informáticos. [23] Para mejorar la facilidad de programación, se inventaron los lenguajes ensambladores (o lenguajes de programación de segunda generación, 2GL), que se diferenciaban del lenguaje de máquina para hacer que los programas fueran más fáciles de entender para los humanos, aunque no aumentaron la portabilidad. [24]

Inicialmente, los recursos de hardware eran escasos y caros, mientras que los recursos humanos eran más baratos. Por lo tanto, se favorecieron los lenguajes engorrosos que requerían mucho tiempo de uso, pero que estaban más cerca del hardware para una mayor eficiencia. [25] La introducción de 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 cambio, fueron diseñados para expresar algoritmos que los humanos pudieran entender más fácilmente. Por ejemplo, las expresiones aritméticas ahora podrían escribirse en notación simbólica y luego traducirse a código de máquina que el hardware podría ejecutar. [24] En 1957, se inventó Fortran (TRADUCCIÓN DE FÓRMULA). A menudo considerado el primer lenguaje de programación compilado de alto nivel, [24] [26] Fortran se ha mantenido en uso hasta el siglo XXI. [27]

Décadas de 1960 y 1970

Dos personas usando una computadora central IBM 704 , el primer hardware que admite aritmética de punto flotante , en 1957. Fortran fue diseñado para esta máquina. [28] [27]

Alrededor de 1960 se desarrollaron los primeros mainframes (ordenadores de uso general), aunque sólo podían ser operados por profesionales y el coste era extremo. Los datos y las instrucciones se ingresaron mediante tarjetas perforadas , lo que significa que no se pudo agregar ninguna entrada mientras el programa estaba en ejecución. Por lo tanto, los lenguajes desarrollados en este momento están diseñados para una interacción mínima. [29] Después de la invención del microprocesador , las computadoras en la década de 1970 se volvieron dramáticamente más baratas. [30] Las nuevas computadoras también permitieron una mayor interacción del usuario, que fue respaldada por lenguajes de programación más nuevos. [31]

Lisp , implementado en 1958, fue el primer lenguaje de programación funcional . [32] A diferencia de Fortran, admite recursividad y expresiones condicionales , [33] y también introdujo la gestión dinámica de la memoria en un montón y la recolección automática de basura . [34] Durante las siguientes décadas, Lisp dominó las aplicaciones de inteligencia artificial . [35] En 1978, otro lenguaje funcional, ML , introdujo tipos inferidos y parámetros polimórficos . [31] [36]

Después del lanzamiento de ALGOL (lenguaje ALGOrithmic) en 1958 y 1960, [37] se convirtió en el estándar en la literatura informática para describir algoritmos . Aunque su éxito comercial fue limitado, los lenguajes imperativos más populares, incluidos C , Pascal , Ada , C++ , Java y C# , descienden directa o indirectamente de ALGOL 60. [38] [27] Entre sus innovaciones adoptadas por lenguajes de programación posteriores se incluyen mayor portabilidad y el primer uso de gramática BNF libre de contexto . [39] Simula , el primer lenguaje que admite programación orientada a objetos (incluidos subtipos , despacho dinámico y herencia ), también desciende de ALGOL y logró un éxito comercial. [40] C, otro descendiente de ALGOL, ha mantenido su popularidad hasta el siglo XXI. C permite el acceso a operaciones de máquinas de nivel inferior más que otros lenguajes contemporáneos. Su potencia y eficiencia, generadas en parte con operaciones de puntero flexibles , tienen el costo de hacer más difícil escribir código correcto. [31]

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. [41] [42] Con la programación lógica, el programador especifica un resultado deseado y permite al intérprete decidir cómo lograrlo. [43] [42]

Década de 1980 a 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ó las funciones para las cuales se utilizaban los lenguajes de programación. [44] Los nuevos lenguajes introducidos en la década de 1980 incluyeron C++, un superconjunto de C que puede compilar programas en C pero que también admite clases y herencia . [45] Ada y otros lenguajes nuevos introdujeron soporte para la concurrencia . [46] El gobierno japonés invirtió mucho en los llamados lenguajes de quinta generación que agregaron soporte para la concurrencia a las construcciones de programación lógica, pero estos lenguajes fueron superados por otros lenguajes que soportan la concurrencia. [47] [48]

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 respaldar las páginas web y las redes . [49] Java , basado en C++ y diseñado para una mayor portabilidad entre sistemas y seguridad, disfrutó de un éxito a gran escala porque estas características son esenciales para muchas aplicaciones de Internet. [50] [51] Otro desarrollo fue el de los lenguajes de secuencias de comandos escritos dinámicamente ( Python , 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 . [52] [53]

2000 hasta el presente

Durante la década de 2000, se produjo una desaceleración en el desarrollo de nuevos lenguajes de programación que alcanzaron una gran popularidad. [54] Una innovación fue la programación orientada a servicios , diseñada para explotar sistemas distribuidos 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. [55] Ideas cruzadas de C# y F# entre programación imperativa y funcional. [56] Después de 2010, varios lenguajes nuevos ( Rust , Go , Swift , Zig y Carbon ) compitieron por el software de rendimiento crítico para el que históricamente se había utilizado C. [57] La ​​mayoría de los nuevos lenguajes de programación utilizan escritura estática, mientras que algunos lenguajes nuevos utilizan escritura dinámica como Ring y Julia . [58] [59]

Algunos de los nuevos lenguajes de programación se clasifican como lenguajes de programación visual como Scratch , LabVIEW y PWCT . Además, algunos de estos lenguajes combinan el uso de programación visual y textual como Ballerina . [60] [61] [62] [63] Además, esta tendencia conduce al desarrollo de proyectos que ayudan a desarrollar nuevos VPL como Blockly de Google . [64] Muchos motores de juegos como Unreal y Unity también agregaron soporte para secuencias de comandos visuales. [65] [66]

Elementos

Todos los lenguajes de programación tienen algunos bloques de construcción primitivos para la descripción de datos y los procesos o transformaciones que se les aplican (como la suma de dos números o la selección de un elemento de una colección). Estas primitivas están definidas por reglas sintácticas y semánticas que describen su estructura y significado respectivamente.

Sintaxis

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

La forma superficial de un lenguaje de programación se conoce como sintaxis . La mayoría de los lenguajes de programación son puramente textuales; utilizan secuencias de texto que incluyen palabras, números y puntuación, de forma muy parecida a los lenguajes naturales escritos. Por otro lado, algunos lenguajes de programación son de naturaleza más gráfica y utilizan relaciones visuales entre símbolos para especificar un programa.

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

La sintaxis del lenguaje de programación generalmente se define mediante una combinación de expresiones regulares (para la estructura léxica ) y la forma 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ímbolonúmero ::= [+-]?['0'-'9']+símbolo ::= ['A'-'Z''a'-'z'].*lista ::= '(' expresión* ')'

Esta gramática especifica lo siguiente:

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. No obstante, muchos programas sintácticamente correctos están mal formados, según las reglas del lenguaje; y puede (dependiendo de la especificación del idioma y la solidez de la implementación) dar como resultado un error en la traducción o ejecución. En algunos casos, dichos programas pueden exhibir un comportamiento indefinido . Incluso cuando un programa está bien definido dentro de un lenguaje, aún puede tener un significado que no es el previsto por la persona que lo escribió.

Usando el lenguaje natural como ejemplo, 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 lenguaje 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 que tiene un tipo complejo y p->imno está definida porque el valor de pes el puntero nulo ):

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

Si se omitiera la declaración de tipo en la primera línea, el programa generaría un error en la variable no definida pdurante la compilación. Sin embargo, el programa seguiría siendo sintácticamente correcto ya que las declaraciones de tipo sólo 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 . [67] Algunos lenguajes, incluidos Perl y Lisp, contienen construcciones que permiten la ejecución durante la fase de análisis. Los lenguajes que tienen construcciones que permiten al programador alterar el comportamiento del analizador hacen que el análisis de sintaxis sea un problema indecidible y, en general, desdibujan la distinción entre análisis y ejecución. [68] A diferencia del sistema de macros de Lisp y los bloques de Perl BEGIN, que pueden contener cálculos generales, las macros en C son simplemente reemplazos de cadenas y no requieren ejecución de código. [69]

Semántica

El término semántica se refiere al significado de las lenguas, a diferencia de su forma (sintaxis).

Semántica estática

La semántica estática define restricciones a la estructura de textos válidos que son difíciles o imposibles de expresar en formalismos sintácticos estándar. [1] [ verificación fallida ] Para los lenguajes compilados, la semántica estática esencialmente incluye aquellas reglas semánticas que se pueden verificar en el momento de la compilación. Los ejemplos incluyen verificar que cada identificador se declare antes de usarse (en idiomas que requieren tales declaraciones) o que las etiquetas en los brazos de una declaración de caso sean distintas. [70] Muchas restricciones importantes de este tipo, como verificar que los identificadores se utilicen en el contexto apropiado (por ejemplo, no agregar un número entero al nombre de una función), o que las llamadas a subrutinas tengan el número y tipo de argumentos apropiados, se pueden imponer definiendo ellos 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 ser parte de la semántica estática. Los lenguajes de programación como Java y C# tienen un análisis de asignación definido , una forma de análisis de flujo de datos, como parte de su respectiva semántica estática.

Semántica dinámica

Una vez que se han especificado los datos, se debe indicar a la máquina que realice operaciones con los datos. Por ejemplo, la semántica puede definir la estrategia mediante la cual las expresiones se evalúan en valores, o la manera en que las estructuras de control ejecutan sentencias condicionalmente . 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 el comportamiento de un programa. Hay muchas formas 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 visto una aplicación limitada al diseño e implementación de lenguajes de programación fuera del mundo académico.

Sistema de tipos

Un sistema de tipos define cómo un lenguaje de programación clasifica valores y expresiones en tipos , cómo puede manipular esos tipos y cómo interactúan. El objetivo de un sistema de tipos es verificar y, por lo general, imponer un cierto nivel de corrección en los programas escritos en ese idioma mediante la detección de ciertas operaciones incorrectas. Cualquier sistema de tipo decidible implica una compensación: si bien rechaza muchos programas incorrectos, también puede prohibir algunos programas correctos, aunque inusuales. Para evitar este inconveniente, varios lenguajes tienen lagunas de tipos , generalmente conversiones no controladas que el programador puede utilizar para permitir explícitamente una operación normalmente no permitida entre diferentes tipos. En la mayoría de los lenguajes mecanografiados, el sistema de tipos se utiliza sólo para programas de verificación de tipos , pero varios lenguajes, generalmente funcionales, infieren tipos , liberando al programador de la necesidad de escribir anotaciones de tipo. El diseño formal y el estudio de sistemas de tipos se conoce como teoría de tipos .

Idiomas escritos versus no escritos

Un idioma se tipifica si la especificación de cada operación define los tipos de datos a los que se aplica la operación. [71] Por ejemplo, los datos representados por "this text between the quotes"es una cadena , y en muchos lenguajes de programación, dividir un número por una cadena no tiene significado y no se ejecutará. La operación no válida puede detectarse cuando se compila el programa (verificación de tipo "estática") y será rechazada por el compilador con un mensaje de error de compilación, o puede detectarse mientras el programa se está ejecutando (verificación de tipo "dinámica"), lo que resulta en una excepción de tiempo de ejecución . Muchos lenguajes permiten que una función llamada controlador de excepciones maneje esta excepción y, por ejemplo, siempre devuelva "-1" como resultado.

Un caso especial de lenguajes tipificados son los lenguajes de tipo único . Suelen ser lenguajes de programación o de marcado, como REXX o SGML , y tienen un solo tipo de datos [ dudoso ] – más comúnmente cadenas de caracteres que se utilizan tanto para datos simbólicos como numéricos.

En cambio, un lenguaje sin tipo , como la mayoría de los lenguajes ensambladores , permite realizar cualquier operación sobre cualquier dato, generalmente secuencias de bits de varias longitudes. [71] Los lenguajes no tipificados de alto nivel incluyen BCPL , Tcl y algunas variedades de Forth .

En la práctica, si bien pocos lenguajes se consideran tipificados según la teoría de tipos (verificando o rechazando todas las operaciones), la mayoría de los lenguajes modernos ofrecen cierto grado de tipificación. [71] Muchos lenguajes de producción proporcionan medios para eludir o subvertir el sistema de tipos, intercambiando la seguridad de tipos por un control más preciso sobre la ejecución del programa (ver casting ).

Escritura estática frente a dinámica

En la escritura estática , todos los tipos de expresiones se determinan antes de que se ejecute un programa, normalmente en tiempo de compilación. Por ejemplo, 1 y (2+2) son expresiones enteras; no pueden pasarse a una función que espera una cadena ni almacenarse en una variable definida para contener fechas. [71]

Los lenguajes de tipo estático pueden ser de tipo manifiesto o de tipo inferido . En el primer caso, el programador debe escribir tipos explícitamente en ciertas posiciones textuales (por ejemplo, en declaraciones de variables ). En el segundo caso, el compilador infiere los tipos de expresiones y declaraciones según el contexto. La mayoría de los lenguajes convencionales de tipado estático, como C++ , C# y Java , están claramente tipificados. La inferencia de tipos completa se ha asociado tradicionalmente con lenguajes funcionales como Haskell y ML . [72] Sin embargo, muchos lenguajes de tipo manifiesto admiten la inferencia de tipo parcial; por ejemplo, C++ , Java y C# infieren tipos en ciertos casos limitados. [73] Además, algunos lenguajes de programación permiten que algunos tipos se conviertan automáticamente a otros tipos; por ejemplo, se puede usar un int donde el programa espera un flotante.

La escritura dinámica , también llamada escritura latente , determina la seguridad de tipos de las operaciones en tiempo de ejecución; en otras palabras, los tipos están asociados con valores en tiempo de ejecución en lugar de expresiones textuales . [71] Al igual que con los lenguajes de tipo inferido, los lenguajes de tipo dinámico no requieren que el programador escriba anotaciones de tipo explícitas en las expresiones. Entre otras cosas, esto puede permitir que una sola variable haga referencia a valores de diferentes tipos en diferentes puntos de la ejecución del programa. Sin embargo, los errores de tipo no se pueden detectar automáticamente hasta que se ejecuta realmente un fragmento de código, lo que podríadificultar la depuración . Lisp , Smalltalk , Perl , Python , JavaScript , Ruby , Ring y Julia son ejemplos de lenguajes tipados dinámicamente.

Escritura débil y fuerte

La tipificación débil permite que un valor de un tipo sea tratado como otro, por ejemplo, tratando una cadena como un número. [71] Esto puede ser útil ocasionalmente, pero también puede permitir que algunos tipos de fallas del programa pasen desapercibidas en el tiempo de compilación e incluso en el tiempo de ejecución .

La escritura fuerte previene estos fallos del programa. Un intento de realizar una operación con el tipo de valor incorrecto genera un error. [71] Los lenguajes fuertemente tipados a menudo se denominan de tipo seguro o seguro .

Una definición alternativa de "tipo débil" se refiere a lenguajes como Perl , Ring y JavaScript , que permiten una gran cantidad de conversiones de tipos implícitas. En JavaScript, por ejemplo, la expresión 2 * xse convierte implícitamente xen un número y esta conversión se realiza correctamente incluso si xes null, undefined, Arrayo una cadena de letras. Estas conversiones implícitas suelen ser útiles, pero pueden enmascarar errores de programación. Fuerte y estático ahora se consideran generalmente conceptos ortogonales, pero su uso en la literatura difiere. Algunos usan el término fuertemente tipado para significar fuertemente, tipado estáticamente o, de manera aún más confusa, para significar simplemente tipado estáticamente . Por lo tanto, C ha sido llamado tanto de tipo fuerte como de tipo débil y estático. [74] [75] [76]

Puede parecer extraño para algunos programadores profesionales que C pueda tener un "tipo débil y estático". Sin embargo, el uso del puntero genérico, el puntero void* , permite convertir punteros a otros punteros sin necesidad de realizar una conversión explícita. Esto es extremadamente similar a convertir de alguna manera una matriz de bytes a cualquier tipo de datos en C sin utilizar una conversión explícita, como (int)o (char).

Biblioteca estándar y sistema de tiempo de ejecución

La mayoría de los lenguajes de programación tienen una biblioteca central asociada (a veces conocida como "biblioteca estándar", especialmente si se incluye como parte del estándar de lenguaje publicado), que convencionalmente está disponible en todas las implementaciones del lenguaje. Las bibliotecas principales suelen incluir definiciones de algoritmos, estructuras de datos y mecanismos de entrada y salida de uso común.

La línea entre un idioma y su biblioteca principal difiere de un idioma a otro. En algunos casos, los diseñadores del lenguaje pueden tratar la biblioteca como una entidad separada del lenguaje. Sin embargo, los usuarios suelen tratar la biblioteca principal de un lenguaje como parte del mismo, y algunas especificaciones del lenguaje incluso requieren que esta biblioteca esté disponible en todas las implementaciones. De hecho, algunos lenguajes están diseñados de manera que los significados de ciertas construcciones sintácticas ni siquiera pueden describirse sin consultar la biblioteca central. Por ejemplo, en Java , una cadena literal se define como una instancia de la java.lang.Stringclase; de manera similar, en Smalltalk , una expresión de función anónima (un "bloque") construye una instancia de la BlockContextclase de la biblioteca. Por el contrario, Scheme contiene múltiples subconjuntos coherentes que son suficientes para construir el resto del lenguaje como macros de biblioteca, por lo que los diseñadores del lenguaje ni siquiera se molestan en decir qué partes del lenguaje deben implementarse como construcciones del lenguaje y cuáles deben implementarse como partes. de una biblioteca.

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 a nivel de subprograma. [77] En 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 múltiples procesadores simultáneamente para lograr un mejor rendimiento. [78] Los lenguajes interpretados como Python y Ruby no admiten el uso simultáneo de múltiples procesadores. [79] Otros lenguajes de programación admiten la gestión de datos compartidos entre diferentes subprocesos controlando el orden de ejecución de instrucciones clave mediante el uso de semáforos , controlando el acceso a datos compartidos a través de monitor o permitiendo el paso de mensajes entre subprocesos. [80]

Manejo de excepciones

Muchos lenguajes de programación incluyen controladores de excepciones, una sección de código activada por errores de tiempo de ejecución que puede solucionarlos de dos maneras principales: [81]

Algunos lenguajes de programación admiten dedicar un bloque de código para ejecutarlo independientemente de si se produce una excepción antes de alcanzar el código; esto se llama finalización. [82]

Existe una compensación entre una mayor capacidad para manejar excepciones y un rendimiento reducido. [83] Por ejemplo, aunque los errores de índice de matriz son comunes [84] C no los verifica por razones de rendimiento. [83] Aunque los programadores pueden escribir código para detectar excepciones definidas por el usuario, esto puede saturar un programa. Las bibliotecas estándar en algunos lenguajes, como C, usan sus valores de retorno para indicar una excepción. [85] Algunos lenguajes y sus compiladores tienen la opción de activar y desactivar la capacidad de manejo de errores, ya sea temporal o permanentemente. [86]

Diseño e implementación

Los lenguajes de programación comparten propiedades con los lenguajes naturales relacionados con su propósito como vehículos de comunicación, teniendo una forma sintáctica separada de su semántica y mostrando familias de lenguajes de lenguajes relacionados que se ramifican entre sí. [87] [88] Pero como construcciones artificiales, también difieren en aspectos fundamentales de los lenguajes que han evolucionado a través del uso. Una diferencia significativa es que un lenguaje de programación se puede describir y estudiar completamente en su totalidad ya que tiene una definición precisa y finita. [89] Por el contrario, las lenguas naturales tienen significados cambiantes dados por sus usuarios en diferentes comunidades. Si bien los lenguajes construidos también son lenguajes artificiales diseñados desde cero con un propósito específico, carecen de la definición semántica precisa y completa que tiene un lenguaje de programación.

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 finalmente han caído en desuso. Aunque ha habido intentos de diseñar un lenguaje de programación "universal" que sirva para todos los propósitos, ninguno de ellos ha logrado ser generalmente aceptado para cumplir esta función. [90] La necesidad de diversos lenguajes de programación surge de la diversidad de contextos en los que se utilizan los lenguajes:

Una tendencia común en el desarrollo de lenguajes de programación ha sido agregar más capacidad para resolver problemas utilizando un mayor nivel de abstracción . Los primeros lenguajes de programación estaban muy vinculados al hardware subyacente de la computadora. A medida que se desarrollaron nuevos lenguajes de programación, se agregaron características que permiten 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 atados a la complejidad de la computadora, sus programas pueden realizar más cálculos con menos esfuerzo por parte del programador. Esto les permite escribir más funciones por unidad de tiempo. [91]

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 sigue siendo lejano y sus beneficios están abiertos a debate. Edsger W. Dijkstra adoptó la posición de que el uso de un lenguaje formal es esencial para evitar la introducción de construcciones sin sentido y descartó la programación en lenguaje natural como "tonta". [92] Alan Perlis se mostró igualmente desdeñoso ante la idea. [93] Se han adoptado enfoques híbridos en inglés estructurado y SQL .

Los diseñadores y usuarios de un lenguaje deben construir una serie de artefactos que gobiernen y permitan la práctica de la programación. Los más importantes de estos artefactos son la especificación e implementación del lenguaje .

Especificación

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

Una especificación de lenguaje de programación puede adoptar varias formas, incluidas las siguientes:

Implementación

Una implementación de un lenguaje de programación es la conversión de un programa en código de máquina que puede ser ejecutado por el hardware. Luego, el código de máquina se puede ejecutar con la ayuda del sistema operativo . [97] 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 de máquina, conocido como ejecutable . Una vez compilado el programa, se ejecutará más rápidamente que con otros métodos de implementación. [98] Algunos compiladores pueden proporcionar una optimización adicional para reducir el uso de memoria o cálculo cuando se ejecuta el ejecutable, pero aumentan el tiempo de compilación. [99]

Otro método de implementación es ejecutar el programa con un intérprete , que traduce cada línea de software a código de máquina justo antes de ejecutarse. Aunque puede facilitar la depuración, la desventaja de la interpretación es que se ejecuta entre 10 y 100 veces más lento que un ejecutable compilado. [100] 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 que esto adopta 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 de máquina inmediatamente antes de la ejecución. [101]

Idiomas propietarios

Aunque la mayoría de los lenguajes de programación más utilizados tienen especificaciones e implementaciones completamente abiertas, muchos lenguajes de programación existen solo como lenguajes de programación propietarios y la implementación está disponible únicamente a través de un único proveedor, que puede afirmar que dicho lenguaje propietario es su propiedad intelectual. Los lenguajes de programación propietarios suelen ser lenguajes de dominio específico o lenguajes de secuencias de comandos internos para un solo producto; Algunos lenguajes propietarios se utilizan sólo internamente dentro de un proveedor, mientras que otros están disponibles para usuarios externos. [ cita necesaria ]

Algunos lenguajes de programación existen en la frontera entre propietarios y abiertos; por ejemplo, Oracle Corporation afirma derechos de propiedad sobre algunos aspectos del lenguaje de programación Java , [102] 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 sistema cerrado. ambiente. [103]

Muchos lenguajes propietarios se utilizan ampliamente, a pesar de su naturaleza patentada; los ejemplos incluyen MATLAB , VBScript y Wolfram Language . Algunos idiomas pueden hacer la transición de cerrados a abiertos; por ejemplo, Erlang era originalmente el lenguaje de programación interno de Ericsson. [104]

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

Usar

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

Los lenguajes de programación se diferencian de la mayoría de las otras formas de expresión humana en que requieren un mayor grado de precisión e integridad. Cuando se utiliza un lenguaje natural para comunicarse con otras personas, los autores y hablantes humanos pueden ser ambiguos y cometer pequeños errores, y aun así esperar que se comprenda su intención. Sin embargo, en sentido figurado, las computadoras "hacen exactamente lo que se les dice que hagan" y no pueden "entender" qué código pretendía escribir el programador. La combinación de la definición del lenguaje, un programa y las entradas del programa debe especificar completamente el comportamiento externo que ocurre cuando se ejecuta el programa, dentro del dominio de control de ese programa. Por otro lado, las ideas sobre un algoritmo se pueden comunicar a los humanos sin la precisión necesaria para su ejecución mediante el uso de pseudocódigo , que entrelaza el lenguaje natural con el código escrito en un lenguaje de programación.

Un lenguaje de programación proporciona un mecanismo estructurado para definir piezas de datos y las operaciones o transformaciones que pueden realizarse automáticamente en esos datos. 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 ). [108] La programación es el proceso mediante el cual los programadores combinan estas primitivas 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 está encadenada. Cuando un lenguaje puede ejecutar sus comandos a través de un intérprete (como un shell de Unix u otra interfaz de línea de comandos ), sin compilar, se le llama lenguaje de scripting . [109]

Medir el uso del lenguaje

Es difícil determinar cuál es el lenguaje de programación más utilizado ya que la definición de uso varía según el contexto. Un lenguaje puede ocupar la mayor cantidad de horas de programador, 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 particulares de aplicaciones. Por ejemplo, COBOL sigue siendo fuerte en el centro de datos corporativo, a menudo en grandes mainframes ; [110] [111] Fortran en aplicaciones científicas y de ingeniería; Ada en aplicaciones aeroespaciales, de transporte, militares, en tiempo real e integradas; y C en aplicaciones integradas y sistemas operativos. Regularmente se utilizan otros lenguajes para escribir muchos tipos diferentes de aplicaciones.

Se han propuesto varios métodos para medir la popularidad del idioma, cada uno sujeto a un sesgo diferente sobre lo que se mide:

Combinando y promediando información de varios sitios de Internet, stackify.com informó los diez lenguajes de programación más populares (en orden descendente por popularidad general): Java , C , C++ , Python , C# , JavaScript , VB.NET , R , PHP y MATLAB. . [115]

En febrero de 2024, los cinco lenguajes de programación principales según el índice TIOBE son Python , C , C++ , Java y C# . TIOBE proporciona una lista de los 100 lenguajes de programación principales según su popularidad y actualiza esta lista cada mes. [116]

Dialectos, sabores e implementaciones.

Un dialecto de un lenguaje de programación o de 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. En lenguajes como Scheme y Forth , los implementadores pueden considerar que los estándares son insuficientes, inadecuados o ilegítimos, por lo que a menudo se desvían del estándar y crean un nuevo dialecto . En otros casos, se crea un dialecto para su uso en un idioma de dominio específico , a menudo un subconjunto. En el mundo Lisp , la mayoría de los lenguajes que usan sintaxis básica de expresión S y semántica similar a Lisp se consideran dialectos Lisp, aunque varían enormemente como lo hacen, por ejemplo, Racket y Clojure . Como es común que un idioma tenga varios dialectos, puede resultar bastante difícil para un programador sin experiencia encontrar la documentación adecuada. El idioma BASIC tiene muchos dialectos .

Clasificaciones

Los lenguajes de programación a menudo se clasifican en cuatro categorías principales: imperativos , funcionales , lógicos y orientados a objetos . [117]

Aunque los lenguajes de marcado no son lenguajes de programación, algunos tienen extensiones que admiten programación limitada. Además, existen lenguajes de propósito especial que no se comparan fácilmente con otros lenguajes de programación. [121]

Ver también

Referencias

  1. ^ abc Aaby, Anthony (2004). Introducción a los lenguajes de programación. Archivado desde el original el 8 de noviembre de 2012 . Consultado el 29 de septiembre de 2012 .
  2. ^ Robert A. Edmunds, Glosario estándar de terminología informática de Prentice-Hall, Prentice-Hall, 1985, pág. 91
  3. ^ Pascal Lando, Anne Lapujade, Gilles Kassel y Frédéric Fürst, Hacia una ontología general de los 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.
  4. ^ SK Bajpai, Introducción a las computadoras y la programación en C , New Age International, 2007, ISBN 81-224-1379-X , p. 346 
  5. ^ "Completitud de Turing". www.cs.odu.edu . Consultado el 5 de octubre de 2022 .
  6. ^ Corporación de equipos digitales. "Tecnología de la información - Lenguaje de base de datos SQL (texto revisado propuesto de DIS 9075)". ISO/IEC 9075:1992, Lenguaje de base de datos SQL . Archivado desde el original el 21 de junio de 2006 . Consultado el 29 de junio de 2006 .
  7. ^ The Charity Development Group (diciembre de 1996). "La página de inicio de CARIDAD". Archivado desde el original el 18 de julio de 2006., "Charity es un lenguaje de programación categórico...", "Todos los cálculos de Charity terminan".
  8. ^ En términos matemáticos, esto significa que el lenguaje de programación es Turing completo MacLennan, Bruce J. (1987). Principios de los lenguajes de programación . Prensa de la Universidad de Oxford. pag. 1.ISBN 978-0-19-511306-8.
  9. ^ 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-5 , p.215: "[...] el modelo [...] para los lenguajes informáticos difiere del [...] para los lenguajes de programación sólo en dos aspectos. En un lenguaje informático, sólo hay un número finito de nombres o registros —que sólo puede asumir un número finito de valores —o estados— y estos estados no se distinguen en términos de ningún otro atributo [nota al pie del autor:] Esto puede parecer una perogrullada, pero sus implicaciones son de gran alcance. Implica que cualquier modelo para lenguajes de programación, al fijar ciertos de sus parámetros o características, debería ser reducible de forma natural a un modelo para lenguajes de computadora". 
  10. ^ John C. Reynolds, "Algunas reflexiones sobre la enseñanza de la programación y los lenguajes de programación", Avisos SIGPLAN , volumen 43, número 11, noviembre de 2008, p.109
  11. ^ Ben Ari, Mordejai (1996). Comprensión de los lenguajes de programación . John Wiley e hijos. Los programas y lenguajes pueden definirse como objetos matemáticos puramente formales. Sin embargo, hay más gente interesada en los programas que en otros objetos matemáticos como los grupos, precisamente porque es posible utilizar el programa (la secuencia de símbolos) para controlar la ejecución de una computadora. Si bien recomendamos encarecidamente el estudio de la teoría de la programación, este texto generalmente se limitará al estudio de los programas tal como se ejecutan en una computadora.
  12. ^ XML en 10 puntos Archivado el 6 de septiembre de 2009 en Wayback Machine W3C , 1999, "XML no es un lenguaje de programación".
  13. ^ Powell, Thomas (2003). HTML y XHTML: la referencia completa . McGraw-Hill. pag. 25.ISBN 978-0-07-222942-4. HTML no es un lenguaje de programación.
  14. ^ Diques, Lucinda; Título, Ed (2005). XML para principiantes (4ª ed.). Wiley. pag. 20.ISBN 978-0-7645-8845-7. ...es un lenguaje de marcado, no un lenguaje de programación.
  15. ^ "¿Qué tipo de lenguaje es XSLT?". IBM.com. 20 de abril de 2005. Archivado desde el original el 11 de mayo de 2011.
  16. ^ "XSLT es un lenguaje de programación". msdn.microsoft.com. Archivado desde el original el 3 de febrero de 2011 . Consultado el 3 de diciembre de 2010 .
  17. ^ Scott, Michael (2006). Pragmática del lenguaje de programación . Morgan Kaufman . pag. 802.ISBN 978-0-12-633951-2. XSLT, aunque está altamente especializado en la transformación de XML, es un lenguaje de programación completo de Turing.
  18. ^ Oetiker, Tobías; Parte, Hubert; Hyna, Irene; Schlegl, Elisabeth (20 de junio de 2016). "La no tan breve introducción a LATEX 2ε" (Versión 5.06) . tobi.oetiker.ch . págs. 1-157. Archivado (PDF) desde el original el 14 de marzo de 2017.
  19. ^ Syropoulos, Apóstolos; Antonis Tsolomitis; Nick Sofroniou (2003). Tipografía digital usando LaTeX . Springer-Verlag. pag. 213.ISBN 978-0-387-95217-8. TeX no es sólo un excelente motor de composición tipográfica, sino también un verdadero lenguaje de programación.
  20. ^ David A. Schmidt, La estructura de los lenguajes de programación mecanografiados , MIT Press, 1994, ISBN 0-262-19349-3 , p. 32 
  21. ^ Pierce, Benjamín (2002). Tipos y Lenguajes de Programación . Prensa del MIT. pag. 339.ISBN 978-0-262-16209-8.
  22. ^ Gabbrielli y Martini 2023, pag. 519.
  23. ^ Gabbrielli y Martini 2023, págs. 520–521.
  24. ^ abc Gabbrielli y Martini 2023, pag. 521.
  25. ^ Gabbrielli y Martini 2023, pag. 522.
  26. ^ Sebesta 2012, pag. 42.
  27. ^ abc Gabbrielli y Martini 2023, pag. 524.
  28. ^ Sebesta 2012, págs. 42–44.
  29. ^ Gabbrielli y Martini 2023, págs. 523–524.
  30. ^ Gabbrielli y Martini 2023, pag. 527.
  31. ^ abc Gabbrielli y Martini 2023, pag. 528.
  32. ^ "Cómo Lisp se convirtió en el lenguaje de programación propio de Dios". twobithistory.org .
  33. ^ Sebesta 2012, págs. 47–48.
  34. ^ Gabbrielli y Martini 2023, pag. 526.
  35. ^ Sebesta 2012, pag. 50.
  36. ^ Sebesta 2012, págs. 701–703.
  37. ^ Gabbrielli y Martini 2023, págs. 524–525.
  38. ^ Sebesta 2012, págs. 56–57.
  39. ^ Gabbrielli y Martini 2023, pag. 525.
  40. ^ Gabbrielli y Martini 2023, págs. 526–527.
  41. ^ Gabbrielli y Martini 2023, pag. 531.
  42. ^ ab Sebesta 2012, pag. 79.
  43. ^ Gabbrielli y Martini 2023, pag. 530.
  44. ^ Gabbrielli y Martini 2023, págs. 532–533.
  45. ^ Gabbrielli y Martini 2023, pag. 534.
  46. ^ Gabbrielli y Martini 2023, págs. 534–535.
  47. ^ Gabbrielli y Martini 2023, pag. 535.
  48. ^ Sebesta 2012, pag. 736.
  49. ^ Gabbrielli y Martini 2023, pag. 536.
  50. ^ Gabbrielli y Martini 2023, págs. 536–537.
  51. ^ Sebesta 2012, págs. 91–92.
  52. ^ Gabbrielli y Martini 2023, págs. 538–539.
  53. ^ Sebesta 2012, págs. 97–99.
  54. ^ Gabbrielli y Martini 2023, pag. 542.
  55. ^ Gabbrielli y Martini 2023, págs. 474–475, 477, 542.
  56. ^ Gabbrielli y Martini 2023, págs. 542–543.
  57. ^ Gabbrielli y Martini 2023, pag. 544.
  58. ^ Bezanson, J., Karpinski, S., Shah, VB y Edelman, A., 2012. Julia: un lenguaje dinámico rápido para informática técnica. Preimpresión de arXiv arXiv:1209.5145.
  59. ^ Ayouni, M. y Ayouni, M., 2020. Tipos de datos en Ring. Programación inicial en timbre: de principiante a profesional, páginas 51-98.
  60. ^ Sáez-López, JM, Román-González, M. y Vázquez-Cano, E., 2016. Lenguajes de programación visual integrados en el plan de estudios de la escuela primaria: un estudio de caso de dos años utilizando “Scratch” en cinco escuelas. Computadoras y educación, 97, págs.129-141.
  61. ^ Fayed, MS, Al-Qurishi, M., Alamri, A. y Al-Daraiseh, AA, marzo de 2017. PWCT: lenguaje visual para aplicaciones y sistemas de IoT y computación en la nube. En Actas de la Segunda Conferencia Internacional sobre Internet de las cosas, datos y computación en la nube (págs. 1-5).
  62. ^ Kodosky, J., 2020. LabVIEW. Actas de la ACM sobre lenguajes de programación, 4 (HOPL), páginas 1-54.
  63. ^ Fernando, A. y Warusawithana, L., 2020. Programación inicial de bailarinas: de principiante a profesional. Presione.
  64. ^ Baluprithviraj, KN, Bharathi, KR, Chendhuran, S. y Lokeshwaran, P., marzo de 2021. Puerta inteligente basada en inteligencia artificial con detección de mascarilla. En 2021 Conferencia Internacional sobre Inteligencia Artificial y Sistemas Inteligentes (ICAIS) (págs. 543-548). IEEE.
  65. ^ Sewell, B., 2015. Planos de secuencias de comandos visuales para un motor irreal. Packt Publishing Ltd.
  66. ^ Bertolini, L., 2018. Desarrollo práctico de juegos sin codificación: cree juegos 2D y 3D con Visual Scripting en Unity. Packt Publishing Ltd.
  67. ^ Michael Sipser (1996). Introducción a la Teoría de la Computación . Publicación PWS. ISBN 978-0-534-94728-6.Sección 2.2: Autómatas de empuje, páginas 101-114.
  68. ^ 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 detención , que el análisis de programas Perl es en general indecidible.
  69. ^ Marty Hall, 1995, Lecture Notes: Macros Archivado el 6 de agosto de 2013 en Wayback Machine , versión PostScript Archivado el 17 de agosto de 2000 en Wayback Machine.
  70. ^ Michael Lee Scott, Pragmática del lenguaje de programación , edición 2, Morgan Kaufmann, 2006, ISBN 0-12-633951-1 , p. 18-19 
  71. ^ abcdefg Andrew Cooke. "Introducción a los lenguajes informáticos". Archivado desde el original el 15 de agosto de 2012 . Consultado el 13 de julio de 2012 .
  72. ^ Leivant, Daniel (1983). Inferencia de tipos polimórficos . Simposio ACM SIGACT-SIGPLAN sobre Principios de lenguajes de programación. Austin, Texas: Prensa ACM. págs. 88–98. doi : 10.1145/567067.567077 . ISBN 978-0-89791-090-3.
  73. ^ Específicamente, se infieren instancias de tipos genéricos para ciertas formas de expresión. La inferencia de tipos en Java genérico, el lenguaje de investigación que proporcionó la base para las extensiones de polimorfismo paramétrico acotado de Java 1.5 , se analiza en dos manuscritos informales de la lista de correo de Tipos: La inferencia de tipos de Java genérico no es sólida. Archivado el 29 de enero de 2007 en Wayback Machine ( Alan Jeffrey , 17 de diciembre de 2001) e inferencia de tipos Sound Generic Java Archivado el 29 de enero de 2007 en Wayback Machine ( Martin Odersky , 15 de enero de 2002). El sistema de tipos de C# es similar al de Java y utiliza un esquema de inferencia de tipos parcial similar.
  74. ^ "Informe revisado sobre el esquema del lenguaje algorítmico". 20 de febrero de 1998. Archivado desde el original el 14 de julio de 2006.
  75. ^ Luca Cardelli y Peter Wegner . "Sobre la comprensión de los tipos, la abstracción de datos y el polimorfismo". Manuscrito (1985) . Archivado desde el original el 19 de junio de 2006.
  76. ^ Ayouni, M., 2020. Inicio de la programación de Ring (Vol. 978, No. 1, págs. 4842-5832). Presione.
  77. ^ Sebesta 2012, pag. 576.
  78. ^ Sebesta 2012, pag. 579.
  79. ^ Sebesta 2012, pag. 585.
  80. ^ Sebesta 2012, págs. 585–586.
  81. ^ Sebesta 2012, págs.630, 634.
  82. ^ Sebesta 2012, pag. 635.
  83. ^ ab Sebesta 2012, pag. 631.
  84. ^ Sebesta 2012, pag. 261.
  85. ^ Sebesta 2012, pag. 632.
  86. ^ Sebesta 2012, págs. 631, 635–636.
  87. ^ Steven R. Fischer, Una historia del lenguaje , Reaktion Books, 2003, ISBN 1-86189-080-X , p. 205 
  88. ^ Éric Lévénez (2011). "Historia de los lenguajes informáticos". Archivado desde el original el 7 de enero de 2006.
  89. ^ Jing Huang. "Lenguaje artificial versus lenguaje natural". Archivado desde el original el 3 de septiembre de 2009.
  90. ^ IBM, en la primera publicación de PL/I, por ejemplo, tituló de manera bastante ambiciosa su manual El lenguaje de programación universal PL/I (Biblioteca IBM; 1966). El título reflejaba los objetivos de IBM de lograr una capacidad ilimitada de subconjuntos: "PL/I está diseñado de tal manera que se pueden aislar subconjuntos que satisfagan los requisitos de aplicaciones particulares". ( "PL/I". Enciclopedia de Matemáticas . Archivado desde el original el 26 de abril de 2012. Consultado el 29 de junio de 2006 .). Ada y UNCOL tenían objetivos iniciales similares.
  91. ^ Frederick P. Brooks, Jr.: El mes del hombre mítico , Addison-Wesley, 1982, págs.
  92. ^ Dijkstra, Edsger W. Sobre la tontería de la "programación en lenguaje natural". Archivado el 20 de enero de 2008 en Wayback Machine EWD667.
  93. ^ Perlis, Alan (septiembre de 1982). "Epigramas sobre programación". Avisos SIGPLAN vol. 17, núm. 9 . págs. 7-13. Archivado desde el original el 17 de enero de 1999.
  94. ^ Milner, R .; M. Tofte ; R. Harper ; D. MacQueen (1997). La definición de ML estándar (revisada) . Prensa del MIT. ISBN 978-0-262-63181-5.
  95. ^ Kelsey, Richard; William Clinger; Jonathan Rees (febrero de 1998). "Sección 7.2 Semántica formal". Informe revisado 5 sobre el esquema de lenguaje algorítmico . Archivado desde el original el 6 de julio de 2006.
  96. ^ ANSI - Lenguaje de programación Rexx, X3-274.1996
  97. ^ Sebesta 2012, págs. 23-24.
  98. ^ Sebesta 2012, págs. 25-27.
  99. ^ Sebesta 2012, pag. 27.
  100. ^ Sebesta 2012, pag. 28.
  101. ^ Sebesta 2012, págs. 29-30.
  102. ^ Ver: Oracle America, Inc. contra Google, Inc. [ fuente generada por el usuario ]
  103. ^ "Guía de lenguajes de programación | ComputerScience.org". ComputerScience.org . Consultado el 13 de mayo de 2018 .
  104. ^ "Lo básico". ibm.com . 10 de mayo de 2011 . Consultado el 13 de mayo de 2018 .
  105. ^ Abdelaziz, Abdullah I.; Hanson, Kent A.; Gaber, Charles E.; Lee, Todd A. (2023). "Optimización de grandes análisis de datos del mundo real con archivos parquet en R: un tutorial paso a paso". Farmacoepidemiología y seguridad de los medicamentos . doi : 10.1002/pds.5728 . PMID  37984998.
  106. ^ "HOPL: una lista interactiva de lenguajes de programación". Australia: Universidad Murdoch . Archivado desde el original el 20 de febrero de 2011 . Consultado el 1 de junio de 2009 . Este sitio enumera 8512 idiomas.
  107. ^ Mayer, Felipe; Bauer, Alejandro (2015). "Un análisis empírico de la utilización de múltiples lenguajes de programación en proyectos de código abierto". Actas de la XIX Conferencia Internacional sobre Evaluación y Valoración en Ingeniería de Software . Actas de la XIX Conferencia Internacional sobre Evaluación y Valoración en Ingeniería de Software - EASE '15. Nueva York, NY, Estados Unidos: ACM. págs. 4:1–4:10. doi : 10.1145/2745802.2745805 . ISBN 978-1-4503-3350-4. Resultados: Encontramos (a) un número medio de 5 idiomas por proyecto con un lenguaje principal de propósito general claramente dominante y 5 tipos DSL de uso frecuente, (b) una influencia significativa del tamaño, el número de confirmaciones y el idioma principal sobre el número de idiomas, así como sobre la ausencia de una influencia significativa de la edad y el número de contribuyentes, y (c) tres ecosistemas de idiomas agrupados en torno a XML, Shell/Make y HTML/CSS. Conclusiones: La programación multilenguaje parece ser común en proyectos de código abierto y es un factor que debe tenerse en cuenta en las herramientas y al evaluar el desarrollo y mantenimiento de dichos sistemas de software.
  108. ^ Abelson, Sussman y Sussman. "Estructura e Interpretación de Programas Informáticos". Archivado desde el original el 26 de febrero de 2009 . Consultado el 3 de marzo de 2009 .{{cite web}}: CS1 maint: multiple names: authors list (link)
  109. ^ Vicki, marrón; Morin, rico (1999). "Lenguajes de secuencias de comandos". MacTech . Archivado desde el original el 2 de diciembre de 2017.
  110. ^ Georgina Swan (21 de septiembre de 2009). "COBOL cumple 50 años". Mundo de la informática. Archivado desde el original el 19 de octubre de 2013 . Consultado el 19 de octubre de 2013 .
  111. ^ Ed Airey (3 de mayo de 2012). "7 mitos de COBOL desacreditados". desarrollador.com. Archivado desde el original el 19 de octubre de 2013 . Consultado el 19 de octubre de 2013 .
  112. ^ Nicolás Enticknap. "Encuesta salarial de TI SSL/Computer Weekly: el auge financiero impulsa el crecimiento del empleo en TI". Computadora Semanal . Archivado desde el original el 26 de octubre de 2011 . Consultado el 14 de junio de 2013 .
  113. ^ "Contando lenguajes de programación por ventas de libros". Radar.oreilly.com. 2 de agosto de 2006. Archivado desde el original el 17 de mayo de 2008.
  114. ^ Bieman, JM; Murdock, V., Búsqueda de código en la World Wide Web: una investigación preliminar, Actas del primer taller internacional del IEEE sobre análisis y manipulación del código fuente, 2001
  115. ^ "Lenguajes de programación más populares e influyentes de 2018". stackify.com. 18 de diciembre de 2017 . Consultado el 29 de agosto de 2018 .
  116. ^ "Índice TIOBE".
  117. ^ Sebesta 2012, pag. 21.
  118. ^ ab Sebesta 2012, págs. 21-22.
  119. ^ Sebesta 2012, pag. 12.
  120. ^ Sebesta 2012, pag. 22.
  121. ^ Sebesta 2012, págs. 22-23.

Otras lecturas