Расширение языка Scala средствами параллелизма и распределенности с помощью координационной системы Linda
Описано реалізовану бібліотеку, спрямовану на імплементацію Linda для мови Scala (мовної підтримки компонентного програмного забезпечення). Бібліотека використовує клієнт-серверну архітектуру, базу даних для подання простору кортежів. У ній імплементовано механізм пошуку відповідностей, «примітивні»...
Gespeichert in:
| 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
|