Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
полная шпора по ПП в ТС.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
458 Кб
Скачать
☆

2.Модель компиляции исходного кода в . Net

Microsoft предлагает компиляторы для нескольких языков, предназначенных

для этой платформы: C++/CLI, C# (произносится «си шарп» ), Visual Basic, JScript, J# (компилятор языка Java) и ассемблер Intermediate Language (IL). Кроме Microsoft, еще несколько компаний и академических учреждений создали компиляторы, генерирующие код, работающий в CLR. Мне известны компиляторы для APL, Caml, COBOL, Eiffel, Forth, Fortran, Haskell, Lexico, LISP, LOGO, Lua, Mercury, ML, Mondrian, Oberon, Pascal, Perl, Php, Prolog, Python, RPG, Scheme, Smalltalk и Tcl/Tk.

На рис. 1_1 показан процесс компиляции файлов с исходным кодом. Как ви_

дите, можно создавать файлы с исходным кодом на любом языке, поддерживающем CLR. Затем соответствующий компилятор используется для проверки синтаксиса и анализа исходного кода. Независимо от компилятора результатом является управляемый модуль (managed module) — стандартный переносимый исполняемый (portable executable, PE) файл 32_разрядной (PE32) или 64_разрядной Windows (PE32+), который требует для своего выполнения CLR.

Каждый компилятор, предназначенный для CLR, кроме генерации IL_кода, также должен создавать полные метаданные (metadata) для каждого управляемого модуля. Коротко говоря, метаданные — это просто набор таблиц данных, описывающих то, что определено в модуле, например типы и их члены. В метаданных также 4 Часть I Основы CLR есть таблицы, указывающие, на что ссылается управляемый модуль, например на

импортируемые типы и их члены. Метаданные расширяют возможности таких старых технологий, как библиотеки типов и файлы языка описания интерфейсов (Interface Definition Language, IDL). Важно заметить, что метаданные CLR гораздо полнее. И в отличие от библиотек типов и IDL они всегда связаны с файлом, содержащим IL_код. Фактически метаданные всегда встроены в тот же EXE/ DLL, что и код, так что их нельзя разделить. Так как компилятор генерирует метаданные и код одновременно и привязывает их к конечному управляемому модулю, рассинхронизация метаданных и описываемого ими IL_кода исключена.

3. Библиотека классов .NET Framework.

В .NET Framework включены сборки библиотеки классов .NET Framework Class Library (FCL), содержащие определения нескольких тысяч типов, каждый из которых предоставляет некоторую функциональность. В Microsoft работают над дополнительными библиотеками WinFx и DirectX SDK, которые предоставляют еще больше типов и функциональности.

Библиотека классов .NET Framework представляет собой библиотеку классов, интерфейсов и типов значений, которые обеспечивают доступ к функциональным возможностям системы. Она составляет основу для создания приложений, компонентов и элементов управления .NET Framework. Пространства имен и их категории в библиотеке классов перечислены в следующей таблице.

4.Система типов данных в .NET

CLR тесно связана с типами. Типы предоставляют определенную функциональность приложениям и компонентам. Они являются механизмом, позволяющим коду, написанному на одном языке программирования, взаимодействовать с кодом, написанным на другом. Поскольку типы

являются основой CLR, Microsoft создала формальную спецификацию — общую систему типов (Common Type System, CTS), описывающую определение типов и их поведение.

В спецификации CTS утверждается, что любой тип может содержать ноль или более членов.

Пример членов:

-Поле — переменная, являющаяся частью состояния объекта. Поля идентифицируются по имени и типу.

-Метод — функция, выполняющая некоторое действие над объектом, зачастую изменяя его состояние. Метод имеет имя, сигнатуру и модификаторы. Сигнатура определяет соглашение о вызове метода, число параметров (и их последовательность), типы параметров, а также тип значения, возвращаемого методом.

-Свойство — для вызывающей стороны этот член выглядит, как поле, но в реализации типа он выглядит, как метод (или два). Свойства позволяют типу, в котором они реализованы, проверить входные параметры и состояние объекта, прежде чем предоставить доступ к своим значениям и/или вычислять значения только при необходимости. Свойства также упрощают синтаксис обращения к типу. И, наконец, свойства позволяют создавать «поля» только для чтения или только для записи.

-Событие — обеспечивает механизм взаимных уведомлений объектов. Так, кнопка может предоставлять событие, уведомляющее другие объекты о том, что ее щелкнули.

CTS также определяет правила видимости типов и доступа к их членам. Например, если тип помечен как открытый (public), он экспортируется, видим и доступен любой сборке. С другой стороны, если тип помечен как сборочный (assembly) (в C# — internal), он видим и доступен только коду той сборки, в которой реализован. Таким образом, CTS определяет правила, по которым сборки формируют границы видимости типа, а CLR реализует эти правила.

Видимый вызывающему коду тип контролирует доступ к своим членам со стороны вызывающего кода. Вот допустимые варианты управления доступом к методам или полям.

  • Закрытый (private) — метод может вызываться другими методами только из того же типа.

  • Родовой (family) — метод может вызываться производными типами независимо от того, в какой они сборке. Во многих языках (например, в C++ и C#) такой модификатор называется protected.

  • Родовой и сборочный (family and assembly) — метод может вызываться производными типами, но только если они определены в той же сборке. Многие языки (вроде C# и Visual Basic) не реализуют такое ограничение доступа. В ассемблере IL такой модификатор, естественно, предусмотрен.

  • Сборочный (assembly) — метод может вызываться любым кодом из той же сборки. Во многих языках этому соответствует модификатор internal.

  • Родовой или сборочный (family or assembly) — метод может вызываться производными типами из любой сборки и любыми типами из той же сборки. В C# этому соответствует protected internal.

  • Открытый (public) — метод доступен любому коду из любой сборки. Еще одно правило CTS: все типы должны (в конечном счете) наследовать типу System.Object. Как видите, Object — имя типа, определенного в пространстве имен System. Object является корнем всех остальных типов, гарантируя наличие некоторой минимальной функциональности у каждого экземпляра типа. В частности, тип System.Object позволяет:

-сравнивать два экземпляра;

-получать хеш_код экземпляра;

-определять истинный тип экземпляра;

-получать поверхностную (побитную) копию экземпляра;

-получать текущее состояние экземпляра объекта в виде строки.