Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 128
Текст из файла (страница 128)
Необходимость ограничения длины имени шестью символами превратила этот язьш в 5с!1сше. Именно эта версия 1 15 Р оказала наиболыпее влияние на использование языка в академической среде. В апреле 1981 г. была организована встреча заинтересованных лиц, имеющих отношение к 115Р, для объединения различных диалектов в единый язык, который за неимением лучшего названия стал называться Сошшоп 115Р (общий П5Р). Название 5гаппап! 1.15Р (стандартный 1.15Р) было уже использовано для одного из диалектов. Разработка основной структуры Сопшюп Ы5Р заняла следующие три года.
Пик популярности языка 1 15Р приходится на период с 1985 по 1990 г. В это время задачи искусственного интеллекта вызывали повышенный интерес; более 466 Глава 10. Управление памятью 75 Ж первокурсников выбирали искусственный интеллект в качестве области специализации. В 1986 г. техническая рабочая группа ХЗ!13 начала работу по стандартизации Сошпюп Ь!5Р, и ее первой целью стало объединение Сошшоп ЫЯР и 5сЬеше. Однако эта попытка не увенчалась успехом, поэтому в 1989 г. в Институте инженеров электротехники и электроники (1пзс йоге о1Е! ее!пса! апг! Е! есггоп!сз Еп8!пеегэ, 1ЕЕЕ) был разработан стандарт !ЕЕЕ языка 5сЬеше. Приблизительно в это же время стали заметны преимушества объектно-ориентированного программирования на языках С++ и 5шайгайц поэтому был разработан Соп1шоп ЫЯР ОЬ)есг Зузгеш (С105). Наконец, в 1992 г.
группа ХЗ!13 предложила описание Сошпшп П5Р, который занял более тысячи страниц — больше, чем описание стандарта языка СОВО!.. Кажется странным, что язык с такой простой и ясной основной структурой вышел из-под контроля. С самого начала 1!5Р подвергался критике за медленность выполнения, особенно на стандартном компьютере фон Неймана, описанном в главе 2. Когда функции саг и сог были смоделированы на аппаратном компьютере !ВМ 704, была предложена альтернативная машинная архитектура, которая позволяла ускорить выполнение программ на Ь!5Р. Несколько компаний разрабатывали компьютеры, специально предназначенные для быстрого выполнения программ на ПЯР. Тем не менее около 1989 г, была разработана стратегия сбора мусора для компьютера со стандартной неймановской архитектурой, которая оказалась конкурентоспособной по отношению к специально созданному для выполнения программ на Е!5Р аппаратному компьютеру.
По этой причине ни одна из компаний, создававших специальные ПЯ Р-компьютеры, не имела долговременного коммерческого успеха. Краткий обзор языка. Обычно программы на П5Р выполняются в интерактивной среде. Поэтому не суьцествует главной программы в обычном понимании этого слова. Вместо этого пользователь вводит с терминала последовательность выражений, ко~орые требуется вычислить, Система Е!5Р вычисляет выражения по мере их ввода и автоматически выводит результаты на экран монитора. Обычно некоторые введенные выражения являются определениями функций.
Другие выражения содержат обращения к этим определенным функциям с указанием конкретных значений аргументов. В ЫЯР не существует блочной структуры или других синтаксически сложных структур. Единственной формой взаимодействия между различными функпиями является обращение к одной функции из другой во время выполнения программы. Функции П5Р полностью определяютсл как выражения. Кажлый оператор является функцией, возвращающей некоторое значение, а подпрограммы записываются как единые !часто очень сложные) выражения.
Для того чтобы этот синтаксис, включающий только выражения, сделать более похожим на обычный синтаксис, состоящий из носледовательносгпи олералюров, в язык были добавлены разнообразные специальные конструкции, но все же основной формой остаются выражения. Набор типов данных в Ы5Р довольно ограничен. Основными элементарными типами данных являются литеральные атомы !символы) и числовые атомы (числа). Связанные списки и списки свойств !особая разновидность связанных списков) образуют основные структуры данных.
Вся обработка дескрипторов осуществляется во время выполнения программы, и не требуется никаких объявлений. 10,4, Управление кучей 467 1.13Р предоставляет широкий выбор элементарных операций для создания, уничтожения и модификации списков (включая списки свойств). Имеются и основные арифметические операции. Во время выполнения программы с помощью специальных элементарных операций можно транслировать и выполнять другие программы, а программы могут создаваться и выполняться динамически. Структуры управления АКР относительно просты.
Выражения, используемые для составления программ, записываются строго в кембриджской польской записи и могут содержать условное ветвление. Конструкция ргое предоставляет простую структуру для записи последовательности выражений. В большинстве программ на 1 1ЗР широко используются рекурсивные вызовы функций. Комментарии в Е13 Р обычно начинаются точкой с запятой, при этом вся следующая за этим символом строка является комментарием. Обработка нелокальных ссылок в 1ЛЯР основана па привиле последней ассоциации, которое часто реализуется с помощью простого связанного списка текущих ассоциаций, так называемого Л-списка.
Каждый раз, когда встречается ссылка на какой-либо идентификатор, в этом списке для него отыскивается текущая ассоциация. Параметры функций передаются либо только по значению, либо только по имени в зависимости от классификации функции, при этом обычным случаем является передача параметров по значению. Легче всего Е!ЯР реализуется с помощью программного интерпретатора и программного моделирования всех элементарных операций.
Многие реализации предоставляют также компилятор, который можно использовать для компиляции отдельных определений функций в машинные коды. Этн скомпилированные функции затем выполнятся аппаратным интерпретатором (но по-прежнему для многих операций требуется программное моделирование). 11ВР довольно плохо приспособлен для компиляции, так как большая часть связываний происходит только во время выполнения программы.
В качестве основного средства для хранения данных и программ применяется сложная система управления памятью с использованием кучи и сбора мусора. 10.4.2. Элементы фиксированного размера Предположим, что каждый элемент фиксированного размера, расположенный в куче и впоследствии извлекаемый из нее, занимает Мелов памяти.
Обычно Ж равно 1 или 2. Если предположить, что куча занимает непрерывный блок памяти, мы мысленно разбиваем блок на лослеловательпостьКэлементов длиной по)Услов каждый, так что размер всей кучи равен Кх Х, Когда требуется некоторый элемент, выделяется один из этих элементов кучи. Когда некоторый элемент освобождается, он должен быть одним лз этих же исходных элементов кучи. Первоначально эти К элементов связаны друг с другом и образуют список свободного простринства (то есть первое слово каждого элемента списка свободного пространства указывает на первое слово следующего элемента списка свободного пространства). При выделении элемента из списка свободного пространства удаляется его первый элемент, и указатель на него возвращается операции, требующей выделения памяти.
Когда элемент освобождается, он просто вставляется сно- 468 Глава 10. Управление памятью ва в голову списка свободного пространства. На рис. 10.1 изображены исходный вид списка свободного пространства и его вид после того, как были выделены, а затем освобождены некоторые элементы.
ПРИМЕЧАНИЕ: вштриковвнные области изображают элементы, которые были отведены под объекты и еще не освобождены Рис. 10.1. Структура списка свободного пространства: в — начальный список свободного пространства; б — список свободного пространства после выполнения Восстановление памяти: счетчики ссылок и сбор мусора Возврат освободившейся памяти в список свободного пространства несложен при условии, что ее можно обнаружить и восстановить. Однако процесс обнаружения и восстановления освободившейся памяти может оказаться достаточно сложным.
Проблема заключается в том, чтобы определить, какие элементы в куче могут быть повторно использованы и, слеловательно, должны быть возвращены в список свободного пространства. Широко ггрименякттся три способа решения этой задачи, которые описаны ниже. Явный возврат программистом или системой. Самый простой метод восстановления — это яаный возврат. Когда элемент, бывший в употреблении, становится доступным для повторного использования, он должен быть явным образом обозначен как свободный и возвращен в список своболного пространства (в Рааса!, например, для этого нужно вызвать функцию от эроэе), Если элементы использовались для системных целей, например для хранения сред ссылок, точек возврата из подпрограмм или временных переменных, или если все управление памятью контролируется операционной системой, то каждая системная программа обеспечивает возвращение пространства памяти, чтобы оно стало доступным лля повторного использования, путем явного обращения к программе, выполняющей освобождение памяти, передавая ей в качестве параметра соответствующий элемент.
10.4, Управление кучей 4б9 Р Зд))ос75тзеот7тпС))' 7* выделит~ нанять для тпо и присвоить ее 1-значение переиенной р *7 7* 7-значение, содериавюееся в перененнои р. потеряно *7 Р=Ш ияи 1пг *р. *ц. 7* р и ц являются указатепяии на целые числа *7 7* выделит~ нанять для тпг и присвоит~ ее 7-значение переиенной р *7 Ц=Р: 7* сохранить 7-значение выделеннои паияти в переиенной ц *7 тгее7р): 7* образуется повисшая ссылка в переиенной ц *7 Системе, функпиопирующей во время выполнения, одинаково трудно избежать создания мусора и повисптих ссылок.