Лекция 03 (лекции (2002)), страница 2
Описание файла
Файл "Лекция 03" внутри архива находится в папке "лекции (2002)". Документ из архива "лекции (2002)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "Лекция 03"
Текст 2 страницы из документа "Лекция 03"
begin
i: integer;
proc p
i: real;
proc p1
i: integer;
begin
i:=c;
end
Здесь мы имеем три степени вложенности. Мы идем по статической цепочке вложенности. Связывание осуществляет компилятор, он смотрит на свои внутренние таблицы и, когда у нас появляется потребность изменить значение, он выкидывает старое и ставит новое.
Глядя на имя и на полный текст программы, мы всегда можем понять к чему это имя относится. Правило «одно имя – одна сущность» держится до сих пор и ослабляется только на имена функций. Существует и другой подход к определению областей видимости, а именно динамический подход.
Будем считать объявление переменной некоторым оператором. У нас есть некоторая общая таблица имен и посредством этого оператора мы просто добавляем новое имя в таблицу. Как только мы покидаем соответствующий блок, время жизни переменной у нас квазистатическое, имя переменной выкидывается из таблицы. Как происходит связывание?
Связывание происходит в момент выполнения. Если компилятор видит новое вхождение, он вставляет код, который ищет имя в динамической таблице. Если он нашел переменную, то вставляется новое значение, а если нет, то выдается сообщение об ошибке, которая может быть выдано не в момент трансляции, а только в момент выполнения программы.
Традиционные ЯП используют статические области видимости с одним исключением, когда речь идет об обработки аварийных, исключительных ситуаций. Механизм обработки исключений основан на динамической области видимости. Понятие динамической области видимости проявляется, прежде всего, в функциональных ЯП. В Лисп из интерактивных ЯП добавлено понятие переменной, но там есть связывание либо по статической области видимости, либо по динамической. При этом связывание переменная из одного блока может обращаться к переменной из другого блока. Это не возможно при статическом связывание.
Когда мы говорили про типы данных, то отмечали, что тип данных – это, прежде всего набор операций, а потом уже соответствующее множество значений. Данные и операции имеют очень близкое значение и имеют двойственную натуру. Т. е. операции и данные могут между собой перемешиваться. И вопрос, это данные или это операция, является вопросом реализации. Например, возьмем такой тип данных, как строка (String). Интересна операция, которая называется Length, она возвращает длину строки. Вот что это такое, данные или операция? Рассмотрим различные реализации этого типа данных. Это, например в Си, указатель на строку с переменной длиной. Строка имеет ноль в последнем байте. Что такое здесь Length? Мы бежим по строке, пока не наткнемся на ноль, и подсчитываем количество символов. Это, безусловно, операция. В ранних версиях Паскаля и в Delphi этот тип остался, называется он unsigned string. Он представляет из себя массив длиной до 255 байт, у которого 1-й байт – это длина. Здесь Length - это данные, мы просто возвращали 1-й байт. Правда длина строки ограничена 255 байтами, но мы можем хранить любую информацию, в том числе и нули. Надо помнить, что данные и операции, вообще, взаимозаменяемые.
Был такой язык РЕФАЛ. Возникла задача по генерации набора тестов. У нас есть грамматики, есть язык, который описывают эти грамматики. Мы пишем то ли транслятор, то ли интерпретатор с этого языка – это совсем не важно. Хочется написать средство, чтобы по описанию грамматики оно генерировало множество тестов. Для этих целей РЕФАЛ почти идеальный язык. Такая задача возникла в одной дипломной работе, но беда в том, что РЕФАЛ очень удобен для символьной обработки, но не очень удобен для численных расчетов. Любое средство по генерации тестов должно содержать что-то, что ограничивало бы набор выдаваемых тестов. Например датчик случайных чисел. Это функция, которая производит довольно нетривиальные расчеты. А РЕФАЛ был плохо предназначен для этих расчетов, в встроенной функции в ранней реализации не было. Написать датчик псевдослучайных чисел на РЕФАЛе, но по сложности эта задача сопоставима с написанием самого генератора. Тогда с помощью другого языка сгенерировали последовательность псевдослучайных чисел, записали в файл и считывали данные из этого файла, что на РЕФАЛе делалось легко. Это пример того, когда мы некоторую функцию заменили просто массивом данных.
Концептуальная схема рассмотрения ЯП.
Мы будем рассматривать ЯП по следующей схеме:
-
Базис. Скалярный Структурный
Типы данных и Составные типы данных
операции над и операции над ними
ними
Базисы современных ЯП не слишком ушли вперед от самых первых ЯП типа FORTRAN и Алгол-60.
2. Средства развития. ( Си и Си++. С точки зрения базиса там появился новый тип данных – ссылка, в следствие чего стало возможным передавать параметры в функции по ссылке. А с точки зрения средств развития появился класс, а с ним появилась возможность перекрытия операций, динамического связывания) Это построение новых понятий на базе уже существующих. Можно сказать, что средства развития – это средства введения, описания новых абстракций.
3. Средства защиты. Это то, как эти абстракции защищены от разрушений. Эти разрушения могут быть последствием либо какого-то злоумышлия, что к ЯП никакого отношения не имеет, либо следствием каких-то ошибок в программе.