эволюция КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #065, стр. 065-022-6 возможности метапрограммирования в новом стандарте также усилены. Опять-таки, мы столкнулись с возвратом к древнему самомодифицирующемуся коду, только под новым углом. В отличие от функционального программирования, метапрограммирование ориентировано на создание программ, манипулирующих другими программами или самими собой, что на С++ реализуется опять же посредством шаблонов. В частности, пример метареализации факториала выглядит так: template struct Factorial; template <> struct Factorial<1>; Красиво, конечно, но, увы, неэффективно! шаблоны представляют одну из тех областей языка, агрессивного использования которых по возможности следует избегать, поскольку качество реализации компиляторов оставляет желать лучшего. Баги в основном сосредоточены именно здесь. С другой стороны, шаблоны значительно упрощают программирование, ускоряя процесс разработки программы в несколько раз, а ошибки трансляторов исправляются по мере обнаружения. Нельзя просто сидеть и ждать. Разработчиков компиляторов нужно именно пинать, чтобы они довели поддержку шаблонов до ума. В стороне от шаблонов идет возня по стандартизации механизма обработки структурных исключений и «декорации» (decoration) имен (также называемое «мангляжом»). До тех пор пока это не будет сделано, объектные файлы, сгенерированные различными компиляторами, останутся несовместимыми между собой и будут препятствовать созданию «смешанных» проектов. Впрочем, уже сейчас существуют линкеры, поддерживающие несколько компиляторов, например, в Microsoft Visual C++ и Borland Builder. остальные «инновации» в новом стандарте носят сугубо «косметический» характер, к которому относится появление типа long long или возможность записи «list<vector<string>>» вместо «list<vector<string> >» (всегдя пользовался первым вариантом - cl не возражал - прим. AvaLANche). Компилятор GCC начиная с версии 4.0.2 также поддерживает новый стандарт, однако не в полной мере. В архиве с исходными кодами находится директория gcc/testsuite/g++.dg/tc1 — здесь тестовые примеры и текущий статус. Проваленные тесты отмечаются ключевым словом «xfail» в комментариях, что означает «данный тест еще не реализован». Ко всем остальным прилагаются «дефектные рапорты» (defect report), по одному рапорту на файл. |