Rgrid - виртуальная машина роботов в браузере (JavaScript)

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Виртуальная машина роботов в браузере (JavaScript)

Post by Shaos »

Shaos wrote:Робот посложнее:

Code: Select all

robot "Test2"
author "Shaos"
color AABBCC
main()
{
 i0 = 0;
 for(i1=0;i1<16;i1++){
 for(i2=0;i2<16;i2++){
   select i1 i2
   set i0
   i0=i0+1
 }}
}
Превратится уже вот в это:

Code: Select all

{"robot":"Test2",
 "author":"Shaos",
 "varm":3,
 "vars":[],
 "negs":[],
 "regs":[],
 "color":"#AABBCC",
 "code":[32,1,0,0,0,0,0,32,1,1,0,0,0,0,64,12,245,14,255,245,1,0,243,245,16,0,147,244,66,1,14,255,
        0,127,0,32,1,2,0,0,0,0,64,12,245,14,255,245,2,0,243,245,16,0,147,244,66,1,14,255,0,109,0,105,
        1,1,0,1,2,0,106,1,0,0,0,0,0,64,12,245,0,0,245,0,0,243,245,1,0,160,244,64,12,245,2,0,
        245,2,0,243,245,1,0,160,244,67,0,42,0,64,12,245,1,0,245,1,0,243,245,1,0,160,244,67,0,14,0,0,
        255],
 "platform":1
}
P.P.S. Компилятор RW1C теперь сам указывает платформу. Если у робота нет оборудования, цвета и картинки, то это плтформа 2 (RW1P2). Если у робота нет оборудования, но есть цвет или картинка, то это платформа 1 (RW1P1). Если у робота есть оборудование, то это платформа 0 (RW1P0 или классическая игра "Robot Warfare 1").
Чото подумалось, что надо наверное нечто поплотнее нежели массив чисел генерить - например base64...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: RW1 в браузере

Post by Shaos »

Shaos wrote:
Shaos wrote:В данный момент пишу JS-транслятор RW0-байткода в JS - пока вроде всё получается так, как и предполагалось :dj:

P.S. Виртуальная машина Roberta для Webitable будет называться Weberta
Ввиду того, что я Roberta переименовал в Robby пришло время переделать и JS-интерпретатор - на днях я склеил вместе Webitable и Weberta и получил Rgrid.js :)

https://gitlab.com/nedopc/sdk/blob/master/rgrid/Rgrid.js

теперь надо Circuits.CC подправить, чтобы юзал одну новую либу вместо старых двух...
поправил - теперь у меня везде только Rgrid.js
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScrip

Post by Shaos »

Можно попробовать портировать Rgrid.js на PhoneGap / Cordova и делать приложения для телефонов (iPhone & Android) :mrgreen:

P.S. PhoneGap адобэ отключает 1 октября насовсем (я по нему курс прослушал 2 года назад когда заканчивал обучение в NYU) - после этого остаётся только голая опенсорцная Cordova, в которой наряду с Android и iOS появилась дополнительная платформа Electron, предназначенная для запуска JS-приложений на обычных компьютерах в виде окна (там внутри движок хрома) на Linux, Windows и MacOS: https://www.electronjs.org/docs/tutorial/application-distribution
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScrip

Post by Shaos »

Вот например минимальный "робот" для онлайна (всё это лежит в репе nedoPC SDK https://gitlab.com/nedopc/sdk/-/tree/master/rgrid):

Code: Select all

// robbyc -r EXAMPLE.R
// echo var robot = >robot.js
// cat EXAMPLE.rjs >>robot.js

author "Shaos"
robot "Example"
main()
{
 while(1)
 {
   code = 0
   recv code
   if(N==0) continue
   if(N==#FFFF) // mouse click
   {
      select x y
      set #FF
   }
 }
}
Этот робот ловит мышиный клик на сетке клеток и ставит в эту клетку символ с кодом 0xFF - компилируется он вот в такой JSON:

Code: Select all

var robot = {"robot":"Example",
 "author":"Shaos",
 "varm":1,
 "vars":[],
 "negs":[],
 "regs":[],
 "color":"#FFFFFF",
 "code":[64,7,245,14,255,245,1,0,244,66,1,14,255,0,91,0,32,1,0,0,0,0,0,98,1,0,0,64,12,245,14,255,
        245,3,255,243,245,0,0,144,244,66,1,14,255,0,52,0,67,0,0,0,64,12,245,14,255,245,3,255,243,245,255,255,
        144,244,66,1,14,255,0,87,0,105,1,0,255,1,1,255,106,0,255,0,0,0,0,67,0,0,0,0,255],
 "platform":2
}
и вот такой HTML этого робота подключает (ещё есть подкаталог giftiles с файлами картинками символов):

Code: Select all

<HTML>
<HEAD><TITLE>Rgrid example</TITLE>
<META HTTP-EQUIV="Content-Language" content="en">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8">
<SCRIPT type="text/javascript" src="Rgrid.js"></SCRIPT>
<SCRIPT type="text/javascript" src="robot.js"></SCRIPT>
</HEAD>
<BODY BGCOLOR=#000000 TEXT=#00AA00 LINK=#00AAAA>
<p id="here" align=center>Rgrid requires a modern web-browser to work properly...</p>
<font size=-4>
<p id="pow" align=center>Powered...</p>
</font>
</BODY>
<script type="text/javascript">

$R.prefix = "giftiles/";

$_("pow","Powered by " + $R.powered());

function action(x,y) {
 $R.event(0,-1,1,x,y);
}

if($R.grid('here',80,50,action)>0) {
 $R.add(robot);
 $R.start();
}

</script>
</HTML>
Создаётся сетка клеток 80x50, которая выглядит вот так (несколько клеток уже покликано мышою):
Screenshot from 2023-04-13 22-11-31.png
Уже сейчас можно добавлять больше одного робота на сетку (и теоретически больше одной сетки на страницу) и такие роботы могут общаться друг с другом и внешним миром, а вот чего в данный момент не сделано, так это сохранение состояния системы с возможностью передачи его на другой узел сети для продолжения работы...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScrip

Post by Shaos »

После экспериментов с HTML контролами внёс некоторые изменения в Rgrid.js:

https://gitlab.com/nedopc/sdk/-/tree/master/rgrid

Code: Select all

v0.7 (2023-04-17)

 - Added ability to send string as an argument of event
 - Fixed RECVP implementation

v0.6 (2023-04-16)

 - Fixed SEND implementation (previosly it gave JS syntax error)
 - RECV after SENDP returns 1st word of data, not size (and we ignore the rest of the packet)

v0.5 (2023-04-15)

 - Fixed implementation of COMMAND
Также добавил линк на репу и историю изменений в первое сообщение топика...

P.S. При подготовке v0.7 нашёл косяк в препроцессоре компилятора Robby - CONTINUE внутри FOR не меняет счётчик :oops:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScrip

Post by Shaos »

Shaos wrote:Уже сейчас можно добавлять больше одного робота на сетку (и теоретически больше одной сетки на страницу) и такие роботы могут общаться друг с другом и внешним миром..
Как оказалось в Rgrid пока нельзя добавлять больше одного робота на сетку :oops:

Надо разбираться что там косячит, а так можно на этом threaded engine для примера насадить ещё и другие виртуальные машины - например 8080/8085 или даже RISC-V! :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScrip

Post by Shaos »

Выложил Rgrid v0.8

https://gitlab.com/nedopc/sdk/-/tree/master/rgrid

Code: Select all

v0.8 (2023-04-30)

 - Added sourcecode URL
 - Allowed $_ to control checkbox or radio as elements with value
 - Added function $append
 - Function $$_ was renamed to $$$
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScript)

Post by Shaos »

Решил что-то заморочится с документацией своего Rgrid-а - я немого описывал его праотца Webitable по мере создания в 2012 году, но по хорошему нужна официальная подробная документация в одном месте. Обнаружилось, что Google AI Gemini может по JS-коду генерировать доку по английски и по русски (и даже предлагать улучшения!) и я буду публиковать описание функций как они есть на сегодняшний день тут ниже и в специально созданном сегодня англоязычном топике (после ручного редактирования конечно)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScript)

Post by Shaos »

Функция $(s)

Эта функция является простым "обёрточным" элементом для document.getElementById(). Это сокращение для получения HTML-элемента по его ID. Итак, если у вас есть элемент в HTML, например

Code: Select all

<div id="myDiv"></div>
вы можете получить ссылку на него с помощью

Code: Select all

$("myDiv")
Это распространенная практика для сокращения кода и повышения его читаемости.

 notes
Вот что я писал про функцию $ в 2012 году:
Shaos wrote: Функцию $ я подсмотрел во фреймворке http://PrototypeJS.org, там правда допускается передавать несколько аргументов - при этом оно возвращает массив элементов, но я честно говоря не вижу в этом особого смысла.
...
Функция $, подменяющая собой getElementById также имеется в JS-фреймворке http://MooTools.net.

Функция $_(s[,v])

Эта функция более сложная и служит двойной цели: получение значения элемента и установка значения элемента. Она принимает ID элемента (s) в качестве первого аргумента. Второй аргумент (v) является необязательным.
  • Получение значения (когда 2й аргумент v НЕ предоставлен):
    • Сначала получает элемент с помощью функции $(s).
    • Если элемент существует:
      • Если элемент является флажком (checkbox) или переключателем (radio button), он возвращает "1", если он отмечен, и "0", если нет;
      • В противном случае, если элемент имеет свойство value (например, поля ввода, списки выбора и т.д.), он возвращает значение этого свойства;
      • Если элемент не имеет свойства value (например, <div> или <span>), он возвращает innerHTML элемента;
    • Если элемент не существует, он фактически возвращает null (начиная с v0.9).
  • Установка значения (когда 2й аргумент v предоставлен):
    • Сначала получает элемент с помощью функции $(s).
    • Если элемент существует:
      • Если элемент является флажком или переключателем:
        • Он проверяет значение 2го аргумента v. Если оно равно "N", "F" или "off", он снимает отметку с элемента. Если оно равно "Y", "T", "on" или истинному значению (с помощью eval("("+v+")")), он устанавливает отметку на элементе. Это 'eval' потенциально опасно, если 2й аргумент 'v' поступает от пользователя, поскольку оно может выполнять произвольный JavaScript. В целом, лучше избегать 'eval' и использовать более надежные методы для проверки типа.
        • Затем он обновляет значение v до "1" или "0" в зависимости от нового состояния флажка/переключателя;
      • В противном случае, если элемент имеет свойство value, он устанавливает свойство value равным значению 2го аргумента v;
      • В противном случае (если свойство value отсутствует), он устанавливает innerHTML элемента равным значению 2го аргумента v;
      • Наконец, он возвращает (потенциально измененное) значение v.

 notes
Вот что я писал про функцию $_ в 2012 году:
Shaos wrote: Также в Prototype.js есть функция $F, возвращающая значение value элемента формы по идентификатору элемента - я хочу сделать аналогичную вещь, но расширить её также на innerHTML, причём с возможность как чтения, так и записи

Функция $$(s)

Эта функция является функцией-селектором обёрткой над $R.select (см. далее), которая использует механизм кеширования для хранения выбранных элементов (этот кеш можно сбросить с помощью функции $R.clear). Элементы могут выбираться по префиксу или по маске со звёздочкой. Функция принимает строку и возвращает массив элементов веб-страницы.

 notes
Вот что я писал про функцию $$ в 2012 году:
Shaos wrote: Также в jQuery и MooTools есть средства выдачи списка элементов по тегам с фильтрацией (производные от getElementsByTagName) - я не вижу в этом большого смысла - с моей точки зрения если ты хочешь манипулировать некими объектами веб-страницы, то присваивай этим объектам идентификаторы и манипулируй. Отсюда мысль - добавить новую функцию $$, которая будет возвращать список элементов по неполному наименованию идентификатора (например по маске)! Получается, что кроме физической иерархии элементов страницы мы можем ввести логическую иерархию - которая будет строиться по идентификаторам, к примеру точка в имени идентификатора может разделять классы и подклассы, например - "formA.button.1" и "formA.button.2" могут быть идентификаторами двух кнопок в пределах формы "formA" и по запросу $$('formA.*') будет возвращён список из двух элементов веб страницы, соответствующих кнопкам формы. Написание такой функции дело нетривиальное - т.к. чтобы исключить полный перебор элементов веб-страницы нам придётся кешировать списки элементов, которые уже запрашивались, чтобы быстрее можно было возвращать повторные запросы...

Функция $$$(s)

Эта функция получает элементы с помощью функции $$ (т.е. входной аргумент также задаёт префикс или маску для поиска), а затем извлекая ID каждого элемента с помощью функции $map (см. далее) возвращает массив строковых ID элементов.

Пример:

Code: Select all

<input type="text" id="myInput" value="Исходное значение">
<div id="myDiv">Какой-то текст</div>
<script type="text/javascript" src="Rgrid.js"></script>
<input type="checkbox" id="myCheckbox">

<script>
  console.log($("myInput")); // Возвращает элемент input
  console.log($_("myInput")); // Возвращает "Исходное значение"
  $_("myInput", "Новое значение"); // Устанавливает значение input на "Новое значение"
  console.log($_("myInput")); // Возвращает "Новое значение"

  console.log($_("myDiv")); // Возвращает "Какой-то текст"
  $_("myDiv", "Новый HTML"); // Устанавливает содержимое div на "Новый HTML"
  console.log($_("myDiv")); // Возвращает "Новый HTML"

  console.log($_("myCheckbox")); // Возвращает "0" (предполагая, что он не отмечен)
  $_("myCheckbox", "on"); // Отмечает флажок
  console.log($_("myCheckbox")); // Возвращает "1"

  console.log($$("my")); // Возвращает массив, состоящий из 3 элементов
  console.log($$$("my")); // Возвращает массив [ "myInput", "myDiv", "myCheckbox"]
</script>
Включение Rgrid.js, а также последние 2 примера были добавлены мной, а всё остальное придумал Gemini и у него по-моему очень неплохо получилось :lol:

P.S. А вот смысл функции $$ Gemini понял не до конца, поэтому я описал её сам :roll:

P.P.S. В будущем можно сделать "совместимую" версию Rgrid.js которая не будет конфликтовать по $-именам с другими фреймворками (jQuery или Prototype) - в ней функцию $ можно переименовать в $1, функцию $$ - в $2, ну и до кучи функцию $$$ - в $3...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScript)

Post by Shaos »

Выкатил слегка подшлифованную версию 0.9:

Code: Select all

v0.9 (2025-02-09)

 - $R object got field "license" with value "LGPL"
 - $R.prefix was renamed to $R.gif_prefix
 - Function $_ now returns null if element was not found
 - Initialization of opcache was moved to function $R.add
 - $R.iterate() now may have no arguments to start with document.body
 - $R.select() was modified to utilize that new feature of $R.iterate()
https://gitlab.com/nedopc/sdk/-/tree/master/rgrid?ref_type=heads

(поправил описание выше, чтобы указать, что если элемент не найден, то функция $_ теперь возвращает null вместо undefined)

P.S. Теперь надо "минимальную" версию Rgrid-0.9.min.js сгенерировать без пробелов и переводов строк, чтобы в одну строку типа как у всех взрослых дядек :lol:

P.P.S. А в будущем можно ещё и проверять наличие функций $ или $$ (если jQuery или Prototype были тоже загружены) прежде чем заводить свои:

Code: Select all

if (typeof $ === 'undefined') {
  function $(s) {
    return document.getElementById(s);
  }
}
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Rgrid - виртуальная машина роботов в браузере (JavaScript)

Post by Shaos »

Перетащил http://ternaro.com/ к себе домой и настроил его на использование Rgrid v0.9
Теперь надо http://Circuits.CC перенести и перенастроить...
Я тут за главного - если что шлите мыло на me собака shaos точка net