Я видел это хорошее изображение здесь . Я узнал, что все компиляторы, которые поддерживают язык .net, конвертируют исходный код в CIL
формат. Теперь Microsoft никогда не вводит .NET
для всех операционных систем, написав CLR для всех операционных систем. Тогда зачем сохранять такой промежуточный формат кода и CLR для выполнения этого CIL. Разве это не головная боль, чтобы иметь дело с. Почему Microsoft выбрала именно так?
РЕДАКТИРОВАТЬ Эта своего рода архитектура имеет свою цену. Это снизит производительность, не так ли? Java делает это для поддержания независимости платформы, по какой причине .NET это делает? Почему бы не сохранить простой простой C-подобный компилятор. Любой способ также потребует, чтобы компилятор преобразовал код в CIL, если мне нужно добавить какой-либо новый язык, единственное отличие, которое он сделал бы, - это целевой язык. Тат это все.
Ответы:
Потому что им нужно написать только один компилятор для C # в CIL - это сложная часть. Создание интерпретатора (или чаще всего компилятора Just-In-Time) для CIL для каждой платформы сравнительно легко по сравнению с написанием компилятора из C # для (для каждой платформы) исполняемого кода.
Кроме того, среда выполнения может обрабатывать все, что компилируется в CIL. Если вам нужен новый язык (например, F #), вам нужно написать для него только один компилятор, и вы автоматически получите всю поддержку платформы для вещей, которые поддерживает .NET.
О, и я могу взять dll .NET и запустить его на Windows или Linux через Mono без перекомпиляции (при условии, что все мои зависимости удовлетворены).
Что касается производительности, это спорно. По сути, существуют «прекомпиляторы», которые принимают CIL и создают собственные двоичные файлы. Другие утверждают, что компиляторы точно в срок могут делать оптимизации, которые статические компиляторы просто не могут. По моему опыту, это во многом зависит от того, что делает ваше приложение и на какой платформе вы его запускаете (в основном, насколько хорош JITer на этой платформе). Мне крайне редко приходится сталкиваться со сценарием, в котором .NET недостаточно хорош .
источник
readonly
полей. Традиционные компиляторы могут выполнять некоторые из этих оптимизаций, но только тогда, когда они могут быть обнаружены статическим анализом. Напротив, джиттер может обнаружить во время выполнения, что (например) часть кода не выполняет никакой полезной работы, потому что на изменяемые объекты или переменные больше не ссылаются. Я не эксперт по дрожаниям, но в основном это вопрос силы динамического и статического анализа..NET имеет промежуточный язык (CIL / MSIL) и специфичные для платформы реализации независимой от платформы среды выполнения (CLR) по той же причине, что и в Java. Microsoft планировала, что C # будет напрямую конкурировать с Java, и это действительно так, в операционных системах, на которые ориентирована Microsoft (своей собственной).
Преимущества, даже несмотря на то, что .NET поддерживается только на платформах Windows (или в других операционных системах, имеющих аналог .NET, таких как Mono / Linux), аналогичны Java:
По причинам антимонопольного законодательства MS старается не допускать слишком сильного вмешательства в другие основные платформы, такие как Android, Mac OSX / iOS и Linux; однако, у него действительно есть команды, разрабатывающие для всех трех этих платформ. Существует версия Office для OSX, разработанная MS, есть множество приложений, в том числе приложения взаимодействия Office для iOS и Android, Skype (теперь продукт Microsoft) работает на Linux, и Microsoft даже видела вклад в ядро Linux (в основном в виртуализация мышления).
источник
Операционная система Windows доступна для разных типов процессоров, сегодня это в основном x64, x86, Intel, ARM.
CIL / CLR не зависит от этой аппаратной платформы - эти различия «абстрагируются» средой исполнения IL. Например, сборка .NET, скомпилированная для «любого процессора», обычно может выполняться на Win64 как 64-битный процесс, а Win32 - как 32-битный процесс без необходимости предоставления различных исполняемых файлов.
Более того, CIL позволяет хранить метаданные в сборках, что нелегко сделать с помощью собственных DLL (возможно, конечно, MS делала это раньше с COM-компонентами, но с этой технологией никогда не было так легко обращаться, как с компонентами .NET). Это делает создание программных компонентов чертовски простым и является основой для размышлений / самоанализа во всех языках .NET.
источник