Articulo de referencia

Lenguaje de programación de alto nivel

Un lenguaje de programación de alto nivel es aquel que ofrece una gran abstracción de los detalles del sistema informático . A diferencia de los lenguajes de programación de baj...

Un lenguaje de programación de alto nivel es aquel que ofrece una gran abstracción de los detalles del sistema informático . 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 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 sencillo y comprensible que con un lenguaje de bajo nivel. El grado de abstracción que proporciona define el nivel de un lenguaje de programación. [ 1 ]

El término "alto nivel" se refiere a un nivel de abstracción de los detalles de hardware de un procesador , inherente al código máquina y al código ensamblador . En lugar de trabajar con registros, direcciones de memoria y pilas de llamadas, los lenguajes de alto nivel manejan variables, matrices, objetos , expresiones aritméticas y booleanas , funciones , bucles, subprocesos , bloqueos y otras abstracciones de la informática, con el fin de facilitar la corrección y el mantenimiento del código . A diferencia de los lenguajes ensamblador de bajo nivel , los lenguajes de alto nivel tienen pocos elementos, o ninguno, que se traduzcan directamente a los códigos de operación nativos de la máquina . También pueden proporcionar otras características, como el manejo de cadenas, características de programación orientada a objetos y entrada/salida de archivos. Un lenguaje de alto nivel permite un código fuente independiente y separado de los detalles de la máquina. Es decir, a diferencia de los lenguajes de bajo nivel como el ensamblador y el código máquina, el código de un lenguaje de alto nivel puede generar movimientos de datos sin el conocimiento del programador. El compilador tiene cierto control sobre qué instrucciones ejecutar.

Historia

En las primeras décadas de la informática electrónica, los programas se escribían generalmente en código máquina o lenguaje ensamblador , que reflejaban fielmente el conjunto de instrucciones de una máquina en particular. Los lenguajes de programación de alto nivel se desarrollaron como una forma de expresar algoritmos en formas más cercanas a las matemáticas, las reglas de negocio o los procedimientos legibles por humanos, mientras que un compilador o intérprete traducía el programa a instrucciones ejecutables por la máquina. En las décadas de 1950 y 1960, el término autocode se utilizaba a menudo para referirse a los lenguajes de alto nivel basados ​​en compiladores; ejemplos de ello eran los primeros sistemas Autocode, así como lenguajes como Fortran y COBOL . [ 2 ]

El primer lenguaje de alto nivel diseñado para una computadora se identifica generalmente como Plankalkül , desarrollado por Konrad Zuse en la década de 1940. [ 3 ] Incluía características avanzadas como datos estructurados, asignación, ejecución condicional, iteración y subrutinas, pero no se implementó durante la vida de Zuse. Debido a que Zuse trabajó en la Alemania de tiempos de guerra y posguerra, su trabajo permaneció en gran medida aislado de la línea principal de desarrollo de lenguajes, aunque influyó en Superplan de Heinz Rutishauser y, en menor medida, en los primeros trabajos asociados con ALGOL . [ 4 ]

El primer lenguaje de alto nivel que logró una amplia adopción práctica fue Fortran , desarrollado en IBM en la década de 1950 bajo la dirección de John Backus . [ 5 ] Fortran estaba orientado a la computación científica y numérica, permitiendo a los programadores escribir fórmulas algebraicas y bucles sin tener que gestionar manualmente cada instrucción de la máquina. Su éxito contribuyó a demostrar que los lenguajes de alto nivel compilados podían producir programas eficientes, reduciendo considerablemente el esfuerzo de programación. [ 6 ]

Otros lenguajes influyentes surgieron en el mismo período. Lisp , creado por John McCarthy , introdujo el procesamiento simbólico de listas e hizo que las ideas del cálculo lambda fueran fundamentales para el diseño práctico de lenguajes de programación. [ 7 ] COBOL fue diseñado para el procesamiento de datos comerciales y se asoció con una sintaxis similar al inglés, registros y aplicaciones comerciales orientadas a archivos. [ 8 ] La familia ALGOL , especialmente ALGOL 60 , influyó en el diseño de lenguajes posteriores a través de la estructura de bloques, procedimientos anidados, recursión, alcance léxico, una distinción entre llamada por valor y llamada por nombre, y el uso de la forma Backus-Naur para definir la sintaxis formalmente. [ 9 ]

Durante las décadas de 1960 y 1970, los lenguajes de alto nivel se diversificaron en distintos estilos de programación. BASIC hizo accesible la programación interactiva en entornos educativos y de tiempo compartido , mientras que Pascal hizo hincapié en la programación estructurada y la enseñanza. C combinó estructuras de control de alto nivel con un acceso relativamente bajo a la memoria y al hardware, lo que lo convirtió en un lenguaje influyente en sistemas operativos y software de sistema . Simula introdujo el modelo de clases y objetos que se convirtió en fundamental para la programación orientada a objetos , y Smalltalk desarrolló posteriormente la programación orientada a objetos en torno al paso de mensajes y un entorno de programación altamente interactivo. [ 10 ] [ 11 ]

En las décadas de 1980 y 1990, el desarrollo de lenguajes de alto nivel reflejó cada vez más la ingeniería de software a gran escala, la computación gráfica y el crecimiento de Internet. Ada fue diseñado para sistemas grandes y de larga duración, particularmente en contextos de defensa y sistemas embebidos. C++ extendió C con clases y otros mecanismos de abstracción, permitiendo la programación orientada a objetos y genérica, al tiempo que conservaba las capacidades de programación de sistemas. [ 12 ] Los lenguajes de scripting y de aplicación rápida como Perl , Python , Ruby y PHP enfatizaron la productividad del programador y el scripting de texto, web o aplicaciones. Java promovió la ejecución de bytecode portátil a través de la máquina virtual de Java , mientras que JavaScript se convirtió en el lenguaje de scripting de alto nivel estándar de los navegadores web . [ 13 ] [ 14 ] [ 15 ]

En el siglo XXI, los lenguajes de alto nivel más recientes a menudo se han centrado en una abstracción más segura, la concurrencia, grandes bases de código y la interoperabilidad con plataformas existentes. C# se desarrolló junto con la plataforma .NET , Scala y F# combinaron la programación orientada a objetos y la programación funcional, y Kotlin se centró en la interoperabilidad con Java al tiempo que agregaba una sintaxis concisa y características de seguridad contra valores nulos. [ 16 ] Go fue diseñado para una sintaxis simple, compilación rápida y soporte de concurrencia integrado. [ 17 ] Rust enfatizó la seguridad de la memoria y la seguridad de los subprocesos sin un recolector de basura, mientras que Swift se introdujo como un lenguaje moderno para el desarrollo de software para la plataforma Apple. [ 18 ] [ 19 ] TypeScript extendió JavaScript con tipado estático para aplicaciones JavaScript a gran escala. [ 20 ]

penalización por abstracción

Un lenguaje de alto nivel proporciona características que estandarizan tareas comunes, permiten una depuración avanzada y mantienen la independencia arquitectónica. Por otro lado, un lenguaje de bajo nivel requiere que el programador trabaje en un nivel de abstracción inferior, lo que generalmente es más complejo, pero permite optimizaciones que no son posibles con un lenguaje de alto nivel. Esta penalización por abstracción al usar un lenguaje de alto nivel en lugar de uno de bajo nivel es real, pero en la práctica, las optimizaciones de bajo nivel rara vez mejoran el rendimiento a nivel de experiencia de usuario . [ 21 ] [ 22 ] [ 23 ] Sin embargo, el código que necesita ejecutarse de forma rápida y eficiente puede requerir el uso de un lenguaje de bajo nivel, incluso si un lenguaje de alto nivel facilitaría la escritura y el mantenimiento del código. En muchos casos, partes críticas de un programa escrito principalmente en un lenguaje de alto nivel se codifican en lenguaje ensamblador para cumplir con estrictas restricciones de tiempo o memoria. Un compilador bien diseñado para un lenguaje de alto nivel puede producir código con una eficiencia comparable a la de un código escrito manualmente en lenguaje ensamblador, y las abstracciones de nivel superior a veces permiten optimizaciones que superan el rendimiento del código ensamblador escrito manualmente. [ 24 ] Dado que un lenguaje de alto nivel se diseña independientemente de una arquitectura de sistema informático específica , un programa escrito en dicho lenguaje puede ejecutarse en cualquier entorno informático con un compilador o intérprete compatible.

A diferencia de un lenguaje de bajo nivel, que está intrínsecamente ligado al hardware del procesador, un lenguaje de alto nivel puede mejorarse, y nuevos lenguajes de alto nivel pueden evolucionar a partir de otros con el objetivo de integrar las construcciones más populares con características mejoradas. Por ejemplo, Scala mantiene la compatibilidad con versiones anteriores de Java . El código escrito en Java sigue siendo utilizable incluso si un desarrollador cambia a Scala. Esto facilita la transición y prolonga la vida útil del código . En cambio, los programas de bajo nivel rara vez sobreviven más allá de la arquitectura del sistema para la que fueron escritos.

Significado relativo

Los términos "alto nivel" y "bajo nivel" son inherentemente relativos, y los lenguajes pueden compararse entre sí como de mayor o menor nivel. A veces, el lenguaje C se considera de alto o bajo nivel según la perspectiva. En cualquier caso, la mayoría coincide en que C es de mayor nivel que el lenguaje ensamblador y de menor nivel que la mayoría de los demás lenguajes.

C admite construcciones como la evaluación de expresiones, funciones parametrizadas y recursivas, tipos de datos y estructuras que generalmente no son compatibles con el lenguaje ensamblador ni directamente con un procesador, pero C sí proporciona características de bajo nivel como el autoincremento y las operaciones con punteros. Sin embargo, C carece de muchas abstracciones de alto nivel comunes en otros lenguajes, como la recolección de basura y un tipo de cadena integrado. En la introducción de The C Programming Language (segunda edición) de Brian Kernighan y Dennis Ritchie , C se describe como un lenguaje de "bajo nivel". [ 25 ]

El lenguaje ensamblador es de nivel superior al código máquina, pero sigue estando muy ligado al hardware del procesador. Sin embargo, el ensamblador puede proporcionar algunas características de nivel superior, como macros , expresiones relativamente limitadas, constantes, variables, procedimientos y estructuras de datos .

El código máquina se encuentra en un nivel de abstracción ligeramente superior al del microcódigo o las microoperaciones utilizadas internamente en muchos procesadores. [ 26 ]

Modos de ejecución

El código fuente de un lenguaje de alto nivel puede procesarse de diversas maneras, como por ejemplo:

Compilado
Un compilador transforma el código fuente en otro código. En algunos casos, genera código máquina nativo que es interpretado por el procesador; sin embargo, muchos modelos de ejecución actuales implican la generación de una representación intermedia (es decir, bytecode ) que posteriormente se interpreta en el software o se convierte a código nativo en tiempo de ejecución (mediante compilación JIT ).
A veces, el hardware se optimiza según los requisitos de tiempo de ejecución de lenguajes específicos. Por ejemplo, los sistemas Burroughs Large Systems fueron máquinas objetivo para ALGOL 60. [ 27 ]
Transpilado
El código puede traducirse a código fuente de otro lenguaje (normalmente de bajo nivel) para el que exista un compilador o intérprete. JavaScript y C son lenguajes comunes para este tipo de traductores. Por ejemplo, el código C y C++ se puede generar a partir del código Eiffel al usar el IDE EiffelStudio . En Eiffel, el proceso de traducción se denomina transcompilación , y el compilador Eiffel, transcompilador o compilador de código fuente a código fuente .
Software interpretado
Un intérprete de software ejecuta las acciones codificadas en el código fuente sin generar código máquina nativo.
Hardware interpretado
Aunque poco común, un procesador con una arquitectura de computadora de lenguaje de alto nivel puede procesar un lenguaje de alto nivel sin un paso de compilación programado. [ 28 ]

Cabe destacar que un lenguaje no se interpreta ni se compila estrictamente. Más bien, un modelo de ejecución implica un compilador o un intérprete, y un mismo lenguaje puede utilizarse con diferentes modelos de ejecución. Por ejemplo, ALGOL 60 y Fortran se han interpretado, aunque lo más habitual era su compilación. De forma similar, Java demuestra la dificultad de aplicar estas etiquetas a los lenguajes, en lugar de a las implementaciones. Java se compila a código de bytes, que luego se ejecuta mediante interpretación en una máquina virtual Java (JVM) o compilación JIT.

Véase también

Referencias

  1. "HThreads - Glosario RD" . Archivado del original el 26 de agosto de 2007.
  2. London, Keith (1968). Introducción a las computadoras . Faber and Faber.
  3. Rojas, Raúl; Hashagen, Ulf (2000). Plankalkül: el primer lenguaje de programación de alto nivel y su implementación (Reporte). Universidad Libre de Berlín.
  4. Rojas, Raúl (2000). «El legado de Konrad Zuse: la arquitectura de la Z1 y la Z3». En Rojas, Raúl (ed.). Los primeros ordenadores: historia y arquitecturas . MIT Press. ISBN 978-0-262-18197-6.
  5. "Software y lenguajes: FORTRAN" . Museo de Historia de la Computación . Consultado el 25 de mayo de 2026 .
  6. "Lenguajes de programación" . Encyclopædia Britannica . Consultado el 25 de mayo de 2026 .
  7. McCarthy, John (1960). "Funciones recursivas de expresiones simbólicas y su cálculo por máquina, Parte I". Communications of the ACM . 3 (4): 184– 195. doi : 10.1145/367177.367199 .
  8. Sammet, Jean E. (1978). "La historia temprana de COBOL". ACM SIGPLAN Notices . 13 (8): 121– 161. doi : 10.1145/960118.808378 .
  9. ^ Backus, JW; Bauer, Florida; Verde, J.; Katz, C.; McCarthy, J.; Naur, P.; Perlis, AJ; Rutishauser, H.; Samelson, K.; Vauquois, B.; Wegstein, JH; van Wijngaarden, A.; Woodger, M. (1963). "Informe revisado sobre el lenguaje algorítmico ALGOL 60". Comunicaciones de la ACM . 6 (1): 1– 17. doi : 10.1145/366193.366201 .
  10. Dahl, Ole-Johan; Nygaard, Kristen (1978). "El desarrollo de los lenguajes Simula". Historia de los lenguajes de programación . ACM. págs. 439–480 . doi : 10.1145/800025.1198392 . 
  11. Kay, Alan C. (1993). "La historia temprana de Smalltalk". ACM SIGPLAN Notices . 28 (3): 69– 95. doi : 10.1145/155360.155364 .
  12. Stroustrup, Bjarne (1993). "Una historia de C++: 1979–1991". Historia de los lenguajes de programación II . Association for Computing Machinery (ACM). pp. 699–769 . doi : 10.1145/154766.155375 . 
  13. "Historial y licencia" . Documentación de Python . Consultado el 25 de mayo de 2026 .
  14. "Especificación del lenguaje Java" (PDF) . Oracle . Consultado el 25 de mayo de 2026 .
  15. "JavaScript" . MDN Web Docs . Mozilla . Consultado el 25 de mayo de 2026 .
  16. "Kotlin 1.0 lanzado: lenguaje pragmático para JVM y Android" . JetBrains. 15 de febrero de 2016. Consultado el 25 de mayo de 2026 .
  17. "Preguntas frecuentes" . El lenguaje de programación Go . Consultado el 25 de mayo de 2026 .
  18. "Lenguaje de programación Rust" . Consultado el 25 de mayo de 2026 .
  19. "Lenguaje de programación Swift" . Consultado el 25 de mayo de 2026 .
  20. "Anuncio de TypeScript 1.0" . Microsoft. 2 de abril de 2014. Consultado el 25 de mayo de 2026 .
  21. Pankaj Surana (2006). Meta-Compilación de abstracciones lingüísticas (Tesis). Universidad Northwestern. ISBN 978-0-542-74444-0. Consultado el 17 de marzo de 2008 .
  22. Kuketayev, Argyn. "El punto de referencia de penalización por abstracción de datos (DAP) para objetos pequeños en Java" . Tendencias en el desarrollo de aplicaciones . Archivado del original el 11 de enero de 2009. Recuperado el 17 de marzo de 2008 .
  23. Chatzigeorgiou; Stephanides (2002). "Evaluación del rendimiento y la potencia de los lenguajes de programación orientados a objetos frente a los procedimentales". En Blieberger; Strohmeier (eds.). Actas de la 7.ª Conferencia Internacional sobre Tecnologías de Software Confiables - Ada-Europe'2002 . Springer. pág. 367. 
  24. 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.
  25. Kernighan, Brian W.; Ritchie, Dennis M. (1988). El lenguaje de programación C: 2.ª edición . Prentice Hall. ISBN 9780131103627Archivado del original el 25 de octubre de 2022. Consultado el 25 de octubre de 2022 .{{cite book}}: CS1 maint: bot: estado de la URL original desconocido ( enlace )
  26. Hyde, Randall. (2010). El arte del lenguaje ensamblador (2.ª ed.). San Francisco: No Starch Press. ISBN  978-1-59327-301-9OCLC 635507601 
  27. Chu, Yaohan (1975). «Conceptos de arquitectura de computadoras con lenguaje de alto nivel». Arquitectura de computadoras con lenguaje de alto nivel . Elsevier. págs. 1–14 . doi : 10.1016/b978-0-12-174150-1.50007-0 . ISBN  978-0-12-174150-1.
  28. Texas Instruments SÍMBOLO lenguaje de alto nivel computadora
    • Laboratorio de Investigación Informática de Texas Instruments (1972). SYMBOL: Arquitectura de Computadoras con Lenguaje de Alto Nivel (PDF) (Informe Técnico). Texas Instruments Incorporated. TI-SYMBOL-TR-1972 . Consultado el 4 de mayo de 2026 .
    • RA Kowalski; Personal de investigación de Texas Instruments (1973). La computadora SYMBOL: una máquina experimental de lenguaje de alto nivel . Conferencia Nacional de Computación de AFIPS. AFIPS Press. AFIPS-1973-SYMBOL . Recuperado el 4 de mayo de 2026 .{{cite conference}}: CS1 maint: varios nombres: lista de autores ( enlace )
    • Grupo del Proyecto SYMBOL de Texas Instruments (1974). "Ejecución directa de lenguajes de alto nivel en la arquitectura SYMBOL" . Communications of the ACM . 17 (8). Association for Computing Machinery: 453–460 . CACM-SYMBOL-1974 . Consultado el 4 de mayo de 2026 .
    • División de Sistemas Avanzados de Texas Instruments (1971). Descripción general del sistema SYMBOL (PDF) (Informe técnico). Texas Instruments Incorporated. TI-SYMBOL-OVERVIEW-1971 . Consultado el 4 de mayo de 2026 .
    • "Índice de documentación informática SYMBOL de Texas Instruments" . Bitsavers . Consultado el 4 de mayo de 2026 .
  • https://c2.com/cgi/wiki?HighLevelLanguage – Artículo de WikiWikiWeb sobre lenguajes de programación de alto nivel