Учебное пособие (1077022), страница 2
Текст из файла (страница 2)
В Java язык10MSIL называется байт-кодом (byte code). На платформе Java такжереализован сборщик мусора, в языке Java как и в C# существует операторnew и отсутствует оператор delete.Платформа .NET часто подвергается критике по той причине, что онаможет быть запущена только под управлением операционной системыWindows. Преимуществом платформы Java является то, что она можетбыть запущена под управлением операционных систем Windows, macOS,различныхверсийLinux,атакженекоторыхдругих,менеераспространенных операционных систем.Для преодоления данного ограничения .NET, открытым сообществомбыла начата разработка аналога платформы .NET, который мог бывыполняться под управлением различных операционных систем.
Этаплатформа получила название Mono, ее первая версия появилась в 2004году. Официальный сайт Mono – http://www.mono-project.com. ПлатформаMono, как и Java, может быть запущена под управлением операционныхсистем Windows, macOS, различных версий Linux.Интересным является тот факт, что компания Microsoft практически ссамого начала поддержала разработку платформы Mono, официальнопризнала ее версией .NET для macOS и Linux, и, даже ограничила действиенекоторыхпатентов,длятогочтобыплатформаMonoмоглабеспрепятственно развиваться.Также компания Microsoft, в том числе для поддержки проекта Mono,раскрыла некоторые технологии и языки, связанные с .NET, и сделала ихмеждународными стандартами. В частности версия 4 языка C# былаопубликована в виде международных стандартов ECMA-334 и ISO/IEC23270:2006.В настоящее время разработчикам платформы Mono удалось добитьсяочень хорошей совместимости с .NET.
В большинстве случаев бинарные11файлы проекта, который был скомпилирован в MSIL в среде .NET под ОСWindows, могут быть перенесены на ОС Linux и запущены в среде Mono.Однако необходимо учитывать, что не все библиотеки и фреймворки.NET поддерживаютсяв Mono. Поэтому, если читатель захочетразработать проект, который предполагается запускать и в .NET и в Mono,то необходимо проверить, что все библиотеки и фреймворки, которыепредполагается использовать, поддерживаются обеими платформами.Несмотря на вполне гармоничное сосуществование платформ .NET иMono, наличие двух платформ все-таки нельзя было признать идеальнымвариантом.
Поэтому в настоящее время компания Microsoft началаразработку платформы .NET Core. Версия 1.0 была выпущена в июне 2016года. Платформа .NET Core, как и Mono является проектом с открытымисходным кодом, который располагается в репозитории GitHub.Разработка платформы .NET Core преследует две цели. Первая цель –создание единой платформы, которая может выполняться под управлениемразличных операционных систем. Вторая цель – создание платформынового поколения, которая учтет основные ошибки при проектировании.NET и Mono, станет более модульной и производительной платформой,вберет в себя лучшие особенности платформ .NET и Mono, и постепеннозаменит их.В настоящее время все три платформы: .NET, Mono и .NET Coreактивноразвиваются.Такая«конкуренция»несоздаетпроблемразработчикам, потому что проект на C# может быть с минимальнымидоработками скомпилирован под все три платформы.
Проблемой прикомпиляции может стать только наличие определенной библиотеки илифреймворка под конкретную платформу.В нашем пособии мы постараемся дать читателю базовые знанияязыка C#, которые позволят разрабатывать приложения под все триплатформы.122.2 Особенность компиляции и исполнения приложенийдля среды исполнения .NETВ данном разделе на примере среды исполнения .NET мы наконцептуальномуровнерассматриваемпроцесскомпиляцииикомпоновки. Приведенные рассуждения также справедливы для платформMono и .NET Core.Рассмотрим процесс компиляции и компоновки для языков безиспользования среды исполнения, который приведен на рис.
1.ИсходныеИсходныефайлыфайлыпрограммыпрограммы1.1. КомпиляцияКомпиляция иикомпоновкакомпоновкаИсполняемыйИсполняемыйкодкодПодключаемыеПодключаемыебиблиотекибиблиотекиРис. 1. Процесс компиляции и компоновки без использования среды исполнения.В этом случае исходные файлы программы сначала компилируются,затем скомпилированные модули компонуются, к ним присоединяютсябиблиотеки и получается исполняемый код, который представляет собоймашинные команды для конкретного микропроцессора.Безусловно, процесс на рис.
1 представлен схематично, он можетсущественно различаться в деталях для конкретных языков и технологий.Если считать компиляцию и компоновку частями одного процесса, томожно принять что такой процесс для языков без использования средыисполнения выполняется в одну фазу. Процесс компиляции и компоновкина платформе .NET выполняется в две фазы (рис.
2).В этом случае в результате формируется MSIL-код, так называемыйфайл сборки (.dll или .exe).При запуске файла сборки происходит процесс JIT-компиляции (JIT –Just In Time компиляция, преобразование MSIL-кода в исполняемый код13дляконкретногомикропроцессоранаданномкомпьютере).JIT-компиляция производится в памяти, исполняемый код запускаетсянемедленно и не сохраняется на жесткий диск.ИсходныеИсходныефайлыфайлыпрограммыпрограммы1.1. КомпиляцияКомпиляция иикомпоновкакомпоновкаMSIL-кодMSIL-код2.2. JIT-компиляцияJIT-компиляцияИсполняемыйИсполняемыйкодкодПодключаемыеПодключаемыебиблиотекибиблиотекиРис. 2. Процесс компиляции, компоновки и исполнения программы для .NETплатформы.Разработчику, не знакомому с виртуальными средами исполнения.NET или Java подобная схема может показаться на первый взглядсовершенно бессмысленной.
Действительно, ведь при использовании,например, языка C++ в результате компиляции и компоновки получается«быстрый» машинный код, который сразу же исполняется. В случаевиртуальной среды сначала генерируется «ненужный» промежуточныйкод, затем он переводится в быстрый машинный код и выполняется.Складывается впечатление, что вторая схема в плане исполнения кодадолжна быть медленнее первой. Но парадокс в том, что она обычнооказывается быстрее. Для этого есть две причины.Первая состоит в том, что для программы на С++ обычно неизвестнона какой платформе (на каком конкретно микропроцессоре) будетисполнятьсякод.подмножествоПоэтомукомпиляторобычногенерируеттомашинных команд, которое будет выполняться набольшинстве микропроцессоров, то есть приоритет при генерации кодаотдаетсясовместимостисмикропроцессоромвущербпроизводительности.
В случае же виртуальной среды такой проблемы невозникает – JIT-компилятор способен определить, какой микропроцессор14установлен на данном компьютере и может генерировать команды,оптимальные по производительности для данного микропроцесса.Вторая причина заключается в том, что JIT-компилятор имеетвстроенный профилировщик кода, то есть он оценивает качество искорость выполнения сгенерированного кода. При необходимости JITкомпиляторповторногенерируетмашинныйкод,которыйбудетвыполняться быстрее.JIT-компиляторы впервые появились на Java-платформе.
В первыхверсиях Java исполняемый код (байт-код) интерпретировался, чтозначительноснижалопроизводительность.ЗатемпоявилисьJIT-компиляторы, которые на лету преобразовывали байт-код в машинныйкод, что повышало производительность Java-машины. В среде .NET JITкомпилятор существовал изначально, поэтому даже у первых версийплатформы.NETпрактическиникогданевозникалопроблемспроизводительностью.2.3 Контрольные вопросы к разделу 21.
Что такое MSIL?2. Что такое CLR?3. Для чего используется сборщик мусора?4. В чем различие между платформами .NET, Mono и .NET Core?5. Опишите процесс компиляции, компоновки и исполненияпрограммы для .NET-платформы.6. В чем различие между процессами компиляции и компоновкидля языков без использования среды исполнения и для .NETплатформы?7. Что такое JIT-компиляция?158. Почему машинный код, сформированный JIT-компилятором,будетвнекоторыхслучаяхвыполнятьсябыстрее,чеммашинный код, сформированный обычным компилятором?3 Основы языка C#3.1 Организация типов данных в языке C#Особенность типов данных языка C# заключается в том, что для всейсреды исполнения .NET используется единая общая система типов – CTS(Common Type System), причем как в C#, так и в Visual Basic .NET идругих языках .NET-платформы.Все типы данных разделяются на типы-значения (value type) иссылочные типы (reference type).Типы-значения хранятся в области памяти, доступ к которойорганизован в виде стека.
К ним относятся: базовые типы данных; перечисления (enum); структуры (struct).Если переменная типа-значения передается как параметр в метод, то встеке делается копия значения и передается в метод, а исходное значениене изменяется. В частности, такой порядок копирования значений удобендля примитивных типов.Ссылочные типы хранятся в динамически распределяемой областипамяти, которую принято называть кучей (heap).
Для работы с нейиспользуются ссылки, фактически являющиеся указателями. Ссылочнымитипами являются: классы; интерфейсы; массивы;16 делегаты.Если переменная ссылочного типа передается в метод как параметр,то фактически передается указатель на эту переменную, при этом неделается копия значения (как в случае типа-значения). Поэтому еслизначение переменной, переданное по ссылке, изменяется в методе, тоисходное значение вследствие этого также меняется.
Такой порядоккопирования значений удобен, в частности, для передачи объектовклассов.В отличие от С++, в языке C# использование типов-значений иссылочных типов практически ничем не различается, для обозначенияссылок не применяют специальные символы «&». Использовать указатели(которые как и в С++ обозначаются символом «*») можно в такназываемом небезопасном (unsafe) режиме. Этот режим подходит длявзаимодействиясаппаратнымисредствами,оптимизациипроизводительности, в обычных приложениях применять unsafe-режимкатегорически не рекомендуется.















