Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

1. Компоновка, компиляция и построение проекта

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

В С++, например, каждый файл исходного кода необходимо компилировать отдельно. Этот процесс называется компиляцией и приводит к получению так называемых объектных файлов, каждый из которых представляет собой подобие исполняемого кода, но в то же время имеет отношение только к одному исходному файлу. Для генерации исполняемого файла эти объектные файлы должны связываться вместе; этот процесс формально называется связыванием. Обычно — по крайней мере, если говорить о платформе Windows — процесс, представляющий собой сочетание двух вышеуказанных процессов, называется компоновкой или построением. Однако в С# компилятор имеет более совершенную природу и способен считывать и обрабатывать все файлы исходного кода в виде одного блока. По этой причине отдельного этапа связывания не существует, и потому в контексте С# термины компиляция и компоновка применяются как взаимозаменяемые.

Вдобавок используемым при работе с проектами термин построить (make) означает, по сути, то же самое, что и термин скомпоновать (build), хотя в контексте С# он особо не применяется. Этот термин возник в эпоху больших вычислительных машин, на которых проект формировался из множества исходных файлов. При этом создавался специальный файл с инструкциями относительно того, как компилятор должен компоновать проект, т.е. какие файлы включать, на какие библиотеки ссылаться и т.д. Такой файл назывался make-файлом и до сих пор довольно часто применяется в системах UNIX. В системах Windows его обычно создавать не требуется, хотя при необходимости его можно написать (или заставить Visual Studio его генерировать).

2. Оптимизация

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

{

string Message = "Привет";

Console.WriteLine(Message);

}

Компилятор может заменить следующей строкой:

Console.WriteLine("Привет");

В результате устраняется необходимость в объявлении ненужных объектных ссылок.

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