лекции (2010) (by Ульянов Алексей_ Лихогруд Николай_ Сергеев Николай) (1160852), страница 3
Текст из файла (страница 3)
Иначебудет ошибка.Классы ведут себя как вложенные области действия, а перекрытие называется скрытым.Overload - перекрытие, перезагрузка.Hading – скрытие имен.Overriding – подмена (для виртуальных методов).В зависимости от связных областей действия делятся на:1) статические (определяются во время трансляции)2) динамические (в момент выполнения)Определяющее вхождение исключений – это ловушка:catch(T e) { … }Происходит динамически (даже в статических ЯП – С++)П.2. Понятие виртуальной машины ЯП.Само понятие появилось еще в 60-е годы.Опр.: Это гипотетическая машина, машинный язык которой – ЯП.Стали реализовывать в железе.В СССР: машина серии МИР(для инженерных расчетов).Например, в университетах существовала следующая проблема: различные спонсоры дарили компьютеры, адля них было необходимо разное ПО.Тогда появилась виртуальная машина p-code для языка UCSD-Pascal.PARC Small Talk: 1972, байт-код.Идея Java машины: есть язык, программы передаются по интернету, на разных машинах работаютодинаково.JVM – виртуальная машина.
Язык машины – Java-байт код..NET – похожая ситуация. Любой язык, который поддерживает .NET транслируется в CLR=> не существует виртуальной машины для MSIL.Вместо этого JIT(трансляция на лету). Система времени выполнения:1-й раз в бинарный код, затем выполняется. Запоминается в КЭШе и далее работает без компиляции.+ Понятие виртуальной машины изолирует от архитектуры реальной машины.П.3. Схема рассмотрения ЯП.Сложность – семантический разрыв (разрыв архитектурных компонентов и реального времени.)1) Базис. (встроен в ЯП, понимается транслятором)Может быть скалярным (не имеет составных частей, простые типы данных, встроенные операции) иструктурным (составные типы данных - массив, записи и т.д.).
Базисы всех языков похожи.2) Средства развития. (подпрограммы, создание новых типов данных).Самые простой и известный – процедуры и функции.Возможно создание специальных библиотек.X lib - библиотека языка С, для создания интерфейсов под Unix.Xt - Понятие виджетов и т.п.Atheng Motif – имеет визуальный интерфейс.Лекция. Сергеев Николой.Простые типы данныхПод простыми типами данных мы имеем в виду языковые конструкции, встроенные в язык, то есть типыданных изначально поддерживаемые в языке.1. Классификация простых типов данных- числовые- целочисленные- вещественные- плавающие- фиксированныеНе во всех языках есть такое усложнение класса чисел, например, в таких скриптовых языках какJavaScript и ActionScript есть тип Number, обьекты класса Number могут принимать какцелочисленные значения, так и вещественные.- логические- символьные-порядковые-перечисления-диапазоны-ссылки и указателиИ еще иногда вводят функциональные тип(функции и процедуры)Давайте рассмотрим по порядку все типы данныхЦелочисленныеПеред разработчиком языка при создание целочисленного типа всегда возникают как минимум трипроблемы:1.
Фиксация представления – то есть фиксировать ли размеры типов данных, и наборзначений.2. Беззнаковые целые числа – нужно ли выделять беззнаковый целый тип3. Преобразования одного целочисленного типа в другойДавайте немного поподробнее остановимся на этих проблемах:Наиболее известные языки программирования с фиксацией представления типов данных – Java, C#.
Нооно и понятно. Ведь код на Java является мобильным, то есть должен работать на различныхплатформах. А как он будет работать правильно, если на разных платформах диапазон целых чиселбудет иметь различную длину. Поэтому Java работает не напрямую, а через виртуальную Java –машину, то есть является интерпретируемым языком. Другое дело с языком С. Именно в языке Срешили ввести диапазон чисел, который должен быть покрывать диапазоны, вмещаемые в 1 - 8 байт:-char-short int- int- long int- long longПравда здесь отдельно ничего не ясно про каждый тип(кроме char – 1 байт), например short int на различныхплатформах может занимать как 1 байт, так и 2 байта. Но зато ясно, что количество байт отводимых под char,меньше либо равно количеству байт, отводимых под short int, количество байт отводимых под short int,меньше либо равно количеству байт, отводимых под int, и т.п. Такая системы была унаследована в языка С++.Вернемся к С# и перечислим CommonTypeSystem, которые были там реализованы.Количество байт1248Со знакомsbyteshortintlongБез знакаbyteushortuintulongВ 2000 году произошло очень важное событие, была реализована компанией Интел 64 – битная архитектураIA-64 для процессора Itanium.
Правда 64 – битная архитектура не прижилась. Почему? Не было реализованопопулярной операционной системы с поддержкой 64 – битной архитектуры, вследствие этого все программывыполнялись с такой же скоростью как и на 32 – битной архитектуре. Так зачем было платить больше, если зате же самые деньги мы получаем ту же самую производительность? И к тому все 32 – битные приложения на64 – битной архитектуре выполнялись в режиме эмуляции. Намного умнее поступила компания AMD,которая решила оставить арифметику 32 – битной, а вот адресацию сделала 64 – битной(архитектура x64).Рассмотрим беззнаковые целые числа.
И сразу же возникает проблема как сравнивать между собой знаковыйи беззнаковый типы данных. И надо ли допускать неявное приведение беззнакового целого типа данных кзнаковому и обратно? Такое допущение может привести к ошибкам, которые появляются только на этапеработы программы, а значит их сложно найти. В 70- ые годы эти вопросы решались однозначно. Беззнаковыйи знаковые типы данных не смешивали между собой. Их нельзя было ни сравнивать, ни присваивать другдругу. Так в Модуле-2 существовали два типа INTEGER и CARDINAL.
И приведение одного в другойдопускалось только явное(существовал специальный оператор для такого присваивания):I:INTEGER; J:CARDINAL; I := INTEGER(J);Но в современном мире языков программирования многие языки такими ограничениями не обладают.Например, язык С++. Хотя сам создатель языка, Страуструп, хотел ввести такое ограничение, и лучше того, впервой версии языка было допустимо только явное приведение типов. Но как оказалось, системщики оченьлюбят неявное приведение, и большая часть программ, написанных на С из – за этого ограничения некомпилировалась на первой версии языка С++. Тогда Страуструп принял волевое решение убрать такоеограничение.А зачем вообще по идее нужен беззнаковый тип данных? Конечно же для адресации памяти(адреснойарифметики) и для работы со сдвигами.
Так, к примеру в Обероне существует лишь один беззнаковый типbyte(0..255), и Java, позаимствовавшая типы данных именно с Оберона была вынуждена включитьдополнительно включить в базовые арифметические операции беззнаковый сдвиг(>>>). То есть базисныйнабор операции над целыми числами расширен по сравнению с базисным набором операций в С.Существовали и другие решения данной проблемы. Так в С# решили допускать только расширяющиесяпреобразования(так как они безопасные). Обратные преобразования допускались только явно.
Проприведение типов в АДА смотреть ниже.Подходы к реализации числовых типов данных.1. Фиксирование базиса. То есть мы заранее говорим, что вот такие типы данных, как integer,byte …являются целочисленными. Все остальные уже не целочисленные. В некоторым языках фиксируетсядаже размер каждой переменной данного типа, то есть integer в Java занимает, например, строго 2байта. Как правило код на таких языках интерпретируется. В Java, например, виртуальная Java –машина. Еще один пример такого языка С#. Программы на таких языках являются мобильными, тоесть переносимыми с одной платформы на другую.
В других языках, переносимость затруднена, тамне фиксированы ни представление чисел, ни семантика числовых операций.2. Обобщенные числовые типы. Ада создавалось отчасти и для того, чтобы код на ней былкроссплатформенным. Поэтому фиксирование базиса в такой ситуации было затруднено. Передсоздателями Ады ставились следующие задачи: Эффективность, Надежность, Читабельность.
Вследствие этого создатели Ады придумали новую концепцию. Они ввели обобщенные числовые типыданных. То есть типы являющиеся базой для всех других типов( все другие наследовались от них).Объекты разных типов были несовместимы ни по какому множеству операций, но были совместимыобъекты подтипов. То есть разные подтипы совместимы между собой и со своим предком. Например:Type Length is new integer;Type Width is new integer;Length и Width – новые целочисленные типы данных, при этом их нельзя ни присваивать другдругу, ни сравнивать. Однако можно делать преобразования явным. В С или Паскале мы бы такимспособом ввели бы понятие эквивалентности.Еще один пример:Type Length in new integer range 0..MAXN.Думаю в комментариях не нуждается - диапазон Length ограничен 0..MAXN.В чем плюс обобщенных типов, так то что все ошибки обнаруживались на этапе компиляции.Если требовались неявные преобразования вводились под – типы.Sybtype t1 is t2 range 0..N.И тогда преобразования из T1 в T2 допускались.
При этом компилятор сам выбираетоптимальное представление для таких чисел. То есть представление таких типов данных зависело неот архитектуры, а от диапазона чисел. Теперь компилятор транслирую присваивание таких типовданных либо проверяет возможность такого присваивания на этапе трансляции, или же вставляет кодпо проверке допустимости такого присваивания(квазистатический контроль).