Рассмотрены современные способы автоматизации камеральных изыскательских работ на примере адаптации САПР AutoCADс помощью функционального языка программирования Clojure.
Ключевые слова:камеральные изыскательские работы, AutoCAD, AutoLISP, Clojure
Автоматизированное проектирование сопровождается большим объемом информации и расчетов. Современные автоматизированные программы не только значительно облегчают обработку информации и проведение расчетов, но и позволяют увеличить производительность труда проектировщиков, увеличить точность проводимых расчетов.
Автоматизация камеральных изыскательских работ в разных организациях происходит по разному: различаются программные продукты, степень автоматизации расчетов, построений, оформления отчетов, методики проведения работ. Некоторые организации используют стандартные функции и команды в прикладных программ и САПР. Другие же напротив, устанавливают дополнения, разработанные сторонними организациями или собственными специалистами внутри предприятия, что позволяет повысить скорость и качество выполнения изысканий. Для разработки дополнений используются различные языки программирования: C++, Lisp, Python, Visual Basic, JavaScript,.Net, DIESEL.
К наработкам, которые могут стать источником дополнения AutoCAD до новой специализированной системы с чертежно-графической основой, относятся [1, с. 51]:
1. Шаблоны чертежей (например, форматы со своими штампами);
2. DWG-файлы с графическими элементами схем, планов;
3. Файлы с пользовательскими штриховками, формами, шрифтами, типами линий;
4. Файлы сценариев:
5. Файлы справочной системы;
6. Меню с названиями пунктов, адаптированными для работы специалистов конкретных направлений;
7. Программы, написанные на языках AutoLISP, Visual Basic, C++, DIESEL и исполняемые в среде AutoCAD.
8. Программы, написанные на любых языках и оформленные как внешние приложения, которые не требуют среды AutoCAD, но исполняются параллельно с сеансом AutoCAD (например, готовят файлы с какими-то данными).
Адаптации или замене могут быть подвергнуты некоторые файлы поддержки программного обеспечения системы AutoCAD (acad.lin, acdiso.lin, acaddoc.lsp, acad.pgp и другие) [1, с. 499].
Отдельно можно выделить способ адаптации и расширения среды AutoCAD с помошью Visual LISP. Иногда под названием Visual LISP подразумевают язык AutoLISP, дополненный расширениями ActiveX, но их нужно различать: Visual LISP является средой разработки, а не языком программирования. Язык программирования AutoLISP — это вариант языка LISP, в который добавлены функции доступа к объектам, таблицам и словарям системы AutoCAD.
Основой языка LISP является работа со списками, которые могут иметь произвольную длину и включать элементы разной природы (числа, текстовые строки, указатели файлов и т. д.). В то же время в языке доступны обычные арифметические и логические операции, работа с файлами и другие, свойственные развитым языкам программирования, возможности. Программы или выражения, написанные на языке AutoLISP, можно водить в командную строку, система AutoCAD вычисляет автоматически. Это возможно потому, что для разбора выражений и чтения программного кода прямо из консоли в систему AutoCAD встроен интерпретатор AutoLISP. Расширения ActiveX значительно увеличивают функциональность AutoLISP, добавляют возможности работы с файлами, реестром, а также связи с другими приложениями. Дополнительные расширения работают напрямую с объектной моделью AutoCAD посредством функций ActiveX. Впервые технология ActiveX была внедрена в AutoCAD R14 [1, с. 53–54].
Clojure (произносится как closure) — современный диалект Лиспа, язык программирования общего назначения с поддержкой разработки в интерактивном режиме, поощряющий функциональное программирование и упрощающий поддержку многопоточности. Clojure работает на платформах JVM и CLR. [2]
Clojure является функциональным языком программирования с поддержкой функций в качестве объектов первого класса (first class objects) и неизменяемыми (за исключением специальных случаев) данными, включая поддержку «ленивых» коллекций данных. За счет того, что Clojure был спроектирован для работы на базе JVM, обеспечивается доступ к большому набору библиотек, существующих для данной платформы. Взаимодействие с Java реализуется в обе стороны — как вызов кода, написанного на Java, так и реализация классов, которые доступны как для вызова из Java, так и из других языков, существующих для JVM, например, Scala.
Clojure «унаследовал» от Lisp макросы, мультиметоды и интерактивный стиль разработки, а JVM дает переносимость и доступ к большому набору библиотек, созданных для этой платформы. [2]
Неизменность структур данных позволяет использовать их в разных потоках выполнения программы, что упрощает многопоточное программирование.
Несмотря на схожесть синтаксиса, Clojure отличается Common Lisp. Некоторые отличия обусловлены тем, что язык разработан для платформы JVM, что накладывает некоторые ограничения на реализацию. Также важными определяющими факторами JVM-платформы являются [3]:
- boxed integers — нет поддержки полного набора типов чисел (numeric tower), которые есть в Scheme и Common Lisp;
- система исключений как в Java (в Common Lisp используется сигнальный протокол);
- используется соглашение о вызовах как в Java.
Из явных отличий от Common Lisp можно отметить следующие [4]:
- идентификаторы в Clojure регистрозависимы (case-sensitive);
- большая часть данных — неизменяемая;
- пользователь не может изменять синтаксис языка путем ввода собственных макросов в процедуре чтения кода (read macros);
- введен специальный синтаксис для литералов, векторов, отображений (maps), регулярных выражений, анонимных функций и т. д.;
- существует возможность связывания метаданных с переменными и функциями;
- можно реализовать функции с одним именем и разным набором аргументов;
- многие привычные вещи, такие как let, по синтаксису отличаются от их аналогов в Common Lisp и Scheme (при этом используется меньше скобок), например, let связывает данные последовательно, аналогично let* в Scheme;
- вместо функций car и cdr используются функции first и rest;
- nil не равен пустому списку или другому набору данных (коллекции) — он всего лишь означает отсутствующее значение (аналог null в Java);
- используется общее пространство имен, как в Scheme;
- сравнение на равенство производится одной функцией в отличие от Common Lisp и Scheme;
- поддержка «ленивых» коллекций.
Платформа Java обладает целым рядом неоспоримых преимуществ. Основными ее достоинствами являются высокая производительность JVM и богатейший набор функций, поставляемых как в основных API, так и в виде библиотек, созданных независимыми разработчиками на Java. Таким образом, Java предоставляет вам возможность использовать готовые функции: вызвать Java-методы, создавать Java-объекты, использовать Java-интерфейсы и расширения Java-классов.
Clojure реализует двухстороннее взаимодействие с библиотеками, работающими на базе JVM — код на Clojure может использовать существующие библиотеки и вызываться из других библиотек, реализовывать классы и т. п. Отдельно стоит отметить поддержку работы с массивами объектов Java — поскольку они не являются коллекциями, то Clojure имеет отдельные операции для работы с массивами: создание, работа с индивидуальными элементами, конвертация из коллекций в массивы и т. д.
Код, написанный на Clojure, может без особых проблем использовать библиотеки, написанные для JVM. По умолчанию в текущее пространство имен импортируются классы из пакета java.lang, что дает доступ к основным типам данных и их методам. А остальные пакеты и классы должны импортироваться явно.
Эффективное использование языка невозможно без наличия инфраструктуры для работы с ним — редакторов кода, средств сборки, библиотек и т. п. вещей. Для Clojure имеется достаточное количество таких средств — как адаптированных утилит (Maven, Eclipse, Netbeans и т. п.), так и разработанных специально для этого языка — например, системы сборки кода Leiningen. Отладку приложений, написанных на Clojure, поддерживают почти все среды разработки, перечисленные ниже, а для профилирования можно использовать существующие средства для Java. [3]
Число библиотек для Clojure постоянно увеличивается. Некоторые из них — лишь обертки для библиотек написанных на Java, а некоторые — специально разработанные для Clojure. Вместе с Clojure часто используют набор библиотек clojure-contrib, который содержит различные полезные библиотеки, не вошедшие в состав стандартной библиотеки языка: функции для работы со строками и потоками ввода/вывода, дополнительные функции для работы с коллекциями, монады и т. д. Среди других библиотек можно отметить Compojure — для создания веб-сервисов; ClojureQL — для работы с базами данных; Incanter — для статистической обработки данных; crane, cascading-clojure и clojure-hadoop — для распределенной обработки данных. Это лишь малая часть существующих библиотек, многие из которых перечислены на сайте языка.
В настоящее время для работы с Clojure разработано достаточно много средств — поддержка Clojure имеется в следующих редакторах и IDE: Emacs, Vim, Eclipse, Netbeans, IntelliJ IDEA.
Для пользователей, использующих Windows, можно воспользоваться Clojure Box — пакетом, в котором поставляется уже настроенный Emacs, SLIME, Clojure и библиотека clojure-contrib. Использование этого пакета позволяет упростить процесс освоения языка.
Разработан ClojureCLR, который позволяет безболезненно внедрять его в общеязыковую инфраструктуру компании Microsoft, в том числе и в AutoCAD. Программа для.NET Framework, написанная на любом поддерживаемом языке программирования, сначала переводится компилятором в единый для.NET промежуточный байт-код Common Intermediate Language (CIL), затем исполняется виртуальной машиной Common Language Runtime (CLR), либо транслируется специальной утилитой. Использование виртуальной машины предпочтительно, так как избавляет разработчиков от необходимости заботиться об особенностях аппаратной части. [4]
Современная технология динамической компиляции позволяет достигнуть высокого уровня быстродействия. Виртуальная машина CLR также сама заботится о базовой безопасности, управлении памятью и системе исключений, избавляя разработчика от части работы.
Использование Clojure для адаптации AutoCAD позволяет упростить написание программного кода, улучшить его качество и читаемость, позволяет использовать новейшие способы разработки программного обеспечения и использовать Java-библиотеки для создания интерфейса расширений AutoCAD.
Литература:
1. Полещук Н. Н. Visual LISP и секреты адаптации AutoCAD. — СПб.: БХВ-Петербург, 2001.-576 с: ил.
2. [Электронный ресурс]: Clojure. Материал из Википедии — свободной энциклопедии — Режим доступа: http://ru.wikipedia.org/wiki/Clojure
3. [Электронный ресурс]: Практика функционального программирования — Режим доступа: http://fprog.ru/2010/issue4/alex-ott-clojure/
4. [Электронный ресурс]: Clojure. Официальный сайт проекта — свободной энциклопедии — Режим доступа: http://clojure.org/