И.Г. Головин - Конспект лекций по курсу Языки программирования (1161120), страница 11
Текст из файла (страница 11)
По стандарту std::exception должна существовать, её нельзязаменить.Заканчивая обсуждение вещественных чисел, упомянем еще один тип – decimal. Онсуществует в C# и Basic. Попытка реализации фиксированного типа данных.S - знак, C-коэффициент(0<c<296), e-показатель степени 10 (0<=e<=28).Num = S*C*10eСпособ представления очень больших чисел.IBM/360 -> PL/I -> SQL -> до сих пор остался в нескольких языках для совместимости сбазами данных.Тенденция современных языков программирования – делать крайне простой базис.Возьмем, например, язык Python. Есть ли там беззнаковые числа? Нет, зачем. Безбеззнаковых типов легче.
Там есть 2 символьных типа, есть short, int, long, float, double. И все.Тип Number – число. С точки зрения программиста – неэффективная штука. Проблемыпреодолеваются путем огромной нагрузки на время выполнения.Символьные типы данныхЧто такое символ (литера)?Она характеризуется:НазваниемКодировкой (каждый символ в итоге представляется целым числом)ОтображениемCharset (CS):Номенклатура (у каждого символа есть название)Кодировка (набор -> L..R)SBCS – 0..25557DBCS – 0..65535MBCS – 1..kПонятие набора символов тесно связано с алфавитом.CR(13), LF(10) – появились, когда появилась бумага.DEL, BS – появились, когда появилась лента.Сколько у нас символов в латинском алфавите? 26. Плюс еще 10 знаков препинания и т.п.Сколько нужно битов? 60? Это даже для китайцев многовато.27 = 128, вот откуда это число.
Откуда взялось понятие байт? Старший бит использовалсядля контроля.0-127128-255: для национальных алфавитов. ISO-LATIN1. Вся латиница, что за «железнымзанавесом». Кому не повезло? Полякам, прибалтам, сербо-хорватам. Компьютерыприравнивались к средству немассового уничтожения. Их можно было продаватьсоюзникам.
Турки были союзниками, но им не хватило места в ISO-LATIN1. А грекамхватило. Для старых компьютеров хватало однобайтовой системы кодировки.Сколько всего было LATIN кодировок? 5.В эти годы изобрели кодировку КОИ-8Р. Для чего изобрели транслит? Для международныхтелеграмм. 26->26, а остальные по-разному кодировались.
В старшем бите стоит 1. 1А->А;1Z->З. Есть 1 существенный (хотя, может быть, сейчас и не очень) недостаток –упорядочение.Существовали языки, которые были в принципе single byte. Эти проблемы впервыепоявились в Японии. Сколько символов включает он? (JIS) 6000. Мощность charset’a оченьвелика. Для решения проблемы можно использовать 2-байтовый набор символов. Чемплохо? Нет совместимости.
Первые программы писались на C или Ассемблере. 1 байт = 1символ, строка кончается ‘\0’. Вот в этом была беда. В DBCS никак не лезет. Если быиспользовалось «паскалевское» представление, то этой проблемы бы не было. Проблемывозникала при использовании языка C. Японцы придумали многобайтовую системукодировки. Та же идея использовалась в кодах Хэмминга, это префиксные коды. Если впервом бите стоит 0 – это 1 байт. А если 1 – это 2 байта.В 1991 году произошла революция. Ввели UNICODE.
Есть еще такая штука UCS. (UCS-2 ISO16046, UCS-4). Что это такое? Каждый набор символов стандартизует название и кодировку(не отображение).0-127: ANSI-7128 – 255: ISO-Latin1В языке C++ появился новый тип данных - wchar_t (двухбайтный символ) – аналог unsignedshort (В C99 _wchar_t).Проблема UNICODE: совместимость с программами, которые работают с MBCS.Обнаружилась в Visual Studio. Почему? Тут ключевое слово не Visual Studio, а Microsoft.
MS58DOS, Windows 95 использовали 8 битную кодировку. Windows NT использовали UNICODEизначально. Поэтому возникла некоторая несовместимость. Эти семейства слились только вXP (2002 год). 16-битные программы не работали под Windows 95.Вторая проблема. 1040 А – 1298 Л (с крючком). Если взять английский текст, то половинасимволов там будет 0. Появился UTF – семейство преобразований формата.
UNICODE текстна входе, а на выходе непрерывная последовательность из чего-то там. UTF8 – самаяпопулярная кодировка. Тексты в UTF8 прекрасно обрабатывают MBCS программы.UCS-2 -> UTF8Рассмотрим правила преобразования чисел из UCS-2в UTF-8:UCS-2Диапазон0|0XXXXXXXUTF-80..1270|XXXXXXX00000YYY|YYXXXXXX128..2047ZZZZ|YYYY|YYXXXXXX2048..65535WWWZZ|ZZZZYYYY|YYXXXXXX110YYYYY|10XXXXXXдо 2211110ZZZZ|10YYYYYY|10XXXXXX11110WWW|10ZZZZZZ|10YYYYYY|10XXXXXXМаксимальная длина 4 байта.Каково определение символа в ЯП? В старых ЯП – char.
wchar_t.В C#, Java: char – это Unicode.Ада (1983 год) : не было проблем с китайскими, японскими и прочими языками, и нужныбыли лишь различные кодировки английского языка (так как в Пентагоне другие ненужны). Поэтому в Аде было достаточно 8-битной кодировки ASCII ANSI.Модуль языка Ада Standard поддерживал тип INTEGER (подтип универсального типа –диапазон зависит от реализации), а также тип CHARACTER – разновидность перечислимоготипа данных. И все символы определелялись примерно так:TYPE CHARACTER = (‘A’, ‘B’, ‘C’, …)Символы преобразовывались в числа от 0 до 255.
Кодировка ISO LATIN1В языках C#, Java: char можно преобразовать в int.Возникает проблема переполнения целого числа.Проблема неоднобайтовых кодировок, основанных на фиксированной выборке:big endian / little endian#define LITTLE_ENDIAN#define BIG_ENDIAN– определяет порядок байт в слове.Если есть некое целое > 1 байта, то возникает проблема.Заметим, что UTF-8 – это не совсем кодировка, и в ней такой проблемы нет.59Пример: число 65534X DW 0FFFEhMOV AL, BYTE PTR XXX+11234 – арабские цифры (индийские): здесь 12 – старшие цифры, а 34 – младшие, то естьпрямое представление (BIG ENDIAN).
Если наоборот, то это LITTLE ENDIAN.По соглашению, весь текст Unicode хранился в Big Endian.TCP/IP пакет: Big Endian числа.0xFFFE – Byte Mask (записывается в начало) – нужно, чтобы различать Big Endian и LittleEndian.Little 0xFEFFBig 0xFFFEПример: UNIXВ Unix повсеместно используется «кодировка» UTF-8. Пустой файл вUnix сохраняется как 3 байта, потому что в начало нужно записатьбайтовую марку: 0xFFFE, которая в UTF-8 занимает 3 байта:11101110|10111111|10111111.UTF-8 – кодировка по умолчанию файлов XML.Логические типы данныхОбычно логический тип данных называется bool.Он принимает значения: true, false.Определены следующие операции:!, not (логическое НЕ)&&, and (логические И)||, or (логическое ИЛИ)^, xor (логическое исключающее ИЛИ)еще иногда бывает операция тождественного сравнения ≡.Не следует писать if(i), лучше писать if (i != 0).Тип bool по умолчанию несовместим с обычными типами данных.Перевод в true: обрезается до 1 (лишних разрядов не остается).Проблема логического типа данных ленивость логических операций.
Эта проблема связана спонятием порядка.60Рассмотрим выражение a + b + c. С точки зрения математика, порядок будет таким: ((a + b) +c). Но с точки зрения фон Неймановских языков, порядок будет таким: c + (a + b). А вфункциональных языках вообще нет порядка вычисления выражений. a + b коммутативнаяоперация, здесь нет большой проблемы. a - (b - c) – здесь уже существенно.Свойства логического типа в фон-Неймановских языках:1) не фиксируется порядок. Это делается ради более эффективной работыоптимизатора. Уменьшается поток данных между памятью и регистрами ЦП.2) ленивость вычислений – может как быть, так и не быть.
Ленивость вычисленийЛенивость вычислений – не вычислять логическое выражение, если его значение заранееизвестно.Рассмотрим пример: a++ || --l. Здесь существенно, есть ли ленивые вычисления, ипорядок тоже важен.Рассмотрим другой простой пример – алгоритм линейного поиска.while A[i] != X and i < N doi := i + 1Один компилятор выдаст ошибку. Другой компилятор ошибку не выдаст, и если i < N естьистина, то отработает правильно, а если же i >= N, то программа упадет.Возникает вопрос, что желать с этой проблемой.Пример (Ада)В языке Green, который потом назвали Ада, были специальныеленивые операции and then и or else.
Порядок только слева направо.Предыдущий пример перепишется следующим образом:while i < N and then A(i) /= do …В C++ и Modula2 вычисления ленивые. Так же, как и во всех современных языках.В Pascal не ленивые вычисления.Все эти дискуссии свидетельствуют о низкоуровневости концепции.Подводя итог разговора о целых типах данных, мы можем сказать, что набора типов вязыках Java и C# хватает для любых архитектур, а также усложнение базиса ведет кнеоправданному усложнению базиса языка.ПРОИЗВОДНЫЕ ТИПЫ ДАННЫХПроизводные типы данных – это такие типы данных, которые опираются на простые типыданных.Порядковые типы данных61Это диапазоны и перечисления.ДиапазоныДиапазоны используются в языках Никлауса Вирта (Паскаль, Оберон, Оберон2, Модула,Модула2).Статья 16 причин, по которым Pascal не является моим любимым языкомпрограммирования.
Примечание: это верно строго для индустриального программирования.В качестве некоторых причин названы: отсутствие раздельной типизации; а также тот факт,что длина массива – это статический атрибут.L..R of T0..R of T«Программирование на языке Модула2»«Справочник по языку» – 40 страниц, то есть язык очень простой.Принцип минимальности языковых конструкций – подразделяется на 2 принципа, принцип«чемоданчика» и принцип «сундучка».Принцип «сундучка» гласит, что нужно включить в язык все полезное. Автор языка при этомдолжен объяснить, что и зачем включено в язык.Принцип «чемоданчика» гласит, что нужно включить в язык все то, без чего нельзяобойтись. В языке программирования этот принцип называется еще принципом критичныхтехнологических потребностей.Итак, принцип минимальности языковых конструкций состоит в том, что языковыеконструкции добавляются только тогда, когда функционирование языка без этогоневозможно.Например, вложенные модули были добавлены в Ада, но их не было в Модула2 – напрактике они использовались не очень часто.Пример (Оберон)Оберон использует принцип «чемоданчика».