Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Демкин_Экзамен.doc
Скачиваний:
10
Добавлен:
26.11.2018
Размер:
1.2 Mб
Скачать
  1. Какие принципиальные отличия языка ассемблера от высокоуровневых языков программирования? что такое байткод? в чем разнца между языком ассемблера и байткодом?

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

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

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

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

Каждая модель (или семейство) процессоров имеет свой набор команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы — Intel-синтаксис и AT&T-синтаксис.

Существуют компьютеры, реализующие в качестве машинного язык программирования высокого уровня (Forth, Lisp, Эль-76); фактически, в них он является языком ассемблера.

Основное отличие ассемблера от языков высокого уровня—

Байт-код или байтко́д (англ. byte-code), иногда также используется термин псевдоко́д — машинно-независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором. Большинство инструкций байт-кода эквивалентны одной или нескольким командам ассемблера. Трансляция в байт-код занимает промежуточное положение между компиляцией в машинный код и интерпретацией.

Основное отличие байткода от ассемблера: байткод платформенно независим, код на ассемблере пишется под конкретную архитектуру.

  1. Приведите примеры форматов исполняемых файлов и кратко охарактеризуйте их. Подробно формат elf.

OM

Расширение файла .COM (англ. command) использовалось в некоторых компьютерных системах в различных целях.

В системах DOS и в 8-битной CP/M, файл COM — простой тип исполняемого файла, размер которого не может превышать 64 Кбайт-256 байт (65280 = 216 − 28 байт). COM-файлы для DOS можно выполнять также на эмуляторах, например в среде Windows.

Следует отметить, что тип исполняемого файла DOS (COM или EXE) распознаётся при запуске автоматически, независимо от расширения.

.EXE (сокр. англ. executable — исполнимый) — расширение исполнимого файла, применяемое в системах DOS, Microsoft Windows, Symbian, OS/2, и в некоторых других. Кроме объектного кода, может содержать различные метаданные (значок, цифровую подпись[1]).

a.out (от англ. assembler output) — формат запускаемых файлов в некоторых (старых) версиях UNIX.

Формат исполняемого файла a.out преимущественно используется в Linux. Раcширенная версия этого формата a.outb используется группой BSD-совместимых операционных систем (NetBSD, FreeBSD и OpenBSD). Компилятор NASM может генерировать файлы обоих форматов, если указать ключ -f aout для Linux или -f aoutb для BSD.

Компилятор GCC по умолчанию выдаёт файл a.out, если не используется опция -o[1].

ELF (англ. Executable and Linkable Format — формат исполняемых и компонуемых файлов) — формат файлов, используемый во многих UNIX-подобных операционных системах, например, в GNU/Linux и Solaris, а также после некоторой модификации ПО — в некоторых мобильных телефонах компаний Siemens, Sony Ericsson, Motorola (платформа P2K) и во многих цифровых фотовидеокамерах (Olympus, Rekam и проч.).

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

Поля этого заголовка использует загрузчик (ELF interpreter) для загрузки программы в оперативную память перед исполнением.

Файлы ELF имеют два типа разбиений. Программный заголовок (program header) соответствует сегментам, которые будут использованы при исполнении. Заголовок секций (section header) перечисляет секции исполняемого файла.

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

Таблицу Program Header, описывающую ноль или более сегментов

Таблицу Section Header, описывающую ноль или более секций

Данные, упомянутые в записях названных таблиц

Сегменты содержат данные, необходимые для исполнения файла, а секции содержат информацию для линковки и обработку relocatin. Каждый байт в файле может относится к не более чем к одной секции.

MZ — стандартный формат 16-битных исполняемых файлов с расширением .EXE для DOS. Файлы .EXE и .DLL для Windows начинаются с заглушки в формате MZ, которая при попытке запустить файл в DOS выводит сообщение This program cannot be run in DOS mode. («Эту программу невозможно запустить в режиме DOS»).

В отличие от .COM, файлы .EXE для DOS включает метаданные, могут иметь размер больше 64 Кбайт, могут использовать несколько сегментов и могут использовать любой 16-битный адрес (то есть не только 0x100, как .COM) как точку входа в программу. В начале настоящего .EXE-файла всегда находятся два байта 0x4D 0x5A (символы ASCII M и Z). Если при попытке запуска файла с расширением .EXE такие байты не обнаруживаются, то файл интерпретируется как .COM. Эта сигнатура — инициалы Марка Збиковски (Mark Zbikowski) — одного из создателей операционной системы MS-DOS[1].

New Executable — «Новый исполняемый» — формат EXE-файлов, используемый в старых версиях Windows, таких, как Windows 3.1.

Для совместимости со старыми DOS-программами, оставлен MZ-заголовок, поля которого указывают на параметры запуска STUB. STUB — тело DOS-программы, выполняемой в случае запуска из командной строки MS-DOS (не Windows). В Windows-программах не делает ничего особого. Обычно выводит сообщение «This program requires Misrosoft Windows» или «This program cannot be run in DOS mode».

По адресу 0x003C располагается адрес заголовка NE.

Portable Executable — (PE, произносится как [по́тэбл экзэкью́тэбл] — переносимый исполняемый) — формат исполняемых файлов, объектного кода и динамических библиотек, используемый в 32- и 64-битных версиях операционной системы Microsoft Windows. Формат PE представляет собой структуру данных, содержащую всю информацию, необходимую PE загрузчику для проецирования файла в память.

  1. ИЗ КАКИХ ЭТАПОВ СОСТОИТ СОЗДАНИЕ ИСПОЛНЯЕМОЙ ПРОГРАММЫ ИЗ ИСХОДНОГО КОДА? ОПИШИТЕ ИХ СУТЬ. ДЛЯ ЯЗЫКОВ C++, JAVA И PYTHON ПЕРЕЧИСЛИТЕ ЭТАПЫ СОЗДАНИЯ ПРОГРАММЫ, КОТОРЫЕ ИМЕЮТ МЕСТО В РЕАЛЬНОСТИ И УКАЖИТЕ, В КАКОЕ ВРЕМЯ ОНИ ПРОИСХОДЯТ. ДЛЯ КАКИХ СРЕД ИСПОЛНЕНИЯ МОЖЕТ СОЗДАВАТЬСЯ ПРОГРАММА?

Четыре этапа компиляции С++

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

cpp: Первый этап заключается в замене директив (препроцессоры) чистыми инструкциями C. Обычно это означает вставку заголовка (#include) или определение макрокоманд (#define). В конце этого этапа генерируется чистый код C.

cc1: Этот этап заключается в преобразовании кода C в код языка ассемблера. Сгенерированный код зависит от архитектуры, для которой он предназначен.

as: Этот этап заключается в генерации объектного кода (или бинарного кода) из кода на языке ассемблера. В конце этого этапа генерируется файл с расширением .o.

ld: На последнем этапе (компоновке) устанавливаются связи между всеми объектными файлами (.o) и их библиотеками и результатеполучается исполняемый файл.

Для Java и Python свойственна интерпретация(динамическая): т.е. сначала генерируется промежуточный код(байткод), а затем во время исполнения байт-код транслируется в машинные коды

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

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

Этот метод хорошо подходит для веб-приложений. Соответственно, динамическая компиляция появилась и поддерживается в той или иной мере в реализациях Java, Microsoft .NET, Perl, Python.