После компоновки программа на машинном языке сохраняется на диске в виде
Программа, подготовленная на языке высокого уровня, проходит несколько этапов:
1. этап. В текстовом редакторе пишется исходный код программы на алгоритмическом языке (source code) и сохраняется в файле с расширением *.pas.
2 этап. Трансляция, происходит преобразование исходного кодапрограммы (source code) в объектный код(object code), т.е. происходит проверка синтаксиса написания операторов, и если ошибок в написании нет, осуществляется перевод на язык машинных кодов. Файл объектного кода имеет расширение *.obj;
Трансляторы предназначены для проверки правильности написания операторов и преобразования программ, написанных на языках программирования, в программы на машинном языке. Программа, подготовленная на каком-либо языке программирования, называется исходным модулем. В качестве входной информации трансляторы применяют исходные модули и формируют в результате своей работы объектные модули, являющиеся входной информацией для редактора связей. Объектный модуль содержит текст программы на машинном языке и дополнительную информацию, обеспечивающую настройку модуля по месту его загрузки и объединение этого модуля с другими независимо оттранслированными модулями в единую программу.
Трансляторы делятся на два класса: компиляторы (compiler) и интерпретаторы (interpreter). Компиляторы транслируютвсю программу, но без ее выполнения. Интерпретаторы, в отличие от компиляторов, выполняют пооператорныйперевод на машинный языки выполнение всей программы.
3. этап. Компоновка, когда происходит обработка объектного кода редактором связей, специальной программой осуществляющей построение загрузочного модуля(load module), пригодного к выполнению (рис 16.).
Компоновщик, или редактор связей - системная обрабатывающая программа, редактирующая и объединяющая объектные (ранее оттраслированные) модули в единые загрузочные, готовые к выполнению программные модули. Загрузочный модуль может быть помещен ОС в основную память и выполнен.
Получив исполняемый модуль, не спешите радоваться. К сожалению, устранение синтаксических ошибок еще не гарантирует того, что программа будет хотя бы запускаться, не говоря уже о правильности работы. Поэтому обязательным этапом процесса разработки является отладка. На этапе отладки, используя описание алгоритма, выполняется контроль правильности функционирования, как отдельных участков кода, так и всей программы в целом.
Текст программы записывается в один или несколько текстовых файлов. Имена файлов могут быть любыми, но для файлов, содержащих текст программы, принято расширение .asm, а для файлов с определением констант и новых типов – расширение .inc. Эти файлы являются текстовыми, их можно подготовить с помощью стандартных редакторов текста или с использованием интегрированных сред разработки программ.
При использовании стандартных редакторов текста необходимо сохранять редактируемые файлы с текстами программ в виде обыкновенных файлов в формате ASCII, то есть без дополнительных символов форматирования, которые вставляются в текст специализированными редакторами, например Word. Иногда используются специализированные текстовые редакторы для программистов, с разноцветной подсветкой синтаксиса, автоматической нумерацией строк, всплывающими подсказками и тому подобными «наворотами», но пишущие на различных диалектах ассемблера придерживаются аскетичных принципов в создании программ и, как правило, обходятся простейшим текстовым редактором и работой с командной строкой.
Подготовленный текст является исходными данными для специальных программ, называемых ассемблерами. Задача ассемблеров – преобразовать текст программы в форму двоичных команд, которые могут быть выполнены микропроцессором. Если обнаружены синтаксические ошибки, то результирующий код создан не будет. Процесс создания исполняемого файла происходит в две стадии:
На первой стадии (.asm -> .obj) из ассемблерного файла путем компиляции получаются файлы промежуточного объектного кода, имеющего расширение .obj (при этом могут использоваться дополнительные inc-файлы). Файл с расширением .obj содержит машинный код при условии, что не встретились синтаксические и семантические ошибки. Если в исходном файле с программой на языке ассемблера обнаруживаются ошибки, то программисту выдается список обнаруженных ошибок, в котором ошибки указываются с номером строки, в которой они обнаружены. Программист циклически выполняет действия по редактированию и компиляции до тех пор, пока не будут устранены все ошибки в исходном файле. На этом этапе уже возможно получение готовой программы, но чаще всего в ней не хватает некоторых компонентов. Если компилятор по какой-либо причине (неверно прописан путь к такому файлу или файл отсутствует) не может найти inc-файл, то выдается предупреждение и obj-файл получен не будет.
Ассемблирование, как правило, проходит в два приема. При первом проходе переводятся мнемонические команды, десятеричные числа и символы в соответствующие машинные коды, подсчитывается, сколько какая команда занимает места, обнаруженные имена, введенные пользователем (константы, метки, переменные) их тип и числовое значение записывается в таблицу. В эту же таблицу записывается, с каких адресов начинаются процедуры, адреса меток, адреса начала/конца сегментов и т. д., при втором проходе подставляются адреса начала процедур, заменяются названия меток на адреса.
В результате ассемблирования получается так называемый «объектный файл». В качестве дополнительной возможности ассемблер может создать файл листинга программы.
Обычно для получения файлов объектного кода необходимо выполнить соответствующую программу ассемблера (программы MASM.EXE и ML.EXE фирмы Microsoft и TASM.EXE или TASM32.EXE фирмы Borland), указав в командной строке имя файла с текстом программы.
Например, если у текстового файла с исходным текстом программы название prog.asm.
Эта форма вызова является минимально необходимой. Кроме имени текстового файла, необходимо указывать опции ассемблирования. Если синтаксических ошибок в файле prog.asm, нет, тогда будет создан файл prog.obj. Более подробную информацию об опциях программы ассемблирования следует искать в документации к этим программам.
Компонент операционной системы, называемый загрузчиком (loader), считывает данные из исполняемого файла, загружает программу в память и передает управление по адресу точки входа. В результате программа начинает выполняться.
В тех случаях, когда при написании новой программы на языке ассемблера требуются лишь незначительные изменения машинных кодов, иногда быстрее и удобнее внести изменения непосредственно в объектный файл, а не проходить всю цепочку редактирования исходной программы и осуществлять ее повторную трансляцию с внесенными изменениями. Для этого существуют специальные шестнадцатеричные редакторы (типа Hacker Viewer), которые позволяют рассматривать файлы с бинарным (машинным) кодом в виде последовательности ассемблерных команд. Эту же технологию применяют в тех случаях, если исходный текст программы не доступен (взлом программы).
До тех пор пока Вы не наберетесь достаточного опыта в программировании на языке ассемблера, за исключением учебных, тривиальных программ, в отладке будет нуждаться любая ваша программа. Для этого используются различные отладчики (CodeView фирмы Microsoft, Turbo Debugger фирмы Borland, SoftIce фирмы NuMega, OllyDebug написанный Olech Yuschuk), позволяющие в процессе выполнения программы контролировать значения регистров или переменных, при необходимости изменять их. Можно просматривать содержимое различных участков памяти. Можно выполнять программы по шагам или расставить точки останова (BREAK POINTS), которые вызовут прекращение работы программы и переход управления к отладчику.
Для подготовки текста программы на языке ассемблера очень удобно использование интегрированных программных сред. Такие возможности предоставляются практически всеми разработчиками ассемблеров, например: PWD – Programmer Workbench для компиляторов masm, QC – Quick C для компиляторов QuickAssembler фирмы Microsoft, все компиляторы языка C и C++ фирмы Borland (TC и BC). Интегрированные среды позволяют получить быстрый доступ к справочной информации. Можно сразу же ассемблировать и скомпоновать набранный текст, провести его отладку, а затем вновь вернуться к редактированию.
Как вы увидите в следующих главах, язык ассемблера заставляет нас помещать определенное количество строк в качестве заголовка программ, которые мы пишем. Другими словами, нам нужно каждый раз записывать несколько псевдооператоров, которые сообщают языку ассемблера основную информацию. В качестве рекомендации на будущее ниже приведен абсолютный минимум, необходимый для программ, которые вы пишите:
Разберем ее подробнее. В первой строке .686P – это директива описания типа микропроцессора (может быть еще и .8086, .8087, .186, .286, .287, .386, .387, .486, .586, .mmx с добавлением или без добавления букв P (привилегированные команды) и C или N (непривилегированные команды)). Если не указывать тип микропроцессора, то программа будет сгенерирована в кодах i8086.
Директива описания типа микропроцессораДиректива | Назначение |
---|---|
.8086 | Разрешены инструкции базового процессора i8086 (и идентичные им инструкции процессора i8088). Запрещены инструкции более поздних процессоров. |
.186 .286 .386 .486 .586 .686 | Разрешены инструкции соответствующего процессора x86 (x=1,…,6). Запрещены инструкции более поздних процессоров. |
.187 .287 .387 .487 .587 | Разрешены инструкции соответствующего сопроцессора x87 наряду с инструкциями процессора x86. Запрещены инструкции более поздних процессоров и сопроцессоров. |
.286c .386c .486c .586c .686c | Разрешены НЕПРИЛЕГИРОВАННЫЕ инструкции соответствующего процессора x86 и сопроцессора x87. Запрещены инструкции более поздних процессоров и сопроцессоров. |
.286p .386p .486p .586p .686p | Разрешены ВСЕ инструкции соответствующего процессора x86, включая привилегированные команды и инструкции сопроцессора x87. Запрещены инструкции более поздних процессоров и сопроцессоров. |
.mmx | Разрешены инструкции MMX-расширения. |
.xmm | Разрешены инструкции XMM-расширения. |
.K3D | Разрешены инструкции AMD 3D. |
Модель памяти задается директивой .model
Строка .model flat говорит, что будет создаваться exe-файл для 32-разрядной операционной системы Windows. Плоская (flat) модель памяти 32-разрядной Windows располагает три сегмента (сегмент кода, стека и данных) в едином четырехгигабайтном адресном пространстве, позволяя вообще забыть о существовании сегментов. Но для 16-разрядных приложений MS-DOS и Windows 3.x максимально допустимый размер сегментов составляет всего лишь 64 килобайта, что явно не допустимо для большинства приложений. В крошечной (tiny) модели памяти сегмент кода, стека и данных также расположены в едином 64-килобайтном адресном пространстве, но в отличие от плоской модели это адресное пространство чрезвычайно ограничено в размерах, поэтому и код, и стек, и данные более серьезных приложений приходилось размещать в нескольких сегментах (модели памяти small, medium, compact, large, huge, tchuge). В этих моделях памяти, например, для вызова функции недостаточно было знать ее смещение, а требовалось указать еще и сегмент, в котором функция была расположена. Команды передачи управления переходы (jmp) и вызовы (call) в этих моделях памяти могут быть близкими (near) и дальними (far). Если вы пишете программы для 32/64-разрядной операционной системы Windows, то о других моделях памяти кроме flat можно забыть со спокойной совестью.
Для адресации четырех гигабайтов виртуальной памяти, выделенной в распоряжение процесса, Windows использует два селектора, один из которых загружается в сегментный регистр CS, а другой в регистры DS, ES и SS. Оба селектора ссылаются на один и тот же базовый адрес памяти, равный нулю, и имеют идентичные лимиты, равные четырем гигабайтам. Windows использует еще и регистр FS, в который загружается селектор сегмента, содержащего информационный блок потока TIB.
Фактически существует всего один сегмент, вмещающий в себя и код, и данные, и стек процесса. Благодаря этому передача управления коду, расположенному в стеке, осуществляется близким (near) вызовом или переходом. Отличия между регионами кода, стека и данных заключаются в атрибутах принадлежащих им страниц страницы кода допускают чтение и исполнение, страницы данных чтение и запись, а страницы стека чтение, запись и исполнение одновременно.
Допустим у нас есть логический адрес 0137:00456789h. Чтобы этот адрес перевести в линейный – в селекторе 137 находится соответствующий ему дескриптор в таблице дескрипторов: база = 0, граница = 0FFFFFFFFh, следовательно, линейный адрес равен 0 (база) + 00456789h. Однако линейный адрес не является физическим адресом. Для его получения используется третья ступень – страничная адресация. То есть 20 старших бит линейного адреса используются для выбора 4 Kбайт памяти из каталога страниц, оставшиеся 12 бит представляют смещение внутри полученной страницы (в качестве упражнения рекомендую написать небольшую программу под 32-разрядной Windows, которая будет показывать сегментные регистры, значения дескрипторов для каждого селектора, базу, границу, RPL и т.п). В 32-разрядной Windows и сегмент кода, и сегмент данных и стека приложения имеют одинаковые базу и границу (0 и 0FFFFFFFFh). Это называется плоской (FLAT) моделью памяти. Хотя cs и ds имеют разные значения и дескрипторы, они указывают на одно и то же линейное адресное пространство 0..0FFFFFFFFh. Следовательно, логические адреса cs:12345678 и ds:12345678 совпадают. Есть возможность модифицировать код при помощи mov byte ptr $+8,21h (секция кода должна быть помечена как writeable). В данном случае в инструкции mov неявно подразумевается ds:, в который можно писать. Однако, при попытке сделать mov cs:xxxxxxxx, получим исключение (сегментная защита). В сегмент кода писать нельзя, но зато можно писать в сегмент данных, который «совпадает» с сегментом кода, и тем самым модифицировать код. А теперь вспомним про страничную защиту. Именно она используется в Windows, когда Вы задаете атрибуты секций PE-файла (.data, .code и т.д). Собственно, к сегментам памяти они не имеют отношения, посему когда речь идет о Win32, не путайте понятия секций PE-файлов и сегментов памяти! Когда Windows грузит РЕ-файл, она смотрит атрибуты секций и соответственно им устанавливает «защиту» страниц памяти, в которые будет загружена секция. Это и есть типа страничная защита.
Помимо этого каждая страница имеет специальный флаг, определяющий уровень привилегий, необходимых для доступа к этой странице. Некоторые страницы, например, те, что принадлежат операционной системе, требуют наличия прав супервизора, которыми обладает только код нулевого кольца. Прикладные программы, исполняющиеся в кольце 3, таких прав
не имеют и при попытке обращения к защищенной странице порождают исключение.
Модель памяти | Количество и размер сегментов | Тип указателя | Описание | ||
кода | данных | для кода | для данных | ||
16-разрядные приложения MS-DOS и Windows 3.x | |||||
Tiny | один, | near | near | Код, данные и стек находятся в одном сегменте. Эта модель памяти используется для написания программ типа .COM | |
Small | один, | один, | near | near | Код программы находится в одном сегменте. Данные и стек находятся в другом сегменте |
Medium | несколько, | один, | far | near | Код находится в нескольких сегментах, по одному на каждый программный модуль. Данные объединены в один сегмент |
Compact | один, | несколько, | near | far | Код находится в одном сегменте. Данные могут находится в нескольких сегментах. Для ссылки на данные из кода применяются указатели дальнего типа |
Large | несколько, | несколько, | far | far | Код может размещаться в нескольких сегментах, на каждый модуль новый сегмент. Данные также размещаются в нескольких сегментах. Для ссылки на данные из кода применяются указатели дальнего типа. |
Huge | несколько, >64Kb | несколько, >64Kb | huge | huge | Код может размещаться в нескольких сегментах, на каждый модуль новый сегмент. Данные и код имеют тип huge |
Tchuge | несколько, = | несколько, = | far | far | Также как для модели large, но с иным использованием сегментных регистров |
32-разрядная Windows | |||||
Flat | не ограничено | не ограничено | flat | flat | Соответствует варианту модели small, но с использованием 32-разрядной адресации |
В третьей строчке написано .code. По этой команде (директиве) будет определен сегмент кода. Это нужно, потому что у реальных программ код (команды) и данные (переменные) должны быть разделены. Если Вы хотите в каком-либо месте программы вставить данные, то пишите .data, а потом уже сами данные (но их можно и не разделять). Я рекомендую вставлять данные между командами ret и end start. start: – это место, где находится точка входа в программу. На языке ассемблера всегда надо помечать место, где находится начало программы (первая команда). Строка ret нужна, чтобы выйти из программы – если бы ее не было, то программа бы «завесила» компьютер. Последняя строчка end start завершает текст исходной программы.
Итак это была теория. А вот это практика. Попробуем написать программу на языке ассемблера самостоятельно. Все что вам нужно это компьютер и набор программ masm32.
Сначала наберем с помощью текстового редактора вот такой файл:
Сохраните этот файл под любым именем и дайте ему расширение .asm. Чтобы запустить эту программу, надо будет этот файл ассемблировать и скомпоновать. Рекомендую все это переложить на плечи компьютера. Создадим bat-файл следующего содержания:
Назовите получившийся bat-файл «asm1.bat» и разместите его в папке Windows/System32. Щелкаем по ярлыку «Мой компьютер».
Мой компьютер->Сервис->Свойства папки->Типы файлов->Создать
Теперь для компиляции и линковки достаточно будет просто щелкнуть по файлу с расширением .asm
Если все набрано правильно, то в текущем каталоге появится файл с именем исходника, но с расширением .exe. Запускаем его и видим результат.
Вопрос 1
Неверным является утверждение о том, что…
Ответы
1. вводить с клавиатуры можно данные всех стандартных типов.
2. типы вводимых значений должны совпадать с типами соответствующих переменных.
3. вводимые значения разделяются пробелами, нажатием клавиши Enter и/или
клавиши TAB.
4. ввод данных заканчивается в тот момент, когда последняя переменная из списка
ввода получила своё значение.
Вопрос 2
Получить доступ последовательно к каждому элементу массива рациональнее используя цикл…
Ответы
1. while
2. repeat
3. for
4. until
Вопрос 3
Ошибка при использовании условного оператора if содержится в выражении…
Ответы
1. If i>0 then if s>2 then s:=1 else else s:=-1;
2. If i>0 then if s>2 then s:=1 else s:=-1 else
3. If i>0 then begin if s>2 then s:=1 end else s:=-1;
4. If s>2 then s:=4 else s:=8;
Вопрос 4
Выберите верное утверждение…
Ответы
1. переменная, относящаяся к типу диапазону, соответствует формальному
параметру-переменной, тип которого является для диапазона базовым.
2. тип Real может быть использован в качестве базового при объявлении диапазона
3. формальный параметр может представлять собой параметр-значение.
4. целочисленные значения могут использоваться в качестве значений
перечислимого типа
Вопрос 5
Значением выражения Chr(Ord(‘A’)) будет…
Ответы
1. Ord
2. ’A’
3. ничего
4. 60
Вопрос 6
Если предположить, что X = 10.0, то оператор X := X – 20.0 присвоит переменной X значение…
Ответы
1. -10.0
2. 30.0
3. 10.0
4. 1.5
Вопрос 7
Вывод следующего фрагмента программы выглядит… N := 10;for I := 1 to N dobeginWrite(I : 3);N := N – I;end; WriteLn(N : 4);
Ответы
1. 1 2 3 4 5 6 7 8 9 10 -45
2. 1 2 3 4 5 6 7 8 9 10
3. 1 2 3
4. 1 2 3 4
Вопрос 8
Наивысший приоритет имеет оператор…
Ответы
1. >
2. 3. not
4. and
Вопрос 9
В выражении A + B / C * D первым будет выполнен оператор:
Ответы
1. /
2. +
3. *
4. -
Вопрос 10
Во время выполнения следующего фрагмента программы оператор WriteLn выполнится… for I := 1 to 10 dobeginfor J := 1 to I doWrite(I * J);WriteLn;end
Ответы
1. 55 раз
2. 60 раз
3. 1 раз
4. 10 раз
Вопрос 11
Длину строки в языке Turbo Pascal определяет стандартная функция…
Ответы
1. Val
2. Str
3. UpCase
4. Length
Вопрос 12
При выполнении следующей программы, использующей форматный вывод, на экран будет выведено … П р и м е ч а н и е: символ «_» означает пробел. Program prog;Var A: integer; B: real;BeginA:=–123; B:=45.67;Writeln (‘A=’, A:5, ‘_B=’, B:-5:1);End.
Ответы
1. A=–123_ _B=_45.7
2. A=_–123 _B=45.7
3. A=_–123 _B=45.67
4. A=–123 _B=45.67
Вопрос 13
Перемещение указателя с текущей позиции в точку с заданными координатами оуществляет процедура…
Ответы
1.MoveRel(x,y)
2.LineTo(x,y)
3.GetPixel(x,y)
4.MoveTo(x,y)
Вопрос 14
Двумя методами доступа к элементам массива являются
Ответы
1.произвольный и переменный
2.произвольный и последовательный
3.последовательный и переменный
4.только переменный
Вопрос 15
Перед компоновкой программа на машинном коде сохраняется на диске в виде
Ответы
1.исполняемого файла
2.файла с исходным кодом
3.объектного файла
4.набора файлов с ресурсами программы
Объектная программа, полученная в результате трансляции исходной программы, хотя и записана на машинном языке, не может быть сразу выполнена машиной. Одна из причин этого заключается в том, что большинство сред программирования позволяют создавать и транслировать модули программы как отдельные элементы и в разное время (что и обеспечивает модульную структуру программного обеспечения). Поэтому объектная программа, полученная после транслирования исходной программы, часто является только одним кусочком целой программы, каждой части которой для выполнения задачи необходимо взаимодействие с другими частями. Даже когда программа создается и транслируется как отдельная единица, ее объектную программу редко можно выполнить сразу, поскольку, скорее всего, она обращается к каким-либо обслуживающим программам, доступным через операционную систему, или к самой операционной системе. Поэтому объектная программа — это программа на машинном языке, которую, чтобы получить исполняемую программу, нужно соединить с другими объектными программами.
Эта задача выполняется программой, которая называется компоновщиком (linker). Компоновщик связывает объектные программы, полученные в результате трансляции, процедуры операционной системы и другое обслуживающее программное обеспечение и создает полную, исполняемую программу (иногда ее называют загрузочным модулем), которая сохраняется на запоминающем устройстве машины.
Наконец, для выполнения оттранслированной программы загрузочный модуль помещается в память программой, которая называется загрузчиком (loader) и часто является частью планировщика операционной системы (раздел 3.3). Этот этап очень важен в многозадачных системах. Программа использует память совместно с другими выполняемыми процессами, и количество этих процессов постоянно меняется, поэтому до момента выполнения программы неизвестно, какая область памяти ей доступна. Задача загрузчика состоит в том, чтобы поместить программу в область памяти, отведенную операционной системой, и в последний момент (в последнюю микросекунду) внести изменения, которые могут понадобиться, когда становятся известны адреса конкретных ячеек памяти. (Команда перехода должна переходить к необходимому оператору программы.) Желание свести эти последние изменения к минимуму привело к созданию методов, с помощью которых можно избежать явного обращения к ячейкам памяти в программе. В результате появились перемещаемые модули (relocatable module), которые выполняются правильно независимо от их размещения в памяти.
Таким образом, подготовка программы на языке высокого уровня к выполнению состоит из трех этапов: трансляции, компоновки и загрузки (рис. 5.21). После завершения трансляции и компоновки программу можно загрузить и выполнить, не возвращаясь к ее исходной версии. Однако если программу необходимо изменить, то все изменения производятся в исходной программе, которая затем снова транслируется и связывается. В результате создается новый загрузочный модуль, содержащий внесенные изменения.
Инструментарий технологии программирования обеспечивает процесс разработки программ и включает специализированные программные продукты, которые являются инструментальными средствами разработчика. Программные продукты данного класса поддерживают все технологические этапы процесса проектирования, программирования (кодирования), отладки и тестирования создаваемых программ. Пользователями технологии программирования являются системные и прикладные программисты.
Но прежде чем обсуждать сами инструментальные средства разработки программ, рассмотрим принципы разработки программного обеспечения.
При разработке программ всегда следует помнить одно золотое правило: надежность программы достигается, в первую очередь, благодаря ее правильному проектированию, а не бесконечному тестированию. О том, как правильно организовать разработку программ (независимо от языка), написана не одна сотня книг. Большинство авторов предлагают следующий процесс разработки (создания) программы :
1. Этап постановки и формулировки задачи. Постановка задачи (problem definition) — это точная формулировка решения задачи на компьютере с описанием входной и выходной информации:
изучение предметной области и сбор материала в проблемно-ориентированном контексте;
определение назначения программы, выработка требований к ней и представление требований, если возможно, в формализованном виде;
формулирование требований к представлению исходных данных и выходных результатов;
определение структур входных и выходных данных;
формирование ограничений и допущений на исходные и выходные данные.
2. Этап проектирования:
формирование модели задачи;
выбор метода реализации задачи;
разработка алгоритма реализации задачи;
разработка структуры программы
3. Этап кодирования:
уточнение структуры входных и выходных данных и определение формата их представления;
комментирование текста программы и составление предварительного описания программы.
4. Этап отладки и тестирования:
составление тестов для проверки правильности работы программы;
обнаружение, локализация и устранение ошибок в программе, выявленных в тестах;
корректировка кода программы и ее описания.
5. Этап эксплуатации и сопровождения:
настройка программы на конкретные условия использования;
обучение пользователей работе с программой;
организация сбора сведений о сбоях в работе программы, ошибках в выходных данных, пожеланиях по улучшению интерфейса и удобства работы с программой;
модификация программы с целью устранения выявленных ошибок и, при необходимости, изменения ее функциональных возможностей.
После написания программы на языке программирования нужно ввести программу в компьютер, перевести в машинное представление и выполнить. Как это сделать? Дальнейшее обсуждение будет посвящено именно этому вопросу.
Программа, подготовленная на языке высокого уровня, проходит несколько этапов:
1. этап. В текстовом редакторе пишется исходный код программы на алгоритмическом языке (source code) и сохраняется в файле с расширением *.pas.
2 этап. Трансляция, происходит преобразование исходного кодапрограммы (source code) в объектный код(object code), т.е. происходит проверка синтаксиса написания операторов, и если ошибок в написании нет, осуществляется перевод на язык машинных кодов. Файл объектного кода имеет расширение *.obj;
Трансляторы предназначены для проверки правильности написания операторов и преобразования программ, написанных на языках программирования, в программы на машинном языке. Программа, подготовленная на каком-либо языке программирования, называется исходным модулем. В качестве входной информации трансляторы применяют исходные модули и формируют в результате своей работы объектные модули, являющиеся входной информацией для редактора связей. Объектный модуль содержит текст программы на машинном языке и дополнительную информацию, обеспечивающую настройку модуля по месту его загрузки и объединение этого модуля с другими независимо оттранслированными модулями в единую программу.
Трансляторы делятся на два класса: компиляторы (compiler) и интерпретаторы (interpreter). Компиляторы транслируютвсю программу, но без ее выполнения. Интерпретаторы, в отличие от компиляторов, выполняют пооператорныйперевод на машинный языки выполнение всей программы.
3. этап. Компоновка, когда происходит обработка объектного кода редактором связей, специальной программой осуществляющей построение загрузочного модуля(load module), пригодного к выполнению (рис 16.).
Компоновщик, или редактор связей - системная обрабатывающая программа, редактирующая и объединяющая объектные (ранее оттраслированные) модули в единые загрузочные, готовые к выполнению программные модули. Загрузочный модуль может быть помещен ОС в основную память и выполнен.
Получив исполняемый модуль, не спешите радоваться. К сожалению, устранение синтаксических ошибок еще не гарантирует того, что программа будет хотя бы запускаться, не говоря уже о правильности работы. Поэтому обязательным этапом процесса разработки является отладка. На этапе отладки, используя описание алгоритма, выполняется контроль правильности функционирования, как отдельных участков кода, так и всей программы в целом.
Отладчик позволяет управлять процессом исполнения программы, является инструментом для поиска и исправления ошибок в программе. Базовый набор функций отладчика включает:
пошаговое выполнение программы (режим трассировки) с отображением результатов,
остановка в заранее определенных точках,
возможность остановки в некотором месте программы при выполнении некоторого условия;
изображение и изменение значений переменных.
Но даже успешное окончание отладки еще не является гарантией того, что программа будет работать правильно со всеми возможными исходными данными. Поэтому нужно обязательно провести тестирование программы, то есть проверить ее работу на «пограничных» и заведомо некорректных исходных данных. Для этого составляются тесты. Вполне возможно, что результаты тестирования вас не удовлетворят. В этом случае придется вносить поправки в код программы, то есть возвращаться к первому шагу процесса разработки (см. рисунок 16).
Инструментарий технологии программирования — совокупность программ и программных комплексов, обеспечивающих технологию разработки, отладки и внедрения создаваемых программных продуктов.
Сформировались следующие группы программных продуктов (рис.17):
Средства для создания приложений, включающие:
o локальные средства, обеспечивающие выполнение отдельных работ по созданию программ;
o интегрированные среды разработчиков программ, обеспечивающие выполнение комплекса взаимосвязанных работ по созданию программ;
САSE-технология (Computer-Aided System Engineering),представляющая методы анализа, проектирования и создания программных систем и предназначенная для автоматизации процессов разработки и реализации информационных систем. Подробнее вопрос 46.
Читайте также: