16 апреля 2011 г.

MSIL, Compiler and CLR

Под компиляцией я подразумеваю контроль синтаксиса и анализ "корректного кода". (Дж. Рихтер)
Трудно не согласиться с дядей Рихтером. Все CLR-совместимые компиляторы (в частности Visual Studio) генерируют MSIL-код, являющийся managed code, и metadata (для каждого управляемого модуля).
Метаданные - это набор таблиц данных, описывающих то, что определено в модуле (типы и их члены), а также таблицы, указывающие, на что ссылается управляемый модуль (импортируемые типы и их члены).
MSIL - не зависящий от процессора объектно-ориентированный машинный язык. Он напоминает assembler, даже скорее некий высокоуровневый assembler. Всё дело в том, что он позволяет работать с объектами, имеет команды для вызова виртуальных методов и непосредственного манипулирования элементами массива.
Также хочется коснуться в пару словах темы: "IL и защита интеллектуальной собственности", которая на сегодняшний день очень популярна. На мой взгляд IL не обеспечивает достаточной защитой интеллектуальной собственности (если только код не выполняется на стороне сервера), т.к. имея в руках дизассемблер можно перевести IL в "родной код" и goodbye защита интеллектуальной собственности. Конечно, можно некоторые алгоритмы реализовать в неуправляемом модуле, содержащем машинные команды, но "против лома есть приём" (например ретрансляция).
Для выполнения какого-либо метода IL-код должен быть преобразован в машинные команды (да, те самые нолики и единички). Данную задачу выполняет JIT-compiler (just-in-time - компиляция IL-кода на лету, т.е. непосредственно перед вызовом метода). Поэтому снижение производительности происходит при первом обращении к методу.
По сути, CLR не знает, на каком языке написан код, т.к. он работает с MSIL-кодом.

Измерять продуктивность программирования подсчетом строк кода — это так же, как оценивать постройку самолета по его весу (Bill Gates).

Комментариев нет:

Отправить комментарий