Программирование >>  Полиморфизм без виртуальных функций в с++ 

1 ... 49 50 51 [ 52 ] 53 54 55 ... 144


пользователь об этом может и не знать, а сам компилятор убедиться в этом не способен. Из-за интенсивного использования указателей и ссылок в С++ возможно появление большого числа оп1ибок, и опыт Fortran тут ничего не доказывает;

□ альтернативы предложению недостаточно исследованы. Во многих случаях можно было бы провести начальную проверку на перекрытие и при его отсутствии выбрать оптимизированный вариант алгоритма. В других случаях стоит обратиться к специализированным математическим библиотекам (например, BLAS), которые имеют специальную поддержку для векторных операций. Еше предстоит изучить многообещающие альтернативные способы опти.мизации. Например, глобальная оптимизация относительно небольших и легко распознаваемых участков кода, где встречаются операции с векторами и матрицами, представляется вполне реализуемой в кохтиляторах С++ для высокопроизводительных компьютеров;

□ расширение зависит от архитектуры. Высокопроизводительные численные расчеты - это специальная область со свои.ми методами, зачастую предполагающая наличие особой аппаратуры. Поэтому лучше ввести нестандартное архитектурно-зависимое расширение или прагму. Если же такого рода оптимизация окажется полезной и более широкому кругу пользователей, то к рассмотрению этого расширения можно будет вернуться.

Принятое решение еще раз подтверждает, что С++ поддерживает абстрагирование за счет общих механизмов, а не специализированные приложения путем реализации специальных средств. Конечно, я хотел бы по.мочь людям, занимающимся численными расчетами, но как? Идти по стопам Fortran в реализации классических векторных и матричных алгоритмов - это далеко не всегда самый лучший путь. Было бы хорошо, если бы любую расчетную програм.му можно было написать на С++ без потери эффективности, но если не удастся достичь этого, не принося в жертву систему контроля типов С++, то, видимо, стоит обратиться к Fortran, ассемблеру или архитектурно-зависимы.м расширениям.

6.5.3. Наборы символов

Язык С ориентирован на американский вариант международного 7-битного набора символов ISO 646-1983, называемого также ASCII (ANSI3.4-1968). Это порождает две проблемы:

□ код ASCII содержит некоторые знаки препинания и специальные си.мволы, например ] или {, которых нет во многих национальных наборах символов;

□ В коде ASCII отсутствуют символы типа Е и ж, которых нет в английском алфавите.

6.5.5.7. Ограниченные наборы символов

В коде ASCII (ANSI3.4-1968) специальные символы [,],{,}, I и \ занимают позиции, которые по стандарту ISO отведены под буквы. В большинстве европейских национальных наборов символов ISO-646 эти позиции заняты буква.ми.



которых нет в английском алфавите. Например, в датском наборе символов на этих местах находятся гласные Ж, А, ае, , и и 0, без которых невозможно написать сколько-нибудь осмысленный датский текст. Это ставит датских программистов перед неприятным выбором: либо приобретать компьютеры, на которых есть полный 8-битный набор символов (например, ISO-8859/1/2), либо не использовать три гласные буквы своего родного языка, либо не программировать на С++. Люди, говорящие на немецком, французском, испанском, итальянском и других языках, сталкиваются с той же проблемой. Кстати, данное недоразумение стало серьезным препятствием на пути признания С в Европе, особенно в коммерческих приложениях (к примеру, банковских системах), поскольку 7-битные национальные наборы символов во многих странах используются повсеместно.

Рассмотрим, например, безобидную, на первый взгляд, профамму на ANSI С и С++:

int main(int argc, char* argv[]) {

if (argc<l II *argv[l] == \0) return 0; printf( Hello, %s\n ,argv[l]);

Ha стандартном датском терминале или принтере она будет выглядеть так:

int main (int argc, char* argvEA ) ae

if (argc<l ии *argvlA == 00) return 0; printf ( Hello, %s0n ,argvJElA) ;

&

Комитет ANSI С одобрил частичное решение проблемы, определив набор триграфов, с помощью которых можно вводить символы национальных алфавитов:

# [ { \ ] } I ~ 77= 77( 77< 77/ 77) 77> 77 771 77-

Возможно, для обмена профаммами это и имеет смысл, но удобочитаемость записи остается на прежнем уровне:

int maindnt argc, char* argv??(??)) ??<

if (argc<l ??!??! *argv??(l??) == ??/0) return 0; printf( Hello, %s??/n ,argv??{l??));

??>

Разумеется, решить эту проблему можно, купив оборудование, которое поддерживает как национальный язык, так и символы, необходимые С и С++. К сожалению, иногда это оказывается невозможным, да и вообще замена оборудования - процесс медленный. Чтобы помочь профаммистам, работающим на старом оборудовании, а значит, и продвигать С++, комитет по стандартизации решил предоставить более удобную нотацию.



содержащих символы национальных алфавитов.

Таблица 6.1

Ключевые слова

Диграфы

<% {

and eq й=

%> }

bitand й

<: [

bitor 1

:> 1

compl

%:

not !

%:%: ##

or 1 1

or eq 1 =

xor eq =

noC eq ! =

Я бы предпочел % %

для # и о для ! =, но % : и not eq - лучший компромисс,

на которо.м сошлись комитеты по С и С++.

В этих обозначениях наш пример выглядит следуюпцш образом:

int maindnt argc <%

, char* argv<: :>)

if (argc<l or

*argv<:1:>==??/0) return 0;

printf( Hello,

%s??/n , argv<:l:>);

%>

Замечу, что триграфы все-таки необходимы для вставки таких отсутствующих символов, как \, в строки и символьные константы.

Введение диграфов и новых ключевых слов вызвало споры. Многие пользователи - в основном, англоговорящие и имеющие большой опыт работы с С - не видели причин усложнять и портить С++ ради тех, кто не хочет купить приличное оборудование . Мне такая позиция близка, поскольку диграфы и триграфы -не верх изящества, а новые ключевые слова - всегда источник несов.местимости. С другой стороны, мне приходилось работать на оборудовании, которое ие поддерживало мой родной язык, и я видел, как люди отказывались от С в пользу языка, в котором нет этих дурацких символов . Также я припоминаю отчет представителя IBM о том, что отсутствие символа ! в кодировке EBCDIC, применяемой на мейнфреймах IBM, - причина частых жалоб. Интересно отметить, что даже в тех случаях, когда расширенные наборы символов имеются, системные администраторы иногда запрещают их употребление.

Ду.мается, что на переходный период, который .может продлиться лет десять, диграфы и трифафы - это меньшее из зол. Надеюсь, это поможет С++ завоевать

Показанные в табл. 6.1 слова и диграфы являются эквивалентами операторов,



1 ... 49 50 51 [ 52 ] 53 54 55 ... 144

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика