Lavr wrote:"общие фразы, тра-ля-ля
"
jdigreze просил - не хочу его разочаровывать в его прогнозе...
дело в том, что я не хочу и не собираюсь весь софт для "Спеца" переписать...
Я читал тему сначала и заинтересовался вот этим:
Вот дословное содержимое вышеприведённого документа:
Code: Select all
RW1 КАК ЯЗЫК ПРОГРАММИРОВАНИЯ ПАРАЛЛЕЛЬНЫХ ПРОЦЕССОВ
----------------------------------------------------
Copyright (c) 2002, Alexander Shabarshin (shaos@mail.ru)
В статье затрагивается возможность использования языка
программирования роботов RW1 в качестве языка
параллельных процессов.
Язык RW1 к версии 2.0 прошел путь от ассемблероподобного
языка к языку типа С (http://shaos.ru/papers/rw1_r.htm).
Чтобы представить специфику языка, приведем пример простой
программы:
robot "Program 1"
author "A.Shabarshin"
+rw1_std.rwi
main()
{
while(1)
{
// вечный цикл
}
}
Данная программа не делает ничего, но в ней можно увидеть
то, что должно быть обязательно в любой RW1 программе.
Это ключевое слово ROBOT, за которым следует имя программы
в кавычках. Слово AUTHOR, за которым идет имя автора
программы в кавычках. Основная функция программы main(),
которая должна быть самой первой функцией программы.
Кроме того, внутри программы организуется вечный цикл.
В файле RW1_STD.RWI определены некоторые полезные макросы.
Будем подразумевать, что мы используем подход RW1P1 -
Robot Warfare 1 Platform 1, что может быть перенесено и
на RW1P2 (см. http://shaos.ru/papers/rw1_r.htm#RW1P1).
В среде исполнения может быть запущено несколько роботов
(программ), которые могут взаимодействовать друг с другом
посредством сообщений. Каждый робот в системе имеет
свой уникальный идентификационный номер, который можно
узнать, прочитав регистр I. Например, так:
id=I; say "&id "
Идентификаторы присваиваются начиная с 1. Идентификатор
0 обозначает всех роботов в системе (для широковещательных
сообщений).
Самым простым типом сообщений является передача одного
числового значения с помощью команды SEND, которое
может быть принято командой RECV. Пример:
send -13 10 // отправить роботу с номером 10 число -13
recv info // если буфер не пуст, принять число и
// сохранить его в переменной info
Команда RECV является очень информативной - кроме
сохранения принятого числа, она располагает некоторую
информацию в регистрах робота: регистр N - порядковый
номер робота-передатчика (если N равен 0, то буфер
принятых сообщений пуст); в регистрах X и Y записываются
относительные координаты робота-передатчика (в случае,
если пространственная привязка имеет смысл); в регистр
K помещается значение времени, в которое был отправлен код.
Такое почисловое взаимодействие не предназначено для
передачи больших объёмов данных между роботами.
Более мощным средством межпроцессного обмена языка RW1,
появившемся в версии 2.1, это прием/передача "пакетов".
Итак, что же такое пакет в языке RW1? Пакет - это массив
чисел, первое из которых обозначает количество оставшихся.
Например:
def pack1[5] = {4, 1,2,3,4}
В данном случае создается массив pack1, который является
RW1-пакетом с длиной 4. Этот пакет можно передать в
качестве сообщения другому роботу с помощью команды SENDP:
sendp pack1 10 // отправить пакет роботу 10, или
sendp pack1[0] 10 // то же самое
Если вы смогли догадаться, можно отправить и часть массива,
и даже не с нулевого элемента. Пример:
sendp pack1[2] 10 // отправляем пакет c ячейки 2 - в ней
// мы имеем число 2, поэтому отправляем следующие 2 числа
Прием пакета осуществляется командой RECVP:
def pack0[10]
recvp pack0
if(n) say "принят пакет размером &pack0[0] ячеек"
else say "ошибка приема"
Для копирования пакетов используется команда COPYP:
copyp target source // копирование пакета из source
Интересно отметить, что пара SEND и RECVP совместимы.
Только при этом одно число будет превращаться в пакет из
двух значений, первое из которых будет 1. Вторая пара
SENDP и RECV совместима лишь частично - при этом происходит
потеря всех данных за исключением длины пакета. Так
что если вы решили использовать для межпроцессного
взаимодействия пакеты, не пользуйтесь командой RECV,
а приходящие отдельные сообщения (посланные командой
SEND) успешно принимаются пакетной командой RECVP
(как было указано выше).
Итак, типовая программа-робот будет выглядеть так:
robot "Program 2"
author "A.Shabarshin"
+rw1_std.rwi
main()
{
// определение и инициализация массивов
def buff[256];
time = 0 // определение момента активности
while(1)
{ // вечный цикл
if(time>=T)
{ // некие действия
send 111 // послать широковещательное сообщение
// возможно тут будет переназначение time
}
recvp buff // получение сообщения
if(n)
{ // анализ полученного сообщения
say "> &n &x &y &k received"
}
}
}
Следует разъяснить что у нас будет храниться в переменной
TIME. Здесь мы будет сохранять метку времени, по достижению
которой наш робот должен проявить некую самостоятельную
активность. Регистр T используется для контроля времени -
в нем хранится количество тиков от момента старта системы.
Если мы имеем привязку к реальному времени (+RW1P1.RWI),
то в T хранится время в десятых долях секунды (другое
значение делителя может быть установленно отдельно).
Кроме того, активность будет проявляться при получении
какого-либо сообщения извне.
Попробуем написать робота, который определяет количество
своих собратьев (экземпляров данного процесса) в системе.
robot "Program 3 - count me"
author "A.Shabarshin"
+rw1_std.rwi
+rw1p1.rwi
main()
{
def buff[256];
def robots[100]; // надеюсь их будет не больше 100 ;)
nrobot = 0 // начальное значение счетчика
time = 0 // определение момента активности
while(1)
{ // вечный цикл
if(time>=T)
{ // некие действия
send 111 // послать широковещательное сообщение
time = time + @TIME_SEC(3) // повторить через 3 секунды
}
recvp buff // получение сообщения
if(n)
{ // анализ полученного сообщения
}
}
}
Александр Шабаршин 14.01.2002
P.S. содержимое упомянутого в тексте документа rw1_r.htm можно посмотреть тут:
viewtopic.php?t=9439