Макропрограммирование
В информатике . макропрограммирование — это парадигма программирования направленный на выражение макроскопического, глобального поведения всей системы агентов или вычислительных устройств. [1] В макропрограммировании локальные программы для отдельных компонентов распределенной системы компилируются или интерпретируются из макропрограммы, обычно выражаемой с точки зрения системного уровня или с точки зрения намеченной глобальной цели. [1] Целью подходов макропрограммирования является поддержка выражения макроскопического интерактивного поведения целой распределенной системы вычислительных устройств или агентов в одной программе или, аналогичным образом, содействие их коллективному разуму . [2] Его не следует путать с макросами — механизмом, часто встречающимся в языках программирования (таких как C или Scala ) для выражения правил замены частей программы.
Макропрограммирование зародилось в контексте беспроводных сенсорных сетей. программирования [3] [4] [5] и обнаружил возобновление интереса к Интернету вещей. [6] и роевая робототехника . [7] [1]
Макропрограммирование имеет схожие цели (связанные с программированием системы в глобальной перспективе) с многоуровневым программированием , хореографическим программированием и агрегатными вычислениями .
и мотивация Контекст
Программирование распределенных систем , мультиагентных систем и коллективов программных агентов (например, роев роботов ) затруднено, поскольку необходимо должным образом учитывать многие вопросы (такие как связь, параллелизм и отказы). В частности, общая повторяющаяся проблема заключается в том, как вызвать предполагаемое глобальное поведение, определяя поведение отдельных задействованных компонентов или агентов. Эту проблему можно решить с помощью подходов к обучению, таких как многоагентное обучение с подкреплением , или путем ручного определения программы управления, управляющей каждым компонентом. Однако решение проблемы с полностью индивидуальной (или одноузловой) точки зрения может быть подвержено ошибкам, поскольку, как правило, трудно предвидеть общее поведение, возникающее из сложных сетей действий и взаимодействий (ср. сложные системы и возникновение ). Поэтому исследователи начали исследовать способы повышения уровня абстракции, продвигая программирование распределенных систем с более глобальной точки зрения или с точки зрения общей цели, которую необходимо достичь коллективно.
Примеры [ править ]
СкаФи [ править ]
Следующая программа на совокупном языке программирования ScaFi. [8] [1] определяет логику управления циклом, необходимую для вычисления канала (логическое поле, в котором устройства, выдающие true
это те, которые соединяют по шаговому пути исходное устройство с целевым устройством) через большой набор расположенных устройств, взаимодействующих с соседями.
класс SelfContainedChannel расширяет AggregateProgram с помощью SensorDefinitions {
def isObstacle = sense [ Boolean ]( "препятствие" )
def isSource = sense [ Boolean ]( "source" )
def isDestination = sense [ Boolean ]( "target" )
override def main (): Boolean =
ветвь ( isObstacle ) { false } канал ( isSource , isDestination , 5 ) }
def канал ( src : Boolean , dest : Boolean , width : Double ): Boolean =
dilate ( distanceTo ( src ) + distanceTo ( dest ) <= distanceBetween ( src , dest ), ширина )
тип OB [ T ] = Встроенные функции . Ограниченный [ T ]
def G [ V : OB ]( src : Boolean , поле : V , Acc : V => V , метрика : => Double ): V =
Rep ( ( Double . MaxValue , field ) ) { dv =>
mux ( src ) { ( 0,0 , поле ) } {
minHoodPlus {
val ( d , v ) = nbr { ( dv . _1 , dv . _2 ) }
( d + metric , acc ( v ))
} } }. _2
def distanceTo ( источник : Boolean ): Double =
G [ Double ]( source , 0 , _ + nbrRange (), nbrRange ()))
def Broadcast [ V : OB ]( source : Boolean , поле : V ): V =
G [ V ]( source , field , x => x , nbrRange ())
def distanceBetween ( source : Boolean , target : Boolean ): Double =
широковещательная передача ( источник , градиент ( target ))
def dilate ( регион : Boolean , ширина : Double ): Boolean =
градиент ( регион ) < ширина
}
Что интересно отметить, так это то, что channel
функция, а также функции, которые используются для ее реализации, а именно distanceTo
, distanceBetween
, dilate
, broadcast
и т. д.
можно интерпретировать не только с точки зрения индивидуального поведения устройства, но и с макроскопической точки зрения .
В действительности, например, distanceTo(s)
используется для вычисления поля минимальных расстояний от ближайшего устройства, для которого выражение s
урожайность true
: по сути, это распределенная структура данных , которая поддерживается за счет обработки и связи с соседями самоорганизующимся способом.
Семантически такие функции определяют поведение макроуровня (или коллектива), которое создает структуру данных макроуровня (или коллектива). Такие функции/поведения макроуровня можно скомпоновать вместе, чтобы получить другую, более сложную функцию/поведения макроуровня.
полк [ править ]
Следующая программа на языке полка [4] может использоваться для расчета средней температуры, воспринимаемой всей системой:
% определение функции
doSum :: float ( float , int ) -> ( float , int );
doSum ( температура , ( сумма , счетчик )) { ( сумма + температура , счетчик + 1 ) }
% функциональная реактивная программная логика
tempRegion = rmap ( fun ( node ) { смысл ( "температура" , node ) }, world );
sumSignal = rfold ( doSum , ( 0.0 , 0 ), tempRegion )
avgSignal = smap ( fun (( sum , count )) { sum / count }, sumSignal )
BASE <- avgSignal % переместить такую информацию на базовую станцию
ПЁТ [ править ]
Следующая программа в PyoT [9] может использоваться для включения вентилятора, если средняя температура, рассчитанная несколькими датчиками, превышает определенный порог.
температуры = Ресурс . объекты . фильтр ( title = «temp» )
результаты = [ temp . GET () для температуры в температурах ]
avg = sum ( results ) / len ( results )
TEMP_THRESHOLD = 24
, если avg > TEMP_THRESHOLD :
Ресурс . объекты . получить ( title = «фанат» ) . Надевать " )
TinyDB [ править ]
В TinyDB [10] используется подход макропрограммирования, ориентированный на данные, при котором программист пишет запрос, который превращается в одноузловые операции и маршрутизацию в беспроводной сенсорной сети.
ВЫБЕРИТЕ nodeId , температура ГДЕ температура > k ОТ датчиков ПЕРИОД ВЫБОРКИ 5 минут
См. также [ править ]
- Многоуровневое программирование
- Хореографическое программирование
- Агрегатные вычисления
- Распределенных вычислений
Ссылки [ править ]
- ^ Перейти обратно: а б с Касадеи, Роберто (11 января 2023 г.). «Макропрограммирование: концепции, современное состояние и возможности макроскопического моделирования поведения». Обзоры вычислительной техники ACM . 55 (13с). Ассоциация вычислительной техники (ACM): 1–37. arXiv : 2201.03473 . дои : 10.1145/3579353 . ISSN 0360-0300 . S2CID 245837830 .
- ^ Касадеи, Роберто (01 ноября 2023 г.). «Инженерия искусственного коллективного разума: обзор концепций и перспектив». Искусственная жизнь . 29 (4). Массачусетский технологический институт Пресс: 433–467. arXiv : 2304.05147 . дои : 10.1162/artl_a_00408 . ISSN 0360-0300 .
- ^ Ньютон, Райан; Уэлш, Мэтт (2004). «Региональные потоки». Материалы 1-го международного семинара по управлению данными для сенсорных сетей совместно с VLDB 2004-DMSN '04 . Нью-Йорк, Нью-Йорк, США: ACM Press. п. 78. дои : 10.1145/1052199.1052213 .
- ^ Перейти обратно: а б Ньютон, Райан; Моррисетт, Грег; Уэлш, Мэтт (2007). «Система макропрограммирования полка». Материалы 6-й международной конференции «Обработка информации в сенсорных сетях» IPSN '07 . Нью-Йорк, Нью-Йорк, США: ACM Press. п. 489. дои : 10.1145/1236360.1236422 . ISBN 978-1-59593-638-7 .
- ^ Гуммади, Рамакришна; Гнавали, Омпракаш; Говиндан, Рамеш (2005). «Макропрограммирование беспроводных сенсорных сетей с использованием Kairos». Распределенные вычисления в сенсорных системах . Берлин, Гейдельберг: Springer Berlin Heidelberg. стр. 126–140. дои : 10.1007/11502593_12 . ISBN 978-3-540-26422-4 . ISSN 0302-9743 .
- ^ Джуниор, Ивенс Г.С.; Сантана, Талия С. де; Булькао-Нето, Ренато де Ф.; Портер, Барри Ф. (18 ноября 2022 г.). «Состояние макропрограммирования в IoT: обновление» . Журнал Интернет-услуг и приложений . 13 (1). Sociedade Brasileira de Computacao - SB: 54–65. дои : 10.5753/jisa.2022.2372 . ISSN 1869-0238 . S2CID 254365168 .
- ^ Моттола, Лука; Пикко, Джан Пьетро (2011). «Программирование беспроводных сенсорных сетей». Обзоры вычислительной техники ACM . 43 (3). Ассоциация вычислительной техники (ACM): 1–51. дои : 10.1145/1922649.1922656 . hdl : 11311/635123 . ISSN 0360-0300 . S2CID 1837434 .
- ^ Касадеи, Роберто; Вироли, Мирко; Агуцци, Джанлука; Пианини, Данило (2022). «ScaFi: Scala DSL и набор инструментов для совокупного программирования». Программное обеспечениеX . 20 . Elsevier BV: 101248. doi : 10.1016/j.softx.2022.101248 . hdl : 11585/903248 . ISSN 2352-7110 .
- ^ Аззара, Андреа; Алессандрелли, Даниэле; Боккино, Стефано; Петракка, Маттео; Пагано, Паоло (2014). «PyoT, среда макропрограммирования для Интернета вещей». Материалы 9-го Международного симпозиума IEEE по промышленным встраиваемым системам (SIES 2014) . IEEE. стр. 96–103. дои : 10.1109/sies.2014.6871193 . ISBN 978-1-4799-4023-3 .
- ^ Мэдден, Сэмюэл Р.; Франклин, Майкл Дж.; Хеллерштейн, Джозеф М.; Хун, Вэй (2005). «TinyDB: система обработки запросов для сенсорных сетей». Транзакции ACM в системах баз данных . 30 (1). Ассоциация вычислительной техники (ACM): 122–173. дои : 10.1145/1061318.1061322 . ISSN 0362-5915 . S2CID 2239670 .