И.Г. Головин - Конспект лекций по курсу Языки программирования (1161120), страница 8
Текст из файла (страница 8)
Переменные в Smalltalk недоступны извне, длядоступа используются функции-члены set и get. Свойство в Smalltalk36извне является данным, а изнутри – объектом, потому что изнутримы обращаемся к нему как к переменной, а извне – как к функции.Заметим, что в общем случае get и set функции могут быть и нетривиальными. Например,функция установки позиции экрана Win32.SetWindowPos(…) осуществляет системныйвызов.АТРИБУТЫ ОБЪЕКТОВ ДАННЫХУ объектов данных могут быть некие атрибуты:имязначениетипвремя жизниобласть видимостиобласть действияадрес (осмысленно только для императивной парадигмы)СВЯЗЫВАНИЕ АТРИБУТОВТрадиционно этому понятию уделяется мало внимания, хотя он столь же фундаменталенСвязывание – это процесс установления соответствия между объектами и их атрибутами.Ключевое понятие – время связывания.Существует три основных вида связывания: связывание о время выполнения, связывание вовремя трансляции и квазистатическое связывание.1.
Связывание во время выполненияИначе оно называется динамическим связыванием.Может выполняться:при входе в блок, однако этот случай больше относится к квазистатическойсвязи. в любой момент работы программы (new, malloc).2. Связывание во время трансляцииМожет выполняться:по выбору программиста (объявление)по выбору трансляторапо выбору компоновщикаПоследние два случая относятся к статическому связыванию.Пример: объявление var l;Можно ведь и не объявлять переменную явно, а объявлять ее автоматически, при первомупоминании. Однако в этом случае возникает вопрос, а что считать первым упоминанием.37Пример: (С)static int i; – связывание выполняет транслятор либокомпоновщикvoid foo() {int i;}i выбирается по правилам ассемблера.static X a; – возникает вопрос, в какой момент вызываетсяконструктор? Такие случаи связывания называют квазистатическимсвязыванием.Во время работы программы можно выделить два этапа, «невидимых» для разработчикапрограммы – пролог и эпилог.
В стандартном прологе происходит, например, открытиестандартных потоков stdin, stdout и stderr.Динамические языки – такие языки, в которых большинство ключевых связыванийпроисходит динамически (в особенности связывание имени и типа). В статическом языкевсе наоборот, большинство ключевых связываний происходят статически.Рассмотрим важный вид связывания – связывание определения переменной и ее типа.СВЯЗЫВАНИЕ ОПРЕДЕЛЕНИЯ И ТИПАОно может осуществляться в различные моменты:во время реализации языка (например, предельные системозависимые значениятипов данных)во время разработки языкаВ последнем случае важно, о компилируемых или интерпретируемых языках мы говорим.1.
Компилируемые языкиКод программы L транслируется в представление L1.LL1Частный случай L1 – программа на языке ассемблера (очень низкоуровневой, то естьобладающий большой машинной зависимостью).В ассемблере может быть три вида предложений: комментарий директива команда (то есть один-в-один машинная команда).382. Интерпретируемые языкиКод программы выполняется сразу.LRESDЗдесь L – текст программы, D – входные данные, RES – результат.Чистый интерпретатор – это, например, интерпретатор BASIC для IBM 80-х. Насовременном BASIC можно писать макросы (VBA, Visual Basic for Applications).Не-чистый интерпретатор: исходный код сначала компилируется, а потоминтерпретируется. Макросы VBA автоматически транслируются – таким образом,нельзя транслировать неверную команду (нельзя набрать endif, можно только EndIf).С некоторой версии можно включать режим компиляции.С интерпретатором проще работать, чем с компилятором.Из компилятора тоже можно сделать интерпретатор.
Например, Lisp являетсяинтерпретатором, потому что в нем есть конструкция eval s. На C тоже можно написать eval спомощью fork(), exec(). Обратно, если язык интерпретируемый, то это не означает, что егонельзя компилировать.Вернемся к понятию связывания типа и объекта. В интерпретируемых языках связываниетипа и объекта происходит динамически. Рассмотрим три языка, на которых объяснимотличия связывания типа и объекта у компилируемых и интерпретируемых языков.Пример (C++, JavaScript, Visual Basic)C++int a, b;a + b;Здесь + означает операцию целого сложения, то есть связывание соперацией является статическим.JavaScriptvar a, b;a + bЭто интерпретируемый язык, значит, связывание происходитдинамически. a + b – это что угодно.VisualBasic39DIM V[10]В языке VisualBasic объявлять нужно только массивы.S$Второй символ однозначно определяет типСвязывание объекта и множества значенийРаньше тип определяли как множество значений.
Но это странно. Пример:1 1 1 1 1 1 1 1Число в ячейке может означать как -1, так и 255 – это зависит от точки зрения. Операции divи mod тоже выполняются по-разному над различными типами. Таким образом, тип данныххарактеризуется не только множеством значений, но и множеством операций.Абстрактный тип данных определяет тип как набор операций. Иначе это понятие называютинтерфейсом или сигнатурой.ОБЛАСТИ ВИДИМОСТИ И ОБЛАСТЬ ДЕЙСТВИЯОбласть видимости – область, в которой действительно объявление видимого имени.Области видимости бывают потенциальными и непосредственными.Пример (JavaScript){if(x<0)a = 0; – здесь происходит так называемое всплытие имениalert(a);}Существует так называемая потенциальная область видимости.Пример (C++)class M {int a;};Вне класса M член a находится в потенциальной области видимости.M::a;Здесь применен оператор расширения области видимости ::40Область действия в классических языках программирования совпадает с областьювидимости.
Однако в некоторых случаях область действия может превышать областьвидимости. Примером может служить замыкание в функциональных языках. Еслипеременная появляется в замыкании, то она «живет» даже при выходе из блока.Объекты данных характеризуются некоторым набором атрибутов: имя, значение, времяжизни, область видимости, область действияТри последние атрибута сильно связаны.Время жизни – время, которое объект существует.Связано с классом памяти(класс памяти можно определять из соображений времени жизни,а можно из соображений реализации).КЛАССЫ ПАМЯТИСтатическая памятьВремя жизни = время работы программных конструкций, то есть существует, пока работаетпрограмма.Пример – статические объекты в С++:глобальные – создается перед началом работы программы,локальныеПример (C++){ static X a }– создается при входе в блок, если в блок не зашлито нет и конструктораЗаметим, что static может означать и объявление, и определение.Смыслы ключевого слова static в C и C++:1.
Объект недоступен (локален в данном модуле), например static void f();2. Объект принадлежит статическому классу памятиa. Глобальная переменная – локальна в данном файлеb. Переменная внутри блока – относится к статическому классу памяти3. (в С++) статический член (тесно связано с первыми двумя смыслами)Типичный вопрос на устном экзамене: все смыслы ключевого слова virtual? Ответ:виртуальные функции и виртуальное наследование.В SmallTalk классификация проще для понимания: есть класс, а есть экземпляры класса(instance).В Smalltalk существует два вида переменных:411. переменные класса – принадлежат классу (и никакому экзмепляру, в С++статические),2. переменные экземпляра – принадлежат экземпляру (нестатические).Всё что связано со словом «статический» размещается в блоке статической памяти. Времяжизни – от начала программы либо момента первого входа в блок, и до конца программы.Квазистатическая памятьКвазистатическая память связана с понятием блок: переменная связана с этим блоком (отмомента объявления, точнее, прохода code flow через объявление, до выхода из блока).Все характеристики почти как у статических объектов, только рассматривается не всяпрограмма, а блокРазмещаются в стекеДинамическая памятьДинамическая память, по крайней мере, в момент жизни зависит от выполнениясоответствующих процедур.Существует специальная операция размещения объекта в динамической памяти (new).Возникает вопрос: до какого времени живут объекты в динамической памяти? В этомотношении языки делятся на 2 класса1.
языки с динамической сборкой мусора – явное удаление объекта из динамическойпамяти(время жизни между new и delete)2. языки без динамической сборки мусора (отсутствие операции delete – удаляет,когда на него ничего не ссылается (никому не нужен))Проблемы языков с динамической сборкой мусора:1. Висячая ссылка – ссылка, которая куда то указывает, но куда – непонятно, т.е.указывает на несуществующий объектПример (C++, висячая ссылка)X * pa = new X();X *pb = pa;delete pa;// Pb – висячая ссылкаPb->fld = 0; // неопределенное поведение2.