Sunday, May 13, 2007

Новый C++09 ISO Standard Draft

..если кому интересно, можно взять тут.

Тут вот также пост Герба нашего Саттера, а так же видео (по ссылкам от [info]aruslan   ). Те, кто немного следит за процессом, вряд ли увидят там что-то новое — Саттер вот пишет про typedef templates и темплейты с произвольным количеством параметров. Для меня правда новостью было нечто под названием programmer-directed garbage collection.

 

В затихших нынче holy wars на тему C#(Java) vs C++ обычно рано или поздно всплывал тезис "да в C++ можно с полпинка сделать gc, тока кому это надо?" — поэтому почитать proposal на эту тему вдвойне интересно.

Авторы, в лучших традициях C++, подошли к вопросу аккуратно, чтобы никакой имеющийся код не поломать — и у них получилось, но, как обычно, те, кто будет этот самый GC все-таки использовать, получают дополнительный лес граблей.

В двух словах — сборщик мусора тупо сканит все объекты на наличие указателей (на уровне бинарного представления, независимо от типа). А чтобы он не надорвался, программист может ему поклясться в type safety для конкретного класса/структуры/модуля/переменной — то есть обещает с поинтерами никаким сексом не заниматься (прежде всего в int'ы, char[] и другие неподходящие места их не записывать). Тогда сборщик мусора будет обрабатывать только переменные, имеющие C++-тип указателя.

Естественно, заставить компилятор проверять типобезопасность самому означает сделать большую часть существующего кода некомпилируемым — на что комитет, естественно, не пойдет.

Плюс к этому, не совсем ясно будет ли gc двигать в памяти объекты — если не будет, то эффективность его под вопросом, если будет — всплывет изрядное количество всяких неочевидных проблем. Например, непонятно что будет с конструкциями типа std::map<Foo *, ...> в случае если объект может "плавать" в памяти.

В общем Саттеру с Мейерсом и Александреску материала для книжек "как обойти все подводные грабли C++" хватит еще надолго.

4 comments:

Raider said...

По-моему они фигней занимаются. Никак не пойму как можно встроить GC в такой низкоуровневый язык.

Лучше бы нормальную поддержку Unicode в стандартной библиотеке сделали.

lrrr said...

Да что-то они там с юникодом сделали хорошего, я не вникал правда.

А GC у них тоже такой на ручной тяге получился, да :) Вообще, имхо, этот GC в C++ и новых пользователей не привлечет, и олдскульных вряд ли сильно заинтересует.

Скорее парни решили идти в ногу со временем -- в районе 2009 года как раз исполняется 50 лет с тех пор как GC изобрели ;)

Raider said...

Стандартную библиотеку юникодной они так и не сделали :( Я имею ввиду чтобы подобные вещи
basic_ifstream::basic_ifstream(const char* s ,...);
принимали wchar_t и wstring.

GC действительно никому не будет нужным. Я вот с нетерпением жду новый стандарт только ради `auto' keyword ;)

OCTAGRAM said...

Такой GC уже есть в Boehm. Но в Boehm есть ещё возможность типизации данных, только типы нужно вручную для GC прописывать. Вот это на уровне стандарта решить можно было, я думаю.

Подход Microsoft: сделаем наполовину!