Преимущества исполнения программы как управляемого кода
Из приведенного описания уже очевидны некоторые преимущества исполнения управляемого кода:
· Прежде всего, улучшается безопасность. Благодаря тому, что сборка написана на промежуточном языке, среда исполнения .NET может проверить, что собирается делать код. Реальное преимущество здесь в том, что становится более безопасно выполнять код, полученный, например, по Интернету. Политика безопасности .NET для этого кода устанавливается таким образом, чтобы он получал права на выполнение лишь тех задач, которые он предположительно должен выполнять. .NET поддерживает как функциональную безопасность(базирующуюся на сущности процесса, исполняющего код), так и безопасность на основе кода(базирующуюся на степени доверия к самому коду).
· Присутствие сборщика мусора освобождает программиста от необходимости написания кода для освобождения используемой памяти. Это также означает, что отсутствует риск утечки памяти для всех переменных, обслуживаемых сборщиком мусора.
· Новая концепция областей приложений означает, что различные приложения, которые необходимо изолировать друг от друга, во которые в то же время должны общаться друг с другом, могут быть размещены в одном процессе. Это дает огромный выигрыш в производительности.
Необходимо отметить также следующие преимущества:
· В приведенном примере есть участки кода, исходный текст которых был написан как на С#, так и на VB.NET. Это означает, что имеет место совместимость языков, которая позволяет легко использовать код, написанный па разных языках.
· Самоописываемая структура сборок практически исключает ошибки, которые возникают из-за проблем версий или проблем, связанных с перезаписыванием другими приложениями совместно используемых сборок. Тем самым значительно экономятся время и стоимость разработки.
· Базовые классы .NET предлагают интуитивную, простую объектную модель, которая заметно упрощает вызовы функциональных возможностей Windows (в смысле упрощения исходного кода) по сравнению с тем, что было в прошлом.
На первый взгляд кажется, что будет иметь место потеря производительности, так как часть процесса компиляции осуществляется во время исполнения программы. Microsoft возражает тем, что в долгосрочном периоде это не будет являться проблемой, a JIT- компиляторы не ухудшают, а даже улучшают производительность. Этот вопрос подробно обсуждается ниже, в общих же словах, улучшение происходит потому, что JIT-компилятор знает, на каком процессоре будет исполняться код. Эта информация недоступна для традиционных компиляторов.
Промежуточный язык
Промежуточный язык и Java в своей основе имеют одну и ту же идею: это языки низкого уровня с простым синтаксисом (основанным на числовых кодах, а не на тексте), который может быть быстро оттранслирован в родной машинныйкод.
Напомним, что целью байт-кода Java является обеспечение платформенной независимости. Обладание четко определенным, универсальным синтаксисом байт- кода означало бы, что файл, содержащий инструкции байт-кода, мог бы быть размещен на любой платформе, например UNIX, Linux или Windows, а во время выполнения могла бы быть легко выполнена заключительная стадия компиляции, и код мог бы быть запущен на этой платформе. Следовательно, при написании исходного кода его можно было бы компилировать в байт-код Java, который может быть выполнен где угодно.
Промежуточный язык использует ту же концепцию, но более амбициозно. Важно то, что промежуточный язык компилируется при выполнении программы, в то время как байт-код Java интерпретируется. Это означает, что большая часть потерь производительности, связанных с интерпретацией байт-кода Java, не затрагивает IL.Код на промежуточном языке компилируется в родной машинный код, а не интерпретируется.
Целью промежуточного языка является не просто платформенная независимость, а языковая независимость в объектно-ориентированной среде. Идея заключается в том, что должна существовать возможность компиляции кода с любого языка, и компилированный код должен быть совместим с кодом, откомпилированным с других языков.
Эта совместимость достигается в .NET, так как с ее помощью можно писать код, который компилируется в промежуточный язык, на C++, VB.NET или С#. Компиляторы для других языков, включай COBOL, Eiffel и Per!, должны быть вскоре выпущены сторонними производителями. В настоящее время платформенная независимость является только возможной, так как во время создания среда .NET была доступна лишь для Windows, хотя сейчас ведутся активные разговоры о том, чтобы импортировать .NET на другие платформы. Из-за требований языковой независимости и совместимости промежуточный язык гораздо сложнее байт-кода Java.
Конечно, языковая независимость имеет некоторые практические ограничения. В частности, промежуточный язык неизбежно реализует некоторую определенную методологию программирования, а это означает, что языки, целью которых является IL, должны быть совместимы с этой методологией. Конкретный путь, который был выбран Microsoft, заключается в следовании классическому объектно-ориентированному программированию с классами и наследованием. Поэтому классы и наследование определены внутри промежуточного языка.
Ниже кратко рассматриваются характеристики промежуточного языка.