Lenguaje de programación

De Wikipedia, la enciclopedia libre
Saltar a navegación , búsqueda
Un ejemplo de una variante del lenguaje de scripting que tiene soporte para objetos, clases, métodos y herencia. Lenguajes de script son determinados tipos de lenguajes de programación, por lo general se escriben y construido para ser fácil de usar de forma dinámica.

Un lenguaje de programación es un lenguaje artificial diseñado para comunicar instrucciones a una máquina , particularmente una computadora . Los lenguajes de programación pueden ser utilizados para crear programas que controlan el comportamiento de una máquina y / o para expresar algoritmos con precisión.

Los lenguajes de programación más antiguos son anteriores a la invención de la computadora , y se utilizan para dirigir el comportamiento de máquinas tales como telares Jacquard y las pianolas . [ cita requerida ] Miles de diferentes lenguajes de programación se han creado, sobre todo en el campo de la informática, con muchos que se crea cada año. La mayoría de los lenguajes de programación describen la computación en un imperativo estilo, es decir, como una secuencia de comandos, aunque algunos idiomas, como los que apoyan la programación funcional y programación lógica , el uso de formas alternativas de descripción.

La descripción de un lenguaje de programación por lo general se divide en los dos componentes de la sintaxis (forma) y semántica (significado). Algunos idiomas se define en un documento de especificación (por ejemplo, el C lenguaje de programación es indicado por la ISO estándar), mientras que otros lenguajes, como Perl 5 y anteriores, tienen una posición dominante en la aplicación que se utiliza como referencia .

Contenido

[ editar ] Definiciones

Un lenguaje de programación es una notación para escribir programas , que son las especificaciones de un cálculo o algoritmo . [1] Algunos, pero no todos, los autores restringen el término "lenguaje de programación" a los idiomas que se pueden expresar todos los algoritmos posibles. [1] [ 2] Rasgos menudo considerados importantes para lo que constituye un lenguaje de programación incluyen:

  • Función y objetivo: Un lenguaje de programación es un lenguaje utilizado para escribir programas de ordenador , lo que implica un equipo la realización de algún tipo de computación [3] o el algoritmo y, posiblemente, controlar dispositivos externos, como impresoras , unidades de disco , los robots , [4] y por lo tanto en. Por ejemplo PostScript programas son frecuentemente creados por otro programa para controlar una impresora de ordenador o la pantalla. Más en general, un lenguaje de programación puede describir cómputo en algunos, posiblemente resumen, máquina. En general se acepta que una especificación completa de un lenguaje de programación incluye una descripción, posiblemente idealizado, de una máquina o procesador para ese idioma. [5] En la mayoría de contextos prácticos, un lenguaje de programación consiste en un ordenador y, en consecuencia, los lenguajes de programación se definen generalmente y estudiado de esta manera. [6] Los lenguajes de programación diferentes de las lenguas naturales en que las lenguas naturales se utilizan únicamente para la interacción entre las personas, mientras que los lenguajes de programación también permiten a los humanos se comunican las instrucciones a las máquinas.
  • Abstracciones: Los lenguajes de programación por lo general contienen abstracciones para definir y manipular estructuras de datos o el control de la flujo de ejecución . La necesidad práctica de que un lenguaje de programación de apoyo abstracciones adecuadas se expresa por el principio de abstracción ; [7] . este principio a veces se formula como recomendación al programador para hacer un uso adecuado de tales abstracciones [8]
  • Poder expresivo: La teoría de la computación clasifica los idiomas por los cálculos que son capaces de expresar. Todos completas Turing idiomas pueden aplicar el mismo conjunto de algoritmos . ANSI / ISO SQL y Caridad son ejemplos de lenguajes que no son de Turing, sin embargo, a menudo llamados lenguajes de programación completos. [9] [10]

Lenguajes de marcas como XML , HTML o troff , que definen los datos estructurados , generalmente no se consideran lenguajes de programación. [11] [12] [13] Los lenguajes de programación pueden, sin embargo, comparten la sintaxis de lenguajes de marcado si se define una semántica computacional. XSLT , por ejemplo, es una completa Turing dialecto XML. [14] [15] [16] Por otra parte, LaTeX , que se utiliza sobre todo para la estructuración de los documentos, también contiene un subconjunto completo de Turing. [17] [18]

El lenguaje de programación término se utiliza a veces alternativamente con el lenguaje de programación. [19] Sin embargo, el uso de ambos términos varía entre los autores, incluyendo el alcance exacto de cada uno. Un uso describe los lenguajes de programación como un subconjunto de los lenguajes de programación. [20] En este sentido, los idiomas utilizados en la informática que tienen un objetivo diferente al que expresan los programas de ordenador se designan genéricamente lenguajes de programación. Por ejemplo, los lenguajes de marcas se refieren a veces como lenguajes de programación para enfatizar que no están destinados a ser utilizados para la programación. [21] Otro uso que respecta a los lenguajes de programación como constructos teóricos para la programación de máquinas abstractas, y lenguajes de programación como el conjunto de los mismos que se ejecuta en los equipos físicos, que tienen los recursos de hardware limitados. [22] John C. Reynolds subraya que especificaciones formales idiomas son igual de lenguajes de programación tanto como son los idiomas destinados a la ejecución. También sostiene que los formatos de entrada de texto e incluso gráficos que afectan el comportamiento de un equipo son lenguajes de programación, a pesar de que normalmente no son Turing-completo, y los comentarios que la ignorancia de conceptos del lenguaje de programación es la razón de muchos defectos en formatos de entrada. [23]

[ editar ] Elementos

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

[ editar ] Sintaxis

Analizar árbol de código Python con tokenización inserción
El resaltado de sintaxis se utiliza a menudo para ayudar a los programadores en el reconocimiento de los elementos del código fuente. El lenguaje anterior es Python .

Forma de la superficie de un lenguaje de programación se conoce como su sintaxis . La mayoría de los lenguajes de programación son puramente textual, que utilizan secuencias de texto, incluyendo palabras, números y signos de puntuación, al igual que los lenguajes naturales escritos. Por otra parte, hay algunos lenguajes de programación que son más gráfica en la naturaleza, utilizando las 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 correcta. El significado que se da a una combinación de símbolos es manejado por la semántica (ya sean formales o no modificable en una implementación de referencia ). Dado que la mayoría de lenguajes son textuales, este artículo describe la sintaxis textual.

La sintaxis del lenguaje de programación se define por lo general usando una combinación de las expresiones regulares (por léxica estructura) y Backus-Naur Form (por gramatical estructura). A continuación se muestra una gramática simple, basado en Lisp :

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

Esta gramática especifica lo siguiente:

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

Los siguientes son ejemplos de bien formados secuencias simbólicas en esta gramática: " 12345 "," () "," (ab c232 (1)) '

No todos los programas sintácticamente correctos son semánticamente correcto. Muchos programas sintácticamente correctas son, sin embargo, mal formada, según las reglas de la lengua, y pueden (dependiendo de la especificación del lenguaje y la solidez de la aplicación) como resultado de un error en la traducción o ejecución. En algunos casos, estos programas pueden exhibir un comportamiento indefinido . Incluso cuando un programa está bien definido dentro de un lenguaje, todavía puede tener un significado que no está previsto por la persona que lo escribió.

El uso del lenguaje natural como ejemplo, puede no ser posible asignar un significado a una oración gramaticalmente correcta o la frase puede ser falsa:

  • " las ideas verdes incoloras duermen furiosamente ". es gramaticalmente bien formados, pero no tiene significado generalmente aceptado.
  • "John es un soltero casado." es gramaticalmente bien formados pero expresa un significado que no puede ser verdad.

El fragmento siguiente lenguaje C es sintácticamente correcta, pero realiza operaciones que no se definen semánticamente (la operación * p >> 4 no tiene sentido para un valor con un tipo complejo y p-> im no está definida porque el valor de p es la puntero nulo ):

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

Si la declaración de tipo se omitieron en la primera línea, el programa daría lugar a un error de compilación, ya que no se definiría la "p" variable. Sin embargo, el programa todavía sería sintácticamente correcta, ya que las declaraciones de tipos proporcionan información sólo 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 los lenguajes de programación se puede especificar mediante una gramática de tipo 2, es decir, son gramáticas libres de contexto . [24] Algunos lenguajes, como Perl y Lisp, contienen construcciones que permiten la ejecución durante la fase de análisis. Idiomas que tienen construcciones que permiten al programador para alterar el comportamiento del analizador hacen análisis de sintaxis de un problema irresoluble y, en general desdibujan la distinción entre análisis y ejecución. [25] En contraste con macro sistema de Lisp y Perl de BEGIN bloques, que puede contener en general cálculos, macros C son más que reemplazos de cadenas, y no requieren la ejecución de código. [26]

[ edit ] Semántica

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

[ editar ] semántica estática

La semántica estática define las restricciones sobre la estructura de los textos válidos que son difíciles o imposibles de expresar en formalismos sintácticos estándar. [1] Para los lenguajes compilados, la semántica estática básicamente incluyen las reglas semánticas que se pueden comprobar en tiempo de compilación. Los ejemplos incluyen la comprobación de que cada identificador se declara antes de su uso (en idiomas que requieren tales declaraciones) o que las etiquetas de los brazos de una declaración de caso son distintas. [27] se utilizan muchas restricciones importantes de este tipo, como la comprobación de que los identificadores en el contexto adecuado (por ejemplo, no añadir un entero en un nombre de la función), o que las subrutinas llamadas tienen el número y el tipo adecuado de argumentos, pueden imponerse por definiéndolas como reglas en una lógica llamado un sistema de tipos . Otras formas de análisis estáticos como análisis de flujo de datos también pueden ser parte de la semántica estática. Lenguajes de programación más nuevos como Java y C # tienen análisis asignación definitiva , una forma de análisis de flujo de datos, como parte de su semántica estática.

[ edit ] semántica dinámica

Una vez que se ha especificado los datos, la máquina debe ser instruido para realizar operaciones sobre los datos. Por ejemplo, la semántica puede definir la estrategia mediante la cual las expresiones se evalúan los valores, o la manera en la que las estructuras de control ejecutan condicionalmente declaraciones . La semántica dinámicos (también conocida como semántica de ejecución) de un lenguaje define cómo y cuando las diversas construcciones de un lenguaje deben producir un comportamiento del programa. Hay muchas maneras de definir la semántica de ejecución. El lenguaje natural es a menudo utilizado para especificar la semántica de ejecución de los idiomas de uso común en la práctica. Una parte importante de la investigación académica entró en la semántica formal de lenguajes de programación , lo que permite semántica de ejecución que se especifiquen de manera formal. Los resultados de este campo de investigación se han visto limitada aplicación de diseño de lenguajes de programación y ejecución fuera de la academia.

[ editar ] Sistema de Tipo

Un sistema de tipo define cómo un lenguaje de programación clasifica los valores y expresiones en tipos, cómo se puede manipular estos tipos y cómo interactúan. El objetivo de un sistema de tipos es verificar y suele cumplir un cierto nivel de exactitud en programas escritos en ese lenguaje, detectando ciertas operaciones incorrectas. Cualquier decidible sistema tipo implica un trade-off: si bien rechaza muchos programas incorrectos, también puede prohibir algo correcto, aunque los programas no habituales. Con el fin de eludir este inconveniente, varios idiomas, tienen lagunas de tipo, generalmente sin control moldes que pueden ser utilizados por el programador para permitir explícitamente una operación normalmente no reconocidos entre los diferentes tipos. En la mayoría de los lenguajes con tipos, el sistema de tipos sólo se utiliza para escribir cheques programas, pero una serie de idiomas, que habitualmente funcionales, tipos inferir , aliviando al programador de la necesidad de escribir anotaciones de tipo. El diseño formal y el estudio de los sistemas de tipo se conoce como teoría de tipos .

[ edit ] con tipo frente untyped idiomas

Un lenguaje que se escribe si la especificación de cada operación define los tipos de datos a los que el funcionamiento es aplicable, con la implicación de que no es aplicable a otros tipos. [28] Por ejemplo, los datos representados por " this text between the quotes " es una cadena . En la mayoría de los lenguajes de programación, dividir un número por una cadena no tiene sentido, por lo que los lenguajes de programación más modernos rechazarán cualquier programa intenta realizar una operación. En algunos idiomas se detectó la operación de sentido cuando se compila el programa (comprobación de tipos "estática"), y rechazada por el compilador, mientras que en otros, se detecta cuando se ejecuta el programa (comprobación de tipos "dinámica"), lo que resulta en un tiempo de ejecución de excepción .

Un caso especial de lenguajes con tipos son los idiomas de un solo tipo. Estos son a menudo scripting o lenguajes de marcado, como REXX o SGML , y tiene sólo un tipo de datos de cadenas de caracteres más comunes que se utilizan para los datos tanto simbólicos y numéricos.

En contraste, un lenguaje sin tipo, tales como la mayoría de los idiomas de montaje , permite que cualquier operación que se realiza en los datos, que en general se consideran secuencias de bits de varias longitudes. [28] lenguajes de alto nivel que no tienen tipo incluyen BCPL y algunos variedades de Forth .

En la práctica, mientras que algunos idiomas son considerados escrito desde el punto de vista de la teoría de tipos (verificar o rechazar todas las operaciones), lenguajes más modernos ofrecen un grado de mecanografía. [28] Muchos lenguajes de producción proveen medios para eludir o subvertir el sistema de tipos ( ver colada ).

[ edit ] estático y dinámicos mecanografía

En tipos estáticos , todas las expresiones tienen sus tipos determinados antes de que se ejecute el programa, por lo general en tiempo de compilación. Por ejemplo, 1 y (2 +2) son expresiones enteras;., No se pueden pasar a una función que espera una cadena, o almacenados en una variable que se define a celebrar las fechas [28]

Lenguajes de tipos estáticos pueden ser ya sea manifiestamente mecanografiados o tipo inferirse . En el primer caso, el programador debe escribir explícitamente tipos en determinadas posiciones textuales (por ejemplo, en variables declaraciones ). En el segundo caso, el compilador infiere los tipos de expresiones y declaraciones basada en el contexto. La mayoría de los lenguajes de tipado estático convencionales, tales como C + + , C # y Java , es evidente que las escriben. La inferencia de tipos completa se ha asociado tradicionalmente con los idiomas menos tradicionales, tales como Haskell y ML . Sin embargo, muchos idiomas manifiestamente mecanografiadas apoyan la inferencia de tipo parcial, por ejemplo, Java y C # . ambos tipos inferir en algunos casos limitados [29]

Tipado dinámico , también llamado tipificación latente, determina el tipo-seguridad de las operaciones en tiempo de ejecución, es decir, los tipos se asocian con los valores de tiempo de ejecución en lugar de expresiones textuales. [28] Como con el tipo-inferidos idiomas, lenguajes con tipos dinámicos hacer no requiere que el programador escriba anotaciones de tipo explícitas sobre las expresiones. Entre otras cosas, esto puede permitir que una única variable para hacer referencia a los valores de diferentes tipos en diferentes puntos de la ejecución del programa. Sin embargo, el tipo de errores que no se pueden detectar automáticamente hasta un trozo de código que se ejecuta en realidad, lo que podría hacer la depuración sea más difícil. Lisp , Perl , Python , JavaScript y Rubí se escriben de forma dinámica.

[ edit ] Débil y fuerte tipificación

Tipificación débil permite a un valor de un tipo de ser tratado como otro, por ejemplo el tratamiento de una cadena como un número. [28] Esto puede ser ocasionalmente útil, pero también puede permitir que algunos tipos de defectos de programa para pasar desapercibidos en el momento de la compilación e incluso en tiempo de ejecución .

La tipificación estricta impide que el anterior. Un intento de realizar una operación en el tipo incorrecto de valor genera un error. [28] idiomas inflexible de tipos a menudo se denominan de tipo seguro o segura .

Una definición alternativa de "tipos débiles" se refiere a las lenguas, como Perl y JavaScript , que permite que un gran número de conversiones de tipos implícitas. En JavaScript, por ejemplo, la expresión 2 * x convierte implícitamente x a un número, y esta conversión tiene éxito incluso si x es null , undefined , una Array o una cadena de letras. Tales conversiones implícitas a menudo son útiles, pero pueden enmascarar errores de programación. Fuerte y estática ahora generalmente se consideran conceptos ortogonales, pero el uso en la literatura difiere. Algunos utilizan el término tecleado fuerte en el sentido de fuerza, tipos estáticos, o, aún más confusión, en el sentido de simplemente estático de tipos. Así C ha llamado tanto inflexible de tipos y débilmente, tipos estáticos. [30] [31]

Puede parecer extraño para algunos programadores profesionales que C podría ser "débil, tipos estáticos". Sin embargo, observe que el uso del puntero genérico, el puntero void *, sí permite la fundición de punteros a otros indicadores sin necesidad de hacer una conversión explícita. Esto es muy similar a la fundición de alguna manera una matriz de bytes a cualquier tipo de tipo de datos en C sin necesidad de utilizar una conversión explícita, tales como (int) o (char) .

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

La mayoría de los lenguajes de programación tienen un núcleo asociado biblioteca (a veces conocido como el "biblioteca estándar ', especialmente si se incluye como parte del lenguaje estándar publicado), que se hace convencionalmente disponibles por todas las implementaciones de la lengua. Bibliotecas centrales suelen incluir definiciones para los algoritmos de uso general, estructuras de datos y los mecanismos de entrada y salida.

Base de la biblioteca de un lenguaje a menudo es tratada como parte de la lengua por parte de sus usuarios, aunque los diseñadores pueden haber tratado como una entidad separada. Muchas especificaciones definen un lenguaje básico que debe estar disponible en todas las implementaciones, y en el caso de los lenguajes estandarizados puede ser requerida esta biblioteca principal. La línea entre una lengua y su biblioteca central tanto, difiere de un idioma a otro. De hecho, algunos idiomas están diseñados para que los significados de ciertas construcciones sintácticas ni siquiera pueden ser descritos sin hacer referencia a la biblioteca principal. Por ejemplo, en Java , un literal de cadena se define como una instancia de la clase java.lang.String, de manera similar, en Smalltalk , una función anónima expresión (un "bloque") crea una instancia de la clase BlockContext de la biblioteca. Por el contrario, Esquema contiene varios subconjuntos coherentes que sean suficientes para construir el resto de la lengua como macros de la biblioteca, por lo que los diseñadores del lenguaje ni siquiera se molestan en decir que las porciones de la lengua deben ser implementados como construcciones del lenguaje, y que deben aplicarse en las partes de una biblioteca.

[ editar ] Diseño e implementación

Los lenguajes de programación comparten propiedades con los lenguajes naturales relacionados con su propósito como vehículos para la comunicación, que tiene una forma sintáctica separado de su semántica, y que muestra las familias lingüísticas de lenguas relacionadas de ramificación una de la otra. [32] [33] Sin embargo, como construcciones artificiales, que también difieren en aspectos fundamentales de las lenguas que se han desarrollado a través de uso. Una diferencia significativa es que un lenguaje de programación puede ser adecuadamente descrito y estudiado en su totalidad, ya que tiene una definición precisa y finito. [34] Por el contrario, los lenguajes naturales han cambiando significados dados por sus usuarios en diferentes comunidades. Mientras idiomas construidos son también lenguas artificiales diseñados desde el principio con un propósito específico, que carecen de la definición semántica precisa y completa, que cuenta con un lenguaje de programación.

Muchos lenguajes de programación han sido diseñados desde cero, modificados para ajustarse a las nuevas necesidades, y se combinan con otros idiomas. Muchos han caído en desuso con el tiempo. Aunque ha habido intentos de diseñar un lenguaje de programación "universal", que sirve a todos los efectos, todos ellos han dejado de ser aceptada como llenar este papel. [35] La necesidad de diversos lenguajes de programación se debe a la diversidad de contextos en los que las lenguas se utilizan:

  • Los programas van desde pequeños scripts escritos por aficionados individuales a grandes sistemas escritos por cientos de programadores .
  • Los programadores van a expertos de los novatos que necesitan simplicidad por encima de todo, los expertos que pueden estar a gusto con una complejidad considerable.
  • Los programas deben equilibrar la velocidad, el tamaño y la simplicidad de los sistemas que van desde los microcontroladores de supercomputadoras .
  • Los programas pueden ser escritos una vez y no cambiar para las generaciones, o pueden sufrir una modificación continua.
  • Por último, los programadores pueden simplemente difieren en sus gustos: pueden estar acostumbrados a discutir los problemas y se expresan en un idioma determinado.

Una tendencia común en el desarrollo de los lenguajes de programación ha sido añadir más capacidad para resolver problemas usando un mayor nivel de abstracción . Los lenguajes de programación más tempranos fueron atados muy estrechamente al hardware subyacente de la computadora. Como los nuevos lenguajes de programación se han desarrollado, las características se han agregado que vamos a programadores expresar ideas que están más alejadas de la simple traducción en instrucciones de hardware subyacentes. Debido a los programadores son menos ligados a la complejidad de la computadora, sus programas pueden hacer más cálculos con menos esfuerzo por parte del programador. Esto les permite escribir más funcionalidad por unidad de tiempo. [36]

Procesadores de lenguaje natural se han propuesto como una manera de eliminar la necesidad de un lenguaje especializado para la programación. Sin embargo, este objetivo sigue siendo distante y sus beneficios están abiertos al debate. Edsger W. Dijkstra adoptó la posición de que el uso de un lenguaje formal es esencial para prevenir la introducción de construcciones de sentido, y desestimó la programación en lenguaje natural como "tontos". [37 ] Alan Perlis fue igualmente desdeñosos de la idea. [38] enfoques híbridos se han tomado en Inglés Estructurado y SQL .

Diseñadores y usuarios de una lengua deben construir una serie de artefactos que gobiernan y permiten la práctica de la programación. El más importante de estos artefactos son la especificación del lenguaje y la implementación.

[ editar ] Especificaciones

La especificación de un lenguaje de programación está destinada a proporcionar una definición de que el idioma usuarios y los implementadores pueden utilizar para determinar si el comportamiento de un programa es correcta, dado su código fuente .

Una especificación del lenguaje de programación puede tomar varias formas, incluyendo las siguientes:

[ editar ] Implementación

Una implementación de un lenguaje de programación proporciona una manera de ejecutar el programa en una o más configuraciones de hardware y software. Hay, en términos generales, dos enfoques para la implementación del lenguaje de programación: compilación y la interpretación . Por lo general, es posible implementar un idioma utilizando cualquiera de las técnicas.

La salida de un compilador puede ser ejecutada por hardware o un programa llamado un intérprete. En algunas implementaciones que hacen uso del enfoque intérprete no existe una frontera clara entre la compilación y la interpretación. Por ejemplo, algunas implementaciones de BASIC compilar y ejecutar el código de una línea a la vez.

Los programas que se ejecutan directamente en el hardware que generalmente se ejecuta en varios órdenes de magnitud más rápido que las que se interpretan en el software. [ cita requerida ]

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

[ editar ] Uso

Miles de diferentes lenguajes de programación se han creado, sobre todo en el campo de la computación. [42] Los lenguajes de programación se diferencian de la mayoría de otras formas de expresión humana en que requieren un mayor grado de precisión y exhaustividad.

Cuando se utiliza un lenguaje natural para comunicarse con otras personas, autores humanos y altavoces puede ser ambigua y hacer pequeños errores, y todavía esperan su intención de ser entendido. Sin embargo, en sentido figurado, los ordenadores "no es exactamente lo que se les dice que hacer", y no puede "entender" lo que el código que el programador desea escribir. La combinación de la definición del lenguaje, un programa, y ​​los insumos del programa debe especificar completamente el comportamiento externo que se produce cuando se ejecuta el programa, dentro del ámbito de control de ese programa. Por otro lado, las ideas sobre un algoritmo pueden ser comunicados a los seres humanos sin la precisión requerida para la ejecución mediante el uso de pseudocódigo , que intercala lenguaje natural con el código escrito en un lenguaje de programación.

Un lenguaje de programación es un mecanismo estructurado para definir los elementos de datos y las operaciones o transformaciones que se pueden llevar a cabo de forma automática 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 ). [43] de programación es el proceso por el cual los programadores combinan estas primitivas para componer nuevos programas, o adaptar los ya existentes a nuevos usos o un entorno cambiante.

Los programas para una computadora pueden ser ejecutadas en un proceso por lotes sin intervención humana, o un usuario pueden escribir comandos en una sesión interactiva de un intérprete . En este caso, los "comandos" son simplemente programas, cuya ejecución se encadenan. Cuando se utiliza un lenguaje para dar órdenes a una aplicación de software (como un shell ) que se llama un lenguaje de scripting . [ cita requerida ]

[ edit ] el uso del lenguaje de medición

Es difícil determinar qué lenguajes de programación más usados, y lo que significa el uso varía según el contexto. Un idioma puede ocupar el mayor número de horas de programador, una diferente tiene más líneas de código, y la tercera utilizar el tiempo más CPU. Algunas lenguas son muy populares para determinados tipos de aplicaciones. Por ejemplo, COBOL sigue siendo fuerte [ cita requerida ] en el centro de datos corporativo, a menudo en grandes mainframes , Fortran en los científicos y las aplicaciones de ingeniería, y C en aplicaciones integradas y sistemas operativos. Otros idiomas se utilizan regularmente para escribir diferentes tipos de aplicaciones.

Varios métodos de popularidad lenguaje de medición, cada uno sujeto a un sesgo diferente en lo que se mide, se han propuesto:

  • contando el número de anuncios de empleo que mencionan el idioma [44]
  • el número de libros vendidos que enseñan o describir el lenguaje [45]
  • estimaciones del número de líneas existentes de código escritas en el idioma, que puede subestimar idiomas que no se encuentran en las búsquedas públicas [46]
  • cargos de referencias de la lengua (es decir, el nombre de la lengua) encontraron usando un motor de búsqueda web.

Combinar y promediando la información de diversos sitios de Internet, langpop.com afirma que [47] en 2008 los 10 más citados lenguajes de programación son (en orden alfabético): C , C + + , C # , Java , JavaScript , Perl , PHP , Python , Rubí , y SQL .

[ editar ] Las taxonomías

There is no overarching classification scheme for programming languages. A given programming language does not usually have a single ancestor language. Languages commonly arise by combining the elements of several predecessor languages with new ideas in circulation at the time. Ideas that originate in one language will diffuse throughout a family of related languages, and then leap suddenly across familial gaps to appear in an entirely different family.

The task is further complicated by the fact that languages can be classified along multiple axes. For example, Java is both an object-oriented language (because it encourages object-oriented organization) and a concurrent language (because it contains built-in constructs for running multiple threads in parallel). Python is an object-oriented scripting language .

In broad strokes, programming languages divide into programming paradigms and a classification by intended domain of use . Traditionally, programming languages have been regarded as describing computation in terms of imperative sentences, ie issuing commands. These are generally called imperative programming languages. A great deal of research in programming languages has been aimed at blurring the distinction between a program as a set of instructions and a program as an assertion about the desired answer, which is the main feature of declarative programming . [ 48 ] More refined paradigms include procedural programming , object-oriented programming , functional programming , and logic programming ; some languages are hybrids of paradigms or multi-paradigmatic. An assembly language is not so much a paradigm as a direct model of an underlying machine architecture. By purpose, programming languages might be considered general purpose, system programming languages, scripting languages, domain-specific languages, or concurrent/distributed languages (or a combination of these). [ 49 ] Some general purpose languages were designed largely with educational goals. [ 50 ]

A programming language may also be classified by factors unrelated to programming paradigm. For instance, most programming languages use English language keywords, while a minority do not . Other languages may be classified as being deliberately esoteric or not.

[ editar ] Historia

A selection of textbooks that teach programming, in languages both popular and obscure. These are only a few of the thousands of programming languages and dialects that have been designed in history.

[ edit ] Early developments

The first programming languages predate the modern computer. The 19th century saw the invention of "programmable" looms and player piano scrolls, both of which implemented examples of domain-specific languages . By the beginning of the twentieth century, punch cards encoded data and directed mechanical processing. In the 1930s and 1940s, the formalisms of Alonzo Church 's lambda calculus and Alan Turing 's Turing machines provided mathematical abstractions for expressing algorithms ; the lambda calculus remains influential in language design. [ 51 ]

In the 1940s, the first electrically powered digital computers were created. Grace Hopper , was one of the first programmers of the Harvard Mark I computer, a pioneer in the field, developed the first compiler, around 1952, for a computer programming language. Notwithstanding, the idea of programming language existed earlier; the first high-level programming language to be designed for a computer was Plankalkül , developed for the German Z3 by Konrad Zuse between 1943 and 1945. However, it was not implemented until 1998 and 2000. [ 52 ]

Programmers of early 1950s computers, notably UNIVAC I and IBM 701 , used machine language programs , that is, the first generation language (1GL). 1GL programming was quickly superseded by similarly machine-specific, but mnemonic , second generation languages (2GL) known as assembly languages or "assembler". Later in the 1950s, assembly language programming, which had evolved to include the use of macro instructions , was followed by the development of "third generation" programming languages (3GL), such as FORTRAN , LISP , and COBOL . [ 53 ] 3GLs are more abstract and are "portable", or at least implemented similarly on computers that do not support the same native machine code. Updated versions of all of these 3GLs are still in general use, and each has strongly influenced the development of later languages. [ 54 ] At the end of the 1950s, the language formalized as ALGOL 60 was introduced, and most later programming languages are, in many respects, descendants of Algol. [ 54 ] The format and use of the early programming languages was heavily influenced by the constraints of the interface . [ 55 ]

[ edit ] Refinement

The period from the 1960s to the late 1970s brought the development of the major language paradigms now in use, though many aspects were refinements of ideas in the very first Third-generation programming languages :

Each of these languages spawned an entire family of descendants, and most modern languages count at least one of them in their ancestry.

The 1960s and 1970s also saw considerable debate over the merits of structured programming , and whether programming languages should be designed to support it. [ 58 ] Edsger Dijkstra , in a famous 1968 letter published in the Communications of the ACM , argued that GOTO statements should be eliminated from all "higher level" programming languages. [ 59 ]

The 1960s and 1970s also saw expansion of techniques that reduced the footprint of a program as well as improved productivity of the programmer and user. The card deck for an early 4GL was a lot smaller for the same functionality expressed in a 3GL deck .

[ edit ] Consolidation and growth

The 1980s were years of relative consolidation. C++ combined object-oriented and systems programming. The United States government standardized Ada , a systems programming language derived from Pascal and intended for use by defense contractors. In Japan and elsewhere, vast sums were spent investigating so-called "fifth generation" languages that incorporated logic programming constructs. [ 60 ] The functional languages community moved to standardize ML and Lisp. Rather than inventing new paradigms, all of these movements elaborated upon the ideas invented in the previous decade.

One important trend in language design for programming large-scale systems during the 1980s was an increased focus on the use of modules , or large-scale organizational units of code. Modula-2 , Ada, and ML all developed notable module systems in the 1980s, although other languages, such as PL/I , already had extensive support for modular programming. Module systems were often wedded to generic programming constructs. [ 61 ]

The rapid growth of the Internet in the mid-1990s created opportunities for new languages. Perl , originally a Unix scripting tool first released in 1987, became common in dynamic websites . Java came to be used for server-side programming, and bytecode virtual machines became popular again in commercial settings with their promise of " Write once, run anywhere " ( UCSD Pascal had been popular for a time in the early 1980s). These developments were not fundamentally novel, rather they were refinements to existing languages and paradigms, and largely based on the C family of programming languages.

Programming language evolution continues, in both industry and research. Current directions include security and reliability verification, new kinds of modularity ( mixins , delegates , aspects ), and database integration such as Microsoft's LINQ .

The 4GLs are examples of languages which are domain-specific, such as SQL , which manipulates and returns sets of data rather than the scalar values which are canonical to most programming languages. Perl , for example, with its ' here document ' can hold multiple 4GL programs, as well as multiple JavaScript programs, in part of its own perl code and use variable interpolation in the 'here document' to support multi-language programming. [ 62 ]

[ editar ] Véase también

[ editar ] Referencias

  1. ^ a b c Aaby, Anthony (2004). Introduction to Programming Languages .  
  2. ^ In mathematical terms, this means the programming language is Turing-complete MacLennan, Bruce J. (1987). Principles of Programming Languages . Oxford University Press. p. 1. ISBN 0-19-511306-3 .  
  3. ^ ACM SIGPLAN (2003). "Bylaws of the Special Interest Group on Programming Languages of the Association for Computing Machinery" . Retrieved 19 June 2006 .   , The scope of SIGPLAN is the theory, design, implementation, description, and application of computer programming languages - languages that permit the specification of a variety of different computations, thereby providing the user with significant control (immediate or delayed) over the computer's operation.
  4. ^ Dean, Tom (2002). "Programming Robots" . Building Intelligent Robots . Brown University Department of Computer Science . Retrieved 23 September 2006 .  
  5. ^ R. Narasimahan, Programming Languages and Computers: A Unified Metatheory, pp. 189--247 in Franz Alt, Morris Rubinoff (eds.) Advances in computers, Volume 8, Academic Press, 1994, ISBN 012012108, p.193 : "a complete specification of a programming language must, by definition, include a specification of a processor--idealized, if you will--for that language." [the source cites many references to support this statement]
  6. ^ Ben Ari, Mordechai (1996). Understanding Programming Languages . John Wiley and Sons. "Programs and languages can be defined as purely formal mathematical objects. However, more people are interested in programs than in other mathematical objects such as groups, precisely because it is possible to use the program—the sequence of symbols—to control the execution of a computer. While we highly recommend the study of the theory of programming, this text will generally limit itself to the study of programs as they are executed on a computer."  
  7. ^ David A. Schmidt, The structure of typed programming languages , MIT Press, 1994, ISBN 0-262-19349-3 , p. 32
  8. ^ Pierce, Benjamin (2002). Types and Programming Languages . MIT Press. p. 339. ISBN 0-262-16209-1 .  
  9. ^ Digital Equipment Corporation. "Information Technology - Database Language SQL (Proposed revised text of DIS 9075)" . ISO/IEC 9075:1992, Database Language SQL . Retrieved 29 June 2006 .  
  10. ^ The Charity Development Group (December 1996). "The CHARITY Home Page" . Retrieved 29 June 2006 .   , Charity is a categorical programming language... , All Charity computations terminate.
  11. ^ XML in 10 points W3C , 1999, XML is not a programming language.
  12. ^ Powell, Thomas (2003). HTML & XHTML: the complete reference . McGraw-Hill. p. 25. ISBN 0-07-222942-X . " HTML is not a programming language. "  
  13. ^ Dykes, Lucinda; Tittel, Ed (2005). XML For Dummies, 4th Edition . Wiley. p. 20. ISBN 0-7645-8845-1 . " ...it's a markup language, not a programming language. "  
  14. ^ "What kind of language is XSLT?" . IBM.com . Consultado el 3 de diciembre de 2010.  
  15. ^ "XSLT is a Programming Language" . Msdn.microsoft.com . Consultado el 3 de diciembre de 2010.  
  16. ^ Scott, Michael (2006). Programming Language Pragmatics . Morgan Kaufmann . p. 802. ISBN 0-12-633951-1 . " XSLT, though highly specialized to the transformation of XML, is a Turing-complete programming language. "  
  17. ^ http://tobi.oetiker.ch/lshort/lshort.pdf
  18. ^ Syropoulos, Apostolos; Antonis Tsolomitis, Nick Sofroniou (2003). Digital typography using LaTeX . Springer-Verlag. p. 213. ISBN 0-387-95217-9 . " TeX is not only an excellent typesetting engine but also a real programming language. "  
  19. ^ Robert A. Edmunds, The Prentice-Hall standard glossary of computer terminology, Prentice-Hall, 1985, p. 91
  20. ^ Pascal Lando, Anne Lapujade, Gilles Kassel, and Frédéric Fürst, Towards a General Ontology of Computer Programs , ICSOFT 2007 , pp. 163-170
  21. ^ SK Bajpai, Introduction To Computers And C Programming , New Age International, 2007, ISBN 81-224-1379-X , p. 346
  22. ^ R. Narasimahan, Programming Languages and Computers: A Unified Metatheory, pp. 189--247 in Franz Alt, Morris Rubinoff (eds.) Advances in computers, Volume 8, Academic Press, 1994, ISBN 012012108, p.215: "[...] the model [...] for computer languages differs from that [...] for programming languages in only two respects. In a computer language, there are only finitely many names--or registers--which can assume only finitely many values--or states--and these states are not further distinguished in terms of any other attributes. [author's footnote:] This may sound like a truism but its implications are far reaching. For example, it would imply that any model for programming languages, by fixing certain of its parameters or features, should be reducible in a natural way to a model for computer languages."
  23. ^ John C. Reynolds, Some thoughts on teaching programming and programming languages , SIGPLAN Notices, Volume 43, Issue 11, November 2008, p.109
  24. ^ Michael Sipser (1996). Introduction to the Theory of Computation . PWS Publishing. ISBN 0-534-94728-X .   Section 2.2: Pushdown Automata, pp.101–114.
  25. ^ Jeffrey Kegler, " Perl and Undecidability ", The Perl Review . Papers 2 and 3 prove, using respectively Rice's theorem and direct reduction to the halting problem , that the parsing of Perl programs is in general undecidable.
  26. ^ Marty Hall, 1995, Lecture Notes: Macros , PostScript version
  27. ^ Michael Lee Scott, Programming language pragmatics , Edition 2, Morgan Kaufmann, 2006, ISBN 0-12-633951-1 , p. 18-19
  28. ^ a b c d e f g Andrew Cooke. "Introduction To Computer Languages" . Consultado el 13 de julio de 2012.  
  29. ^ Specifically, instantiations of generic types are inferred for certain expression forms. Type inference in Generic Java—the research language that provided the basis for Java 1.5's bounded parametric polymorphism extensions—is discussed in two informal manuscripts from the Types mailing list: Generic Java type inference is unsound ( Alan Jeffrey , 17 December 2001) and Sound Generic Java type inference ( Martin Odersky , 15 January 2002). C#'s type system is similar to Java's, and uses a similar partial type inference scheme.
  30. ^ "Revised Report on the Algorithmic Language Scheme" . 20 February 1998 . Retrieved 9 June 2006 .  
  31. ^ Luca Cardelli and Peter Wegner . "On Understanding Types, Data Abstraction, and Polymorphism" . Manuscript (1985) . Retrieved 9 June 2006 .  
  32. ^ Steven R. Fischer, A history of language , Reaktion Books, 2003, ISBN 1-86189-080-X , p. 205
  33. ^ Éric Lévénez (2011). "Computer Languages History" .  
  34. ^ Jing Huang. "Artificial Language vs. Natural Language" .  
  35. ^ IBM in first publishing PL/I, for example, rather ambitiously titled its manual The universal programming language PL/I (IBM Library; 1966). The title reflected IBM's goals for unlimited subsetting capability: PL/I is designed in such a way that one can isolate subsets from it satisfying the requirements of particular applications. ( "PL/I" . Encyclopedia of Mathematics . Retrieved 29 June 2006 .   ). Ada and UNCOL had similar early goals.
  36. ^ Frederick P. Brooks, Jr.: The Mythical Man-Month, Addison-Wesley, 1982, pp. 93-94
  37. ^ Dijkstra, Edsger W. On the foolishness of "natural language programming." EWD667.
  38. ^ Perlis, Alan (September 1982). "Epigrams on Programming" . SIGPLAN Notices Vol. 17, No. 9 . pp. 7–13.  
  39. ^ Milner, R. ; M. Tofte , R. Harper and D. MacQueen. (1997). The Definition of Standard ML (Revised) . MIT Press. ISBN 0-262-63181-4 .  
  40. ^ Kelsey, Richard; William Clinger and Jonathan Rees (February 1998). "Section 7.2 Formal semantics" . Revised 5 Report on the Algorithmic Language Scheme . Retrieved 9 June 2006 .  
  41. ^ ANSI — Programming Language Rexx, X3-274.1996
  42. ^ "HOPL: an interactive Roster of Programming Languages" . Australia: Murdoch University . Retrieved 1 June 2009 . "This site lists 8512 languages."  
  43. ^ Abelson, Sussman, and Sussman. "Structure and Interpretation of Computer Programs" . Retrieved 3 March 2009 .  
  44. ^ "Counting programming languages by book sales" . Radar.oreilly.com. 02 de agosto 2006. Consultado el 3 de diciembre de 2010.  
  45. ^ Bieman, JM; Murdock, V., Finding code on the World Wide Web: a preliminary investigation, Proceedings First IEEE International Workshop on Source Code Analysis and Manipulation, 2001
  46. ^ "Programming Language Popularity" . Langpop.com . Consultado el 3 de diciembre de 2010.  
  47. ^ Carl A. Gunter, Semantics of Programming Languages: Structures and Techniques , MIT Press, 1992, ISBN 0-262-57095-5 , p. 1
  48. ^ "TUNES: Programming Languages" .  
  49. ^ Wirth, Niklaus (1993). "Recollections about the development of Pascal" . Proc. 2nd ACM SIGPLAN conference on history of programming languages : 333–342. doi : 10.1145/154766.155378 . ISBN 0-89791-570-4 . Retrieved 30 June 2006 .  
  50. ^ Benjamin C. Pierce writes:
    "... the lambda calculus has seen widespread use in the specification of programming language features, in language design and implementation, and in the study of type systems." Pierce, Benjamin C. (2002). Types and Programming Languages . MIT Press . p. 52. ISBN 0-262-16209-1 .  
  51. ^ Rojas, Raúl , et al. (2000). "Plankalkül: The First High-Level Programming Language and its Implementation". Institut für Informatik, Freie Universität Berlin, Technical Report B-3/2000. (full text)
  52. ^ Linda Null, Julia Lobur, The essentials of computer organization and architecture , Edition 2, Jones & Bartlett Publishers, 2006, ISBN 0-7637-3769-0 , p. 435
  53. ^ a b O'Reilly Media . "History of programming languages" (PDF) . Retrieved 5 October 2006 .  
  54. ^ Frank da Cruz. IBM Punch Cards Columbia University Computing History .
  55. ^ Richard L. Wexelblat: History of Programming Languages , Academic Press, 1981, chapter XIV.
  56. ^ François Labelle. "Programming Language Usage Graph" . SourceForge . Retrieved 21 June 2006 .   . This comparison analyzes trends in number of projects hosted by a popular community programming repository. During most years of the comparison, C leads by a considerable margin; in 2006, Java overtakes C, but the combination of C/C++ still leads considerably.
  57. ^ Hayes, Brian (2006). "The Semicolon Wars". American Scientist 94 (4): 299–303.  
  58. ^ Dijkstra, Edsger W. (March 1968). "Go To Statement Considered Harmful" . Communications of the ACM 11 (3): 147–148. doi : 10.1145/362929.362947 . Consultado el 29 de junio de 2006.   [ Link muerto ]
  59. ^ Tetsuro Fujise, Takashi Chikayama, Kazuaki Rokusawa, Akihiko Nakase (December 1994). "KLIC: A Portable Implementation of KL1" Proc. of FGCS '94, ICOT Tokyo, December 1994. http://www.icot.or.jp/ARCHIVE/HomePage-E.html KLIC is a portable implementation of a concurrent logic programming language KL1 .
  60. ^ Jim Bender (15 March 2004). "Mini-Bibliography on Modules for Functional Programming Languages" . ReadScheme.org . Consultado el 27 de septiembre de 2006.  
  61. ^ Wall, Programming Perl ISBN 0-596-00027-8 p. 66

[ editar ] Otras lecturas

[ editar ] Enlaces externos