Короткі теоретичні відомості й історичний аспект

 

Середовище .NET Framework

 

.NET Framework — центральна частина Visual C++ 2005, як і всіх інших засобів розробки .NET компанії Microsoft. Середовище .NET Framework складається із двох елементів: загальноязикового виконуючого середовища (Common Language Runtime— CLR), у якій виконуються ваші програми, і набору бібліотек, називаних бібліотеками класів .NET Framework. Бібліотека класів .NET Framework забезпечує функціональну підтримку, що необхідна вашому коду при виконанні під керуванням CLR, незалежно від застосовуваної мови програмування, тому програми .NET, написані на З++,С# або будь-якій іншій мові, що підтримує .NET Framework, використають ті самі бібліотеки .NET.

Існують два принципово відрізняються виду додатків C++, які можна розробляти в Visual C++ 2005. Ви можете писати додатка, які виконуються на вашому комп'ютері як "рідні" (native). Ці програми будемо називати рідними програмами C++. Такі програми пишуться на версії мови C++, певної стандартом ISO/ANSI. Ви також можете розробляти програми, що виконуються під керуванням CLR і реалізовані за допомогою розширеної версії C++, що зветься C++/CLI. Ці програми ми будемо називати програмами CLR, або програмами C++/CLI.

 

Загальноязикове виконуюче середовище (CLR)

CLR - це стандартизоване середовище виконання програм, написаних на широкому діапазоні высокорiвневих мов, включаючи Visual Basic, C# й, зрозуміло, C++. Специфікації CLR у цей час убудовані в стандарт ЕСМА (European Association for Standardizing Information and Computer Systems - Європейська асоціація по стандартизації інформаційних й обчислювальних систем) інфраструктури загальної мови (Common Language Infrastructure - CLI) - ECMA-335, а також в аналогічний стандарт ISO - ISO/IEC 23271, тому CLR являє собою реалізацію цього стандарту. Ви бачите, чому C++ для CLR називається C++/CLI - це C++ для CLI, тому досить імовірно, що згодом незабаром з'являться компілятори C++/CLI для інших операційних систем, які реалізують CLI.

CLI - це, по суті, специфікація середовища віртуальної машини, що дозволяє додаткам, написаним на різноманітних высокоуровневых мовах програмування, виконуватися в різних системах без зміни й перекомпіляції оригінального вихідного коду. CLI специфицирует стандарт проміжної мови віртуальної машини, у який компілюється вихідний код высокоуровневого мови програмування. В.NET Framework ця проміжна мова називається Microsoft Intermediate Language (MSIL). Код цієї проміжної мови в остаточному підсумку при виконанні програми відображається на машинний код за допомогою оперативного компілятора (just-in-time- JIT). Звичайно, код проміжною мовою CLI може функціонувати тільки в середовищі, для якого існує реалізація CLI.

CLI також визначає загальний набір типів даних, називаний загальною системою типів (Common Type System - CTS), що повинен використатися програмами, написаними на будь-якій мові, орієнтованими на реалізацію CLI. CTS специфицирует те, як застосовуються типи даних усередині CLR, і містить у собі набір визначених типів. Ви можете також визначати власні типи даних, але їхнє визначення повинне підкорятися ряду правил, щоб вони були погодженими з CLR. Наявність стандартизованої системи типів для подання даних дозволяє компонентам, написаним на різних мовах, обробляти дані уніфікованим способом і забезпечує можливість інтеграції компонентів, написаних на різних мовах, в один додаток.

Код C++, виконуваний під керуванням CLR, називається керованим C++, тому що дані й код перебувають під контролем CLR. У програмах CLR звільнення пам'яті, динамічно виділеної для розміщення даних, здійснюється автоматично, що дозволяє виключити головне джерело помилок "рідних" додатків C++. Код C++, що виконується поза CLR, іноді називається в документації Microsoft некерованим C++, оскільки CLR у його виконанні не бере участь. У некерованому C++ ви повинні самостійно піклуватися про виділення й очищення пам'яті під час виконання програми, і вам доведеться самостійно забезпечувати безпека, що убудована в CLR. Ми також будемо називати некерований C++ рідним C++, тому що він компілюється безпосередньо в рідний машинний код.

На Рис. 8.1 показані основні варіанти вибору, які у вас є при розробці додатків C++.

 

 

Рис. 8.1. Основні варіанти вибору, доступні при розробці додатків на C++

 

C++/CLI - другий привселюдно доступний проект підтримки CLI-програмування мовою C++. Перша спроба була представлена фірмою Microsoft як Managed Extensions (керовані розширення до C++), неофіційно вона називалася Managed C++ ("Керований C++"). Ця мова була представлена у двох випусках Visual C++ (2002 й 2003) і продовжує підтримуватися як застарілий режим в Visual C++ 2005.

Синтаксис, прийнятий в Visual Studio .NET 2002, був максимально наближений до існуючого стандарту C++, тобто до Стандарту ISO C++ (ISO C++ Standard). Відповідно до цього стандарту, будь-які розширення мови повинні були відповідати правилам для язикових розширень. Крім інших обмежень, це означало, що ключові слова повинні були починатися з подвійного підкреслення (__). Таким чином, C++ з керованими розширеннями мав настільки незграбний синтаксис, що навряд чи його можна було вважати відповідної CLR.

Група C++ в Microsoft зрозуміла, що, для того щоб зробити програмування на C++ приємним й эстетически зробленим, а також використати всі переваги CLR, потрібно змінити синтаксис. І це означало, що потрібно зробити радикальний крок - відступити від Стандарту ISO на мову C++.

Однак Microsoft вирішила рішення стандарти, і вуж якщо довелося відступити від Стандарту ISO на C++, те, замість того щоб винайти "нестандартний" мову, було вирішено ввести новий стандарт. Так народився стандарт C++/CLI який і був реалізований в Visual C++ 2005.

Використовуючи C++/CLI можна створювати керовані код і дані. Однак у цей час C++ є єдиним із всіх мов .NET, за допомогою якого можна створювати також і некеровані код і дані. Фактично, керовані й некеровані код і дані на C++ можуть бути визначені в тому самому вихідному файлі, і до деякої міри ці два мири можуть взаємодіяти. Хоча використання керованих коду й даних має багато переваг, воно може привести до зниження продуктивності й втраті гнучкості. Тому в багатьох випадках C++ виявляється кращим вибором для створення програм. Іншою причиною вибору із всіх мов .NET саме C++ може бути бажання вдосконалювати знання

C++ й існуючі наробітки на цій мові.

 

Використання розширень керованого C++

При розробці керованого коду на Visual C++ використаються кілька нових ключових слів, а розширення компілятора C++, що дозволяє створювати додатка для .NET, викликається за допомогою параметра /CLR (Компіляція для виконання в загальноязиковому середовищі). Цей параметр указує компіляторові, що в кінцевому файлі варто застосовувати набір інструкцій проміжної мови IL, а не звичайний набір інструкцій процесора. Нові ключові слова використаються при створенні керованого коду й не підтримуються при створенні звичайного некерованого коду. Хоча наявність або відсутність параметра /CLR (Компіляція для виконання в загальноязиковому середовищі) повністю визначає, чи буде компілятор генерувати керований ( проміжною мовою IL) або некерований код, можна задавати режим компіляції для окремих частин програми. Це здійснюється за допомогою прагм #pragma:

#pragma managed // Наступний код компілюється як керований

#pragma unmanaged // Наступний код компілюється як некерований

 

Якщо задано параметр компілятора /CLR (Компіляція для виконання в загальязиковому середовищі), то при відсутності директив #pragma вихідний код за замовчуванням компілюється як керований. При відсутності параметра /CLR (Компіляція для виконання в обшеязыковой середовищу) прагмы #pragma компілятором ігноруються, а код компілюється як некерований.

 

#include "stdafx.h"

#include <stdio.h>

using namespace System;

#pragma unmanaged

void OutputUnmanage(char*s)

{

printf("OutputUnmanage : %s \n",s);

}

#pragma managed

void OutputManage(String ^s)

{

Console::WriteLine ("OutputManage : {0}",s);

}

int main()

{

char line[20]="We output this text";

 

OutputUnmanage(line);

OutputManage(gcnew String(line));

return 0;

}

У наведеному прикладі функція OutputUnmanage, що виводить переданий як параметр текст на екран компілюється як некерована. Якщо "забути" після її вставити директиву #pragma managed, то компілятор видасть кілька повідомлень про помилки, оскільки далі в тексті програми використаються конструкції, припустимі тільки в керованому З++, зокрема String^ й Console::WriteLine.