Лекция 3 (Лекции (2009) (Саша Федорова)), страница 2
Описание файла
Файл "Лекция 3" внутри архива находится в папке "Лекции (2009) (Саша Федорова)". Документ из архива "Лекции (2009) (Саша Федорова)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "Лекция 3"
Текст 2 страницы из документа "Лекция 3"
Вообще говоря, поведение квазистатических обьектов во многом похоже на поведение статическиз обьектов(переменные, обьявленные в main, живут, как правило, не сильно дольше остальных)
Persist
Сохраняемый обьекты данных – обьекты даных, которые могут сохраняться и восстанавливаться из внешней памяти.
Примеры ЯП, где сохраняемые обьекты входят в ЯП: Java, C#(часть .Net)
ОБЛАСТЬ ВИДИМОСТИ(ОБЛАСТЬ ДЕЙСТВИЯ)
Область видимости(область действия)- часть программы, где действует обьявление(определение в ЯП со статической типизацией)
Обьявление:
ИмяТип данных
(это понятие касается лишь тех обьектов данных, у которых есть имена)
В статически типизированных ЯП:
-
Определяющее вхождение имени– как правило, должно предшествовать использованию, но не всегда(Forward Declaration)
-
Использующее значение – произвольное число раз входит в программу
В Паскале определяющим является вхождение, задающее Тип Данных.
В Си и С++ - обьяление.
Пример
Один из самых распространенных областей действия является блок(как правило, блоки вложены друг в друга)
i: integer - в каких констекстах может существовать?
-
Блок (заголовок: program/procedure)var…
Begin … end ,,,
-
Формальный параметр у функции или процедуры
-
Запись: record i: integer
Итак.
Понятие обьекта данных
- зависит от ЯП
- четко определяется синтаксически
В любом ЯП, разумеется, существует свое понятие области действия.
Что такое перекрытие имен? Это ситуация, в которой в одной области действия одному имени соответствует более одного вхождения. Перекрытие имен допустимо не во всех ЯП, всюду оно допускается лишь для процедур и функций.
Пример
Void f();
Void f(int)//=> одно определяющее вхождение
В Ада, С++, Lava, С#, Delphi правила выбора статические, все разрешается в момент трансляции.
Само понятие перекрытия имен настолько важно, что присутствует почти во всех ЯП. С другой стороны, в Обероне его нет(значит, оно не является критичной технологической потребностью?)
Взаимодействие различных областей действия
В случаее, когда области действия вкладываются друг в друга, ситуация не является перекрытием, так как выбирается «более близкая», то есть более вложенная.
Скрытие имен – ситуация, при которой определяющее вхождение внутренней области скрывает определяющее вхождение внешней области.
Таким образом, существует 3 случая, когда одному имени соответствует несколько обьектов данных:
-
Перекрытие(overwriting)
-
Сокрытие(hiding)
-
Перегрузка()
Пример гипотетического процедурного ЯП
procedure p;
i:integer;
procedure p1;
i:integer; (*)
begin
p2;
end p1;
procedure p2;
begin
i==-1;
end p2;
begin
i:=0;
p1;
p2;
end p;
Сколько у нас использующих вхожлений имени? 2.
В случае статического обьекта данных поиск определяющего значения происходит статически. В точке (*) кмпилятор должен выдать предпреждение о неиспользуемой переменной.
Замечание. В ЯП со статической типизацией и со статическими обектами данных понятие времени жизни тесно связано с понятием обьекта даннных, который это время жзни определяет.
Пункт 2. Понятие виртуальной машины ЯП
По определению, виртуальной машины не существует.
Виртуальная машина – это гипотетическая машина, языком готорой является соответствующий ЯП, позволяющий описывать поведение программ.
Пусть существует машина, у которой машинный язык служит оператором ЯП.
СССР: Институт Кибернетики, академик Глушков.
«Мир1», «Мир2», «Мир3».
У «МИР» маинным языком был язык-аналитик, являющийся аналогом языка Алгол-60, в нем присутствовала возможность символьного дифференцирования(для инженерных расчетов ).
Были и другие прототипные реализации ЯП.
Первый опыт: Паскаль
70-е гг – популярность ЯП Паскаль.
Калифорния, Сан-Диего. UCSD-Pascal. Требовалось М машин, а значит, М трансляторов с языка Паскаль. Они использовали ПОЛИЗ(его аналог) для паскаля – пи-код – на нем было удобно транслировать.
P-code Pascal
Получился первый вариант транслятора.
Программа => компилятор => P-code => M интерпретаторов P-code
Система интерпретации P-code превращалась в виртуальную машину.
SmallTalk
Придумали байт-код, в который транслировался код SmallTalk. Затем байт-код интерпретировался. Везде, где стоял byte-код, стоял SmallTalk-овская виртуальная машина.
Java-машина
Принцип WORA(write once read anywhere). Разрабатывалась JVM, использующую байт-код в качестве интерпретатора.
CLR MSIL(Microsoft Intermediate Language) – гипотетический код некой стековой машины.
Основное отличие в том, что не существует виртуальной машины для MSIL. Вместо этого осуществляется JTT(Just In Time Translation). Полученный бинарный код, таким образом, сразу выполняется и сразу загружается в стек, чтобы ничего не терять. Поэтому в первый раз программа выполняется медленнее, чем в последующие разы.
Пример. Классический Visual Basic – язык с динамической типизацией – проще интерпретировать, чем компилировать. Очень маленький .exe-файл – это промежуточный код, то, что запускает интерпретатор этого кода. А затем этот маленький код превращается в .exe-файл, не требующий интерпретации времени выполнения.
Поняте виртуальной машины оказалось полезным и с практической стороны: это очень работоспособные системы, они существуют и поныне.(мы говорим об абстрактных терминах, забывая об уровне реализации)
Пункт 3. Схема рассмотрения ЯП
Как известно, почти каждый сложный программный проект не укалдвается в обещаемые сроки выпуска.(Microsoft – не единственный тому пример)
Зачастую проблема заключается в сложности из-за семантического разрыва между архитектурой компьютеров и реальными обьектами.
Задача – сформировать понятия таким образом, чтобы обьект в программе соответствовали обьектам реального мира. На базе абстракций, предоставляемых используемым ЯП, нужно доходить до реальных моделей.
Схема рассмторения
Базис
-скалярный базис(в него входят те базисные конструкции, что не имеют составных частей: протые ТД, встроенные операции и т.п.)
-структурный базис(входят составные типы данных, операторы и т. д.)
Интересно, что при всем богатстве выбора императиыне ЯП почти не отличаются друг от друга. Зачем же придумывать новые ЯП, если уже есть? Это – уровень L0, а главное – построить некую иерархию из абстракций(на базе существующих абстракций – новые абстракции=процедуры+функции, создание новых типов данных). ЯП отличаются друг от друга именно средствами развития.
Достаточно ли этого? Нет, необходим еще 1 аппарат.Возьмем, к примеру, С. Есть ли в нем средства развития новых абстракций? Да, есть.
XAB – интерфейс на Си с Х-сервером/клиентом.
Xt –X-toolkit.
Итак, средства развития в Си присутствовали. Чего же не хватило? В С++ появились средства защиты новых абстракций. При Си-шном подходе такой защиты не было.(имеется в виду не защита от взломов, а защита от «дурака», то есть самого программиста)
Глава 2. Скалярный базис ЯП.
Простые Типы Данных(ТД)
Простые ТД
-
Арифметические ТД
-
Целочисленные ТД
-
Вещественные ТД
-
плавающие
-
с фиксированной точкой
-
-
Булевые ТД(всего 1): true, false
Символьный тип(вообще говоря, несовместим с целочисленными ТД – это «приблуда» языка Си)
Ссылки/ указатели(на базе арифметического, булевого и символьного типов) – идут, вообще говоря, отдельно
Ограниченные типы данных
-
Тип-перечисление
-
Тип-диапазон
Замечание. Строки – составные типы данных.