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 .
Los lenguajes de programación más tempranas precedieron a la invención de la computadora , y se utilizaron para dirigir el comportamiento de las máquinas tales como telares Jacquard y pianolas . [ 1 ] se han creado miles de diferentes lenguajes de programación, principalmente en el campo de la computación, y muchos más todavía se están creando cada año. Muchos lenguajes de programación requieren cómputo que se especificarán en un imperativo forma (es decir, como una secuencia de operaciones a realizar), mientras que otros idiomas utilizan otras formas de perfil de formación, como la declarativa forma (es decir, se especifica el resultado deseado, no la forma de lograr IT).
La descripción de un lenguaje de programación por lo general se divide en los dos componentes de la sintaxis (forma) y la semántica (significado). Algunos idiomas se define en un documento de especificación (por ejemplo, el C lenguaje de programación se especifica mediante una ISO estándar), mientras que otros lenguajes (como Perl ) tienen una posición dominante en la ejecución que se trata como una referencia .
Un lenguaje de programación es una notación para escribir programas , que son las especificaciones de un cálculo o algoritmo . [ 2 ] Algunos, pero no todos, los autores restringen el término "lenguaje de programación" para aquellas lenguas que pueden expresar todos los algoritmos posibles. [ 2 ] [ 3 ] 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 [ 4 ] o algoritmo y, posiblemente, controlar dispositivos externos, como impresoras , unidades de disco , los robots , [ 5 ] y así sucesivamente. Por ejemplo, PostScript programas son frecuentemente creados por otro programa para controlar una impresora de ordenador o la pantalla. Más generalmente, un lenguaje de programación puede describir cálculo 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. [ 6 ] En contextos más prácticos, un lenguaje de programación consiste en un ordenador; en consecuencia, los lenguajes de programación son generalmente definidos y estudiados de esta manera. [ 7 ] Los lenguajes de programación son diferentes de las lenguas naturales en que las lenguas naturales solo se utilizan para la interacción entre las personas, mientras que los lenguajes de programación también permiten a los seres humanos para comunicarse instrucciones a las máquinas.
Abstracciones
Los lenguajes de programación por lo general contienen abstracciones para definir y manipular las estructuras de datos o controlar el flujo de ejecución . La necesidad práctica de que un soporte de lenguaje de programación abstracciones adecuadas se expresa por el principio de abstracción ; [ 8 ] . este principio a veces se formula como recomendación al programador para hacer un uso adecuado de tales abstracciones [ 9 ]
Poder expresivo
La teoría de la computación clasifica idiomas por los cálculos que son capaces de expresar. Todos Turing completo lenguas pueden aplicar el mismo conjunto de algoritmos . ANSI / ISO SQL-92 y Caridad son ejemplos de lenguajes que no son de Turing lenguajes de programación completos, pero a menudo llamadas. [ 10 ] [ 11 ]
Los lenguajes de marcas como XML , HTML o troff , que definen los datos estructurados , no se consideran los lenguajes de programación. [ 12 ] [ 13 ] [ 14 ] Los lenguajes de programación puede, sin embargo, compartir la sintaxis con los lenguajes de marcado si una semántica computacional se define. XSLT , por ejemplo, es un Turing completo dialecto XML. [ 15 ] [ 16 ] [ 17 ] Por otra parte, LaTeX , que se utiliza sobre todo para la estructuración de los documentos, también contiene un subconjunto completo de Turing. [ 18 ] [ 19 ]
El término lenguaje informático a veces se usa indistintamente con el lenguaje de programación. [ 20 ] 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. [ 21 ] En este sentido, los idiomas utilizados en la informáticaque tienen un objetivo diferente de expresar los programas de ordenador están genéricamente designados los lenguajes de programación. Por ejemplo, los lenguajes de marcas se refieren a veces como los lenguajes de programación para enfatizar que no están destinados a ser utilizados para la programación. [ 22 ]
Otro uso que se refiere a los lenguajes de programación como constructos teóricos para máquinas abstractas programación y lenguajes de programación como el conjunto de los mismos que se ejecuta en equipos físicos, que tienen los recursos de hardware limitados. [ 23 ] John C. Reynolds destaca que de especificación formal lenguas son lenguajes de programación apenas tanto como son los idiomas destinados para su ejecución. También argumenta que los formatos de texto e incluso de entrada gráfica que afectan al comportamiento de un ordenador son lenguajes de programación, a pesar de que comúnmente no son Turing-completo, y remarca que la ignorancia de los conceptos del lenguaje de programación es la razón de muchas fallas en los formatos de entrada. [ 24 ]
Historia de los lenguajes de programación y las generaciones Lenguaje de programación
Los primeros lenguajes de programación diseñado para comunicar instrucciones a una computadora fueron escritos en la década de 1950. Uno de los primeros lenguajes de programación de alto nivel que ser diseñado para un ordenador era Plankalkül , desarrollado para el alemán Z3 por Konrad Zuse entre 1943 y 1945. Sin embargo, no se llevó a cabo hasta 1998 y 2000.[ 25 ]
John Mauchly 's código corto , propuesta en 1949, fue uno de los primeros lenguajes de alto nivel que se haya desarrollado para una computadora electrónica . [ 26 ] A diferencia de código de máquina , las declaraciones de código corto representados expresiones matemáticas en forma comprensible. Sin embargo, el programa tuvo que ser traducido a código máquina cada vez que se corrió, haciendo el proceso mucho más lento que la ejecución del código máquina equivalente.
En la Universidad de Manchester , Alick Glennie desarrolló Autocode a principios de 1950. Un lenguaje de programación , se utiliza uncompilador para convertir automáticamente el lenguaje en código máquina. El primer código y el compilador fue desarrollado en 1952 por la marca 1 equipo de la Universidad de Manchester y se considera que es el primer compilado lenguaje de programación de alto nivel.[ 27 ] [ 28 ]
El segundo autocode fue desarrollado para la marca 1 por RA Brooker en 1954 y fue llamado el "Mark 1 Autocode". Brooker también desarrolló un autocode para la Ferranti Mercury en la década de 1950 en conjunto con la Universidad de Manchester. La versión para elEDSAC 2 fue ideado por DF Hartley de la Universidad de Cambridge Mathematical Laboratory en 1961. Conocido como EDSAC 2 Autocode, fue un desarrollo directo de Mercury Autocode adaptada a las circunstancias locales, y se destaca por su optimización de código objeto y fuente- diagnóstico del lenguaje que fueron avanzados para la época. Un hilo contemporáneo, pero separada de desarrollo, Atlas Autocode fue desarrollado para la Universidad de Manchester Atlas 1 máquina.
Otro lenguaje de programación temprana fue ideado por Grace Hopper en los EE.UU., llamado FLOW-MATIC . Fue desarrollado para elUNIVAC I en Remington Rand , durante el período comprendido entre 1955 hasta 1959. Hopper encontró que los datos de negocio de procesamiento de los clientes se sentían incómodos con la notación matemática, ya principios de 1955, ella y su equipo escribió una especificación para un Inglés lenguaje de programación e implementado a. prototipo [ 29 ] El compilador FLOW-MATIC se puso a disposición del público a principios de 1958 y se completó sustancialmente en 1959. [ 30 ] Flow-Matic fue una gran influencia en el diseño de COBOL , ya que sólo él y su descendiente directo AIMACO estaban en el uso real de la época. [ 31 ] El lenguaje Fortran fue desarrollado en IBM a mediados de los años 50, y se convirtió en el primer lenguaje de programación de propósito general de alto nivel utilizado.
El período comprendido entre los años 1960 a la década de 1970 trajo el desarrollo de los principales paradigmas de idiomas que se utilizan actualmente, aunque muchos aspectos eran refinamientos de ideas en los primeros lenguajes de programación de tercera generación :
APL presentó la programación de matriz e influyó en la programación funcional . [ 32 ]
PL / I , originalmente llamado NPL, fue diseñado en la década de 1960 para incorporar las mejores ideas de FORTRAN y COBOL con estructuras de bloques extraídos de ALGOL.
En la década de 1960, Simula fue el primer lenguaje diseñado para apoyar la programación orientada a objetos ; a mediados de la década de 1970, Smalltalk siguió con la primera lengua "pura" orientado a objetos.
C fue desarrollado entre 1969 y 1973 como la programación del sistema del lenguaje, y sigue siendo popular. [ 33 ]
Prolog , diseñado en 1972, fue la primera programación de la lógica del lenguaje.
En 1978, ML construyó un sistema de tipo polimórfico en la parte superior de Lisp, pionero de tipo estático de programación funcional idiomas.
Cada una de estas lenguas engendró toda una familia de descendientes, y la mayoría de las lenguas modernas cuentan, al menos, uno de ellos en su ascendencia.
Los años 1960 y 1970 también vio un considerable debate sobre los méritos de la programación estructurada , y si los lenguajes de programación deben ser diseñados para apoyarlo. [ 34 ]Edsger Dijkstra , en un famoso 1968 carta publicada en las Comunicaciones de la ACM , argumentaron que GOTO declaraciones deberían ser eliminado de todos "nivel más alto" los lenguajes de programación. [ 35 ]
Los años 1960 y 1970 también vio la expansión de técnicas que reducen la huella de un programa, así como la mejora de la productividad del programador y usuario. El mazo de cartas para una temprana 4GL era mucho más pequeña de la misma funcionalidad expresada en una cubierta 3GL .
La década de 1980 fueron años de relativa consolidación. C + + de programación orientada a objetos y sistemas combinados. El gobierno de Estados Unidos estandarizó Ada , un lenguaje de programación de sistemas derivados de Pascal y destinado a ser utilizado por los contratistas de defensa. En Japón y en otros lugares, enormes sumas se gastaron investigar las llamadas lenguas "quinta generación" que incorporaron construcciones de programación lógica. [ 36 ] La comunidad de los lenguajes funcionales se trasladaron a estandarizar ML y Lisp. En lugar de inventar nuevos paradigmas, todos estos movimientos elaborados en las ideas inventadas en la década anterior.
Una tendencia importante en el diseño de lenguajes de programación de sistemas a gran escala durante la década de 1980 fue un mayor enfoque en el uso de los módulos , o grandes unidades organizativas de código. Modula-2 , Ada y ML todos los sistemas de módulos notables desarrollados en la década de 1980 , aunque otros lenguajes, como PL / I , que ya tenían un amplio soporte para la programación modular.Sistemas de módulos a menudo eran casados con programación genéricas construcciones. [ 37 ]
El rápido crecimiento de la Internet a mediados de la década de 1990 creó oportunidades para nuevos idiomas. Perl , originalmente una herramienta de scripting de Unix por primera vez en 1987, se hizo común en dinámicos sitios Web . Java llegó a ser utilizado para la programación del lado del servidor, y las máquinas virtuales de código de bytes volvió a ser popular en los entornos comerciales, con su promesa de " escribir una vez, ejecutar en cualquier lugar "( UCSD Pascal había sido popular durante un tiempo en la década de 1980). Estos desarrollos no eran fundamentalmente novela, sino que fueron el perfeccionamiento de las lenguas y de los paradigmas existentes, y en gran parte basados en la familia C de lenguajes de programación.
La evolución del lenguaje de programación continua, tanto en la industria y la investigación. Direcciones actuales incluyen la seguridad y la verificación de la fiabilidad, nuevos tipos de modularidad ( mixins , los delegados , los aspectos ), y la integración de bases de datos como la de Microsoft LINQ .
Los 4GLs son ejemplos de lenguas que son de dominio específico , como SQL , que manipula y devuelve conjuntos de datos en lugar de los valores escalares que son canónica a la mayoría de los lenguajes de programación. Perl , por ejemplo, con su " aquí el documento "puede contener múltiples programas 4GL, así como varios programas de JavaScript, en el marco de su propio código de perl y utilizar la interpolación de variables en el "aquí el documento" para apoyar la programación multi-lenguaje. [ 38 ]
Un ejemplo de código fuente escrito en el lenguaje de programación Java , que se imprimirá el mensaje "Hello World!" a la salida estándar cuando se compila y luego a cargo de la máquina virtual de Java .
El Manchester Marcos 1 corrió programas escritos en Autocode desde 1952.
Todos los lenguajes de programación tienen algunos primitivos bloques de construcción para la descripción de los datos y 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.
Sintaxis (lenguajes de programación)
Forma de la superficie de un lenguaje de programación que se conoce como su sintaxis . La mayoría de los lenguajes de programación son puramente textual; que utilizan secuencias de texto que incluyen palabras, números y puntuacion, al igual que los lenguajes naturales escritos. Por otro lado, 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 correcto.El significado que se da a una combinación de símbolos es manejado por la semántica (ya sea formales o modificable en unaimplementació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 generalmente usando una combinación de las expresiones regulares (porléxica estructura) y Backus-Naur Form (por gramatical estructura). A continuación se muestra una gramática simple, basado enLisp :
expresión :: = átomo | lista átomo :: = número | símbolo número :: = [ + - ] ? [ '0 ' - '9 ' ] + símbolo :: = [ 'A' - 'Z' 'a' - 'z' ] . * lista :: = '(' la expresión * ')'
Esta gramática especifica lo siguiente:
una expresión es o bien un átomo o una lista ;
un átomo es o bien un número o un símbolo ;
un número es una secuencia ininterrumpida de uno o más dígitos decimales, opcionalmente precedidos por un signo más o menos;
un símbolo es una letra seguida de cero o más caracteres (sin incluir los espacios en blanco); y
una lista es un par emparejado de paréntesis, con cero o más expresiones en su interior.
Los siguientes son ejemplos de secuencias bien formadas simbólicos en esta gramática: 12345 , () y (ab C232 (1)) .
No todos los programas sintácticamente correctas son semánticamente correcto. Muchos programas sintácticamente correctas, sin embargo, mal formado, según las reglas de la lengua; y pueden (dependiendo de la especificación del lenguaje y de la solidez de la implementación) resultar en un error en la traducción o la ejecución. En algunos casos, tales 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 se pretende con la persona que lo escribió.
El uso de lenguaje natural como un ejemplo, puede que no sea posible asignar un significado a una oración gramaticalmente correcta o la frase puede ser falsa:
" las ideas verdes incoloras duermen furiosamente ". está gramaticalmente bien formados, pero ha significado generalmente aceptado.
"Juan es un soltero casado." es gramaticalmente bien formados pero expresa un significado que no puede ser verdad.
El siguiente fragmento de lenguaje C es sintácticamente correcta, pero realiza operaciones que no se define semánticamente (la operación * p >> 4 no tiene sentido para un valor que tiene un tipo complejo y p-> im no está definida porque el valor de p es la puntero nulo ):
complejo * p = NULL ; abs_p complejo = sqrt ( * p >> 4 + p -> im ) ;
Si la declaración de tipo en la primera línea se omite, el programa daría lugar a un error de compilación, ya que no se definiría la "p" variable. Pero el programa aún sería sintácticamente correcta, ya que las declaraciones de tipo sólo proporcionan información semántica.
La gramática necesaria para especificar un lenguaje de programación se puede clasificar 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 . [ 39 ] Algunos idiomas, 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 indecidible , y generalmente borrar la distinción entre análisis y ejecución. [ 40 ] En contraste con el sistema de macros de Lisp y Perl de COMENZAR bloques, que puede contener en general cálculos, C macros son simplemente reemplazos de cadenas, y no requieren la ejecución de código. [ 41 ]
El término semántica se refiere al significado de las lenguas, a diferencia de su forma ( sintaxis ).
Semántica estática
La semántica estática define las restricciones sobre la estructura de los 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 básicamente incluyen las reglas semánticas que se pueden comprobar en tiempo de compilación. Los ejemplos incluyen la comprobación de que cadaidentificador se declara antes de su uso (en idiomas que requieren este tipo de declaraciones), o que las etiquetas de los brazos de una declaración de caso son distintas. [ 42 ] Muchas restricciones importantes de este tipo, como la comprobación de que se utilicen los identificadores en el contexto apropiado (por ejemplo, no añadir un entero en un nombre de la función), o que las subrutinas llamadas tienen el número y tipo de argumentos apropiados, pueden imponerse por definirlos como reglas en una lógica llamado un sistema de tipos . Otras formas deaná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.
Semántica dinámica
La semántica de los lenguajes de programación
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 pueden definir la estrategia por la cual las expresiones se evalúan a los valores, o la manera en que el control de las estructuras de ejecutar condicionalmente declaraciones . Los semántica dinámica (también conocidos comosemántica de ejecución ) de un lenguaje define cómo y cuándo las diversas construcciones de un lenguaje deben producir un comportamiento del programa. Hay muchas maneras de definir la semántica de ejecución. El lenguaje natural se utiliza a menudo para especificar la semántica de ejecución de 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 los lenguajes de programación , que permiten la semántica de ejecución que se especifiquen de manera formal. Los resultados de este campo de investigación han visto limitada aplicación para el diseño de lenguajes de programación y ejecución fuera de la academia.
Sistema Tipo
Tipo de datos , sistema Tipo y Tipo de seguridad
Un sistema de tipo define cómo un lenguaje de programación clasifica los valores y expresiones en tipos , cómo se 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 exactitud en programas escritos en ese idioma mediante la detección de ciertas operaciones incorrectas. Cualquierdecidible sistema tipo implica una disyuntiva: si bien rechaza muchos programas incorrectos, también puede prohibir algunos correcta, aunque los programas no habituales. Con el fin de evitar este inconveniente, varios idiomas, tienen lagunas de tipo , por lo general sin marcar moldes que pueden ser utilizados por el programador para permitir explícitamente una operación normalmente no permitida entre los diferentes tipos. En los idiomas que mejor tipo, el sistema de tipos sólo se utiliza para escribir cheques programas, pero una serie de idiomas, por lo general los funcionales, inferir tipos , 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 .
Typed frente idiomas sin tipo
Un idioma se escribe si la especificación de cada operación define tipos de datos a los que la operación es aplicable, con la implicación de que no es aplicable a otros tipos. [ 43 ] Por ejemplo, los datos representados por " este texto entre comillas " 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 tanto, la mayoría de los lenguajes de programación modernos rechazan cualquier programa intenta realizar una operación de ese tipo. En algunos lenguajes de la operación sin sentido se detecta cuando se compila el programa ("estática" la comprobación de tipos), y rechazado por el compilador; mientras que en otros, se detecta cuando se ejecuta el programa (la 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 de tipo único idiomas. Estos son a menudo de scripts o lenguajes de marcado, como REXX o SGML , y sólo tienen una cadena de caracteres de tipo de datos más comúnmente que se utilizan para los datos tanto simbólicos y numéricos.
En contraste, un lenguaje sin tipo , como la mayoría de los lenguajes ensambladores , permite a cualquier operación que se realizará en cualquier dato, que se consideran generalmente como secuencias de bits de varias longitudes. [ 43 ] Los lenguajes de alto nivel que son sin tipo incluyen BCPL y algunas variedades de Forth .
En la práctica, mientras que algunas lenguas son consideradas escrito desde el punto de vista de la teoría de tipos (verificar o rechazar todas las operaciones), la mayoría de las lenguas modernas ofrecen un grado de mecanografía. [ 43 ] Muchos lenguajes de producción proporcionan medios para eludir o subvertir el sistema de tipos, comercio de tipo de seguridad para un mayor control sobre la ejecución del programa (ver la fundición ).
Estático frente tipado dinámico
En tipos estáticos , todas las expresiones tienen sus tipos determinados antes del momento en que se ejecute el programa, por lo general en tiempo de compilación. Por ejemplo, 1 y (2 2) son expresiones enteras; que no se pueden pasar a una función que espera una cadena, o almacenados en una variable que se define para mantener las fechas. [ 43 ]
Lenguajes con tipos estáticos pueden ser ya sea manifiestamente mecanografiadas o inferirse de tipo . En el primer caso, el programador debe escribir explícitamente los tipos en ciertas posiciones textuales (por ejemplo, en variables declaraciones ). En el segundo caso, el compilador infiere los tipos de expresiones y declaraciones basados en el contexto. La mayoría dominante tecleó estáticamente idiomas, como C + + , C # y Java , están manifiestamente escribe. La inferencia de tipos completa se ha asociado tradicionalmente con menos lenguas dominantes, tales como Haskell y ML . Sin embargo, muchos idiomas manifiestamente escritos apoyan la inferencia de tipo parcial; por ejemplo, Java y C # , tanto infieren tipos en ciertos casos limitados. [ 44 ]
Tipado dinámico , también llamado a escribir latente , determina el tipo de seguridad de las operaciones en tiempo de ejecución; en otras palabras, los tipos están asociados con los valores de tiempo de ejecución en lugar de expresiones textuales . [ 43 ] Al igual que con lenguajes de tipo inferido, los lenguajes de tipado dinámicamente no requieren que el programador escriba anotaciones de tipo explícitas expresiones. Entre otras cosas, esto puede permitir que una sola variable para hacer referencia a los valores de diferentes tipos en diferentes momentos de la ejecución del programa. Sin embargo, el tipo de errores que no se pueden detectar de forma automática hasta que un pedazo de código que se ejecuta en realidad, lo que podría hacer la depuración más difícil. Lisp , Perl , Python , JavaScript , y Rubí se escriben de forma dinámica.
Tipificación débil y fuerte
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. [ 43 ] Esto puede ocasionalmente ser útil, pero también puede permitir que algunos tipos de defectos del programa para no se detectan en tiempo de compilación e incluso en tiempo de ejecución .
La tipificación evita lo anterior. Un intento de realizar una operación en el tipo incorrecto de valor genera un error. [ 43 ] lenguas establecimiento 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 permiten un gran número de conversiones de tipo implícito. 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 nulo , no definido , una matriz o una cadena de letras. Tales conversiones implícitas a menudo son útiles, pero pueden enmascarar errores de programación. Fuerte y estática son ahora generalmente consideradas conceptos ortogonales, pero el uso en la literatura difiere. Algunos usan el término con establecimiento inflexible en el sentido de fuerza, de tipo estático o, aún más confusa, para significar simplemente estático de tipos . De este modo C se ha llamado tanto inflexible de tipos y débilmente, de tipo estático. [ 45 ] [ 46 ]
Puede parecer extraño para algunos programadores profesionales que C podría ser "débilmente, de tipo estático". Sin embargo, observe que el uso del puntero genérico, el void * puntero, sí permite la fundición de punteros a otros punteros sin necesidad de hacer una conversión explícita. Esto es muy similar a la de alguna manera emitan un array de bytes a cualquier tipo de tipo de datos en C sin necesidad de utilizar una conversión explícita, como (int) o (char) .
La mayoría de los lenguajes de programación tienen un núcleo asociado biblioteca (a veces conocida como la "librería estándar", especialmente si se incluye como parte del lenguaje estándar publicado), que se hace convencionalmente a disposición por todas las implementaciones del lenguaje. Bibliotecas centrales suelen incluir definiciones para los algoritmos de uso general, estructuras de datos y los mecanismos de entrada y salida.
Biblioteca central de un lenguaje a menudo es tratada como parte de la lengua por sus usuarios, aunque los diseñadores pueden haber tratado como una entidad separada. Muchas especificaciones de lenguaje define un núcleo que deberá estar a disposición de todas las implementaciones, y en el caso de los lenguajes estandarizados pueden requerirse esta biblioteca central. La línea entre una lengua y su biblioteca central, por 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 describirse sin hacer referencia a la biblioteca principal. Por ejemplo, en Java , un literal de cadena se define como una instancia de lajava.lang.String clase; del mismo modo, en Smalltalk , una función anónima expresión (un "bloque") crea una instancia de la biblioteca BlockContext clase. Por el contrario, el esquemacontiene varios subconjuntos coherentes que son suficientes para construir el resto de la lengua como macros de la biblioteca, por lo que los diseñadores del lenguaje ni siquiera se molestó en decir qué partes de la lengua se deben implementar como construcciones del lenguaje, y que debe implementarse como partes de una biblioteca.
Los lenguajes de programación comparten propiedades con los lenguajes naturales relacionados con su finalidad como vehículos para la comunicación, teniendo una forma sintáctica separada de su semántica, y mostrando las familias lingüísticas de lenguas relacionadas ramificación unos de los otros. [ 47 ] [ 48 ] Sin embargo, como construcciones artificiales, también difieren en aspectos fundamentales de las lenguas que han evolucionado a través del uso. Una diferencia significativa es que un lenguaje de programación puede describirse completamente y estudiado en su totalidad, ya que tiene una definición precisa y finita. [ 49 ] 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 cero con un propósito específico, que carecen de la definición semántica precisa y completa, que un lenguaje de programación tiene.
Muchos lenguajes de programación se han diseñado a partir de cero, alterado para satisfacer las nuevas necesidades, y en combinación con otros idiomas. Muchos finalmente han caído en desuso. Aunque ha habido intentos de diseñar un lenguaje de programación "universal" que sirve a todos los efectos, todos ellos han fracasado en ser aceptada como llenar este papel.[ 50 ] 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 para grandes sistemas escritos por cientos de programadores .
Los programadores se extienden en la experiencia de los principiantes que necesitan simplicidad por encima de todo, a los expertos que puedan 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 someterse a modificación continua.
Por último, los programadores pueden simplemente difieren en sus gustos: pueden estar acostumbrados a discutir los problemas y expresarlos en un idioma determinado.
Una tendencia común en el desarrollo de los lenguajes de programación ha sido la de añadir más capacidad para resolver problemas mediante 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, se han añadido características que permiten a los programadores expresan ideas que son más alejadas de la simple traducción en instrucciones de hardware subyacentes. Debido a que los programadores no están tan ligados a la complejidad de la computadora, los programas pueden hacer más computing con menos esfuerzo por parte del programador. Esto les permite escribir más funcionalidad por unidad de tiempo. [ 51 ]
Programación en lenguaje natural se ha 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 abiertas a debate. Edsger W. Dijkstra tomó la posición de que el uso de un lenguaje formal es esencial para prevenir la introducción de construcciones sin sentido, y desestimó la programación en lenguaje natural como "tonta ". [ 52 ] Alan Perlis fue igualmente desdeñoso de la idea. [ 53 ] enfoques híbridos se han tenido enInglés Estructurado y SQL .
Diseñadores y usuarios de una lengua deben construir una serie de artefactos que rigen y permiten la práctica de la programación. El más importante de estos artefactos son el lenguaje deespecificación y aplicación .
Especificación del lenguaje de programación
La especificación de un lenguaje de programación está destinado a proporcionar una definición de que la lengua usuarios y los implementadores pueden utilizar para determinar si el comportamiento de un programa es correcta, dado su código fuente .
Una especificación de lenguaje de programación puede tomar varias formas, incluyendo las siguientes:
Una definición explícita de la sintaxis, la semántica estática y semántica de ejecución de la lengua. Mientras que la sintaxis se especifica comúnmente usando una gramática formal, definiciones semánticas pueden ser escritos en lenguaje natural (por ejemplo, como en el lenguaje C ), o una semántica formal (por ejemplo, como en el ml estándar [ 54 ] y el esquema[ 55 ] especificaciones).
Una descripción del comportamiento de un traductor para el lenguaje (por ejemplo, las de C + + y Fortran especificaciones). La sintaxis y la semántica de la lengua tienen que deducirse de esta descripción, que puede estar escrito en un lenguaje natural o formal.
Una referencia o modelo de aplicación , a veces escrito en el idioma que se especifica (por ejemplo, Prolog o ANSI REXX [ 56 ] ). La sintaxis y la semántica de la lengua son explícitas en el comportamiento de la implementación de referencia.
Aplicación Lenguaje de programación
Una aplicación de un lenguaje de programación proporciona una manera de ejecutar ese 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 de 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 luego ejecutar la fuente 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.
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 va a utilizar a código de máquina, para la ejecución directa en el hardware.
Se han creado miles de diferentes lenguajes de programación, principalmente en el campo de la computación. [ 57 ] Los lenguajes de programación son diferentes de la mayoría de otras formas de expresión humana en cuanto a que requieren un mayor grado de precisión y exhaustividad.
Cuando se utiliza un lenguaje natural para comunicarse con otras personas, los autores humanos y altavoces pueden ser ambiguos y hacer pequeños errores, y todavía esperar que 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 pueden "entender" lo que el código que el programador pretendía 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 la definición de piezas de datos y las operaciones o transformaciones que se pueden llevar a cabo de forma automática en los 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 (llamado primitivas ). [ 58 ] La programación es el proceso por el cual los programadores combinan estas primitivas para componer nuevos programas, o adaptar los existentes para nuevos usos o un entorno cambiante.
Los programas para una computadora podrían ser ejecutados en un proceso por lotes sin intervención humana, o un usuario pueden escribir comandos en una sesión interactiva de unintérprete . En este caso los "comandos" son simplemente programas, cuya ejecución está encadenado juntos. Cuando se utiliza un lenguaje para dar órdenes a una aplicación de software (como un shell de Unix o de otro tipo de interfaz de línea de comandos ) que se llama un lenguaje de scripting .
Medición de lenguaje de programación de popularidad
Es difícil determinar cuáles son los más ampliamente utilizados lenguajes de programación, 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 tener más líneas de código, y un tercer utilizar la mayor parte del tiempo de CPU. Algunas lenguas 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 ; [ 59 ] [ 60 ] Fortran en aplicaciones científicas y de ingeniería; y Cen aplicaciones integradas y sistemas operativos. Otros idiomas se utilizan regularmente para escribir diferentes tipos de aplicaciones.
Varios métodos de medición de popularidad lenguaje, cada uno sujeto a un sesgo diferente sobre lo que se mide, se han propuesto:
contando el número de anuncios de empleo que mencionan la lengua [ 61 ]
el número de libros vendidos que enseñe o describa el idioma [ 62 ]
estimaciones del número de líneas existentes de código escritas en el lenguaje - que puede subestimar lenguas no encuentran a menudo en las búsquedas públicas [ 63 ]
los recuentos de referencias de la lengua (es decir, hasta el nombre de la lengua) que se encuentran el uso de un motor de búsqueda web.
Combinar y promediando la información de diversos sitios de Internet, langpop.com afirma que en 2013 los diez lenguajes de programación más populares son (en orden descendente por su popularidad general): C , Java , PHP , JavaScript , C + + , Python , Shell , Rubí , Objetivo- C y C # . [ 64 ]
Para más detalles sobre este tema, vea la lista por categorías de lenguajes de programación .
No hay sistema de clasificación general para los lenguajes de programación. Un lenguaje de programación determinado no suele tener una sola lengua ancestral. Idiomas comúnmente surgen al combinar los elementos de varios idiomas predecesoras con nuevas ideas en circulación en ese momento. Ideas que se originan en un solo idioma se difundirán en toda una familia de lenguas relacionadas, y luego saltar de repente a través de las brechas familiares para estar presente en una familia completamente diferente.
La tarea se complica aún más por el hecho de que las lenguas pueden ser clasificados a lo largo de múltiples ejes. Por ejemplo, Java es a la vez un lenguaje orientado a objetos (ya que anima a la organización orientada a objetos) y un lenguaje concurrente (debido a que contiene construcciones integradas para la ejecución de múltiples hilos en paralelo). Python es una orientada a objetos lenguaje de scripting .
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 los lenguajes de programación de propósito general distinguirse de los lenguajes de programación específicos del dominio . Tradicionalmente, los lenguajes de programación han sido considerados como la descripción de la computación en términos de oraciones imperativas, es decir, la emisión de comandos. Éstas son llamadas generalmente programación imperativos idiomas. Una gran cantidad de investigación en lenguajes de programación se ha dirigido a borrar la distinción entre un programa como un conjunto de instrucciones y un programa como una afirmación acerca de la respuesta deseada, que es la característica principal de la programación declarativa . [ 65 ] paradigmas más refinados incluyen programación procedimental , programación orientada a objetos , programación funcional y programación lógica ; algunas lenguas son híbridos de paradigmas o multi-paradigmática. Un lenguaje ensamblador no es tanto un paradigma como modelo directo de una arquitectura de la máquina subyacente. Por ello, los lenguajes de programación pueden ser considerados de propósito general, lenguajes de programación de sistemas , lenguajes de script, lenguajes específicos de dominio, o lenguajes concurrentes / distribuidos (o una combinación de éstos). [ 66 ] Algunos lenguajes de propósito general se han diseñado en gran medida con los objetivos educativos. [ 67 ]
Un lenguaje de programación también se puede clasificar por factores no relacionados con el paradigma de la programación. Por ejemplo, la mayoría de los lenguajes de programación utilizan idiomas Inglés palabras clave, mientras que una minoría no lo hacen . Otros idiomas se pueden clasificar como siendo deliberadamente esotérica o no.
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 .