En informática , un lenguaje de programación de alto nivel es un lenguaje de programación con una fuerte abstracción de los detalles de la computadora . A diferencia de los lenguajes de programación de bajo nivel , puede utilizar elementos del lenguaje natural , ser más fácil de usar o puede automatizar (o incluso ocultar por completo) áreas importantes de los sistemas informáticos (por ejemplo, la gestión de la memoria ), lo que hace que el proceso de desarrollo de un programa sea más simple y más comprensible que cuando se utiliza un lenguaje de nivel inferior. La cantidad de abstracción proporcionada define qué tan "de alto nivel" es un lenguaje de programación. [1]
En la década de 1960, un lenguaje de programación de alto nivel que utilizaba un compilador se denominaba comúnmente autocódigo . [2] Ejemplos de autocódigos son COBOL y Fortran . [3]
El primer lenguaje de programación de alto nivel diseñado para computadoras fue Plankalkül , creado por Konrad Zuse . [4] Sin embargo, no se implementó en su época, y sus contribuciones originales estuvieron en gran medida aisladas de otros desarrollos debido a la Segunda Guerra Mundial , además de la influencia del lenguaje en el lenguaje "Superplan" de Heinz Rutishauser y también en cierto grado ALGOL . El primer lenguaje de alto nivel significativamente difundido fue Fortran , un desarrollo independiente de la máquina de los sistemas Autocode anteriores de IBM . La familia ALGOL , con ALGOL 58 definido en 1958 y ALGOL 60 definido en 1960 por comités de científicos informáticos europeos y estadounidenses, introdujo la recursión , así como las funciones anidadas bajo el ámbito léxico . ALGOL 60 también fue el primer lenguaje con una distinción clara entre parámetros de valor y nombre y su semántica correspondiente . [5] ALGOL también introdujo varios conceptos de programación estructurada , como las construcciones y, y su sintaxis fue la primera en describirse en notación formal: la forma Backus-Naur (BNF). Durante aproximadamente el mismo período, COBOL introdujo los registros (también llamados estructuras) y Lisp introdujo por primera vez una abstracción lambda totalmente general en un lenguaje de programación.while-do
if-then-else
"Lenguaje de alto nivel" se refiere al nivel más alto de abstracción del lenguaje de máquina . En lugar de tratar con registros, direcciones de memoria y pilas de llamadas, los lenguajes de alto nivel tratan con variables, matrices, objetos , expresiones aritméticas o booleanas complejas , subrutinas y funciones, bucles, subprocesos , bloqueos y otros conceptos informáticos abstractos, con un enfoque en la usabilidad por encima de la eficiencia óptima del programa. A diferencia de los lenguajes ensambladores de bajo nivel , los lenguajes de alto nivel tienen pocos elementos de lenguaje, si es que tienen alguno, que se traduzcan directamente a los códigos de operación nativos de una máquina . También pueden estar presentes otras características, como rutinas de manejo de cadenas, características de lenguaje orientado a objetos y entrada/salida de archivos. Una cosa a tener en cuenta sobre los lenguajes de programación de alto nivel es que estos lenguajes permiten que el programador se desprenda y separe de la máquina. Es decir, a diferencia de los lenguajes de bajo nivel como el ensamblador o el lenguaje de máquina, la programación de alto nivel puede amplificar las instrucciones del programador y desencadenar muchos movimientos de datos en segundo plano sin su conocimiento. La responsabilidad y el poder de ejecutar instrucciones han sido transferidos por el programador a la máquina.
Los lenguajes de alto nivel intentan proporcionar características que estandaricen tareas comunes, permitan una depuración rica y mantengan el agnosticismo arquitectónico; mientras que los lenguajes de bajo nivel a menudo producen código más eficiente a través de la optimización para una arquitectura de sistema específica . La penalización por abstracción es el costo que pagan las técnicas de programación de alto nivel por no poder optimizar el rendimiento o usar cierto hardware porque no aprovechan ciertos recursos arquitectónicos de bajo nivel. La programación de alto nivel exhibe características como estructuras de datos y operaciones más genéricas, interpretación en tiempo de ejecución y archivos de código intermedios; que a menudo resultan en la ejecución de muchas más operaciones de las necesarias, un mayor consumo de memoria y un mayor tamaño de programa binario. [6] [7] [8] Por esta razón, el código que necesita ejecutarse particularmente rápido y eficientemente puede requerir el uso de un lenguaje de nivel inferior, incluso si un lenguaje de nivel superior facilitaría la codificación. En muchos casos, las partes críticas de un programa principalmente en un lenguaje de alto nivel se pueden codificar a mano en lenguaje ensamblador , lo que lleva a un programa optimizado mucho más rápido, más eficiente o simplemente de funcionamiento confiable .
Sin embargo, con la creciente complejidad de las arquitecturas de microprocesadores modernas , los compiladores bien diseñados para lenguajes de alto nivel frecuentemente producen código comparable en eficiencia a lo que la mayoría de los programadores de bajo nivel pueden producir a mano, y la mayor abstracción puede permitir técnicas más poderosas que brinden mejores resultados generales que sus contrapartes de bajo nivel en configuraciones particulares. [9] Los lenguajes de alto nivel se diseñan independientemente de una arquitectura de sistema informático específica . Esto facilita la ejecución de un programa escrito en dicho lenguaje en cualquier sistema informático con soporte compatible para el programa interpretado o JIT . Los lenguajes de alto nivel se pueden mejorar a medida que sus diseñadores desarrollan mejoras. En otros casos, los nuevos lenguajes de alto nivel evolucionan a partir de uno o más otros con el objetivo de agregar las construcciones más populares con características nuevas o mejoradas. Un ejemplo de esto es Scala , que mantiene la compatibilidad con versiones anteriores de Java , lo que significa que los programas y bibliotecas escritos en Java seguirán siendo utilizables incluso si un taller de programación cambia a Scala; esto hace que la transición sea más fácil y la vida útil de dicha codificación de alto nivel sea indefinida. Por el contrario, los programas de bajo nivel rara vez sobreviven más allá de la arquitectura del sistema para el que fueron escritos sin una revisión importante. Esta es la "contrapartida" de ingeniería por la "penalización por abstracción".
Algunos ejemplos de lenguajes de programación de alto nivel que se utilizan activamente en la actualidad son Python , JavaScript , Visual Basic , Delphi , Perl , PHP , ECMAScript , Ruby , C# , Java y muchos otros.
Los términos de alto nivel y bajo nivel son inherentemente relativos. Hace algunas décadas, el lenguaje C y otros lenguajes similares se consideraban con mayor frecuencia de "alto nivel", ya que admitían conceptos como la evaluación de expresiones, funciones recursivas parametrizadas y tipos y estructuras de datos, mientras que el lenguaje ensamblador se consideraba de "bajo nivel". Hoy en día, muchos programadores podrían referirse a C como de bajo nivel, ya que carece de un gran sistema de ejecución (no hay recolección de basura, etc.), básicamente solo admite operaciones escalares y proporciona direccionamiento directo de memoria; por lo tanto, se combina fácilmente con el lenguaje ensamblador y el nivel de máquina de las CPU y los microcontroladores . Además, en el capítulo de introducción de The C Programming Language (segunda edición) de Brian Kernighan y Dennis Ritchie , C se describe como un lenguaje "no de muy alto nivel". [10]
El lenguaje ensamblador puede considerarse en sí mismo como una representación de nivel superior (aunque a menudo sigue siendo uno a uno si se utiliza sin macros ) del código de máquina , ya que admite conceptos como constantes y expresiones (limitadas), a veces incluso variables, procedimientos y estructuras de datos . El código de máquina , a su vez, está inherentemente en un nivel ligeramente superior al microcódigo o las microoperaciones utilizadas internamente en muchos procesadores. [11]
Hay tres modos generales de ejecución para los lenguajes modernos de alto nivel:
Tenga en cuenta que los lenguajes no son estrictamente lenguajes interpretados o lenguajes compilados . Más bien, las implementaciones del comportamiento del lenguaje utilizan interpretación o compilación. Por ejemplo, ALGOL 60 y Fortran han sido interpretados (aunque lo más habitual era que se compilaran). De manera similar, Java muestra la dificultad de intentar aplicar estas etiquetas a los lenguajes, en lugar de a las implementaciones; Java se compila en código de bytes que luego se ejecuta ya sea interpretando (en una máquina virtual Java (JVM)) o compilando (normalmente con un compilador justo a tiempo como HotSpot , nuevamente en una JVM). Además, la compilación, la transcompilación y la interpretación no se limitan estrictamente a una descripción del artefacto del compilador (ejecutable binario o ensamblaje IL).
Otra posibilidad es que un lenguaje de alto nivel sea implementado directamente por una computadora, es decir, que la computadora ejecute directamente el código HLL. Esto se conoce como arquitectura de computadora de lenguaje de alto nivel , es decir, la arquitectura de la computadora en sí está diseñada para ser el objetivo de un lenguaje de alto nivel específico. Los grandes sistemas de Burroughs fueron las máquinas objetivo de ALGOL 60 , por ejemplo. [12]
"alto" nivel a menudo se denominan autocódigos y el programa del procesador, un compilador.
{{cite book}}
: Mantenimiento de CS1: ubicación ( enlace )Dos lenguajes de programación de alto nivel que pueden usarse aquí como ejemplos para ilustrar la estructura y el propósito de los autocódigos son COBOL (lenguaje común orientado a negocios) y FORTRAN (traducción de fórmulas).
{{cite book}}
: Mantenimiento de CS1: ubicación ( enlace )value
parámetros).{{cite journal}}
: Requiere citar revista |journal=
( ayuda ){{cite book}}
: CS1 maint: bot: estado de URL original desconocido ( enlace )