Что такое язык ассемблера? Если вы разработчик программного обеспечения, вы, вероятно, знаете, что существует множество типов компьютерных языков, используемых разработчиками и системами. Компьютеры понимают язык машинного уровня, в то время как люди используют языки более высокого уровня, такие как JavaScript, C ++ и т.д.
Но есть язык, который находится посередине, который помогает преодолеть разрыв между этими двумя сущностями, называемый языком ассемблера. Но что такое язык ассемблера и какое место он занимает в иерархии программирования?
Что такое язык ассемблера? Взгляд на машинное программирование
Язык ассемблера, также известный как язык ассемблера, представляет собой низкоуровневый язык программирования, предназначенный для передачи инструкций определенному компьютерному оборудованию и управления потоком информации.
Это делается с использованием удобочитаемых мнемоник (состоящих из мнемоник типа “LDA” для представления накопителя нагрузки) для формирования короткого кода, который облегчает человеку, пытающемуся завершить работу. Эти короткие коды преобразуются в язык машинного обучения (двоичный, т. е. единицы и 0) с помощью программ, называемых ассемблерами.
В двух словах, машинный язык использует двоичный код, который человеку практически невозможно расшифровать, в то время как язык ассемблера использует мнемонические коды для написания программы. Мнемонические коды упрощают понимание или запоминание чего-либо людьми и, таким образом, делают язык немного более удобным для использования людьми, чем машинный код.
В языке ассемблера нет ничего нового; он существует почти столько же, сколько и сами компьютеры. Первый язык ассемблера был изобретен в 1947 году математиком Кэтлин Бут из колледжа Биркбек в Лондоне при содействии Эндрю Бута (ее мужа), Джона фон Неймана и Германа Гольдштейна.
Часто ли разработчики используют ассемблер?
Ни в коем случае. Правда в том, что большинство разработчиков больше не используют язык ассемблера, потому что его часто считают громоздким и сложным в использовании.
Дело настолько обстоит так, что язык ассемблера, по сути, пошел по пути яванских носорогов — он практически вымер, поскольку это то, чему большинство профессионалов в настоящее время никогда не обучаются.
Существуют и другие языки, которые проще в использовании, а именно языки высокого уровня, о которых мы подробнее поговорим чуть позже. И многие из этих языков высокого уровня вообще не требуют знания языка ассемблера, потому что они преобразуют написанный разработчиком код в стандартный промежуточный язык серверной части.
Иногда вы встретите редкого заядлого разработчика, который все еще использует язык ассемблера.
Язык ассемблера – это один из множества типов компьютерных языков
Чтобы понять концепцию языка ассемблера, полезно применить целостный подход и узнать обо всех типах компьютерных языков. Важно отметить, что некоторые люди говорят, что существует три основные группы языков, некоторые говорят четыре, некоторые говорят даже больше. Ответ зависит от того, кого вы спрашиваете и как они классифицируют эти языки.
1. Машинный язык
Каждое устройство имеет процессор, отвечающий за все функции, выполняемые этим устройством. Эти процессоры используют машинный язык для “общения” с различными частями устройства, например, отдавая и получая инструкции на клавиатуру и мышь. Как мы упоминали ранее, машинный язык записывается в двоичной форме (0 и 1) в шестнадцатеричном формате, и каждое семейство процессоров имеет свою собственную версию.
Хотя процессоры свободно владеют машинным языком, человеку чрезвычайно сложно читать или использовать его – и практически невозможно, чтобы кто—то сделал это быстро. Вот тут на помощь приходит язык ассемблера.
2. Языки ассемблера
В целом, язык ассемблера немного более удобен для пользователя, чем язык машинного уровня, но сложнее, чем язык высокого уровня. Он использует короткие коды для указания машине выполнять определенные операции. В то время как машинный язык использует 0 и 1 для управления компьютером, язык ассемблера использует мнемонику, с которой человеку проще работать.
Как мы уже знаем, процессоры говорят только на машинном языке. Итак, для перевода машинного кода на язык ассемблера и наоборот требуется программа, называемая ассемблером. Процесс перевода известен как сборка, а время, необходимое для перевода языка, называется временем сборки.
Поскольку разные семейства процессоров используют разные машинные коды, язык ассемблера для каждого семейства также отличается. Некоторые языки ассемблера работают в разных операционных системах, в то время как другие специфичны для одной ОС или платформы.
3. Языки среднего уровня (т. е. Обычный язык промежуточного уровня)
Как мы упоминали ранее, разработчики обычно больше не используют языки ассемблера. Часто разработчики используют языки высокого уровня, которые затем компилируются в промежуточный язык (IL), который переводится в код машинного языка. По сути, это означает, что он полностью устраняет необходимость в ассемблере.
4. Языки высокого уровня
Итак, что такое языки более высокого уровня? Язык ассемблера требует многострочных подробных инструкций для выполнения простых функций. Компьютерные языки более высокого уровня не зависят от процессора и предназначены для передачи инструкций в понятной для человека форме. Программы, написанные на языках более высокого уровня, могут быть прочитаны людьми (при условии, что они знают этот язык), они лаконичны и просты в управлении.
Например, то, что в ассемблере может занимать восемь строк кода, может потребовать трех коротких команд на языке высокого уровня. Затем эта информация будет преобразована с помощью средства компиляции в машинный код.
Однако время выполнения больше, чем при использовании языков более низкого уровня. Хотя разница минимальна, некоторые программисты предпочитают использовать язык ассемблера, когда требуется короткая программа и дорого время.
Машинный язык | Языки ассемблера | Язык среднего уровня | Язык высокого уровня |
Машинный язык – это самый простой язык для взаимодействия с компьютером. | Язык ассемблера – это язык низкого уровня, который использует коды для взаимодействия с компьютером. Работать с ним немного проще, чем с машинным языком, но не так просто, как с языками высокого уровня. | Язык среднего уровня, часто называемый common intermediate language (CIL) или байт-кодом, является более универсальным языком, который компиляторы будут использовать для кроссплатформенного выполнения кода. | Язык высокого уровня – это компьютерный язык, который использует команды, понятные людям. Часто это стандартный язык разработчика, потому что он прост в использовании. |
Процессор понимает машинный язык. Это двоичный язык, состоящий из нулей и единиц | Язык ассемблера содержит несколько более понятные для человека короткие коды. Он использует ассемблеры для преобразования кода в машинный язык. | Это самый простой низкоуровневый язык программирования для чтения людьми (проще, чем ассемблер). | Язык высокого уровня содержит очень удобные для пользователя команды и синтаксис. В некоторых случаях он использует компилятор для перевода этих команд в ассемблер, который затем переводится на машинный язык для понимания процессорами. Но это не является техническим требованием; многие компиляторы вместо этого переводят на CIL (который затем преобразуется в машинный язык). |
Скорость выполнения машинного языка очень высока, поскольку процессору не нужно его переводить. | Скорость выполнения языка ассемблера не такая высокая, как машинного языка. Команды необходимо переводить, чтобы процессор их понимал. | Скорость выполнения компилятора ниже, чем у ассемблера. | Скорость выполнения языка высокого уровня самая низкая по сравнению с другими типами языков. |
По-человечески невозможно писать исполняемые программы на машинном языке. | По большому счету, этот язык больше не используется. Его редко можно увидеть в дикой природе, | Это то, что выполняется на серверной части с помощью компилятора, который не требует от разработчика никаких действий. | Синтаксис языка высокого уровня может быть легко прочитан человеком, и, следовательно, программирование происходит быстрее и проще. |
Примеры машинных языков: Двоичный язык | Примеры компонентов, которые могут использовать ассемблер: ARM, MIPS, x86 (у каждого свой язык ассемблера) | Пример CIL: Microsoft intermediate language (MSIL), который позже был стандартизирован как CIL | Примеры языков высокого уровня: Java, JavaScript, C ++, C #, F# |
Краткий код языка ассемблера состоит из кода операции и операндов
Инструкции на языке ассемблера используют мнемонический код и мета-операторы для передачи инструкций компьютеру (после перевода на машинный язык). Компьютер может выполнять арифметические функции, такие как сложение и вычитание, и логические функции, такие как сравнение и условные функции. Для управления компьютером язык ассемблера использует один код операции (opcode), за которым следуют два аргумента (операнда).
Код операции: Код операции (opcode) инструктирует машину о типе операции, которая должна быть выполнена.
Операнды: Операнды могут представлять данные, подлежащие обработке, или константы, с которыми должна выполняться операция. Операнды могут быть либо постоянным значением, либо адресом, указывающим, где хранятся данные (например, конкретное значение в регистре или ячейка памяти). Они могут определять адрес данных с помощью:
- Значения регистров – Регистры представляют собой небольшую часть компьютерного процессора, используемую для хранения данных для немедленного временного использования. Они созданы для повышения эффективности выполнения программ и операций.
- Значения стека – Стек – это абстрактный тип данных (ADT), который является линейным и использует метод ввода-вывода последним (LIFO) для следующих операций. Однородные данные хранятся в стеке, где последний ввод становится первым выводом.
- Значения памяти – Оперативная память (ОЗУ) – это место, где компьютер хранит временные данные, такие как переменные в программе. Каждый байт имеет уникальное местоположение в памяти. Итак, если программа захочет извлечь переменную во время выполнения, будет использоваться адрес памяти.
- Порты ввода / вывода – Порты ввода / вывода – это разъемы на компьютере для подключения внешних дисков или сетей. Если данные хранятся на любых дисках, подключенных к компьютеру, вы можете указать на эти данные в операндах.
В следующей таблице показаны команды в различных архитектурах ассемблера и языках программирования на ассемблере:
Работа | Синтаксис в ARM | Синтаксис в x86 | Синтаксис в MIPS |
Сложение | ADD | Add | Add |
Вычитание | SUB | SUB | SUB |
Умножение | MUL | Mul | Mult |
Разбивка на два типа ассемблеров
Языки ассемблера в некоторых случаях нуждаются в ассемблере для перевода высокоуровневого кода в машинный код. Ассемблеры подразделяются на категории в зависимости от количества циклов, которые они выполняют для генерации объектного кода. Мы можем использовать однопроходный или многопроходный ассемблер в зависимости от ситуации и требований.
Давайте рассмотрим два типа ассемблеров.
- Однопроходные ассемблеры (single-pass assemblers): Однопроходный ассемблер пропускает код через ассемблер только один раз для создания объектного файла. Он быстрее, чем двухпроходный ассемблер, но также более сложный. Этот тип считывает исходные файлы один раз, прежде чем работать со структурами данных в памяти.
- Двухпроходные ассемблеры (multi-pass assemblers): Многопроходный ассемблер – это более старый стиль ассемблера, который использует более одного прохода для создания объектного файла. Для этого ассемблер дважды считывал файлы, каждый отдельный проход обрабатывал определенные задачи.
И просто помните: во многих случаях ассемблеры больше не используются. Это связано с тем, что многие языки высокого уровня компилируются в CIL, а затем непосредственно в машинный язык; они полностью обходят необходимость в ассемблере.
Плюсы и минусы изучения и использования языков ассемблера
Язык ассемблера обычно используется в загрузочных кодах и ядрах операционных систем, но также может использоваться на более высоких уровнях для создания множества различных типов программ. Давайте рассмотрим некоторые плюсы и минусы изучения и использования языка ассемблера:
Плюсы изучения / использования языка ассемблера | Минусы изучения / использования языка ассемблера |
Язык ассемблера ускоряет выполнение сложного кода. | Писать код на языке ассемблера невероятно сложно по сравнению с языками высокого уровня. |
Людям понятнее, чем язык машинного уровня. | Синтаксис сложен для изучения, его трудно запомнить и быстро использовать. |
Удобно использовать при тестировании, отладке, оптимизации и разработке. | Код здесь длиннее и сложнее, чем на языке высокого уровня. |
Требует мало памяти и хорошо работает с устройствами с низким объемом оперативной памяти (ОЗУ). | Ему не хватает переносимости между устройствами с разными процессорами. |
Язык ассемблера можно использовать для обратного проектирования программного обеспечения, исходный код которого недоступен. | Компиляторы, преобразующие языки высокого уровня непосредственно в машинный, часто обходят его стороной. |
Заключительные слова о языке ассемблера
Язык ассемблера подходит как для высокоуровневых, так и для машинных языков, помогая облегчить общение между пользователями и компьютерами, использующими разные языки. Хотя программисту проще использовать языки высокого уровня, машины их не понимают. С другой стороны, машинный код проще для устройств, но очень сложен для понимания людьми. Таким образом, язык ассемблера исторически служит способом преодоления этого разрыва.
Хотя язык ассемблера для нас проще в использовании, чем машинный язык, это не значит, что он прост в использовании. Вот почему большинство языков программирования высокого уровня в настоящее время обходят необходимость в ассемблере и сразу переходят к CIL и машинному языку после этого.