Сравнительная характеристика языков

 

Java - вероятно, один из наиболее популярных языков используемых в последнее время для программирования агентов. Java представляет из себя язык программирования, подобный C++ по синтаксису, но более схожий со Smalltalk и Objective C по идеологии. Система программирования на Java включает в себя виртуальную машину Java и транслятор с Java в bytecode.

Язык Java предусматривает создание приложений, переносимых на различные платформы. Программа, написанная на Java, компилируется в специальный машинно-независимый байт-код. Затем этот код может быть исполнен с помощью интерпретатора Java на любом компьютере, где реализована Java Virtual Machine. Тем самым обеспечивается платформо-независимость Java - приложений на уровне байт-кода, который может приходить откуда угодно, включая Web-страницу, в которой содержится ссылка на него. Java Virtual Machine работает в среде вытесняющей мультизадачности и поддерживает облегченные процессы (threads). Средства создания и синхронизации таких процессов включены в Java на уровне языковых конструкций и классов. Средства многозадачности также призваны обеспечить реакцию системы в реальном времени для мультимедийных приложений, критичных ко времени.

Java представляет собой истинно объектно-ориентированный язык программирования с сильной типизацией. Схожесть с C++ делает его простым для изучения программистами. В нем отсутствует предельно ясное распределение памяти и для повышения надежности программ из языка исключена арифметика указателей. Каждый тип данных понимается как класс объектов, любая функция является методом класса. Ее вызов рассматривается с объектно-ориентированных позиций как посылка сообщения объекту. Имеется встроенная расширяемая библиотека классов, включающая Abstract Window Toolkit (AWT) для создания пользовательских интерфейсов, классы поддержки основных типов данных, threads, сетевых возможностей, графики, мультимедиа, и т. д. К средствам повышения надежности следует отнести встроенную в язык обработку исключительных ситуаций (exceptions) и run-time контроль за выполнением программы, такой, как проверка выхода за границы массивов и т.д.

Язык Java может быть использован для создания двух типов программного обеспечения: автономных приложений, которые могут включать «родной» (т.е. машинно-зависимый) код и апплетов - платформо-независимых приложений, которые могут приходить из сети и запускаться с помощью поддерживающих Java Web - броузеров. Апплеты могут встраиваться в Web страницы после специальной метки языка HTML, указывающей ссылку на их код, и запускаться автоматически, когда страница открывается в броузере.

Язык Java был спроектирован с учетом возможности создания приложений работающих в распределенной среде. Кроме поддержки возможностей TCP/IP, таких как чтение URLs, работу с сокетами и обмен сообщениями на уровне датаграмм, в Java предусмотрен механизм удаленного вызова объектов, определенный в спецификации RMI (Remote Method Invocation). Этот механизм позволяет вызывать методы удаленных объектов, объявленные в специальном интерфейсе, причем синтаксически такой вызов выглядит идентично вызову простого метода. Эта схема предоставляет более гибкие возможности по сравнению с традиционным протоколом RPC (Remote Procedure Call). Механизм сериализации (Serialization) позволяет сохранять объекты и графы объектов в потоках данных (файлах, сетевых каналах) и восстанавливать их при необходимости. При этом обеспечивается достаточный уровень секретности передаваемой информации. С выходом спецификации Java IDL и нового продукта Black Widow компании PostModern Computing Technologies открылась возможность к сближению Java приложений и коммуникационного стандарта CORBA 2.0 консорциума OMG (Object Management Group). Специальный компилятор позволяет, исходя из описаний интерфейсов на языке IDL CORBA, генерировать код Java объектов. Это позволит использовать вызовы объектов, находящихся в корпоративных сетях, из Java приложений и сделать Java - объекты доступными для этих вызовов.

На сегодняшний день Java доступна на следующих платформах: Windows 95/NT, Solaris (Intel, SPARC), Macintosh System 7.5.

 

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

Приложение, рассчитанное на неподготовленного пользователя (End User Application);

Систему, основанную на знаниях (Knowledge Based System);

Хранилище специальных знаний (Knowledge Base Repository) - хранилище знаний о содержимом базы знаний - используется для отслеживания истории доступа, целостности и других аспектов функционирования баз знаний;

Система управления базами данных (Database System);

Активные сенсоры (Active Sensors)- отвечают за обмен данными (знаниями) с “внешним миром”

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

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

Связность (Connectivity) - фокусируется на способе связывания агентов между собой;

Архитектура (Architecture)- акцентирует внимание на способе построения будущей системы (будет ли система статической, когда все компоненты известны уже на этапе проектирования/реализации или динамической);

Коммуникации (Communication)- данное направление рассматривает синхронность/асинхронность обмена сообщениями между агентами.

При разработке языка были сделаны специальные предположения об основных моментах его использования для описания коммуникаций многоагентных систем:

Архитектура. Агенты - это отдельные процессы, работающие в одном адресном пространстве или на различных машинах, соединенные посредством Internet.

Коммуникации. Язык поддерживает следующие стратегии передачи информации: point to point, multicast, broadcast.

Синтаксис. Сообщения между уровнями содержимого, сообщений и коммуникаций представлены в виде s-выражений языка Lisp. Между процессами выражения передаются как потоки ASCII -символов.

Протокол. Для транспортной поддержки KQML был создан специальный протокол - SKTP (Simple Knowledge Transfer Protocol).

Рассмотрим уровни языка KQML. Язык KQML состоит из трех уровней: содержимого, сообщений и коммуникаций. KQML-выражение можно рассматривать как выражение-содержимое, помещенное в сообщение-обертку, которое, в свою очередь, помещено в коммуникационную обертку. На уровне содержимого находится представление знаний на некотором языке. Уровень сообщений добавляет дополнительные атрибуты, такие как описание языка, на котором выражено содержимое, его онтологию и тип используемого метода переговоров. Коммуникационный уровень добавляет информацию об отправителе и получателе сообщения, а также указывает, является сообщение синхронным или асинхронным.

Основу синтаксиса языка KQML составляют имена примитивных действий- сообщений, которые в английской транскрипции называются “performatives” Тип сообщений определяет, что можно сделать с предложениями, содержащимися в сообщении, с этим связано само название KQML-сообщений на английском языке.

Все действия-сообщения можно разделить на следующие категории:

-языка содержимого KQML, который предполагает модель баз в форме множества предложений некоторого языка, который может быть объектным;

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

-определения, которые имеют целью активизировать и отменять определения;

-ответы на вопросы, которые позволяют задавать вопросы относительно истинности предложений;

-отклики, которые определяют набор сообщений для получения ответов на заданные вопросы.

 

SKTP - Simple Knowledge Transfer Protocol.Первые две реализации SKTP были написаны на языках Common Lisp и Пролог соответственно. В настоящее время разрабатываются интерфейсы на других языках. SKTP - это реализация стека протокола KQML. Как и KQML, SKTP состоит из нескольких уровней: содержимого, сообщений и коммуникации. Коммуникации между приложениями происходят на языке приложений, поддержку данного процесса обеспечивает уровень содержимого (content layer). Выражения, помеченные для передачи, “обертываются” в сообщения - это т.н. уровень сообщений (message layer) , реализуемый с помощью интерфейса библиотеки посредника (Facilitator Interface Library - FIL). Уровень, отвечающий за стратегию передачи сообщений (multicast, broadcast и т.д.) называется коммуникационным и реализован в виде отдельного агента, называемого посредником (facilitator). На самом нижнем уровне, реально несущем структурированные данные между посредниками, находится протокол TCP/IP.

 

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

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

Перечислим основные свойства языка KIF.

1. Язык является декларативным, чем отличается от языков типа Prolog и Emycin.

2. Язык является логически полным.

3. Язык является транслируемым (translatability) - он предполагает значения для трансляции декларативных баз знаний в/из типичных языков представления знаний.

4. Язык является хорошо читаемым, что упрощает его использование разработчиком баз знаний.

5. Язык может быть использован как язык представления знаний.

Существуют две разновидности языка KIF: линейный и структурированный. В линейном варианте все его выражения - это строки ASCII-символов, что удобно для хранения на устройствах с последовательным доступом. В структурированном варианте языка правильные выражения - это структурированные объекты. Структурированный язык удобен для использования при коммуникациях программ, работающих в одном адресном пространстве. Между линейным и структурированным представлениями одной и той же сущности существует взаимно-однозначное соответствие.

Соответствие между линейным и структурированным представлениями определяется следующим образом: строка ASCII-символов будет правильным выражением линейного варианта языка KIF тогда и только тогда, когда (1) она допускается интерпретатором языка Common Lisp, и (2) структура, порожденная интерпретатором Common Lisp будет правильным выражением структурированного KIF.

В структурированном KIF определены следующие синтаксические конструкции: word, expression, operator, constant, term, sentence, definition, rule и т.д.

Применимость KIF в рамках разработки агентов видится следующим образом. Ядро агента, а именно: подсистемы управления памятью, планирования, база знаний и т.д. пишутся на С++ или на одном из языков Java, Telescript (если нас интересует способность агента к мигрированию по сетям), а KIF используется как язык для обмена знаниями/данными с другими агентами (для этого агент должен иметь подсистему перетрансляции с языка внутреннего представления знаний на KIF). Язык KIF можно также использовать и как язык представления собственных знаний агента, в этом случае отпадает надобность в упомянутом выше трансляторе.

 

April: Agent Process Interaction Language. Это язык высокого уровня, который предлагает простой интерфейс к другим языкам программирования типа C. April ориентирован на реализацию многоагентных систем. Однако, April не является языком программирования агентов в том смысле, что он не предлагает таких высокоуровневых возможностей, как планировщики, механизмы вывода на основе правил и системы представления знаний. April скорее является объектно-ориентированным языком со средствами поддержки параллельного выполнения задач и рассматривающим объекты как процессы. Он является подходящей основой расширений для задач распределенного искусственного интеллекта и для прикладного программирования многоагентных систем.

AgentSpeak.Аналогом класса в данном языке выступает семейство, представителем (экземпляром) семейства является агент. Каждый агент обладает базой данных отношений с публичной и приватной частями, множеством сервисов и множества планов - процедур, о которых известно лишь то, выполнены они или нет. Язык обеспечивает распределенность хранения информации в пространстве функционирования агентов.

Каждый агентский сервис может быть одного из следующих трех типов: achieve, query, told. Каждый агентский план определяется при помощи имени и описания абстрактной ситуации, в которой он может быть применен. Во время работы агента, если план применим в текущей ситуации, выполняются действия, связанные с данным планом.

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

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

Каждый агент может находиться в одном из трех состояний: активный, ожидающий, неработающий (idle).

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

Данный язык близок по духу таким языкам как Agent0 and PLACA, от них он отличается тем, что здесь ментальное состояние агента рассматривается как объединение убеждений (отношений), целей (сервисов), планов и намерений. Agent0 рассматривает ментальное состояние, состоящее из списков способностей, убеждений и намерений.

Agent0 и Placa трактуют агентно-ориентированное программирование как вид объектно ориентированного программирования, создатели же AgentSpeak считают, что первое является расширением (продолжением) второго.

 

TeleScript.Первая коммерческая реализация концепции мобильного агента была сделана в среде TeleScript-технологии фирмы General Magic. Данная технология основана на метафоре электронного рынка - общедоступной сети (public network), которая позволяет продавцам и потребителям товаров и услуг находить друг друга и заниматься совместным бизнесом.

TeleScript-технология оперирует следующими понятиями: места (places), агенты (agents), перемещения (travels), встречи (meetings), соединения (connections), полномочия (authority) и разрешения (permits). Далее кратко разъясняются перечисленные понятия:

· Места. TeleScript-технология рассматривает компьютерную сеть как множество мест. Место - стационарный процесс на сервере, предлагающий услуги входящему агенту.

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

· Перемещение. Агенту предоставляется возможность путешествовать с места на место. Перемещение - отличительный признак системы удаленного программирования, оно позволяет агенту получить удаленную услугу и затем вернуться на место его старта. TeleScript позволяет коммуникационному пакету (computer package) - агенту (его процедурам и состоянию) перемещаться между компьютерами. Для перемещения между компьютерами агент выполняет инструкцию go. Инструкция включает ticket - данные о желаемом месте доставки, и других параметрах перемещения. В случае, если перемещение прошло успешно, агент получает уведомление об этом (его следующая инструкция выполняется уже на новом месте). В модели электронного рынка инструкция go позволяет агентам покупателей и продавцов располагать друг друга для более эффективного взаимодействия.

· Встречи. Встреча позволяет агентам вызывать процедуры друг друга. Встречи - это то, что “заставляет” агента перемещаться. Для встречи с расположенным рядом (co-located) агентом, агент выполняет инструкцию meet. Данная инструкция содержит требование (petition) - данные, определяющие агента, который “хочет” встретится и другие параметры встречи. Meet-инструкция позволяет покупателям и продавцам осуществлять транзакции.

· Соединения (пока не реализованы на 1995 год). Они позволяют агентам обмениваться информацией с разных мест. Для соединения агент выполняет connect-инструкцию. Данная инструкция содержит несколько параметров, таких как цель (target) соединения. Connect-инструкция позволяет агентам обмениваться информацией на расстоянии.

· Полномочия. Технология позволяет агенту или месту распознавать полномочия другого агента/места, причем агент или место не могут ни скрывать, ни фальсифицировать свои полномочия. Анонимность исключена. Технологией предусмотрена проверка полномочий при перемещении агента между регионами (network regions) сети - набором мест, расположенных на компьютерах, обладающих одинаковыми полномочиями. Для проверки полномочий агент или место выполняет инструкцию name. Результатом выполнения инструкции является telename - данные, позволяющие распознавать полномочия в рамках региона сети. Данная возможность позволяет защитить агентов и места от проникновения вирусов.

· Разрешения. Технология позволяет управлять назначением полномочий.

Язык программирования позволяет разработчику коммуникационного приложения определять алгоритмы функционирования агентов и данные, переносимые агентами во время перемещения по сети. Язык включает в себя возможности, предлагаемые C и C++. Приложение может быть написано целиком на языке TeleScript, но чаще разработчики поступают иначе: агенты и оболочки мест пишутся с помощью TeleScript, а стационарные части приложения (интерфейсы с пользователем, базами данных и т.д.) - на С или С++.

Telescript обладает следующими характеристиками:

· Полнотой.

· Объектно-ориентированностью.

· Динамичностью (dynamic). Агент может переносить информацию с места на место. Даже если при пересылке объект не известен на месте назначения, его класс следует вместе с ним по сети (код, определение класса).

· Сохранением (persistency). На каждом шаге выполнения агент и переносимая им информация безопасно сохраняется в не-volatile - памяти (постоянной - видимо, служебной памяти интерпретатора). Эта операция позволяет предотвратить крах компьютерной системы.

· Переносимостью и безопасностью. Компьютер выполняет инструкции, составляющие агента не напрямую, а посредством engine-интерпретатора. Агент может выполняться на любом компьютере, на котором инсталлирован интерпретатор.

· Ориентированностью на коммуникации (communication-centric). В язык встроены инструкции, позволяющие агенту просто выполнять сложные сетевые задачи.

 

Agent-Tcl. Agent-Tcl - это система мобильных агентов, в которой агенты написаны на Tcl 7.4 и Tk 4.0. Agent-Tcl активно используется в задачах информационного поиска и прикладных программах информационного управления. Agent-Tcl в целом аналогичен языку TeleScript, за исключением того, что Agent-Tcl более облегчен и в настоящее время обеспечивает ограниченную защиту. Альфа - версия доступна на Unix платформах.

 

Oz - параллельный, объектно-ориентированный язык программирования, который был разработан в DFKI (Германия). Имеются несколько проектов в DFKI, использующих Oz совместно с архитектурой InteRRaP (см. предыдущий раздел). InteRRaP представляет из себя многоуровневую архитектуру, которая построена для модели взаимодействующих автономных агентов. DFKI предлагает параллельный язык программирования, приспособленный для прикладных программ, которые требуют сложных символьных вычислений, организации кооперации агентов и некоторых возможностей управления в реальном масштабе времени. Реализация Oz является законченной средой программирования, включающей объектно-ориентированный интерфейс к Tcl/Tk. Прикладные программы на Oz уже использовались для моделирования многоагентных систем, обработки естественного языка, виртуальной реальности, графических пользовательских интерфейсов, планирования и создания расписаний.

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

 

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

 

Таблица 1. Сравнение языков.

Язык Переносимость кода Доступность Сетевые возможности Параллельность
Java байт-код, виртуальная машина Java Windows 95/NT, Solaris SPARC /Intel, HP-UX, OS/2, Macintosh, Linux APIs (библиотеки классов), Remote Method Invocation, сетевая сериализация Threads синхронизованные с помощью мониторов
TeleScript интерпретация скриптов Solaris SPARC, HP-UX, OS IRIX TCP/IP, UDP, сетевая сериализация множественные процессы работающие в вытесняющей многозадачности
Tcl/Tk интерпретация скриптов Macintosh, Windows 3.1, Windows 95/NT, Solaris    
Oz   Solaris SPARC, Sun OS, SGI IRIX, HP-UX, DEC Ultrix, IBM RS6000, Linux    
Obliq интерпретиру-емый язык   гетерогенные распределенные сетевые вычисления множественные threads внутри одного адресного пространства, множественные адресные пространства в пределах машины, распределенные вычисления в гетерогенных сетях
April     UDP  
AKL        
Scheme 48        
Penguin        
Python интерпретиру-емый язык Windows, DOS, Macintosh, UNIX интерфейс к TCP/IP  
Facile        
AgentSpeak интерпретиру-емый пока не реализован   аналог потоков - намерения
         

AKL (Agent Kernel Language) - параллельный язык программирования, разработанный в Шведском Институте Информатики (SICS). В AKL вычисления выполняются агентами, взаимодействующими через хранилища ограничений и условий (stores of constraints). Этот подход объединяет сразу несколько парадигм программирования. В соответствующих контекстах об AKL - агентах можно думать как о процессах, объектах, функциях, отношениях, или ограничениях. AGENTS - система для программирования в AKL. PENNY - это параллельная реализация AKL, для которой были получены очень перспективные результаты, и которая будет развиваться далее.

 

Scheme 48.Scheme - один из диалектов языка LISP. Широкое разнообразие парадигм программирования, включая императивный и функциональный стили, а также передачу сообщений, находят удобное выражение в данном языке. Реализация Scheme, основана на архитектуре виртуальной машины.

 

Таблица 2. Сравнение языков.

Язык Символьные вычисления Обеспечение безопасности Объектная ориентация Встроенные агентские свойства
Java не поддерживаются есть есть, без множественного наследования нет
TeleScript не поддерживаются встроенные в язык и библиотеку классов средства да агенты, места, маршруты, встречи, соединения, авторизация, полномочия, инструкции: go, meet, connect, permit, name
Tcl/Tk не поддерживаются      
Oz поддерживаются      
Obliq не поддерживаются   распределенные объектно-ориентированные вычисления легко встраиваемые в приложения на Modula-3 нет
April       намерения
AKL        
Scheme 48        
Penguin   кодирование (и цифровая подпись) Perl кода передаваемого удаленной машине    
Python     да  
Facile        
AgentSpeak     агентно-ориентированный язык BDI (beliefs-desires-intentions) архитектура
         

 

Python - переносимый, интерпретируемый, объектно-ориентированный язык программирования, разработанный пять лет назад в CWI (Амстердаме). Язык имеет изящный (но не переупрощенный) синтаксис; в него встроено небольшое число мощных типов данных. Python может быть расширен, путем добавления новых модулей, выполненных на компилируемом языке типа C или C++. Такие модули расширения могут определять новые функции и переменные, а также новые объектные типы.

Phantom - это интерпретируемый язык, разработанный для крупномасштабных интерактивных распределенных программ типа систем конференцсвязи, игр со многими игроками, и совместных инструментальных средств работы. Ядро языка основано на безопасном, расширенном подмножестве языка программирования Modula-3 и поддерживает ряд возможностей современного программирования, включая статическую типизацию, неявные объявления, объекты, облегченные процессы, и высокоуровневые функции.

Penguin - модуль языка Perl 5, который обеспечивает, набор функций для: (1) посылки шифрованного Perl-кода с цифровой подписью к удаленной машине, на которой он будет затем выполнен; (2) получения кода и, в зависимости от того, кем он подписан, его выполнения с соблюдением соответствующих прав. Комбинация этих функций дает возможность для непосредственного кодирования на языке Perl алгоритмов обработки безопасных финансовых сделок по Internet, мобильных агентов, собирающих информацию, “оживленных” Web-брoузеров, распределенных вычислений, удаленного обновления программного обеспечения, удаленного администрирования, распространения информации, конструкторов сетевых программ, и так далее.

Сводные характеристики языков и их сравнительные характеристики приведены соответственно в таблицах 1 и 2.