Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 09 2016 20:21:34
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Универсальные типы


Особенности реализации универсальных типов
Определение и создание универсального класса
Ковариантность и контрвариантность
Генерики C# и шаблоны C++ (заключение)


[Следующая страница]

3.1. Особенности реализации универсальных типов в языках программирования C#, C++ и Java

Универсальные или параметризованные типы – это не открытие языка C#, или любого другого CLR исполняемого языка. Это скорее реализация идей, заложенных в языках программирования C++ и Java, а также их некоторое развитие и переосмысление. Шаблоны в языке C++, универсальные типы или г(дж)енерики в языке Java и универсальные типы в языке C# имеют одно и то же предназначения, сходный синтаксис, но различную реализацию.

Универсальный тип (шаблон) - обобщенное описание структуры данных или фрагмента программы, параметризованное набором типов-параметров. Шаблон описывает общее поведение структурной единицы программы без привязки к конкретным значениями типов-параметров.

Естественно, что не только подходом к реализации универсальных типов язык C++ отличается от языка C#, разница намного глубже. Например, эти языки сильно отличаются способом компиляции исходного кода, и, в частности, моментом, когда происходит генерация машинного кода (генерация инструкций, интерпретируемых и выполняемых микропроцессором вычислительной машины). В C++ все реализации универсальных типов преобразуются в инструкции машинного кода во время компиляции, т.е. до момента исполнения программы.

Реализация универсального типа - структура данных, полученная в ходе подстановки в универсальный тип конкретных значений типов-параметров.

В C#, как и в любом другом CRL исполняемом языке программирования, сначала формируется промежуточный код (CIL код), который преобразуется в машинный код только в момент первого обращения к типу. В отношении универсальных типов в CLR это означает, что каждая реализация универсального типа появляется в виде машинного кода только в момент первого к нему обращения, что, в свою очередь, является результатом обработки JIT - компилятором соответствующего фрагмента CIL кода.

Особо внимательные могут задать резонный вопрос: а разве на этапе формирования CIL-кода не исчезает вся эта универсальность. Не происходит ли так называемое стирание типов за счет трансляции универсального типа в CIL - код его реализаций? В случае с .NET такого не происходит, поскольку CIL сам поддерживает универсальные типы. Это означает, что универсальный тип на C# просто трансформируется в универсальный тип в терминах CIL. Это обстоятельство позволяет виртуальной машине CLR и ее JIT компилятору откладывать создание реализации универсального типа до момента исполнения программы. Даже более того: если вы не используете в своей программе все функциональные возможности универсального типа, то и реализация этого универсального типа в виде машинного кода будет сформирована не полностью. В этом, кстати, кроется основное отличие универсальных типов .NET от универсальных типов в языке Java. Виртуальная машина Java (JVM) и ее JIT - компилятор имеют дело с байт-кодом (аналог CIL для JVM), который, после этапа интерпретации кода на языке Java уже не содержит информации о параметрах универсальных типов, а содержит только их реализации (байт-код не поддерживает параметризованные типы). Есть мнение, что это является существенным минусом реализации универсальных типов на Java, поскольку на этапе выполнения вы не можете обращаться к информации о типе параметра того или иного генерика, поскольку ее на этом этапе уже просто нет. Если выражаться более корректно, то в случае с Java на этапе исполнения уже нет информации о том, что мы имеем дело с универсальным типом, а, соответственно, нет и информации о каких-то там параметрах этого универсального типа.

Так получилось, что только тема универсальных типов в C# сподвигла меня на то, чтобы залезть в детали работы CLR. Спорить на тему, что лучше реализовано: шаблоны (templates) в C++ или универсальные типы в C#, как мне кажется, смысла особого не имеет, поскольку очевидна существенная разница в подходе к компиляции и исполнению исходного программного кода, а разница в функциональности универсальных типов этих языков объясняется, в том числе, особенностями этих подходов.

Стоит также отметить, что виртуальные машины дают кроссплатформенность за счет использования промежуточного, независимого от особенностей каждой отдельной платформы (операционной системы) языка (CIL, байт-код). Нужна только своя виртуальная машина для каждой отдельной операционной системы. С другой стороны имеет место дополнительный расход памяти на хранение результатов компиляции промежуточного языка в машинный код и расход времени на саму компиляцию, которое стараются сократить за счет частичной компиляции только используемого при исполнении программы кода, а не всей программы целиком.

На этом я позволю себе закончить вводную часть. Итак, универсальным типом в C# может быть класс, интерфейс, метод и делегат. О первых трех пойдет речь в этом разделе, а об универсальных делегатах в следующем.



[Следующая страница]

Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.