Курсовая работа - Особенности языка ЛИСП - файл n2.doc

Курсовая работа - Особенности языка ЛИСП
скачать (115.6 kb.)
Доступные файлы (3):
n2.doc214kb.02.12.2010 10:01скачать
n3.rar
n4.rar

n2.doc


Основные данные о работе


Версия шаблона

1.1

Филиал

Рыльский

Вид работы

Курсовая работа

Название дисциплины

Информационные технологии

Тема

Особенности языка ЛИСП

Фамилия студента

Шестакова

Имя студента

Елена

Отчество студента

Васильевна

№ контракта

17300060601002


Содержание


Введение 3

1. Язык программирования ЛИСП 5

1.1 Основные функции языка Лисп 5

1.2 Арифметические функции 7

1.3 Логические функции 7

1.4 Специальные функции 9

2. Особенности диалектов языка ЛИСП 12

2.1. MacLISP 12

2.2. MuLISP 13

2.3. InterLISP 14

2.4 CommonLISP 16

3. Особенности языка ЛИСП 20

Заключение 24

Глоссарий . 26

Список использованных источников…… 28

Приложения…..…………………………………………………………….29

Введение


LISP (от англ. LISt Processing — «обработка списков») — семейство языков программирования, основанных на представлении программы системой линейных списков символов, которые притом являются основной структурой данных языка. Лисп считается вторым после Фортрана старейшим высокоуровневым языком программирования.

В 1950-х годах специалисты по искусственному интеллекту начали поиски языка программирования, который бы позволял манипулировать понятиями, выраженными словами и фразами на естественном языке. Первый результат был получен в виде семейства языков под названием ИПЛ (IPL, от Information Processing Languages — языки обработки информации), созданного одним из пионеров в области искусственного интеллекта Алленом Ньюэллом и его сотрудниками. Центральным для ИПЛ являлось понятие списка. Представляя данные в виде списка слов и символов, программист мог связать понятия в памяти компьютера приблизительно таким же образом, как, по мнению специалистов по искусственному интеллекту, они связываются в памяти человека.

Понятием списка заинтересовался и Джон Маккарти [8], разносторонний математик, один из ведущих исследователей в области искусственного интеллекта (причем сам термин искусственный интеллект был предложен именно им в 1956 году). Язык Лисп был предложен Джоном Маккарти в работе в 1960 году и ориентирован на разработку программ для решения задач не численного характера. Английское название этого языка – LISP является аббревиатурой выражения LISt Processing (обработка списков) и хорошо подчеркивает основную область его применения. Понятие “список” оказалось очень емким. В виде списков удобно представлять алгебраические выражения, графы, элементы конечных групп, множества, правила вывода и многие другие сложные объекты.

Списки являются наиболее гибкой формой представления информации в памяти компьютеров. Неудивительно поэтому, что удобный язык, специально предназначенный для обработки списков, быстро завоевал популярность.

После появления LISP различными авторами был предложен целый ряд других алгоритмических языков ориентированных на решение задач в области искусственного интеллекта. Однако это не помешало LISP остаться наиболее популярным языком для решения таких задач. На протяжении почти сорокалетней истории его существования появился ряд диалектов этого языка: Common LISP, Mac LISP, InterLISP, Standard LISP и др. [3] Различия между ними не носят принципиального характера и в основном сводятся к несколько отличающемуся набору встроенных функций и некоторой разнице в форме записи программ. Поэтому, программист, научившийся работать на одном из них, без труда сможет освоить и любой другой.

Большим достоинством LISP является его функциональная направленность, т. е. программирование ведется с помощью функций. Причем функция понимается как правило, сопоставляющее элементам некоторого класса соответствующие элементы другого класса. Сам процесс сопоставления не оказывает никакого влияния на работу программы, важен только его результат – значение функции. Это позволяет относительно легко писать и отлаживать большие программные комплексы. Ясность программ, четкое разграничение их функций, отсутствие каверзных побочных эффектов при их выполнении является обязательными требованиями к программированию таких логически сложных задач, каковыми являются задачи искусственного интеллекта. Дисциплина в программировании становится особенно важной, когда над программой работает не один человек, а целая группа программистов. [1]

Цель курсовой работы – изучение особенностей языка LISP. Для достижения цели курсовой работы в ней будут рассмотрены основные функции данного языка программирования и отличительные особенности некоторых его диалектов.

Для достижения цели курсовой работы были поставлены и решены следующие задачи:

- подробный анализ основных функций языка программирования LISP;

- выявление и анализ отличительных особенностей некоторых диалектов данного языка программирования.

Основная часть

1 Язык программирования Лисп



1.1 Основные функции языка Лисп
К числу основных особенностей языка Лисп относится то, что программой является несколько определенных пользователем функций (Приложение А). С точки зрения синтаксиса Лисп-функция, как и обрабатываемые ею данные, представляет собой так называемое S-выражение. В простейшем случае S-выражением является атом (идентификатор или число), в более сложном - список, т.е. последовательность элементов, разделенных обычно пробелом и заключенных в круглые скобки [4].

Списки языка Лисп имеют рекурсивную структуру: элементом списка может быть произвольное S-выражение - как атом, так и список, например: (1() (a b (c)) class). Некоторые S-выражения можно вычислять, получая в результате значения (тоже S-выражения); такие выражения называются формами.

Формой может быть переменная, т.е. атом-идентификатор, которому было присвоено значение одной из функций Лиспа (значением такой формы является текущее значение переменной). Формой является также список-обращение к функции вида(f a1, a2 ... an), где f - имя функции, а ai - ее аргументы (n?0). Программа на Лиспе представляет собой последовательность таких форм, и ее выполнение заключается в их вычислении.

В большинстве версий языка Лисп имеется много встроенных (стандартных) функций, на основе которых составляется программа. Все они есть в наиболее известных версиях Лиспа, таких как Common Lisp и MuLisp [5].

Для определения новых функций используется встроенная функция defun, к которой возможны следующие (равноценные) обращения: (defun f (lambda (v1 v2 ... vn) e)) или (defun f (v1 v2 ... vn) e).

Вычисление функции defun в качестве побочного эффекта приводит к появлению в программе новой функции с именем f ; vi - формальные параметры новой функции (n?0), а e - форма, зависящая от vi. Таким образом, определяется обычная ЛИСП-функция, т.е. функция с фиксированным количеством аргументов, которые всегда вычисляются при обращении к ней.

При последующем обращении к этой уже определенной функции (f a1 a2 ... an) сначала вычисляются аргументы (фактические параметры) ai, затем вводятся локальные переменные vi, которым присваиваются значения соответствующих аргументов ai, и далее вычисляется форма e при этих значениях переменных vi, после чего эти переменные уничтожаются. Значением данной формы становится значение функции f при аргументах ai.

Операции над списками (car l) – значением аргумента l должен быть непустой список, тогда значением функции является первый элемент (верхнего уровня) этого списка (cdr l) и значением функции является "хвост" этого списка, т.е. список, полученный отбрасыванием первого элемента [6].

Кроме этих двух функций-селекторов элементов списка часто используются функции, являющиеся их суперпозициями. Имена всех таких функций начинаются на букву c, а заканчиваются на букву r, между ними же может стоять произвольная комбинация из не более чем 5 букв a и d, например, (cadar l)?(car(cdr(car l))) .

Предполагается, что список-аргумент l всех этих функций, так же как и следующей функции nth, содержит необходимое число элементов (в противном случае вычисления прерываются).

(nth n l) – значением аргумента n должно быть положительное целое число (обозначим его N), а значением аргумента l - список. Значением функции является N-й от начала элемент этого списка.

(last l) – функция выбирает последний (от начала) элемент списка, являющегося значением ее аргумента.

(cons e l) – в отличие от предыдущих функций эта функция является конструктором, т.е. строит новый список, который и выдает в качестве своего результата. Первым элементом этого списка будет значение аргумента e, а хвостом списка - значение аргумента l . Например, (append l1 l2)

Эта функция осуществляет слияние (конкатенацию) двух списков, являющихся значением двух ее аргументов.

(list e1 e2 ... en ) – еще одна функция конструктор, она имеет произвольное количество аргументов, из их значений она строит список (количество элементов результирующего списка равно количеству аргументов).
1.2 Арифметические функции
(add1 n) – значением аргумента этой функции должно быть число, функция прибавляет к этому числу 1 и выдает результат в качестве своего значения.

(sub1 n) – значением аргумента должно быть число, функция вычитает из него 1 и выдает результат в качестве своего значения.

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

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

(length l) – значением аргумента l должен быть список, значением функции является количество элементов (верхнего уровня) этого списка, например:

(mod n1 n2) – значениями обоих аргументов функции должны быть целые числа. Функция выполняет деление нацело первого числа на второе, и результат выдает в качестве своего значения.

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


1.3 Логические функции
Предикатом обычно называется форма, значение которой рассматривается как логическое значение "истина" или "ложь". Особенностью языка Лисп является то, что "ложью" считается пустой список, записываемый как () или nil, а "истиной" - любое другое выражение (часто в этой роли выступает атом T) [5].

(null e) – эта функция проверяет, является ли значение ее аргумента пустым списком: если да, то значение функции равно T, иначе - ().

(eq e1 e2) – функция сравнивает значения своих аргументов, которые должны быть атомами-идентификаторами. В случае их совпадения (идентичности) значение функции равно T, иначе - ().

(eql e1 e2) – в отличие от предыдущей функции eql сравнивает значения своих аргументов, которыми могут быть не только атомы-идентификаторы, но и атомы-числа. Если они равны, то значение функции равно T, иначе - ().

(equal e1 e2) – пункция производит сравнение двух произвольных S-выражений - значений своих аргументов. Если они равны (имеют одинаковую структуру и состоят из одинаковых атомов), то значение функции равно T, иначе - ().

(neq e1 e2) – аналог, но значения аргументов сравниваются на "не равно".

Функция (member a l) производит поиск атома, являющегося значением первого ее аргумента, в списке (на верхнем его уровне), являющемся вторым аргументом. В случае успеха поиска значение функции равно T, иначе - ().

Значениями аргументов функции (gt n1 n2) или (> n1 n2) должны быть числа. Если первое из них больше второго, то значение функции равно T, иначе - ().

(lt n1 n2) или (< n1 n2) – аналог, но числа сравниваются на "меньше".

Логическими функциями называются три функции, реализующие основные логические операции [7].

Функция (not e), реализующая "отрицание", является дубликатом функции null: если значение аргумента равно () ("ложь"), то функция выдает результат T ("истина"), а при любом другом значении аргумента выдает результат ().

(and e1 e2 ... ek) (k?1) – конъюнкция. Функция по очереди вычисляет свои аргументы. Если значение очередного из них равно () ("ложь"), то функция, не вычисляя оставшиеся аргументы, заканчивает свою работу со значением (), а иначе переходит к вычислению следующего аргумента. Если функция дошла до вычисления последнего аргумента, то с его значением она и заканчивает свою работу.

(or e1 e2 ... ek) (k?1) – дизъюнкция. Функция по очереди вычисляет свои аргументы. Если значение очередного из них не равно () ("ложь"), то функция, не вычисляя оставшиеся аргументы, заканчивает свою работу со значением этого аргумента, в противном случае она переходит к вычислению следующего аргумента. Если функция дошла до вычисления последнего аргумента, то с его значением она и заканчивает свою работу.

К числу логических функций можно отнести и условное выражение: [cond (p1 e1,1 e1,2 ... e1,k1) ... (pn en,1 en,2 ... en,kn)] (n?1, ki?1)

Функция cond последовательно вычисляет первые элементы своих аргументов – обращения к предикатам pi. Если все они имеют значение () ("ложь"), тогда функция заканчивает свою работу с этим же значением. Но если был обнаружен предикат pi, значение которого отлично от (), т.е. он имеет значение "истина", тогда функция cond уже не будет рассматривать остальные предикаты, а последовательно вычислит формы ei,j из этого i-го аргумента и со значением последнего из них закончит свою работу. Следует отметить, что поскольку значения предыдущих форм из этого аргумента нигде не запоминаются, то в качестве этих форм имеет смысл использовать только такие, у которых есть побочный эффект, например, обращение к функции присвоения значения [2].
1.4 Специальные функции
Функция блокировки вычислений (quote e) или 'e, выдает в качестве значения свой аргумент, не вычисляя его.

Функция (gensym) генерации уникальных атомов, при каждом обращении к ней вычисляет (образует) новый атом-идентификатор. Этот идентификатор получается склеиванием специального префикса и очередного целого числа. Префикс и целое число, от которого начинается нумерация генерируемых атомов, могут быть установлены заранее, как например, в языке MuLisp: (setq *gensym-prefix* 'S) (setq *gensym-count* 2) [10].

После этого функция gensym будет последовательно выдавать атомы S2, S3, S4, ... .

(prog (v1 v2 ... vn) e1 e2 ... ek) (n?0, k?1) – Блочная и связанные с ней функции. Эту функцию называют "блочной", поскольку ее вычисление напоминает выполнение блоков в других языках программирования.

Вычисление функции начинается с того, что вводятся локальные переменные vi, перечисленные в ее первом аргументе, и всем им присваивается в качестве начального значения пустой список (). После этого функция последовательно вычисляет остальные свои аргументы - формы ei. Вычислив последнюю из них, функция prog заканчивает работу со значением этой формы, уничтожив при этом свои локальные переменные.

Вычисленные значения всех форм ei, кроме последней, нигде не запоминаются, поэтому имеет смысл использовать в качестве них только функции с побочным эффектом. Некоторые из этих функций перечислены ниже.

В качестве ei может быть записан и атом-идентификатор, в этом случае он не вычисляется, и трактуется как метка, на которую будет производиться переход внутри этого блока (функцией go) [2].

(setq v e) – аналог оператора присваивания. В качестве аргумента v должно быть задано имя переменной, существующей в данный момент. Функция присваивает этой переменной новое значение - значение аргумента е. Это же значение является значением и самой функции setq, хотя оно, как правило, не используется.

В функции (pop v1 v2) обоими аргументами должны быть имена переменных, существующих в данный момент, причем переменная v2 должна иметь значение и им должен быть непустой список.

Функция разделяет этот список на две части - на его первый элемент, который присваивается переменной v1, и на его оставшуюся часть (без первого элемента), которая становится новым значением переменной v2.

В качестве второго аргумента функции (push е v) должно быть задано имя переменной, в качестве первого - произвольная форма. Функция вычисляет эту форму и строит новый список, первый элемент которого - вычисленное значение, а хвост - список, являющийся значением переменной v. Результирующий список присваивается в качестве нового значения переменной v (он также является значением самой функции push).

(return e) – функция досрочного выхода из блока, она может использоваться только внутри блочной функции prog, поскольку завершает вычисление ближайшей объемлющей блочной функции, объявляя ее значением значение аргумента e.

(go e) – функция перехода по метке. В качестве аргумента функции go должен быть задан идентификатор - одна из меток ближайшей объемлющей блочной функции. Функция go полностью завершает вычисление той формы этой блочной функции, в которую она входит (на любом уровне), и осуществляет переход для вычисления формы, следующей за этой меткой [9, 3].

2 Особенности диалектов языка Лисп



2.1 MacLISP
Помимо символьной обработки MacLISP [4] широко использовался в традиционных числовых вычислениях, применяемых, например, в обработке речи и изображений. Кроме исследователей ИИ и разработчиков алгебраической системы Максима на Маклисп оказали влияние и работы групп в МИТ по робототехнике, обработке речи и изображений. Исходя из требований, предъявляемых этими областями, в Маклисп были включены новые математические типы данных, такие как матричная и битовая обработка, а также широкий набор арифметических функций и средств. Быть может, важнейшая из них – возможность вычислений с неограниченной точностью, основывающаяся на созданных Кнутом в 1969 году алгоритмах.

MacLISP был также первой LISP-системой для которой создан хороший транслятор. Транслятор генерирует машинную программу в форме списков. Машинный код в виде списка легко обрабатывать и результирующий код для числовых задач получался эффективнее, чем у лучших трансляторов фортрана.

Однако большую часть своих свойств MacLISP приобрел под влиянием стоящих перед исследователями ИИ проблем и накопленного опыта. Так в язык попали макросы чтения и таблицы чтения, позволяющие легко изменять и расширять структуру языка. Таким же образом из требований к программам и окружению возникли управляющие структуры, механизмы обработки прерываний и ошибок, а также использование управляющих символов, создан и интегрирован в систему экранный редактор, появились управление и взаимодействие параллельных процессов [5, 4].

Основное внимание разработчики MacLISP сосредоточили на эффективности. Этому служат указания, уточняющие способы обработки аргументов функций, а также экранирование от вмешательства программиста внутренних механизмов системы. За счет этих мер скорость работы Маклиспа в 1,5 – 2,5 раза выше, чем Интерлисп.

Всего в Маклиспе используется около 400 функций. Самым большим недостатком системы является то, что ее никогда не документировали должным образом. Документация по этой системе разбросана по различным отчетам и руководствам. MacLISP был исследовательской системой и не предназначался для обучения и промышленного использования.
2.2 MuLISP
Интерпретатор MuLISP-85, разработанный для ПЭВМ серии IBM PC -удачный вариант реализации диалекта языка, включающий сравнительно ограниченный набор базовых функций (около 260) и оказавшийся вследствие этого более простым для изучения [5].

По сравнению с CommonLISP диалект MuLISP не имеет такого широкого спектра доступных типов данных. В нем обеспечивается работа только с двумя типами числовой информации: целыми числами с любым основанием и рациональными. В диалекте отсутствуют средства работы со структурами, массивами, потоками и другими типами данных, указанная реализация языка LISP имеет одно существенное преимущество - возможность пополнения базового набора функций путем подключения подпрограмм, написанных на языке ассемблера, что позволило повысить гибкость использования интерпретатора и ффективность прикладного программного обеспечения, создаваемого на его основе. Возможность такого пополнения отсутствует в большинстве других Лисп – систем, являющихся в этом смысле замкнутыми программными продуктами.

Среди других, вероятно, менее существенных, особенностей системы можно указать на реализацию специального механизма, позволяющего не заботиться о присваивании начальных значений литеральным атомам, получающих изначальное значение, равное «печатному» имени самого атома. Еще одной особенностью диалекта является возможность использования новой синтаксической конструкции «встроенный COND», существенно сокращающей тексты описаний функций пользователя и применяемой при записи тел функций и лямбда-выражений.

Набор базовых функций MuLISP-интерпретатора включает ряд функций, обеспечивающих доступ практически ко всем функциям ОС ЭВМ через соответствующие прерывания. Наконец, указанная Лисп-сис-тема обеспечивается библиотеками Лисп-функций, дополняющими базовый набор функциями, имеющимися в диалектах CommonLISP и InterLISP, что облегчает решение проблемы переносимости исходных текстов программных модулей, а также библиотеками, позволяющими выполнять манипулирование окнами на экране дисплея и обрабатывать управляющие воздействия через устройство типа «мышь». В комплект дополнительного программного обеспечения к интерпретатору входят интерактивный редактор текстов и простая обучающая система, написанные на диалекте языка MuLISP [10].
2.3 InterLISP
InterLISP появился в 1972 году из ББН-Лиспа. К 1978 году, когда вышло описание InterLISP, язык и система уже достаточно стабилизировались.

Интерлисп уже не был языком в том же смысле, что и MacLISP или другие LISP-системы или обычные традиционные системы программирования. Он представлял собой интегрированную среду программирования, в которую вошло множество различных вспомогательных средств. InterLISP стал классическим примером хорошо развитых программных средств и средств в системах разделения времени.

Этот диалект наряду с CommonLISP один из наиболее распространенных, имеет достаточно развитый аппарат представления и манипулирования различными структурами данных, включая массивы. Среди общих особенностей данного варианта языка следует отметить использование для обозначения встроенных функций нетрадиционных имен, что порой затрудняет перенос готовых программных продуктов на другие диалекты и другие ЭВМ [8].

В 1974 году Xerox начала разработку для InterLISP персональной лисповской рабочей станции под названием Alto. В реализации LISP для Alto впервые применили спроектированную специально для языка LISP и программируемую систему команд и мини-ЭВМ, способную с более высокой производительностью, чем универсальные ЭВМ, интерпретировать программы LISP. Из этой машины Alto впоследствии развились LISP-машины серии 1100 фирмы Xerox.

На основе версии Интерлиспа, работавшей в системе разделения времени, была создана совместимая снизу вверх версия LISP InterLISP-де, используемая на LISP – машинах серии 1100. В ее пользовательский интерфейс входили многооконное взаимодействие, графика с высокой разрешающей способностью, средства выбора из меню и мышь, а также ориентированный на использование экрана инспектор структур данных. Идея разделения экрана на многие независимые окна родилась в XLG. Алан Кэй уже в конце 60-х годов предложил такую идею подхода к компьютерам будущего и интерфейсу между человеком и машиной. Работа XLG привела к созданию в 70-х годах разработки языка программирования Smolltalk и объектного программирования [1].

При создании InterLISP работа велась весьма тщательно. Система хорошо документирована и более новые версии совместимы с более ранними. Так преимуществом системы стало непрерывно пополняющееся большое количество переносимого программного обеспечения. С другой стороны, ограничение системы старым, зафиксированным уже в конце 70-х годов, диалектом сделало систему отчасти устаревшей и трудно расширяемой. В InterLISP среди прочего отсутствуют иерархические типы данных, объекты и замыкания. К тому же он базируется на динамическом связывании, тогда как новые версии LISP - статические. Однако из InterLISP берет начало новая версия – CommonLISP.

Для программирования на более высоком уровне в InterLISP разработаны такие средства, в которых уже присутствовали объекты. InterLISP – столь замкнутая система, что доступна только ее оттранслированная версия в машинных кодах. В некоторых других системах, таких как, например Зеталисп, поддерживается версия LISP на исходном языке, которая доступна пользователю и может модифицироваться им. Развитие закрытых систем, похожих на InterLISP, связано с ресурсами, имеющимся у создавших их лабораторий.

InterLISP использует свыше 500 функций и большое количество системных имен и флажков, с помощью которых можно настроить и подогнать систему.

InterLISP реализован в системе разделения времени на многих больших ЭВМ.

В Интерлиспе основное внимание было уделено удобству системы для пользователя. Главный принцип разработчиков этого диалекта: все, что может иметь место в системе, должно естественно выражаться в терминах ее входного языка. Поэтому в Интерлисп программисту доступно все. Он может переопределять любые, в том числе и встроенные, функции; задавать и переопределять реакции на ошибки; работать непосредственно с уровня входного языка с внутренними структурами интерпретатора и т. д. При этом система поддерживает свою целостность и работоспособность.

2.4 CommonLISP

Этот диалект отличается наиболее широким представлением различных структур данных и включает около 800 встроенных функций (внешний вид CommonLISP показан в приложении Б). В нем обеспечиваются средства обработки основных классов числовой информации: целых, вещественных и комплексных. Символьные данные (литеры, литеральные атомы, строки) в CommonLISP соответствуют основным возможностям других LISP – систем. Дополнительно имеются средства обработки непечатных литер в символьных именах [7].

Одним из существенных преимуществ диалекта CommonLISP является наличие средств обработки массивов и структур, по своим возможностям не уступающих соответствующим средствам традиционных языков программирования (Фортран, Паскаль). Массивы в CommonLISP могут иметь любое неотрицательное число измерений и индексируются последовательностью целых чисел. Тип компонентов массива может быть произвольным. Выделяется подкласс векторов - одномерных массивов, среди которых отдельно рассматриваются строки и битовые массивы.

Структуры CommonLISP являются типом многокомпонентных записей, определяемых пользователем и имеющих именованные компоненты. Встроенное макроопределение DEFSTRUCT используется для определения структур новых типов. Для создания данных нового типа в виде структуры предусмотрены средства автоматической генерации набора функций, обеспечивающих средства манипулирования объектами этого класса.

Удобным средством контроля доступа к различным переменным и функциям LISP -программ в CommonLISP являются пакеты. Пакет - множество имен объектов, определенных и доступных в нем. Внутри пакета имена объектов подразделяются на внутренние и внешние. Первые предназначены для использования только внутри данного пакета, а вторые - для обеспечения связи с другими пакетами. LISP – интерпретатор представляет широкий спектр средств манипулирования пакетами. Как правило, LISP – система имеет в своем составе четыре стандартных пакета:

  1. Lisp – содержит примитивы системы

  2. User – умалчиваемый пакет прикладных программ и данных пользователя

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

  4. System – зарезервированный пакет для системных целей

Значительной переработке и расширению в CommonLISP подверглись средства ввода-вывода и передачи информации. Для эффективной организации различных обменов с внешней средой введена концепция потоков, позволяющих осуществлять одно- и (или) двухстороннюю передачу информации. Для потоков предусмотрен набор базовых функций. В диалекте различают символьные и двоичные потоки. В первом случае передача осуществляется по байтам, а во втором - целыми числами. Кроме стандартных потоков пользователь имеет возможность создавать и использовать собственные потоки.

В дополнение к указанным типам данных CommonLISP имеет ряд специфических классов объектов: хэш-таблицы, обеспечивающие эффективный способ доступа к данным по ключу; READ-таблицы, обеспечивающие управление обработкой информации поступающей из входного потока Лисп-системы, и некоторые другие. Такое множество имеющихся в диалекте различных типов данных, с одной стороны, развеивает существующее ошибочное представление о языке LISP как о средстве обработки только символьной информации, а с другой - наличие мощных средств манипулирования типами данных существенно усложняет его.

Этот диалект оставлен открытым: принципиальным является то, что осталась возможность в будущем, когда подойдет время и будет достигнуто согласие, добавить новые средства и методы.

CommonLISP не является готовой программной системой в том же смысле, что и Интерлисп, поскольку вопросы среды в основном оставлены открытыми. В стандарте не определено, каким должен быть редактор или другие вспомогательные средства. Сказано лишь в самом общем виде, каким образом они вызываются. Для того чтобы обеспечить быстрое развитие, среда и инструментальные средства еще не затронуты стандартизацией, и поэтому есть возможность создавать различные среды для различных целей. CommonLISP не определяет также и интерфейс пользователя [4, 9].

В CommonLISP на современном этапе не включены даже средства объектного программирования, хотя и определены необходимые для этого базовые механизмы (замыкание и др.). Таким образом, объекты можно реализовать на Лиспе. Но уже ведется работа по стандартизации средств и форм объектного программирования.

В CommonLISP много внимания уделено практическим требованиям, и, вероятно, поэтому не все его черты эстетичны и чисты. Несомненно, что и другие LISP -системы будут использоваться в дальнейшем, и их также необходимо развивать.

CommonLISP предназначен не только для работы со списками или символьной обработки. Он является универсальным языком программирования, включающим в себя особенно хорошие средства для численных вычислений, управления данными и связи. На CommonLISP можно с одинаковым успехом писать программы в традиционных операторном, процедурном, фразовом стиле, а также и в свойственных LISP стилях. В языке содержатся предпосылки для использования различных способов и стилей программирования, таких как операторное, функциональное, макропрограммирование, программирование, управляемое данными, и продукционное программирование, а также средства, необходимые для логического и объектного программирования и реализации других средств более высокого уровня.

Можно смело сказать, что CommonLISP содержит почти все, что на сегодняшний день могут дать другие известные языки программирования, и, кроме того, он предусматривает средства для расширения языка.


3 Особенности языка Лисп



От других языков программирования Лисп отличается следующими свойствами:

1.   одинаковая форма данных и программ;

2.   хранение данных, не зависящее от места;

3.   автоматическое и динамическое управление памятью;

4.   функциональная направленность;

5.   Лисп является бестиповым языком;

6.   интерпретирующий и компилирующий режимы работы;

7.   пошаговое программирование;

8.   единый системный и прикладной язык программирования.

Рассмотрим эти свойства более подробно.

В Лиспе формы представления программы и обрабатываемых ею данных одинаковы. И то и другое представляется списочной структурой, имеющей одинаковую форму. Таким образом, программы могут обрабатывать и преобразовывать другие программы и даже самих себя. В процессе трансляции можно введенное и сформированное в результате вычислений выражение данных проинтерпретировать в качестве программы и непосредственно выполнить. Это свойство обладает не только теоретическим, но и большим практическим значением [4, 2].

Универсальный единообразный и простой синтаксис списка языка лисп не зависит от применения, и с его помощью легко определять новые формы записи, представления и абстракции. Даже сама структура языка является, таким образом, расширяемой и может быть заново определена. В то же время достаточно просто написание интерпретаторов, компиляторов, редакторов и других средств. К Лиспу необходимо подходить как к языку, с помощью которого реализуются специализированные языки, ориентированные на приложение, и создается окружение более высокого уровня. Присущая Лиспу расширяемость не встречается в традиционных замкнутых языках программирования.

 Списки, представляющие программы и данные, состоят из списочных ячеек, расположение и порядок которых в памяти не существенны. Структура списка определяется логически на основе имен символов и указателей. Добавление новых элементов в список или удаление из списка может производиться без переноса списка в другие ячейки памяти. Резервирование и освобождение могут в зависимости от потребности осуществляться динамически, ячейка за ячейкой.

При автоматическом и динамическом управлении памятью, который применен в Лиспе, пользователь не должен заботиться об учете памяти. Система резервирует и освобождает память автоматически в соответствии с потребностью. Когда память кончается, запускается специальный мусорщик. Мусорщик перебирает все ячейки и собирает являющиеся мусором ячейки в список свободной памяти для того, чтобы их можно было использовать заново. Среда Лиспа постоянно содержится в порядке. В современных ЛИСП-системах выполнение операции сборки мусора занимает от одной до нескольких секунд [1, 7]. В задачах большого объема сборщик мусора запускается весьма часто, что резко ухудшает временные характеристики прикладных программ. Во многих системах мусор не образуется, поскольку он сразу же учитывается. Управление памятью просто и не зависит от физического расположения, поскольку свободная память логически состоит из цепочки списочных ячеек.

В первую очередь данные обрабатываются в оперативной и виртуальной памяти, которая может быть довольно большой. Файлы используются в основном для хранения программ и данных в промежутках между сеансами.

Функциональное программирование, используемое в Лиспе, основывается на том, что в результате каждого действия возникает значение. Значения становятся элементами следующих действий, и конечный результат всей задачи выдается пользователю. Обойти это можно только при помощи специальной функции QUOTE. То обстоятельство, что результатом вычислений могут быть новые функции, является важным преимуществом Лиспа.

 

В Лиспе имена символов, переменных, списков, функций и других объектов не закреплены предварительно за какими-нибудь типами данных. Типы, в общем, не связаны с именами объектов данных, а сопровождают сами объекты. Переменные в различные моменты времени могут представлять различные объекты. В этом смысле Лисп является бестиповым языком. Динамическая, осуществляемая лишь в процессе исполнения, проверка типа и позднее связывание допускают разностороннее использование символов и гибкую модификацию программ. Функции можно определять практически независимо от типов данных, к которым они применяются. Но указанная бестиповость не означает, что в Лиспе нет данных различных типов. Наоборот набор типов данных наиболее развитых Лисп-систем очень разнообразен.

Одним из общих принципов развития Лисп-систем было свободное включение в язык новых возможностей и структур, если считалось, что они найдут более широкое применение. Это было возможно в связи с естественной расширяемостью языка. Платой за динамические типы являются действия по проверке типа на этапе исполнения. В более новых Лисп-системах возможно факультативное определение типов. В этом случае транслятор может использовать эту информацию для оптимизации кода. В Лисп-машинах проверка осуществляется на уровне аппаратуры.

Лисп в первую очередь интерпретируемый язык. Программы не нужно транслировать, и их можно исправлять в процессе исполнения. Если какой-то участок программы отлажен и не требует изменений то его можно оттранслировать, тогда она выполняется быстрее. В одной и той же программе могут быть транслированные и интерпретированные функции. Транслирование по частям экономит усилия программиста и время вычислительной машины. Однако компилирующий режим предусмотрен далеко не во всех Лисп-системах, его использование накладывает ряд дополнительных ограничений на технику программирования [3, 10].

 Программирование и тестирование программы осуществляется функция за функцией, которые последовательно определяются и тестируются. Написание, тестирование и исправление программы осуществляются внутри Лисп-системы без промежуточного использования ОС.

Вспомогательные средства, такие например как, редактор, трассировщик, транслятор и другие образуют общую интегрированную среду, язык которой нельзя отличить от системных средств. Отдельные средства по своему принципу являются прозрачными, чтобы их могли использовать другие средства. Работа может производиться часто на различных уровнях или в различных рабочих окнах. Такой способ работы особенно хорошо подходит для исследовательского программирования и быстрого построения прототипов.

Лисп является одновременно как языком прикладного так и системного программирования. Он напоминает машинный язык тем, что как данные, так и программы представлены в одинаковой форме. Язык превосходно подходит для написания интерпретаторов и трансляторов как для него самого, так и для других языков. Наиболее короткий интерпретатор Пролога, написанный на Лиспе занимает несколько десятков строк [5, 6].

Традиционно Лисп-системы в основной своей части написаны на Лиспе. Лисп можно в хорошем смысле считать языком машинного и системного программирования высокого уровня. И это особенно хорошо для Лисп-машин, которые вплоть до уровня аппаратуры спроектированы для Лиспа и системное программное обеспечение которых написано на Лиспе.

 

Заключение



В курсовой работе были рассмотрены основные функции и особенности языка программирования LISP и отличительные особенности его диалектов.

Современные диалекты языка LISP можно рассматривать как мощные интерактивные системы программирования. Это объясняется двумя причинами. Во-первых, сам язык LISP претерпевает серьезные изменения – развиваются средства языка, предназначенные для обработки нетрадиционных для LISP типов данных: массивов, векторов, матриц; появляются некоторые средства управления памятью (пакеты), отсутствующие в LISP. Серьезные изменения претерпевают и управляющие структуры. Появились несвойственные природе языка LISP функции, заимствованные из Фортрана, Алгола, Паскаля, Си: Do, Loop, Goto , Case и прочие, позволяющие пользователю, незнакомому с принципами функциональных языков, легко переходить на LISP. Качество программ снижается, зато возрастает популярность языка. Во-вторых, если на первом этапе развития LISP -системам была присуща небольшая скорость обработки данных и серьезные ограничения на емкость используемой оперативной памяти, то современные Лисп-системы уже могут соперничать по этим параметрам с такими языками, как Си, Паскаль и др. Использование LISP – машин вообще практически снимает ограничения памяти и быстродействия.

Для ПЭВМ ограничения по памяти и быстродействию все еще остаются существенными. Однако положение не безнадежно. Развитие LISP – систем для ПЭВМ идет сегодня по трем различным направлениям. Первое связано с увеличением емкости памяти, которая может использоваться LISP – системой. С этой целью ряд компаний разработал версии языка Golden Common Lisp, использующие расширения оперативной памяти и виртуальную память. Второе направление связанно с повышением быстродействия LISP – систем. Третье направление состоит в разработке эффективных компиляторов программ с языка LISP в традиционные языки (чаще всего в язык Си).

Положительным нововведением в современные диалекты языка можно считать псевдоассемблерные команды, которые позволяют оперировать основными регистрами машины и организовывать прерывания на уровне DOS и BIOS. Кроме того, многие LISP – системы имеют хорошие интерфейсы с другими языками (Фортран, Паскаль, Ассемблер, Си), что позволяет повысить эффективность прикладных LISP – программ.

Если же говорить о глобальной тенденции развития самой идеологии языка LISP, то очевидно, что она связана с созданием объектно – ориентированных версий языка как наиболее пригодных для реализации систем ИИ.

Анализ существующих языков обработки символьной информации, использование их для реализации интеллектуальных систем, а также сравнение тенденций развития этих языков позволяют сделать несколько замечаний.

Можно предположить, что LISP еще значительное время будет оставаться основным языком для реализации интеллектуальных систем. Уже в ближайшее время можно ожидать появления языков, вобравших в себя лучшие черты LISP и др. языков программирования ИИ.

Наблюдается явная тенденция к созданию параллельных версий языков для программирования задач ИИ. Языки типа Лисп, Пролог, Рефал (а также всевозможные модификации и «смеси» этих и/или других языков символьной обработки) будут все больше уступать свои позиции на уровне инженеров по знаниям специальным языкам представления знаний, оставаясь инструментарием системных программистов.

Глоссарий


№ п/п

Понятие

Определение

1

Атомы

простейшие неделимые элементы, из которых состоят программы на языке Лисп

2

Искусственный интеллект

раздел информатики, ставящий своей целью разработку методов решения задач, для которых отсутствуют формальные алгоритмы: понимание естественного языка, обучение, доказательство теорем, распознавание образов


3

Компилятор

программа ЭВМ, предназначенная для автоматического перевода описания алгоритма с одного языка программирования на другой, в частности на машинный язык

4

Логическое программирование

один из подходов к программированию, при котором в качестве языка высокого уровня используется логика предикатов первого порядка

5

Параллельная рекурсия

рекурсия, которая встречается одновременно в нескольких аргументах функции

6

Простая рекурсия

рекурсия, при которой вызов функции встречается в некоторой ветви лишь один раз

7

Предикат

функция, которая определяет, обладает ли аргумент определенным свойством

8

Список

упорядоченная последовательность, элементами которой являются либо атомы, либо списки

9

Символ

имя, состоящее из букв, цифр или специальных знаков, которое обозначает какой либо предмет или действие, а так же число, функцию (программу) и другие объекты

10

Строка

любая последовательность символов, которые могут быть напечатаны (кроме двойных кавычек), заключенная в двойные кавычки

11

Рекурсия

способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения обращается сама к себе

Список использованных источников





1

«Программирование на языке ЛИСП в системе muLISP-90». Байдун В.В., Кружилов С.И., Сергиевский А.Е, Чернов П.Л. - М.: Моск. энеpг. ин-т, 1993. – 40 С. [Текст]

2

«Функциональное программирование». Хендерсон П.: Пер. с англ.-М.: Мир, 2003. – 637 С. [Текст]

3

«Мир Лиспа». Хювёнен Э., Сеппянен Й. В 2-х т. / Пер. с финск.. — М.: Мир, 2000. — ISBN 5-03-001935-9 [Текст]

4

Русскоязычное сообщество лисперов [Электронный ресурс]. Режим доступа: http://lisp.ru/

5

Начальные сведения о языках Лисп-семейства на русском [Электронный ресурс]. Режим доступа: lisp.narod.ru

6

Русский перевод книги Practical Common Lisp(англ.) [Электронный ресурс]. Режим доступа: pcl.catap.ru/doku.php

7

«Язык программирования XLISP». Тужилов И. В. Учеб. пособие. - Пенза: Изд-во Пенз. гос. техн. ун-та, 2004. – 126 С.[Текст]

8

Личный сайт Дж. Маккарти с текстами его публикаций [Электронный ресурс]. Режим доступа: http://www-formal.stanford.edu/jmc/

9

«Введение в программирование на языке Лисп» Городняя Л.В.: Учебное пособие для начинающих. - Новосибирск: НГУ, 2005. - 93 с.

10

Энциклопедия языков программирования. [Электронный ресурс]. Режим доступа: http://progopedia.ru/language/lisp/

Приложения


А



Б






Основные данные о работе
Учебный материал
© nashaucheba.ru
При копировании укажите ссылку.
обратиться к администрации