Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 8
Текст из файла (страница 8)
При компиляции типичных "родных" приложений код оптимизируется на основе обобщений, таких как типичная топология компьютерной системы. Код после ,ПТ-компиляции оптимизирован непосредственно для платформы, на которой он выполняется в данный момент. ЛТ-компилятор может учитывать весьма специфичные параметры платформы во время оптимизации скомпилированяого кода и часто генерирует намного более производительный код, чем у статически скомпилированных "родных" приложений. ° Среда СгЛ может отслежиаагпь часпюгпу вызовов. Если СЬй видит, что раздел ЛТ-компилированного кода не вызывался в течение длительного времени, то может освободить место, занятое им.
При следующем вызове код будет перекомпилирован снова. СЬВ также может проводить оптимизацию во время выполнения. В "родных" приложениях оптимизация задается во время компиляции. Но поскольку в среде СЬК оптимизация происходит во время выполнения, она может быть применена в любой момент. Иногда случается так, что реализация СЬВ сможет компилировать код быстрее, но с меньшей степенью оптимизации, и она может так поступать по умолчанию. Однако для кода, который вызывается часто, может быть выполнена перекомпиляция с включенной оптимизацией, чтобы он выполнялся быстрее.
Например, модель эффективности СЬК значительно изменяется в зависимости от того, сколько центральных процессоров установлено на целевой платформе, или даже в зависимости от того, к какому семейству принадлежит центральный процессор. Чтобы приспособиться к такой ситуации, для "родных" приложений приходится выполнять много ручной работы — будь то во время выполнения или во время компиляции. Но СЬК предоставляет свои средства, поэтому увеличить производительность приложения на многопроцессорных системах намного проще. Вдобавок, если С1Л определит, что разные части кода, разбросанные по всему приложению, вызываются довольно часто, она может переместить их в памяти так, чтобы они располагались внутри одной группы страниц памяти, тем самым сводя к минимуму количество случаев ненападания на страницу и повышая эффективность каша кода при выполнении приложения.
Вдобавок СЕЙ может выполнять оптимизацию ветвей в любой момент, перекомпилируя их ЛТ-компилятором, в то время как в "родных" приложениях приходится применять так называемую управляемую профилем огипимизацию (Ргойе-Оигйеб Орйпйзайоп) — оптимизацию на основе предположений разработчика относительно наиболее вероятной конфигурации платформы, на которой пользователь будет запускать приложение.
Другими словами, в случае "родного" приложения оптимизация строится на базе предположений, тогда как в случае СЬК вЂ” на реальных данных о платформе, на которой выполняется приложение. Это лишь некоторые аргументы, доказывающие, что СЬК является гибкой целевой платформой, и почему ее преимущества перевешивают ущерб для производительности, вызванный начальной ЛТ-компиляцией. Сборки и загрузчик сборок Сборка (аээешо)у) — это дискретная единица многократно используемого кода внутри СЬВ. По своей природе она подобна РЫ библиотеке из мира неуправляемого кода, но на этом все сходство заканчивается. Сборка может состоять из множества модулей, которые обьедвзгяет вместе маниг,'бестп, описывающий содержимое сборки. С точки зрения операционной системы, модуль идентичен РЫ библиотеке.
Сборки могут иметь присоединенные к ним версии, что позволяет идентифицировать одноименные сборки, но с разными версиями, как отдельные. Сборки также содержат метаданные, опи- 32 Глава 2 сывающие содержащиеся в них типы. При поставке "родной" РЫ библиотеки обычно включается заголовочный файл и/илн документация, описывающая экспортированные функции. Метаданные удовлетворяют этим требованиям, полностью описывая типы, содержащиеся внутри сборки.
Короче говоря, сборки — это снабженные версиями, самоописательные единицы многократно используемого кода в среде С1К. Как упоминалось в главе 1, в результате компиляции программы "Не11о Юог1б1" получается файл . ехе, который фактически является сборкой. Для создания управляемых сборок может применяться любой управляемый язык. Более того, в большинстве случаев любой другой управляемый язык может использовать управляемые сборни, написанные на любом управляемом языке. Таким образом, очень легко создавать сложные системы, разрабатываемые на нескольких управляемых языках. Например, для создания низкоуровневых типов наиболее естественным языком может оказаться С++/СЫ, пользовательский интерфейс верхнего уровня лучше создавать на С№ или Чаэиа1 Ваз!с, а нод, выполняющий сложные вычисления — на языке г №.
Чтобы обеспечить функциональную совместимость между разными языками, в СЫ определено подмножество общей системы типов 1Сопппоп ТУре Буэ1еш — СТБ). которое называется спецификацией общего языка 1Сопппоп 1япяцаяе Брес1))сацоп — С1.Б). Если вы применяете в своих сборках только С)8-совместимые типы, то можете быть уверены, что код на любом управляемом языке сможет их использовать. Минимизация рабочего набора приложения В примере "Не11о \Чог1бг результирующая сборка состоит всего из одного файла. Однако сборки могут состоять и из многих файлов. Зти файлы могут включать скомпилированные модули, ресурсы и любые другие компоненты, перечисленные в манифесте сборки Манифест сборки обычно включается в главный модуль сборки и содержит важную идентифицирующую информацию, в том числе то, какие части относятся к сборке.
Используя зту информацию, загрузчик сборок может определить, помимо прочего, комплектность сборки или факт ее подделки. Сборки могут быть строго или не строго именованными. Строго именованная сборка имеет хеш-код, встроенный в ее манифест, который может использоваться загрузчиком для проверки целостности сборки и гарантии, что она не была подделана. Сборки могут также снабжаться электронной подписью, идентифицирующей их разработчика. Когда запускается исполняемая программа С№, среда СЬК загружает сборку и запускает метод точки входа.
Конечно, прежде чем сделать это, должна быть проведена ЛТ-компиляция. На этой стадии среде СЬК может понадобиться разрешить некоторые внешние ссылки, чтобы ЛТ-компиляция кода прошла без ошибок. Например, если метод Наьэ создает экземпляр класса по имени Етр1оуее, то СЬК должна найти и загрузить сборку, содержащую тип кпр1оуее. после чего ЛТ-компиляция может быть продолжена.
Замечательное свойство СЬК состоит в том, что она загружает сборки по мере необходимости. Поэтому, если есть тип, предоставляющий метод для печати документа, и он расположен в сборке, отличной от той, что содержит главное приложение, и при этом приложение никогда не реализует эту зависимость, то эта отдельная сборка никогда не будет загружаться. Это предохраняет рабочий набор приложения от чрезмерного роста. Таким образом, при проектировании приложений имеет смысл выносить менее часто используемые средства в отдельные сборки, чтобы среда СЬК загружала их только по мере надобности. В любой момент можно сократить рабочий набор приложения, снизить время запуска, а также уменьшить размер "отпечатка памяти" работающего приложения.
Ключ к атому — разбиение кода на отдельные единицы, или сборки. Если выполняемый совместно код разбросан по разным сборкам, то нет смысла создавать приложение из нескольких сборок, поскольку в этом случае теряются преимущества, связанные с наличием множества сборок. С№ з С1й 33 Назначение сборкам имен Именовать сборки можно двумя основными способами. ° Сюрогое рюлное) именование. Такая сборка имеет имя, состоящее нз четырех частей: краткое имя сборки, номер версии, идентификатор культуры в формате 1ЗО и хеш-маркер.
Если имя сборни состоит из всех четырех частей, она считается строго именованной. ° Частичное именование. Такая сборка имеет имя, в котором опущены некоторые детали строго именованной сборки. Чтобы получить представление о том, как выглядит нмя сборки, откройте ЪИпбоив Ехр1огег и перейдите к глобальному кашу сборок 1О!оЬз) Аэзеп1Ыу Сас)те — ОАС), находящемуся в каталоге Ъэузгетгоос% ~ аз зевЬ1у. В действительности структура каталогов очень сложна, но подключаемый модуль ОАС Ехр!огег представляет то, что вы видите, в браузере. Если вы перейдете в тот же каталог с помощью командной строки, то увидите имена каталогов, используемые ПАС для хранения сборок.
Не пытайтесь вмешиваться в зту структуру каталогов, иначе вы можете серьезно повредить ОАС. Сосредоточившись на представлении в Ехр1огег, можно увидеть имена сборок, состоящие из четырех частей. Если часть, описывающая культуру, имени сборки пуста. это значит, что данная сборка нейтральна в отношении культурьь что присуще сборкам, содержащим только код. Рекомендуется изолировать все ресурсы в отдельной сборке, чтобы можно было сделать их специфичными для культуры и легко заменять, не затрагивая код приложения. Подобные рекомендации существуют многие годы и в программировании на платформе Ъйп32, что позволяет легко локализовать приложение для других языков. Преимущество строго именованных сборок состоит в том, что они могут быть зарегистрированы в САС и стать доступными для использования всеми приложениями системы.
Регистрация сборки в ОАС аналогична регистрации в системном реестре СОМ-сервера. Если сборка не является строго именованной, то приложение может использовать ее лишь локально. Другими словами, сборка должна находиться где-то в каталоге приложения, использующего ее, либо в его подкаталогах. Такие сборки часто называют привагпными. Загрузка сборок Загрузчик сборок во время своей работы проходит через довольно сложную процедуру.
Часть этого процедуры относится к определению, какую версию сборки необходимо загрузить. Используя конфигурационные файлы приложения, моз1но предоставить загрузчику некоторые подсказки во время определения версии. СЬВ может загружать сборки по мере надобности, или же вы можете загрузить их явно вызовом Аррцотз№п .
Ьозс1 ( ) . Загрузчик просматривает частично именованные сборки в том же каталоге, где находится работающее приложение, или в его подкаталогах. Во время поиска сборки загрузчик может также обратиться к ОАС; например, при загрузке сборки с полностью квалифицированным именем загрузчик просматривает САС перед обращением к локальным каталогам. Версии играют ключевую роль во время загрузки сборок, и все сборки снабжены информацией о версии. Механизм контроля версий был встроен в загрузчик С).Е изначально, и это исключает такую неприятность, которая называется адом глЛ. 1РЫ.















