Robby - расширение языка Robot Warfare 1 (RW1)

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

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23722
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Robby - расширение языка Robot Warfare 1 (RW1)

Post by Shaos »

Обновил сырцы ROBBYC в репе поправив багу, которая проявлялась на 16-битных системах с командой PUSH - неправильно компилировалось например сравниение if(sum==#FFFF):

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

Бага с CONTINUE, а также невозможность использования двоеточия : внутри SAY пока остаются "известными" багами...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23722
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Re:

Post by Shaos »

Shaos wrote:Еще можно сделать переменные типа беззнаковый байт, добавляя к имени суффикс $ - внутри такие однобайтовые переменные будут представлены как половинки обычных переменных, соответственно надо будет добавить 2 постфиксных спецоператора, которые могут выделять младший байт переменной ' и старший байт переменной " - препроцессор будет их вставлять в выражения вместо вызова соответствующих байтовых переменных
$ уйдёт под строки, а байтовые переменные можно помечать суффиксом ` (prime - значок на клавише левее 1). В будущем переменные имеющие тип плавающая точка можно помечать суффиксом ~ (расположено на той же клавише левее 1). Далее суффикс ! может обозначать обращение к половинкам слова - VAR!L к младщей и VAR!H к старшей - причём такая запись будет допустима как справа, так и слева от присваивания (придётся добавить новые команды в длинные выражения - LOADL, SAVEL, LOADH и SAVEH работающие со старшими половинками переменных, а также надо будет как-то помечать выражения, внутри которых операторы работают с байтами, а не со словами - либо другим кодом, отличным от 0x40, либо специальной командой-префиксом). Препроцессор будет подменять обращения к однобайтным переменным на обращения к половинкам неявных 16-битных переменных, добавленных препроцессором - например VAR1' будет заменено на _1!L, а VAR2' на _1!H (или лучше ! и !! сделать?)...

P.S. Можно многобайтовые целые поддержать задавая их размер в байтах после ' типа VAR'4 и VAR'8, тогда обращение к их отдельным байтам можно организовать через VAR!0, VAR!1 и т.д. (а надо ли?). Препроцессор будет заводить нужное количество массивов для представления таких чисел, а наряду с командой длинного выражения 0x40 можно добавить 0x4B для байтовых выражений, 0x4F для выражений с плавающей точкой, а также 0x50+N (где N>=3) для выражений работающих с многобайтовыми данными (ограничиться сверху скажем 12-байтовыми числами)...

P.P.S. Но серьёзные расширения байткода будут не раньше версии 3...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23722
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Robby - расширение языка Robot Warfare 1 (RW1)

Post by Shaos »

Ещё наверное имело бы смысл добавить джавовский беззнаковый сдвиг >>> при котором число слева всегда нулями дополняется (в джаве нету беззнаковых типов, как собственно и в Robby, поэтому беззнаковый сдвиг нужен как отдельная операция). Также можно добавить оператор возведения в степень ** как в языках Algol, Basic, Fortran, JavaScript, OCaml, Pascal, Perl, Python, Ruby и Smalltalk...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23722
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Robby - расширение языка RW1

Post by Shaos »

Shaos wrote:
Shaos wrote:В первую очередь надо поддержать вышепредложенный вариант DEF STRING$="aaa" (даже без квадратных скобок т.к. необходимый размер массива в словах будет вычисляться компилятором).
Во вторую очередь надо реализовать расширение for: for(A in 1..10) (как в аде или руби) и for(A in array) (как в джаваскрипте), причём на уровне препроцессора!
Также хочу количество регистров увеличить до 26, дабы охватить все буквы алфавита, а вот с локальнымм переменными надо подумать...
Цикл for(A in 1..10) превращается в тоже самое как и for(A=1;A<=10;A++) - это просто, а вот с for(A in array) надо помудрить ибо A в данном случае не индекс, а значение соответствующего элемента из массива, т.е. придётся для хранения индекса заводить "скрытую" переменную _1 (и далее _2, _3 и т.д.), которая будет инкрементироваться для доступа ко всем элементам массива array и A в цикле "под водой" будет присваиваться значение array[_1]. Обязательность скобок можно отменить - тогда синтаксис циклов будет похож на Rust. Аналогичный подход со скрытыми переменными, которые генерит сам компилятор, я планировал использовать для реализации вызовов функций в составе арифметических выражений.
Тут по ходу можно поддержать обход строки через for C in string$ где строка обходилась бы не пословно, а побайтно, т.е. препроцессор будет это превращать примерно вот в это:

Code: Select all

_1=0
do
{
 _2 = string$[_1>>1]
 if(_1&1) C=_2!!
 else C=_2!
 ...
 _1++
} while(C!=0)
P.S. Можно даже пойти дальше и сделать так, чтобы запись вида string$[idx] в случае строки (имя переменной заканчивается на $) индексировала бы не слова, а байты! Тогда правила препроцессора для цикла for-in в случае строки станут проще:

Code: Select all

_1=0
do
{
 С = string$[_1]
 ...
 _1++
} while(C!=0)
P.P.S. Можно ещё придумать способ получения размера массива по его имени - типа array!? (компилятор будет подменять это на константу во время компиляции)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23722
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Robby - расширение языка Robot Warfare 1 (RW1)

Post by Shaos »

Выкатил новую версию ROBBYC v2.3.4 в которой чуть более тщательно проверяю имя входного файла робота (раньше оно прям сразу шло в TextLoad), а также добавил новую опцию -n которая запрещает инклуды (нужно для запуска компилятора на сервере с произвольными входными файлами):

Code: Select all

ROBBYC - Robby Preprocessor & Compiler v2.3.4 (Jan 22 2025)
Copyright (c) 1998-2025, Alexander "Shaos" Shabarshin
http://nedoPC.org (E-mail: me@shaos.net)

Usage:
   ROBBYC [options] FILE.R
   options :
        -h : help
        -p : create preprocessor file (.R!)
        -l : create listing file (.RLS)
        -r : create JSON file (.RJS)
        -d : append debug info
        -n : disable includes
https://gitlab.com/nedopc/sdk/-/tree/master/robbyc
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23722
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Robby - расширение языка Robot Warfare 1 (RW1)

Post by Shaos »

Надо CI/CD тесты SDK добавить, а то ведь они уже есть, но пока не запускаются автоматически...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23722
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Robby - расширение языка Robot Warfare 1 (RW1)

Post by Shaos »

На новом сервере стоит GCC v12.2 и собранный в нём robbyc косячит - вот такой робот с софтверным рандомом (как он был у меня написан ещё в 2002 году):

Code: Select all

robot "bug-gcc-12.2"
author "Shaos"
main()
{
 Rand = 11
}

Random() // A-RANGE => C-RESULT L=C
{
  Rand = 0x6255*Rand+0x3619
  RandH = Rand&0xFF00
  RandL = Rand&0x00FF
  C = RandH|((RandH>>8)^RandL)
  C = C&0x7FFF
  if(A) C=C%A
  (C)
}
выдаёт ошибку FULL STACK:

Code: Select all

BUG.R(13): C = RANDH|((RANDH>>8)^RANDL)

ERROR 33: Bad expression
	FULL STACK
а на домашнем линухе с robbyc собранным в GCC v8.3 этот же робот компилируется без проблем :econfused:
Я тут за главного - если что шлите мыло на me собака shaos точка net
Post Reply