Если открыть любую книгу по программированию на С++, то почти наверняка найдем высказывание о том, что C++ - язык со статической типизацией. Статическая и динамическая типизация - взаимоисключающие понятия, если есть одно, то не может быть другого. Однако, вспомним, что в C++ есть шаблоны, а также есть шаблонное метапрограммирование (template metaprogramming).
В C++ есть мощный встроенный язык (хотя и с крайне неудобным синтаксисом, будем называть его mpl - meta programming language, название взято из книги про boost::mpl - "C++ template metaprogramming"), рассмотрим его поподробнее.
Входные и выходные параметры для программы на этом языке - это типы, функции, константы, с точки зрения языка C++
Процесс исполнения программы на mpl - это процесс перевода входных параметров в выходные, причем без побочных эффектов. Также необходимо заметить что язык mpl интерпретируемый, никакого промежуточного представления (компиляции) не требуется.
Что такое язык с динамической типизацией - это язык у которого тип переменной определяется в момент исполнения программы. При этом для обычно для начала выполнения достаточно лишь синтаксической правильности исходного кода. Например, python - язык с динамической типизацией, в нем конструкция вида:
Синтаксически правильна, однако мы не знаем правильна ли она семантически, пока не запустим программы на выполнение (потому что мы не знаем какого типа переменная x, и имеет ли смысл для нее операция сложения с числом).
Аналогично в шаблонном метапрограммировании:
Здесь мы не сможем сказать, выполнится ли наша программа на mpl пока ее не запустим, потому что мы не знаем, какого типа C++ наша переменная SomeVarT, и есть ли у этого типа C++ тип nested_type.
Поэтому, по всем признакам - это язык с динамической типизацией.
Теперь рассмотрим основные операции в mpl:
Операция присваивания:
С точки зрения языка C++ мы определяем новый тип, с точки зрения mpl - новую переменную.
Условный оператор в mpl - это частичная специализация в C++:
Здесь мы проверяем, что если Input == int, то для него result_type определяется иначе, чем для всех остальных.
В принципе, можно и дальше продолжить о возможностях языка, но я рекомендую прочитать две следующие книги:
"Андрей Александреску - Современное проектирование на C++", а также
"David Abrahams, Aleksey Gurtovoy - C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond"
В этих книгах более подробно рассказывается о шаблонном метапрограммировании, более подробно раскрываются техника написания шаблонных метапрограмм, можно также заглянуть в документацию по boost::mpl, документация к библиотеке отчасти пересекается с с книгой C++ Template Metaprogramming.
В C++ есть мощный встроенный язык (хотя и с крайне неудобным синтаксисом, будем называть его mpl - meta programming language, название взято из книги про boost::mpl - "C++ template metaprogramming"), рассмотрим его поподробнее.
Входные и выходные параметры для программы на этом языке - это типы, функции, константы, с точки зрения языка C++
Процесс исполнения программы на mpl - это процесс перевода входных параметров в выходные, причем без побочных эффектов. Также необходимо заметить что язык mpl интерпретируемый, никакого промежуточного представления (компиляции) не требуется.
Что такое язык с динамической типизацией - это язык у которого тип переменной определяется в момент исполнения программы. При этом для обычно для начала выполнения достаточно лишь синтаксической правильности исходного кода. Например, python - язык с динамической типизацией, в нем конструкция вида:
def func(x): return x + 5 |
_Winnie C++ Colorizer |
Аналогично в шаблонном метапрограммировании:
template <typename SomeVarT> struct make_list { typedef std::list<typename SomeVarT::nested_type> result_type; }; |
_Winnie C++ Colorizer |
Поэтому, по всем признакам - это язык с динамической типизацией.
Теперь рассмотрим основные операции в mpl:
Операция присваивания:
typedef valid_cpp_expression <for_type_definition> new_variable; |
_Winnie C++ Colorizer |
Условный оператор в mpl - это частичная специализация в C++:
template <typename Input> struct make_some_type { typedef typename Input::nested_type result_type; }; template <> struct make_some_type<int> { typedef int result_type; }; |
_Winnie C++ Colorizer |
В принципе, можно и дальше продолжить о возможностях языка, но я рекомендую прочитать две следующие книги:
"Андрей Александреску - Современное проектирование на C++", а также
"David Abrahams, Aleksey Gurtovoy - C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond"
В этих книгах более подробно рассказывается о шаблонном метапрограммировании, более подробно раскрываются техника написания шаблонных метапрограмм, можно также заглянуть в документацию по boost::mpl, документация к библиотеке отчасти пересекается с с книгой C++ Template Metaprogramming.
Да, mpl -сильная библиотек, кстати, перевод данной книги (вольный) и части документации можно найти тут:
ОтветитьУдалитьhttp://enotcpp.blogspot.com/2011/11/c-template-metaprogramming-david.html