Тема 3. Код общего языка CL
Простая модель компьютера
Модель предназначена для понимания основ разработки програм с использованием переменных и дисковых файлов.
Особенности родного языка процессоров ( Native Language ):
- Родные команды процессора представляются в виде 16-ричных чисел, например: 4b, 83, f2, bb, 00, 1d, … ;
- Каждый тип процессора имеет свой собственный набор команд;
- Программисту очень тяжело писать программу используя команды процессора напрямую;
- Программисту легко писать программу используя понятные текстовые команды, такие как print, move, return, divide, …;
- Имеется множество языков программирования, основанных на тексте ( С/С++, C#, VB, Pascal, … );
- Специальная программа – Компилятор переводит текст языков программирования в родные команды процессора.
Простая модель цепочки компиляции:
Общий Промежуточный Язык
- .NET Framework поддерживает выполнение кода Общего Промежуточного Языка CL ( Common Language );
- CL – Общий Промежуточный Язык, известный еще как MCIL ( Microsoft Common Intermediate Language );
- Код различных языков, таких как C#, Visual Basic .NET, C++ и т.т. переводится в Общий Промежуточный Язык для дальнейшего исполнения.
Простая модель цепочки компиляции с использованием промежуточного языка:
Особенности:
Компилятор 1 – компилятор со специфического языка (C#, VB .NET, C++, …) в язык CL;
Компилятор 2 – компилятор с языка CL в родной язык специфической платформы (Windows Desktop, Windows Server, Windows Mobile, … ). Компилятор 2 также называют Just-in-time ( JIT ) компилятором. CL код компилируется в Родной язык только по требованию ( когда нужен запуск кода ).
Простая модель интеграции различных языков программирования и различных платформ посредством CL:
Одно их преимуществ этой технологии - возможность создавать программный продукт используя различные языки и соответственно различных разработчиков.
Среда исполнения кода
При работе программного кода на компьютере необходимо учесть следующее:
Многозадачность – различные программы работают не зная и не задумываясь друг о друге. Программа не должна захватывать все ресурсы и выполнять несанкционированные действия.;
Фатальные ошибки – фатальная ошибка а одной программе не должна влиять на работу операционной системы и других программ;
Обслуживание – программа не должна заботиться о мелких операциях, таких как чтение/запись файла, сетевые операции. Ей должны предоставляться готовые функции.
Среда исполнения кода ( Runtime Environment ) выполняет все необходимые действия по подержке работы программ.
Среда исполнения кода общего языка CL
На что обратить особое внимание:
Garbage Collector – сборщик мусора. Управляет распределением памяти для прграмм. Удаляет «выброшенные» блоки памяти и упаковывает используемые блоки чтобы они не были разбросаны по всей системной памяти ( дефрагментирует ).;
Type Checker – следит за соответствием типов данных. Например чтобы вместо числа не передался бы текст.;
Thread Support – Поддерживает многозадачность.;
Exception Manager – Управляет исключительными ситуациями – например если произошла ошибка.
Security Engine – управляет уровнем доступа программы. Например может запретить запись в файлы.
Сборщик мусора
В классических языках программирования, таких как C, C++, Pascal, Assembler одним из наиболее важных типов проблем является так называемая "утечка памяти". Дело в том, что в сложных алгоритмах трудно отследить в какое время нужно освободить использованную память. Если это сделать слишком рано, в то время когда память используется можно создать условия для сложно уловимых и тяжёлых багов (программа может работать стабильно, но в ряде случаев выдавать разлмчные ошибки).
Если же память освобождать слишком поздно, в системе может просто напросто возникнуть нехватка памяти. В ряде случаев возникают сложности с контролем соответствия освобождений резервированиям памяти. Для серверных систем подобные утечки памяти могут быть критическими.
В современных языках программирования введены системы автоматического управления освобождения неиспользуемой памяти. В языке C++ используются так называемые "умные указатели". В таких языках как C#, Java введён так называемый сборщик мусора. Сборщик мусора работает независимо от программы в своём собственном процессе на уровне .NET Framework или Java Virtual Machine.
Сборщик мусора следит за ссылками на участки запрошенной памяти. Как только на участок памяти перестают указывать ссылки, сборщик понимает что этот участок программе больше не нужен и может его вернуть системе. Помимо того сборщик мусора перемещает используемые участки памяти устраняя её фрагментацию (как дефрагментация для файловой системы).
B C# имеется программный доступ к сборщику мусора посредством класса GC. Так например командой GC.Collect() можно дать запрос на сборку мусора. При этом сборщик мусора сам решит - делать ему сборку или не делать.
Дополнительная литература
Введение в C#, Язык C# и платформа .NET
Разъяснение промежуточного языка Microsoft (Microsoft Intermediate Language). Часть 1 – Введение
CLR - Введение