Ассамблея высокого уровня
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения ) |
Разработчик(и) | Рэндалл Хайд |
---|---|
Стабильная версия | 2.16 / 6 июля 2011 г |
Репозиторий | исходная кузня |
Написано в | Язык ассемблера |
Операционная система | Windows , Linux , FreeBSD , macOS |
Платформа | ИА-32 |
Доступно в | Английский |
Тип | Ассемблер |
Лицензия | Общественное достояние |
Веб-сайт | плантационные производства |
High Level Assembly ( HLA ) — это язык, разработанный Рэндаллом Хайдом , который позволяет использовать конструкции языка более высокого уровня, помогающие как новичкам, так и опытным разработчикам ассемблера. Он полностью поддерживает расширенные типы данных и объектно-ориентированное программирование . Он использует синтаксис , основанный на нескольких языках программирования высокого уровня (HLL), таких как Pascal , Ada , Modula-2 и C++ , что позволяет создавать читаемые программы на языке ассемблера и позволяет программистам HLL изучать HLA так же быстро. насколько это возможно.
и Истоки цели
HLA изначально задумывался как инструмент для обучения программированию на языке ассемблера на уровне колледжей и университетов. Цель состоит в том, чтобы использовать имеющиеся у учащихся знания программирования при изучении языка ассемблера, чтобы как можно быстрее освоить их. Большинство студентов, проходящих курс программирования на языке ассемблера, уже знакомы со структурами потока управления высокого уровня , такими как IF, WHILE, FOR и т. д. HLA позволяет студентам немедленно применять эти знания программирования для кодирования на языке ассемблера на ранних этапах курса, что позволяет им освоить другие обязательные предметы по ассемблеру, прежде чем научиться кодировать низкоуровневые формы этих управляющих структур. В книге Искусство программирования на языке ассемблера» для этой цели используется HLA. Рэндалла Хайда « [1]
Ассемблер высокого и низкого уровня [ править ]
Ассемблер HLA v2.x поддерживает те же машинные инструкции низкого уровня, что и обычный низкоуровневый ассемблер, в то время как ассемблеры высокого уровня также поддерживают операторы, подобные языкам высокого уровня, такие как IF, WHILE и т. д., и более сложные операторы. директивы объявления данных, такие как структуры — записи , объединения и даже классы .
Некоторыми примерами высокопроизводительных ассемблеров являются HLA, Microsoft Macro Assembler (MASM) и Turbo Assembler (TASM) на процессорах семейства Intel x86 .
В отличие от большинства других инструментов ассемблера, компилятор HLA включает в себя стандартную библиотеку с тысячами функций, процедур и макросов , которые можно использовать для создания полноценных приложений с легкостью языка высокого уровня. ассемблера Хотя библиотеки не являются чем-то новым, язык, включающий большую стандартизированную библиотеку, побуждает программистов использовать код библиотеки, а не просто писать свои собственные библиотечные функции.
HLA поддерживает все те же машинные инструкции низкого уровня, что и другие ассемблеры x86. Более того, структуры управления высокого уровня HLA основаны на структурах, обнаруженных в MASM и TASM, чьи HLL-подобные функции предшествовали появлению HLA на несколько лет. В HLA низкоуровневый ассемблерный код можно написать так же легко, как и в любом другом ассемблере, просто игнорируя конструкции управления HLL. В отличие от HLL, таких как Pascal и C(++), HLA не требует встроенных операторов asm. В HLA функции, подобные HLL, по-видимому, обеспечивают помощь в обучении начинающим программистам на ассемблере, сглаживая кривую обучения, при условии, что они прекратят использование этих операторов, как только освоят набор команд низкого уровня. На практике многие опытные программисты продолжают использовать операторы типа HLL в HLA, MASM и TASM даже после освоения набора команд низкого уровня, но обычно это делается для улучшения читаемости.
Также можно писать программы высокого уровня с использованием HLA, избегая большей части утомительного программирования на языке ассемблера низкого уровня. Некоторые программисты на языке ассемблера сразу отвергают HLA. [ нужна ссылка ] , потому что это позволяет программистам делать это. Однако поддержка как высокоуровневого, так и низкоуровневого программирования расширяет диапазон применимости любого языка.
Отличительные особенности [ править ]
Две функции HLA отличают его от других ассемблеров x86: мощная система макросов (язык времени компиляции) и стандартная библиотека HLA.
Макросистема [ править ]
Язык времени компиляции HLA позволяет легко расширять язык, даже создавая небольшие предметно-ориентированные языки, которые помогают легко решать распространенные проблемы программирования. Макрос stdout.put
является хорошим примером сложного макроса, который может упростить программирование. Рассмотрим следующий вызов этого макроса:
stdout.put( "I=", i, " s=", s, " u=", u, " r=", r:10:2, nl );
Макрос stdout.put обрабатывает каждый аргумент, чтобы определить тип аргумента, а затем вызывает соответствующую процедуру в стандартной библиотеке HLA для обработки вывода каждого из этих операндов.
Большинство ассемблеров предоставляют какие-то возможности макросов: преимущество HLA перед другими ассемблерами заключается в том, что он может обрабатывать аргументы макроса, такие как r:10:2
используя обширные строковые функции HLA во время компиляции, а возможности макросов HLA могут определять типы переменных и использовать эту информацию для управления раскрытием макросов.
Язык макросов HLA предоставляет специальные возможности контекстно-свободных макросов. Эта функция позволяет легко писать макросы, охватывающие другие разделы кода, с помощью пары начального и завершающего макроса (наряду с дополнительными вызовами промежуточных макросов, которые доступны только между макросами начала и завершения). Например, с помощью этого макроса можно написать полностью рекурсивно-вложенный оператор SWITCH-CASE-DEFAULT-ENDSWITCH.
Благодаря бесконтекстной конструкции макросов HLA эти операторы switch..case..default..endswitch могут быть вложенными, и создаваемый код вложенных операторов не будет конфликтовать с внешними операторами.
Язык времени компиляции [ править ]
Макросистема HLA на самом деле является подмножеством более крупной функции, известной как язык времени компиляции HLA (CTL). HLA CTL — это интерпретируемый язык, доступный в исходном файле программы HLA. Интерпретатор выполняет инструкции HLA CTL во время компиляции исходного файла HLA; отсюда и название «язык времени компиляции» .
HLA CTL включает в себя множество управляющих операторов, таких как #IF, #WHILE, #FOR, #PRINT, оператор присваивания и т. д. Также можно создавать переменные и константы времени компиляции (включая структурированные типы данных, такие как записи и объединения). HLA CTL также предоставляет сотни встроенных функций (включая очень богатый набор функций сопоставления строк и шаблонов). HLA CTL позволяет программистам создавать программы CTL , которые сканируют и анализируют строки, что позволяет этим программистам создавать встроенные предметно-ориентированные языки (EDSL, также называемые мини-языками ). stdout.put
макрос, появившийся ранее, является примером такого EDSL. Макрос put (в пространстве имен stdout, отсюда и название stdout.put ) анализирует список параметров макроса и генерирует код, который будет печатать его операнды.
Стандартная библиотека [ править ]
Стандартная библиотека HLA представляет собой обширный набор готовых процедур и макросов (например, макроса stdout.put, описанного выше), которые облегчают жизнь программистам, избавляя их от необходимости начинать с нуля каждый раз, когда они пишут новое приложение. Возможно, не менее важно и то, что стандартная библиотека HLA позволяет программистам писать переносимые приложения, работающие под Windows или Linux, не требуя ничего, кроме перекомпиляции исходного кода . Подобно стандартной библиотеке C для языка программирования C , стандартная библиотека HLA позволяет пользователям абстрагировать низкоуровневые вызовы операционной системы (ОС), поэтому один и тот же набор интерфейсов прикладного программирования (API) ОС может обслуживать все операционные системы, поддерживающие HLA. поддерживает. Хотя язык ассемблера позволяет выполнять любые необходимые вызовы ОС, а программы используют набор API стандартной библиотеки HLA, писать программы, переносимые на ОС, несложно.
Стандартная библиотека HLA предоставляет тысячи функций, процедур и макросов. Хотя список со временем меняется, по состоянию на середину 2010 года для HLA v2.12 он включал функции из следующих категорий:
- Обработка аргументов командной строки
- Объявление и манипуляция массивом (динамическое)
- Битовые манипуляции
- Манипулирование большими двоичными объектами (blob)
- Манипулирование персонажами
- Конверсии
- Манипулирование набором символов
- Функции даты и времени
- Объектно-ориентированный файловый ввод-вывод
- Стандартный файловый ввод-вывод
- Функции манипулирования файловой системой, например удаление, переименование, изменение каталога.
- Объявления и функции, связанные с HLA
- Библиотека HLA Object Windows: объектно-ориентированная среда для программирования Win32.
- Манипулирование связанным списком
- Математические функции
- Распределение памяти и управление ею
- API-интерфейсы, специфичные для FreeBSD
- API-интерфейсы, специфичные для Linux
- API-интерфейсы, специфичные для MacOS
- API-интерфейсы, специфичные для Win32
- Функции текстовой консоли
- Поддержка сопрограмм
- Поддержка переменных среды
- Поддержка обработки исключений
- Поддержка файлов, отображенных в памяти
- Поддержка сокетов и объектов клиент-сервер.
- Поддержка потоков и синхронизации
- Функции таймера
- Поддержка сопоставления шаблонов для регулярных выражений и контекстно-свободных языков.
- Генераторы случайных чисел
- Поддержка удаленного вызова процедур
- Стандартные функции вывода ошибок
- Стандартные функции вывода
- Стандартные функции ввода
- Строковые функции
- Поддержка таблиц (ассоциативных)
- Строковые функции с нулевым завершением
Дизайн [ править ]
Языковая система HLA v2.x представляет собой инструмент, управляемый из командной строки и состоящий из нескольких компонентов, включая программу- оболочку (например, hla.exe в Windows), компилятор языка HLA (например, hlaparse.exe), низкоуровневый транслятор (например, HLABE или HLA Back Engine), компоновщик (link.exe в Windows, ld в Linux) и другие инструменты, такие как компилятор ресурсов для Windows. Версии до 2.0 полагались на внешнюю серверную часть ассемблера; версии HLA 2.x и более поздние используют встроенный HLABE в качестве внутреннего средства форматирования объектного кода.
HLA Приложение оболочки обрабатывает параметры командной строки и направляет соответствующие файлы каждой из программ, составляющих систему HLA. Он принимает в качестве входных данных .hla
файлы (исходные файлы HLA), .asm
файлы (исходные файлы для ассемблеров MASM, TASM, FASM, NASM или Gas), .obj
файлы для ввода в компоновщик и .rc
файлы (для использования компилятором ресурсов).
Перевод исходного кода [ править ]
Первоначально инструмент HLA v1.x скомпилировал свой исходный код в промежуточный исходный файл, который внутренний ассемблер, такой как MASM, TASM, плоский ассемблер ( FASM ), Netwide Assembler (NASM) или GNU Assembler (Gas), преобразул в файл объектного кода низкого уровня. Начиная с HLA версии 2.0, HLA включал собственный механизм HLA Back Engine (HLABE), который обеспечивал низкоуровневую трансляцию объектного кода. Однако с помощью различных параметров командной строки HLA v2.x по-прежнему имеет возможность транслировать исходный файл HLA в исходный файл, совместимый с одним из этих других ассемблеров.
HLA Back Engine [ править ]
HLA Back Engine (HLABE) — это серверная часть компилятора, которая преобразует внутренний промежуточный язык в низкоуровневый переносимый исполняемый файл (PE), общий формат объектного файла ( COFF ), исполняемый и связываемый формат (ELF) или Mach-O. объектный код . HLABE Программа в основном состоит из операторов передачи данных (байтов), операторов 32-битного перемещаемого адреса, инструкций передачи управления x86 и различных директив. Помимо перевода операторов байта и перемещаемого адреса в формат объектного кода низкого уровня, HLABE также выполняет оптимизацию смещения ветвей (выбор кратчайшей возможной формы инструкции ветвления).
Хотя HLABE включен в компилятор HLA v2.x, на самом деле это отдельный продукт. Это общественное достояние и открытый исходный код (размещен на SourceForge.net ).
См. также [ править ]
Примечания [ править ]
- ^ « Искусство программирования на ассемблере » . Архивировано из оригинала 29 марта 2018 г. Проверено 12 февраля 2010 г.
Ссылки [ править ]
- Ричард Блюм, Профессиональный язык ассемблера , Wiley, 2005, ISBN 0-7645-7901-0 , с. 42
- Рэндалл Хайд , «Напиши отличный код: понимание машины» , No Starch Press , 2004, ISBN 1-59327-003-8 , стр. 14–15 и используется на протяжении всей книги.
- Рэндалл Хайд , Искусство языка ассемблера, 2-е издание , No Starch Press , 2010 г., ISBN 1-59327-207-3 , используемый на протяжении всей книги.
Дальнейшее чтение [ править ]
- Пол Панкс (29 июня 2005 г.), HLA: язык программирования высокого уровня на ассемблере , Linux Journal