High-Level Assembly ( HLA ) es un lenguaje desarrollado por Randall Hyde que permite el uso de construcciones de lenguaje de alto nivel para ayudar tanto a principiantes como a desarrolladores de ensamblaje avanzados. Admite tipos de datos avanzados y programación orientada a objetos . Utiliza una sintaxis basada libremente en varios lenguajes de programación de alto nivel (HLL), como Pascal , Ada , Modula-2 y C++ , para permitir la creación de programas en lenguaje ensamblador legibles y permitir que los programadores de HLL aprendan HLA lo más rápido posible.
Orígenes y objetivos
HLA fue concebido originalmente como una herramienta para enseñar programación en lenguaje ensamblador a nivel universitario. El objetivo es aprovechar los conocimientos de programación existentes de los estudiantes al aprender lenguaje ensamblador para que se pongan al día lo más rápido posible. La mayoría de los estudiantes que toman un curso de programación en lenguaje ensamblador ya han sido introducidos a las estructuras de flujo de control de alto nivel , como IF, WHILE, FOR, etc. HLA permite a los estudiantes aplicar inmediatamente ese conocimiento de programación a la codificación en lenguaje ensamblador al principio del curso, lo que les permite dominar otros temas necesarios en lenguaje ensamblador antes de aprender a codificar formas de bajo nivel de estas estructuras de control. El libro The Art of Assembly Language Programming de Randall Hyde utiliza HLA para este propósito. [1]
Ensamblador de alto y bajo nivel
El ensamblador HLA v2.x admite las mismas instrucciones de máquina de bajo nivel que un ensamblador de bajo nivel normal, mientras que los ensambladores de alta gama también admiten declaraciones similares a las de un lenguaje de alto nivel, como IF, WHILE, etc., y directivas de declaración de datos más sofisticadas, como estructuras : registros , uniones e incluso clases .
Algunos ejemplos de ensambladores de alta gama son HLA, Microsoft Macro Assembler (MASM) y Turbo Assembler (TASM) en la familia de procesadores Intel x86 .
A diferencia de la mayoría de las demás herramientas de ensamblador, el compilador HLA incluye una biblioteca estándar con miles de funciones, procedimientos y macros que se pueden utilizar para crear aplicaciones completas con la facilidad de un lenguaje de alto nivel. Si bien las bibliotecas de lenguaje ensamblador no son nuevas, un lenguaje que incluye una gran biblioteca estandarizada alienta a los programadores a utilizar el código de la biblioteca en lugar de simplemente escribir sus propias funciones de biblioteca.
HLA admite las mismas instrucciones de máquina de bajo nivel que otros ensambladores x86. Además, las estructuras de control de alto nivel de HLA se basan en las que se encuentran en MASM y TASM, cuyas características similares a HLL precedieron a la llegada de HLA por varios años. En HLA, el código ensamblador de bajo nivel se puede escribir tan fácilmente como con cualquier otro ensamblador simplemente ignorando las construcciones de control HLL. A diferencia de HLL como Pascal y C(++), HLA no requiere instrucciones asm en línea. En HLA, las características similares a HLL parecen proporcionar una ayuda de aprendizaje para los programadores de ensamblaje principiantes al suavizar la curva de aprendizaje, con la suposición de que dejarán de usar esas instrucciones una vez que dominen el conjunto de instrucciones de bajo nivel. En la práctica, muchos programadores experimentados continúan usando instrucciones similares a HLL en HLA, MASM y TASM, mucho después de dominar el conjunto de instrucciones de bajo nivel, pero esto generalmente se hace para mejorar la legibilidad.
También es posible escribir programas de alto nivel utilizando HLA, evitando gran parte del tedio de la programación de bajo nivel en lenguaje ensamblador. Algunos programadores de lenguaje ensamblador rechazan HLA de plano [ cita requerida ] , porque les permite hacer esto. Sin embargo, el soporte tanto para programación de alto nivel como de bajo nivel le da a cualquier lenguaje un rango expandido de aplicabilidad.
Rasgos distintivos
Dos características de HLA lo distinguen de otros ensambladores x86: su potente sistema de macros (lenguaje de tiempo de compilación) y la biblioteca estándar HLA.
Sistema macro
El lenguaje de compilación de HLA permite extender el lenguaje con facilidad, incluso creando pequeños lenguajes específicos de dominio para ayudar a resolver fácilmente problemas de programación comunes. La macro stdout.putes un buen ejemplo de una macro sofisticada que puede simplificar la programación. Considere la siguiente invocación de esa macro:
stdout.put( "I=", i, " s=", s, " u=", u, " r=", r:10:2, nl );
La macro stdout.put procesa cada uno de los argumentos para determinar el tipo del argumento y luego llama a un procedimiento apropiado en la biblioteca estándar HLA para manejar la salida de cada uno de estos operandos.
La mayoría de los ensambladores proporcionan algún tipo de capacidad de macro: la ventaja que ofrece HLA sobre otros ensambladores es que puede procesar argumentos de macro como si r:10:2usara las extensas funciones de cadena de tiempo de compilación de HLA, y las funciones de macro de HLA pueden inferir los tipos de variables y usar esa información para dirigir la expansión de macro.
El lenguaje de macros de HLA ofrece una función especial de macros independientes del contexto . Esta función permite escribir fácilmente macros que abarcan otras secciones de código mediante un par de macros de inicio y finalización (junto con invocaciones de macros intermedias opcionales que solo están disponibles entre las macros de inicio y finalización). Por ejemplo, se puede escribir una sentencia SWITCH–CASE–DEFAULT–ENDSWITCH completamente anidable de forma recursiva utilizando esta función de macros.
Debido al diseño libre de contexto de las macroinstalaciones HLA, estas declaraciones switch..case..default..endswitch se pueden anidar, y el código emitido por las declaraciones anidadas no entrará en conflicto con las declaraciones externas.
Lenguaje en tiempo de compilación
El sistema de macros HLA es en realidad un subconjunto de una característica más grande conocida como lenguaje de tiempo de compilación (CTL) de HLA. El CTL de HLA es un lenguaje interpretado que está disponible en un archivo fuente de programa HLA. Un intérprete ejecuta instrucciones CTL de HLA durante la compilación de un archivo fuente de HLA; de ahí el nombre de lenguaje de tiempo de compilación .
La CTL de HLA incluye muchas instrucciones de control como #IF, #WHILE, #FOR, #PRINT, una instrucción de asignación , etc. También se pueden crear variables y constantes en tiempo de compilación (incluidos tipos de datos estructurados como registros y uniones). La CTL de HLA también proporciona cientos de funciones integradas (incluido un conjunto muy rico de funciones de coincidencia de cadenas y patrones). La CTL de HLA permite a los programadores crear programas CTL que escanean y analizan cadenas, lo que permite a esos programadores crear lenguajes específicos de dominio (EDSL, por sus siglas en inglés ) integrados . La macro que aparece antes es un ejemplo de un EDSL de este tipo. La macro put (en el espacio de nombres stdout, de ahí el nombre stdout .put) analiza su lista de parámetros de macro y emite el código que imprimirá sus operandos.
stdout.put
Biblioteca estándar
La biblioteca estándar de HLA es un amplio conjunto de rutinas y macros predefinidas (como la macro stdout.put descrita anteriormente) que facilitan la vida a los programadores, ahorrándoles el tener que empezar desde cero cada vez que escriben una nueva aplicación. Tal vez igual de importante, la biblioteca estándar de HLA permite a los programadores escribir aplicaciones portátiles que se ejecutan en Windows o Linux con nada más que volver a compilar el código fuente . Al igual que la biblioteca estándar de C para el lenguaje de programación C , la biblioteca estándar de HLA permite a los usuarios abstraer las llamadas del sistema operativo (SO) de bajo nivel, por lo que el mismo conjunto de interfaces de programación de aplicaciones (API) del SO puede servir para todos los sistemas operativos que HLA admite. Si bien un lenguaje ensamblador permite realizar cualquier llamada necesaria al SO, donde los programas usan el conjunto de API de la biblioteca estándar de HLA, escribir programas portátiles al SO es fácil.
La biblioteca estándar de HLA ofrece miles de funciones, procedimientos y macros. Si bien la lista cambia con el tiempo, a mediados de 2010, para HLA v2.12, se incluyeron funciones en estas categorías:
- Procesamiento de argumentos de línea de comandos
- Declaración y manipulación de matrices (dinámicas)
- Manipulación de bits
- Manipulación de blobs (objetos binarios grandes)
- Manipulación de personajes
- Conversiones
- Manipulación de conjuntos de caracteres
- Funciones de fecha y hora
- E/S de archivos orientada a objetos
- E/S de archivo estándar
- Funciones de manipulación del sistema de archivos, por ejemplo, eliminar, renombrar, cambiar directorio
- Declaraciones y funciones relacionadas con HLA
- La biblioteca de objetos HLA de Windows: un marco orientado a objetos para la programación Win32
- Manipulación de listas enlazadas
- Funciones matemáticas
- Asignación y gestión de memoria
- API específicas de FreeBSD
- API específicas de Linux
- API específicas de MacOS
- API específicas de Win32
- Funciones de la consola de texto
- Soporte de corrutinas
- Compatibilidad con variables de entorno
- Soporte para manejo de excepciones
- Compatibilidad con archivos mapeados en memoria
- Soporte de sockets y objetos cliente-servidor
- Soporte para subprocesos y sincronización
- Funciones del temporizador
- Compatibilidad con coincidencia de patrones para expresiones regulares y lenguajes libres de contexto
- Generadores de números aleatorios
- Soporte de llamada a procedimiento remoto
- Funciones de salida de error estándar
- Funciones de salida estándar
- Funciones de entrada estándar
- Funciones de cadena
- Soporte de tabla (asociativo)
- Funciones de cadena terminadas en cero
Diseño
El sistema de lenguaje HLA v2.x es una herramienta controlada por línea de comandos que consta de varios componentes, incluido un programa de shell (por ejemplo, hla.exe en Windows), el compilador de lenguaje HLA (por ejemplo, hlaparse.exe), un traductor de bajo nivel (por ejemplo, HLABE o HLA Back Engine), un enlazador (link.exe en Windows, ld en Linux) y otras herramientas como un compilador de recursos para Windows. Las versiones anteriores a la 2.0 dependían de un ensamblador externo como back-end; las versiones 2.x y posteriores de HLA utilizan el HLABE integrado como formateador de código objeto de back-end.
La aplicación HLA shell procesa los parámetros de la línea de comandos y envía los archivos correspondientes a cada uno de los programas que componen el sistema HLA. Acepta como .hlaarchivos de entrada (archivos fuente HLA), .asmarchivos (archivos fuente para ensambladores MASM, TASM, FASM, NASM o Gas), .objarchivos para la entrada al enlazador y .rcarchivos (para uso de un compilador de recursos).
Traducción del código fuente
Originalmente, la herramienta HLA v1.x compilaba su código fuente en un archivo fuente intermedio que un ensamblador de back-end como MASM, TASM, ensamblador plano ( FASM ), Netwide Assembler (NASM) o GNU Assembler (Gas) traduciría al archivo de código objeto de bajo nivel. A partir de HLA v2.0, HLA incluyó su propio motor de back-end HLA (HLABE) que proporcionaba la traducción del código objeto de bajo nivel. Sin embargo, a través de varios parámetros de línea de comandos, HLA v2.x aún tiene la capacidad de traducir un archivo fuente HLA a un archivo fuente que sea compatible con uno de estos otros ensambladores.
Motor trasero HLA
El motor de back-enlace HLA (HLABE) es un back-end del compilador que traduce un lenguaje intermedio interno a código objeto ejecutable (PE) de bajo nivel, formato de archivo de objeto común ( COFF ), formato ejecutable y enlazable (ELF) o Mach-O . Un programa HLABE consta principalmente de instrucciones de emisión de datos (byte), instrucciones de dirección reubicable de 32 bits, instrucciones de transferencia de control x86 y varias directivas. Además de traducir las instrucciones de dirección reubicable y byte al formato de código objeto de bajo nivel, HLABE también maneja la optimización del desplazamiento de rama (seleccionando la forma más corta posible de una instrucción de rama).
Aunque HLABE está incorporado en el compilador HLA v2.x, en realidad es un producto independiente. Es de dominio público y de código abierto (alojado en SourceForge.net ).
Véase también
Notas
- ^ "El arte de programar en lenguaje ensamblador". Archivado desde el original el 29 de marzo de 2018. Consultado el 12 de febrero de 2010 .
Referencias
- Richard Blum, Lenguaje ensamblador profesional , Wiley, 2005, ISBN 0-7645-7901-0 , pág. 42
- Randall Hyde , Write Great Code: Understanding the machine , No Starch Press , 2004, ISBN 1-59327-003-8 , págs. 14-15 y se utiliza en todo el libro.
- Randall Hyde , The Art of Assembly Language, 2.ª edición , No Starch Press , 2010, ISBN 1-59327-207-3 , utilizado en todo el libro
Lectura adicional
- Paul Panks (29 de junio de 2005), HLA: el lenguaje de programación ensamblador de alto nivel , Linux Journal
Enlaces externos
- Sitio web oficial
- Descargas para Windows, macOS y Linux
