И в этом смысле у. NET практически нет альтернатив, такого большого спектра языков и разнообразия подходов больше не найти. Причем сервисные средства. NET, такие как отладка, анализ кода и т. д., поддерживаются для всех без исключения языков, реализованных в рамках Visual Studio. То есть на каком бы языке ни велась разработка, программист получает все сервисные возможности, интегрированные в среду разработки. Как было сказано ранее, можно разрабатывать собственные языки программирования, это достаточно интересно и актуально. Одним из современных направлений развития программной инженерии является создание программного обеспечения на основе DSL – предметно-ориентированных языков, т. е. языков для приложений того или иного рода, той или иной предметной области.
Можно заметить, что одни языки разработаны Microsoft, другие – сторонними организациями и т. д. То есть существует бесконечное их разнообразие, поскольку есть возможность создать любой язык, погрузить его в. NET и экспериментировать.
Посмотрим на архитектурную схему: сбоку, интегрируя все доступные сервисы (рис. 8.1), начиная с уровня естественного языка, с уровня исходного кода на языке программирования, находится Visual Studio.NET – как средство разработки, оно интегрирует все особенности платформы. Основой для программирования являются различные языки программирования. Работа происходит в исходном тексте, в стандартном редакторе Visual Studio.NET, при этом на любом языке. Типы этого языка, какими бы своеобразными они ни были, транслируются автоматически при трансляции кода в стандартные системные типы. NET, т. е. имеют место трансляции в типы Common Language Specification (CLS). Далее используются на уровне пользовательского интерфейса различные веб-формы, веб-сервисы, скажем, средства SP.NET Windows Forms, технологии, связанные с. NET Remoting, и т. д. На уровне взаимодействия с данными используются технологии ADO.NET и т. д., слабоструктурированные данные могут преобразовываться по средствам форматов в стандарты XML. Естественно, все взаимодействие со средой выполнения строится на основе базовых классов. NET Framework, которые едины для любого языка программирования, строятся на основе компонентов, берущих свое начало в базовых классах. И все трансляции осуществляются в термины ассемблера высокого уровня – это ассемблер Common Language Runtime (CLR), т. е. виртуальной машины. NET (рис. 8.2).
Рис. 8.1.
Архитектурная схема. NET Framework и Visual Studio.NETРис. 8.2.
Схема компиляции в Common Language RuntimeПри компиляции некоторого модуля программного текста, который написан на том или ином языке, запускается компилятор, зависящий от языка программирования, но среда у них общая, и в итоге получается сборка в форме DLL или EXE, который содержит все необходимые метаданные, чтобы развернуть и запустить эту сборку в составе корпоративного приложения.
Естественно, трансляция осуществляется в терминал языка MSIL – это ассемблер высокого уровня, который в 3–5 раз плотнее, чем обычный ассемблер, если рассматривать, например, процессор Intel 8086 или ассемблер Z80.
Рис. 8.3.
Схема выполнения CLRПри этом в ряде случаев не представляется возможным осуществить безопасную компиляцию в управляемый код. К сожалению, работа с некоторыми механизмами, например с памятью, небезопасна, и в этом случае программист обязан пометить этот фрагмент кода как неуправляемый код. Он транслируется по другому пути, без MSIL, и объединяется с родным кодом уже как неуправляемый объект – и в этом случае ответственность за безопасность лежит на программисте. В любом другом случае компилятор преобразует сборку в исходный текст. После чего осуществляется сборка с использованием JIT-компилятора на платформе CLR, и, по сути, идет работа в терминах операционной системы, т. е. взаимодействие со средой Windows уже скомпилированного и собранного приложения.
Основные возможности, которые предоставляет среда CLR:
• поддержка стандартных типов и правил создания новых типов;
• межъязыковая интеграция:
– включение в код на одном ЯП классов на другом ЯП;
– обработка исключений из программы на одном ЯП программой на другом ЯП;
– и т. д.
• единый набор библиотек классов для всех поддерживаемых ЯП;
• самоописываемые компоненты – не требуют дополнительных файлов (IDL, TLB, Proxy/Stub и т. п.); компонент является самодостаточным, имеет всю необходимую информацию для встраивания его в программный продукт и разворачивания;
• поддержка версий компонентов и сборок кода;
• сервисы безопасности (запрет неавторизованного доступа к ресурсам для пользователей – Role-Based Security, доступ на основе безопасности кода – Code-Based Security и автор кода, версия сборки и др.).
Рассмотрим работу универсальной системы типизации (рис. 8.4).