Содержание

Компилятор | это… Что такое Компилятор?

Эта статья включает описание термина «Компиляция»; см. также другие значения.

Компиля́тор — программа или техническое средство, выполняющее компиляцию.[1][2][3]

Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера).[2][3][4] Входной информацией для компилятора (исходный код) является описание алгоритма или программа на проблемно-ориентированном языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код).[5]

Компилировать — проводить трансляцию машинной программы с проблемно-ориентированного языка на машинно-ориентированный язык.[3]

Содержание

  • 1 Виды компиляторов[2]
  • 2 Виды компиляции
    [2]
  • 3 Структура компилятора
  • 4 Генерация кода
    • 4. 1 Генерация машинного кода
    • 4.2 Генерация байт-кода
    • 4.3 Динамическая компиляция
    • 4.4 Декомпиляция
  • 5 Раздельная компиляция
  • 6 Интересные факты
  • 7 См. также
  • 8 Примечания
  • 9 Литература

Виды компиляторов

[2]
  • Векторизующий. Транслирует исходный код в машинный код компьютеров, оснащённых векторным процессором.
  • Гибкий. Сконструирован по модульному принципу, управляется таблицами и запрограммирован на языке высокого уровня или реализован с помощью компилятора компиляторов.
  • Диалоговый
    . См.: диалоговый транслятор.
  • Инкрементальный. Повторно транслирует фрагменты программы и дополнения к ней без перекомпиляции всей программы.
  • Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.
  • Компилятор компиляторов. Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.
  • Отладочный. Устраняет отдельные виды синтаксических ошибок.
  • Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.
  • Самокомпилируемый. Написан на том же языке, с которого осуществляется трансляция.
  • Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.

Виды компиляции

[2]
  • Пакетная. Компиляция нескольких исходных модулей в одном пункте задания.
  • Построчная. То же, что и интерпретация.
  • Условная. Компиляция, при которой транслируемый текст зависит от условий, заданных в исходной программе директивами компилятора. Так, в зависимости от значения некоторой константы, можно включать или выключать трансляцию части текста программы.

Структура компилятора

Процесс компиляции состоит из следующих этапов:

  1. Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
  2. Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.
  3. Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
  4. Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
  5. Генерация кода. Из промежуточного представления порождается код на целевом языке.

В конкретных реализациях компиляторов эти этапы могут быть разделены или, наоборот, совмещены в том или ином виде.

Генерация кода

Генерация машинного кода

Большинство компиляторов переводит программу с некоторого высокоуровневого языка программирования в машинный код, который может быть непосредственно выполнен процессором. Как правило, этот код также ориентирован на исполнение в среде конкретной операционной системы, поскольку использует предоставляемые ею возможности (системные вызовы, библиотеки функций). Архитектура (набор программно-аппаратных средств), для которой производится компиляция, называется целевой машиной.

Результат компиляции — исполнимый модуль — обладает максимальной возможной производительностью, однако привязан к определённой операционной системе и процессору (и не будет работать на других).

Для каждой целевой машины (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

Примечания

  1. ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X
  2. 1 2 3 4 5 Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0
  3. 1 2 3 СТ ИСО 2382/7-77 // Вычислительная техника. Терминология. Указ. соч.
  4. Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М.: Русский язык, 1990. — 335 с. — 50 050 (доп,) экз. — ISBN 5-200-01169-3
  5. Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ.
    А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп,) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания)
  6. Н. А. Криницкий, Г. А. Миронов, Г. Д. Фролов. Программирование / Под ред. М. Р. Шура-Бура. — М.: Государственное издательство физико-математической литературы, 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 Ma­chine – вир­ту­аль­ной ма­ши­ной 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

Компилятор — это программа, осуществляющая перевод исходной программы, написанной на входном языке, в эквивалентную ей объектную программу на языке машинных команд или языке ассемблера.

Общие сведения о компиляторах

Компилятором является программный продукт, предназначенный для перевода программы, которая написана на каком-либо языке программирования (исходном языке) в программу на язык ассемблера или в машинные команды. Практически все компиляторы выполняют перевод программы с некоторого высокоуровневого языка программирования в машинные коды, которые могут быть непосредственно исполнены компьютерным оборудованием.

При осуществлении семантического анализа, генерации кода и оптимизации сформированной программы, компилятор обязан пользоваться параметрами главных компонентов исходной программы, то есть, использовать переменные, константы, функции и другие лексические единицы входного языка. Эти параметры компилятор может получить при выполнении синтаксического анализа входной программы (наиболее часто при изучении структуры блоков описаний переменных и констант), а также может их дополнить при подготовке к генерации кода (к примеру, при выделении памяти).

Совокупность характеристик, соответствующих всем компонентам исходной программы, зависит от типа каждого компонента, от его смысла (семантики) и, естественно, от той роли, которую он выполняет в исходной и конечной программах. В каждом конкретном случае эта совокупность характеристик может быть своя, и она зависит от синтаксиса и семантики входного языка, от архитектуры целевой вычислительной системы и от структуры компилятора. Однако существуют стандартные характеристики, присущие некоторым компонентам исходной программы. К примеру, для переменных стандартными характеристиками являются их тип и адрес ячейки памяти, для констант это их значение, для функций это количество и типы формальных аргументов, тип возвращаемого результата, адрес вызова кода функции.

Основной характеристикой каждого компонента исходной программы считается его имя. Именно с именами переменных, констант, функций и других компонентов входного языка работает программист. Это означает, что и компилятор обязан обладать умением выполнять анализ этих компонентов по их именам. Имена всех компонентов должны являться уникальными. Некоторые современные языки программирования могут допускать отсутствие уникальности имен переменных, и функций в зависимости от их области видимости и иных параметров исходной программы.

То есть, задачей компилятора является сохранение некоторой информации, связанной с каждым компонентом исходной программы, и организация доступа к этой информации по имени компонента. Для решения данной задачи компилятор должен организовать специализированные хранилища данных, именуемые таблицами идентификаторов, или таблицами символов. Таблица идентификаторов должна состоять из набора полей данных (записей), каждое из которых должно соответствовать одному компоненту исходной программы. Запись должна содержать всю требуемую компилятору информацию об этом компоненте и может быть пополнена в процессе работы компилятора.

Проектирование компилятора

Компилятор может пополнять записи в таблице идентификаторов при выполнении анализа исходной программы и нахождении в ней новых компонентов, которые требуют помещения в таблицу. Процесс поиска информации в таблице должен выполняться всегда, когда компилятору нужны данные о каком-либо компоненте программы. При этом необходимо отметить, что поиск компонента в таблице осуществляется компилятором значительно чаще, чем размещение в ней новых компонентов. Это объясняется тем, что описания новых компонентов в исходной программе, обычно, попадаются существенно более редко, чем данные компоненты используются. Помимо этого, всем операциям добавления компонентов в таблицу идентификаторов всегда должна предшествовать операция поиска, которая позволяет проверить, что такого компонента в таблице нет.

На любую операцию поиска компонента в таблице компилятор должен затратить время, и, так как, число компонентов в исходной программе может быть достаточно большим (от единиц до сотен тысяч в зависимости от объема программы), то это время способно оказать существенное влияние на общее время компиляции. По этой причине таблицы идентификаторов необходимо организовать таким образом, чтобы у компилятора была возможность максимально оперативно осуществлять поиск требуемой ему записи таблицы по имени компонента, с которым сопряжена данная запись.

Необходимо отметить следующий набор способов организации таблиц идентификаторов:

  1. Способ простых и упорядоченных списков.
  2. Способ бинарного дерева.
  3. Способ хэш — адресации с рехэшированием.
  4. Способ хэш — адресации по методу цепочек.
  5. Комбинированный способ хэш — адресации с ее списком или бинарным деревом.

В самом простом случае таблица идентификаторов выступает в качестве линейного неупорядоченного списка, или массива, все ячейки которого несут информацию о соответствующем компоненте таблицы. Помещение новых компонентов в такую таблицу осуществляется записью информации в очередную ячейку массива или списка по мере нахождения новых компонентов в исходной программе.

Поиск требуемого компонента в таблице будет в таком варианте исполняться путем последовательного перебора всех компонентов и сравнения их имен с именем требуемого компонента, пока не будет обнаружен компонент, имеющий такое же имя. То есть, если за единицу времени будет принято время, которое затрачивается компилятором на операцию сравнения двух строк (в современных вычислительных системах такое сравнение наиболее часто исполняется при помощи одной командой), то для таблицы, имеющей в своем составе 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 Ссылки

Основная функциональность и терминология

Компиля́ция — сборка программы, включающая:

  1. трансляцию всех модулей программы, написанных на одном или нескольких исходных языках программирования высокого уровня и/или языке ассемблера, в эквивалентные программные модули на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)[2][3][4] или непосредственно на машинном языке или ином двоичнокодовом низкоуровневом командном языке;
  2. последующую сборку исполняемой машинной программы, в том числе вставка в программу кода всех функций, импортируемых из статических библиотек и/или генерация кода запроса к ОС на загрузку динамических библиотек, из которых программой функции будут вызываться.

Если компилятор генерирует исполняемую машинную программу на машинном языке, то такая программа непосредственно исполняется физической программируемой машиной (например компьютером). В других случаях исполняемая машинная программа выполняется соответствующей виртуальной машиной.

Входная информация для компилятора есть:

  1. на фазе трансляции: исходный код программы, являющийся описанием алгоритма или программы на предметно-ориентированном языке программирования;
  2. на фазе компоновки: сгенерированные на фазе трансляции файлы объектных кодов модулей программы, а также файлы объектных кодов статических библиотек и данные об используемых динамических библиотеках.

На выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код[5], байт-код).

Компили́ровать — проводить сборку машинной программы, включая:

  1. трансляцию с предметно-ориентированного языка на машинно-ориентированный язык[3],
  2. компоновка исполняемой машинно-ориентированной программы из сгенерированных на фазе трансляции объектных модулей — модулей, содержащих части кода программы на машинно-ориентированного кода программы.

Довольно часто компиляторы с языков высокого уровня выполняют лишь трансляцию исходного кода, компоновку же поручая внешнему компоновщику, — компоновщику, представляющему самостоятельную программу, вызываемую компилятором как внешняя подпрограмма. Вследствие этого компилятор многие считают разновидность транслятора, что неверно…



Виды компиляторов

  • Векторизующий. Базируется на трансляторе, транслирующем исходный код в машинный код компьютеров, оснащённых векторным процессором.
  • Гибкий. Сконструирован по модульному принципу, управляется таблицами и запрограммирован на языке высокого уровня или реализован с помощью компилятора компиляторов.
  • Диалоговый. См.: диалоговый транслятор.
  • Инкрементальный. Пересобирает программу, заново транслируя только изменённые фрагменты программы без перетрансляции всей программы.
  • Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.
  • Компилятор компиляторов. Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.
  • Отладочный. Устраняет отдельные виды синтаксических ошибок.
  • Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.
  • Самокомпилируемый. Написан на том же языке программирования, с которого осуществляется трансляция.
  • Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.

Также все компиляторы условно можно разделить на две группы:

  • Компиляторы с конкретных языков программирования. (Примеры: GCC, gnat, clang, xcode, gfortran.)
  • Компиляторы как системы сборки программ. Таковы например довольно распространенная в UNIX- и Linux-системах система Makefile и распространенная в Windows-системах cmake. Работа последних (например в Makefile) очень часто управляется встроенным входным интерпретируемым языком, на котором и прописывается порядок самой компиляции программы.


Виды компиляции

Виды компиляции[2]:

  • Пакетная. Компиляция нескольких исходных модулей в одном задании.
  • Построчная. Машинный код порождается и затем исполняется для каждой завершённой грамматической конструкции языка. Внешне воспринимается как интерпретация, но имеет иное устройство.
  • Условная. На фазе трансляции результат трансляции зависит от условий, прописанных в исходном транслируемом тексте программы директивами компилятора. (Яркий пример — работа препроцессора языка С и производных от него.) Так, в зависимости от значения некой константы некая транслятор заданную часть транслируемого исходного текста программы транслирует или пропускает (игнорирует).

Структура компилятора

Процесс компиляции состоит из следующих этапов:

  1. Трансляция программы — трансляция всех или только изменённых модулей исходной программы.
  2. Компоновка машинно-ориентированной программы.

Структурные реализации компилятора могут быть следующими:

  1. И транслятор, и компоновщик могут целиком входить в состав компилятора как исполняемые программы.
  2. Компилятор сам выполняет лишь трансляцию компилируемой программы, компоновка же программы выполняется вызываемой компилятором отдельной программой-компоновщиком. Практически все современные компиляторы построены по такой схеме.
  3. Пакет программ, включающий в себя трансляторы с разных языков программирования и компоновщики.

По первой схеме строились самые первые компиляторы, — для современных компиляторов такая схема построения нехарактерна.

По второй схеме построены все без исключения компиляторы с языков высокого уровня. Любой такой компилятор сам выполняет только трансляцию и далее вызывает компоновщик как внешнюю подпрограмму, который и компонует машинно-ориентированную программу. Такая схема построения легко позволяет компилятору работать и в режиме транслятора с соответствующего языка программирования. Это обстоятельство нередко служит поводом считать компилятор разновидностью транслятора, что естественно неверно, — все современные компиляторы такого типа все же выполняют компоновку, пусть и силами вызываемого компилятором внешнего компоновщика, тогда как транслятор сам никогда не выполняет вызов внешнего компоновщика. Но это же обстоятельство позволяет компилятору с одного языка программирования на фазе компоновки включать в программу написанную на одном языке программирования функции-подпрограммы из уже оттранслированных соответствующим транслятором/компилятором, написанные на ином языке программирования. Так в программу на C/C++ можно вставлять функции написанные например на Pascal или Fortran. Аналогично и напротив написанная на C/C++ функции могут быть вставлены в Pascal- или Fortran-программу соответственно. Это было бы невозможно без поддержки многими современными компиляторами генерации кода вызова процедур (функций) в соответствии с соглашениями иных языков программирования. Например современные компиляторы с языка Pascal помимо организации вызова процедур/функций в стандарте самого Pascal поддерживают организацию вызова процедурой/функцией в соответствии с соглашениями языка C/C++. (Например чтобы на уровне машинного кода написанная на Pascal процедура/функция работала с входными параметрами в соответствии с соглашениями языка C/C++, — оператор объявления такой Pascal-процедуры/Pascal-функции должен содержать ключевое слово cdecl.)


Наконец по третьей схеме построены компиляторы, представляющие собой целые системы, включающие в себя трансляторы с разных языков программирования и компоновщики. Также любой такой компилятор может использовать в качестве транслятора любой способный работать в режиме транслятора компилятор с конкретного языка высокого уровня. Естественно такой компилятор может компилировать программу, разные части исходного текста которой написаны на разных языках программирования. Нередко такие компиляторы управляются встроенным интерпретатором того или иного командного языка. Яркий пример таких компиляторов — имеющийся во всех UNIX-системах (в частности в Linux) компилятор make.

Трансляция программы как неотъемлемая составляющая компиляции включает в себя:

  1. Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
  2. Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в древо разбора.
  3. Семантический анализ. На этой фазе древо разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их объявлениям, типам данных, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным древом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
  4. Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
  5. Генерация кода. Из промежуточного представления порождается код на целевом машинно-ориентированном языке.

Генерация кода

Генерация машинного кода

Большинство компиляторов переводит программу с некоторого высокоуровневого языка программирования в машинный код, который может быть непосредственно выполнен физическим процессором. Как правило, этот код также ориентирован на исполнение в среде конкретной операционной системы, поскольку использует предоставляемые ею возможности (системные вызовы, библиотеки функций). Архитектура (набор программно-аппаратных средств), для которой компилируется (собирается) машинно-ориентированная программа, называется целевой машиной.

Результат компиляции — исполнимый программный модуль — обладает максимально возможной производительностью, однако привязан к конкретной операционной системе (семейству или подсемейству ОС) и процессору (семейству процессоров) и не будет работать на других.

Для каждой целевой машины (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] (так как в тот момент программой считался только машинный код, а «программирующая программа» была способна из человеческого текста сделать машинный код, то есть запрограммировать ЭВМ).

Примечания

  1. ↑ ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.; см. также ГОСТ 19781-90
  2. 1 2 3 4 Першиков, 1991.
  3. 1 2 3 Вычислительная техника.
  4. Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М. : Русский язык, 1990. — 335 с. — 50 050 (доп.) экз. — ISBN 5-200-01169-3.
  5. ↑ Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп.) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
  6. Н. А. Криницкий, Г. А. Миронов, Г. Д. Фролов. Программирование / Под ред. М. Р. Шура-Бура. — М.: Государственное издательство физико-математической литературы, 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

Если оператор языка ассемблера отображается при трансляции чаще всего в одну машинную инструкцию, предложения языков более высокого уровня отображаются

Ответ:

&nbsp(1) в одну машинную инструкцию&nbsp

&nbsp(2) в несколько машинных инструкций&nbsp

&nbsp(3) в пустую машинную инструкцию&nbsp

&nbsp(4) в произвольную машинную инструкцию&nbsp



Номер 2

Трансляторы бывают следующих типов:

Ответ:

&nbsp(1) compiler&nbsp

&nbsp(2) interpreter&nbsp

&nbsp(3) analysis&nbsp

&nbsp(4) synthesis&nbsp



Номер 3

Какая часть компилятора разбивает исходную программу на составляющие ее элементы и создает промежуточное представление исходной программы:

Ответ:

&nbsp(1) analysis&nbsp

&nbsp(2) synthesis&nbsp

&nbsp(3) interpreter&nbsp

&nbsp(4) begin&nbsp



Упражнение 2:


Номер 1

Можно сказать, что результатом работы интерпретатора является:

Ответ:

&nbsp(1) «программа»&nbsp

&nbsp(2) «код»&nbsp

&nbsp(3) «число»&nbsp

&nbsp(4) «исполняемый файл»&nbsp



Номер 2

Для интерпретатора верны следующие утверждения:

Ответ:

&nbsp(1) анализирует программу на входном языке&nbsp

&nbsp(2) создает промежуточное представление&nbsp

&nbsp(3) не создает никакой новой программы&nbsp

&nbsp(4) выполняет операции, содержащиеся в тексте программы&nbsp



Номер 3

Цепочка символов, составляющая исходную программу на языке программирования является:

Ответ:

&nbsp(1) входом компилятора &nbsp

&nbsp(2) выходом компилятора&nbsp

&nbsp(3) процессом компиляции&nbsp

&nbsp(4) процессом интерпретации&nbsp



Упражнение 3:


Номер 1

Крайне важной частью процесса трансляции является:

Ответ:

&nbsp(1) исправление ошибок, допущенных во входной программе&nbsp

&nbsp(2) игнорирование ошибок, допущенных во входной программе&nbsp

&nbsp(3) точная диагностика ошибок, допущенных во входной программе&nbsp



Номер 2

Объектная программа может быть:

Ответ:

&nbsp(1) последовательностью абсолютных машинных команд&nbsp

&nbsp(2) последовательностью перемещаемых машинных команд&nbsp

&nbsp(3) программой на языке ассемблера&nbsp

&nbsp(4) программой на некотором другом языке&nbsp



Номер 3

Создание единого перемещаемого объектного сегмента из набора различных сегментов осуществляется программой, которая называется:

Ответ:

&nbsp(1) редактором сегментов&nbsp

&nbsp(2) редактором связей&nbsp

&nbsp(3) редактором объектов&nbsp

&nbsp(4) редактором наборов&nbsp



Упражнение 4:


Номер 1

Подход при котором применяется трансляция программы в ассемблер:

Ответ:

&nbsp(1) упрощает конструирование компилятора&nbsp

&nbsp(2) сокращает технологическую цепочку выполнения программы&nbsp

&nbsp(3) удлиняет технологическую цепочку выполнения программы&nbsp

&nbsp(4) усложняет конструирование компилятора&nbsp



Номер 2

Преимуществами трансляции в ассамблер являются:

Ответ:

&nbsp(1) уровень ассемблера выше, чем у машинного кода&nbsp

&nbsp(2) использование ассемблера позволяет отследить целый ряд ошибок&nbsp

&nbsp(3) порождаемый текст на ассемблере значительно читабельней, чем машинный код&nbsp



Номер 3

Для представления компилятора мы можем использовать так называемые:

Ответ:

&nbsp(1) P-диаграммы&nbsp

&nbsp(2) T-диаграммы&nbsp

&nbsp(3) R-диаграммы&nbsp

&nbsp(4) S-диаграммы&nbsp

&nbsp(5) E-диаграммы&nbsp

&nbsp(6) D-диаграммы&nbsp



Упражнение 5:


Номер 1

Написание компилятора может потребоваться в следующих условиях:

Ответ:

&nbsp(1) для различных языков&nbsp

&nbsp(2) для целевых платформ&nbsp

&nbsp(3) при создании новой компьютерной архитектуры&nbsp



Номер 2

Методиками разработки компиляторов являются следующие:

Ответ:

&nbsp(1) метод раскрутки&nbsp

&nbsp(2) метод генерации&nbsp

&nbsp(3) использование кросс-трансляторов&nbsp

&nbsp(4) использование виртуальных машин&nbsp

&nbsp(5) компиляция «на лету»&nbsp



Номер 3

В каком году Вирт написал с использованием раскрутки транслятор языка Pascal:

Ответ:

&nbsp(1) 1969&nbsp

&nbsp(2) 1970&nbsp

&nbsp(3) 1971&nbsp

&nbsp(4) 1972&nbsp

&nbsp(5) 1973&nbsp



Упражнение 6:


Номер 1

Для  того, чтобы справиться с проблемой большой потери времени при написании и отладке компилятора на языке ассемблера был разработан:

Ответ:

&nbsp(1) метод раскрутки&nbsp

&nbsp(2) метод упаковки&nbsp

&nbsp(3) метод генерации&nbsp

&nbsp(4) метод распаковки&nbsp



Номер 2

Под переносимой (portable) программой понимается программа, которая:

Ответ:

&nbsp(1) может без перетрансляции выполняться на одной платформе&nbsp

&nbsp(2) не может без перетрансляции выполняться на нескольких платформах&nbsp

&nbsp(3) может без перетрансляции выполняться на нескольких платформах&nbsp



Номер 3

Компиляторы генерирующие объектную программу на языке более высокого уровня, чем язык ассемблера называют:

Ответ:

&nbsp(1) конвертерами&nbsp

&nbsp(2) генераторами&nbsp

&nbsp(3) кросс-компиляторами&nbsp

&nbsp(4) исполнителями&nbsp



Упражнение 7:


Номер 1

Одна из первых широко известных виртуальных машин была разработана в 70-х годах Н.  Виртом:

Ответ:

&nbsp(1) при написании компилятора Pascal-P&nbsp

&nbsp(2) при написании компилятора Pascal&nbsp

&nbsp(3) при написании компилятора Simula-P&nbsp

&nbsp(4) при написании компилятора Simula&nbsp



Номер 2

Сегодня идея виртуальных машин приобрела широкую известность благодаря языку:

Ответ:

&nbsp(1) Java&nbsp

&nbsp(2) C++&nbsp

&nbsp(3) C&nbsp

&nbsp(4) Fortran&nbsp



Номер 3

Компиляторы языка Java генерируют:

Ответ:

&nbsp(1) бит-код&nbsp

&nbsp(2) объектный код&nbsp

&nbsp(3) байт-код&nbsp



Упражнение 8:


Номер 1

Для того, чтобы увеличить скорость работы приложений, была разработана технология:

Ответ:

&nbsp(1) compiling&nbsp

&nbsp(2) Just-In-Time compiling&nbsp

&nbsp(3) Just compiling&nbsp

&nbsp(4) Fats compiling&nbsp



Номер 2

Использование какой связки позволяет заметно повысить скорость выполнения исходной программы:

Ответ:

&nbsp(1) «компилятор+интерпретатор+JIT-компилятор»&nbsp

&nbsp(2) «интерпретатор+JIT-компилятор»&nbsp

&nbsp(3) «компилятор+интерпретатор»&nbsp

&nbsp(4) «компилятор+интерпретатор+JIT-компилятор+интепретатор»&nbsp



Номер 3

Процесс создания компилятора можно свести к решению нескольких задач, которые принято называть:

Ответ:

&nbsp(1) compilation steps&nbsp

&nbsp(2) compilation phases&nbsp

&nbsp(3) compilation rounds&nbsp

&nbsp(4) compilation stages&nbsp



Упражнение 9:


Номер 1

Обычно компилятор состоит из следующих фаз:

Ответ:

&nbsp(1) лексический анализ&nbsp

&nbsp(2) синтаксический анализ&nbsp

&nbsp(3) видозависимый анализ&nbsp

&nbsp(4) оптимизация&nbsp

&nbsp(5) генерация кода&nbsp



Номер 2

В разборе входной цепочки и выделении некоторых более "крупных" единиц, которые удобнее для последующего разбора заключается задача:

Ответ:

&nbsp(1) фазы синтаксического анализа&nbsp

&nbsp(2) фазы видозависимого анализа&nbsp

&nbsp(3) фазы генерации кода&nbsp

&nbsp(4) фазы лексического анализа&nbsp



Номер 3

На этапе лексического анализа обычно выполняются такие действия, как:

Ответ:

&nbsp(1) удаление комментариев&nbsp

&nbsp(2) обработка директив условной компиляции&nbsp

&nbsp(3) игнорирование комментариев&nbsp

&nbsp(4) обработка операторов&nbsp



Упражнение 10:


Номер 1

После синтаксического анализа можно считать, что исходная программа преобразована:

Ответ:

&nbsp(1) в некоторое промежуточное представление&nbsp

&nbsp(2) в некоторое промежуточное состояние&nbsp

&nbsp(3) в объектное представление&nbsp

&nbsp(4) в исполняемый файл&nbsp



Номер 2

В дереве разбора программы внутренние узлы соответствуют:

Ответ:

&nbsp(1) операциям&nbsp

&nbsp(2) операндам&nbsp

&nbsp(3) классам&nbsp

&nbsp(4) подклассам&nbsp



Номер 3

Видозависимый анализ иногда называют:

Ответ:

&nbsp(1) semantic analysis&nbsp

&nbsp(2) syntax analysis&nbsp

&nbsp(3) lexical analysis&nbsp

&nbsp(4) code optimization&nbsp



Упражнение 11:


Номер 1

Обязательность описания переменных может служить примером:

Ответ:

&nbsp(1) предварительных условий&nbsp

&nbsp(2) контекстных условий&nbsp

&nbsp(3) дополнительных условий&nbsp

&nbsp(4) временных условий&nbsp



Номер 2

Наиболее распространенными оптимизациями являются:

Ответ:

&nbsp(1) константные вычисления&nbsp

&nbsp(2) уменьшение силы операций&nbsp

&nbsp(3) выделение общих подвыражений&nbsp

&nbsp(4) чистка циклов&nbsp



Номер 3

На этапе генерации кода необходимо решить множество следующих сопутствующих проблем:

Ответ:

&nbsp(1) распределение памяти&nbsp

&nbsp(2) распределение регистров&nbsp

&nbsp(3) распределение блоков&nbsp

&nbsp(4) распределение стеков&nbsp



Упражнение 12:


Номер 1

Какие фазы иногда объединяют вместе под названием front-end?

Ответ:

&nbsp(1) лексический анализ&nbsp

&nbsp(2) синтаксический анализ&nbsp

&nbsp(3) видозависимый анализ&nbsp

&nbsp(4) некоторые оптимизации&nbsp



Номер 2

Процесс обработки всего, возможно, уже преобразованного, текста исходной программы называется:

Ответ:

&nbsp(1) passes&nbsp

&nbsp(2) control&nbsp

&nbsp(3) analysis&nbsp

&nbsp(4) audit&nbsp



Номер 3

Backpatching - это:

Ответ:

&nbsp(1) внутренний интерфейс&nbsp

&nbsp(2) техника «заплат»&nbsp

&nbsp(3) внешний интерфейс&nbsp

&nbsp(4) тестирование программы&nbsp



Главная / Программирование / Разработка компиляторов / Тест 3

Создание, компиляция и запуск простой программы

Ключ к успешному завершению лабораторных работ — внимательно прочитать инструкции.
Возьмите за привычку читать каждое слово — не пропускайте ни одного текста.

Онлайн-лаборатории

В течение некоторого времени мы будем проводить лабораторные работы онлайн с помощью Zoom. Как правило, вы будете работать в комнате обсуждения со случайно назначенным партнер. Даже если вы находитесь в комнате отдыха с кем-то еще, вам все равно нужно свою индивидуальную работу. Но, конечно, было бы неплохо пройти через лаборатория вместе.

  • Вас поощряют (и ожидают) просить и получать помощь на протяжении всей лаборатории от вашего партнера в комнате отдыха. Вы можете нажать «попросить о помощи», чтобы привлечь внимание инструктора, который затем приходите в комнату. Но имейте в виду, они могут помогать кому-то другому (или несколько человек) во-первых.
  • Если вы по какой-либо причине не присутствуете на фактическом лабораторном дне, вы по-прежнему несет ответственность за завершение работы и сдачу ее в срок.
  • Поскольку вы все еще выполняете свою собственную работу, вам все равно нужно будет отправить собственный код для каждой лаборатории, независимо от того, работали вы с партнером или нет.

Часть 1. Вычислительная среда в вашем ноутбуке

Страница настройки системы является вашей отправной точкой. обратиться за помощью в том, как использовать вычислительную среду и выполнять задачи для этот класс.

Часть 2: Редактор

Выберите редактор

Мы будем использовать среду Unix для создания, компиляции и компоновки и выполнять программы на С++. Во-первых, вы должны выбрать текстовый редактор для создания ваша первая программа на C++. Звучит легко, правда? Неправильный! Ваш выбор текстового редактора запомнится вам на всю жизнь. Выбирай с умом!

  • атом — новый красивый редактор ← полезно для начинающих программистов
  • ви / вим / гвим — легкий и мощный текстовый редактор. ← Рекомендуемый выбор доктора Чоя!
  • emacs — многофункциональный текстовый редактор. ← Рекомендуемый выбор Ричарда Столлмана!

Часть 3: Ваша первая программа

  1. Откройте окно терминала Linux (Ubuntu). В WSL это означает открытие Windows Терминал (убедитесь, что на вкладке есть пингвин!) или, если вы не смогли его получить установлено, работает wsl со стартовой панели.
  2. Вы должны увидеть приглашение вроде
     m012345@WK2ESUIO4MID:~$

    На самом деле это полезная информация! В этом пример:

    • m012345 — ваше имя пользователя (должно совпадать с вашим USNA). имя пользователя)
    • WK2ESUIO4MID — имя вашего компьютера (извините, ITSD не любит давать красивое имя вашему ноутбуки)
    • Текущий каталог ~ . тильда ~ указывает ваш домашний каталог , который база, в которой будут храниться все ваши личные файлы Линукс.
  3. Тип

     лс 
    чтобы увидеть содержимое вашего текущего каталога. Ты должно увидеть что-то вроде
     Загрузка рабочего стола bin si204 

    The Desktop и Downloads являются ссылками на те папки в винде, а si204 это ссылка на точно такую ​​же папка под названием si204 на рабочем столе.

  4. Конечно каталог si204 имеет место быть! Чтобы перейти в это тип каталога
     cd si204 

    Обратите внимание, что ваше приглашение изменилось, чтобы указать, что вы сейчас находитесь в другом каталог!

  5. Рекомендуется всегда начинать и заканчивать любой период времени. работа, которую вы делаете, синхронизируясь с git. Более подробно об этом ниже, но для теперь вам просто нужно запустить:

     204синхронный 
  6. Теперь мы хотим создать новый каталог для хранения ваших файлов для lab01, используя команду «mkdir» и, наконец, перейдите в этот новый каталог:
    мкдир lab01
    компакт-диск lab01
     
  7. Откройте нужный текстовый редактор.
    • Для Atom (который работает в Windows):
      1. Откройте Atom при запуске Windows меню
      2. В Atom перейдите в папку lab01 , которая находится под Desktop/si204 и создайте (и сохраните) файл с именем main.cpp .
    • Если вы используете vi, в вашем терминале:
       gvim main.cpp& 
      (Попробуйте немного узнать о Vim: шпаргалка Vim, интерактивный учебник по Vim, Вим Введение и руководство)
    • Если вы используете emacs,
       emacs main.cpp и 
      (Попробуйте немного узнать о emacs: Emacs Essentials, большой список команд, а гораздо больший список команд)
  8. Теперь используйте текстовый редактор, чтобы скопировать следующий исходный код в файл main.cpp:
     #include 
    основной ()
    {
      std::cout << "Привет, мир!" << стд::эндл;
      вернуть 0;
    }
     
    Когда закончите, сохраните файл.
  9. Компиляция (и ссылка)

    Если вы хотите, чтобы программы, которые вы пишете, действительно выполняли что-то, то вы должны их скомпилировать (превратить исходный код в машинный язык). Преобразование исходного кода высокого уровня C++ в машинный язык очень сложно, но производители компиляторов решают эту проблему за вас.

    Чтобы скомпилировать вашу программу,

    В вашем рабочем каталоге должен быть новый файл с именем m012345. Проверьте это, набрав:
     лс 

    Если опустить "-o m012345", что мы будем часто делать, то файл с именем по умолчанию "a.out". Пытаться:

     g++ main.cpp
    
    лс Новые файлы m012345 и a.out являются «исполняемым файлом» для вашей программы.

    Если вы видите какие-либо сообщения об ошибках от g++ , обратитесь за помощью от инструктора. Советы по расшифровке сообщений об ошибках приведены ниже на конец этого урока.

    Примечание: технически единственная команда, которую вы ввели, на самом деле "скомпилирована" и "связали" вашу программу. Об этом мы поговорим гораздо позже, но вкратце "связывание" (среди прочего) берет ваш код и объединяет его с другим кодом, предоставленным в другом месте, для выполнения стандартных действий, таких как ввод и вывод (на это ссылается строка #include в вашем код). Часто мы неофициально называем весь этот процесс «компиляцией».

  10. Беги!

    После того, как вы успешно скомпилировали и связали свою программу (без ошибок), то вы готовы выполнить свою программу. В вашем текущем рабочий каталог, вы увидите новый файл с именем m012345 (или как бы вы его ни назвали). Это ваша программа. Чтобы выполнить файл, введите имени файла, которому предшествует "точечная косая черта" (буквально "./") , и нажмите Enter ключ.

    Примечание: «косая черта» указывает компьютеру искать программу (m012345). в текущем каталоге (обозначается точкой) .
  11. Выход программы:

    Ваша программа будет выводить на тот же терминал, с которого он был выполнен, как показано выше.

    Теперь давайте посмотрим на исполняемый файл, который вы только что запустили. Тип

     лс-л 
    чтобы перечислить детали содержимого вашего текущего рабочего каталога.
    • Существует файл с именем main.cpp — это ваш файл исходного кода . Обратите внимание размер файла (в нашем примере 95 байт).
    • Файл с именем m012345 является вашим программа исполняемый файл , который объединяется со всеми остальными необходимыми машинный код для запуска вашей программы. Обратите внимание на размер (7782 байта в нашем примере)!! Увеличение размера связано с кодом, который был «включен» или связаны с вашей программой.

Часть 4: Давайте повторим все сначала!

Вы только что достигли довольно многого; вы набрали C++ программу, скомпилировал ее и запустил. Важно что вы понимаете все необходимые шаги, и что вы удобно использовать текстовый редактор и терминал.

Повторите часть 3 этой лабораторной работы еще раз со следующими изменениями:

  1. Сначала закройте все открытые окна (включая редактор и терминал).
  2. Откройте терминал и "cd" на правильный каталог для lab01.
  3. Вместо входа в программу "Hello World" введите это простое дополнение программы (назовите исходный файл add.cpp вместо main.cpp ):
    add.cpp пример запуска
     // (Ваше имя и альфа)
    // Эта программа складывает два числа
    #include <иопоток>
    основной ()
    {
      целое число1, число2, сумма;
      число1 = 12;
      число2 = 13;
      сумма = число1 + число2;
      станд::каут 
    ~/$ ./добавить
    Сумма этих двух целых чисел равна 25 
    .
  4. Скомпилируйте свою программу, дав исполняемому файлу имя , добавьте .
    • Итак, что вам нужно изменить при компиляции вашей программы?
    • См. Часть 5 ниже, если у вас есть ошибки при компиляции.
  5. Запустите вашу программу и убедитесь, что она распечатывает правильный ответ! Исправьте, если не так!

Часть 5: Исправление ошибок при компиляции

Как читать сообщение об ошибке

Когда вы совершаете определенные распространенные ошибки ( синтаксические ошибки ), компилятор не сможет понять вашу программу и выдаст ошибку операторы в окне терминала.

  • Каждое сообщение об ошибке содержит номер, который представляет номер строки ошибки. Перейдите к этому номеру строки, чтобы увидеть, где проблема в.
  • Каждая синтаксическая ошибка должна быть исправлена ​​до того, как программа будет компилировать. Иногда ясно, что не так, а иногда у вас может возникнуть трудно понять, как исправить синтаксическую ошибку.

Наконечники

Вы улучшитесь, когда увидите достаточно ошибок, чтобы связать сообщения с ошибка синтаксиса. Вот несколько простых советов:

  • Сохранить программных файлов перед компиляцией
  • Если ошибка отмечена в строке, которая выглядит идеально хорошо, иногда это , предшествующая строке , которая испорчена. Проверьте это тоже!
  • Проверить отсутствие или избыток ; и } символов
  • Скомпилируйте вашу программу из небольших фрагментов . Не ждите, чтобы скомпилировать код, пока не завершите всю программу.
    • Когда вы пишете какой-то чанк, попробуйте его скомпилировать и исправить ошибки для чанка.
    • Если исправить все ошибки чанка, то добавить еще несколько чанков.
    Таким образом, вы можете сосредоточиться на ошибках в небольшом участке кода. Ожидание компилировать до тех пор, пока вся программа не будет завершена, может привести к большому количеству ошибки.
  • Сообщения с текстом «Невозможно преобразовать из... в ..." обычно означает, что вы пытаетесь назначить неправильный тип для переменная.
  • Проверьте свои опечатки. Распространенная ошибка — называть переменная одна вещь, но неправильно пишется или используйте какой-нибудь другой имя позже.
  • Иногда одна простая проблема может привести к тому, что компилятор найти массу ошибок (например, забыть включить использование пространство имен стандартное;. Исправление одной строки может сделать все эти ошибки уходят!

    Если вы скомпилируете и увидите необычно большое количество ошибок не паникуйте. Часто простое изменение исправит их.

  • Если вы не можете понять, что не так - СПРАШИВАЙТЕ!!!

Намеренные ошибки: Не пропускайте эту часть!

Здесь очень помогает опыт и практика. Таким образом, для каждого из приведенных ниже намеренно сделать синтаксическую ошибку в вашей текущей программе и попытаться скомпилировать чтобы узнать, что это за сообщение об ошибке. Исправьте ошибку перед введением следующую ошибку в вашу программу (например, добавляйте только ОДНУ ОШИБКУ за раз). Иди медленно и обратите внимание, это сэкономит вам время позже!

  • убрать точку с запятой.
  • заменить "<<" на ">>".
  • измените переменную number1 на Number1.
  • удалить окончание }.
  • удалите строку "#include ".
  • заменить "std" на "std::cout"

Часть 6: Напишите код для отправки (выполните эту часть на ноутбуке)

  1. В терминале Windows перейдите к ~/si204/lab01.
  2. Создайте lab01.cpp следующим образом:
     #include 
    основной ()
    {
       станд::каут 
  3. Измените программу lab01.cpp, чтобы ее выходные данные соответствовали показанному. в яблочко!
    требуемый вывод
    Привет, мир!
    Здравствуй, Солнечная система!
    Здравствуй Галактика!
    Здравствуй Вселенная!
    Привет ... ?
    Это 1!
    Это 2!
    Это 3!
    Это 4!
    Это 5! 

    Используйте команды редактора: Ваше внимание сосредоточено на использовании редактора для внесения этих изменений как максимально эффективно! Другими словами, конечно, вы можете это сделать, я хочу вам сосредоточиться на том, чтобы делать это умно!

    Это почти головоломка, чтобы использовать как можно меньше нажатий клавиш. В частности, какие команды редактора будут делать следующее?

    • Скопировать строку
    • Паста
    • Удалить (или заменить) слово
Отправьте этот lab01.
cpp в систему отправки
  1. Перейдите в каталог, содержащий файл lab01.cpp.
     компакт-диск ~/si204/lab01 
  2. Отправьте свою программу, введя следующую команду:
     ~/bin/submit -c=SI204 -p=lab01 lab01.cpp 
  3. Важно: С помощью веб-браузера проверьте отправку 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 в таблице ниже.

9028 9028 9028 9028
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 080227 00101110 F 00110100 L 00111010 R 0100000 x 0 x 0 x 0 x 0. интерпретируется как один символ. Ассемблер берет этот байт и интерпретирует его в соответствии с заданными стандартами. Например, 01000001 01101001 01010100 переводится как «бит».

Понимание языка ассемблера

Язык ассемблера

— это удобочитаемый язык программирования низкого уровня, который напрямую манипулирует кодами операций и операндами архитектуры ЦП.

Вот пример простого ассемблерного кода, использующего показанный ранее набор инструкций:

 1. LODA #5 
2. LODB #7
3. ADD R3
4. STRE M12

Этот блок кода хранится в ОЗУ до тех пор, пока ЦП не выберет каждую строку кода одну за другой.

Цикл выборки, декодирования и выполнения ЦП

ЦП выполняет код в цикле, известном как выборка, декодирование и выполнение. Эта последовательность показывает, как процессор обрабатывает каждую строку кода.

Выборка: Счетчик инструкций в ЦП берет одну строку инструкции из ОЗУ, чтобы сообщить ЦП, какую инструкцию выполнять следующей.

Декодирование: Ассемблер декодирует удобочитаемый блок кода и собирает его в правильно отформатированные двоичные файлы для понимания компьютером.

 1. 00010101 
2. 00100111
3. 00110011
4. 01011100

Выполнение: Затем ЦП выполняет двоичные файлы, применяя инструкции, указанные кодом операции, к предоставленным операндам.

Компьютер выполнит это следующим образом:

  1. Загрузить первый регистр с 5
  2. Загрузить второй регистр с 7
  3. 5 + 7 = 12, сохранить 12 в третьем регистре
  4. Сохранить значение третьего регистра по адресу RAM M12

Компьютер успешно сложил два числа и сохранил значение по указанному адресу ОЗУ.

Отлично! Теперь вы знаете, как компьютер выполняет код. Однако это не останавливается на достигнутом.

Идем дальше

При наличии надлежащего оборудования, ассемблера и языка ассемблера люди могли выполнять код с достаточной легкостью. Однако по мере того, как и программы, и компьютерное оборудование становились все более сложными, инженерам и программистам приходилось думать, как сделать программирование менее утомительным и обеспечить совместимость с различными типами архитектуры ЦП. Таким образом создание компиляторов и интерпретаторов.

Что такое компилятор и интерпретатор?

Компилятор и интерпретатор — это трансляционные программы, которые берут исходный код (программы, созданные на языках программирования высокого уровня) и переводят их на язык ассемблера, который затем ассемблер декодирует в двоичный код.

Интерпретатор возьмет одну строку кода и немедленно выполнит ее. Обычно это используется на терминалах, таких как терминал Linux Bash Shell и терминал Windows PowerShell. Отлично подходит для выполнения простых разовых задач.

Кредит изображения: Rlistmedia/Wikimedia Common

Напротив, компилятор возьмет несколько строк кода и скомпилирует их для создания программы. Примерами таких программ могут быть Microsoft Word, Photoshop, Google Chrome, Safari и Steam.

С созданием компиляторов и интерпретаторов были созданы языки программирования высокого уровня.

Языки программирования высокого уровня

Языки программирования высокого уровня — это любой язык после кода ассемблера. Некоторые из этих языков, с которыми вы, возможно, знакомы, — это C, Python, Java и Swift. Эти языки программирования сделали программирование более удобочитаемым и простым, чем язык ассемблера.

Вот сравнение, иллюстрирующее, насколько сложнее программировать на ассемблере, чем на языке программирования высокого уровня, таком как Python:

Оба кода будут печатать «Hello World».

С помощью этих языков программирования разработчики могут программировать игры, веб-сайты, приложения и драйверы с разумными затратами времени.

Связано: Python против Java: лучший язык на 2022 год

Компьютеры могут выполнять все виды кода

Компьютер — это устройство, которое может читать только двоичные файлы. Эти двоичные файлы создаются более чем миллиардом транзисторов микроскопических размеров, упакованных внутри процессора. Расположение транзисторов диктует ISA ЦП (архитектуру набора инструкций), которая предоставляет сотни инструкций, которые ЦП может легко выполнить, как только его код операции вызывается через код. Разработчики последовательно смешивают и сопоставляют эти инструкции, что создает целую программу, такую ​​как игровые движки, веб-браузеры, приложения и драйверы.

ЦП выполняет код в последовательности, известной как цикл выборки, декодирования, выполнения. Как только фрагмент кода загружается в ОЗУ, ЦП извлекает его содержимое один за другим, декодирует содержимое в двоичный файл с помощью ассемблера, а затем выполняет код.

Поскольку ассемблер может транслировать только код, созданный специально для архитектуры ЦП, компиляторы и интерпретаторы были построены поверх ассемблера (во многом как адаптер) для работы с различными типами архитектуры ЦП. Интерпретатор возьмет одну команду и немедленно выполнит ее. Напротив, компилятор возьмет все ваши команды и скомпилирует их в программу многократного использования.

Языки программирования высокого уровня, такие как Python, C и Java, были созданы, чтобы сделать программирование проще, быстрее и удобнее. Подавляющему большинству программистов больше не нужно кодировать на языке ассемблера, поскольку их простые в использовании языки программирования высокого уровня могут быть преобразованы в ассемблере с помощью компилятора.

Надеюсь, теперь вы лучше понимаете основы работы компьютеров и то, как они выполняют код.

CodeGuru: мышление на C++

CodeGuru: мышление на C++
Мышление Брюса Экеля на C++, 2-е изд. Содержание | Предыдущий | Следующий

Все компьютерные языки переводятся с чего-то, что, как правило, легко для человек понимает( источник код ) в то, что выполняется на компьютере ( машина инструкции ). Традиционно переводчики делятся на два класса: переводчики а также компиляторы .

Переводчики

Ан интерпретатор переводит исходный код в действия (которые могут состоять из групп машинных инструкций) и немедленно выполняет эти действия. ОСНОВНОЙ, для например, был популярным интерпретируемым языком. Традиционный БЕЙСИК интерпретаторы переводят и выполняют одну строку за раз, а затем забывают, что строка переведена. Это делает их медленными, так как они должны повторно переводить любой повторяющийся код. BASIC также был скомпилирован для ускорения. Более современный интерпретаторы, например, для языка Perl, переводят всю программу на промежуточный язык, который затем выполняется гораздо более быстрым интерпретатором [14].

Переводчики имеют много преимуществ. Переход от написания кода к его выполнению практически мгновенно, а исходный код всегда доступен, поэтому интерпретатор может быть гораздо более конкретным, когда возникает ошибка. Часто упоминаемые преимущества интерпретаторы - это простота взаимодействия и быстрое развитие (но не обязательно выполнение) программ.

Интерпретированный языки часто имеют серьезные ограничения при создании больших проектов (Perl похоже, это исключение). Интерпретатор (или сокращенная версия) должен всегда быть в памяти для выполнения кода, и даже самый быстрый интерпретатор может ввести неприемлемые ограничения скорости. Большинство интерпретаторов требуют, чтобы полный исходный код может быть перенесен в интерпретатор сразу. Мало того, что это вводит ограничение по пространству, это также может вызвать более сложные ошибки, если язык не предоставляет средств для локализации эффекта различных кусочки кода.

Компиляторы

А компилятор переводит исходный код непосредственно на язык ассемблера или на машинный инструкции. Конечным конечным продуктом является файл или файлы, содержащие код. Это сложный процесс, который обычно состоит из нескольких шагов. переход от написания кода к его выполнению значительно дольше с компилятор.

В зависимости судя по проницательности автора компилятора, программы, созданные компилятором, имеют тенденцию требуют гораздо меньше места для запуска, и они работают гораздо быстрее. Хотя размер и скорость, вероятно, являются наиболее часто упоминаемыми причинами использования компилятора, в во многих ситуациях они не являются наиболее важными причинами. Некоторые языки (например, C) предназначены для компиляции частей программы. независимо. Эти части в конечном итоге объединяются в окончательный исполняемый файл программу с помощью инструмента, называемого линкер . Этот процесс называется отдельный компиляция .

Отдельный компиляция имеет много преимуществ. Программа, которая, взятая сразу, превзошла бы пределы компилятора или среды компиляции могут быть скомпилированы в частей. Программы можно создавать и тестировать по частям. Как только кусок работает, его можно сохранить и рассматривать как строительный блок. Коллекции проверенных и рабочие части могут быть объединены в библиотеки для использования другими программистами. По мере создания каждого произведения сложность другие части скрыты. Все эти функции поддерживают создание больших программ [15].

Компилятор отладка характеристики со временем значительно улучшились. Ранние компиляторы генерировали только машинный код, и программист вставил операторы печати, чтобы увидеть, что было продолжается. Это не всегда эффективно. Современные компиляторы могут вставлять информацию об исходном коде в исполняемую программу. Эта информация используется мощный исходный уровень отладчики чтобы точно показать, что происходит в программе, отслеживая ее ход через исходный код.

Некоторые компиляторы решают проблему скорости компиляции, выполняя в памяти компиляция . Большинство компиляторов работают с файлами, читая и записывая их на каждом шаге программы. процесс компиляции. Компиляторы в памяти хранят программу в оперативной памяти. Для маленьких программ, это может показаться таким же отзывчивым, как интерпретатор.

процесс компиляции

Кому программировать на C и C++, вам необходимо понимать шаги и инструменты в процесс компиляции. Некоторые языки (в частности, C и C++) запускаются компиляция путем запуска препроцессор на исходный код. Препроцессор — это простая программа, которая заменяет шаблоны в исходном коде с другими шаблонами, определенными программистом (используя препроцессор директивы ). Директивы препроцессора используются для экономии набора текста и повышения читабельности. кода (позже в книге вы узнаете, как устроен C++). предназначена для того, чтобы препятствовать большей части использования препроцессора, так как это может вызвать тонкие баги). Предварительно обработанный код часто записывается в промежуточный файл.

Компиляторы обычно делают свою работу за два прохода. Первый проход разборов предварительно обработанный код. Компилятор разбивает исходный код на небольшие блоки и организует его в структуру, называемую дерево . В выражении « А + Б ” элементы ' А ’, ‘ + ’ а также ' Б ’ являются листьями дерева синтаксического анализа.

А глобальный оптимизатор иногда используется между первым и вторым проходами для получения меньших, более быстрый код.

В второй проход, т. код генератор просматривает дерево синтаксического анализа и генерирует либо код на языке ассемблера, либо машинный код для узлов дерева. Если генератор кода создает сборку код, ассемблер должен быть запущен. Конечным результатом в обоих случаях является объект модуль (файл, который обычно имеет расширение или же .obj ). А глазок оптимизатор иногда используется во втором проходе для поиска фрагментов кода, содержащих избыточные операторы языка ассемблера.

употребление слова «предмет» описание фрагментов машинного кода — неудачный артефакт. Слово пришло использовался до того, как объектно-ориентированное программирование стало широко использоваться. «Объект» используется в том же смысле, что и «цель», когда обсуждая компиляцию, в то время как в объектно-ориентированном программировании это означает вещь с границами».

линкер объединяет список объектных модулей в исполняемую программу, которую можно загрузить и управляется операционной системой. Когда функция в одном объектном модуле делает ссылка на функцию или переменную в другом объектном модуле, компоновщик разрешает эти ссылки — он гарантирует, что все внешние функции и данные, которые, как вы утверждали, существовали во время компиляции, действительно существуют. Компоновщик также добавляет специальный объектный модуль для выполнения операций запуска.

компоновщик может искать в специальных файлах, называемых библиотеки чтобы разрешить все его ссылки. Библиотека содержит набор объектных модулей в одном файле. Библиотека создана и поддерживается программой под названием библиотекарь .

Статический проверка типа

компилятор выполняет тип проверка во время первого прохода. Тесты проверки типов для правильного использования аргументов в функции и предотвращает многие виды ошибок программирования. Поскольку проверка типов происходит во время компиляции, а не во время работы программы, это называется статический проверка типа .

Некоторые объектно-ориентированные языки (особенно Java) выполнить некоторую проверку типов во время выполнения ( динамический проверка типов ). В сочетании со статической проверкой типов динамическая проверка типов является более мощным, чем только статическая проверка типов. Однако он также добавляет накладные расходы на выполнение программы.

С++ использует статическую проверку типов, потому что язык не может предполагать никаких конкретных поддержка во время выполнения плохих операций. Проверка статического типа уведомляет программисту о неправильном использовании типов во время компиляции и, таким образом, максимизирует скорость выполнения. По мере изучения C++ вы увидите, что большая часть языкового дизайна решения отдают предпочтение такому же высокоскоростному программированию, ориентированному на производство язык C известен.

Вы может отключить статическую проверку типов в C++. Вы также можете сделать свой собственный динамический тип проверка — нужно просто написать код.


[14] Граница между компиляторами и интерпретаторами может немного сузиться. нечеткий, особенно с Perl, который обладает многими функциями и мощью скомпилированный язык, но быстрый оборот интерпретируемого языка.

[15] Perl снова является исключением, так как он также обеспечивает отдельную компиляцию.

Содержание | Предыдущий | Следующий


Контакт: [email protected]
CodeGuru - сайт для разработчиков.

Как запустить программу C в Ubuntu Linux [Методы терминала и графического интерфейса]

Программирование

Абхишек Пракаш Обновлено

Время чтения: 5 минут

Как программировать на C в Linux? Это действительно очень легко и состоит из трех простых шагов.

Шаг 1 : Вы пишете свою программу и сохраняете файл с расширением .c. Например, my_program.c.

Шаг 2 : Вы компилируете программу и генерируете объектный файл с помощью компилятора gcc в терминале следующим образом:

 gcc -o my_program my_program.c 

Шаг 3 Программа C в Linux:

 ./my_program 

Это был лишь краткий обзор того, как компилировать и запускать программу C в Linux. Если вы новичок в C или Linux, я подробно покажу эти шаги, чтобы вы чувствовали себя комфортно при написании программы C в среде Linux.

На самом деле, я расскажу, как запускать программы C в терминале Linux, а также в редакторе кода.

Способ 1. Как запускать программы на языке C в терминале Linux

Чтобы запускать программу на языке C в Linux, в вашей системе должен быть установлен компилятор языка C. Наиболее популярным компилятором является gcc (GNU Compiler Collection).

Вы можете установить gcc с помощью менеджера пакетов вашего дистрибутива. В дистрибутивах Linux на базе Debian и Ubuntu используйте команду apt:

 sudo apt install gcc 

Перейдите в каталог, в котором вы сохранили свою программу C (или укажите путь), а затем сгенерируйте объектный файл, скомпилировав программу:

 gcc -o my_program my_program.c 

Имейте в виду, что предоставлять выходной объектный файл (-o my_program). Если вы этого не сделаете, будет автоматически сгенерирован объектный файл с именем a.out. Но это нехорошо, потому что он будет перезаписан для каждой программы на C, и вы не сможете узнать, какой программе принадлежит объектный файл a.out.

После создания объектного файла запустите его, чтобы запустить программу C. Он уже исполняемый. Просто используйте его так:

 ./my_program 

И он отобразит желаемый результат, если ваша программа верна. Как видите, это не сильно отличается от запуска программ на C++ в Linux.

Каждый раз, когда вы вносите изменения в свою программу, вы должны сначала скомпилировать ее, а затем запустить сгенерированный объектный файл для запуска программы C.

Подпишитесь на наш канал YouTube, чтобы увидеть больше видеороликов о Linux

Способ 2. Как запускать программы C в Linux с помощью редактора кода, такого как Visual Studio Code

Не всем удобно работать с командной строкой и терминалом, и я полностью это понимаю.

Вы можете использовать подходящую IDE C/C++, такую ​​как Eclipse или Code Blocks, но они часто являются слишком тяжелыми программами и больше подходят для больших проектов.

Я рекомендую использовать редактор кода с открытым исходным кодом, такой как Visual Studio Code или Atom. В основном это текстовые редакторы, и вы можете установить надстройки для компиляции и запуска программ непосредственно из графического редактора кода.

В этом примере я использую редактор кода Visual Studio. Это чрезвычайно популярный редактор кода с открытым исходным кодом от Microsoft.

Первым делом установите Visual Studio Code в Ubuntu из центра программного обеспечения. Для других дистрибутивов проверьте диспетчер пакетов или центр программного обеспечения вашего дистрибутива Linux. Вы также можете проверить официальный сайт для получения дополнительной информации.

Запустите Visual Studio Code, откройте/создайте проект и создайте свою программу C здесь. Я использую пример программы Hello World.

Вы должны убедиться, что в вашей системе Linux установлен компилятор gcc.

 sudo apt install gcc 

Следующее, что вам нужно, это использовать расширение, позволяющее запускать код C. Microsoft может предложить вам установить собственное расширение для программы C/C++, но оно сложно в установке, поэтому я не буду его рекомендовать.

Вместо этого я предлагаю использовать расширение Code Runner. Это серьезное расширение, и вы можете легко запускать код C и C++ без дополнительной настройки.

Перейдите на вкладку «Расширения», найдите «Code Runner» и установите его.

Установите расширение Code Runner для запуска программы C/C++

Перезапустите Visual Studio Code. Теперь вы сможете запустить код C одним из следующих способов:

  • С помощью сочетания клавиш Ctrl+Alt+N.
  • Нажмите F1, а затем выберите или введите код выполнения.
  • Щелкните правой кнопкой мыши текстовый редактор и выберите «Выполнить код» из контекстного меню.
Щелкните правой кнопкой мыши файл программы и выберите «Выполнить код 9».0002 При запуске программы она компилируется автоматически и затем запускается. Вы можете увидеть вывод в терминале, который открывается в нижней части редактора. Что может быть лучше этого?

Вывод программы отображается в нижней части редактора

Какой метод вы предпочитаете?

Запуск нескольких программ C в командной строке Linux — это нормально, но использование редактора кода намного проще и экономит время. Вы не согласны?

Я позволяю вам решать, какой метод вы хотите использовать.

Абхишек Пракаш

Создатель It's FOSS. Ярый пользователь Linux и сторонник открытого исходного кода. Большой поклонник классических детективных детективов, начиная от Агаты Кристи и Шерлока Холмса и заканчивая детективом Коломбо и Эллери Куин. Также любитель кино с мягким уголком для фильма нуар.

Похожие сообщения

Запуск компьютерных программ (выполнение)

OOPortal

  • Карта сайта

Компьютерные алгоритмы «Пред. Следующий"
  • Основы программирования
  • Компьютерные алгоритмы
  • Структурированная компьютерная организация
  • Запуск компьютерной программы
  • Компиляторы Интерпретаторы
  • Сохранение номера текста
  • Объяснение двоичного числа
  • Преобразовать двоичный код в десятичный
  • Преобразовать десятичное двоичное число
  • Преобразование двоичного шестнадцатеричного
  • Дополнение к двойкам Представление
  • Отрицательные целые числа
  • Система Юникода ASCII
  • Структурированное программирование
  • Неструктурированные программы
  • Операторы последовательности
  • Решение Конструкт
  • Повторение Итерация
  • Написание программ
Урок 5 Запуск программы
Цель Описать, что происходит при выполнении компьютерной программы.

Запуск компьютерных программ

Запуск компьютерной программы относится к выполнению инструкций в программе компьютером.
Когда вы запускаете или выполняете программу, операционная система играет ключевую роль, поскольку она предоставляет программе контролируемый доступ к ресурсам компьютера.
В следующем слайд-шоу более подробно описывается типичная последовательность событий, происходящих при запуске программы, и то, как взаимодействуют программа, операционная система и аппаратное обеспечение компьютера.



Выполнение программы
  1. Вы указываете операционной системе запустить программу
  2. Операционная система загружает программу с жесткого диска или другого устройства долговременного хранения в оперативную память.
  3. Операционная система запускает программу. Другими словами, ЦП начинает выполнять инструкции, содержащиеся в программе.
  4. Программа завершена. Операционная система делает доступными для других программ любые ресурсы, которые использовались программой

Компиляция в машинный код

Когда вы компилируете свою программу, компилятор переводит исходный код C++ в машинный код. код. Результирующий файл состоит из машинных инструкций и информации о том, как загрузить программу в память перед выполнением. Машинный код иногда называют объектным кодом, но мы не используем эту терминологию, чтобы избежать путаницы с объектами C++. Машинный код файлы обычно имеют расширение

.obj
.о
 

Например, машинный код программы hello может храниться в файле hello.obj.
Файл машинного кода содержит только перевод написанного вами кода. Этого недостаточно, чтобы запустить программу. К отображать строку в окне, требуется довольно много низкоуровневой активности. Авторы пакета iostream (который определяет cout и его функциональность) реализовали все необходимые действия и поместили требуемый машинный код в библиотеку. Библиотека — это набор кода, который был запрограммирован и переведен кем-то другим и готов для использования в вашей программе. Специальная программа, называемая компоновщиком, берет файл вашего машинного кода и необходимые части из iostream и создает исполняемый файл.

Рисунок 2.5 От исходного кода к исполняемой программе

(На рис. 2.5 представлен обзор этих шагов.) Исполняемый файл обычно называется hello.exe или hello, в зависимости от вашей компьютерной системы. Он содержит весь машинный код, необходимый для запуска программы. Вы можете запустить программу, набрав hello в командной строке или щелкнув значок файла, даже после выхода из среды C++. Вы можете отправить этот файл по электронной почте другому пользователю, у которого нет компилятора C++ или который может не знать, что существует такая вещь, как C++, и этот человек может запускать программу точно так же.
Ваша деятельность по программированию сосредоточена вокруг этих файлов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *