Стадии выполнения программы

Поделись знанием:
Перейти к: навигация, поиск
К:Википедия:Страницы на КУ (тип: не указан)

В современном программировании от исходного текста до кода в памяти проходит большое число стадий.

Традиционно выделяют стадии редактирования, компиляции, линковки, загрузки, исполнения, и, в процессе разработки - отладки.[1]





На стадии конструирования (design time)

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

Но в некоторых системах программирования (Embarcadero Delphi, Qt Creator) существуют конструкторы форм, когда один компонент программы уже откомпилирован, подключается к конструктору как плагин и вмешивается в разработку остальной программы. Например, в Delphi TEdit (строка ввода) не позволяет произвольно менять высоту — она зависит только от размера шрифта.

Компонент может узнать у среды исполнения, что идёт именно конструирование, а не выполнение, и каким-нибудь образом изменить своё поведение — так, пустой TImage (компонент, показывающий картинку) в Delphi при конструировании пунктирный, а при исполнении — невидимый. К системе могут подключаться и редакторы компонентов — так, TeeChart (даже стартовая версия, поставляющаяся с Delphi) обладает большим окном, которое может визуально изменять любые свойства графика и его рядов.

На стадии компиляции (compile time)

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

«На стадии компиляции» — важная концепция в программе. Например, когда заводят статический массив, компилятор должен знать, какого этот массив размера — а значит, размер нужно вычислять при компиляции.

Современные тенденции (например, C++11) расширяют диапазон вещей, которые можно вычислять при компиляции. Например, Паскаль и стандартный Си позволяют вычислять только простейшие выражения. Шаблонами и constexpr-функциями C++ можно вычислить при компиляции довольно сложные конструкции.

На стадии компоновки (link time)

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

Стадия компоновки традиционно важна в языках Си и C++, где программа компилируется как несколько независимых единиц компиляции, и только компоновщик проверяет, каких функций программе недостаёт.

На стадии инсталляции (install time)

Установщик выполняет какие-нибудь действия, специфичные для программы — например, из нескольких версий (без SSE, с SSE и для x64) выбирает нужную и устанавливает именно её. Или собирает начальный файл конфигурации.

На стадии загрузки (load time)

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

Какой нужен объём компоновки при загрузке — во многом зависит от архитектуры компьютера. Простая однозадачная ОС, сегментные регистры, виртуальная память и команды ближнего относительного перехода типа jmp [ip+50] снижают количество перестановок. Наличие динамических библиотек — повышает.

Традиционно Unix проводил при загрузке большой объём компоновки. Отголоском этого стал формат исполняемых файлов ELF (Executable and Linkable Format) и компоновщик ld.so (loader, загрузчик).

На стадии исполнения (run time)

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

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

  • В большинстве языков проверка типов, генерация кода, распределение переменных по регистрам и оптимизация кода делаются при компиляции или компоновке. Но это может делаться и про выполнении — см. Динамическая типизация, JIT-компиляция.
  • Одна из важных концепций ООП — полиморфизм подтипов, то есть один и тот же код, в зависимости от обрабатываемого типа, вызывает разные функции. Выбор, какую вызывать, происходит, естественно, на стадии исполнения.
  • В Java это сделано для динамической замены классов. Если написано static final int W2 = Screen.WIDTH / 2;, то при загрузке класса система возьмёт Screen.WIDTH и поделит на 2. Когда будет запущен новый процесс с другой шириной экрана, будет вычислен и новый W2.

На стадии инициализации (init time)

Программа ещё не дошла до собственно тела. Однако начал выполняться код, приводящий глобальные переменные в рабочее состояние.

На стадии закрытия (close time)

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

Прочие стадии

  • Стадия препроцессирования. Иногда особый препроцессор (например, moc в Qt) делает из исходного текста на языке высокого уровня промежуточный текст на языке более низкого уровня. Располагается перед стадией компиляции или входит в её состав.
  • Стадия обфускации. В некоторых языках программирования (Java) немалое количество оптимизаций кода проводится на этой стадии.

Напишите отзыв о статье "Стадии выполнения программы"

Примечания

  1. [books.google.ru/books?id=oJ48pa8LznsC&pg=PA1&lpg=PA1 A short review of high speed compilation] / Compiler Compilers and High Speed Compilation: 2nd CCHSC Workshop, Berlin, GDR, October 10-14, 1988. Proceedings

Отрывок, характеризующий Стадии выполнения программы

– Кто старший? – сказал он, увидав пленных.
Назвали полковника, князя Репнина.
– Вы командир кавалергардского полка императора Александра? – спросил Наполеон.
– Я командовал эскадроном, – отвечал Репнин.
– Ваш полк честно исполнил долг свой, – сказал Наполеон.
– Похвала великого полководца есть лучшая награда cолдату, – сказал Репнин.
– С удовольствием отдаю ее вам, – сказал Наполеон. – Кто этот молодой человек подле вас?
Князь Репнин назвал поручика Сухтелена.
Посмотрев на него, Наполеон сказал, улыбаясь:
– II est venu bien jeune se frotter a nous. [Молод же явился он состязаться с нами.]
– Молодость не мешает быть храбрым, – проговорил обрывающимся голосом Сухтелен.
– Прекрасный ответ, – сказал Наполеон. – Молодой человек, вы далеко пойдете!
Князь Андрей, для полноты трофея пленников выставленный также вперед, на глаза императору, не мог не привлечь его внимания. Наполеон, видимо, вспомнил, что он видел его на поле и, обращаясь к нему, употребил то самое наименование молодого человека – jeune homme, под которым Болконский в первый раз отразился в его памяти.
– Et vous, jeune homme? Ну, а вы, молодой человек? – обратился он к нему, – как вы себя чувствуете, mon brave?
Несмотря на то, что за пять минут перед этим князь Андрей мог сказать несколько слов солдатам, переносившим его, он теперь, прямо устремив свои глаза на Наполеона, молчал… Ему так ничтожны казались в эту минуту все интересы, занимавшие Наполеона, так мелочен казался ему сам герой его, с этим мелким тщеславием и радостью победы, в сравнении с тем высоким, справедливым и добрым небом, которое он видел и понял, – что он не мог отвечать ему.
Да и всё казалось так бесполезно и ничтожно в сравнении с тем строгим и величественным строем мысли, который вызывали в нем ослабление сил от истекшей крови, страдание и близкое ожидание смерти. Глядя в глаза Наполеону, князь Андрей думал о ничтожности величия, о ничтожности жизни, которой никто не мог понять значения, и о еще большем ничтожестве смерти, смысл которой никто не мог понять и объяснить из живущих.
Император, не дождавшись ответа, отвернулся и, отъезжая, обратился к одному из начальников:
– Пусть позаботятся об этих господах и свезут их в мой бивуак; пускай мой доктор Ларрей осмотрит их раны. До свидания, князь Репнин, – и он, тронув лошадь, галопом поехал дальше.
На лице его было сиянье самодовольства и счастия.
Солдаты, принесшие князя Андрея и снявшие с него попавшийся им золотой образок, навешенный на брата княжною Марьею, увидав ласковость, с которою обращался император с пленными, поспешили возвратить образок.
Князь Андрей не видал, кто и как надел его опять, но на груди его сверх мундира вдруг очутился образок на мелкой золотой цепочке.
«Хорошо бы это было, – подумал князь Андрей, взглянув на этот образок, который с таким чувством и благоговением навесила на него сестра, – хорошо бы это было, ежели бы всё было так ясно и просто, как оно кажется княжне Марье. Как хорошо бы было знать, где искать помощи в этой жизни и чего ждать после нее, там, за гробом! Как бы счастлив и спокоен я был, ежели бы мог сказать теперь: Господи, помилуй меня!… Но кому я скажу это! Или сила – неопределенная, непостижимая, к которой я не только не могу обращаться, но которой не могу выразить словами, – великое всё или ничего, – говорил он сам себе, – или это тот Бог, который вот здесь зашит, в этой ладонке, княжной Марьей? Ничего, ничего нет верного, кроме ничтожества всего того, что мне понятно, и величия чего то непонятного, но важнейшего!»
Носилки тронулись. При каждом толчке он опять чувствовал невыносимую боль; лихорадочное состояние усилилось, и он начинал бредить. Те мечтания об отце, жене, сестре и будущем сыне и нежность, которую он испытывал в ночь накануне сражения, фигура маленького, ничтожного Наполеона и над всем этим высокое небо, составляли главное основание его горячечных представлений.
Тихая жизнь и спокойное семейное счастие в Лысых Горах представлялись ему. Он уже наслаждался этим счастием, когда вдруг являлся маленький Напoлеон с своим безучастным, ограниченным и счастливым от несчастия других взглядом, и начинались сомнения, муки, и только небо обещало успокоение. К утру все мечтания смешались и слились в хаос и мрак беспамятства и забвения, которые гораздо вероятнее, по мнению самого Ларрея, доктора Наполеона, должны были разрешиться смертью, чем выздоровлением.
– C'est un sujet nerveux et bilieux, – сказал Ларрей, – il n'en rechappera pas. [Это человек нервный и желчный, он не выздоровеет.]
Князь Андрей, в числе других безнадежных раненых, был сдан на попечение жителей.


В начале 1806 года Николай Ростов вернулся в отпуск. Денисов ехал тоже домой в Воронеж, и Ростов уговорил его ехать с собой до Москвы и остановиться у них в доме. На предпоследней станции, встретив товарища, Денисов выпил с ним три бутылки вина и подъезжая к Москве, несмотря на ухабы дороги, не просыпался, лежа на дне перекладных саней, подле Ростова, который, по мере приближения к Москве, приходил все более и более в нетерпение.
«Скоро ли? Скоро ли? О, эти несносные улицы, лавки, калачи, фонари, извозчики!» думал Ростов, когда уже они записали свои отпуски на заставе и въехали в Москву.
– Денисов, приехали! Спит! – говорил он, всем телом подаваясь вперед, как будто он этим положением надеялся ускорить движение саней. Денисов не откликался.