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

Переваги мови cil

На цьому етапі може виникнути питання про те, яку вигоду приносить компіляція вихідного коду в CIL, а не безпосередньо в набір орієнтованих на конкретну платформу інструкцій. Одним з найбільш важливих переваг такого підходу є мовна інтеграція. Як вже можна було побачити, всі компілятори .NET генерують приблизно однакові CIL-інструкції. Завдяки цьому всі мови можуть взаємодіяти в рамках чітко окресленої двійковій "арени".

Більше того, оскільки CIL не залежить від платформи, сама .NET Framework є незалежною від платформи, надаючи ті ж самі переваги, до яких звикли розробники на Java (наприклад, єдину кодову базу, здатну працювати в середовищах різних операційних систем). Насправді існує міжнародний стандарт для мови C# і великого підмножини платформи. NEГГ, а також реалізації для багатьох операційних систем, відмінних від Windows (більш докладно про це йтиметься в кінці цього розділу).

Компіляція cil-коду в інструкції, специфічні для платформи

Через те, що збірки містять CIL-інструкції, специфічні для платформи, CIL-код перед використанням повинен компілюватися на льоту. Компонент, який відповідає за компіляцію CIL-коду в зрозумілу процесору інструкцію, називається оперативним (just-in-time - JIT) компілятором (іноді його називають Jitter). Виконуюче середовище .NET використовує JIT-компілятор відповідно до цільового процесора і оптимізує його для базової платформи.

Наприклад, якщо будується додаток .NET, призначений для розгортання на портативному пристрої (наприклад, на мобільному пристрої Windows), відповідний JIT-компілятор буде оптимізовано для функціонування в середовищі з обмеженим обсягом пам'яті. З іншого боку, у випадку розгортання збірки на серверній системі (де обсяг пам'яті рідко становить проблему), JIT-компілятор буде оптимізовано для функціонування в середовищі з великим обсягом пам'яті. Це дає розробникам можливість писати єдиний блок коду, який буде автоматично ефективно компілюватися JIT-компілятором і виконуватися на машинах з різною архітектурою.

Більше того, при компіляції CIL-інструкцій до відповідного машинного коду JIT-компілятор буде кешувати результати в пам'яті в манері, підходящої для цільової операційної системи. У цьому випадку, якщо проводиться виклик методу по імені PrintDocumentO, відповідні CIL-інструкції компілюються в специфічні для платформи інструкції при першому виклику методу і залишаються в пам'яті для подальшого використання. Завдяки цьому, при виклику PrintDocumentO наступного разу повторна компіляція CIL-інструкцій не знадобиться.

На замітку! Можна також виконувати "попередню JIT-компіляцію" при установці програми за допомогою інструменту командного рядка ngen.exe, який входить до складу .NET Framework 4.5 SDK. Це дозволяє поліпшити показники часу запуску для додатків, насичених графікою.

Роль метаданих типів .Net

Крім CIL-інструкцій в збірці .NET містяться вичерпні і точні метадані, які описують кожен визначений у двійковому модулі тип (наприклад, клас, структуру, перерахування), а також члени кожного типу (наприклад, властивості, методи, події). На щастя, за генерацію новітніх і найкращих метаданих за типами завжди відповідає компілятор, а не програміст. Через те, що метадані .NET є настільки детальними, о збірки є цілком самоописующими сутностями.

Для ілюстрації формату метаданих типів .NET давайте розглянемо метадані, які були згенеровані для наведеного вище методу Add () з класу Calc мовою C# (метадані для версії методу Add () мовою Visual Basic аналогічні):

TypeDef # 2 (02000003)

TypDefName: CalculatorExample.Calc (02000003)

Flags: [NotPublic] [AutoLayout] [Class]

[AnsiClass] [BeforeFieldlnit] (00100001)

Extends: 01000001 [TypeRef] System.Object Method # 1 (06000003)

MethodName: Add (06000003)

Flags: [Public] [HideBySig] [ReuseSlot] (00000086)

RVA: 0x00002090

ImplFlags: [IL] [Managed] (00000000)

CallCnvntn: [DEFAULT] hasThis ReturnType: 14 лютого Arguments Argument # 1: 14 Argument # 2: 14 лютого Parameters

(1) ParamToken: (08000001) Name: x flags: [none] (00000000)

(2) ParamToken: (08000002) Name: у flags: [none] (00000000)

Метадані використовуються багатьма аспектами самого виконуючого середовища .NET, а також різними засобами розробки. Наприклад, засіб IntelliSense, що надається такими інструментами, як Visual Studio, працює за рахунок читання метаданих збірки під час проектування. Метадані також застосовуються різними утилітами для перегляду об'єктів, інструментами налагодження і самим компілятором С #.

Можна з повною впевненістю стверджувати, що метадані грають критично важливу роль у багатьох .NET-технологіях, включаючи Windows Communication Foundation (WCF), рефлексію, пізніше зв'язування і серіалізацию об'єктів. Більш докладно роль метаданих .NET розкривається в главі 15.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]