Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 14:19

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 56 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Пн янв 02, 2023 16:29 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Собственно, объявляется сбор коллекции реализаций от подписчиков. Например, в машинном коде Форт будет набором call и lit (его можно по-разному сделать). Для ШК вариантов много, и для разных языков их реализация будет выглядеть различным образом. Предлагается собрать, сравнить, найти интересные варианты и неожиданные решения.

P.S. Ссылки неинтересны. Интересны конкретные фрагменты кода, из которых понятно, как это сделано.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Вт янв 03, 2023 00:11 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik писал(а):
P.S. Ссылки неинтересны. Интересны конкретные фрагменты кода, из которых понятно, как это сделано.

Как определить какой код имеет смысл рассматривать и подбирать в этот топик?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Вт янв 03, 2023 01:13 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
KPG писал(а):
Как определить какой код имеет смысл рассматривать и подбирать в этот топик?

Который является ключевым для форт-машины.

Код:
procedure TForm1.Step;
begin
  cmd := Code[pc];
  Inc(pc);
  ExecutePrimitive;
end;

procedure TForm1.Run(addr : integer);
var RDepthOnEntry : integer;
begin
  RDepthOnEntry := Rdepth;
  pc := addr;
  while ((Rdepth >= RDepthOnEntry) and (error = 0)) do
    begin
      Step;
    end;
  Rdepth := RDepthOnEntry;
end;



Код:
void Step()
{
    void(*fword)();
    fword = (void(*)())ReadCode(pc);
    pc += sizeof(CELL);
    fword();
}

void Execute()
{
    CELL RdepthOnEntry = Rdepth;
    do
    {
        Step();
    }
    while (RdepthOnEntry <= Rdepth);
}


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Вт янв 03, 2023 01:40 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik писал(а):
Который является ключевым для форт-машины.

Такой код на С из простых проектов реализаций Форт, в разной степени готовности, достаточно ключевой для того, что бы его рассматривать? :)

forth.c (рабочий вариант)
asm-cforth.c (fork, под Linux32 запустился, но не весь)
asm-cforth.c (собранный под Linux32 не запустился)
ear-cforth.c

При запуске код этих примеров расширяется и Форт кодом.
где то есть и слово как SEE помимо WORDS.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Вт янв 03, 2023 02:06 
Не в сети
Аватара пользователя

Зарегистрирован: Вт авг 12, 2008 03:18
Сообщения: 327
Откуда: Москва
Благодарил (а): 36 раз.
Поблагодарили: 7 раз.
//// java виртуальная машина

Код:
public ByteBuffer mem = ByteBuffer.allocate( sizez  /* max capacity */ );
                                      //  байт буфер работает гораздо быстрее массива байтов,
                                      // может считывать и записывать данные разных размеров
                                   //  get , getInt, getDouble, итп
                                   // put(byte b) , putInt(int i) итд
                                 // в этом случае автоматически увеличивается позиция в массиве mem
                               // другая форма методов  put и get  putInt(int i, int adr)  getInt(int adr)   
                             // данные беруться из mem c адреса adr - автоинкремент при этом не производится.


  public static final int _available_=0, _wait_=1, _busy_=2, _resume_=-1 ;
  public  int  state = 0;  //состояние вирт. машины 


public void processImage( int startIP ) {
  _HALT=false;
  state= _busy_; // 2                                                                              // state vm
  if ( startIP != _resume_ ) mem.position(startIP);  // if _resume_ (-1)  текущее position 
  while  ( ! _HALT ) {
      process();
     }
    if ( state != _wait_ )    state= _available_;
  }


 
  private void process() {  // выполняет один опкод
      int x, y, z,tmp, op ;
   op=mem.get();   
   switch(op) {
    case VM_NOP:
      break;
    case VM_LIT:     stack.push(  mem.getInt(  )   )  ;  //!!!!!!!!!!!!!!!!!! 
      break;
    case VM_DUP:    tmp=stack.pop(); stack.push(tmp);stack.push(tmp);
      break;
------------------------------------------
  }  //
}

нужен?

_________________
Линукс решает, винда глотает.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Вт янв 03, 2023 03:08 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
KPG писал(а):
Такой код на С из простых проектов реализаций Форт, в разной степени готовности, достаточно ключевой для того, что бы его рассматривать?

Нет. :) Это просто "вон там оно где-то все лежит". Понятно, что внутри все есть. Но у меня есть толстенький вопрос - где именно? Вот на какие конкретно участки кода нужно смотреть, чтобы понять, как там организована машина?

vikt писал(а):
 op=mem.get();   
   switch(op) {
    case VM_NOP:

Ну да, вот тут видно. Читаем один код и делаем switch по нему, определяя в его ветках, что именно делать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Вт янв 03, 2023 03:36 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik писал(а):
Понятно, что внутри все есть. Но у меня есть толстенький вопрос - где именно? Вот на какие конкретно участки кода нужно смотреть, чтобы понять, как там организована машина?.

Форт машина организована, после инициализации её в main() через запуск Interpret на выполнение слов .
в первом случае. Во втором случае примерно такой же вариант.
А, в названии функций, макросов отражена их функциональность для работы FVM.
Макрос NEXT, кстати, типичен для Форт.

P.S. Конечно, некоторый навык восприятия Си кода должен быть для его рассмотрения. :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Вт янв 03, 2023 13:48 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
KPG писал(а):
Форт машина организована, после инициализации её в main() через запуск Interpret на выполнение слов .
в первом случае. Во втором случае примерно такой же вариант.

Это банальности. В языках нет оператора Interpret, поэтому это не объяснение реализации. Пока приведены два варианта - передача в качестве параметра указателя на функцию void() и передача идентификатора, по которому выполняется перебор по switch.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Вт янв 03, 2023 19:59 
Не в сети

Зарегистрирован: Пн янв 28, 2019 03:10
Сообщения: 174
Благодарил (а): 20 раз.
Поблагодарили: 13 раз.
Выполнение шитого кода
Код:
void Forth::execute(int xt)
{
   int prim = code[xt];
   int orsp = rsp;
   
   core_prims(prim, xt + 1);
   
   while (orsp < rsp) {
      xt = code[ip++];
      prim = code[xt];
      core_prims(prim, xt + 1);
   }
}

Реализация примитивов
Код:
void Forth::core_prims(int prim, int pfa)
{
   switch (prim) {
      // control flow
      case LIT:
         push(code[ip++]);
         break;
      case ENTER:
         rpush();
         running = pfa - 1;
         ip = pfa;
         break;
      case EXIT:
         // автоматически завершаем все циклы текущего слова, UNLOOP не нужен
         while (lsp > 0 && lstack[lsp - 1].xt == running)
            lpop();
         rpop();
         break;
// ...много других слов, относящихся к языку...
      default:
         // app_prims реализует слова, специфичные для конкретного приложения, там тоже switch
         app_prims(this, prim);
         break;
   }
}

Цикл интерпретации программы
Код:
void Forth::do_interpret(void)
{
   int n;
   word_t *w;
   
   while (SOURCELEFT) {
      if (!getword(' '))
         break;
      w = find(word);
      if (w) {
         if (state == 0 || ISSET(w->flags, IMMEDIATE))
            execute(w->xt);
         else
            compile(w->xt);
      } else if (app_notfound && app_notfound(this, word)) {
         // app_notfound() - обработчик литералов, специфичных для приложения, он сам выполняет нужные для литерала действия
      } else if (toliteral(&n)) {
         if (state) {
            compile(lit_xt);
            compile(n);
         } else {
            push(n);
         }
      } else {
         error("%s ?", word);
      }
   }
}

Форт встраиваемый в приложение, поэтому опирается на то, что приложение реализует специфичные примитивы и обработку необычных литералов.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Ср янв 04, 2023 17:53 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Форт, реализованный на форте, как понимаю, в обсуждении не участвует, да?

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Ср янв 04, 2023 18:01 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Почему бы и нет?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Чт янв 05, 2023 17:38 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Ладненько.

Nova-forth
Код:
: INTERPRET
BEGIN
   BEGIN
   STACK? \ выкидываем ошибку, если стек ушел в минус
   PARSE-NAME DUP WHILE
   SFIND \ str len -- str len false | flags xt true
   IF
      STATE @
         IF
            FFA-COMPILE, \ скомпилировать, исполнить, развернуть и пр. в зависимости от флагов
         ELSE
            NIP EXECUTE
         THEN
   ELSE NOTFOUND-GENERATE
   THEN
   REPEAT

2DROP
REFILL
0= UNTIL   
;


Интерпретация строки

Код:
: EVALUATE   \ STR LEN
['] THROW >R
ALTERNATIVE: \ дополнительная точка входа, иногда используется, чтобы чуть прозрачнее передать ошибку возникшую при трансляции
0 >IN KEEP!         
FROM ParseBuff.simb KEEP! 
FROM ParseBuff KEEP!   
['] FALSE FROM REFILL  KEEP! \ у разбираемого источника нет функции для самообновления (ибо строка)    
['] INTERPRET CATCH

\ если возникнет ошибка, то ее поймает
\ ['] THROW >R в начале определения
;

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Пн янв 09, 2023 10:35 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
OForth.cs (C#)
Например такой код:
Код:
        void InitExtra() {
            // Print variable
            Eval(": ? @ . ;");

            // Allocate n bytes
            Eval(": allot here @ + here ! ;");

            // control flow
            Eval(": if immediate doLit [ ' 0branch , ] , here @ 0 , ;");
            Eval(": then immediate dup here @ swap - swap ! ;");
            Eval(": else immediate [ ' branch , ] , here @ 0 , swap dup here @ swap - swap ! ;");

            // loops
            Eval(": begin immediate here @ ;");
            Eval(": until immediate doLit [ ' 0branch , ] , here @ - , ;");
            Eval(": again immediate doLit [ ' branch , ] , here @ - , ;");
            Eval(": while immediate doLit [ ' 0branch , ] , here @ 0 , ;");
            Eval(": repeat immediate doLit [ ' branch , ] , swap here @ - , dup here @ swap - swap ! ;");

            // C like comment
            Eval(": // immediate [ ' \\ , ] ;");
        }


Более полное авторское описание в статье Универсальный DSL. Возможно ли это?

P.S. C# Forth on Github :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Пн янв 09, 2023 17:01 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Если разбираться предметно, а не просто ссылкой, в приведенном проекте движок основан на делегатах C# - по сути, указателей на функции в терминах C++.

Код:
public delegate void CoreCall();
public List<CoreCall> Core; // Хранилище примитивов


И далее:

Код:
public void Next() {
  while (true) {
    if (IP == 0)
      return;
    WP = (int)Mem[IP++];
    Core[(int)Mem[WP]]();
  }
}


Иными словами, это вариант, уже упоминавшийся выше, но на C#.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Собираем способы реализации Форта на разных ЯП
СообщениеДобавлено: Пн янв 09, 2023 20:06 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Форт подобный язык Quackery (основа Python) с некоторыми идеями и из Factor языка.
quackery.py
Код:
    def build(source_string):
        nonlocal source
        nonlocal the_nest
        source = source_string
        nesting = 0

        def sub_build():
            nonlocal nesting
            nonlocal current_build
            the_nest = []
            while True:
                current_build = the_nest
                word = next_word()
                if word == '':
                    return the_nest
                elif word == '[':
                    nesting += 1
                    the_nest.append(sub_build())
                elif word == ']':
                    nesting -= 1
                    if nesting < 0:
                        raise SyntaxError('Unexpected end of nest.')
                    return(the_nest)
                elif word in builders:
                    builders[word]()
                elif word in operators:
                    the_nest.append(operators[word])
                elif isinteger(word):
                    the_nest.append(int(word, 10))
                else:
                    raise NameError('Unrecognised word: ' + word)

        the_nest = sub_build()
        if nesting > 0:
            raise SyntaxError('Unfinished nest.')
        return(the_nest)

    predefined = r"""
[ 0 ]                         is false        (         --> b       )
[ 1 ]                         is true         (         --> b       )
[ dup nand ]                  is not          (       b --> b       )
[ nand not ]                  is and          (     b b --> b       )
[ not swap not nand ]         is or           (     b b --> b       )
[ = not ]                     is !=           (     x x --> b       )
...


P.S. Интересно, что автор языка активно решает задачи на нём попутно с разработкой самого проекта с rosettacode.org
и уже обошёл в таблице Форт язык Rosetta Code/Rank languages by popularity/Full list

Quackery - 48-е место
Forth - 50-e место


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 56 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB