Компилятор | это… Что такое Компилятор?
Эта статья включает описание термина «Компиляция»; см. также другие значения.
Компиля́тор — программа или техническое средство, выполняющее компиляцию.[1][2][3]
Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера).[2][3][4] Входной информацией для компилятора (исходный код) является описание алгоритма или программа на проблемно-ориентированном языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код).[5]
Компилировать — проводить трансляцию машинной программы с проблемно-ориентированного языка на машинно-ориентированный язык.[3]
Содержание
|
Виды компиляторов
[2]- Векторизующий. Транслирует исходный код в машинный код компьютеров, оснащённых векторным процессором.
- Гибкий. Сконструирован по модульному принципу, управляется таблицами и запрограммирован на языке высокого уровня или реализован с помощью компилятора компиляторов.
- Диалоговый
. См.: диалоговый транслятор. - Инкрементальный. Повторно транслирует фрагменты программы и дополнения к ней без перекомпиляции всей программы.
- Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.
- Компилятор компиляторов. Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.
- Отладочный. Устраняет отдельные виды синтаксических ошибок.
- Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.
- Самокомпилируемый. Написан на том же языке, с которого осуществляется трансляция.
- Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.
Виды компиляции
[2]- Пакетная. Компиляция нескольких исходных модулей в одном пункте задания.
- Построчная. То же, что и интерпретация.
- Условная. Компиляция, при которой транслируемый текст зависит от условий, заданных в исходной программе директивами компилятора. Так, в зависимости от значения некоторой константы, можно включать или выключать трансляцию части текста программы.
Структура компилятора
Процесс компиляции состоит из следующих этапов:
- Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
- Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.
- Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
- Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
- Генерация кода. Из промежуточного представления порождается код на целевом языке.
В конкретных реализациях компиляторов эти этапы могут быть разделены или, наоборот, совмещены в том или ином виде.
Генерация кода
Генерация машинного кода
Большинство компиляторов переводит программу с некоторого высокоуровневого языка программирования в машинный код, который может быть непосредственно выполнен процессором. Как правило, этот код также ориентирован на исполнение в среде конкретной операционной системы, поскольку использует предоставляемые ею возможности (системные вызовы, библиотеки функций). Архитектура (набор программно-аппаратных средств), для которой производится компиляция, называется целевой машиной.
Результат компиляции — исполнимый модуль — обладает максимальной возможной производительностью, однако привязан к определённой операционной системе и процессору (и не будет работать на других).
Для каждой целевой машины (IBM, Apple, Sun и т. д.) и каждой операционной системы или семейства операционных систем, работающих на целевой машине, требуется написание своего компилятора. Существуют также так называемые кросс-компиляторы, позволяющие на одной машине и в среде одной ОС генерировать код, предназначенный для выполнения на другой целевой машине и/или в среде другой ОС. Кроме того, компиляторы могут оптимизировать код под разные модели из одного семейства процессоров (путём поддержки специфичных для этих моделей особенностей или расширений наборов инструкций). Например, код, скомпилированный под процессоры семейства Pentium, может учитывать особенности распараллеливания инструкций и использовать их специфичные расширения — MMX, SSE и т. п.
Некоторые компиляторы переводят программу с языка высокого уровня не прямо в машинный код, а на язык ассемблера. Это делается для упрощения части компилятора, отвечающей за кодогенерацию, и повышения его переносимости (задача окончательной генерации кода и привязки его к требуемой целевой платформе перекладывается на ассемблер), либо для возможности контроля и исправления результата компиляции программистом.
Генерация байт-кода
Результатом работы компилятора может быть программа на специально созданном низкоуровневом языке, подлежащем интерпретации виртуальной машиной. Такой язык называется псевдокодом или байт-кодом. Как правило, он не является машинным кодом какого-либо компьютера и программы на нём могут исполняться на различных архитектурах, где имеется соответствующая виртуальная машина, но в некоторых случаях создаются аппаратные платформы, напрямую поддерживающие псевдокод какого-либо языка. Например, псевдокод языка Java называется байт-кодом Java и выполняется в Java Virtual Machine, для его прямого исполнения была создана спецификация процессора picoJava. Для платформы .NET Framework псевдокод называется Common Intermediate Language (CIL), а среда исполнения — Common Language Runtime (CLR).
Некоторые реализации интерпретируемых языков высокого уровня (например, Perl) используют байт-код для оптимизации исполнения: затратные этапы синтаксического анализа и преобразование текста программы в байт-код выполняются один раз при загрузке, затем соответствующий код может многократно использоваться без промежуточных этапов.
Динамическая компиляция
Основная статья: JIT-компиляция
Из-за необходимости интерпретации байт-код выполняется значительно медленнее машинного кода сравнимой функциональности, однако он более переносим (не зависит от операционной системы и модели процессора). Чтобы ускорить выполнение байт-кода, используется динамическая компиляция, когда виртуальная машина транслирует псевдокод в машинный код непосредственно перед его первым исполнением (и в при повторных обращениях к коду исполняется уже скомпилированный вариант).
CIL-код также компилируется в код целевой машины JIT-компилятором, а библиотеки .NET Framework компилируются заранее.
Декомпиляция
Существуют программы, которые решают обратную задачу — перевод программы с низкоуровневого языка на высокоуровневый. Этот процесс называют декомпиляцией, а такие программы — декомпиляторами. Но поскольку компиляция — это процесс с потерями, точно восстановить исходный код, скажем, на C++, в общем случае невозможно. Более эффективно декомпилируются программы в байт-кодах — например, существует довольно надёжный декомпилятор для Flash. Разновидностью декомпилирования является дизассемблирование машинного кода в код на языке ассемблера, который почти всегда выполняется успешно (при этом сложность может представлять самомодифицирующийся код или код, в котором собственно код и данные не разделены). Связано это с тем, что между кодами машинных команд и командами ассемблера имеется практически взаимно-однозначное соответствие.
Раздельная компиляция
Раздельная компиляция (англ. separate compilation) — трансляция частей программы по отдельности с последующим объединением их компоновщиком в единый загрузочный модуль.[2]
Исторически особенностью компилятора, отражённой в его названии (англ. compile — собирать вместе, составлять), являлось то, что он производил как трансляцию, так и компоновку, при этом компилятор мог порождать сразу абсолютный код. Однако позже, с ростом сложности и размера программ (и увеличением времени, затрачиваемого на перекомпиляцию), возникла необходимость разделять программы на части и выделять библиотеки, которые можно компилировать независимо друг от друга. При трансляции каждой части программы компилятор порождает объектный модуль, содержащий дополнительную информацию, которая потом, при компоновке частей в исполнимый модуль, используется для связывания и разрешения ссылок между частями.
Появление раздельной компиляции и выделение компоновки как отдельной стадии произошло значительно позже создания компиляторов. В связи с этим вместо термина «компилятор» иногда используют термин «транслятор» как его синоним: либо в старой литературе, либо когда хотят подчеркнуть его способность переводить программу в машинный код (и наоборот, используют термин «компилятор» для подчёркивания способности собирать из многих файлов один).
Интересные факты
На заре развития компьютеров первые компиляторы (трансляторы) называли «программирующими программами»[6] (так как в тот момент программой считался только машинный код, а «программирующая программа» была способна из человеческого текста сделать машинный код, то есть запрограммировать ЭВМ).
См. также
- CORC
- Компиляторы: принципы, технологии и инструменты
- SSA
Примечания
- ↑ ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X
- ↑ 1 2 3 4 5 Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0
- ↑ 1 2 3 СТ ИСО 2382/7-77 // Вычислительная техника. Терминология. Указ. соч.
- ↑ Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М.: Русский язык, 1990. — 335 с. — 50 050 (доп,) экз. — ISBN 5-200-01169-3
- ↑ Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ.
- ↑ Н. А. Криницкий, Г. А. Миронов, Г. Д. Фролов. Программирование / Под ред. М. Р. Шура-Бура. — М.: Государственное издательство физико-математической литературы, 1963.
Литература
- Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е изд. — М.: Вильямс, 2010. — 1184 с. — ISBN 978-5-8459-1349-4
- Робин Хантер. Основные концепции компиляторов = The Essence of Compilers. — М.: Вильямс, 2002. — 256 с. — ISBN 0-13-727835-7
- Хантер Р. Проектирование и конструирование компиляторов / Пер. с англ. С. М. Круговой. — М.: Финансы и статистика, 1984. — 232 с.
- Д. Креншоу. Давайте создадим компилятор!
- Серебряков В. А., Галочкин М. П. Основы конструирования компиляторов.
КОМПИЛЯТОР • Большая российская энциклопедия
Авторы: А. Ю. Дроздов, А. В. Ильин
КОМПИЛЯ́ТОР (от лат. compilo – собирать, составлять, компилировать) в информатике, компьютерная программа, которая преобразует исходный код программы на языке программирования высокого уровня (ЯПВУ) в функционально эквивалентный набор инструкций на языке низкого уровня (т. н. объектный код). К. является одним из видов транслятора и, как правило, входит в состав системного программного обеспечения компьютера. Каждый К. соответствует определённому ЯПВУ (паскалю, си, фортрану и др.) и одной или нескольким вычислит. платформам. Вычислит. платформа определяется архитектурой семейства центр. процессоров; напр., x86 – Intel 8086 Family Architecture (архитектура семейства Intel 8086), операционной системой и, в ряде случаев, дополнит. программным обеспечением (напр., виртуальной машиной), необходимым для работы исполняемого кода на процессорах данной архитектуры.
К. выполняет лексич., синтаксич., семантич. анализ исходного кода программы и генерацию объектного кода. На этапе лексич. анализа исходный код преобразуется в последовательность лексич. единиц – лексем (ключевые слова языка программирования, идентификаторы переменных, константы и др.). Во время синтаксич. анализа осуществляется проверка последовательности лексем на наличие синтаксич. ошибок (в соответствии с синтаксич. правилами языка программирования) и затем – преобразование этой последовательности в т. н. дерево разбора. Семантич. анализ предназначен для выявления логич. ошибок в исходной программе и определения значения языковых конструкций дерева разбора. После этого К. либо переходит к генерации объектного кода, либо завершает работу выводом сообщения об ошибках. Исходный код программы, как правило, содержится в нескольких файлах. К. преобразует каждый из них в отд. объектный модуль (файл, содержащий объектный код), а затем спец. программа-компоновщик собирает исполняемый код программы из объектных модулей, стандартных библиотечных модулей и др. До создания компоновщиков сборка производилась компилятором.
Для эффективного использования особенностей архитектуры процессоров и улучшения характеристик исполняемого кода (производительности, компактности и др.) в К. встроены компоненты, оптимизирующие код. Различают оптимизацию машинно независимую (т. е. не зависящую от архитектуры процессора) и машинно зависимую. Машинно независимая оптимизация часто выполняется на этапе генерации объектного кода. Машинно зависимые преобразования направлены на эффективное использование особенностей архитектур процессоров, оптимальное распараллеливание программ (для многоядерных процессоров) и др.
Альтернативой К. и компоновщикам служат интерпретаторы. Для ряда ЯПВУ существуют как К., так и интерпретаторы. Для некоторых ЯПВУ (напр., Java) применяется двухэтапная компиляция или сочетание компиляции и интерпретации. На первом этапе на спец. промежуточном языке генерируется т. н. байт-код, который не привязан к конкретной операционной системе и архитектуре семейства процессоров. Байт-код предназначен для последующей интерпретации или т. н. JIT-компиляции (Just-In-Time compilation – компиляция «на лету») во время выполнения программы. На втором этапе преобразование байт- кода в исполняемый код (для конкретных операционной системы и процессора) осуществляется спец. программным обеспечением (напр., Java Virtual Machine – виртуальной машиной Java). Такой подход позволяет существенно уменьшить трудозатраты программистов, поскольку один и тот же байт-код может быть использован на разл. вычислит. платформах, включающих необходимую виртуальную машину. С кон. 20 в. большое внимание уделяется созданию т. н. двоичных К., которые позволяют переводить скомпонованный исполняемый код одной платформы в код альтернативной архитектурной платформы, обеспечивая перенос готового программного обеспечения.
К. классифицируют по разл. признакам: по времени запуска процесса компиляции, по классу целевых архитектур, по наличию оптимизирующих преобразований и др. По времени запуска различают К. статические и динамические. Статич. К. запускается программистом из инструментальной системы программирования или командной строки. Динамич. К. запускается во время работы программы, т. е. параллельно с исполнением программы идёт перекомпиляция некоторых её частей. На основе классов целевых архитектур процессоров различают К. для архитектур с явно выраженным параллелизмом (EPIC – Explicitly Parallel Instruction Computing), для встроенных (embedded) архитектур, автоматич. распараллеливатели для многоядерных (multicore) архитектур и др.
Один из первых К. разработан в 1952 Г. Хоппер (США) для созданного ею языка программирования A-0 ЭВМ UNIVAC I. До появления ЯПВУ и их К. программы писали на языках низкого уровня (сначала в кодах машинных команд, позднее – на языках ассемблера). Значит. достижением автоматизации программирования стала разработка в 1957 К. для языка фортран ЭВМ IBM 704, выполненная под рук. Дж. Бэкуса (США). В 1950–60-х гг. исходные коды К. писались только на языках ассемблера. Одной из первых рос. работ в области оптимизирующей компиляции стал Альфа-транслятор с языка алгол-60 для ЭВМ М-20, созданный под рук. А. П. Ершова (1959–64). В 1970-х гг. реализованы ЯПВУ паскаль, си и др., которые стали применяться как для создания прикладных программ, так и для разработки К., что привело к значит. сокращению трудоёмкости создания К. Рост числа ЯПВУ и различных вычислит. платформ обусловливает появление новых К. и совершенствование методов их конструирования.
Проектирование компилятора
Определение 1
Компилятор — это программа, осуществляющая перевод исходной программы, написанной на входном языке, в эквивалентную ей объектную программу на языке машинных команд или языке ассемблера.
Общие сведения о компиляторах
Компилятором является программный продукт, предназначенный для перевода программы, которая написана на каком-либо языке программирования (исходном языке) в программу на язык ассемблера или в машинные команды. Практически все компиляторы выполняют перевод программы с некоторого высокоуровневого языка программирования в машинные коды, которые могут быть непосредственно исполнены компьютерным оборудованием.
При осуществлении семантического анализа, генерации кода и оптимизации сформированной программы, компилятор обязан пользоваться параметрами главных компонентов исходной программы, то есть, использовать переменные, константы, функции и другие лексические единицы входного языка. Эти параметры компилятор может получить при выполнении синтаксического анализа входной программы (наиболее часто при изучении структуры блоков описаний переменных и констант), а также может их дополнить при подготовке к генерации кода (к примеру, при выделении памяти).
Совокупность характеристик, соответствующих всем компонентам исходной программы, зависит от типа каждого компонента, от его смысла (семантики) и, естественно, от той роли, которую он выполняет в исходной и конечной программах. В каждом конкретном случае эта совокупность характеристик может быть своя, и она зависит от синтаксиса и семантики входного языка, от архитектуры целевой вычислительной системы и от структуры компилятора. Однако существуют стандартные характеристики, присущие некоторым компонентам исходной программы. К примеру, для переменных стандартными характеристиками являются их тип и адрес ячейки памяти, для констант это их значение, для функций это количество и типы формальных аргументов, тип возвращаемого результата, адрес вызова кода функции.
Основной характеристикой каждого компонента исходной программы считается его имя. Именно с именами переменных, констант, функций и других компонентов входного языка работает программист. Это означает, что и компилятор обязан обладать умением выполнять анализ этих компонентов по их именам. Имена всех компонентов должны являться уникальными. Некоторые современные языки программирования могут допускать отсутствие уникальности имен переменных, и функций в зависимости от их области видимости и иных параметров исходной программы.
То есть, задачей компилятора является сохранение некоторой информации, связанной с каждым компонентом исходной программы, и организация доступа к этой информации по имени компонента. Для решения данной задачи компилятор должен организовать специализированные хранилища данных, именуемые таблицами идентификаторов, или таблицами символов. Таблица идентификаторов должна состоять из набора полей данных (записей), каждое из которых должно соответствовать одному компоненту исходной программы. Запись должна содержать всю требуемую компилятору информацию об этом компоненте и может быть пополнена в процессе работы компилятора.
Проектирование компилятора
На любую операцию поиска компонента в таблице компилятор должен затратить время, и, так как, число компонентов в исходной программе может быть достаточно большим (от единиц до сотен тысяч в зависимости от объема программы), то это время способно оказать существенное влияние на общее время компиляции. По этой причине таблицы идентификаторов необходимо организовать таким образом, чтобы у компилятора была возможность максимально оперативно осуществлять поиск требуемой ему записи таблицы по имени компонента, с которым сопряжена данная запись.
Необходимо отметить следующий набор способов организации таблиц идентификаторов:
- Способ простых и упорядоченных списков.
- Способ бинарного дерева.
- Способ хэш — адресации с рехэшированием.
- Способ хэш — адресации по методу цепочек.
- Комбинированный способ хэш — адресации с ее списком или бинарным деревом.
В самом простом случае таблица идентификаторов выступает в качестве линейного неупорядоченного списка, или массива, все ячейки которого несут информацию о соответствующем компоненте таблицы. Помещение новых компонентов в такую таблицу осуществляется записью информации в очередную ячейку массива или списка по мере нахождения новых компонентов в исходной программе.
Поиск требуемого компонента в таблице будет в таком варианте исполняться путем последовательного перебора всех компонентов и сравнения их имен с именем требуемого компонента, пока не будет обнаружен компонент, имеющий такое же имя. То есть, если за единицу времени будет принято время, которое затрачивается компилятором на операцию сравнения двух строк (в современных вычислительных системах такое сравнение наиболее часто исполняется при помощи одной командой), то для таблицы, имеющей в своем составе N компонентов, в среднем должно исполняться N/2 сравнений. А время, которое необходимо для добавления нового компонента в таблицу, не зависит от количества компонентов в таблице (N).
Компилятор — Вики
Эта статья включает описание термина «Компиляция»; см. также другие значения.
Компиля́тор — программа, переводящая написанный на языке программирования текст в набор машинных кодов[1][2][3].
Содержание
- 1 Основная функциональность и терминология
- 2 Виды компиляторов
- 3 Виды компиляции
- 4 Структура компилятора
- 5 Генерация кода
- 5.1 Генерация машинного кода
- 5.2 Генерация байт-кода
- 5.3 Динамическая компиляция
- 6 Трансляция байт-кода в машинный код
- 6.1 Декомпиляция
- 7 Раздельная компиляция
- 8 История
- 9 Примечания
- 10 Литература
- 11 Ссылки
Основная функциональность и терминология
Компиля́ция — сборка программы, включающая:
- трансляцию всех модулей программы, написанных на одном или нескольких исходных языках программирования высокого уровня и/или языке ассемблера, в эквивалентные программные модули на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)[2][3][4] или непосредственно на машинном языке или ином двоичнокодовом низкоуровневом командном языке;
- последующую сборку исполняемой машинной программы, в том числе вставка в программу кода всех функций, импортируемых из статических библиотек и/или генерация кода запроса к ОС на загрузку динамических библиотек, из которых программой функции будут вызываться.
Если компилятор генерирует исполняемую машинную программу на машинном языке, то такая программа непосредственно исполняется физической программируемой машиной (например компьютером). В других случаях исполняемая машинная программа выполняется соответствующей виртуальной машиной.
Входная информация для компилятора есть:
- на фазе трансляции: исходный код программы, являющийся описанием алгоритма или программы на предметно-ориентированном языке программирования;
- на фазе компоновки: сгенерированные на фазе трансляции файлы объектных кодов модулей программы, а также файлы объектных кодов статических библиотек и данные об используемых динамических библиотеках.
На выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код[5], байт-код).
Компили́ровать — проводить сборку машинной программы, включая:
- трансляцию с предметно-ориентированного языка на машинно-ориентированный язык[3],
- компоновка исполняемой машинно-ориентированной программы из сгенерированных на фазе трансляции объектных модулей — модулей, содержащих части кода программы на машинно-ориентированного кода программы.
Довольно часто компиляторы с языков высокого уровня выполняют лишь трансляцию исходного кода, компоновку же поручая внешнему компоновщику, — компоновщику, представляющему самостоятельную программу, вызываемую компилятором как внешняя подпрограмма. Вследствие этого компилятор многие считают разновидность транслятора, что неверно…
Виды компиляторов
- Векторизующий. Базируется на трансляторе, транслирующем исходный код в машинный код компьютеров, оснащённых векторным процессором.
- Гибкий. Сконструирован по модульному принципу, управляется таблицами и запрограммирован на языке высокого уровня или реализован с помощью компилятора компиляторов.
- Диалоговый. См.: диалоговый транслятор.
- Инкрементальный. Пересобирает программу, заново транслируя только изменённые фрагменты программы без перетрансляции всей программы.
- Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.
- Компилятор компиляторов. Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.
- Отладочный. Устраняет отдельные виды синтаксических ошибок.
- Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.
- Самокомпилируемый. Написан на том же языке программирования, с которого осуществляется трансляция.
- Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.
Также все компиляторы условно можно разделить на две группы:
- Компиляторы с конкретных языков программирования. (Примеры: GCC, gnat, clang, xcode, gfortran.)
- Компиляторы как системы сборки программ. Таковы например довольно распространенная в UNIX- и Linux-системах система Makefile и распространенная в Windows-системах cmake. Работа последних (например в Makefile) очень часто управляется встроенным входным интерпретируемым языком, на котором и прописывается порядок самой компиляции программы.
Виды компиляции
Виды компиляции[2]:
- Пакетная. Компиляция нескольких исходных модулей в одном задании.
- Построчная. Машинный код порождается и затем исполняется для каждой завершённой грамматической конструкции языка. Внешне воспринимается как интерпретация, но имеет иное устройство.
- Условная. На фазе трансляции результат трансляции зависит от условий, прописанных в исходном транслируемом тексте программы директивами компилятора. (Яркий пример — работа препроцессора языка С и производных от него.) Так, в зависимости от значения некой константы некая транслятор заданную часть транслируемого исходного текста программы транслирует или пропускает (игнорирует).
Структура компилятора
Процесс компиляции состоит из следующих этапов:
- Трансляция программы — трансляция всех или только изменённых модулей исходной программы.
- Компоновка машинно-ориентированной программы.
Структурные реализации компилятора могут быть следующими:
- И транслятор, и компоновщик могут целиком входить в состав компилятора как исполняемые программы.
- Компилятор сам выполняет лишь трансляцию компилируемой программы, компоновка же программы выполняется вызываемой компилятором отдельной программой-компоновщиком. Практически все современные компиляторы построены по такой схеме.
- Пакет программ, включающий в себя трансляторы с разных языков программирования и компоновщики.
По первой схеме строились самые первые компиляторы, — для современных компиляторов такая схема построения нехарактерна.
По второй схеме построены все без исключения компиляторы с языков высокого уровня. Любой такой компилятор сам выполняет только трансляцию и далее вызывает компоновщик как внешнюю подпрограмму, который и компонует машинно-ориентированную программу. Такая схема построения легко позволяет компилятору работать и в режиме транслятора с соответствующего языка программирования. Это обстоятельство нередко служит поводом считать компилятор разновидностью транслятора, что естественно неверно, — все современные компиляторы такого типа все же выполняют компоновку, пусть и силами вызываемого компилятором внешнего компоновщика, тогда как транслятор сам никогда не выполняет вызов внешнего компоновщика. Но это же обстоятельство позволяет компилятору с одного языка программирования на фазе компоновки включать в программу написанную на одном языке программирования функции-подпрограммы из уже оттранслированных соответствующим транслятором/компилятором, написанные на ином языке программирования. Так в программу на C/C++ можно вставлять функции написанные например на Pascal или Fortran. Аналогично и напротив написанная на C/C++ функции могут быть вставлены в Pascal- или Fortran-программу соответственно. Это было бы невозможно без поддержки многими современными компиляторами генерации кода вызова процедур (функций) в соответствии с соглашениями иных языков программирования. Например современные компиляторы с языка Pascal помимо организации вызова процедур/функций в стандарте самого Pascal поддерживают организацию вызова процедурой/функцией в соответствии с соглашениями языка C/C++. (Например чтобы на уровне машинного кода написанная на Pascal процедура/функция работала с входными параметрами в соответствии с соглашениями языка C/C++, — оператор объявления такой Pascal-процедуры/Pascal-функции должен содержать ключевое слово cdecl.)
Наконец по третьей схеме построены компиляторы, представляющие собой целые системы, включающие в себя трансляторы с разных языков программирования и компоновщики. Также любой такой компилятор может использовать в качестве транслятора любой способный работать в режиме транслятора компилятор с конкретного языка высокого уровня. Естественно такой компилятор может компилировать программу, разные части исходного текста которой написаны на разных языках программирования. Нередко такие компиляторы управляются встроенным интерпретатором того или иного командного языка. Яркий пример таких компиляторов — имеющийся во всех UNIX-системах (в частности в Linux) компилятор make.
Трансляция программы как неотъемлемая составляющая компиляции включает в себя:
- Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
- Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в древо разбора.
- Семантический анализ. На этой фазе древо разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их объявлениям, типам данных, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным древом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
- Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
- Генерация кода. Из промежуточного представления порождается код на целевом машинно-ориентированном языке.
Генерация кода
Генерация машинного кода
Большинство компиляторов переводит программу с некоторого высокоуровневого языка программирования в машинный код, который может быть непосредственно выполнен физическим процессором. Как правило, этот код также ориентирован на исполнение в среде конкретной операционной системы, поскольку использует предоставляемые ею возможности (системные вызовы, библиотеки функций). Архитектура (набор программно-аппаратных средств), для которой компилируется (собирается) машинно-ориентированная программа, называется целевой машиной.
Результат компиляции — исполнимый программный модуль — обладает максимально возможной производительностью, однако привязан к конкретной операционной системе (семейству или подсемейству ОС) и процессору (семейству процессоров) и не будет работать на других.
Для каждой целевой машины (IBM, Apple, Sun, Эльбрус и т. д.) и каждой операционной системы или семейства операционных систем, работающих на целевой машине, требуется написание своего компилятора. Существуют также так называемые кросс-компиляторы, позволяющие на одной машине и в среде одной ОС генерировать код, предназначенный для выполнения на другой целевой машине и/или в среде другой ОС. Кроме того, компиляторы могут оптимизировать код под разные модели из одного семейства процессоров (путём поддержки специфичных для этих моделей особенностей или расширений наборов команд). Например, код, скомпилированный под процессоры семейства Pentium, может учитывать особенности распараллеливания инструкций и использовать их специфичные расширения — MMX, SSE и т. п.
Некоторые компиляторы переводят программу с языка высокого уровня не прямо в машинный код, а на язык ассемблера. (Пример: PureBasic, транслирующий бейсик-код в ассемблер FASM.) Это делается для упрощения части компилятора, отвечающей за генерацию кода, и повышения его переносимости (задача окончательной генерации кода и привязки его к требуемой целевой платформе перекладывается на ассемблер), либо для возможности контроля и исправления результата компиляции (в том числе ручной оптимизации) программистом.
Генерация байт-кода
Результатом работы компилятора может быть программа на специально созданном низкоуровневом языке двоично-кодовых команд, выполняемых виртуальной машиной. Такой язык называется псевдокодом или байт-кодом. Как правило, он не есть машинный код какого-либо компьютера и программы на нём могут исполняться на различных архитектурах, где имеется соответствующая виртуальная машина, но в некоторых случаях создаются аппаратные платформы, напрямую выполняющие псевдокод какого-либо языка. Например, псевдокод языка Java называется байт-кодом Java и выполняется в Java Virtual Machine, для его прямого исполнения была создана спецификация процессора picoJava. Для платформы .NET Framework псевдокод называется Common Intermediate Language (CIL), а среда исполнения — Common Language Runtime (CLR).
Некоторые реализации интерпретируемых языков высокого уровня (например, Perl) используют байт-код для оптимизации исполнения: затратные этапы синтаксического анализа и преобразование текста программы в байт-код выполняются один раз при загрузке, затем соответствующий код может многократно использоваться без перекомпиляции.
Динамическая компиляция
Основная статья: Динамическая компиляция (англ.)
Из-за необходимости интерпретации байт-код выполняется значительно медленнее машинного кода сравнимой функциональности, однако он более переносим (не зависит от операционной системы и модели процессора). Чтобы ускорить выполнение байт-кода, используется динамическая компиляция, когда виртуальная машина транслирует псевдокод в машинный код непосредственно перед его первым исполнением (и при повторных обращениях к коду исполняется уже скомпилированный вариант).
Наиболее популярной разновидностью динамической компиляции является JIT. Другой разновидностью является инкрементальная компиляция[en].
CIL-код также компилируется в код целевой машины JIT-компилятором, а библиотеки .NET Framework компилируются заранее.
Трансляция байт-кода в машинный код
Трансляция байт-кода в машинный код специальным транслятором байт-кода как указано выше неотъемлемая фаза динамической компиляции. Но трансляция байт-кода применима и для простого преобразования программы на байт-коде в эквивалентную программу на машинном языке. В машинный код может транслироваться как заранее скомпилированный байт-код. Но также трансляция байт-кода в машинный код может выполняться компилятором байт-кода сразу следом за компиляцией байт-кода. Практически всегда в последнем случае трансляция байт-кода выполняется внешним транслятором, вызываемым компилятором байт-кода.
Декомпиляция
Существуют программы, которые решают обратную задачу — перевод программы с низкоуровневого языка на высокоуровневый. Этот процесс называют декомпиляцией, а такие программы — декомпиляторами. Но поскольку компиляция — это процесс с потерями, точно восстановить исходный код, скажем, на C++, в общем случае невозможно. Более эффективно декомпилируются программы в байт-кодах — например, существует довольно надёжный декомпилятор для Flash. Разновидностью декомпиляции является дизассемблирование машинного кода в код на языке ассемблера, который почти всегда благополучно выполняется (при этом сложность может представлять самомодифицирующийся код или код, в котором собственно код и данные не разделены). Связано это с тем, что между кодами машинных команд и командами ассемблера имеется практически взаимно-однозначное соответствие.
Раздельная компиляция
Раздельная компиляция (англ. separate compilation) — трансляция частей программы по отдельности с последующим объединением их компоновщиком в единый загрузочный модуль[2].
Исторически особенностью компилятора, отражённой в его названии (англ. compile — собирать вместе, составлять), являлось то, что он производил как трансляцию, так и компоновку, при этом компилятор мог порождать сразу машинный код. Однако позже, с ростом сложности и размера программ (и увеличением времени, затрачиваемого на перекомпиляцию), возникла необходимость разделять программы на части и выделять библиотеки, которые можно компилировать независимо друг от друга. В процессе трансляции программы сам компилятор или вызываемый компилятором транслятор порождает объектный модуль, содержащий дополнительную информацию, которая потом — в процессе компоновки частей в исполнимый модуль — используется для связывания и разрешения ссылок между частями программы. Раздельная компиляция также позволяет писать разные части исходного текста программы на разных языках программирования.
Появление раздельной компиляции и выделение компоновки как отдельной стадии произошло значительно позже создания компиляторов. В связи с этим вместо термина «компилятор» иногда используют термин «транслятор» как его синоним: либо в старой литературе, либо когда хотят подчеркнуть его способность переводить программу в машинный код (и наоборот, используют термин «компилятор» для подчёркивания способности собирать из многих файлов один). Вот только использование в таком контексте терминов «компилятор» и «транслятор» неправильно. Даже если компилятор выполняет трансляцию программы самостоятельно, поручая компоновку вызываемой внешней программе-компоновщику, такой компилятор не может считаться разновидностью транслятора, — транслятор выполняет трансляцию исходной программы и только. И уж тем более не являются трансляторами компиляторы вроде системной утилиты-компилятора make, имеющейся во всех UNIX-системах.
Собственно утилита make — яркий пример довольно удачной реализации раздельной компиляции. Работа утилиты make управляется сценарием на интерпретируемым утилитой входном языке, известном как makefile, содержащемся в задаваемом при запуске утилиты входном текстовом файле. Сама утилита не выполняет ни трансляцию, ни компоновку — де-факто утилита make функционирует как диспетчер процесса компиляции, организующий компиляцию программы в соответствии с заданным сценарием. В частности в ходе компиляции целевой программы утилита make вызывает трансляторы с языков программирования, транслирующие разные части исходной программы в объектный код, и уже после этого вызывается тот или иной компоновщик, компонующий конечный исполняемый программный или библиотечный программный модуль. При этом разные части программы, оформляемые в виде отдельных файлов исходного текста, могут быть написаны как на одном языке программирования, так и на разных языках программирования. В процессе перекомпиляции программы транслируются только изменённые части-файлы исходного текста программы, вследствие чего длительность перекомпиляции программы значительно (порой на порядок) сокращается.
История
На заре развития компьютеров первые компиляторы (трансляторы) называли «программирующими программами»[6] (так как в тот момент программой считался только машинный код, а «программирующая программа» была способна из человеческого текста сделать машинный код, то есть запрограммировать ЭВМ).
Примечания
- ↑ ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.; см. также ГОСТ 19781-90
- ↑ 1 2 3 4 Першиков, 1991.
- ↑ 1 2 3 Вычислительная техника.
- ↑ Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М. : Русский язык, 1990. — 335 с. — 50 050 (доп.) экз. — ISBN 5-200-01169-3.
- ↑ Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп.) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
- ↑ Н. А. Криницкий, Г. А. Миронов, Г. Д. Фролов. Программирование / Под ред. М. Р. Шура-Бура. — М.: Государственное издательство физико-математической литературы, 1963.
Литература
- Вычислительная техника. Терминология. Указ. соч.
- Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0.
- Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е изд. — М.: Вильямс, 2010. — 1184 с. — ISBN 978-5-8459-1349-4.
- Робин Хантер. Основные концепции компиляторов = The Essence of Compilers. — М.: Вильямс, 2002. — 256 с. — ISBN 0-13-727835-7.
- Хантер Р. Проектирование и конструирование компиляторов / Пер. с англ. С. М. Круговой. — М.: Финансы и статистика, 1984. — 232 с.
- Д. Креншоу. Давайте создадим компилятор!
- Серебряков В. А., Галочкин М. П. Основы конструирования компиляторов.
Ссылки
- Медиафайлы на Викискладе
- Compilers в каталоге ссылок Curlie (dmoz)
- Новым процессорам — новые компиляторы
- Textbook: Compiler Design: Theory, Tools, and Examples (неопр. ).
- В. Э. Карпов. Классическая теория компиляторов
Навигация: Главная Случайная страница Обратная связь ТОП Интересно знать Избранные Топ: Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации — обмен информацией между организацией и её внешней средой… Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы… Основы обеспечения единства измерений: Обеспечение единства измерений — деятельность метрологических служб, направленная на достижение… Интересное: Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений… Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы. .. Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории… Дисциплины: Автоматизация Антропология Археология Архитектура Аудит Биология Бухгалтерия Военная наука Генетика География Геология Демография Журналистика Зоология Иностранные языки Информатика Искусство История Кинематография Компьютеризация Кораблестроение Кулинария Культура Лексикология Лингвистика Литература Логика Маркетинг Математика Машиностроение Медицина Менеджмент Металлургия Метрология Механика Музыкология Науковедение Образование Охрана Труда Педагогика Политология Правоотношение Предпринимательство Приборостроение Программирование Производство Промышленность Психология Радиосвязь Религия Риторика Социология Спорт Стандартизация Статистика Строительство Теология Технологии Торговля Транспорт Фармакология Физика Физиология Философия Финансы Химия Хозяйство Черчение Экология Экономика Электроника Энергетика Юриспруденция |
⇐ ПредыдущаяСтр 4 из 7Следующая ⇒ С помощью языка программирования создается текст программы, описывающий разработанный алгоритм. Чтобы программа была выполнена, надо либо весь ее текст перевести в машинный код (это действие и выполняет программа — компилятор) и затем передать на исполнение процессору, либо сразу выполнять команды языка, переводя на машинный язык и исполняя каждую команду поочередно (этим занимаются программы — интерпретаторы). Интерпретатор функционирует следующим образом: берет очередной оператор языка из текста программы, анализирует его структуру и затем сразу исполняет. После успешного выполнения текущей команды интерпретатор переходит к анализу и исполнению следующей. Если один и тот же оператор в программе выполняется несколько раз, интерпретатор всякий раз воспринимает его так, будто встретил впервые. Поэтому программы, в которых требуется произвести большой объем повторяющихся вычислений, будут работать медленно. Для выполнения программы на другом компьютере также необходимо установить интерпретатор, так как без него программа представляет собой набор слов и работать не может. Компиляторы полностью обрабатывают весь текст программы (его называют исходным кодом или source code). Они осуществляют поиск синтаксических ошибок, выполняют семантический аналиЪ и только затем, если текст программы в точности соответствует правилам языка, его автоматически переводят (транслируют) на машинный язык (говорят: генерируют объектный код или object code). Нередко при этом выполняется оптимизация с помощью набора методов, позволяющих повысить быстродействие программы. Сгенерированный объектный код обрабатывается специальной программой — сборщиком или редактором связей, который производит связывание объектного и машинного кодов. Текст программы преобразуется в готовый к исполнению ЕХЕ-файл (исполнимый код), его можно сохранить в памяти компьютера или на диске. Этот файл имеет самостоятельное значение и может работать под управлением операционной системы. Его можно перенести на другие компьютеры с процессором, поддерживающим соответствующий машинный код. Основной недостаток компиляторов — трудоемкость трансляции языков программирования, ориентированных на обработку данных сложной структуры, заранее неизвестной или динамически меняющейся во время работы программы. Для таких программ в машинный код вводятся дополнительные проверки и анализ наличия ресурсов операционной системы, средства динамического захвата и освобождения памяти компьютера, что на уровне статически заданных машинных инструкций осуществить достаточно сложно, а для некоторых задач практически невозможно. С помощью интерпретатора, наоборот, для исследования содержимого памяти допустимо в любой момент прервать работу программы, организовать диалог с пользователем, выполнить любые слож- II Информатика 321ные преобразования данных и при этом постоянно контролировать программно-аппаратную среду, что и обеспечивает высокую надежность работы программы. Интерпретатор при выполнении каждой команды подвергает проверке и анализу необходимые ресурсы операционной системы, при возникающих проблемах выдает сообщения об ошибках. ‘ «»» Ч ~ II МОДУЛЬ Код Код связей модуль Рис. 6.21. Процесс создания программы, готовой к исполнению Совокупность этих программных средств входит в состав системы программирования: • Текстовый редактор (необходимый для создания и редактирования исходного кода программы на языке программирования). • Компилятор. • Редактор связей. • Отладчик. • Библиотеки функций. • Справочная система. ⇐ Предыдущая1234567Следующая ⇒ Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим… Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций… Папиллярные узоры пальцев рук — маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни. .. Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)… |
Разработка компиляторов — тест 3
Главная / Программирование / Разработка компиляторов / Тест 3
Упражнение 1:
Номер 1
Если оператор языка ассемблера отображается при трансляции чаще всего в одну машинную инструкцию, предложения языков более высокого уровня отображаются
Ответ:
 (1) в одну машинную инструкцию 
 (2) в несколько машинных инструкций 
 (3) в пустую машинную инструкцию 
 (4) в произвольную машинную инструкцию 
Номер 2
Трансляторы бывают следующих типов:
Ответ:
 (1) compiler 
 (2) interpreter 
 (3) analysis 
 (4) synthesis 
Номер 3
Какая часть компилятора разбивает исходную программу на составляющие ее элементы и создает промежуточное представление исходной программы:
Ответ:
 (1) analysis 
 (2) synthesis 
 (3) interpreter 
 (4) begin 
Упражнение 2:
Номер 1
Можно сказать, что результатом работы интерпретатора является:
Ответ:
 (1) «программа» 
 (2) «код» 
 (3) «число» 
 (4) «исполняемый файл» 
Номер 2
Для интерпретатора верны следующие утверждения:
Ответ:
 (1) анализирует программу на входном языке 
 (2) создает промежуточное представление 
 (3) не создает никакой новой программы 
 (4) выполняет операции, содержащиеся в тексте программы 
Номер 3
Цепочка символов, составляющая исходную программу на языке программирования является:
Ответ:
 (1) входом компилятора  
 (2) выходом компилятора 
 (3) процессом компиляции 
 (4) процессом интерпретации 
Упражнение 3:
Номер 1
Крайне важной частью процесса трансляции является:
Ответ:
 (1) исправление ошибок, допущенных во входной программе 
 (2) игнорирование ошибок, допущенных во входной программе 
 (3) точная диагностика ошибок, допущенных во входной программе 
Номер 2
Объектная программа может быть:
Ответ:
 (1) последовательностью абсолютных машинных команд 
 (2) последовательностью перемещаемых машинных команд 
 (3) программой на языке ассемблера 
 (4) программой на некотором другом языке 
Номер 3
Создание единого перемещаемого объектного сегмента из набора различных сегментов осуществляется программой, которая называется:
Ответ:
 (1) редактором сегментов 
 (2) редактором связей 
 (3) редактором объектов 
 (4) редактором наборов 
Упражнение 4:
Номер 1
Подход при котором применяется трансляция программы в ассемблер:
Ответ:
 (1) упрощает конструирование компилятора 
 (2) сокращает технологическую цепочку выполнения программы 
 (3) удлиняет технологическую цепочку выполнения программы 
 (4) усложняет конструирование компилятора 
Номер 2
Преимуществами трансляции в ассамблер являются:
Ответ:
 (1) уровень ассемблера выше, чем у машинного кода 
 (2) использование ассемблера позволяет отследить целый ряд ошибок 
 (3) порождаемый текст на ассемблере значительно читабельней, чем машинный код 
Номер 3
Для представления компилятора мы можем использовать так называемые:
Ответ:
 (1) P-диаграммы 
 (2) T-диаграммы 
 (3) R-диаграммы 
 (4) S-диаграммы 
 (5) E-диаграммы 
 (6) D-диаграммы 
Упражнение 5:
Номер 1
Написание компилятора может потребоваться в следующих условиях:
Ответ:
 (1) для различных языков 
 (2) для целевых платформ 
 (3) при создании новой компьютерной архитектуры 
Номер 2
Методиками разработки компиляторов являются следующие:
Ответ:
 (1) метод раскрутки 
 (2) метод генерации 
 (3) использование кросс-трансляторов 
 (4) использование виртуальных машин 
 (5) компиляция «на лету» 
Номер 3
В каком году Вирт написал с использованием раскрутки транслятор языка Pascal:
Ответ:
 (1) 1969 
 (2) 1970 
 (3) 1971 
 (4) 1972 
 (5) 1973 
Упражнение 6:
Номер 1
Для того, чтобы справиться с проблемой большой потери времени при написании и отладке компилятора на языке ассемблера был разработан:
Ответ:
 (1) метод раскрутки 
 (2) метод упаковки 
 (3) метод генерации 
 (4) метод распаковки 
Номер 2
Под переносимой (portable) программой понимается программа, которая:
Ответ:
 (1) может без перетрансляции выполняться на одной платформе 
 (2) не может без перетрансляции выполняться на нескольких платформах 
 (3) может без перетрансляции выполняться на нескольких платформах 
Номер 3
Компиляторы генерирующие объектную программу на языке более высокого уровня, чем язык ассемблера называют:
Ответ:
 (1) конвертерами 
 (2) генераторами 
 (3) кросс-компиляторами 
 (4) исполнителями 
Упражнение 7:
Номер 1
Одна из первых широко известных виртуальных машин была разработана в 70-х годах Н. Виртом:
Ответ:
 (1) при написании компилятора Pascal-P 
 (2) при написании компилятора Pascal 
 (3) при написании компилятора Simula-P 
 (4) при написании компилятора Simula 
Номер 2
Сегодня идея виртуальных машин приобрела широкую известность благодаря языку:
Ответ:
 (1) Java 
 (2) C++ 
 (3) C 
 (4) Fortran 
Номер 3
Компиляторы языка Java генерируют:
Ответ:
 (1) бит-код 
 (2) объектный код 
 (3) байт-код 
Упражнение 8:
Номер 1
Для того, чтобы увеличить скорость работы приложений, была разработана технология:
Ответ:
 (1) compiling 
 (2) Just-In-Time compiling 
 (3) Just compiling 
 (4) Fats compiling 
Номер 2
Использование какой связки позволяет заметно повысить скорость выполнения исходной программы:
Ответ:
 (1) «компилятор+интерпретатор+JIT-компилятор» 
 (2) «интерпретатор+JIT-компилятор» 
 (3) «компилятор+интерпретатор» 
 (4) «компилятор+интерпретатор+JIT-компилятор+интепретатор» 
Номер 3
Процесс создания компилятора можно свести к решению нескольких задач, которые принято называть:
Ответ:
 (1) compilation steps 
 (2) compilation phases 
 (3) compilation rounds 
 (4) compilation stages 
Упражнение 9:
Номер 1
Обычно компилятор состоит из следующих фаз:
Ответ:
 (1) лексический анализ 
 (2) синтаксический анализ 
 (3) видозависимый анализ 
 (4) оптимизация 
 (5) генерация кода 
Номер 2
В разборе входной цепочки и выделении некоторых более "крупных" единиц, которые удобнее для последующего разбора заключается задача:
Ответ:
 (1) фазы синтаксического анализа 
 (2) фазы видозависимого анализа 
 (3) фазы генерации кода 
 (4) фазы лексического анализа 
Номер 3
На этапе лексического анализа обычно выполняются такие действия, как:
Ответ:
 (1) удаление комментариев 
 (2) обработка директив условной компиляции 
 (3) игнорирование комментариев 
 (4) обработка операторов 
Упражнение 10:
Номер 1
После синтаксического анализа можно считать, что исходная программа преобразована:
Ответ:
 (1) в некоторое промежуточное представление 
 (2) в некоторое промежуточное состояние 
 (3) в объектное представление 
 (4) в исполняемый файл 
Номер 2
В дереве разбора программы внутренние узлы соответствуют:
Ответ:
 (1) операциям 
 (2) операндам 
 (3) классам 
 (4) подклассам 
Номер 3
Видозависимый анализ иногда называют:
Ответ:
 (1) semantic analysis 
 (2) syntax analysis 
 (3) lexical analysis 
 (4) code optimization 
Упражнение 11:
Номер 1
Обязательность описания переменных может служить примером:
Ответ:
 (1) предварительных условий 
 (2) контекстных условий 
 (3) дополнительных условий 
 (4) временных условий 
Номер 2
Наиболее распространенными оптимизациями являются:
Ответ:
 (1) константные вычисления 
 (2) уменьшение силы операций 
 (3) выделение общих подвыражений 
 (4) чистка циклов 
Номер 3
На этапе генерации кода необходимо решить множество следующих сопутствующих проблем:
Ответ:
 (1) распределение памяти 
 (2) распределение регистров 
 (3) распределение блоков 
 (4) распределение стеков 
Упражнение 12:
Номер 1
Какие фазы иногда объединяют вместе под названием front-end?
Ответ:
 (1) лексический анализ 
 (2) синтаксический анализ 
 (3) видозависимый анализ 
 (4) некоторые оптимизации 
Номер 2
Процесс обработки всего, возможно, уже преобразованного, текста исходной программы называется:
Ответ:
 (1) passes 
 (2) control 
 (3) analysis 
 (4) audit 
Номер 3
Backpatching - это:
Ответ:
 (1) внутренний интерфейс 
 (2) техника «заплат» 
 (3) внешний интерфейс 
 (4) тестирование программы 
Главная / Программирование / Разработка компиляторов / Тест 3
Создание, компиляция и запуск простой программы
Ключ к успешному завершению лабораторных работ — внимательно прочитать инструкции.
Возьмите за привычку читать каждое слово — не пропускайте ни одного текста.
Онлайн-лаборатории
В течение некоторого времени мы будем проводить лабораторные работы онлайн с помощью Zoom. Как правило, вы будете работать в комнате обсуждения со случайно назначенным партнер. Даже если вы находитесь в комнате отдыха с кем-то еще, вам все равно нужно свою индивидуальную работу. Но, конечно, было бы неплохо пройти через лаборатория вместе.
- Вас поощряют (и ожидают) просить и получать помощь на протяжении всей лаборатории от вашего партнера в комнате отдыха. Вы можете нажать «попросить о помощи», чтобы привлечь внимание инструктора, который затем приходите в комнату. Но имейте в виду, они могут помогать кому-то другому (или несколько человек) во-первых.
- Если вы по какой-либо причине не присутствуете на фактическом лабораторном дне, вы по-прежнему несет ответственность за завершение работы и сдачу ее в срок.
- Поскольку вы все еще выполняете свою собственную работу, вам все равно нужно будет отправить собственный код для каждой лаборатории, независимо от того, работали вы с партнером или нет.
Часть 1. Вычислительная среда в вашем ноутбуке
Страница настройки системы является вашей отправной точкой. обратиться за помощью в том, как использовать вычислительную среду и выполнять задачи для этот класс.
Часть 2: Редактор
Выберите редактор
Мы будем использовать среду Unix для создания, компиляции и компоновки и выполнять программы на С++. Во-первых, вы должны выбрать текстовый редактор для создания ваша первая программа на C++. Звучит легко, правда? Неправильный! Ваш выбор текстового редактора запомнится вам на всю жизнь. Выбирай с умом!
- атом — новый красивый редактор ← полезно для начинающих программистов
- ви / вим / гвим — легкий и мощный текстовый редактор. ← Рекомендуемый выбор доктора Чоя!
- emacs — многофункциональный текстовый редактор. ← Рекомендуемый выбор Ричарда Столлмана!
Часть 3: Ваша первая программа
- Откройте окно терминала Linux (Ubuntu). В WSL это означает открытие Windows
Терминал (убедитесь, что на вкладке есть пингвин!) или, если вы не смогли его получить
установлено, работает
wsl
со стартовой панели. - Вы должны увидеть приглашение вроде
m012345@WK2ESUIO4MID:~$
На самом деле это полезная информация! В этом пример:
-
m012345
— ваше имя пользователя (должно совпадать с вашим USNA). имя пользователя) -
WK2ESUIO4MID
— имя вашего компьютера (извините, ITSD не любит давать красивое имя вашему ноутбуки) - Текущий каталог
~
. тильда~
указывает ваш домашний каталог , который база, в которой будут храниться все ваши личные файлы Линукс.
-
Тип
лс
чтобы увидеть содержимое вашего текущего каталога. Ты должно увидеть что-то вродеЗагрузка рабочего стола bin si204
The
Desktop
иDownloads
являются ссылками на те папки в винде, аsi204
это ссылка на точно такую же папка под названиемsi204
на рабочем столе.- Конечно каталог
si204
имеет место быть! Чтобы перейти в это тип каталогаcd si204
Обратите внимание, что ваше приглашение изменилось, чтобы указать, что вы сейчас находитесь в другом каталог!
Рекомендуется всегда начинать и заканчивать любой период времени. работа, которую вы делаете, синхронизируясь с git. Более подробно об этом ниже, но для теперь вам просто нужно запустить:
204синхронный
- Теперь мы хотим создать новый каталог для хранения ваших файлов для lab01, используя
команду «mkdir» и, наконец, перейдите в этот новый каталог:
мкдир lab01 компакт-диск lab01
- Откройте нужный текстовый редактор.
- Для Atom (который работает в Windows):
- Откройте Atom при запуске Windows меню
- В Atom перейдите в папку
lab01
, которая находится подDesktop/si204
и создайте (и сохраните) файл с именемmain.cpp
.
- Если вы используете vi, в вашем терминале:
gvim main.cpp&
(Попробуйте немного узнать о Vim: шпаргалка Vim, интерактивный учебник по Vim, Вим Введение и руководство) - Если вы используете emacs,
emacs main.cpp и
(Попробуйте немного узнать о emacs: Emacs Essentials, большой список команд, а гораздо больший список команд)
- Для Atom (который работает в Windows):
- Теперь используйте текстовый редактор, чтобы скопировать следующий исходный код в файл main.cpp:
#include
Когда закончите, сохраните файл.основной () { std::cout << "Привет, мир!" << стд::эндл; вернуть 0; } - Компиляция (и ссылка)
Если вы хотите, чтобы программы, которые вы пишете, действительно выполняли что-то, то вы должны их скомпилировать (превратить исходный код в машинный язык). Преобразование исходного кода высокого уровня C++ в машинный язык очень сложно, но производители компиляторов решают эту проблему за вас.
Чтобы скомпилировать вашу программу,
В вашем рабочем каталоге должен быть новый файл с именем m012345. Проверьте это, набрав:лс
Если опустить "-o m012345", что мы будем часто делать, то файл с именем по умолчанию "a.out". Пытаться:
g++ main.cpp
лс Новые файлы m012345 и a.out являются «исполняемым файлом» для вашей программы.Если вы видите какие-либо сообщения об ошибках от
g++
, обратитесь за помощью от инструктора. Советы по расшифровке сообщений об ошибках приведены ниже на конец этого урока.Примечание: технически единственная команда, которую вы ввели, на самом деле "скомпилирована" и "связали" вашу программу. Об этом мы поговорим гораздо позже, но вкратце "связывание" (среди прочего) берет ваш код и объединяет его с другим кодом, предоставленным в другом месте, для выполнения стандартных действий, таких как ввод и вывод (на это ссылается строка #include
в вашем код). Часто мы неофициально называем весь этот процесс «компиляцией». - Беги!
После того, как вы успешно скомпилировали и связали свою программу (без ошибок), то вы готовы выполнить свою программу. В вашем текущем рабочий каталог, вы увидите новый файл с именем
Примечание: «косая черта» указывает компьютеру искать программу (m012345). в текущем каталоге (обозначается точкой) .m012345
(или как бы вы его ни назвали). Это ваша программа. Чтобы выполнить файл, введите имени файла, которому предшествует "точечная косая черта" (буквально "./") , и нажмите Enter ключ. - Выход программы:
Ваша программа будет выводить на тот же терминал, с которого он был выполнен, как показано выше.
Теперь давайте посмотрим на исполняемый файл, который вы только что запустили. Тип
лс-л
чтобы перечислить детали содержимого вашего текущего рабочего каталога.- Существует файл с именем main.cpp — это ваш файл исходного кода . Обратите внимание размер файла (в нашем примере 95 байт).
- Файл с именем m012345 является вашим программа исполняемый файл , который объединяется со всеми остальными необходимыми машинный код для запуска вашей программы. Обратите внимание на размер (7782 байта в нашем примере)!! Увеличение размера связано с кодом, который был «включен» или связаны с вашей программой.
Часть 4: Давайте повторим все сначала!
Вы только что достигли довольно многого; вы набрали C++ программу, скомпилировал ее и запустил. Важно что вы понимаете все необходимые шаги, и что вы удобно использовать текстовый редактор и терминал.
Повторите часть 3 этой лабораторной работы еще раз со следующими изменениями:
- Сначала закройте все открытые окна (включая редактор и терминал).
- Откройте терминал и "cd" на правильный каталог для lab01.
- Вместо входа в программу "Hello World" введите это простое дополнение
программы (назовите исходный файл
add.cpp
вместоmain.cpp
):add.cpp пример запуска // (Ваше имя и альфа) // Эта программа складывает два числа #include <иопоток> основной () { целое число1, число2, сумма; число1 = 12; число2 = 13; сумма = число1 + число2; станд::каут
~/$ ./добавить Сумма этих двух целых чисел равна 25
. - Скомпилируйте свою программу, дав исполняемому файлу имя
, добавьте
.- Итак, что вам нужно изменить при компиляции вашей программы?
- См. Часть 5 ниже, если у вас есть ошибки при компиляции.
- Запустите вашу программу и убедитесь, что она распечатывает правильный ответ! Исправьте, если не так!
Часть 5: Исправление ошибок при компиляции
Как читать сообщение об ошибке
Когда вы совершаете определенные распространенные ошибки ( синтаксические ошибки ), компилятор не сможет понять вашу программу и выдаст ошибку операторы в окне терминала.
- Каждое сообщение об ошибке содержит номер, который представляет номер строки ошибки. Перейдите к этому номеру строки, чтобы увидеть, где проблема в.
- Каждая синтаксическая ошибка должна быть исправлена до того, как программа будет компилировать. Иногда ясно, что не так, а иногда у вас может возникнуть трудно понять, как исправить синтаксическую ошибку.
Наконечники
Вы улучшитесь, когда увидите достаточно ошибок, чтобы связать сообщения с ошибка синтаксиса. Вот несколько простых советов:
- Сохранить программных файлов перед компиляцией
- Если ошибка отмечена в строке, которая выглядит идеально хорошо, иногда это , предшествующая строке , которая испорчена. Проверьте это тоже!
- Проверить отсутствие или избыток ; и } символов
- Скомпилируйте вашу программу из небольших фрагментов . Не ждите, чтобы скомпилировать
код, пока не завершите всю программу.
- Когда вы пишете какой-то чанк, попробуйте его скомпилировать и исправить ошибки для чанка.
- Если исправить все ошибки чанка, то добавить еще несколько чанков.
- Сообщения с текстом «Невозможно преобразовать из... в ..." обычно означает, что вы пытаетесь назначить неправильный тип для переменная.
- Проверьте свои опечатки. Распространенная ошибка — называть переменная одна вещь, но неправильно пишется или используйте какой-нибудь другой имя позже.
- Иногда одна простая проблема может привести к тому, что компилятор
найти массу ошибок (например, забыть включить использование
пространство имен стандартное;. Исправление одной строки может сделать все
эти ошибки уходят!
Если вы скомпилируете и увидите необычно большое количество ошибок не паникуйте. Часто простое изменение исправит их.
- Если вы не можете понять, что не так - СПРАШИВАЙТЕ!!!
Намеренные ошибки: Не пропускайте эту часть!
Здесь очень помогает опыт и практика. Таким образом, для каждого из приведенных ниже намеренно сделать синтаксическую ошибку в вашей текущей программе и попытаться скомпилировать чтобы узнать, что это за сообщение об ошибке. Исправьте ошибку перед введением следующую ошибку в вашу программу (например, добавляйте только ОДНУ ОШИБКУ за раз). Иди медленно и обратите внимание, это сэкономит вам время позже!
- убрать точку с запятой.
- заменить "<<" на ">>".
- измените переменную number1 на Number1.
- удалить окончание }.
- удалите строку "#include
". - заменить "std" на "std::cout"
Часть 6: Напишите код для отправки (выполните эту часть на ноутбуке)
- В терминале Windows перейдите к ~/si204/lab01.
- Создайте lab01.cpp следующим образом:
#include
основной () { станд::каут - Измените программу lab01.cpp, чтобы ее выходные данные соответствовали показанному.
в яблочко!
требуемый вывод Привет, мир! Здравствуй, Солнечная система! Здравствуй Галактика! Здравствуй Вселенная! Привет ... ? Это 1! Это 2! Это 3! Это 4! Это 5!
Используйте команды редактора: Ваше внимание сосредоточено на использовании редактора для внесения этих изменений как максимально эффективно! Другими словами, конечно, вы можете это сделать, я хочу вам сосредоточиться на том, чтобы делать это умно!
Это почти головоломка, чтобы использовать как можно меньше нажатий клавиш. В частности, какие команды редактора будут делать следующее?
- Скопировать строку
- Паста
- Удалить (или заменить) слово
Отправьте этот lab01.
cpp в систему отправки- Перейдите в каталог, содержащий файл lab01.cpp.
компакт-диск ~/si204/lab01
- Отправьте свою программу, введя следующую команду:
~/bin/submit -c=SI204 -p=lab01 lab01.cpp
- Важно: С помощью веб-браузера проверьте отправку
server и посмотрите, проходит ли ваша работа тестовый пример.
Если вы не получили вывод на 100% правильно, страница должна дать вам указание на то, что не так с вашим выводом.
Продолжайте исправлять вашу программу и повторная отправка до тех пор, пока он не будет работать идеально.
Javanotes 9, ответы на викторину по главе 1
На этой странице представлены примеры ответов на викторину по главе 1 Введение в программирование с использованием Java . Обратите внимание, что обычно существует множество правильных ответов на заданный вопрос.
Вопрос 1:
Один из компонентов компьютер - это его процессор . Что такое процессор и какую роль он играет в компьютер?
Ответ:
Центральный процессор или центральный процессор Блок, является активной частью компьютера. Его функция заключается в выполнении программ которые закодированы на машинном языке и хранятся в основной памяти (ОЗУ) компьютер. Он делает это, повторяя цикл выборки и выполнения снова и снова; то есть он многократно извлекает инструкцию машинного языка из памяти и выполняет его.
Вопрос 2:
Объясните, что означает «асинхронное событие». Приведите несколько примеров.
Ответ:
Асинхронное событие — это одно это происходит в непредсказуемое время вне контроля программы, которая процессор работает. Он не "синхронизируется" с программой. Примером может быть, когда пользователь нажимает клавишу на клавиатуре или щелкает кнопку мыши. (Эти события генерируют «прерывания», которые заставляют ЦП прерывать то, что он делать и предпринимать какие-либо действия для обработки асинхронного события. После обработки событие, ЦП возвращается к тому, что он делал до того, как его прервали.)
Вопрос 3:
В чем разница между «компилятором» и «интерпретатором»?
Ответ:
Компиляторы и интерпретаторы имеют похожие функции: они берут программу, написанную на некотором языке программирования, и перевести на машинный язык. Компилятор выполняет перевод всего за однажды. Он создает полную программу на машинном языке, которую затем можно казнен. Интерпретатор, с другой стороны, просто переводит одну инструкцию в раз, а затем немедленно выполняет эту инструкцию. (Java использует компилятор для перевода Java-программ в Java Bytecode, который является машинным языком для воображаемая виртуальная машина Java. Затем программы Java Bytecode выполняются переводчик.)
Вопрос 4:
Объясните разницу между языками высокого уровня и машинным языком.
Ответ:
Программы, написанные на машине язык данного типа компьютера может напрямую выполняться процессором такой тип компьютера. Языковые программы высокого уровня должны быть переведены на машинный язык, прежде чем они могут быть выполнены. (Инструкции на машинном языке кодируются как двоичные числа, предназначенные для использования машиной, а не для чтения или написаны людьми. Языки высокого уровня используют синтаксис, более близкий к человеческому. язык.)
Вопрос 5:
Если у вас есть исходный код для программы Java, и вы хотите запустить эту программу, вам потребуется как Компилятор и интерпретатор . Что делает компилятор Java и что делает интерпретатор Java?
Ответ:
Компилятор Java переводит Java-программы в язык, называемый байт-кодом Java. Хотя байт-код подобно машинному языку, это не машинный язык какого-либо реального компьютер. Интерпретатор Java используется для запуска скомпилированной программы байт-кода Java. (Каждому типу компьютеров нужен свой собственный интерпретатор байт-кода Java, но все эти интерпретаторы интерпретируют один и тот же язык байт-кода.)
Вопрос 6:
Что такое подпрограмма ?
Ответ:
Подпрограмма представляет собой набор инструкции по выполнению некоторой задачи, которые были сгруппированы вместе и даны имя. Позже, когда эта задача должна быть выполнена, необходимо только вызвать подпрограмму, указав ее имя, а не повторяя весь последовательность инструкций.
Вопрос 7:
Java — это объектно-ориентированная язык программирования. Что такое объект ?
Ответ:
Объект состоит из некоторых данных вместе с набором подпрограмм, которые манипулируют этими данными. (предмет – это своего рода «модуль» или автономный объект, который взаимодействует с остальной частью мир через четко определенный интерфейс. Объект должен представлять некоторые связное понятие или объект реального мира.)
Вопрос 8:
Что такое переменная ? (Есть четыре разных идеи, связанных с переменными в Java. Попробуйте упомяните все четыре аспекта в своем ответе. Подсказка: одним из аспектов является имя переменной.)
Ответ:
Переменная — это ячейка памяти , которой присвоено имя , чтобы ее можно было легко упоминается в программе. Переменная содержит значение , которое должно быть некоторые указали типа . Значение может быть изменено в процессе выполнение программы.
Вопрос 9:
Java — это «платформенно-независимый язык». Что это значит?
Ответ:
Java-программа может быть скомпилирована один раз в программу Java Bytecode. Затем скомпилированную программу можно запустить на любом компьютер с интерпретатором для виртуальной машины Java. Другие языки должны быть перекомпилированы для каждой платформы, на которой они будут работать. Особенность Java в том, что она может выполняться на многих различных типах компьютеры без перекомпиляции.
Вопрос 10:
Что такое «Интернет»? Приведите несколько примеров его использования. (Какие услуги оказывает предоставить?)
Ответ:
Интернет это сеть соединение миллионов компьютеров по всему миру. Компьютеры, подключенные к Интернет может общаться друг с другом. Интернет можно использовать для электронной почты (что позволяет пользователю одного компьютера отправить сообщение пользователю другого компьютера), общий доступ к файлам (который используется для копирования файлов между компьютерами) и World Wide Web (который позволяет пользователю просматривать «страницы» информации, опубликованной на компьютерах по всему миру. Мир).
Как компьютер выполняет код?
Общеизвестно, что код пишется разработчиком и как люди взаимодействуют с компьютерами. Однако задумывались ли вы когда-нибудь о том, как программное обеспечение, такое как код, взаимодействует с компьютерным оборудованием, таким как ЦП (центральный процессор)? Если ответ да, то вы пришли в нужное место.
Чтобы понять, как код выполняется на компьютере, вы должны понимать, что заставляет компьютер работать и как им можно манипулировать. Во-первых, давайте сначала поговорим об основных идеях компьютерного оборудования, прежде чем переходить к программному обеспечению.
Что такое двоичный код?
Двоичный код— это система счисления с основанием 2, которую процессоры и память используют для выполнения кода. Двоичные числа могут быть только 1 или 0, отсюда и их название. Если вы сгруппируете восемь двоичных чисел (00000000), вы получите то, что известно как байт, а одно двоичное число (0) называется битом.
Все логичное в вычислительных машинах начинается с простого переключателя. Простой выключатель имеет два проводника и соединительно-разъединительный механизм. Соединение обоих проводников позволяет течь току, который создает сигнал на другом конце проводника. С другой стороны, если проводники отсоединены, ток не будет течь, а значит, и сигнала не будет.
Изображение предоставлено: 991joseph/Wikimedia CommonsПоскольку переключатель может быть включен или выключен только в определенный момент времени, он представляет собой идеальный механизм для преобразования сигналов высокого и низкого уровня в сигналы прямоугольной формы.
Когда вы щелкаете переключателем, он производит сигнал или один бит данных. Обычная фотография, сделанная со смартфона, будет содержать около пяти мегабайт данных, что соответствует 40 000 000 битам. Это означает, что вам нужно будет щелкнуть переключателем десятки миллионов раз, чтобы получить достаточно данных для одной фотографии, сделанной со смартфона.
Из-за механических ограничений переключателя инженерам требовалось устройство, не имеющее движущихся частей и обеспечивающее более высокую скорость переключения.
Транзисторы, используемые в качестве переключателя Транзистор
. Изображение предоставлено: Evan-Amos/Wikimedia, а изображение прямоугольной волны предоставлено Sponk/Wikimedia.Благодаря открытию легирования (управления электропроводностью полупроводников, таких как кремний), инженеры смогли создать переключатели с электрическим управлением, известные как транзисторы. Это новое изобретение позволило увеличить скорость обработки, для питания которой требовалось небольшое напряжение, что в конечном итоге позволило разместить более миллиарда таких транзисторов в одном современном процессоре.
Что такое архитектура процессора?
Транзисторы затем искусно скомпонованы для создания логических вентилей, полусумматоров, сумматоров, триггеров, мультиплексоров, регистров и различных компонентов, обеспечивающих функционирование ЦП. То, как эти компоненты расположены друг над другом, определяет так называемую архитектуру процессора.
Архитектура ЦП также диктует ISA процессора (Архитектура набора инструкций). ISA содержит встроенный список инструкций, которые ЦП может выполнять изначально. Эти инструкции затем последовательно смешиваются вместе с помощью языка программирования, чтобы создать то, что известно как программа. Обычно в процессоре легко доступны сотни инструкций, включая сложение, вычитание, перемещение, сохранение и загрузку.
Вот пример набора инструкций:
Каждая инструкция в наборе инструкций имеет собственный двоичный адрес, известный как код операции. Код операции будет первыми несколькими двоичными битами, которые сообщают, какую операцию из набора инструкций использовать.
Сборка-инструкция-синтаксисЗа кодом операции следует операнд. Операнд содержит значения и адреса, где будет использоваться код операции.
На схеме показана 8-битная инструкция. Если ЦП имеет 64-битную архитектуру, то инструкции могут иметь ширину до 64 бит, что делает его более производительным процессором.
Связанный с: чем отличаются процессоры RISC и CISC?
Сборщик
Теперь, когда вы понимаете двоичные сигналы, вы можете узнать, как ваш компьютер интерпретирует такие сигналы. То, как следует интерпретировать машинный код, зависит от типа логики, используемой в ассемблере (программа низкого уровня, используемая для декодирования и сборки кода в правильный двоичный код).
Например, если наш ассемблер использует стандарт ASCII (американский стандартный код для обмена информацией), наш ассемблер возьмет данный машинный код и интерпретирует его так же, как из ASCII в таблице ниже.
00101001 | A | 00101111 | G | 00110101 | M | 00111011 | S | 01000001 | Y | ||||||||||||||||||||
00101010 | B | 00110000 | H | 00110110 | N | 00111100 | T | 01000010 | Z | ||||||||||||||||||||
00101011 | C | 00101011011 | C | 001010110110119 | C | 00101011000 | C | 00101011 | C | . 0230 | I | 00110111 | 0 | 00111101 | U | ||||||||||||||
00101100 | D | 00110010 | J | 00111000 | P | 00111110 | V | ||||||||||||||||||||||
00101101 | E | 00110011 | K | 00111001 | Q | 00111111 | W 0 |