лекции (2010) (by Ульянов Алексей_ Лихогруд Николай_ Сергеев Николай) (1160852), страница 5
Текст из файла (страница 5)
Однако это сводится на нет необходимостью поддержкисуррогатных пар, о которых часто забывают при использовании UTF-16, реализовывая лишьподдержку символов UCS-2.[1].Символы UTF-8 получаются из Unicode следующим образом:UnicodeUTF-80x00000000 — 0x0000007F 0xxxxxxx0x00000080 — 0x000007FF 110xxxxx 10xxxxxx0x00000800 — 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx0x00010000 — 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxТакже теоретически возможны, но не включены в стандарты:UnicodeUTF-80x00200000 — 0x03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx0x04000000 — 0x7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxЗамечание: Символы, закодированные в UTF-8, могут быть длиной до шести байт, однако стандарт Unicode неопределяет символов выше 0x10ffff, поэтому символы Unicode могут иметь максимальный размер в 4 байта вUTF-8.Многие программы Windows (включая Блокнот) добавляют байты 0xEF, 0xBB, 0xBF в начале любогодокумента, сохраняемого как UTF-8.
Это метка порядка байтов Юникода (англ. Byte Order Mark, BOM),также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature). Чтобы при сохраненииизбавиться от добавления сигнатуры, используйте, например, Notepad++.Лекция. Лихогруд Н.Н.п.2.4 Ограниченные типы данныхп.2.4.1 Перечисления (перечислимые типы данных)Паскаль:Type EnumTyp = (va1, …, valN);Операции::=, =, <, >, <>, >=, <= - основаны на функциях succ(x), pred(x)ord(x) = 0…N-1 (Элементы упорядочены)Таким образом перечислимый тип – некий способ удобного создания, хранения и использования констант.Для UNICOD FFFE – «магическая константа», определяет порядок байтовСовет по программированию – Использование констант делает программу более понятной.
В программе неименованными должны быть только 0,1,-1. Все остальные константы нужно именовать.т.е.I := 54; - плохой стильпреобразования:EnumType -> IntegerбезопасноInteger -> EnumTypeНебезопасно. Нужны проверкиСтатические проверки – проверки при компиляции программы. Проверяемые данные не меняются вразличных вызовах функции (запусках программы)A:array [1..100] of integer;……….a[10] = 10;Статическая проверкаКвазистатические проверки - проверки при выполнении. Квазистатическим они называются потому, чтопроверяемые данные могут меняться в различных вызовахфункции (запусках программы).
Поэтому эти проверки делаются именно при выполнении.Компилятор обнаруживает опасное место в программе и вставляет в это место квазистатический код, которыйвыполнится в процессе работы программы.a:array [1..100] of integer;……….a[n] = 10;квазистатические проверки, то здесьn не известна в момент компиляции. Если язык поддерживаетбудет вставлен контроль выхода за границу массиваx:0…N-1x:= expr;значение expr не известно во времяВставится роверка вида «if(expr >= N) or (expr <0) then error()», т.к.компиляцииВ машинных языках нет квазистатических проверок. Поэтому нет и в Сиint a[10];n = 11;a[n] = 10;В Си проверки не будетRTTI – динамическая информация о типе. Ради этого в Си++ вставлены квазистатические проверки.В Си-89 добавили такую конструкцию:enum ET(v0,…,vN);которая эквивалентна последовательности строк#define v0 0;#define v1 1;……..Но так как нет квазистатических проверок, то все нижеследующие строки будут корректны:enum ET y;int I;x = v1;I = v2;x = I;I = x;x = -5;Негласная парадигма языка Си – «компактность кода», а квазистатические проверки, естественно,увеличивают генерируемый код.В своё время перечислимые типы были очень популярны.Но:•••••Языки «Оберон»(1988) и «Оберон-2»(1993) уже не содержали перечислимые типы.
В Обероне было«Расширение типов», которому противоречат перечислимые типы данных, которые невозможнорасширить.uses (pascal, Ада) Вместе с перечислимым типом неявно импортируются все его константы на том жеуровне видимости .Таким образом значения констант могут конфликтовать и перекрываться дляразных перечислимых типов (в т.ч. из разных модулей)Java (1995) – нет перечислимых типовC# (1999) – перечислимые типы есть. Одно из назначений - хранение наборов значений параметровкомпонентов( например влево/вправо/по центру для выравнивания). Т.е. перечислимые типыинтегрировали в визуальные средства проектирования.Java (2005) - расширение Java, в том числе добавление перечислимых типов, оформленных в видеполноценных классовСмещение парадигмы программирования1972197919831988Начало 90-хSmallTalkСи с классамиСи++Turbo Pascal 5.5Всеобщая объектно-ориентированностьИ т.д.Результат смещения – появление «компонентов» - «чёрных ящиков» с «рычагами» (в их роли выступаютметоды) и «лампочками» (в их роли выступают properties), уход от иерархий классов.Таким образом, сегодня профессиональный программист пишет sealed(C#, для Java – «final») класс, т.е.
класс,от которого нельзя наследовать, если он является его собственным классом или не существуетисключительных причин делать иначе.Возвратимся к перечислимым типам данных («к нашим баранам», как говорит Игорь Геннадивевич):Вопросы, связанные с реализацией и использованием перечислимых типов данных:•••••Проблема представления – реализовывать ли возможность задавать конкретные значения констант(например, для цветов)?Проблема эффективности – реализовывать ли возможность управления представлением?Проблема преобразований в другие целочисленные типы данных – разрешать или не разрешать?Неявный импорт – разрешать или нет?Удобство использования – ввод, вывод и т.д.Модула-2type ET = (v1, …, vN);Преобразования :ord(x);val(T,i);ET -> integerET -> integer.
Либо выдаёт ошибку, либо выдаёт значение.val(ET,v2) = 1;Неявный импорт возможенУдобность использования не расширена.С++ <-> C-89enum ET{…};void f(ET x);void f(int x);Будет перегрузка, потому что перечисление – новый тип данныхВ Си++ typedef задаёт синоним типа, а не создаёт новый тип.typedef int a;void f(a x)void f(int x)Перегрузки не будет, т.к. «a» не новый тип(=> будет ошибка)В Си++ можно задавать значения константам перечисленияEnum FileAccept{FileRead = 1;FileWrite = 2;FileReadWrite = FileRead | FileWrite;}Удобство использования такое же, как и для intАдаТипы BOOLEAN и CHARACTER являются перечислимыми типами данных из пакетаSTANDARDПроблема неявного импорта:type SendColor is (Red,Yellow,Green)type BasicColor is (Red,Green,Blue)Ввели понятие «литерал» перечисления. Им является либо идентификатор, либо символ(‘символ’)type Latin is (‘A’, ‘B’,’C’,… ,’Z’)type ASCII Latin(‘A’, ‘B’,’C’,… ,’Z’, ‘a’, ’b’,…)Литерал перечисления – функция без параметров, имя которой совпадает с литералом ивозвращает нужную константуprocedure P(x:SendColor)procedure P(x:BasicColor)P(Wellow) – в функцию отправится «1»P(Red) - ?? ошибкаРешение проблемы неявного импорта:Уточнение типа - T’expr – выражение expr трактовать как выражение типа ТP(BasicColor’Red) – правильно!Представление:for BasicColor use (Red => FF00000x, Green => FF00x, Blue =>FFx)for BasicColor’Size use 24; - 24- количество битов«’» специальная операция, применимая именами типов, позволяющая получить доступ кнекоторым атрибутамC#Управление реализацией:enum BasicColor{Red = 0xFF0000;Green = 0xFF00Blue = 0xFF};enum SendColor: Byte{Red;Yellow;Green;};Преобразования из перечислимых типов в целочисленные в современных языках толькоявные.Атрибуты – средства сообщать компилятору некоторую информацию о реализации типа.[FLAGS] – указывает, что перечисление может обрабатываться как битовое поле, которое являетсянабором флагов.[FLAGS]enum FileAcces{FileRead = 1;FileWrite = 2;FileReadWrite = FileRead | FileWrite;}теперь, если вывести на экран FileAccept.
FileReadWrite получим «FileRead, FileWrite». Безиспользования атрибута [FLAGS] получим 3.С#, JavaНеявный импортFileAcces x;X = FileAcces.Read; //Уточнение перечисленияУдобство использования. Классы-обёрткиКлассификация ТД1. Java• Простые Типы Данных• Референциальные типы данных• Классы• Массивы2. C#• Типы-значения• Классы – размещаются только в динамической памятиДля каждого типа-значения существует класс-обёрткаС#int - Int32,bool – Boolean, long – Int64Javaint – Integer,bool – Boolean, long – LongВ С# все обёртки находятся в .NetДля всех перечислений имеется один класс-обёртка – «Enum» всем перечислениям доступны методы класса Enum ToString(), GetValues() и т.д.int [] vals = (int []) Enum.GetValues(typeof(…));Java v5.0 Tiger 2005Enum SendColor{Red,Yellow,Green //Статические члены}SendColor c = SendColor.Red;В Java v5.0 константы перечисления - статические члены класса, находящиеся в классе ипредставляющее собой значения класса.
Упорядочены. Значения задавать нельзя.SendColors.valuesof();.ordinal();.value(“Red”) // -> 0enum Apples{….Apple4(10); /// Каждое значение перечислимого типа должно быть со своей ценой….int price;public Apples(int p){price = p;}public void set_price(int p){…}public int get_price(){….}}…..Apples x = Apples.Apple4; // можно писать без «new».
Это исключение для перечислений// Apples.Apple4 – значение класса, а не поля классаОбъекты перечислений нельзя копировать.Наследование от перечислений запрещено.п2.4.2 ДиапазоныПаскальvarx: L..R;Модула 2varx: [0..N];y: CARDINAL[0..N];i:INTEGER;j:CARDINAL;x := 0;x := i;x := y;Проверки не будетВставка квазистатической проверки, если нельзя вычислить iПроверки не будет.Напомню, что переменные типа CARDINAL могут принимать значения от 0 до 65535, а INTEGERот -32768 до 32767 (для 16-ти битных компиляторов)АдаType Diap is range 0..N;Type Pos is new INTEGER range 0..MAX_INT; новый тип данных.….I:integer;Y:Pos;Y := I;компилятор вставит сообщение об ошибке, т.к. это разные типы данных(из-за «new»)Y:=Pos(I); Вставка проверки на знакSubtype Natural is range 1..MAX_INT;J:Natural………I := J;Проверки не будетJ := I;В этой строчке будет проверкаНи в одном из современных языков программирования нет типов-диапазонов, т.к.