Página protegida con cambios pendientes
De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

El código fuente para un simple programa de ordenador escrito en el lenguaje de programación C . Cuando se compile y se ejecute , dará el resultado " ¡Hola, mundo! ".

Un lenguaje de programación es un lenguaje formal que comprende un conjunto de instrucciones que producen varios tipos de resultados . Los lenguajes de programación se utilizan en la programación de computadoras para implementar algoritmos .

La mayoría de los lenguajes de programación constan de instrucciones para computadoras . Hay máquinas programables que utilizan un conjunto de instrucciones específicas , en lugar de lenguajes de programación generales . Desde principios del siglo XIX, se han utilizado programas para dirigir el comportamiento de máquinas como telares Jacquard , cajas de música y pianos . [1] Los programas para estas máquinas (como los pergaminos de un pianola) no produjeron un comportamiento diferente en respuesta a diferentes entradas o condiciones.

Se han creado miles de lenguajes de programación diferentes y cada año se crean más. Muchos lenguajes de programación están escritos en forma imperativa (es decir, como una secuencia de operaciones a realizar) mientras que otros lenguajes usan la forma declarativa (es decir, se especifica el resultado deseado, no cómo lograrlo).

La descripción de un lenguaje de programación generalmente se divide en dos componentes de sintaxis (forma) y semántica (significado). Algunos lenguajes están definidos por un documento de especificación (por ejemplo, el lenguaje de programación C está especificado por un estándar ISO ) mientras que otros lenguajes (como Perl ) tienen una implementación dominante que se trata como referencia . Algunos lenguajes tienen ambos, el lenguaje básico definido por un estándar y las extensiones tomadas de la implementación dominante son comunes.

Definiciones [ editar ]

Un lenguaje de programación es una notación para escribir programas , que son especificaciones de un cálculo o algoritmo . [2] Algunos autores restringen el término "lenguaje de programación" a aquellos lenguajes que pueden expresar todos los algoritmos posibles. [2] [3] Los rasgos que a menudo se consideran importantes para lo que constituye un lenguaje de programación incluyen:

Función y objetivo
Un lenguaje de programación de computadora es un lenguaje utilizado para escribir programas de computadora , que implica que una computadora realice algún tipo de cálculo [4] o algoritmo y posiblemente controle dispositivos externos como impresoras , unidades de disco , robots , [5] y así sucesivamente. Por ejemplo, PostScriptCon frecuencia, los programas son creados por otro programa para controlar una impresora o pantalla de computadora. De manera más general, un lenguaje de programación puede describir la computación en alguna máquina, posiblemente abstracta. Generalmente se acepta que una especificación completa para un lenguaje de programación incluye una descripción, posiblemente idealizada, de una máquina o procesador para ese lenguaje. [6] En la mayoría de los contextos prácticos, un lenguaje de programación involucra una computadora; en consecuencia, los lenguajes de programación se suelen definir y estudiar de esta manera. [7] 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.
Abstracciones
Los lenguajes de programación generalmente contienen 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 . [8] Este principio a veces se formula como una recomendación para que el programador haga un uso adecuado de tales abstracciones. [9]
Poder expresivo
La teoría de la computación clasifica los lenguajes por los cálculos que son capaces de expresar. Todos los lenguajes completos de Turing pueden implementar el mismo conjunto de algoritmos . ANSI / ISO SQL-92 y Charity son ejemplos de lenguajes que no están completos en Turing, pero que a menudo se denominan lenguajes de programación. [10] [11]

Los lenguajes de marcado como XML , HTML o troff , que definen datos estructurados , no suelen considerarse lenguajes de programación. [12] [13] [14] Los lenguajes de programación pueden, sin embargo, 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 en su totalidad 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]

El término lenguaje de computadora a veces se usa indistintamente con lenguaje de programación. [20] 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 de computadora. [21] Del mismo modo, los lenguajes utilizados en informática que tienen un objetivo diferente al de expresar programas de ordenador se denominan genéricamente lenguajes de ordenador. Por ejemplo, los lenguajes de marcado a veces se denominan lenguajes de computadora para enfatizar que no están destinados a ser utilizados para programación. [22]

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

Historia [ editar ]

Desarrollos tempranos [ editar ]

Las primeras computadoras, como Colossus , se programaban sin la ayuda de un programa almacenado , modificando sus circuitos o configurando bancos de controles físicos.

Un poco más tarde, los programas podrían escribirse en lenguaje de máquina , donde el programador escribe cada instrucción en una forma numérica que el hardware puede ejecutar directamente. Por ejemplo, la instrucción para sumar el valor en dos ubicaciones de memoria puede constar de 3 números: un "código de operación" que selecciona la operación "agregar" y dos ubicaciones de memoria. Los programas, en forma decimal o binaria, se leyeron de tarjetas perforadas , cinta de papel, cinta magnética o conmutadores en el panel frontal de la computadora. Los lenguajes de máquina se denominaron posteriormente lenguajes de programación de primera generación (1GL).

El siguiente paso fue el desarrollo de los denominados lenguajes de programación de segunda generación (2GL) o lenguajes ensambladores , que todavía estaban estrechamente vinculados a la arquitectura del conjunto de instrucciones de la computadora específica. Estos sirvieron para hacer el programa mucho más legible por humanos y aliviaron al programador de cálculos de direcciones tediosos y propensos a errores.

Los primeros lenguajes de programación de alto nivel , o lenguajes de programación de tercera generación (3GL), se escribieron en la década de 1950. Uno de los primeros lenguajes de programación de alto nivel que se diseñó para una computadora fue Plankalkül , desarrollado para el Z3 alemán por Konrad Zuse entre 1943 y 1945. Sin embargo, no se implementó hasta 1998 y 2000. [25]

El Short Code de John Mauchly , propuesto en 1949, fue uno de los primeros lenguajes de alto nivel jamás desarrollados para una computadora electrónica . [26] A diferencia del código de máquina , las declaraciones de código corto representan expresiones matemáticas en forma comprensible. Sin embargo, el programa tenía que traducirse a código de máquina cada vez que se ejecutaba, lo que hacía que el proceso fuera mucho más lento que ejecutar el código de máquina equivalente.

En la Universidad de Manchester , Alick Glennie desarrolló Autocode a principios de la década de 1950. Como lenguaje de programación , utilizó un compilador para convertir automáticamente el lenguaje en código de máquina. El primer código y compilador se desarrolló en 1952 para la computadora Mark 1 en la Universidad de Manchester y se considera el primer lenguaje de programación de alto nivel compilado . [27] [28]

El segundo código automático fue desarrollado para el Mark 1 por RA Brooker en 1954 y se llamó " Código automático Mark 1". Brooker también desarrolló un código automático para Ferranti Mercury en la década de 1950 junto con la Universidad de Manchester. La versión para EDSAC 2 fue diseñada por DF Hartley del Laboratorio de Matemáticas de la Universidad de Cambridge en 1961. Conocido como EDSAC 2 Autocode, fue un desarrollo directo de Mercury Autocode adaptado a las circunstancias locales y se destacó por su optimización de código objeto y lenguaje fuente. diagnósticos que fueron avanzados para la época. Atlas Autocode , un hilo de desarrollo contemporáneo pero separado, fue desarrollado para la Universidad de Manchester.Máquina Atlas 1 .

En 1954, John Backus inventó FORTRAN en IBM . Fue el primer lenguaje de programación de propósito general de alto nivel ampliamente utilizado que tuvo una implementación funcional, en lugar de solo un diseño en papel. [29] [30] Sigue siendo un lenguaje popular para la computación de alto rendimiento [31] y se usa para programas que comparan y clasifican las supercomputadoras más rápidas del mundo . [32]

Otro lenguaje de programación temprano fue ideado por Grace Hopper en los EE. UU., Llamado FLOW-MATIC . Fue desarrollado para UNIVAC I en Remington Rand durante el período de 1955 a 1959. Hopper descubrió que los clientes de procesamiento de datos comerciales no se sentían cómodos con la notación matemática y, a principios de 1955, ella y su equipo escribieron una especificación para un lenguaje de programación en inglés e implementaron un prototipo. [33] El compilador FLOW-MATIC estuvo disponible públicamente a principios de 1958 y se completó sustancialmente en 1959. [34] FLOW-MATIC fue una gran influencia en el diseño de COBOL , ya que solo él y su descendiente directo AIMACOestaban en uso real en ese momento. [35]

Refinamiento [ editar ]

El mayor uso de lenguajes de alto nivel introdujo el requisito de lenguajes de programación de bajo nivel o lenguajes de programación de sistemas . Estos lenguajes, en diversos grados, proporcionan facilidades entre lenguajes ensambladores y lenguajes de alto nivel. Se pueden usar para realizar tareas que requieren acceso directo a las instalaciones de hardware, pero aún proporcionan estructuras de control de nivel superior y verificación de errores.

El período comprendido entre los años sesenta y finales de los setenta trajo consigo el desarrollo de los principales paradigmas lingüísticos actualmente en uso:

  • APL introdujo la programación de matrices e influyó en la programación funcional . [36]
  • ALGOL refinó tanto la programación procedimental estructurada como la disciplina de especificación del lenguaje ; el "Informe revisado sobre el lenguaje algorítmico ALGOL 60 " se convirtió en un modelo de cómo se escribieron las especificaciones del lenguaje posteriores.
  • Lisp , implementado en 1958, fue el primer lenguaje de programación funcional tipado dinámicamente .
  • En la década de 1960, Simula fue el primer lenguaje diseñado para admitir programación orientada a objetos ; a mediados de la década de 1970, Smalltalk siguió con el primer lenguaje "puramente" orientado a objetos.
  • C se desarrolló entre 1969 y 1973 como un lenguaje de programación de sistemas para el sistema operativo Unix y sigue siendo popular. [37]
  • Prolog , diseñado en 1972, fue el primer lenguaje de programación lógica .
  • En 1978, ML construyó un sistema de tipos polimórficos sobre Lisp , siendo pionero en los lenguajes de programación funcional tipados estáticamente .

Cada uno de estos lenguajes generó descendientes, y la mayoría de los lenguajes de programación modernos cuentan al menos uno de ellos en su ascendencia.

Las décadas de 1960 y 1970 también vieron un debate considerable sobre los méritos de la programación estructurada y si los lenguajes de programación deberían diseñarse para admitirla. [38] Edsger Dijkstra , en una famosa carta de 1968 publicada en Communications of the ACM , argumentó que las declaraciones Goto deberían eliminarse de todos los lenguajes de programación de "nivel superior". [39]

Consolidación y crecimiento [ editar ]

Una selección de libros de texto que enseñan programación, en lenguajes tanto populares como oscuros. Estos son solo algunos de los miles de lenguajes y dialectos de programación que se han diseñado en la historia.

Los 80 fueron años de relativa consolidación. C ++ combinó programación orientada a objetos y de sistemas. El gobierno de los Estados Unidos estandarizó Ada , un lenguaje de programación de sistemas derivado de Pascal y destinado a ser utilizado por contratistas de defensa. En Japón y en otros lugares, se gastaron grandes sumas de dinero investigando los llamados lenguajes de "quinta generación" que incorporaron construcciones de programación lógica. [40] La comunidad de lenguajes funcionales se movió para estandarizar ML y Lisp. En lugar de inventar nuevos paradigmas, todos estos movimientos elaboraron las ideas inventadas en las décadas anteriores.

Una tendencia importante en el diseño de lenguajes para la programación de sistemas a gran escala durante la década de 1980 fue un mayor enfoque en el uso de módulos o unidades organizativas de código a gran escala. Modula-2 , Ada y ML desarrollaron sistemas de módulos notables en la década de 1980, que a menudo estaban unidos a construcciones de programación genéricas . [41]

El rápido crecimiento de Internet a mediados de la década de 1990 creó oportunidades para nuevos idiomas. Perl , originalmente una herramienta de scripting de Unix lanzada por primera vez en 1987, se volvió común en sitios web dinámicos . Java llegó a usarse para la programación del lado del servidor, y las máquinas virtuales de código de bytes volvieron a ser populares en entornos comerciales con su promesa de " Escribir una vez, ejecutar en cualquier lugar " ( UCSD Pascal había sido popular durante un tiempo a principios de la década de 1980). Estos desarrollos no fueron fundamentalmente nuevos; más bien, fueron refinamientos de muchos lenguajes y paradigmas existentes (aunque su sintaxis a menudo se basaba en la familia C de lenguajes de programación).

La evolución del lenguaje de programación continúa, tanto en la industria como en la investigación. Las direcciones actuales incluyen verificación de seguridad y confiabilidad , nuevos tipos de modularidad ( mixins , delegados , aspectos ) e integración de bases de datos como LINQ de Microsoft .

Los lenguajes de programación de cuarta generación (4GL) son lenguajes de programación de computadoras que tienen como objetivo proporcionar un mayor nivel de abstracción de los detalles internos del hardware de la computadora que los 3GL. Los lenguajes de programación de quinta generación (5GL) son lenguajes de programación basados ​​en la resolución de problemas utilizando restricciones dadas al programa, en lugar de utilizar un algoritmo escrito por un programador.

Elementos [ editar ]

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 [ editar ]

Parse árbol 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 anterior 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 puntuación, al igual que los lenguajes naturales escritos. Por otro lado, hay algunos lenguajes de programación que son de naturaleza más gráfica , utilizando 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 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:

  • 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, opcionalmente precedida por un signo más o menos;
  • un símbolo es una letra seguida de cero o más caracteres (excluidos los espacios en blanco); y
  • una lista es un par de paréntesis coincidente, con cero o más expresiones dentro de ella.

Los siguientes son ejemplos de secuencias de token bien formados 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 lenguaje y la solidez de la implementación) dar como resultado un error en la traducción o ejecución. En algunos casos, estos programas pueden presentar un comportamiento indefinido . Incluso cuando un programa está bien definido dentro de un idioma, aún puede tener un significado que no fue intencionado 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 la oración puede ser falsa:

  • " Las ideas verdes incoloras duermen furiosamente ". está gramaticalmente bien formada pero no tiene un significado generalmente aceptado.
  • "John es un soltero casado". está gramaticalmente bien formada pero expresa un significado que no puede ser cierto.

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 desencadenaría un error en la variable indefinida "p" durante la compilación. Sin embargo, el programa aún sería 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 por su posición en la jerarquía de Chomsky . La sintaxis de la mayoría de los lenguajes de programación se puede especificar utilizando una gramática de Tipo 2, es decir, son gramáticas libres de contexto . [42] 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 sintáctico hacen del análisis de sintaxis un problema indecidible y, en general, difuminan la distinción entre análisis sintáctico y ejecución. [43] En contraste con el sistema de macros de Lisp y PerlBEGINbloques, que pueden contener cálculos generales, las macros de C son simplemente reemplazos de cadenas y no requieren la ejecución de código. [44]

Semántica [ editar ]

El término semántica se refiere al significado de los lenguajes, en contraposición a su forma ( sintaxis ).

Semántica estática [ editar ]

La semántica estática define restricciones sobre la estructura de textos válidos que son difíciles o imposibles de expresar en formalismos sintácticos estándar. [2] Para los lenguajes compilados, la semántica estática incluye esencialmente aquellas reglas semánticas que se pueden verificar en tiempo de compilación. Los ejemplos incluyen verificar que cada identificador se declare antes de que se use (en lenguajes que requieren tales declaraciones) o que las etiquetas en los brazos de una declaración de caso sean distintas. [45] Muchas restricciones importantes de este tipo, como comprobar que los identificadores se utilizan en el contexto apropiado (por ejemplo, no agregar un número entero al nombre de una función), o esa subrutinalas llamadas tienen el número y el tipo de argumentos adecuados, se pueden aplicar definiéndolas como reglas en una lógica llamada sistema de tipos . Otras formas de análisis estáticos, como el análisis de flujo de datos , también pueden formar parte de la semántica estática. Los lenguajes de programación más nuevos 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 semántica estática.

Semántica dinámica [ editar ]

Una vez que se han especificado los datos, se debe instruir a la máquina para que realice operaciones con los datos. Por ejemplo, la semántica puede definir la estrategia mediante la cual las expresiones se evalúan a valores, o la forma 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 un comportamiento de programa. Hay muchas formas de definir la semántica de ejecución. El lenguaje natural se usa a menudo para especificar la semántica de ejecución de los lenguajes que se usan comúnmente en la práctica. Una cantidad significativa de investigación académica se dedicó a la semántica formal de los lenguajes de programación., que permiten especificar la semántica de ejecución de manera formal. Los resultados de este campo de investigación han tenido una aplicación limitada al diseño e implementación de lenguajes de programación fuera del ámbito académico.

Tipo de sistema [ editar ]

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, hacer cumplir un cierto nivel de corrección en los programas escritos en ese idioma mediante la detección de ciertas operaciones incorrectas. Cualquier tipo de sistema decidible implica una compensación: si bien rechaza muchos programas incorrectos, también puede prohibir algunos programas correctos, aunque inusuales. Con el fin de derivación este inconveniente, un número de idiomas tiene lagunas de tipo , por lo general sin marcar, los moldes que pueden ser utilizados por el programador para permitir explícitamente una operación normalmente no permitido entre los diferentes tipos. En la mayoría de los lenguajes mecanografiados, el sistema de tipos se utiliza solo paraprogramas de verificación de tipo , pero varios lenguajes, generalmente funcionales, infieren tipos , lo que alivia al programador de la necesidad de escribir anotaciones de tipo. El diseño y estudio formal de sistemas de tipos se conoce como teoría de tipos .

Idiomas mecanografiados versus no mecanografiados [ editar ]

Se escribe un idioma si la especificación de cada operación define los tipos de datos a los que se aplica la operación. [46] 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 el compilador la rechazará 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 en tiempo de ejecución . Muchos lenguajes permiten que una función llamada manejador de excepciones maneje esta excepción y, por ejemplo, siempre devuelve "-1" como resultado.

Un caso especial de lenguajes mecanografiados son los lenguajes de un solo tipado . Suelen ser lenguajes de escritura 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.

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

En la práctica, mientras que pocos lenguajes se consideran mecanografiados a partir de la teoría de tipos (verificando o rechazando todas las operaciones), la mayoría de los lenguajes modernos ofrecen cierto grado de mecanografía. [46] 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 versus dinámica [ editar ]

En la escritura estática , todas las expresiones tienen sus tipos determinados antes de que se ejecute el 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. [46]

Los lenguajes con tipado estático se pueden escribir de forma manifiesta o inferir de tipo . En el primer caso, el programador debe escribir explícitamente tipos 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 , se tipean de forma manifiesta. La inferencia de tipos completa se ha asociado tradicionalmente con lenguajes menos convencionales, como Haskell y ML . Sin embargo, muchos lenguajes con tipificación manifiesta admiten la inferencia de tipo parcial; por ejemplo,C ++ , Java y C # infieren tipos en ciertos casos limitados. [47] 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 cuando el programa espera un flotante.

El tipado dinámico , también llamado tipado latente , determina el tipo de seguridad 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 . [46] 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 se refiera a valores de diferentes tipos en diferentes puntos de la ejecución del programa. Sin embargo, los errores de tipono se pueden detectar automáticamente hasta que se ejecute realmente un fragmento de código, lo que podría dificultar la depuración . Lisp , Smalltalk, Perl , Python , JavaScript y Ruby son ejemplos de lenguajes tipados dinámicamente.

Mecanografía débil y fuerte [ editar ]

La escritura débil permite tratar un valor de un tipo como otro, por ejemplo, tratar una cadena como un número. [46] Esto puede ser útil ocasionalmente, pero también puede permitir que algunos tipos de fallas del programa no se detecten en tiempo de compilación e incluso en tiempo de ejecución .

La escritura fuerte evita estos fallos del programa. Un intento de realizar una operación en el tipo de valor incorrecto genera un error. [46] Los lenguajes fuertemente tipados a menudo se denominan seguros de tipos o seguros .

Una definición alternativa de "tipado débil" se refiere a lenguajes, como Perl y JavaScript , que permiten una gran cantidad de conversiones de tipo implícitas. En JavaScript, por ejemplo, la expresión 2 * xse convierte implícitamente xa un número, y esta conversión tiene éxito, incluso si xes null, undefined, un Array, o una cadena de letras. Estas conversiones implícitas suelen ser útiles, pero pueden enmascarar errores de programación. Fuerte y estático ahora generalmente se consideran conceptos ortogonales, pero el uso en la literatura es diferente. Algunos usan el término fuertemente tipado para significar fuertemente tipado estáticamente o, incluso más confuso, para significar simplementetipado estáticamente . Por lo tanto, C ha sido llamado tanto fuertemente tipado como débilmente tipado estáticamente. [48] [49]

Puede parecer extraño para algunos programadores profesionales que C pueda estar "débilmente tipado estáticamente". Sin embargo, observe que el uso del puntero genérico, el puntero void * , permite la conversión de 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 tipo de datos en C sin usar una conversión explícita, como (int)o (char).

Biblioteca estándar y sistema de tiempo de ejecución [ editar ]

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

La línea divisoria 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, la biblioteca central de un idioma a menudo es tratada como parte del idioma por sus usuarios, y algunas especificaciones de idioma incluso requieren que esta biblioteca esté disponible en todas las implementaciones. De hecho, algunos lenguajes están diseñados para que los significados de ciertas construcciones sintácticas ni siquiera puedan describirse sin hacer referencia a la biblioteca central. Por ejemplo, en Java , un literal de cadena 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 . En cambio,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 un lenguaje. Biblioteca.

Diseño e implementación [ editar ]

Los lenguajes de programación comparten propiedades con los lenguajes naturales relacionados con su propósito como vehículos de comunicación, tienen una forma sintáctica separada de su semántica y muestran familias de lenguajes de lenguajes relacionados que se ramifican entre sí. [50] [51] Pero como construcciones artificiales, también difieren en formas 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 en su totalidad ya que tiene una definición precisa y finita. [52] Por el contrario, los lenguajes naturales tienen significados cambiantes dados por sus usuarios en diferentes comunidades. Mientras construye lenguajes 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, todos ellos no han sido generalmente aceptados para cumplir con este rol. [53] La necesidad de diversos lenguajes de programación surge de la diversidad de contextos en los que se utilizan los lenguajes:

  • Los programas van desde pequeños guiones escritos por aficionados individuales hasta enormes sistemas escritos por cientos de programadores .
  • Los programadores varían en experiencia, desde principiantes que necesitan simplicidad por encima de todo hasta expertos que pueden sentirse cómodos con una complejidad considerable.
  • Los programas deben equilibrar la velocidad, el tamaño y la simplicidad en sistemas que van desde microcontroladores hasta supercomputadoras .
  • Los programas pueden escribirse una vez y no cambiar durante generaciones, o pueden sufrir modificaciones continuas.
  • Los programadores pueden simplemente diferir en sus gustos: pueden estar acostumbrados a discutir problemas y expresarlos en un idioma en particular.

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 estrechamente vinculados al hardware subyacente de la computadora. A medida que se han desarrollado nuevos lenguajes de programación, se han agregado 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 hacer más computación con menos esfuerzo por parte del programador. Esto les permite escribir más funciones por unidad de tiempo. [54]

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 permanece distante 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". [55] Alan Perlis también rechazó la idea. [56] 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 gobiernan y permiten 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 [ editar ]

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 una parte del 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 tomar varias formas, incluidas las siguientes:

  • Una definición explícita de la sintaxis, semántica estática y semántica de ejecución del lenguaje. Mientras que la sintaxis se especifica comúnmente usando una gramática formal, las definiciones semánticas pueden escribirse en lenguaje natural (por ejemplo, como en el lenguaje C ), o en una semántica formal (por ejemplo, como en las especificaciones estándar ML [57] y Scheme [58] ).
  • Una descripción del comportamiento de un traductor para el idioma (por ejemplo, las especificaciones de C ++ y Fortran ). La sintaxis y la semántica del lenguaje deben inferirse de esta descripción, que puede estar escrita en un lenguaje natural o formal.
  • Una implementación de referencia o modelo , a veces escrita en el lenguaje que se especifica (por ejemplo, Prolog o ANSI REXX [59] ). La sintaxis y la semántica del lenguaje son explícitas en el comportamiento de la implementación de referencia.

Implementación [ editar ]

La implementación de un lenguaje de programación proporciona una forma de escribir programas en ese lenguaje y ejecutarlos en una o más configuraciones de hardware y software. Existen, en términos generales, dos enfoques para la implementación del lenguaje de programación: compilación e interpretación . Por lo general, es posible implementar un lenguaje utilizando cualquiera de las técnicas.

La salida de un compilador puede ser ejecutada por hardware o un programa llamado intérprete. En algunas implementaciones que hacen uso del enfoque del intérprete, no existe un límite claro entre compilar e interpretar. Por ejemplo, algunas implementaciones de BASIC compilan y luego ejecutan la fuente una línea a la vez.

Los programas que se ejecutan directamente en el hardware suelen ejecutarse mucho más rápido que los que se interpretan en el software. [60] [se necesita una mejor fuente ]

Una técnica para mejorar el rendimiento de los programas interpretados es la compilación justo a tiempo . Aquí la máquina virtual , justo antes de la ejecución, traduce los bloques de bytecode que se van a utilizar a código de máquina, para su ejecución directa en el hardware.

Idiomas patentados [ editar ]

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 con la implementación disponible solo de un solo proveedor, que puede afirmar que dicho lenguaje propietario es su propiedad intelectual. Los lenguajes de programación patentados son comúnmente lenguajes específicos de dominio o lenguajes de scripting internos para un solo producto; algunos lenguajes propietarios se utilizan solo internamente dentro de un proveedor, mientras que otros están disponibles para usuarios externos.

Algunos lenguajes de programación existen en la frontera entre propietario y abierto; por ejemplo, Oracle Corporation afirma los derechos de propiedad sobre algunos aspectos del lenguaje de programación Java , [61] y Microsoft 's C # lenguaje de programación, que tiene implementaciones abiertas de la mayoría de las partes del sistema, también tiene Common Language Runtime (CLR) como cerrada medio ambiente. [62]

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 cerrado a abierto; por ejemplo, Erlang era originalmente un lenguaje de programación interno de Ericsson. [63]

Utilice [ editar ]

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

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 usa un lenguaje natural para comunicarse con otras personas, los autores y hablantes humanos pueden ser ambiguos y cometer pequeños errores, y aún así esperar que se entienda su intención. Sin embargo, hablando 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 deben 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 requerida para la 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 se pueden realizar automáticamente en esos datos. Un programador usa 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 ). [66] 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 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 denomina lenguaje de scripting . [67]

Medir el uso del idioma [ editar ]

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 idioma puede ocupar la mayor cantidad de horas de programador, uno diferente tiene más líneas de código y un tercero puede consumir la mayor cantidad de tiempo de CPU. Algunos idiomas son muy populares para determinados tipos de aplicaciones. Por ejemplo, COBOL sigue siendo fuerte en el centro de datos corporativo, a menudo en grandes mainframes ; [68] [69] Fortran en aplicaciones científicas y de ingeniería; Ada en aplicaciones aeroespaciales, de transporte, militares, en tiempo real e integradas; y Cen aplicaciones integradas y sistemas operativos. Otros lenguajes se utilizan con regularidad para escribir muchos tipos diferentes de aplicaciones.

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

  • contando el número de anuncios de empleo que mencionan el idioma [70]
  • el número de libros vendidos que enseñan o describen el idioma [71]
  • estimaciones del número de líneas de código existentes escritas en el idioma, que pueden subestimar idiomas que no se encuentran a menudo en las búsquedas públicas [72]
  • recuentos de referencias de idioma (es decir, al nombre del idioma) encontradas usando un motor de búsqueda web.

Al combinar y promediar información de varios sitios de Internet, stackify.com informó que 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 . [73]

Dialectos, sabores e implementaciones [ editar ]

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 implementadores pueden considerar que los estándares son insuficientes, inadecuados o ilegítimos, por lo que a menudo se desviarán del estándar, creando un nuevo dialecto . En otros casos, se crea un dialecto para su uso en un idioma específico de dominio , 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, 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 lenguaje de programación BASIC tiene muchos dialectos .

La explosión de los dialectos de Forth llevó al dicho "Si has visto un Forth ... has visto uno Forth".

Taxonomías [ editar ]

No existe un esquema de clasificación general para los lenguajes de programación. Un lenguaje de programación determinado no suele tener un solo lenguaje ancestro. Los lenguajes surgen comúnmente combinando los elementos de varios lenguajes predecesores con nuevas ideas en circulación en ese momento. Las ideas que se originan en un idioma se difundirán a través de una familia de idiomas relacionados y luego saltarán repentinamente a través de brechas familiares para aparecer en una familia completamente diferente.

La tarea se complica aún más por el hecho de que los idiomas pueden clasificarse a lo largo de múltiples ejes. Por ejemplo, Java es un lenguaje orientado a objetos (porque fomenta la organización orientada a objetos) y un lenguaje concurrente (porque contiene construcciones integradas para ejecutar múltiples subprocesos en paralelo). Python es un lenguaje de programación orientado a objetos .

A grandes rasgos, los lenguajes de programación se dividen en paradigmas de programación y una clasificación por dominio de uso previsto, con lenguajes de programación de propósito general que se distinguen de los lenguajes de programación específicos de dominio . Tradicionalmente, se ha considerado que los lenguajes de programación describen la computación en términos de oraciones imperativas, es decir, emitiendo comandos. Estos generalmente se denominan lenguajes de programación imperativos . Una gran cantidad de investigación en lenguajes de programación ha tenido como objetivo difuminar la distinción entre un programa como un conjunto de instrucciones y un programa como una afirmación sobre la respuesta deseada, que es la característica principal de la programación declarativa . [74]Los paradigmas más refinados incluyen programación procedimental , programación orientada a objetos , programación funcional y programación lógica ; algunos lenguajes son híbridos de paradigmas o multiparadigmáticos. Un lenguaje ensamblador no es tanto un paradigma como un modelo directo de una arquitectura de máquina subyacente. Por propósito, los lenguajes de programación pueden considerarse de uso general, lenguajes de programación del sistema , lenguajes de scripting, lenguajes específicos de dominio o lenguajes concurrentes / distribuidos (o una combinación de estos). [75] Algunos lenguajes de propósito general se diseñaron principalmente con objetivos educativos. [76]

Un lenguaje de programación también puede clasificarse por factores no relacionados con el paradigma de programación. Por ejemplo, la mayoría de los lenguajes de programación utilizan el idioma inglés palabras clave, mientras que una minoría no lo hacen . Otros idiomas pueden clasificarse como deliberadamente esotéricos o no.

Ver también [ editar ]

  • Comparación de lenguajes de programación (instrucciones básicas)
  • Comparación de lenguajes de programación
  • Programación de computadoras
  • Ciencias de la computación y esquema de la ciencia de la computación
  • Lenguaje específico del dominio
  • Modelado específico de dominio
  • Lenguaje de programación educativo
  • Lenguaje de programación esotérico
  • Programación extensible
  • Categoría: lenguajes de programación de sintaxis extensible
  • Programación basada en invariantes
  • Lista de dialectos BÁSICOS
  • Listas de lenguajes de programación
  • Lista de investigadores de lenguajes de programación
  • Lenguajes de programación utilizados en los sitios web más populares
  • Programación orientada al lenguaje
  • Programación lógica
  • Programación alfabetizada
  • Metaprogramación
    • Ruby (lenguaje de programación) § Metaprogramación
  • Lenguaje de modelado
  • Teoría del lenguaje de programación
  • Pseudocódigo
  • Rebol § Dialectos
  • Reflexión
  • Lenguaje de programación científico
  • Lenguaje de escritura
  • Ingeniería de software y lista de temas de ingeniería de software

Referencias [ editar ]

  1. ^ Ettinger, James (2004) Jacquard's Web , Oxford University Press
  2. ↑ a b c 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 .
  3. ^ En términos matemáticos, esto significa que el lenguaje de programación es MacLennan completo de Turing , Bruce J. (1987). Principios de los lenguajes de programación . Prensa de la Universidad de Oxford. pag. 1. ISBN 978-0-19-511306-8.
  4. ^ ACM SIGPLAN (2003). "Estatutos del Grupo de Interés Especial en Lenguajes de Programación de la Asociación de Maquinaria de Computación" . Archivado desde el original el 22 de junio de 2006., "El alcance de SIGPLAN es la teoría, diseño, implementación, descripción y aplicación de lenguajes de programación de computadoras - lenguajes que permiten la especificación de una variedad de cálculos diferentes, proporcionando así al usuario un control significativo (inmediato o retardado) sobre la operación."
  5. ^ Dean, Tom (2002). "Programación de Robots" . Construyendo robots inteligentes . Departamento de Ciencias de la Computación de la Universidad de Brown. Archivado desde el original el 29 de octubre de 2006.
  6. ^ R. Narasimahan, 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.193: "una especificación completa de un lenguaje de programación debe, por definición, incluir una especificación de un procesador, idealizado, por así decirlo, para ese lenguaje". [la fuente cita muchas referencias para respaldar esta afirmación] 
  7. ^ Ben Ari, Mordejai (1996). Comprensión de 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 personas interesadas 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 a medida que se ejecutan en una computadora.
  8. ^ David A. Schmidt, La estructura de los lenguajes de programación mecanografiados , MIT Press, 1994, ISBN 0-262-19349-3 , p. 32 
  9. ^ Pierce, Benjamin (2002). Tipos y lenguajes de programación . MIT Press. pag. 339 . ISBN 978-0-262-16209-8.
  10. ^ 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 .
  11. ^ The Charity Development Group (diciembre de 1996). "La página de inicio de la 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".
  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. Dykes, Lucinda; Tittel, 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 Kaufmann . pag. 802 . ISBN 978-0-12-633951-2. XSLT, aunque altamente especializado en la transformación de XML, es un lenguaje de programación completo de Turing.
  18. ^ Oetiker, Tobías; Partl, 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, Apostolos; Tsolomitis de Antonis; Nick Sofroniou (2003). Tipografía digital usando LaTeX . Springer-Verlag. pag. 213 . ISBN 978-0-387-95217-8. TeX no solo es un excelente motor de composición, sino también un lenguaje de programación real.
  20. ^ Robert A. Edmunds, El glosario estándar de terminología informática de Prentice-Hall, Prentice-Hall, 1985, p. 91
  21. ^ Pascal Lando, Anne Lapujade, Gilles Kassel y Frédéric Fürst, Towards a General Ontology of Computer Programs 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
  22. ^ SK Bajpai, Introducción a las computadoras y la programación de C , New Age International, 2007, ISBN 81-224-1379-X , p. 346 
  23. ^ R. Narasimahan, 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 de computadora difiere del [...] para los lenguajes de programación en sólo dos aspectos. En un lenguaje de computadora, sólo hay un número finito de nombres, o registros, que sólo pueden asumir un número finito de valores, o estados, y estos estados no se distinguen más 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. Por ejemplo, sería implican que cualquier modelo para lenguajes de programación, al fijar algunos de sus parámetros o características, debería ser reducible de forma natural a un modelo para lenguajes de computadora ".
  24. ^ John C. Reynolds, "Algunas reflexiones sobre la enseñanza de programación y lenguajes de programación", Avisos de SIGPLAN , volumen 43, número 11, noviembre de 2008, p.109
  25. ^ Rojas, Raúl , et al. (2000). "Plankalkül: El primer lenguaje de programación de alto nivel y su implementación". Institut für Informatik, Freie Universität Berlin, Informe técnico B-3/2000. (texto completo) Archivado el 18 de octubre de 2014 en Wayback Machine.
  26. ^ Sebesta, WS Conceptos de lenguajes de programación. 2006; M6 14:18 págs.44. ISBN 0-321-33025-0 
  27. ^ Knuth, Donald E .; Pardo, Luis Trabb. "Desarrollo temprano de lenguajes de programación". Enciclopedia de Ciencias y Tecnología de la Computación . 7 : 419–493.
  28. ^ Peter J. Bentley (2012). Digitalizado: La ciencia de las computadoras y cómo da forma a nuestro mundo . Prensa de la Universidad de Oxford. pag. 87. ISBN 9780199693795. Archivado desde el original el 29 de agosto de 2016.
  29. ^ "Muere John Backus creador de Fortran - Tecnología y gadgets" . NBC News. 20 de marzo de 2007 . Consultado el 25 de abril de 2010 .
  30. ^ "CSC-302 99S: clase 02: una breve historia de los lenguajes de programación" . Math.grin.edu. Archivado desde el original el 15 de julio de 2010 . Consultado el 25 de abril de 2010 .
  31. ^ Eugene Loh (18 de junio de 2010). "El lenguaje de programación ideal de HPC" . Cola . 8 (6). Archivado desde el original el 4 de marzo de 2016.
  32. ^ "HPL - una implementación portátil del punto de referencia Linpack de alto rendimiento para equipos de memoria distribuida" . Archivado desde el original el 15 de febrero de 2015 . Consultado el 21 de febrero de 2015 .
  33. ^ Hopper (1978) p. dieciséis.
  34. ^ Sammet (1969) p. 316
  35. ^ Sammet (1978) p. 204.
  36. ^ Richard L. Wexelblat: Historia de los lenguajes de programación , Academic Press, 1981, capítulo XIV.
  37. ^ François Labelle. "Gráfico de uso del lenguaje de programación" . SourceForge . Archivado desde el original el 17 de junio de 2006 . Consultado el 21 de junio de 2006 .. Esta comparación analiza las tendencias en la cantidad de proyectos alojados por un repositorio de programación comunitaria popular. Durante la mayoría de los años de la comparación, C lidera por un margen considerable; en 2006, Java supera a C, pero la combinación de C / C ++ sigue liderando considerablemente.
  38. ^ Hayes, Brian (2006). "Las guerras del punto y coma". Científico estadounidense . 94 (4): 299-303. doi : 10.1511 / 2006.60.299 .
  39. ^ Dijkstra, Edsger W. (marzo de 1968). "Ir a la declaración considerada nociva" (PDF) . Comunicaciones de la ACM . 11 (3): 147-148. doi : 10.1145 / 362929.362947 . S2CID 17469809 . Archivado (PDF) desde el original el 13 de mayo de 2014.  
  40. ^ Tetsuro Fujise, Takashi Chikayama, Kazuaki Rokusawa, Akihiko Nakase (diciembre de 1994). "KLIC: una implementación portátil de KL1" Proc. de FGCS '94, ICOT Tokio, diciembre de 1994. "Copia archivada" . Archivado desde el original el 25 de septiembre de 2006 . Consultado el 9 de octubre de 2006 .CS1 maint: archived copy as title (link)KLIC es una implementación portátil de un lenguaje de programación lógica concurrente KL1 .
  41. ^ Jim Bender (15 de marzo de 2004). "Minibliografía sobre módulos para lenguajes de programación funcionales" . ReadScheme.org . Archivado desde el original el 24 de septiembre de 2006.
  42. ^ Michael Sipser (1996). Introducción a la Teoría de la Computación . Publicación de PWS. ISBN 978-0-534-94728-6. Sección 2.2: Autómatas de empuje, págs. 101-114.
  43. Jeffrey Kegler, " Perl and Undecidability Archivado el 17 de agosto de 2009 en Wayback Machine ", The Perl Review . Los artículos 2 y 3 prueban, utilizando respectivamente el teorema de Rice y la reducción directa al problema de la detención , que el análisis sintáctico de los programas Perl es, en general, indecidible.
  44. 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
  45. ^ Michael Lee Scott, pragmática del lenguaje de programación , edición 2, Morgan Kaufmann, 2006, ISBN 0-12-633951-1 , p. 18-19 
  46. ^ a b c d e f g 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 .
  47. ^ Específicamente, las instancias detipos genéricos se infieren para ciertas formas de expresión. La inferencia de tipos en Java genérico, el lenguaje de investigación que proporcionó la base para lasextensiones de polimorfismo paramétrico limitado 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) y Sound Generic Java type inference 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 parciales similar.
  48. ^ "Informe revisado sobre el esquema de lenguaje algorítmico" . 20 de febrero de 1998. Archivado desde el original el 14 de julio de 2006.
  49. ^ Luca Cardelli y Peter Wegner . "Sobre la comprensión de tipos, abstracción de datos y polimorfismo" . Manuscrito (1985) . Archivado desde el original el 19 de junio de 2006.
  50. ^ Steven R. Fischer, Una historia del lenguaje , Reaktion Books, 2003, ISBN 1-86189-080-X , p. 205 
  51. ^ Éric Lévénez (2011). "Historia de los lenguajes informáticos" . Archivado desde el original el 7 de enero de 2006.
  52. ^ Jing Huang. "Lenguaje artificial vs. lenguaje natural" . Archivado desde el original el 3 de septiembre de 2009.
  53. IBM en la primera publicación de PL / I, por ejemplo, tituló su manual de manera bastante ambiciosa El lenguaje de programación universal PL / I (Biblioteca de IBM; 1966). El título refleja los objetivos de IBM para la capacidad ilimitada de subconjuntos: "PL / I está diseñado de tal manera que uno puede aislar subconjuntos de él para satisfacer los requisitos de aplicaciones particulares". ( "PL / I" . Encyclopedia of Mathematics . Archivado desde el original el 26 de abril de 2012. Consultado el 29 de junio de 2006 .). Ada y UNCOL tenían metas iniciales similares.
  54. ^ Frederick P. Brooks, Jr .: El mes del hombre mítico , Addison-Wesley, 1982, págs. 93–94
  55. ^ Dijkstra, Edsger W. Sobre la estupidez de la "programación en lenguaje natural". Archivado el 20 de enero de 2008 en la Wayback Machine EWD667.
  56. ^ Perlis, Alan (septiembre de 1982). "Epigramas sobre programación" . Avisos SIGPLAN Vol. 17, N ° 9 . págs. 7-13. Archivado desde el original el 17 de enero de 1999.
  57. ^ Milner, R .; M. Tofte ; R. Harper ; D. MacQueen (1997). Definición de NM estándar (revisada) . MIT Press. ISBN 978-0-262-63181-5.
  58. ^ Kelsey, Richard; William Clinger; Jonathan Rees (febrero de 1998). "Sección 7.2 Semántica formal" . 5 Informe revisado sobre el esquema de lenguaje algorítmico . Archivado desde el original el 6 de julio de 2006.
  59. ^ ANSI - Lenguaje de programación Rexx, X3-274.1996
  60. ^ Steve, McConnell (2004). Código completo (Segunda ed.). Redmond, Washington. págs.  590, 600 . ISBN 0735619670. OCLC  54974573 .
  61. ^ Ver: Oracle America, Inc. contra Google, Inc.
  62. ^ "Guía de lenguajes de programación | ComputerScience.org" . ComputerScience.org . Consultado el 13 de mayo de 2018 .
  63. ^ "Los fundamentos" . ibm.com . 10 de mayo de 2011 . Consultado el 13 de mayo de 2018 .
  64. ^ "HOPL: una lista interactiva de lenguajes de programación" . Australia: Universidad de Murdoch . Archivado desde el original el 20 de febrero de 2011 . Consultado el 1 de junio de 2009 . Este sitio enumera 8512 idiomas.
  65. ^ Mayer, Philip; Bauer, Alexander (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 Evaluació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-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 de DSL de uso frecuente, (b) una influencia significativa del tamaño, el número de confirmaciones y el idioma principal en el número de idiomas, así como sin una influencia significativa de la edad y el número de contribuyentes, y (c) tres ecosistemas de idiomas agrupados alrededor de XML, Shell / Make y HTML / CSS. Conclusiones: La programación en múltiples lenguajes parece ser común en los proyectos de código abierto y es un factor que debe ser tratado en las herramientas y al evaluar el desarrollo y mantenimiento de dichos sistemas de software.
  66. ^ 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 .CS1 maint: multiple names: authors list (link)
  67. ^ Brown Vicki (1999). "Lenguajes de secuencias de comandos" . mactech.com . Archivado desde el original el 2 de diciembre de 2017.
  68. ^ Georgina Swan (21 de septiembre de 2009). "COBOL cumple 50 años" . computerworld.com.au. Archivado desde el original el 19 de octubre de 2013 . Consultado el 19 de octubre de 2013 .
  69. ^ Ed Airey (3 de mayo de 2012). "7 mitos de COBOL desacreditados" . developer.com. Archivado desde el original el 19 de octubre de 2013 . Consultado el 19 de octubre de 2013 .
  70. ^ Nicholas Enticknap. "Encuesta de salario de TI de SSL / Computer Weekly: el auge de las finanzas impulsa el crecimiento del empleo de TI" . Computer Weekly . Archivado desde el original el 26 de octubre de 2011 . Consultado el 14 de junio de 2013 .
  71. ^ "Contando lenguajes de programación por venta de libros" . Radar.oreilly.com. 2 de agosto de 2006. Archivado desde el original el 17 de mayo de 2008.
  72. ^ Bieman, JM; Murdock, V., Encontrar código en la World Wide Web: una investigación preliminar, Actas del primer taller internacional de IEEE sobre análisis y manipulación de código fuente, 2001
  73. ^ "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 .
  74. ^ Carl A. Gunter, Semántica de lenguajes de programación: estructuras y técnicas , MIT Press, 1992, ISBN 0-262-57095-5 , p. 1 
  75. ^ "TUNES: Lenguajes de programación" . Archivado desde el original el 20 de octubre de 2007.
  76. ^ Wirth, Niklaus (1993). "Recuerdos sobre el desarrollo de Pascal". La segunda conferencia ACM SIGPLAN sobre Historia de los lenguajes de programación - HOPL-II . Proc. II Congreso ACM SIGPLAN sobre Historia de los Lenguajes de Programación . 28 . págs. 333–342. CiteSeerX 10.1.1.475.6989 . doi : 10.1145 / 154766.155378 . ISBN  978-0-89791-570-0. S2CID  9783524 .

Lectura adicional [ editar ]

  • Abelson, Harold ; Sussman, Gerald Jay (1996). Estructura e interpretación de programas informáticos (2ª ed.). MIT Press. Archivado desde el original el 9 de marzo de 2018.
  • Raphael Finkel : Diseño de lenguaje de programación avanzado , Addison Wesley 1995.
  • Daniel P. Friedman , Mitchell Wand , Christopher T. Haynes : Fundamentos de los lenguajes de programación , The MIT Press 2001.
  • Maurizio Gabbrielli y Simone Martini: "Lenguajes de programación: principios y paradigmas", Springer, 2010.
  • David Gelernter , Suresh Jagannathan : Lingüística de programación , The MIT Press 1990.
  • Ellis Horowitz (ed.): Programming Languages, a Grand Tour (3a ed.), 1987.
  • Ellis Horowitz: Fundamentos de lenguajes de programación , 1989.
  • Shriram Krishnamurthi : Lenguajes de programación: aplicación e interpretación , publicación en línea .
  • Bruce J. MacLennan : Principios de lenguajes de programación: diseño, evaluación e implementación , Oxford University Press 1999.
  • John C. Mitchell : Conceptos en lenguajes de programación , Cambridge University Press 2002.
  • Benjamin C. Pierce : Tipos y lenguajes de programación , The MIT Press 2002.
  • Terrence W. Pratt y Marvin V. Zelkowitz : Lenguajes de programación: diseño e implementación (4a ed.), Prentice Hall 2000.
  • Peter H. Salus . Manual de lenguajes de programación (4 vols.). Macmillan 1998.
  • Ravi Sethi : Lenguajes de programación: conceptos y construcciones , 2a ed., Addison-Wesley 1996.
  • Michael L. Scott : Pragmática del lenguaje de programación , Morgan Kaufmann Publishers 2005.
  • Robert W. Sebesta : Conceptos de lenguajes de programación , 9a ed., Addison Wesley 2009.
  • Franklyn Turbak y David Gifford con Mark Sheldon : Conceptos de diseño en lenguajes de programación , The MIT Press 2009.
  • Peter Van Roy y Seif Haridi . Conceptos, técnicas y modelos de programación informática , The MIT Press 2004.
  • David A. Watt . Conceptos y paradigmas del lenguaje de programación . Prentice Hall 1990.
  • David A. Watt y Muffy Thomas . Sintaxis y semántica del lenguaje de programación . Prentice Hall 1991.
  • David A. Watt. Procesadores de lenguaje de programación . Prentice Hall 1993.
  • David A. Watt. Conceptos de diseño de lenguajes de programación . John Wiley e hijos 2004.

Enlaces externos [ editar ]