stringtranslate.com

Lenguaje de programación de alto nivel

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-doif-then-else

Características

"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.

Penalización por abstracción

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".

Significado relativo

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]

Modos de ejecución

Hay tres modos generales de ejecución para los lenguajes modernos de alto nivel:

Interpretado
Cuando se interpreta un código escrito en un lenguaje , se lee su sintaxis y luego se ejecuta directamente, sin una etapa de compilación. Un programa llamado intérprete lee cada declaración del programa, siguiendo el flujo del programa, luego decide qué hacer y lo hace. Un híbrido de intérprete y compilador compilará la declaración en código de máquina y lo ejecutará; luego, el código de máquina se descarta para ser interpretado nuevamente si la línea se ejecuta nuevamente. Los intérpretes son comúnmente las implementaciones más simples del comportamiento de un lenguaje, en comparación con las otras dos variantes enumeradas aquí.
Compilado
Cuando se compila un código escrito en un lenguaje , su sintaxis se transforma en un formato ejecutable antes de ejecutarse. Existen dos tipos de compilación:
Generación de código de máquina
Algunos compiladores compilan el código fuente directamente en código de máquina . Este es el modo original de compilación, y los lenguajes que se transforman directa y completamente en código nativo de máquina de esta manera pueden llamarse lenguajes verdaderamente compilados . Véase lenguaje ensamblador .
Representaciones intermedias
Cuando el código escrito en un lenguaje se compila en una representación intermedia , esa representación se puede optimizar o guardar para su posterior ejecución sin necesidad de volver a leer el archivo fuente. Cuando se guarda la representación intermedia, puede estar en un formato como bytecode . Luego, la representación intermedia debe interpretarse o compilarse para ejecutarse. Las máquinas virtuales que ejecutan bytecode directamente o lo transforman en código de máquina han desdibujado la distinción, antes clara, entre representaciones intermedias y lenguajes verdaderamente compilados.
Traducido de fuente a fuente o transcompilado
El código escrito en un lenguaje puede traducirse a términos de un lenguaje de nivel inferior para el cual los compiladores de código nativo ya son comunes. JavaScript y el lenguaje C son objetivos comunes para dichos traductores. Vea CoffeeScript , Chicken Scheme y Eiffel como ejemplos. Específicamente, el código C y C++ generado puede verse (tal como se genera desde el lenguaje Eiffel al usar el IDE EiffelStudio ) en el directorio EIFGENs de cualquier proyecto Eiffel compilado. En Eiffel, el proceso traducido se conoce como transcompilación o transcompilado, y el compilador Eiffel como transcompilador o compilador de fuente a fuente .

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).

Arquitectura informática en lenguaje de alto nivel

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]

Véase también

Referencias

  1. ^ "HThreads - Glosario de RD". Archivado desde el original el 26 de agosto de 2007.
  2. ^ Londres, Keith (1968). "4, Programación". Introducción a las computadoras . 24 Russell Square Londres WC1: Faber and Faber Limited. pág. 184. ISBN 0571085938Los lenguajes de programación de "alto" nivel a menudo se denominan autocódigos y el programa del procesador, un compilador.{{cite book}}: Mantenimiento de CS1: ubicación ( enlace )
  3. ^ Londres, Keith (1968). "4, Programación". Introducción a las computadoras . 24 Russell Square Londres WC1: Faber and Faber Limited. pág. 186. ISBN 0571085938Dos 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 )
  4. ^ Giloi, Wolfgang, K.  [de] (1997). "Plankalkül de Konrad Zuse: el primer lenguaje de programación de alto nivel "no von Neumann"". IEEE Annals of the History of Computing, vol. 19, núm. 2, págs. 17-24, abril-junio de 1997. (resumen)
  5. ^ Aunque carecía de una noción de parámetros de referencia , lo que podría ser un problema en algunas situaciones, varios sucesores, incluidos ALGOL W , ALGOL 68 , Simula , Pascal , Modula y Ada , incluyeron parámetros de referencia (la familia de lenguajes C relacionada, en cambio, permitía direcciones como valueparámetros).
  6. ^ Surana P (2006). "Meta-Compilation of Language Abstractions" (PDF) . Archivado (PDF) desde el original el 17 de febrero de 2015. Consultado el 17 de marzo de 2008 . {{cite journal}}: Requiere citar revista |journal=( ayuda )
  7. ^ Kuketayev. "El parámetro de referencia de penalización por abstracción de datos (DAP) para objetos pequeños en Java". Archivado desde el original el 11 de enero de 2009. Consultado el 17 de marzo de 2008 .
  8. ^ Chatzigeorgiou; Stephanides (2002). "Evaluación del rendimiento y la potencia de los lenguajes de programación orientados a objetos frente a los de procedimiento". En Blieberger; Strohmeier (eds.). Actas de la 7.ª Conferencia internacional sobre tecnologías de software fiables - Ada-Europe'2002 . Springer. pág. 367.
  9. ^ Manuel Carro; José F. Morales; Henk L. Muller; G. Puebla; M. Hermenegildo (2006). "Lenguajes de alto nivel para dispositivos pequeños: un estudio de caso" (PDF) . Actas de la Conferencia Internacional de 2006 sobre Compiladores, Arquitectura y Síntesis para Sistemas Embebidos . ACM.
  10. ^ Kernighan, Brian W.; Ritchie, Dennis M. (1988). El lenguaje de programación C: 2.ª edición. Prentice Hall. ISBN 9780131103627Archivado desde el original el 25 de octubre de 2022 . Consultado el 25 de octubre de 2022 .{{cite book}}: CS1 maint: bot: estado de URL original desconocido ( enlace )
  11. ^ Hyde, Randall. (2010). El arte del lenguaje ensamblador (2.ª ed.). San Francisco: No Starch Press. ISBN 9781593273019.OCLC 635507601  .
  12. ^ Chu, Yaohan (1975), "Conceptos de arquitectura informática de lenguaje de alto nivel", Arquitectura informática de lenguaje de alto nivel , Elsevier, págs. 1–14, doi :10.1016/b978-0-12-174150-1.50007-0, ISBN 9780121741501

Enlaces externos