Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
- | [[Языки программирования, 05 лекция (от 19 сентября)|Предыдущая лекция]] | [[Языки программирования, 07 лекция (от 26 сентября)|Следующая лекция]]
| + | == From Ebaums Inc to MurkLoar. == |
- | | + | We at EbaumsWorld consider you as disgrace of human race. |
- | =Часть 1. Основные понятия традиционных процедурных ЯП= | + | Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated. |
- | ==Глава 1. Скалярный базис.==
| + | Dig yourself a grave - you will need it. |
- | ===Пункт 2. Целые типы и проблема представления беззнаковых чисел (продолжение)===
| + | |
- | | + | |
- | Наличие беззнакового типа байт ничему не противоречит.
| + | |
- | {|
| + | |
- | !Размер
| + | |
- | ![[Java]]
| + | |
- | ![[Oberon]]
| + | |
- | ![[C#]]
| + | |
- | |-
| + | |
- | |1
| + | |
- | |byte
| + | |
- | |BYTE
| + | |
- | |sbyte
| + | |
- | |byte
| + | |
- | |-
| + | |
- | |2
| + | |
- | |short
| + | |
- | |SHORTINT
| + | |
- | |short
| + | |
- | |ushort
| + | |
- | |-
| + | |
- | |4
| + | |
- | |int
| + | |
- | |INTEGER
| + | |
- | |int
| + | |
- | |uint
| + | |
- | |-
| + | |
- | |8
| + | |
- | |long
| + | |
- | |LONGINT
| + | |
- | |long
| + | |
- | |ulong
| + | |
- | |}
| + | |
- | | + | |
- | В Обероне разрешено включение типов.<br />
| + | |
- | [[Modula|Modula-2]] ориентирована на 16-битные машины, посему лишний бит не был лишним.<br />
| + | |
- | Горизонтальные неявные преобразования в C# не разрешены.
| + | |
- | | + | |
- | Синтаксис преобразования типа. Эволюция:
| + | |
- | {|
| + | |
- | ![[C]]
| + | |
- | |exp
| + | |
- | |-
| + | |
- | ![[Algol]]
| + | |
- | |T(exp)
| + | |
- | |-
| + | |
- | ![[Pascal]]
| + | |
- | |T(exp)
| + | |
- | |-
| + | |
- | ![[C++]]
| + | |
- | |T(exp), (T)exp, static_cast<T>(exp)
| + | |
- | |-
| + | |
- | ![[C#]]
| + | |
- | |(T)exp
| + | |
- | |-
| + | |
- | ![[Java]]
| + | |
- | |(T)exp
| + | |
- | |}
| + | |
- | | + | |
- | В современных языках больше внимания уделяется надёжности.
| + | |
- | | + | |
- | Беззнаковые типы должны вымирать.
| + | |
- | | + | |
- | Язык с авторской позиции: включать или не включать определяется технологическими соображениями. Если есть адресная арифметика, то они требуется. С авторской позиции язык — совокупность компромиссов, и все изменения волнами расходятся по языку.
| + | |
- | | + | |
- | В '''Java''''e исключили беззнаковые типы, но есть ещё операция сдвига, которая бывает разная — арифметическая (знаковый) и логическая (беззнаковый), посему в Java'e появились две операции сдвига вправо: >> и >>>. Размерность определяется исключительно спецификацией Java-машины. (?)
| + | |
- | | + | |
- | В '''Delphi''' зафиксированы размеры типов, потому что Delphi — язык синтетический, должен учитывать совместимость с предыдущим кодом и привязана к Windows на платформе Intel.
| + | |
- | | + | |
- | В '''C''' и '''С++''' не были зафиксированы размеры, так как в это время было разнообразие различных архитектур. При фиксировании int уменьшается эффективность. K&R C появился в [[1972]] году.
| + | |
- | | + | |
- | ===Тип данных===
| + | |
- | Hовизна языка [[Ada]] в появлении подтипов.
| + | |
- | | + | |
- | *[[Pascal]]: Несовместимые типы данных.
| + | |
- | ('''Pascal''')
| + | |
- | type
| + | |
- | LENGTH=INTEGER;
| + | |
- | AREA=INTEGER;
| + | |
- | | + | |
- | | + | |
- | *[[C]]: Один и тот же тип данных.
| + | |
- | ('''C''')
| + | |
- | typedef int LENGTH;
| + | |
- | typedef int AREA;
| + | |
- | | + | |
- | | + | |
- | *[[Ada]]: Разные типы данных, не совместимые друг с другом. Это очень правильно.
| + | |
- | ('''Ada''')
| + | |
- | type length is '''new''' INTEGER range 0..MAX_INT;
| + | |
- | type area is '''new''' INTEGER range 0..MAX_INT.
| + | |
- | | + | |
- | | + | |
- | <p>subtype ... — подтип, совместимый со старым</p>
| + | |
- | <p>С этой точки зрения вопрос о знаковости-беззнаковости решается очень просто. Любая операция преобразования контролируемая. </p>
| + | |
- | <p>Аналогичным образом решается проблема генерации ошибки. (?)</p>
| + | |
- | ('''Ada''')
| + | |
- | subtype intshort is INTEGER modulo 65536;
| + | |
- | <p>Никакого в этом случае переполнения быть не может, так как все опреации выполняются по модулю 216.</p>
| + | |
- | <p>Много на языке Ada возложено на плечи компилятора, но семантика определена весьма точно, что способствует переносимости. Может меняться эффективность. Программист имеет право управлять, как вопросами представления, так и надёжности, знаковости. И можно писать полностью переносимые программы, что на Си делать затруднительно.</p>
| + | |
- | | + | |
- | Современные языки выбрали более простой подход, так как проблема переносимости не стоит так остро.
| + | |
- | | + | |
- | | + | |
- | | + | |
- | ===Пункт 3. Вещественные типы===
| + | |
- | <p>Компьютеры дискретны, поэтому реализация вычислений должна подразумевать конечную точность. </p>
| + | |
- | | + | |
- | <p>Два решения:</p>
| + | |
- | *Плавающая точка — относительная погрешность вычислений
| + | |
- | *Фиксированная точка — абсолютная погрешность вычислений
| + | |
- | | + | |
- | | + | |
- | | + | |
- | ====Плавающая точка====
| + | |
- | X=±Mantissa*Base<sup>Power</sup> — представление с плавающей точкой.
| + | |
- | <p>Плюс — можно представлять и маленькие числа, и большие. Платим относительной точностью. </p>
| + | |
- | Пусть 4 байта разбиты следующим образом: 1 бит знак, 23 мантисса, 8 степень. Такой формат числа с плавающей точкой стандартизован в '''IEEE 754'''. Стандарты IEEE активно внедряются, так как государство свой нос туда не суёт. Зафиксируем значение порядка равным 0. Можно представить от ½ до 1, и на нём 2<sup>23</sup> чисел, при 1 от 1 до 2 тоже 2<sup>23</sup> чисел, и т. д. При каких значениях порядка дельта становится равной единице? При 23. 2<sup>23</sup> — чуть более 8000000 (8388608).
| + | |
- | | + | |
- | Иногда нужна абсолютная точность вычислений, например, в финансах. C точки зрения вещественных вычисления Ada наиболее адекватный язык. Как решена проблема с управляемой точностью в плавающих типах: задание количества знаков после запятой.
| + | |
- | ('''Ada''')
| + | |
- | Type REAL is digits 6;
| + | |
- | type T is digits D;
| + | |
- | | + | |
- | | + | |
- | <p>Модельные числа — представлены в виде плавающих чисел и обеспечивают соответствующую точность. Хранятся в виде знак, мантисса, порядок. Требуется [log<sub>2</sub>(D)]+1 битов для D знаков, соответствующим образом подбирается порядок. Подбирается стандартный тип для обеспечения соотвующей точности. Если стандартного типа не было, то по стандарту [[1983]] года компилятор должен программно эмулировать работу с ними.</p>
| + | |
- | | + | |
- | ====Фиксированная точка====
| + | |
- | ('''Ada''')
| + | |
- | Type T is delta H range L..R
| + | |
- | В современных языках программирования всё совершенно не так. В C только сказано, что float не длиннее double, а double не длиннее long double. Основной тип C — double, и все вычисления производятся в double.
| + | |
- | | + | |
- | *Пример из жизни, зачем нужен %f: студент-вечерник дал лектору задачу, спросил, почему сыпется:
| + | |
- | ('''C''')
| + | |
- | double d, f;
| + | |
- | scanf(«%f»,&d);
| + | |
- | d=d/2;
| + | |
- | Как только начинаются вычисления на введённым d, программа падает. Так как %f — формат ввода для float.</p>
| + | |
- | | + | |
- | В Java и C# '''фиксированы''' float - 4, double - 8.
| + | |
- | | + | |
- | в Java сказано, что действия на числами с плавающей точкой работают по стандарту IEEE 754, в C# примерно то же самое. Ошибкой деление на ноль не считается, но результатом подобного действия является NaN или Inf.
| + | |
- | | + | |
- | | + | |
- | | + | |
- | ===Пункт 4. Логические типы===
| + | |
- | <p>C и C++ выпадали из общей канвы, но в [[1990]] году появился тип bool, и в C99 появился тип _bool, который описан в <bool.h> вместе с константами true и false. </p>
| + | |
- | <p>C у программистов это C89. Аналогично с FORTRAN, где большинство программирует на F77.</p>
| + | |
- | <p>Логический тип данных есть во всех ЯП. Называется или BOOLEAN, или bool. В современных языках есть отдельный булевский тип, не совместимый с другими.</p>
| + | |
- | | + | |
- | {{Языки Программирования}}
| + | |
- | {{Lection-stub}}
| + | |