Для того чтобы выполнить программу, написанную на языке программирования высокого уровня, требуется перевести ее на язык, понятный процессору – в машинные коды. Этим занимаются специальные программы, которые называются языковыми процессорами, или трансляторами. Различают два вида языковых процессоров: интерпретаторы и компиляторы.
Интерпретатор – это программа, которая получает исходную программу на языке высокого уровня и по мере распознавания его операторов выполняет описываемые ими действия.
Интерпретатор в течение всего времени работы программы находится в оперативной памяти компьютера наряду с исходным текстом программы. Интерпретатор считывает ее первый оператор, переводит его в машинные команды и тут же организует выполнение этих команд. Затем переходит к переводу и выполнению следующего оператора, и так до конца программы. При этом результаты предыдущих переводов в памяти не сохраняются. При повторном выполнении одного и того же оператора в цикле оператор снова будет переводиться в машинные коды, перед этим происходит его синтаксический анализ.
Язык Си с нуля — Урок 47 — Многофайловые проекты. Создание и подключение. Заголовочные файлы.
Трансляция (от лат. «translatio» – передача) – в соответствии с ГОСТ 19781–90 преобразование программы, представленной на одном языке программирования, в программу на другом языке программирования, в определенном смысле равносильную первой.
Транслятор – это программа, которая получает на вход исходную программу и формирует на выходе объектную программу (программу на объектном языке программирования). В частном случае объектным кодом может служить машинный язык, и в этом случае полученную на выходе транслятора программу можно сразу же выполнить на компьютере.
В общем случае объектный язык необязательно должен быть машинным или близким к нему (автокодом). В качестве объектного языка может служить и некоторый промежуточный язык. Для промежуточного языка может быть использован другой компилятор или интерпретатор – с промежуточного языка на машинный. Схему трансляции, когда исходная программа переводится на промежуточный язык, который затем интерпретируется, называют гибридной. Такая схема используется в языках Java и С#.
Транслятор, использующий в качестве входного языка близкий к машинному (автокод или язык АССЕМБЛЕР), традиционно называют ассемблером.
Компилятор работает следующим образом. Получив на вход исходный текст программы, компилятор выделяет из него лексемы, а затем на основе грамматики языка распознает выражения и операторы, построенные из этих лексем. При этом компилятор выявляет синтаксические ошибки и в случае их отсутствия строит объектный модуль.
Каждый оператор языка переводится компилятором в последовательность машинных команд, которая может быть весьма длинной, поэтому языки типа ПАСКАЛЬ иС++ и называются языками высокого уровня. В языках низкого уровня, например в АССЕМБЛЕРЕ, каждая команда переводится в одну или несколько машинных команд.
Кроме того, компилятор планирует размещение данных в оперативной памяти в соответствии с описаниями величин, используемых в программе. Попутно он ищет синтаксические ошибки, т.е. ошибки записи операторов. В ПАСКАЛЕ на компилятор возложена еще одна обязанность – подключение к программе стандартных подпрограмм (например, ввода данных или вычисления синуса утла), а в С-подобных языках эту функцию выполняет специальная программа, называемая компоновщиком, или редактором связей.
Многофайловый проект | Изучение С++ для начинающих. Урок #139
Компоновщик, или редактор связей, формирует исполняемый модуль программы, подключая к объектному модулю другие объектные модули, в том числе содержащие функции библиотек, обращение к которым содержится в любой программе (например, для осуществления вывода на экран). Если программа состоит из нескольких исходных файлов, они компилируются по отдельности и объединяются на этапе компоновки. Исполняемый модуль имеет расширение .ехе и запускается на выполнение обычным образом, при этом присутствия компилятора в памяти компьютера не требуется.
Таким образом, при компиляции трансляция и исполнение программы идут последовательно друг за другом. При интерпретации – параллельно. Один раз откомпилированная программа может быть сохранена во внешней памяти и затем исполняться многократно.
На компиляцию машинное время тратиться больше не будет. Программа на интерпретируемом языке при каждом выполнении подвергается повторной трансляции. Кроме того, интерпретатор может занимать значительное место в оперативной памяти.
В самом языке программирования, вообще говоря, не заложен способ его реализации, однако одни языки почти всегда компилируются, например С+ + , другие, например Smalltalk, почти всегда интерпретируются; Java компилируется в байт-код и затем интерпретируется.
В настоящее время практически любая реализация языка представлена как среда разработки, которая включает в себя:
- 1) компилятор (или интерпретатор);
- 2) отладчик – специальную программу, которая облегчает процесс поиска ошибок; пользуясь ею, разработчик может выполнять программу «по шагам», отслеживать изменение значений переменных в процессе выполнения и др.;
- 3) встроенный текстовый редактор;
- 4) специальные средства для просмотра структуры программы;
- 5) библиотеку готовых модулей, классов, например для создания пользовательского интерфейса (окна, кнопки и т.д.).
В 1980-е гг. активно прорабатывалась идея визуального программирования, основной смысл которой состоит в том, чтобы процесс «сборки» программы осуществлялся на экране дисплея из программных конструкций-картинок. В результате появились среды разработки четвертого поколения (4GL), в которых разрабатываемый программный продукт строится из готовых крупных блоков при помощи мыши. Примерами таких сред являются: Delphi, Visual Java, Microsoft Visual Studio .NET.
Порядок разработки программы
С помощью компьютера можно решать задачи различного характера, например научно-инженерные, задачи разработки системного программного обеспечения, программ для обучения, для управления производственными процессами и т.д.
Разные задачи требуют различных технологий своей разработки, различающиеся принципами, количеством и составом этапов, областями применения и назначением. Для создания широкого спектра программ успешно применяется классический жизненный цикл разработки, когда очередной этап начинается после полного завершения предыдущего. Обычно выделяют следующие этапы:
- 1) постановка задачи;
- 2) математическое описание задачи;
- 3) выбор и обоснование метода решения;
- 4) выбор структур данных и алгоритмов решения задачи;
- 5) составление (кодирование) программы;
- 6) тестирование и отладка программы;
- 7) анализ результатов.
Некоторые этапы могут отсутствовать, например в задачах разработки системного программного обеспечения отсутствует математическое описание.
Подробно об этом рассказывается в гл. 26.
Источник: studme.org
Сборка программ. Объектный модуль
В предыдущем разделе шла речь о типах исполняемых модулей, но не говорилось ни слова о том, каким образом эти модули получаются. Вообще говоря, способ получения загружаемого модуля различен в различных ОС, но в настоящее время во всех широко распространенных системах этот процесс выглядит примерно одинаково. Это связано, прежде всего, с тем, что эти системы используют одни и те же языковые процессоры.
Объектный модуль
В большинстве современных языков программирования программа состоит из отдельных слабо связанных модулей. Как правило, каждому такому модулю соответствует отдельный файл исходного текста. Эти файлы независимо обрабатываются языковым процессором (компилятором), и для каждого из них генерируется отдельный файл, называемый объектным модулем. Затем запускается программа, называемая редактором связей, компоновщиком или линкером (linker — тот, кто связывает), которая формирует из заданных объектных модулей цельную программу (осуществляет процесс сборки или связывания программы).
Объектный модуль отчасти похож по структуре на перемещаемый загрузочный модуль. Действительно, мы, как правило, не знаем, в каком месте готовой программы окажутся объекты, определенные в нашем модуле. Объект в данном случае означает любую сущность, обладающую адресом. Поэтому объектный модуль должен содержать структуру данных, похожую на таблицу перемещений в загрузочном модуле.
Типичный объектный модуль содержит следующие структуры данных:
1)таблицу перемещений, т.е. таблицу ссылок на перемещаемые объекты внутри модуля
2)таблицу ссылок на внешние объекты. Иногда это называется таблицей или списком импорта
3)таблицу объектов, определенных здесь, на которые можно ссылаться из других модулей. Иногда ее называют списком экспорта. Иногда эту таблицу объединяют с предыдущей и называют все это таблицей глобальных символов. В этом случае для каждого символа приходится указывать, определен он в данном модуле или нет, а если определен, то как
4)различную служебную информацию, такую, как имя модуля, программу, которая его создала
6)собственно код и данные модуля.
Сборка программ. Библиотеки объектных модулей.
Сборка программ
В предыдущем разделе шла речь о типах исполняемых модулей, но не говорилось ни слова о том, каким образом эти модули получаются. Вообще говоря, способ получения загружаемого модуля различен в различных ОС, но в настоящее время во всех широко распространенных системах этот процесс выглядит примерно одинаково. Это связано, прежде всего, с тем, что эти системы используют одни и те же языковые процессоры.
Библиотеки объектных модулей
Крупные программы часто состоят из сотен и более отдельных модулей. Кроме того, существуют различные пакеты подпрограмм, также состоящие из большого количества модулей. Один из таких пакетов используется практически в любой программе на языке высокого уровня — это так называемая стандартная библиотека. Для решения проблем, возникающих при поддержании порядка в наборах из большого количества объектных модулей, еще на заре вычислительной техники были придуманы библиотеки объектных модулей.
Библиотека, как правило, представляет последовательный файл, состоящий из заголовка, за которым последовательно уложены объектные модули. В заголовке содержится следующая информация:
1)Список всех объектных модулей, со смещением каждого модуля от начала библиотеки. Это нужно для того, чтобы можно было легко найти требуемый модуль.
2)Список всех глобальных символов, определенных в каждом из модулей, с указанием, в каком именно модуле он был определен.
3)Линкер обычно собирает в программу все объектные модули, которые были ему заданы в командной строке, даже если на этот модуль не было ни одной ссылки. С библиотечными модулями он ведет себя несколько иначе.
Во многих современных системах с виртуальной памятью существует понятие разделяемой библиотеки. С точки зрения линкера она отличается от обычной тем, что он всегда обязан настраивать ее на одни и те же виртуальные адреса, и не имеет права производить перенастройку самого кода библиотеки. Кроме того, этот код хранится вовсе не в загружаемом модуле, а в отдельном файле.
Часто этот файл представляет собой загружаемый модуль специальной структуры. Все программы, использующие такую библиотеку, в действительности работают с одной копией ее кода, но каждая из них создает свою копию ее данных. Это достаточно сильно экономит память и дисковое пространство, используемое для хpанения пpогpамм, особенно в случае больших библиотек.
Дата добавления: 2018-05-09 ; просмотров: 1341 ; Мы поможем в написании вашей работы!
Поделиться с друзьями:
Источник: studopedia.net
Основные средства разработки программного обеспечения на языке ассемблера
В состав основных средств следует включить следующие программы:
• ассемблер (assembler) — компилятор с языка ассемблера, т.е. программа, переводящая исходный текст программы на языке, понятном человеку (точнее сказать «на языке понятном программисту») в язык, понятный компьютеру (машинный код). Так как программы обычно составляются из нескольких частей, написанных независимо друг от друга и, зачастую, на разных языках и разными программистами, то компилятор любого языка из любого пакета создает так называемые объектные модули, т.е. файлы специального формата, содержащие помимо машинного кода другую информацию, необходимую для работы компоновщика и отладчика. В DOS и Windows такие файлы получают расширение obj, а в Unix – o;
• компоновщик (linker) — программа, предназначенная для создания исполняемой программы из объектных модулей;
• отладчик (debuger) — программа для поиска и локализации в программе логических ошибок или для тестирования программы (проверки на правильность работы). Может также использоваться для изучения работы «чужих» программ, которые недоступны в исходных текстах.
К числу других средств следует отнести:
• дизассемблер (disassembler) — программа, переводящая исполняемый машинный код в исходный текст на языке ассемблера. В принципе, часть функций дизассемблера выполняют отладчики, но для получения листинга все же потребуется дизассемблер. Такая утилита может понадобится, если необходимо убедиться в правильности машинного кода или «расшифровать»
программу, для которой недоступен исходный текст;
• шестнадцатиричный редактор (hex editor) — редактор бинарных файлов (программ, библиотек, архивов, изображений и т.д.), в котором содержимое редактируемого файла представляется в шестнадцатиричном формате. Подобный редактор может использоваться, например, для того, чтобы исправить без перекомпиляции программы какую-нибудь команду или константу;
• библиотекарь (librarian) — программа для превращения специально подготовленных объектных модулей в библиотеки подпрограмм. Как правило в библиотеки объединяются несколько объектных модулей, содержащих подпрограммы, написанные в соответствии с соглашениями по передаче параметров, принятые в языках программирования и на данной
системе. В DOS и Windows библиотеки имеют расширение lib, а в Unix — a или la;
• эмулятор (emulator) – программа, которая может понадобиться при кроссразработке, например, при программировании микроконтроллеров. Позволяет запускать машиный код “неродной” архитектуры.
Пакет OpenWatcom