лекции (2015) (1160856), страница 3
Текст из файла (страница 3)
Описание синтаксиса объявления в Аде. В Аденет неявного приведения типов.x: positive;i: interger;n: natural;x := positive(i);i := integer(x);Особенности копирования объектов в Java, в C#Использование оператора присваивания не создает нового объекта, а лишь копирует ссылку наобъект (т.н. поверхностное копирование). Таким образом, две ссылки указывают на одну и ту жеобласть памяти, на один и тот же объект.Для создания нового объекта с таким же состоянием используется клонирование объекта:● Клонирование объекта можно реализовать, имплементировав интерфейс Cloneable иреализовав копирование состояний полей и агрегированных объектов. Такая реализацияклонирования требует большого внимания и может стать источником ошибок.● Более безопасным способом является использование конструктора копирования, котороепозволяет избежать многих проблем.● Другим безопасным вариантом является фабричный метод (Factory method), которыйпредставляет собой статический метод, возвращающий экземпляр своего класса.
Фабричныйметод имеет следующие преимущества перед конструктором копирования:- Имеет имя (чаще всего getInstance или valueOf), что делает код более понятным.- Необязательно создавать новый объект в результате вызова: Объекты могут бытькэшированы и реиспользованы.- Могут возвращать подтип своего возвращаемого типа. В частности, могутвозвращать объект, у которого неизвестен класс реализации.В C# по умолчанию тоже используется поверхностное копирование.
Для глубокого копированияможно использовать несколько подходов:● Глубокое копирования посредством сериализации (самый удачный подход). Сиспользованием класса BinaryFormatter и методов Serialize, Deserialize. Класс должен бытьпомечен как “[Serializable]”.Сборка мусораАвтоматическая сборка мусора. Если на объект больше нет ссылок, то память выделенная подобъект освобождается сборщиком мусора.Висячие ссылки – это адреса уже уничтоженных объектов.Мусор – это неуничтоженные объекты из динамической памяти, на которые отсутствуют ссылки.RAD (Rapid Application Development)Концепция создания средств разработки программных продуктов, уделяющая особое вниманиебыстроте и удобству программирования, созданию технологического процесса, позволяющегопрограммисту максимально быстро создавать компьютерные программы.RAD предполагает, что разработка ПО осуществляется небольшой командой разработчиков за срокпорядка трёх-четырёх месяцев путём использования инкрементного прототипирования сприменением инструментальных средств визуального моделирования и разработки.
Технология6RAD предусматривает активное привлечение заказчика уже на ранних стадиях — обследованиеорганизации, выработка требований к системе. (из Википедии)JIT, MSILЯзыки бывают компилируемыми и интерпретируемыми (некомпилируемыми).JIT-компиляция (Just in Time) - технология увеличения производительности программных систем,использующих байт-код, путём компиляции байт-кода в машинный код или в другой форматнепосредственно во время работы программы. Таким образом достигается высокая скоростьвыполнения по сравнению с интерпретируемым байт-кодом (сравнимая с компилируемымиязыками) за счёт увеличения потребления памяти (для хранения результатов компиляции) и затратвремени на компиляцию (from Википедия)MSIL (Microsoft Intermediate Language) - промежуточный язык, разработанный фирмой «Microsoft»для платформы .NET Framework.
JIT-компилятор MSIL является частью CLR (англ. common languageruntime) — общей среды выполнения программ, написанных на языках .NET. В настоящий момент онпереименован в CIL (Common Intermediate Language).Java = ядро Java + JVM + окружение.Окружения Java:● Java SE (Standart Environment)● Java ME (Mobile Environment)● Jave EE (Enterprise Edition)Вся стандартная библиотека Java представлена в виде совокупности пакетов.java.<имя пакета>В C# и в Java есть некоторые части, которые выглядят как классы, но на самом деле вшиты вкомпилятор:● String в Java● System в C#Игорь ([857-871], завершено)Скалярные базовые типы данных.
Арифметические типы данных-Целочисленные типыВещественные- С плавающей точкой. Определён стандартом IEEE-754. Принят и реализованпроизводителями процессоров, а следовательно и вошёл в языки программирования.- Фиксированные - мало прижились в индустриальных языкахЦелочисленные типыВ Modula 2 Вирт ввёл integer - знаковый тип и cardinal - беззнаковый тип, при этом неявныхпреобразований между ними быть не может.Страуструп при создании C++ решил, что квалифицированные программисты понимаютособенности неявных преобразований типов (знаковые <-> беззнаковые) и сами могут решить, чтонужно написать, поэтому не нужно запрещать такие преобразования.7Вычисления с char и short производятся только через int, поэтому для производительности важно,чтобы int был родным. В таком случае потерь производительности почти нет.В C# есть uint-беззнаковые условия и можно заставить, например, дополнительно проверять выходрезультата за границы допустимых значений:uint i;cheched {for (i = 0; i >= 0; i--) { }}checked будет дополнительно проверять выход из беззнакового типа.C# использует CTS (Common Type System)1sbytebyte2shortushort4intuint8longulongРазмеры типов строго зафиксированны, а неявные преобразования возможны только в случае, еслигарантированно не происходит потери значений, т.е.
если тип, в который происходитпреобразование может хранить любое значение исходного типа.Возможные неявные преобразования:byte -> short -> int -> longushort -> int -> longuint -> longbyte -> ushort -> uint -> ulong(возможно любое преобразование в пределах строчки слева-направо, например, byte -> long)При появлении новой архитектуры factum64 встала проблема переноса программ с 32-битнойархитектуры на 64-битную. Это оказалось очень сложно и дорого. Ничего не получалось допоявления архитектуры x86-64, оказавшейся крайне энергонеэффективной, но полностьюсовместимой с x86 по командам и с 64-битным размером виртуального адресного пространства.Размер int остался равным 32 битам.Реальной, чистой 64-битности нет.Битовый сдвиг может быть как влево, так и вправо, как арифметический, так и логический, нореально есть только три кода операций, так как арифметический и логический сдвиг влевоэквивалентны:sal ⇔ shlsar - арифметический сдвиг вправо.
Старшие биты результата заполняются старшим битомаргументаshr - логический сдвиг вправо. Старшие биты результата заполняются нулёмВ C, C++, C# какой сдвиг выполняется зависит от типа целого числа. Если целое число знаковое, товыполняется арифметический сдвиг, если беззнаковое - логический. В Java беззнаковых чиселнет (за исключением 1-байтового типа ‘byte’). Поэтому чтобы отличить арифметический сдвигвправо от логического в Java пришлось ввести два разных оператора:i >> N - арифметический сдвиг8i >>> N - логическийВещественные типыПо стандарту любое вычисление с float происходит через расширение до double.
В printf всегдададут double, хотя выдаст он точность float.IEEE-754 унифицировал представления и арифметику чисел с плавающей точкой для 32 и 64 бит. Вцелом произошло упрощение, вещественных чисел за счёт принятия IEEE-754 и целых чисел засчёт унификации арифметических оперций в x86, x86-64 и нескольких RISC архитектур вроде ARM.Пример определения вещественных чисел с фиксированной точкой в Ada:type Def is delta H range L..RгдеH - шаг, по сути - точностьL, R - можно предположить, минимальное и максимальное числоКомпилятор может сам выбрать удобное ему представление. Например, если L и R не слишкомвелики, то для представления данного типа, он может выбрать целое число.
Всего требуетсяхранить (L - R)/H возможных чисел. Это определяет минимально необходимую разрядностьрегистра. Стараемся выбрать поменьше, чтобы экономить память.Впервые вещественные числа с фиксированной точкой появились в Cobol, затем - в IBM-PC x86.Кроме того, в IBM-PC x86 есть двоично десятичные числа. Каждое число кодируется своимидесятичными цифрами, каждая из которых в свою очередь кодируется 4 битами. Например 947будет закодировано как 1001.0011.0111. Не эффективно по памяти, но обеспечивает быстрыйввод/вывод.Также есть десятичный тип данных.
Decimal в SQL и decimal в C#.В Python есть только плавающий и целый (базисный\) тип. Длинных вещественных чисел нет, адлинные целые - есть. Число, если не умещается в 32 бита, становится 64-битным, а если невлезает и туда, то уже будет моделироваться несколькими числами, хотя и медленнее.Javascript, LuaВообще только один тип - Number - 64 битное вещественное число, но там нет точной точности.Почти любой язык программирования поддерживает логический тип данных как отдельный, несовместимый ни с каким другим, тип данных. Но не стоит забывать про C++ в котором ‘bool’ неявноконвертируется в ‘int’.Перечислимые типыВирт, как создал его в Pascal, так и убил его в Oberon, по двум причинам:1) При импорте из другого модуля перечислимого типа неявно импортируются и все именаконстантtype col = ( red, green, blue ); в одном модулеtype Col = ( red, green, … ); в другом модулевозникнет конфликт92) Перечислимый тип - не расширяемый, а в Oberon была концепция расширения типа, а такой(перечислимый\) тип просто противоречит ООП.Однако перечислимый тип очень подходит для визуально компонентного программирования:- Сборочное программирование - не надо ничего расширять- Например, визуальное проектирование интерфейсов.
Можем выбирать свойства объектов изсписка перечисления. Становятся доступными подсказки к коду.Заметим, что 1-ая “проблема” легко обходится разграничением пространства имён как в C++:enum Color { red, green, blue }; // глобальные константы, обращение прямое: redenum class Colour { red, green, blue }; // обращение: Colour::redВ некоторых случаях для флагов используются целочисленные значения, которые можнокомбинировать с помощью битовых операций &, |, таким образом избегается необходимостьиспользовать массив флагов. Например,int Maximized = 1 << 0;int Minimized = 1 << 1;int Centered = 1 << 2;int TopMost = 1 << 3;int BorderLess = 1 << 4;// Для создания вируса можно скомбинировать флаги Maximized, TopMost иBorderLessCreateWindow(“Virus”, Maximized | TopMost | BorderLess);Повторим проблемы перечислимого типа:- Неявный экспорт констант- НерасширяемостьНо он все равно вошёл в компилируемые языки, хотя и с изменениями.В C#: enum States { U, A, … }+ Можно выбрать базовый тип перечисления из встроенных числовых типов (byte, short, int),таким образом сэкономив память для перечислений с небольшим количеством констант (т.е.для большинства)+ выделяется в отдельное пространство имёнНо в целом дано разработать иерархию для наследования очень сильно.