ТОП 10:

Функциональный образ мышления



Используемое в Лиспе так называемое функциональное программирование (functional programming) основывается на той простой идее, что в результате каждого действия возникает значение. Значения становятся аргументами следующих действий, и конечный результат всей задачи выдается пользователю

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

 

 

Интерпретирующий или компилирующий режимы выполнения

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

 

 

Лисп – бестиповый язык программирования

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

Например, в Фортране имена переменных, начинающиеся с букв I, J и K, закреплены за целыми числами уже с момента определения языка в 50-х годах. В Паскале тип переменной закрепляется на этапе написания программы. В некоторых языках тип переменной определяется на этапе трансляции. В Лиспе тип определяется по ходу выполнения программы.

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

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

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

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

 

 

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

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

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

 

 

Интегрированная среда программирования

Лисп-системы и среды программирования развиваются, уже начиная с конца 50-х годов. С самого начала разработки в них был заложен принцип возможности использования отдельных средств непосредственно из интерпретатора.

В реализациях для микроЭВМ количество системных и встроенных функций обычно ограничивается порядком десяти, сотни. В больших системах разделения времени, таких как Маклисп (MacLisp) и Интерлисп (InterLisp), функций многие сотни. Коммон Лисп и автоматизированные рабочие места (рабочие станции) для исследователей ИИ и Лисп-машины предлагают особенно широкий выбор различных вспомогательных средств и функций интегрированной среды, которая кроме всего прочего, открыта для модификаций пользователя.

Системное программное обеспечение Лисп-машин содержит более 10 000 функций и десятки мегабайтов кода. Во многих системах исходные тексты лисповского кода предоставляются пользователю. Системные функции можно переопределить или модифицировать, и пользователь может свободно расширить и подогнать систему для себя.

 

 

Широко распространенные заблуждения и предрассудки

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

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

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

С точки зрения программирования критике подвергается и внешний облик языка: изобилие скобок и кажущийся беспорядок. Лисп представляется как труднопонимаемый и трудноизучаемый язык.

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

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

 

 

Простой и эффективный язык

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

Хорошим доказательством простоты использования Лиспа является его широкое применение в исследовательских работах по программированию сложных методов обработки знаний. Большая часть значимых программ ИИ запрограммирована на Лиспе или на основанном на нем языке более высокого уровня. По результатам некоторых исследований можно, скажем, в среде программирования Лисп-машины достичь повышения производительности программирования в несколько десятков раз по сравнению, например, с программированием на Коболе.

 

СИМВОЛЫ И СПИСКИ







Последнее изменение этой страницы: 2016-09-05; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.235.29.190 (0.005 с.)