Ода Лиспу. Наши разработки. Software. ГП ДПИ.

Вы здесь:   >ГП ДПИ   >Software   >Наши разработки   >Ода Лиспу.

Сразу, для ясности, скажу - я ярый поклонник Лиспа. В пору студенческой юности меня очень интересовали системы Искуственного Интеллекта (ИИ), и узнав, что подавляющее большинство из этих систем реализовано на ЛИСП-е я живо заинтересовался этим языком. Надо сказать, что к тому времени я уже вполне сносно владел ФОРТРАН-4, АЛГОЛ-66, ПЛ-1, ПАСКАЛем, изучал АДУ, совершенно не мог понять сути КОБОЛа, с белой завистью читал об АНАЛИТИК, знал Си, но считал его крайне уродливым и не профессиональным (этого мнения я не изменил и по сей день). В то время образцом процедурного языка и стиля программирования для меня безусловно являлся ПАСКАЛь - удобный, с полным набором управляющих структур, с проверкой типов переменных, позволяющих выявить большую часть ошибок еще на этапе компиляции, с продуманной системой типов - казалось, что лучшего просто желать невозможно. Все это я пишу только для того, чтобы Вы поняли, что ЛИСП - не единственный известный мне язык программирования и что мне есть с чем сравнивать! Перечисленный выше список языков далеко не полон, хотя конечно не на всех я писал более-менее крупные программы. Среди них были и такие знакомство с которыми начиналось и заканчивалось с форул Бэкуса-Науэра (существует такой весьма компактный способ описания синтаксиса языка).

Когда я впервые увидел описание ЛИСПа в форме Бэкуса-Науэра я просто не поверил своим глазам - как может такой примитивный язык (менее 10 строк!!!) использоваться в разработках ИИ? Мне казалось это просто не возможным! В этом языке не было (и нет по сей день) ничего кроме атомов и списков (функции - лишь частный случай списка), небыло управляющих структур - небыло вообще ничего того, что должно было быть в ЛЮБОМ ЯЗЫКЕ ПРОГРАММИРОВАНИЯ. Это был настоящий ШОК!!! Однако разобравшись мало-помалу с функциями я начал понимать, что в этом что-то действительно есть.

Одной из первых занятных вещей мне показалось то, что по синтаксису совершенно невозможно отличить системные функции от функций определенных программистом! Практически бесконечные возможности расширения языка - это уже что-то!! Если кое-кто вспомнил сейчас о библиотеках для других языков - то пусть попытается определить на любом из этих языков новый вариант цикла While, Loop или какого-нибудь еще, да еще таким образом, чтобы это вписалось в существующий синтаксис языка. Знаю найдутся любители Си, которые скажут, что нечто подобное можно сделать с помощью препроцессора - но на мой взгляд это просто ужастно!

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

Вникнув глубже в функциональный подход к программированию я смог по достоинству оценить такие функции как eval, apply, mapcar. Безусловно, передача функции в качестве аргумента не является прерогативой исключительно ЛИСПа, но где вы видели такое изящное исполнение как apply и mapcar в ЛИСПе, об eval - и говорить не приходится.

Следующий момент в изучении ЛИСПа был для меня ключевым. К этому времени у меня имелось довольно большое кол-во разрозненных задач реализованных на ФОРТРАНЕ связанных общей темой. Тот кто хоть раз шел по пути автоматизации меких задач из единой области неверняка знаком с одной проблемой - для решения не очень сложных задач часто приходится вводить довольно большое кол-во исходных данных. Этот факт еще можно было бы принять, если бы выходные данные из одной задачи не были бы часть входных для другой! Такое положение дел казалось совершенно удручаюим. И я искал выход - сперва мне казалось, что каналы (в стиле Unix) могут оказаться приемлемым решением - но как объединить данные из двух программ? Затем были файлы с позиционным расположением значение - но как быть если менялся формат значения или их кол-во - требовалось вносить слишком много изменений. В конце-концов я пришел к схеме записи ключ-значение. Эта схема была достаточно гибкой для дальнейшего расширения набора данных и включения новых задач. Представте себе мою радость когда я познакомился с ассоциативными списками - это было почти тоже, к чему я пришел самостоятельно! Но как поразительно просто была организована работа с а-списками в ЛИСПе. Всего две-три базовые функции и практически бесграничные возможности!

И наконец то, что можно назвать пошаговым программированием - ЛИСП позволяет строить программу по кусочкам, проверяя и отлаживая ее шаг за шагом. Интерпретация позволяет гораздо более просто осуществлять этот процесс. Если это не кажется Вам столь очевидным- вспомните какой язык наиболее распространен - БЕЙСИК!!!, несмотря на все его отрицательные стороны, простота его применения, во многом определяемая интерпретатором, выходит на первое место.

Это безусловно не полный перечень сильных сторон ЛИСПа, но и этого вполне достаточно чтобы полюбить его навсегда. Поэтому несложно представить мои чувства, когда я впервые знакомился с АвтоКАД в.10 - один факт наличия встроенного интерпретатора АвтоЛИСП - решил практически все! Но это уже другая история.