Машинный код: различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Возвращение до состояния на 14:28, 23 февраля 2014‎, причины см. обсуждение
дополнение, викификация, стилевые правки
Строка 2:
'''Машинный код''' ('''платформенно-ориентированный код'''), '''машинный язык''' — [[система команд]] (набор кодов операций) конкретной [[компьютер|вычислительной машины]], которая [[интерпретатор|интерпретируется]] непосредственно [[процессор]]ом или [[микропрограмма]]ми этой вычислительной машины.<ref name="Dict">{{книга|заглавие=Толковый словарь по вычислительным системам|оригинал=Dictionary of Computing|ответственный=Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского|место={{М.}}|издательство=Машиностроение|год=1990|страниц=560|isbn=5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания)|тираж=70&nbsp;000 (доп.)}}</ref>
 
[[Компьютерная программа]], записанная на машинном языке, состоит из '''машинных инструкций''', каждая из которых представлена в машинном коде в виде т. н. [[Код операции|опкода]] — [[Двоичный код|двоичного кода]] отдельной операции из системы команд машины. Для удобства [[Программирование|программирования]] вместо числовых опкодов, которые только и понимает процессор, обычно используют их условные буквенные [[Мнемоника|мнемоники]]. Набор таких мнемоник, вместе с некоторыми дополнительными возможностями, называется [[Язык ассемблера|языком ассемблера]].
Каждая инструкция выполняет определённое (обычное [[Элементарная операция|элементарное]]) действие, такое как операция с данными (например, сложение или копирование; в регистре или в памяти) или переход к другому участку кода (изменение порядка исполнения; при этом переход может быть [[Команда перехода|безусловным]] или [[Условный переход|условным]], зависящим от результатов предыдущих инструкций). Каждая [[Исполнимый модуль|исполнимая программа]] состоит из последовательности таких атомарных инструкций.
 
Каждая модель процессора имеет свой собственный набор команд, хотя во многих моделях эти наборы команд сильно перекрываются. Говорят, что процессор ''A'' ''совместим'' с процессором ''B'', если процессор ''A'' полностью «понимает» машинный код процессора ''B''. Если процессорпроцессоры ''A'' знаети несколько''B'' командимеют некоторое подмножество инструкций, которыхпо некоторым понимаетони процессорвзаимно ''B''совместимы, то ''B''говорят, несовместимчто сони ''A''одной «архитектуры» (имеют одинаковую [[Архитектура набора команд|архитектуру набора команд]]).
Машинный код можно рассматривать как примитивный [[язык программирования]] или как самый низкий уровень представления [[компилятор|скомпилированных]] или [[ассемблер|ассемблированных]] компьютерных программ. Хотя вполне возможно создавать программы прямо в машинном коде, сейчас это делается редко в силу громоздкости кода и трудоёмкости управления ресурсами процессора, за исключением ситуаций, когда требуется экстремальная [[Оптимизация (информатика)|оптимизация]]. Поэтому подавляющее большинство программ пишется на языках более высокого уровня и транслируется в машинный код компиляторами. Машинный код иногда называют '''нативным кодом''' (также '''собственным''' или '''родным кодом''' — от {{lang-en|native code}}), когда говорят о платформенно-зависимых частях языка или библиотек.<ref>{{cite web|url=http://www.developer.com/net/cplus/print.php/2197621|title=Managed, Unmanaged, Native: What Kind of Code Is This?|author=Kate Gregory.|date=28 апреля 2003|accessdate=2012-03-27|archiveurl=http://www.webcitation.org/68313Lm0E|archivedate=2012-05-30}}</ref>
 
== Машинная инструкция ==
Программы на интерпретируемых языках (таких как [[Бейсик]] или [[Python]]) не транслируются в машинный код, вместо этого они либо исполняются непосредственно интерпретатором, либо транслируются в псевдокод ([[байт-код]]). Однако интерпретаторы этих языков (которые сами можно рассматривать как процессоры) как правило представлены в машинном коде.
{{main|Инструкция (информатика)}}
Каждая машинная инструкция выполняет определённое (обычное [[Элементарная операция|элементарное]]) действие, такое как операция с данными (например, [[сложение]] или копирование; [[Машинное слово|машинного слова]] в [[Регистр процессора|регистре]] или в [[Компьютерная память|памяти]]) или переход к другому участку кода (изменение порядка исполнения; при этом переход может быть [[Команда перехода|безусловным]] или [[Условный переход|условным]], зависящим от результатов предыдущих инструкций). КаждаяЛюбая [[Исполнимый модуль|исполнимая программа]] состоит из последовательности таких атомарных инструкциймашинных операций.
 
Операции, записываемые в виде одной машинной инструкции, можно разделить на «простые» ([[элементарная операция|элементарные операции]]) и «сложные». Кроме того, большинство современных процессоров состоит из отдельных «исполнительных устройств» — вычислительных блоков, которые умеют исполнять лишь ограниченный набор простейших операций. При исполнении очередной инструкции специальный блок процессора — декодер — [[Транслятор|транслирует]] (декодирует) её в последовательность элементарных операций, понимаемых конкретными исполнительными устройствами.
Каждая модель процессора имеет свой собственный набор команд, хотя во многих моделях эти наборы команд сильно перекрываются. Говорят, что процессор ''A'' ''совместим'' с процессором ''B'', если процессор ''A'' полностью «понимает» машинный код процессора ''B''. Если процессор ''A'' знает несколько команд, которых не понимает процессор ''B'', то ''B'' несовместим с ''A''.
 
Также[[Архитектура набора команд]] процессора определяет, какие операции он способен выполнять, и какой машинной инструкции какие числовые [[Код операции|коды операций]] (опкоды) соответствуют. Опкоды бывают постоянной длины (у [[RISC]]-, [[MISC]]-архитектур) и диапазонной (у [[CISC]]-архитектур; например: для архитектуры [[x86]] команда имеет длину от 8 до 120 битов).
Раньше процессоры просто выполняли инструкции одну за другой, но новые [[Суперскалярный процессор|суперскалярные процессоры]] способны выполнять несколько инструкций за раз.
 
Раньше процессоры просто выполняли инструкции одну за другой, но новыеСовременные [[Суперскалярный процессор|суперскалярные процессоры]] способны выполнять несколько машинных инструкций за разодин [[Тактовый сигнал|такт]].
Также инструкции бывают постоянной длины (у [[RISC]]-, [[MISC]]-архитектур) и диапазонной (у [[CISC]]-архитектур; например: для архитектуры [[x86]] команда имеет длину от 8 до 120 битов).
 
== Машинный код как язык программирования ==
{{seealso|Язык ассемблера}}
Машинный код можно рассматривать как примитивный [[язык программирования]] или как самый низкий уровень представления [[компилятор|скомпилированных]] или [[ассемблер|ассемблированных]] компьютерных программ. Хотя вполне возможно создавать программы прямо в машинном коде, сейчас это делается редко в силу громоздкости кода и трудоёмкости ручного управления ресурсами процессора, за исключением ситуаций, когда требуется экстремальная [[Оптимизация (информатика)|оптимизация]]. Поэтому подавляющее большинство программ пишется на [[Высокоуровневый язык программирования|языках более высокого уровня]] и транслируется в машинный код компиляторами[[компилятор]]ами. Машинный код иногда называют '''нативным кодом''' (также '''собственным''' или '''родным кодом''' — от {{lang-en|native code}}), когда говорят о платформенно-зависимых частях языка или библиотек.<ref>{{cite web|url=http://www.developer.com/net/cplus/print.php/2197621|title=Managed, Unmanaged, Native: What Kind of Code Is This?|author=Kate Gregory.|date=28 апреля 2003|accessdate=2012-03-27|archiveurl=http://www.webcitation.org/68313Lm0E|archivedate=2012-05-30}}</ref>
 
Программы на [[Интерпретируемый язык программирования|интерпретируемых языках]] (таких как [[Бейсик]] или [[Python]]) не транслируются в машинный код,; вместо этого они либо исполняются непосредственно интерпретатором[[интерпретатор]]ом языка, либо транслируются в псевдокод ([[байт-код]]). Однако интерпретаторы этих языков (которые сами можно рассматривать как процессоры), как правило, представлены в машинном коде.
 
== Микрокод ==