Шаблоны — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Ссылки на статьи о концептах)
м (Java)
 
(не показано 11 промежуточных версий 4 участников)
Строка 1: Строка 1:
 
Здесь будет собираться вся информация, связанная с шаблонами.
 
Здесь будет собираться вся информация, связанная с шаблонами.
 +
 +
==Java==
 +
Шаблоны в Java обладают следующими особенностями:
 +
 +
# Виртуальная машина Java не имеет дело с объектами обобщенных типов. Таким образом, шаблоны были введены в Java без существенных модификаций виртуальной машины.
 +
# Типы-параметры шаблона могут содержать ограничения: реализация интерфейсов и наследование от некоторого класса. Для этого применяется ключевое слово '''extends''' <code>public static <T extends Comparable<? super T>> T max(T[] a)</code>
 +
# При компиляции обобщённых типов или методов компилятор производит ''подчистку'' шаблона, при которой все типы-параметры шаблона превращаются в свои базовые классы (если не было ограничений, то в '''Object'''). Например, шаблон из предыдущего пункта будет при компиляции подчищен до <code>public static Comparable max(Comparable[] a)</code> Если тип-параметр реализует несколько интерфейсов, то при подчистке он превращается в первый интерфейс этого списка (или в предка, если он есть). При необходимости компилятор вставит приведения типа к остальным интерфейсам списка.
 +
# При явном использовании шаблонного типа в качестве его сырого (подчищенного) варианта компилятор выдаёт предупреждение. Это сделано для совместимости с уже написанным кодом, использующим нешаблонные коллекции.
 +
# Для сохранения цепочек виртуальности генерируются методы-мосты. Например,<br />
 +
<source lang="Java">class DateInterval extends Pair<Date>
 +
{
 +
  public Date getSecond(){...}
 +
}</source>
 +
Предположим, у подчищенного класса <code>Pair</code> есть свой метод <code>getSecond</code>, возвращающий <code>Object</code>. Тогда для работы механизмов виртуальности в <code>DateInterval</code> будет сгенерирован метод <code>Object getSecond{...}</code>, вызывающий <code>getSecond</code>, определённый пользователем.
 +
# Есть подстановочные типы и супертипы. Это может упростить работу с шаблонами:
 +
#*<code>Pair<? extends myClass></code> означает пару, параметризованную потомком MyClass
 +
#*<code>Pair<? super myClass></code> означает пару, параметризованную предком MyClass.<br />И то, и другое может применяться только в заголовках методов.
 +
# При помощи рефлексии можно даже во время выполнения выудить информацию о происхождении подчищенных типов (если виртуальная машина достаточно новой версии и поддерживает это).
 +
 +
Шаблоны Java имеют следующие ''ограничения'':
 +
# Типы-параметры не могут принимать примитивные типы, например, int или double. Происходит из-за невозможности подчистки (эти типы не приводятся к Object).
 +
# Нельзя генерировать и перехватывать исключения обобщённых типов.
 +
# Запрещены массивы обобщённых типов.
 +
# Нельзя создавать экземпляры типов-параметров (можно только сложным способом - при помощи рефлексии).
 +
# Шаблонный тип не может содержать статические переменные (т.к. они превращались бы при подчистке в одну переменную для всех инстанций).
 +
 +
==Ada==
 +
 +
# В Ада шаблонными могут быть подпрограммы и пакеты (аналоги классов в других языках).
 +
# В языке есть богатая система ограничений для типов-параметров шаблона. Например, можно указать не только базовый тип, но и просто сказать, что тип-параметр T должен быть каким-нибудь целым типом. Такая система ограничений введена, по-видимому, из-за ориентации языка на применимость к численным методам.
 +
# Можно использовать не только параметры-типы, но и параметры-значения (как в C++). Например, шаблон может быть параметризован целым числом.
 +
# Параметром шаблона может быть не только тип, но и подпрограмма. При этом сигнатура подпрограммы указывается. Это упрощает работу с шаблонами, предоставляя механизм более мощный, чем интерфейсы в C#/Java.
 +
 +
Шаблоны Ада обладают следующими недостатками:
 +
 +
# Для использования некоторой шаблонной сущности необходимо заранее создать её нешаблонный псевдоним.
 +
# Возможно падение эффективности шаблонного кода по сравнению с нешаблонным, так как компилятор может создавать один и тот же код для всех инстанций шаблона.
  
 
==Ссылки на статьи о шаблонах==
 
==Ссылки на статьи о шаблонах==
  
 
# [http://www.digitalmars.com/d/2.0/template-comparison.html Сравнение шаблонов C++ и D]
 
# [http://www.digitalmars.com/d/2.0/template-comparison.html Сравнение шаблонов C++ и D]
# [http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_C%2B%2B Шаблоны в Википедии]
+
# [http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_C%2B%2B Шаблоны С++ в Википедии]
  
==Ссылки на статьи о концептах==
+
== Ссылки на статьи о концептах C++ ==
  
 
# [http://en.wikipedia.org/wiki/C%2B%2B0x#Concepts Концепты в англ. Википедии]
 
# [http://en.wikipedia.org/wiki/C%2B%2B0x#Concepts Концепты в англ. Википедии]
# [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1849.pdf Статья "Concepts for C++0x"]
+
# [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2081.pdf Проект концептов в C++0x (ревизия 1)] — комитет по стандартизации C++
# [http://it.mmcs.rsu.ru/files?func=fileinfo&id=1135 Концепты - раздаточный материал на лекции по курсу "Стандартная библиотека C++"]
+
# [http://www.generic-programming.org/software/ConceptGCC/ Домашняя страница экспериментального компилятора ConceptGCC (форк GCC), поддерживающего концепты C++0x] (автор: Дуг Грегор, один из автора проекта концептов комитета по стандартизации)
 +
# [http://en.wikipedia.org/wiki/ConceptGCC Статья о ConceptGCC в английской Википедии]
 +
# [http://video.google.com/videoplay?docid=-1790714981047186825 Лекция Дуга Грегора о концептах]
 +
# [http://it.mmcs.sfedu.ru/files?func=fileinfo&id=1135 Концепты — раздаточный материал на лекции по курсу «Стандартная библиотека C++»]
 +
# Библиотека [http://www.boost.org/doc/libs/1_39_0/libs/concept_check/concept_check.htm The Boost Concept Check Library (BCCL)] (из состава [http://www.boost.org/ Boost]), реализующая идею концепций в существующем стандарте языка.
 +
# Концепции не будут включены в новую версию стандарта языка: [http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=441 C++: The Removal of Concepts From C++0x], [http://it.mmcs.sfedu.ru/forum?func=view&catid=35&id=30626#30626 комментарий] на нашем форуме.

Текущая версия на 01:53, 1 февраля 2010

Здесь будет собираться вся информация, связанная с шаблонами.

Java

Шаблоны в Java обладают следующими особенностями:

  1. Виртуальная машина Java не имеет дело с объектами обобщенных типов. Таким образом, шаблоны были введены в Java без существенных модификаций виртуальной машины.
  2. Типы-параметры шаблона могут содержать ограничения: реализация интерфейсов и наследование от некоторого класса. Для этого применяется ключевое слово extends public static <T extends Comparable<? super T>> T max(T[] a)
  3. При компиляции обобщённых типов или методов компилятор производит подчистку шаблона, при которой все типы-параметры шаблона превращаются в свои базовые классы (если не было ограничений, то в Object). Например, шаблон из предыдущего пункта будет при компиляции подчищен до public static Comparable max(Comparable[] a) Если тип-параметр реализует несколько интерфейсов, то при подчистке он превращается в первый интерфейс этого списка (или в предка, если он есть). При необходимости компилятор вставит приведения типа к остальным интерфейсам списка.
  4. При явном использовании шаблонного типа в качестве его сырого (подчищенного) варианта компилятор выдаёт предупреждение. Это сделано для совместимости с уже написанным кодом, использующим нешаблонные коллекции.
  5. Для сохранения цепочек виртуальности генерируются методы-мосты. Например,
class DateInterval extends Pair<Date>
{
  public Date getSecond(){...}
}

Предположим, у подчищенного класса Pair есть свой метод getSecond, возвращающий Object. Тогда для работы механизмов виртуальности в DateInterval будет сгенерирован метод Object getSecond{...}, вызывающий getSecond, определённый пользователем.

  1. Есть подстановочные типы и супертипы. Это может упростить работу с шаблонами:
    • Pair<? extends myClass> означает пару, параметризованную потомком MyClass
    • Pair<? super myClass> означает пару, параметризованную предком MyClass.
      И то, и другое может применяться только в заголовках методов.
  2. При помощи рефлексии можно даже во время выполнения выудить информацию о происхождении подчищенных типов (если виртуальная машина достаточно новой версии и поддерживает это).

Шаблоны Java имеют следующие ограничения:

  1. Типы-параметры не могут принимать примитивные типы, например, int или double. Происходит из-за невозможности подчистки (эти типы не приводятся к Object).
  2. Нельзя генерировать и перехватывать исключения обобщённых типов.
  3. Запрещены массивы обобщённых типов.
  4. Нельзя создавать экземпляры типов-параметров (можно только сложным способом - при помощи рефлексии).
  5. Шаблонный тип не может содержать статические переменные (т.к. они превращались бы при подчистке в одну переменную для всех инстанций).

Ada

  1. В Ада шаблонными могут быть подпрограммы и пакеты (аналоги классов в других языках).
  2. В языке есть богатая система ограничений для типов-параметров шаблона. Например, можно указать не только базовый тип, но и просто сказать, что тип-параметр T должен быть каким-нибудь целым типом. Такая система ограничений введена, по-видимому, из-за ориентации языка на применимость к численным методам.
  3. Можно использовать не только параметры-типы, но и параметры-значения (как в C++). Например, шаблон может быть параметризован целым числом.
  4. Параметром шаблона может быть не только тип, но и подпрограмма. При этом сигнатура подпрограммы указывается. Это упрощает работу с шаблонами, предоставляя механизм более мощный, чем интерфейсы в C#/Java.

Шаблоны Ада обладают следующими недостатками:

  1. Для использования некоторой шаблонной сущности необходимо заранее создать её нешаблонный псевдоним.
  2. Возможно падение эффективности шаблонного кода по сравнению с нешаблонным, так как компилятор может создавать один и тот же код для всех инстанций шаблона.

Ссылки на статьи о шаблонах

  1. Сравнение шаблонов C++ и D
  2. Шаблоны С++ в Википедии

Ссылки на статьи о концептах C++

  1. Концепты в англ. Википедии
  2. Проект концептов в C++0x (ревизия 1) — комитет по стандартизации C++
  3. Домашняя страница экспериментального компилятора ConceptGCC (форк GCC), поддерживающего концепты C++0x (автор: Дуг Грегор, один из автора проекта концептов комитета по стандартизации)
  4. Статья о ConceptGCC в английской Википедии
  5. Лекция Дуга Грегора о концептах
  6. Концепты — раздаточный материал на лекции по курсу «Стандартная библиотека C++»
  7. Библиотека The Boost Concept Check Library (BCCL) (из состава Boost), реализующая идею концепций в существующем стандарте языка.
  8. Концепции не будут включены в новую версию стандарта языка: C++: The Removal of Concepts From C++0x, комментарий на нашем форуме.