Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda

Описано реалізовану бібліотеку, спрямовану на імплементацію Linda для мови Scala (мовної підтримки компонентного програмного забезпечення). Бібліотека використовує клієнт-серверну архітектуру, базу даних для подання простору кортежів. У ній імплементовано механізм пошуку відповідностей, «примітивні»...

Ausführliche Beschreibung

Gespeichert in:
Bibliographische Detailangaben
Veröffentlicht in:Кибернетика и системный анализ
Datum:2010
Hauptverfasser: Глибовец, Н.Н., Гороховский, С.С., Стукало, М.С.
Format: Artikel
Sprache:Russian
Veröffentlicht: Інститут кібернетики ім. В.М. Глушкова НАН України 2010
Schlagworte:
Online Zugang:https://nasplib.isofts.kiev.ua/handle/123456789/45248
Tags: Tag hinzufügen
Keine Tags, Fügen Sie den ersten Tag hinzu!
Назва журналу:Digital Library of Periodicals of National Academy of Sciences of Ukraine
Zitieren:Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda / Н.Н. Глибовец, С.С. Гороховский, М.С. Стукало // Кибернетика и системный анализ. — 2010. — № 4. — С. 117-122. — Бібліогр.: 8 назв. — рос.

Institution

Digital Library of Periodicals of National Academy of Sciences of Ukraine
id nasplib_isofts_kiev_ua-123456789-45248
record_format dspace
spelling Глибовец, Н.Н.
Гороховский, С.С.
Стукало, М.С.
2013-06-10T18:21:47Z
2013-06-10T18:21:47Z
2010
Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda / Н.Н. Глибовец, С.С. Гороховский, М.С. Стукало // Кибернетика и системный анализ. — 2010. — № 4. — С. 117-122. — Бібліогр.: 8 назв. — рос.
0023-1274
https://nasplib.isofts.kiev.ua/handle/123456789/45248
658.012.011.56:378(477)
Описано реалізовану бібліотеку, спрямовану на імплементацію Linda для мови Scala (мовної підтримки компонентного програмного забезпечення). Бібліотека використовує клієнт-серверну архітектуру, базу даних для подання простору кортежів. У ній імплементовано механізм пошуку відповідностей, «примітивні» та додаткові операції. Бібліотеку можна використовувати для розробки розподілених паралельних застосувань.
The paper describes a new library developed for Linda language implementation for the Scala programming language (the language support of the component programming software). The library uses client-server architecture and a database for the tuple space representation. It implements the search for similarities mechanism, “primitive” and additional operations. The library can be used for distributed and parallel application development.
ru
Інститут кібернетики ім. В.М. Глушкова НАН України
Кибернетика и системный анализ
Системный анализ
Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda
Розширення мови Scala засобами паралелізму та розподілення за допомогою координаційної системи Linda
Extension of Scala language by distributed and parallel computing tools with Linda coordination system
Article
published earlier
institution Digital Library of Periodicals of National Academy of Sciences of Ukraine
collection DSpace DC
title Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda
spellingShingle Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda
Глибовец, Н.Н.
Гороховский, С.С.
Стукало, М.С.
Системный анализ
title_short Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda
title_full Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda
title_fullStr Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda
title_full_unstemmed Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda
title_sort расширение языка scala средствами параллелизма и распределенности с помощью координационной системы linda
author Глибовец, Н.Н.
Гороховский, С.С.
Стукало, М.С.
author_facet Глибовец, Н.Н.
Гороховский, С.С.
Стукало, М.С.
topic Системный анализ
topic_facet Системный анализ
publishDate 2010
language Russian
container_title Кибернетика и системный анализ
publisher Інститут кібернетики ім. В.М. Глушкова НАН України
format Article
title_alt Розширення мови Scala засобами паралелізму та розподілення за допомогою координаційної системи Linda
Extension of Scala language by distributed and parallel computing tools with Linda coordination system
description Описано реалізовану бібліотеку, спрямовану на імплементацію Linda для мови Scala (мовної підтримки компонентного програмного забезпечення). Бібліотека використовує клієнт-серверну архітектуру, базу даних для подання простору кортежів. У ній імплементовано механізм пошуку відповідностей, «примітивні» та додаткові операції. Бібліотеку можна використовувати для розробки розподілених паралельних застосувань. The paper describes a new library developed for Linda language implementation for the Scala programming language (the language support of the component programming software). The library uses client-server architecture and a database for the tuple space representation. It implements the search for similarities mechanism, “primitive” and additional operations. The library can be used for distributed and parallel application development.
issn 0023-1274
url https://nasplib.isofts.kiev.ua/handle/123456789/45248
citation_txt Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda / Н.Н. Глибовец, С.С. Гороховский, М.С. Стукало // Кибернетика и системный анализ. — 2010. — № 4. — С. 117-122. — Бібліогр.: 8 назв. — рос.
work_keys_str_mv AT glibovecnn rasširenieâzykascalasredstvamiparallelizmairaspredelennostispomoŝʹûkoordinacionnoisistemylinda
AT gorohovskiiss rasširenieâzykascalasredstvamiparallelizmairaspredelennostispomoŝʹûkoordinacionnoisistemylinda
AT stukaloms rasširenieâzykascalasredstvamiparallelizmairaspredelennostispomoŝʹûkoordinacionnoisistemylinda
AT glibovecnn rozširennâmoviscalazasobamiparalelízmutarozpodílennâzadopomogoûkoordinacíinoísistemilinda
AT gorohovskiiss rozširennâmoviscalazasobamiparalelízmutarozpodílennâzadopomogoûkoordinacíinoísistemilinda
AT stukaloms rozširennâmoviscalazasobamiparalelízmutarozpodílennâzadopomogoûkoordinacíinoísistemilinda
AT glibovecnn extensionofscalalanguagebydistributedandparallelcomputingtoolswithlindacoordinationsystem
AT gorohovskiiss extensionofscalalanguagebydistributedandparallelcomputingtoolswithlindacoordinationsystem
AT stukaloms extensionofscalalanguagebydistributedandparallelcomputingtoolswithlindacoordinationsystem
first_indexed 2025-11-26T00:05:38Z
last_indexed 2025-11-26T00:05:38Z
_version_ 1850591285365178368
fulltext ÓÄÊ 658.012.011.56:378](477) Í.Í. ÃËÈÁÎÂÅÖ, Ñ.Ñ. ÃÎÐÎÕÎÂÑÊÈÉ, Ì.Ñ. ÑÒÓÊÀËÎ ÐÀÑØÈÐÅÍÈÅ ßÇÛÊÀ SCALA ÑÐÅÄÑÒÂÀÌÈ ÏÀÐÀËËÅËÈÇÌÀ È ÐÀÑÏÐÅÄÅËÅÍÍÎÑÒÈ Ñ ÏÎÌÎÙÜÞ ÊÎÎÐÄÈÍÀÖÈÎÍÍÎÉ ÑÈÑÒÅÌÛ LINDA Êëþ÷åâûå ñëîâà: ðàñïðåäåëåííûå âû÷èñëåíèÿ, êîîðäèíàöèîííûå ñèñòåìû. ÂÂÅÄÅÍÈÅ Êîìïîíåíòíî-îðèåíòèðîâàííûé ïîäõîä ê ïðîåêòèðîâàíèþ è ðåàëèçàöèè ñëîæíûõ ïðîãðàììíûõ ñèñòåì â îïðåäåëåííîì ñìûñëå ðàçâèâàåò îáúåêòíî-îðèåíòèðîâàí- íóþ ïàðàäèãìó. Åãî èñïîëüçîâàíèå ñòàíîâèòñÿ áîëåå ïðîèçâîäèòåëüíûì äëÿ ðàç- ðàáîòêè ìàñøòàáíûõ ïðîåêòîâ è ðàñïðåäåëåííûõ ñèñòåì, íàïðèìåð êîðïîðàòèâ- íûõ ïðèìåíåíèé [1, 2]. Èñïîëüçîâàíèå ïîòåíöèàëà ìàñøòàáíûõ ðàñïðåäåëåííûõ ñèñòåì òðåáóåò íàëè- ÷èÿ ïðîãðàììíûõ ìîäåëåé, ÿâíî îïåðèðóþùèõ ïîíÿòèÿìè ïàðàëëåëüíîãî ñîòðóäíè- ÷åñòâà ìåæäó áîëüøèì ÷èñëîì àêòèâíûõ ñóùíîñòåé, ñîñòàâëÿþùèõ åäèíñòâåííîå ïðèìåíåíèå. Òàêàÿ ïîòðåáíîñòü ïðèâåëà ê ïðîåêòèðîâàíèþ è âíåäðåíèþ íåñêîëü- êèõ êîîðäèíàöèîííûõ ìîäåëåé âìåñòå ñ îòäåëüíûìè ÿçûêàìè, ïîääåðæèâàþùèìè ýòè ìîäåëè. Îíè ñîçäàíû äëÿ ïðåäîñòàâëåíèÿ ðàçðàáîò÷èêàì êàðêàñà (framework), êîòîðûé óëó÷øàë áû ìîäóëü, ñïîñîáñòâîâàë ïîâòîðíîìó èñïîëüçîâàíèþ êîìïî- íåíòîâ (ïîñëåäîâàòåëüíûõ èëè óæå ïàðàëëåëüíûõ), ïîâûøàë êðîññïëàòôîðìíîñòü è ÿçûêîâóþ ñîâìåñòèìîñòü. Îäíàêî ýòè ìîäåëè îòëè÷àþòñÿ èìåííî ïîíÿòèåì êîîð- äèíàöèè: ÷òî êîíêðåòíî êîîðäèíèðóåòñÿ, êàêèìè ñðåäñòâàìè äîñòèãàåòñÿ è êàêèå ìåòàôîðû ïðèìåíÿþòñÿ äëÿ ïðåäñòàâëåíèÿ ýòèõ ïîíÿòèé [3]. Ìîäåëè êîîðäèíàöèè îðèåíòèðîâàíû íà çàäà÷è (òàêèå êàê Linda), èñïîëüçóþò îá- ùåå ïðîñòðàíñòâî äàííûõ. Òàêîé ïîäõîä ïðåäîñòàâëÿåò ðàçðàáîò÷èêàì ïðîñòîé è ýô- ôåêòèâíûé ñïîñîá äîñòèæåíèÿ ìíîãèõ öåëåé, ãëàâíàÿ èç íèõ — îïòèìàëüíîå âçàèìî- äåéñòâèå ìåæäó ïðîöåññàìè. Çäåñü êîììóíèêàöèÿ ïðîöåññîâ ðåàëèçóåòñÿ ââåäåíèåì íåáîëüøîãî ÷èñëà îïåðàöèé, êîòîðûå ëåãêî ìîãóò èñïîëüçîâàòü ïðîãðàììèñòû.  ñåðåäèíå 1980-õ ãîäîâ Ä. Ãåëåðíòåð èç Éåëüñêîãî óíèâåðñèòåòà ïðåäëîæèë ñêîðåå ïîäõîä, ÷åì îòäåëüíûé ÿçûê, ïàðàëëåëüíîãî ïðîãðàììèðîâàíèÿ Linda [4].  íåì ïàðàëëåëüíàÿ ïðîãðàììà ñîñòîèò èç ìíîãèõ ïðîöåññîâ, êàæäûé ðàáîòàåò êàê îáû÷íàÿ ïîñëåäîâàòåëüíàÿ ïðîãðàììà. Ýòè ïðîöåññû èìåþò äîñòóï ê îáùåé ïàìÿ- òè, åäèíèöåé õðàíåíèÿ â êîòîðîé ÿâëÿåòñÿ êîðòåæ. Äëÿ ñâÿçè ïðîöåññîâ ñ îáùåé ïàìÿòüþ ñóùåñòâóåò âñåãî øåñòü áàçîâûõ îïåðàöèé. Êðîìå ñòèëèñòè÷åñêèõ îòëè÷èé ìåæäó êîîðäèíàöèîííûìè ìîäåëÿìè, âëèÿþ- ùèìè íà ñòåïåíü ðàçäåëåíèÿ âû÷èñëèòåëüíûõ è êîîðäèíàöèîííûõ ÷àñòåé, âûäåëÿ- þò è ðàçíîå ïðèìåíåíèå. Ìîäåëü data-driven êîîðäèíàöèè èñïîëüçóåòñÿ â îñíîâíîì äëÿ ðàñïàðàëëåëè- âàíèÿ âû÷èñëèòåëüíûõ çàäà÷. Ïîäõîä control-driven êîîðäèíàöèè îáû÷íî ïðèìåíÿ- åòñÿ äëÿ ìîäåëèðîâàíèÿ ñèñòåì. Ýòî ìîæíî îáúÿñíèòü òåì, ÷òî â ðàìêàõ êîíôèãó- ðàöèîííîãî êîìïîíåíòà ïðîãðàììèñò èìååò áîëüøèé êîíòðîëü íàä äàííûìè â ñëó- ÷àå èñïîëüçîâàíèÿ ÿçûêîâ, êîòîðûå ïîääåðæèâàþò data-driven êîîðäèíàöèþ, ÷åì â ñëó÷àå control-driven êîîðäèíàöèè. Ïðåäñòàâèòåëè ïåðâîé êàòåãîðèè, êàê ïðàâèëî, ïûòàþòñÿ êîîðäèíèðîâàòü äàííûå, à ïðåäñòàâèòåëè âòîðîé — êîîðäèíèðîâàòü ñóùíîñòè (ìîãóò áûòü íå òîëüêî îáû÷íûìè ïðîöåññàìè, íî è óñòðîéñòâàìè, êîìïî- íåíòàìè ñèñòåìû è ò.ï.). Ìíîãèå èññëåäîâàòåëè ñ÷èòàþò, ÷òî ÷àñòè÷íîå îòñóòñòâèå ïðîãðåññà â êîìïî- íåíòíîì ïðîãðàììíîì îáåñïå÷åíèè îáúÿñíÿåòñÿ íåäîñòàòêàìè ÿçûêîâ ïðîãðàììè- ðîâàíèÿ, èñïîëüçóåìûõ äëÿ îïðåäåëåíèÿ è èíòåãðàöèè êîìïîíåíòîâ. Áîëüøèíñòâî ÿçûêîâ ïðåäëàãàþò ëèøü îãðàíè÷åííóþ ïîääåðæêó àáñòðàãèðîâàíèÿ è êîìïîçèöèè êîìïîíåíòîâ. Ýòî êàñàåòñÿ, â ÷àñòíîñòè, òàêèõ ñòàòè÷åñêè òèïèçèðóþùèõ ÿçûêîâ, êàê Java è C#. ISSN 0023-1274. Êèáåðíåòèêà è ñèñòåìíûé àíàëèç, 2010, ¹ 4 117 © Í.Í. Ãëèáîâåö, Ñ.Ñ. Ãîðîõîâñêèé, Ì.Ñ. Ñòóêàëî, 2010 Íàñòîÿùàÿ ñòàòüÿ íàïðàâëåíà íà ðåøåíèå ýòîé ïðîáëåìû ñ èñïîëüçîâàíèåì áàçî- âûõ èäåé êîîðäèíàöèîííîé ìîäåëè Linda îòíîñèòåëüíî óëó÷øåíèÿ èíòåãðàöèîííûõ ìåõàíèçìîâ ÿçûêîâ êîìïîíåíòíîãî ïðîãðàììèðîâàíèÿ íà ïðèìåðå ðàñøèðåíèÿ Scala. 1. ßÇÛÊ ÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈß SCALA ßçûê Scala ñîçäàí â 2001–2004 ãã. â ëàáîðàòîðèè ìåòîäîâ ïðîãðàììèðîâàíèÿ EPFL [5] â ðàìêàõ óëó÷øåíèÿ ÿçûêîâîé ïîääåðæêè êîìïîíåíòíîãî ïðîãðàììíîãî îáåñïå÷åíèÿ.  îñíîâíîì ýòè èññëåäîâàíèÿ íàïðàâëåíû íà ðåàëèçàöèþ äâóõ èäåé. Âî-ïåðâûõ, ÿçûê êîìïîíåíòíûõ ïðèìåíåíèé äîëæåí áûòü ìàñøòàáèðîâàííûì, ò.å. äîëæíà ñóùåñòâîâàòü âîçìîæíîñòü ñ ïîìîùüþ îäíèõ è òåõ æå êîíöåïöèé îïèñû- âàòü êàê ìàëûå, òàê è êðóïíûå ÷àñòè ïðèìåíåíèé. Ïîýòîìó ðàçðàáîò÷èêè ÿçûêà ñêîíöåíòðèðîâàëèñü íà ýôôåêòèâíîé ðåàëèçàöèè ìåõàíèçìîâ àáñòðàêöèè, êîìïîçè- öèè è äåêîìïîçèöèè âìåñòî ââåäåíèÿ áîëüøîãî êîëè÷åñòâà ïðèìèòèâîâ, ïîëåçíûõ òîëüêî íà êàêîì-òî îäíîì óðîâíå ìàñøòàáèðîâàíèÿ. Âî-âòîðûõ, âïîëíå åñòåñòâåííî ñîçäàòü ÿçûê, óíèôèöèðóþùèé è îáîáùàþùèé îáúåêòíî-îðèåíòèðîâàííîå è ôóíê- öèîíàëüíîå ïðîãðàììèðîâàíèå. Íåêîòîðûå èç îñíîâíûõ òåõíè÷åñêèõ íîâîââåäåíèé Scala — ýòî êîíöåïöèÿ, îáúåäèíÿþùàÿ ýòè ïàðàäèãìû ïðîãðàììèðîâàíèÿ. ßçûê Scala íå ïðåäîñòàâëÿåò íèêàêèõ ïðèìèòèâîâ äëÿ ïàðàëëåëüíîãî ïðîãðàì- ìèðîâàíèÿ. ßäðî ÿçûêà ïîñòðîåíî òàê, ÷òîáû óïðîñòèòü ñîçäàíèå áèáëèîòåê ïîä- äåðæêè ðàçíûõ ìîäåëåé ïàðàëëåëèçìà, íàäñòðîåííûõ íàä òåêóùåé ìîäåëüþ ÿçû- êà-îñíîâû [6]. Îòìåòèì òàêæå êëþ÷åâûå àñïåêòû Scala. Ïðîãðàììû âî ìíîãîì ïîõîæè íà Java-ïðîãðàììû è ìîãóò ñâîáîäíî âçàèìîäåéñòâîâàòü ñ Java-êîäîì; ÿçûê âêëþ÷àåò óíè- ôèöèðîâàííóþ îáúåêòíóþ ìîäåëü â òîì ñìûñëå, ÷òî ëþáîå çíà÷åíèå ÿâëÿåòñÿ îáúåêòîì, à ëþáàÿ îïåðàöèÿ — âûçîâîì ìåòîäà; ôóíêöèîíàëüíîñòü ÿçûêà âûðàæàåòñÿ â òîì, ÷òî ôóíêöèè — ýòî ïîëíîïðàâíûå çíà÷åíèÿ. Ââåäåíû ìîùíûå óíèôèöèðîâàííûå êîíöåïòû àáñòðàêöèé äëÿ òèïîâ è çíà÷åíèé; èìååì ãèáêèå ñèììåòðè÷íûå êîíñòðóêöèè ïðèìåñåé (mixin) äëÿ êîìïîçèöèè êëàññîâ è êîëëåêöèé ìåòîäîâ traits; ââèäó ÷åãî äåêîìïîçèðóþò îáúåêòû, ñðàâíèâàÿ ñ îáðàçöîì (óæå ðåàëèçîâàíî íà ïëàòôîðìàõ Java è .NET). Îñíîâíûå ìàòåðèàëû ïî ÿçûêó ñì. http://www.scala-lang.org/, ñðåäè íèõ âûäå- ëèì êíèãó îäíîãî èç ñîàâòîðîâ ÿçûêà Ì. Îäåðñêîãî «Programming in Scala» [6]. 2. LINDA ÄËß SCALA Èìïëåìåíòàöèÿ Linda äëÿ Scala, îïèñàííàÿ â ýòîé ðàáîòå, áàçèðóåòñÿ íà îáúåêòíî- îðèåíòèðîâàííîì ïîäõîäå è çàêëþ÷àåòñÿ â ñîçäàíèè ñïåöèàëèçèðîâàííîé áèáëèîòå- êè. Èìåííî êîíöåïòóàëüíàÿ ýëåãàíòíîñòü Linda, â òîì ÷èñëå àññîöèàòèâíàÿ ñòðóêòó- ðà ïðîñòðàíñòâà êîðòåæåé, âûçâàëà îïðåäåëåííûå òðóäíîñòè â ðåàëèçàöèè [7]. Âìåñòî âñòðîåííûõ òèïîâ äàííûõ Scala (ÿçûê ñî ñòàòè÷åñêîé òèïèçàöèåé) äëÿ ïðåäñòàâëåíèÿ òèïîâ äàííûõ ïðèìåíÿþò êëàññû. Àáñòðàêòíûé áàçîâûé êëàññ — LindaType. Êàæäûé êëàññ, èñïîëüçîâàííûé â êîðòåæàõ, äîëæåí íàñëåäîâàòüñÿ îò áàçîâîãî êëàññà, êîòîðûé ïîçâîëÿåò ðàçðàáîò÷èêó èñïîëüçîâàòü òèïû äàííûõ, îïðåäåëåííûå â ýòîé áèáëèîòåêå è, ÷òî âàæíî, ñîçäàâàòü íîâûå òèïû äàííûõ.  LindaType îïðåäåëåíà ëèøü áóëåâà ïåðåìåííàÿ formal, êîòîðàÿ óêàçûâàåò, ÿâëÿåòñÿ êëàññ àêòóàëüíûì èëè ôîðìàëüíûì ïàðàìåòðîì. Äëÿ ïåðåäà÷è ïî ñåòè ïðèìåíÿåòñÿ âñòðîåííàÿ â Java ñåðèàëèçàöèÿ îáúåêòîâ. 2.1 Òèïû äàííûõ. Êàæäûé òèï äàííûõ áèáëèîòåêè íàñëåäóåòñÿ îò áàçîâîãî êëàññà LindaType. Ýòî ïîçâîëÿåò ðåàëèçîâàòü ïðîñòîå ïðåâðàùåíèå îïðåäåëåííûõ â Scala êëàññîâ TupleN (n-ìåðíûé êîðòåæ, 1 22� �n ) ê áîëåå óäîáíîìó ñ òî÷êè çðå- íèÿ îáðàáîòêè êîðòåæà â âèäå ñïèñêà List LindaType[ ] . Îãðàíè÷åíèå êîëè÷åñòâà ÷èñëîì 22 ñâÿçàíî ñî ñïîñîáîì ðåàëèçàöèè êîðòåæåé â Scala. Íåîáõîäèìîñòü â òà- êîì ïðåäñòàâëåíèè âîçíèêëà ïîòîìó, ÷òî êëàññ TupleN íå ïîääåðæèâàåò èòåðàöèþ, êîòîðàÿ çíà÷èòåëüíî îñëîæíÿåò ñðàâíåíèå êîðòåæà ñ àíòèêîðòåæîì. Åùå îäíèì àð- ãóìåíòîì äëÿ èñïîëüçîâàíèÿ ñïèñêà êàê ñòðóêòóðû äàííûõ äëÿ êîðòåæà áûëî òî, ÷òî â Scala îïðåäåëåíî ìíîãî ôóíêöèé äëÿ ðàáîòû ñî ñïèñêàìè. 118 ISSN 0023-1274. Êèáåðíåòèêà è ñèñòåìíûé àíàëèç, 2010, ¹ 4 Äëÿ ñðàâíåíèÿ òèïîâ äàííûõ, ïðîèçâîäíûõ îò LindaType, èñïîëüçóåòñÿ ïåðå- îïðåäåëåííûé îïåðàòîð ðàâåíñòâà (��) è âñïîìîãàòåëüíûé ìåòîä canEqual. Îïðå- äåëåíèå ìåòîäà ðàâåíñòâà äëÿ LindaInteger ñì. íà ðèñ. 1. Èìïëåìåíòàöèÿ Linda äëÿ Scala èìååò íàáîð çàðàíåå îïðåäåëåííûõ òèïîâ äàí- íûõ, êîòîðûå ïðèâåäåíû â òàáë. 1. Íàïðèìåð, ôðàãìåíò êîäà íà ðèñ. 2 ïîêàçûâàåò èñïîëüçîâàíèå òèïà äàííûõ LindaInteger. Ïîñëåäíÿÿ ñòðî÷êà êîäà ïîêàçûâàåò âàæíóþ îñîáåííîñòü áèáëèîòåêè. Ëþáîé ôàêòè÷åñêèé ïàðàìåòð ìîæíî ïðåâðàòèòü â ôîðìàëüíûé è, íàîáîðîò, ñ ïîìîùüþ ìåòîäîâ toFormal è toActual, îïðåäåëåííûõ â áàçîâîì êëàññå LindaType. Îïèøåì, êàê ñîçäàòü íîâûå òèïû äàííûõ è èñïîëüçîâàòü èõ â Linda äëÿ Scala. Äëÿ íà÷àëà íóæíî îïðåäåëèòü íîâûé òèï äàííûõ (ðèñ. 3) êàê ïðîèçâîäíûé îò LindaType. Êëþ÷åâîå ñëîâî case ïåðåä îïðåäåëåíèåì êëàññà óêàçûâàåò, ÷òî äëÿ ýòîãî êëàññà ïðèìåíèìûé âñòðîåííûé â Scala ìåõàíèçì ïîèñêà ñîîòâåòñòâèé (pattern matching). Äëÿ ñîõðàíåíèÿ êîðòåæåé â áàçå äàí- íûõ íåîáõîäèìî ïîëó÷èòü ñèãíàòó- ðó êàæäîãî ýëåìåíòà êîðòåæà ñ ïî- ìîùüþ ôóíêöèè getType. Çàòåì èç ýòèõ ñèãíàòóð ôîðìèðóåòñÿ ñòðîêà, íåîáõîäèìàÿ äëÿ íàõîæäåíèÿ êîð- òåæåé â áàçå äàííûõ. Ôóíêöèÿ ïî- ëó÷åíèÿ òàêîé ñòðîêè îïðåäåëåíà â îáúåêòå-ñèíãëåòîíå (singleton object) LindaTuple (ðèñ. 4). Äëÿ íîâûõ êëàññîâ òàêæå íóæíî îïðåäåëèòü ìåòîä ñðàâíåíèÿ îáúåêòîâ ýòîãî êëàññà ìåæäó ñîáîé àíàëîãè÷íî ðèñ. 1. ISSN 0023-1274. Êèáåðíåòèêà è ñèñòåìíûé àíàëèç, 2010, ¹ 4 119 override def equals (other : Any) = other match { case that: LindaInteger => (that canEqual this) && (this.Value == that.Value) case _ => false } def canEqual (other: Any) = other.isInstanceOf[LindaInteger] Ðèñ. 1 Ò à á ë è ö à 1 Êëàññ Òèï äàííûõ LindaDouble Double LindaFloat Float LindaInteger Int LindaLong Long LindaString String val lint:LindaInteger = 20 //ôàêòè÷åñêèé òèï val lint2 = new LindaInteger (15) //ôàêòè÷åñêèé òèï lint.toFormal //òåïåðü lint — ýòî ôîðìàëüíûé ïàðàìåòð, êîòîðûé ìîæíî ïðèìåíèòü äëÿ îïåðàöèè in èëè rd Ðèñ. 2 case class LindaPoint (coord1 : Int, coord2 : Int) extends LindaType { val x = coord1 val y = coord2 override def getType = "point" //ìåòîä äëÿ ïîëó÷åíèÿ ñèãíàòóðû òèïà override def toString = x+" "+� //ìåòîä äëÿ ïðåâðàùåíèÿ çíà÷åíèé â ñòðîêó } Ðèñ. 3 def getSignature (tuple : List[LindaType]) : String ={ var output = "" tuple.foreach(arg => output = output +" " + arg.getType) output.drop(1) } Ðèñ. 4 2.2. Îñîáåííîñòè ðåàëèçàöèè îïåðàöèé. Êîîðäèíàöèîííàÿ ìîäåëü Linda ñî- äåðæèò íåáîëüøîå êîëè÷åñòâî îïåðàöèé êîììóíèêàöèè ïðîöåññîâ è ðàñïðåäåëåíèå ïðîñòðàíñòâà äàííûõ. Ïîñêîëüêó êîììóíèêàöèîííûå îïåðàöèè äîëæíû ïðèíèìàòü íà âõîä ëþáîé òèï äàííûõ è èìåòü ïðîñòîé ñèíòàêñèñ, òî ëîãè÷íî îáúÿâèòü, ÷òî âõîäíûì ïàðàìåòðîì ýòèõ îïåðàöèé äîëæíà áûòü Any — áàçîâûé òèï â èåðàðõèè êëàññîâ Scala. Ôàêòè÷åñêè íà âõîä îïåðàöèé ïîäàåòñÿ êîðòåæ Scala (TupleN), êîòî- ðûé íåîáõîäèìî ïðåîáðàçîâàòü â êîðòåæ Linda. Ïîýòîìó íà êîëè÷åñòâî âõîäÿùèõ îáúåêòîâ íàêëàäûâàåòñÿ îãðàíè÷åíèå â 22, ÷òî ñâÿçàíî ñî ñïîñîáîì ðåàëèçàöèè êîðòåæåé â Scala. Ïðåîáðàçîâàíèå êîðòåæà â íóæíóþ ôîðìó ïðîâîäèòñÿ ñ ïî- ìîùüþ ôóíêöèè createLindaTupl, íàõîäÿùåéñÿ â îáúåêòå-ñèíãëåòîíå LindaTuple. Ýòà ôóíêöèÿ èñïîëüçóåòñÿ â ñèñòåìå îäèí ðàç, êîãäà êëèåíò ïåðåäàåò çàïðîñ îò ïðîöåññà íà ñåðâåð. Ïîñëå ýòîãî êîðòåæ ïðåäñòàâëÿåò ñîáîé ñïèñîê çíà÷åíèé òèïà LindaType. Äëÿ ñâÿçè ïðîöåññà ñ ïðîñòðàíñòâîì êîðòåæåé îí äîëæåí ñîçäàòü íîâûé ýê- çåìïëÿð êëèåíòà è ñ åãî ïîìîùüþ ðàáîòàòü ñ ñåðâåðíîé áàçîé äàííûõ (ðèñ. 5). Íà ðèñ. 5 ïðîäåìîíñòðèðîâàíû îñíîâíûå ìîìåíòû ðàáîòû ñ êëèåíòîì — ñî- çäàíèå íîâûõ îáúåêòîâ çíà÷åíèé, ñîçäàíèå êëèåíòà, âûïîëíåíèå îïåðàöèé. Îòìå- òèì, ÷òî ïîñëåäíÿÿ îïåðàöèÿ in âîçâðàòèò îäèí èç äâóõ êîðòåæåé: (28, 34, "hello") èëè (28, 14, "hello"), ïîñêîëüêó àêòóàëüíûé ïàðàìåòð i2 ïðåâðàòèëñÿ â ôîðìàëüíûé, ðåàëüíî ñòàë øàáëîíîì òèïà � �Int . 2.3. Áàçà äàííûõ äëÿ êîðòåæåé. Ñâÿçêà êëèåíò-ñåðâåð èñïîëüçóåòñÿ äëÿ ïåðåäà- ÷è çàïðîñîâ ê áàçå äàííûõ, êîòîðàÿ ðåàëèçóåò îáùåå ðàñïðåäåëåííîå ïðîñòðàíñòâî êîðòåæåé è îòâå÷àåò çà ïîèñê êîðòåæåé â ýòîì ïðîñòðàíñòâå. Ñòðóêòóðà äëÿ õðàíåíèÿ äàííûõ — îòîáðàæåíèÿ Map, âèäà [ : [ [ ]]]signature String List List Lindatype�� , ãäå êàæäîé ñòðîêå-ñèãíàòóðå ñòàâèòñÿ â ñîîòâåòñòâèå ñïèñîê êîðòåæåé, êîòîðûå èìåþò òàêóþ æå ñèãíàòóðó. Òàêîé ñïîñîá îðãàíèçàöèè êîðòåæåé óïðîùàåò ïîèñê íóæíîãî êîðòåæà. Äëÿ íàõîæäåíèÿ ñîîòâåòñòâèÿ ñ àíòèêîðòåæîì ñíà÷àëà ïîëó÷àåòñÿ ñèãíà- òóðà àíòèêîðòåæà, çàòåì èç îòîáðàæåíèÿ âûáèðàåòñÿ ñïèñîê êîðòåæåé ñ ñîîòâå- òñòâóþùåé ñèãíàòóðîé, ñ ïîìîùüþ ôóíêöèè find èùóòñÿ âñå êîðòåæè, êîòîðûå óäîâëåòâîðÿþò øàáëîíó, ïîëó÷åííîìó èç àíòèêîðòåæà. Åñëè êîðòåæåé áîëüøå îä- íîãî, òî èç íèõ ôóíêöèåé choosetuple ñëó÷àéíûì îáðàçîì âûáèðàåòñÿ îäèí. Çàòåì îí óäàëÿåòñÿ èç áàçû äàííûõ, îáíîâëåííûé ñïèñîê çàïèñûâàåòñÿ â îòîáðàæåíèå. Äåòàëüíåå ýòîò ïðîöåññ îïèñàí íà ðèñ. 6. 2.4. Linda-êëèåíò. Êëèåíò îòâå÷àåò çà ïåðåäà÷ó çàïðîñîâ îò ïðîöåññà ê ñåðâå- ðó è çà âîçâðàùåíèå ïîëó÷åííîãî ðåçóëüòàòà. Äëÿ ñâÿçè ìåæäó ñåðâåðîì è êëèåí- òîì èñïîëüçóþòñÿ Java-ñîêåòû. Ïðè âûïîëíåíèè êàêîãî-òî ìåòîäà êëèåíòà, íàïðè- ìåð îïåðàöèé in èëè out, ñîçäàþòñÿ íîâûé ñîêåò äëÿ ñîåäèíåíèÿ ñ ñåðâåðîì, ïîòîêè (streams) äëÿ çàïèñè è ÷òåíèÿ îáúåêòîâ èç ñåðâåðà, ïåðåäàåòñÿ çàïðîñ íà ñåðâåð, 120 ISSN 0023-1274. Êèáåðíåòèêà è ñèñòåìíûé àíàëèç, 2010, ¹ 4 package org.linda.Test import org.linda.LindaTypes._ import org.linda.Client._ object process extends Application { val i1 = new LindaInteger (28) //ñîçäàíèå íîâûõ îáúåêòîâ äàííûõ val i2 = new LindaInteger (34) val i3 = new LindaInteger (14) val s = new LindaString ("hello") val client = new Client //ñîçäàíèå íîâîãî êëèåíòà client.out (i1, i2, s) //âûïîëíåíèå îïåðàöèè out client.out (i1, i3, s) i2.toFormal //ïðåîáðàçîâàíèå ôàêòè÷åñêîãî ïàðàìåòðó â ôîðìàëüíûé client.in(i1, i2, s) //âûïîëíåíèå îïåðàöèè in } Ðèñ. 5 îæèäàåòñÿ îòâåò è ïðîöåññó âîçâðàùàþòñÿ ïîëó÷åííûå çíà÷åíèÿ. Ðåàëèçàöèÿ îïå- ðàöèè in íà êëèåíòå îïèñàíà íà ðèñ. 7. 2.5. Linda-ñåðâåð. Çàäà÷à ñåðâåðà — îæèäàòü îò êëèåíòîâ çàïðîñû è âûïîë- íÿòü èõ. Äëÿ âûïîëíåíèÿ êàæäîãî çàïðîñà çàïóñêàåòñÿ îòäåëüíûé ïîòîê, êîòîðûé è äåëàåò çàïðîñû ê áàçå äàííûõ. Ïîòîêè ìîãóò âûïîëíÿòüñÿ ïàðàëëåëüíî. Êàæäûé ïîòîê îòêðûâàåò streams äëÿ ÷òåíèÿ è çàïèñè îáúåêòîâ ñ/íà êëèåíò. Èìåííî â ïîòî- êàõ ðåàëèçîâàíî, ÷òî òàêèå îïåðàöèè, êàê in èëè rd ïðèîñòàíàâëèâàþò âûïîëíåíèå ïðîöåññà äî ìîìåíòà, ïîêà â áàçå äàííûõ íå ïîÿâèòñÿ íóæíûé êîðòåæ. Ñèíõðîíèçàöèÿ ìåæäó ïîòîêàìè ïðîèñõîäèò ïî îáúåêòó áàçû äàííûõ ñ ïîìîùüþ ìåòîäà Java syncronized: db synchronized. { }� , à êîã- äà â áàçå äàííûõ íåò ñîîòâåòñòâóþùåãî êîðòåæà, âûïîëíåíèå ïîòîêà ïðèîñòà- íàâëèâàåòñÿ ïî êîìàíäå db wait. (). Ðåà- ëèçàöèÿ îïåðàöèè in íà ñåðâåðå îïèñàíà íà ðèñ. 8. 2.6. Ëîêàëüíîå ïðîñòðàíñòâî êîð- òåæåé. Ëîêàëüíîå ïðîñòðàíñòâî êîðòå- æåé èñïîëüçóåòñÿ äëÿ ïîääåðæêè äîïîë- íèòåëüíûõ îïåðàöèé íàïîäîáèå collect èëè copy-collect, êîãäà èç ðàñïðåäåëåí- íîãî ïðîñòðàíñòâà êîðòåæåé âîçâðàùà- åòñÿ íå îòäåëüíûé êîðòåæ, à ñïèñîê êîð- òåæåé, êîòîðûå íåîáõîäèìî ñîõðàíèòü. Îáùàÿ ñõåìà âçàèìîäåéñòâèÿ ìåæäó êëèåíòîì è ñåðâåðîì, ó÷èòûâàÿ ëîêàëü- íîå ïðîñòðàíñòâî êîðòåæåé, ïðåäñòàâëå- íà íà ðèñ. 9, îòêóäà âèäíî, ÷òî ëîêàëü- íîå ïðîñòðàíñòâî äàííûõ è ñåðâåð èñ- ISSN 0023-1274. Êèáåðíåòèêà è ñèñòåìíûé àíàëèç, 2010, ¹ 4 121 def in (antiTuple : List[LindaType]) : List[LindaType]= { println(" db in") val signature = LindaTuple.getSignature(antiTuple) //ïîëó÷åíèå ñèãíàòóðû êîðòåæà val tuple = chooseTuple(find(antiTuple)) //ïîèñê è âûáîð êîðòåæà if (db(signature).length == 1) //åñëè âûáðàííûé êîðòåæ åäèíñòâåííûé ñ òàêîé ñèãíàòóðîé db - signature //òî óäàëèòü ñèãíàòóðó èç îòîáðàæåíèÿ else db(signature) = deleteTuple(tuple,db(signature)) //óäàëåíèå êîðòåæà èç áàçû äàííûõ tuple //âåðíóòü êîðòåæ } Ðèñ. 6 def in (input : Any) : List[LindaType] = { val socket = new Socket(ia, port) //ñîçäàíèå íîâîãî ñîêåòà val outStream = new ObjectOutputStream(new DataOutputStream(socket.getOutputStream())) // ñîçäàíèå íîâîãî âûõîäíîãî ïîòîêà val inStream = new ObjectInputStream (new DataInputStream(socket.getInputStream())) //ñîçäàíèå íîâîãî âõîäíîãî ïîòîêà val antiTuple = LindaTuple.createLindaTuple(input) //ñîçäàíèå êîðòåæà Linda outStream.writeObject(("in","",antiTuple)) //ïåðåäà÷à çàïðîñà íà ñåðâåð val tuple = inStream.readObject().asInstanceOf[List[LindaType]] //÷òåíèå îáúåêòà îò ñåðâåðà outStream.close() //çàêðûòèå ïîòîêîâ inStream.close() tuple //âîçâðàùåíèå íàéäåííîãî êîðòåæà ïðîöåññà} Ðèñ. 7 case "in" => {while (db.find(tuple).isEmpty) db.wait() outStream.writeObject(db.in(tuple)) } Ðèñ. 8 Process Localspace Database ServerClient uses «uses»«uses» «unstantiates» «unstantiates» Ðèñ. 9 ïîëüçóþò îäèí è òîò æå êëàññ áàçû äàííûõ äëÿ ñîçäàíèÿ ïðîñòðàíñòâà êîðòåæåé. Äëÿ ïðîöåññà ëîêàëüíîå ïðîñòðàíñòâî âûïîëíÿåò òå æå ôóíêöèè, ÷òî è ñåðâåð äëÿ êëèåíòà, à èìåííî, ïåðåäàåò çàïðîñû ïðîöåññà ê áàçå äàííûõ. 2.7. Äîïîëíèòåëüíûå îïåðàöèè.  ýòîé èìïëåìåíòàöèè Linda äëÿ Scala ðåà- ëèçîâàíî òàêèå äîïîëíèòåëüíûå ïðèìèòèâû èëè îïåðàöèè: collect, copy-collect, query, copyquery. Îïåðàöèè copy-collect è collect îïèñûâàëèñü ðàíåå. Äâå ïîñëåäíèå îïåðàöèè òàêæå èìåþò ïðåäèêàòíóþ ôîðìó, êîòîðàÿ íå ïðèîñòàíàâëèâàåò âûïîë- íåíèå ïðîöåññà, à âîçâðàùàåò çíà÷åíèå, ðàâíîå true èëè false. Îïåðàöèÿ query ïîõî- æà íà îïåðàöèþ collect ñ ðàçëè÷èåì â òîì, ÷òî çäåñü óêàçûâàåòñÿ êîëè÷åñòâî ýëå- ìåíòîâ, êîòîðîå íåîáõîäèìî âîçâðàòèòü èç ïðîñòðàíñòâà êîðòåæåé. Ñîîòâåòñòâåííî îïåðàöèÿ copyquery íåñåò òó æå ñàìóþ ôóíêöèîíàëüíîñòü, ÷òî è ïðåäûäóùèå, çà èñêëþ÷åíèåì òîãî, ÷òî îíà íå óäàëÿåò íàéäåííûå êîðòåæè èç ïðîñòðàíñòâà êîðòåæåé. ÇÀÊËÞ×ÅÍÈÅ Î÷åâèäíî, ÷òî äëÿ íàõîæäåíèÿ ðåøåíèÿ ñëîæíûõ è ìàñøòàáíûõ âû÷èñëèòåëüíûõ ïðîáëåì äîëæíû èñïîëüçîâàòüñÿ è óñîâåðøåíñòâîâàòüñÿ ìåòîäû ðàñïàðàëëåëèâàíèÿ è êîîðäèíàöèè îòäåëüíûõ âû÷èñëèòåëüíûõ çàäà÷. Ýôôåêòèâíîå ïðîãðàììíîå ðåøå- íèå èõ ðåàëèçàöèè ïðåäëîæèë Ä. Ãåëåðòåð. Ðàçðàáîòàííóþ èì êîîðäèíàöèîííóþ ìî- äåëü Linda ìîæíî äîáàâëÿòü ïðàêòè÷åñêè ê ëþáîìó ÿçûêó ïðîãðàììèðîâàíèÿ. Ìîäåëü Linda áàçèðóåòñÿ íà êîíöåïöèè îáùåãî ïðîñòðàíñòâà äàííûõ, äëÿ äîñòóïà ê êîòîðîìó ó ïðîöåññîâ åñòü íåáîëüøîé, íî äîñòàòî÷íûé íàáîð ïðèìèòèâîâ èëè îïåðàöèé, ñ ïîìîùüþ êîòîðûõ ïðîöåññ ìîæåò ðàçìåñòèòü, ïðî÷èòàòü èëè èçúÿòü êîðòåæ èç îáùåãî ïðîñòðàíñòâà äàííûõ. Ïðîöåññû îáùàþòñÿ ëèøü ÷åðåç îáùåå ïðîñòðàíñòâî äàííûõ, êîòî- ðîå ïîçâîëÿåò ðàçíåñòè èõ â ïðîñòðàíñòâå è âðåìåíè (space and time decoupling).  íàñòîÿùåé ðàáîòå îïèñàíî ñîçäàííóþ íàìè áèáëèîòåêó êëàññîâ, íàïðàâëåí- íóþ íà èìïëåìåíòàöèþ (http://www.ukma.kiev.ua/~gor/LindaforScala/) Linda äëÿ ÿçû- êîâ ïðîãðàììèðîâàíèÿ Scala (ÿçûêîâîé ïîääåðæêè êîìïîíåíòíîãî ïðîãðàììíîãî îáåñïå÷åíèÿ). Áèáëèîòåêà èñïîëüçóåò êëèåíò-ñåðâåðíóþ àðõèòåêòóðó, áàçó äàííûõ äëÿ ïðåäñòàâëåíèÿ ïðîñòðàíñòâà êîðòåæåé.  íåé èìïëåìåíòèðîâàí ìåõàíèçì ïî- èñêà ñîîòâåòñòâèé, «ïðèìèòèâíûå» è äîïîëíèòåëüíûå îïåðàöèè. Áèáëèîòåêà ìîæåò èñïîëüçîâàòüñÿ äëÿ ðàçðàáîòêè ðàñïðåäåëåííûõ ïàðàëëåëüíûõ ïðèëîæåíèé. Îïèñàííàÿ áèáëèîòåêà íóæäàåòñÿ â ñðåäå ðàçðàáîòêè Eclipså [7] ñ óñòàíîâëåí- íûì ïëàãèíîì äëÿ ðàáîòû ñ ÿçûêîì Scala èëè îòäåëüíûé ïàêåò ñ èíòåðïðåòàòîðîì êîìàíäíîé ñòðîêè è êîìïèëÿòîðîì, êîòîðûé ìîæíî íàéòè íà ñàéòå Scala [8]. Ðàçðàáîòàííàÿ áèáëèîòåêà êðîñïëàòôîðìíàÿ, ïîñêîëüêó ÿçûê Scala èñïîëüçóåò Java äëÿ ðàáîòû è êîìïèëèðóåòñÿ â áàéò-êîä Java. Áèáëèîòåêà ðàçðàáîòàíà â ñðåäå Mac OS X âåðñèè 10.5.7 ñ óñòàíîâëåííîé Java 2 Runtime Environment âåðñèè 1.5.0_16, âåðñèåé Eclipse SDK 3.4.2 è Scala 2.7.4. ÑÏÈÑÎÊ ËÈÒÅÐÀÒÓÐÛ 1. Ì î ä å ë ³, ìåòîäè òà òåõíîëî㳿 ïàðàëåëüíîãî ïðîãðàìóâàííÿ / Ï.². Àíäîí, À.Þ. Äîðîøåíêî, Î.À. Ëå- òè÷åâñüêèé, Î.Ë. Ïåðåâîç÷èêîâà òà ³í. // Ñòàí òà ïåðñïåêòèâè ðîçâèòêó ³íôîðìàòèêè â Óêðà¿í³. — Êè¿â: Íàóê. äóìêà, 2010. — Ñ. 242–258. 2. http://folding.stanford.edu/ 3. à ë è á î â å ö Í . Í . , Ô å ä î ð ÷ å í ê î  . Ì . Óïðîùåííàÿ èíôðàñòðóêòóðà äëÿ òðàíñôîðìàöèè XML-ìîäåëåé // Êèáåðíåòèêà è ñèñòåìíûé àíàëèç. — 2010. — ¹ 1. — C. 105–111. 4. G e l e r n t e r D . Generative communication in Linda // ACM Transact. on Programming Languages and Systems (TOPLAS). — 1985. — 7, N 1. — P. 80–112, http://www.ece.rutgers.edu/~parashar/Classes/03-04/ ece572/papers/gencommlinda.pdf 5. http://www.epfl.ch 6. O d e r s k y M . , S p o o n L . , V e n n e r s B . Programming in Scala, http://www.artima.com/shop/pro- gramming_in_scala 7. http://www.eclipse.org/ 8. http://www.scala-lang.org/ Ïîñòóïèëà 09.04.2010 122 ISSN 0023-1274. Êèáåðíåòèêà è ñèñòåìíûé àíàëèç, 2010, ¹ 4