Главная » Все файлы » Просмотр файлов из архивов » Документы » лекции (2008) (Фингеров Александр_ Кононов Алексей_ Кузин Сергей)

лекции (2008) (Фингеров Александр_ Кононов Алексей_ Кузин Сергей), страница 3

2019-09-19СтудИзба

Описание файла

Документ из архива "лекции (2008) (Фингеров Александр_ Кононов Алексей_ Кузин Сергей)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Онлайн просмотр документа "лекции (2008) (Фингеров Александр_ Кононов Алексей_ Кузин Сергей)"

Текст 3 страницы из документа "лекции (2008) (Фингеров Александр_ Кононов Алексей_ Кузин Сергей)"

Begin

P1;

End P]

[Proc P1;

Begin

I:=1;

End P1]

// если не объявлены свои I, то доступны общие в статическом варианте

Begin

P;

//в динамическом варианте область действия помещается в стек после вызовы процедуры, поэтому P1 изменит локальное I процедуры P

P1;

//а теперь и глобальное I

End

  1. Адрес

П.3. Концептуальная схема рассмотрения ЯП.

Главная проблема – прежде всего сложность, впервые люди столкнулись с этими проблемами в начале 60х годов при программировании ОС IBM360. Она разрабатывалась в течение 3х лет, при выходе содержала огромное количество неэффективностей, но самой большой неудачей была именно неготовность самой операционной системы. Базис компьютеров, для которых пишутся программы, крайне велик. Сложность определяется семантическим разрывом. Методы преодоления были предложены давным-давно – главный метод – это механизм абстракции. Чем выше уровень абстракции, тем большую модель он покрывает, но тем более частной является модель. Подпрограмма уже является средством абстракции, когда мы не оформляем алгоритм отдельно, а вставляем вызов. Оно тут же стало использовать в Фортране. Создавались большие библиотеки подпрограмм, которые продолжают использоваться и по сей день. Языки различаются с точки зрения механизмов абстракции.

Схема:

  1. Базис (те конструкции, абстракции, которые встроены в язык)

    1. Скалярный (простые типы данных и операции)

    2. Составной (составные типы данных и некоторые другие операторы).

  2. Средства абстракции (новые Типы Данных, классы, подпрограммы)

В Типах Данных => множество операций, а не множество значений

В Абстрактных Типах Данных => интерфейс

Пример абстрактных ТД в языке С – FILE. В языке С нет защиты абстракций, поэтому С ненадежный язык.

  1. Средства защиты

Пример надёжных языков – Ada. Если язык надёжен то большой процент вероятности того, что если программа компилируется, то она семантически верна. Второе свойство Ada – эффективность. Третье свойство очень интересное и не очень очевидное. 50% разработок программ шло на сопровождение, 25% на тестирование и тд.. На этапе сопровождения программист перечитывает и исправляет программу. Третьим приоритетом была читабельность программы – длинные ключевые слова, и вообще многословный язык.



Часть 2. Традиционные ЯП.



Сейчас развитие проходит под знаменем ОО, но все они используют понятия традиционных ЯП.

Начнём изучение языков с базисов. Вот есть ОО язык С++ и язык С. Чем различается базис? Да практически ничем, за исключением понятия ссылки, равно как и почти не отличается от С#.

Глава 1. Простые Типы Данных.

П1. Классифицикация:

- числовые

- целочисленные

- вещественные

- плавающие

-фиксированные

Это разделение – уже в некотором смысле усложнение базиса. Есть скриптовый язык Lua, и в нём нет целых и вещественных, а есть тип Number, и сам интерпретатор выбирает операции. В MatLab’e есть средства для вычисления с произвольной точностью, но это уже специализированный язык.

- логический

- символьные

- порядковые

- перечисления

- диапазоны

- ссылки и указатели

- функциональные (но его единицами служат процедуры и функции, которые уже часть абстракции, рассматривать их будем отдельно).

П2. Целочисленные ТД



2 проблемы:

  1. Фиксация представления (набор)

  2. Беззнаковые целые числа

Самый простой в этом плане язык это Паскаль – integer и всё. Но нет разницы между 2хбайтовым числом, 4хбайтовым и 8мибайтовым. Из соображения эффективности приходится вводить целый спектр целочисленных данных. И тут проблема – какой должен быть набор? В языке С ввели набор, который должен был покрывать всё. Появился он для мини-ЭВМ, 16битную машину. Но потом было портирование и на другие машины. Был введен тип данных char – 1 байт, далее - short int, int, long int, long long. Так покрывается набор от 1 до 8 (для 64хбитных систем). Мы используем только int, если нам наплевать на представление. Как только мы привязываемся к представлению, нужно выбирать типы данных. Эта система была наследована языком С++. Новые языки С# и Java предназначались для несколько других целей. C# - архитектура CLI, где есть Common Type System. Чтобы сделать язык универсальным, создатели реализовали все типы данных в CTS, но и ещё типы данных, чтобы реализовать полную матрицу (1, 2, 4, 8)*(со знаком, без знака).

Со знаком

Без знака

1

sbyte

byte

2

short

ushort

4

int

uint

8

long

ulong



После появления 64хбитных систем, люди не захотели переписывать программы на С, сверх того – само развитие изменило свой путь. Большинство 64хбитных систем на рынке принадлежит не Intel с их действительно 64 битными регистрами, а x64-32 от AMD, где 64 бита использовались только для адресации памяти. Именно памяти не хватает больше всего. Вся базисная арифметика там остаётся 32хбитной, и остаётся только переписать компилятор. В языке Java была похожая ситуация только ещё хуже, потому что она кроссархитектурная, а разновидностей этих архитектур существенно больше, и создатели пошли по пути – лучше меньше, да лучше. Нужно покрыть размерности.

byte (0-255), short, int, long

Размер зафиксирован. Семантика программ однозначно определена для любой платформы. Программы могут выполняться медленнее, но семантика не изменится. Вторая проблема – беззнаковые целые. Как сравнивать знаковые и беззнаковые между собой? Смешивать их опасно, потому что может потеряться логика работы – и ошибку трудно будет обнаружить. В 70е годы их и не смешивали. Пример – язык Модула 2. Там был введен тип данных INTEGER и отдельно введен тип данных CARDINAL. Преобразование было только явное. I:INTEGER; C:CARDINAL; I:=INTEGER(c). В С++ нет ограничения на такие преобразования. Беззнаковый тип данных прежде всего нужен для работы со сдвигами, а так же для адресной арифметики. В Обероне (32битные системы), который уже был языком высокого уровня, были только byte (0-255), short, integer, long int. А остальное уже попросту не было нужно. Система простых ТД в Java была взята именно из Оберона. Если нет беззнаковых типов, то нет проблем и с их представлением. В С# есть команда unsafe{..}, где можно использовать почти всё, но код будет потенциально небезопасен, и без разрешения их не запустишь. Беззнаковые числа были в Java не нужны, но вот беззнаковые сдвиги были нужны, и ввели новый оператор >>>.

Лекция 7.

П.2 Целые типы.

2 подхода в реализации числовых ТД:

  1. Фиксирование базиса. Номенклатура ЦТД(целых типов данных) в С, С++, С#, Delphi, M-2, Java, Oberon. (во всех языках сказано явно к целочисленным типам данных относятся эти-эти-эти). Фиксируют размерность соответствующих типов данных C#, D, M-2, Oberon, Java, в Java еще и зафиксирована семантика. Зафиксировали полностью и представление чисел, и семантику числовых операций. Подход фиксации базиса ориентирован на максимальную эффективность. Что затрудняется? В С и С++ затрудняется переносимость соответствующей программы. Но С# и Java не жертвует этим.

  2. Обобщенные числовые типы. Вводится обобщенный тип данных, который не имеет имени, но наследуется всеми целыми (вещественными) типами. Концепция типа/подтипа.

Пример:

type NewInt is new integer; (Ада) – разные типы данных;

type NewInt = integer; (Pascal) – вводится понятие эквивалентности;

typedef int NewInt; (в Си и С++) - NewInt не является новым типом данных. Таким образом нельзя делать перегрузку - f(int) и f(NewInt).

Ада :

type Length is new integer range 0..MAX_LENGTH;

type Weight is new integer range 0..MAX_WEIGHT;

type Int16 is new integer range -32768..32767

type UInt is new integer range 0..65535

i16 : Int16;

uint16 : Uint 16;

i16 := ui16; - error

i16 := Ui16 (ui16) - правильно, если общий базовый тип

subtype POSITIVE is integer range 1..MAX_INTEGER;

subtype NATURAl is integer range 0..MAX_INTEGER;

n:NATURAL : = 0;

p : POSITIVE ;

n := p;

p := n;

Квазистатический контроль – контроль, который осуществляется компилятором неявно( так например сделано в Паскале).

Преобразования из знаковых в беззнаковые – небезопасные, а преобразование из беззнаковых в знаковые с расширением - безопасные.

В современных языка программирования мы видим возврат к обобщенным числовым типам – она более гибкая. Но это усложняет язык и тем самым компилятор, что отпугивает многих разработчиков.

п.3 Вещественные типы.

- плавающие типы (наиболее популярное представление вещественных типов данных) – представление : +- M*Bp

- фиксированные типы – нужны, например для представления цифрового аналогового сигнала, может принимать ограниченное множество значений. При вычислениях нужны именно вещественные типы.

1985год: стандарт IEEE 754 – стандартизовали представление вещественных чисел

Нормализованная мантисса – 1/B <= M < 1 (после 0. не должен идти 0, в двоичной обязательно 0.1) Например 1 = 0.1*2^1; С этой точки зрения яп с удовольствием зафиксировали свой базис (например, типы float, double). С этой точки зрения ситуация с вещественными числами значительно улучшилась.

type FLOAT is digit 6 – 6 десятичных знаков после точки.

Также иногда используются специальные типы данных, например, decimal 0..9.

Есть представление UTC, FILETIME – вводится в соответствующий классовый тип данных.

Лекция 8.

П.4. Логические и символьные ТД



Впервые появился в языке АЛГОЛ-60, поэтому часто называется не logical, а Boolean. Над ним применим базисный набор логических операций – and, or, not, xor, true, false.

Изначально в языке С логические операции были, а логического типа не было. Любое выражение имело логический смысл, если оно могло преобразовываться к int или void *, потом проверялось на =0. С точки зрения компактности здесь есть свои плюс, но есть и минусы – надёжность и читабельность. Единственный язык с неявным преобразованием int <-> bool это С и С++. В С-99 появился логический тип, до этого он мог иметь любую размерность, теперь базис был определен как целый, специфицированый true и false. Современные языки, которые построены с нуля – как Java, C#, тоже имеют логические типы Boolean. Неявных преобразований там нет, все реализации так или иначе наследуют язык АЛГОЛ-60. Особого интереса он не представляет, но в силу своей теоретической важности, он есть во всех ЯП.

Теперь о символьных типах данных: С ними возникают явные проблемы. Родина ЯП – США и Западная Европа - c этой точки зрения вполне достаточно было 1 байта для представления символьного ТД. Один из 1х ЯП с именно символьным ТД – Паскаль. Языки не могут адекватно использоваться для решения некоторых задач, где требуется многоязычная поддержка. Проблема - набор символов (character set) – мощность набора и какой именно набор символов он поддерживает. До 80х годов с этой точки зрения был полный бардак. Набор символов вообще говоря имеет некое официальное название для каждого символа и код символа. Появилась широко известная кодировка ASCII-7. Теперь она так или иначе используется почти везде как базовый набор символов ( (0-127 символов) 0-31 – непечатные символы, A-Z, a-z, 0-9, символы пунктуации). Обычно, когда расширяют набор символов, то первые 128 зарезервированы и совпадают с ASCII. Одного байта хватало только на кодировку (SB CS) – ЯП Паскаль, С, С++. Существовал ISO-Latin1 набор символов, который включал ASCII-7, а оставшиеся 128-255 были зарезервированы под национальные алфавиты, но их критично не хватало даже на Европу, поэтому хватило только на страны Запада, поэтому существовало ещё куча кодировок (кириллица, турецкий, греческий, арабский, etc). В настоящее время используется до 5 кодировок кириллицы, например – KOI8-R (первоначально она использовалась для электронной почты). Основные сервера в начале развития интернета были в Америке и использовали ASCII-7, даже не поддерживали ANSI и ISO-Latin1.

KOI8-R был разработан специальным образом – из текста на русском языке кириллическая А переходила в латинскую А, Б->B. Кроме KOI8-R существует ещё множество кодировок , самая популярная – CP1251 от Майкрософт. Тем не менее существуют языки, в которых не хватает SB CS, особенно когда компьютеризация достигла Японии и Китая. Появились MB CS (Япония, принцип – если байт имел значение от 0-127, то ASCII-7, если >=127, то он начинал некоторую последовательность 1-3 байта, который кодировал какой-то из чисто японских символов, все программы, которые работали с англ.текстом, работали безо всякого изменения), DB CS (переход требовал полного передела ПО).

1991 год изменил ситуацию – появился Unicode, который примерно соответствует ISO UCS – Universal Character Set. Он стандартизовал некоторый набор символов, названый алфавитом, использовался принцип DB CS 0-65535. Он стал называться UCS-2. Первые 128 позиций совпадают с ASCII-7, следующие 128 – с ISO Latin1. Поэтому если работают в ANSI кодировке, то надо лишь обрубить старший байт – достаточно простые преобразования. Надо отдать должное Майкрософт, которое при разработке Windows использовали DB CS и MB CS. Когда в 1993 году они стали разрабатывать Windows NT, то с точки зрения подхода к интернационализации приложений, Майкрософт сделал больше, чем остальные компании вместе взятые. Майкрософт использует кодировку Unicode. Существуют специальные системные вызовы – MultiByteToWideChar и наоборот. Разработка интернациональных приложений очень сложно, и это не одно и то же, что просто локализации приложений – здесь для каждой локализации есть своя версия приложений. Есть ещё и глобализованные приложения – они должны работать одинаково в любой среде. Во всех новых ЯП (Java, C#) принята следующая ситуация – существует тип данных char, который занимает 2 байта и имеет кодировку Unicode (нет связи с целочисленным типом данных, никакой автоматической кодировки из char в int нет). Но что же делать со старыми языками, которые появились ещё до Unicode? В С++ используется старый тип данных чар, но появился и тип wchart – по сути дела это unsigned short, раньше он определялся через typedef (это арифметический тип данных, и имеет неявное преобразование в unsigned short). Необходимость ввода нового типа данных была обусловлена полиморфизмом. Не позволяют перегрузку функций только Оберон, Модула 2. Она удобная, но не является абсолютно необходимой. Проблема переноса возникла и для такого языка как Ada, так как IBM и остальные использовали свою собственную кодировку. Им нужно было, чтобы программы переносились с одной кодировки на другую, а они решили не привязываться ни к какой кодировке вообще. Поэтому в Ада символьный тип данных рассматривался как частный случай перечислимого типа. Элемент перечисления – так называемый литерал – некий символ, записанный в кавычках.

type enum is (one,two,three);

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5301
Авторов
на СтудИзбе
417
Средний доход
с одного платного файла
Обучение Подробнее