четверг, 4 ноября 2010 г.

Динамическая типизация в С++

Если открыть любую книгу по программированию на С++, то почти наверняка найдем высказывание о том, что C++ - язык со статической типизацией. Статическая и динамическая типизация - взаимоисключающие понятия, если есть одно, то не может быть другого. Однако, вспомним, что в 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
Синтаксически правильна, однако мы не знаем правильна ли она семантически, пока не запустим программы на выполнение (потому что мы не знаем какого типа переменная x, и имеет ли смысл для нее операция сложения с числом).
Аналогично в шаблонном метапрограммировании:
template <typename SomeVarT> struct make_list
{
    typedef std::list<typename SomeVarT::nested_type> result_type;
};
_Winnie C++ Colorizer
Здесь мы не сможем сказать, выполнится ли наша программа на mpl пока ее не запустим, потому что мы не знаем, какого типа C++ наша переменная SomeVarT, и есть ли у этого типа C++ тип nested_type.

Поэтому, по всем признакам - это язык с динамической типизацией.

Теперь рассмотрим основные операции в mpl:
Операция присваивания:
typedef valid_cpp_expression <for_type_definition> new_variable;
_Winnie C++ Colorizer
С точки зрения языка C++ мы определяем новый тип, с точки зрения mpl - новую переменную.
Условный оператор в 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
Здесь мы проверяем, что если 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.

1 комментарий:

  1. Да, mpl -сильная библиотек, кстати, перевод данной книги (вольный) и части документации можно найти тут:

    http://enotcpp.blogspot.com/2011/11/c-template-metaprogramming-david.html

    ОтветитьУдалить