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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: "Бессловарный" форт?
СообщениеДобавлено: Пт ноя 19, 2021 16:12 
Не в сети

Зарегистрирован: Пт ноя 19, 2021 04:00
Сообщения: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
В ходе обсуждений видел мнение, что, возможно, форт может работать без словарей - естественно, речь не идёт о "просто наборе команд", упрощении до некоего "ассемблера", ведь в этом случае форт перестанет быть фортом, даже если сохранит двухстековую архитектуру, а именно о каком-то другом способе организации. В конце концов, за исключением аппаратно-диктуемых различий между фортами, именно устройство словаря чаще всего отличается в различных реализациях.

Не нашлось ли примеров, когда форт действительно организован не через словари?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Пт ноя 19, 2021 20:21 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5034
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 61 раз.
gregorbednov писал(а):
В ходе обсуждений видел мнение, что, возможно, форт может работать без словарей

так, можно, и есть такие системы,
Но, это не означает, что нет списка слов (то есть грубо говоря есть только словарь FORTH, единственный словарь, который нельзя переключать)

gregorbednov писал(а):
В конце концов, за исключением аппаратно-диктуемых различий между фортами, именно устройство словаря чаще всего отличается в различных реализациях.

я такого не заметил. Отличия в основном не принципиальные (даже в моем случае интерфейс более-менее стандартный, хотя словари устроены значительно сложнее и позволяют больше)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Пт ноя 19, 2021 23:44 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1207
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Ну, может. Однако как-то определения искать надо) Тут еще вопрос, а что считать словарём? Будет ли считаться словарём отдельно взятая таблица со служебными данными? Или словарь это только односвязный список определений?

Но можно и вообще без этого)
Если поизвращаться, то имея HERE и зная адрес начала форт-системы, можно для поиска слов использовать обычное слово SEARCH

Медленно, ненадёжно и прикольно.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Вс ноя 21, 2021 08:06 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5034
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 61 раз.
Victor__v писал(а):
Если поизвращаться, то имея HERE и зная адрес начала форт-системы, можно для поиска слов использовать обычное слово SEARCH


А это не важно, список слов всеравно будет, и поиск будет, а, значит будет интерфейс(слова для добавления и поиска лексем и связанных с ними кода и данных).
Другое дело, что написанная на форте программа может не содержать имен слов и всей словарной структуры, что тоже делалось как минимум в нескольких системах (это при условии, что в программе рабочей не будет поиска имен слов)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Вс ноя 21, 2021 09:23 
Не в сети

Зарегистрирован: Сб ноя 20, 2021 06:51
Сообщения: 17
Откуда: Южный Урал
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
А если в системе просто будет стек, куда можно будет класть значения, и одно слово, которое будет проверять, что находится на стеке и в зависимости от этого выполняет что-либо. Будет ли это считаться за бессловарный форт?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Вс ноя 21, 2021 16:00 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7542
Благодарил (а): 21 раз.
Поблагодарили: 142 раз.
pk-fr-76-2 писал(а):
и одно слово, которое будет проверять, что находится на стеке и в зависимости от этого выполняет что-либо.

В Форте для такого используется слово EXECUTE. Это уже про внутренний движок Форта, когда мы запустили программу. А словари - про способ компиляции кода.

В целом можно же и другие структуры данных использовать. Словари используют связанный список, который в числе прочего дает экономное размещение данных в памяти. Для 70-х годов это было крайне актуально - не давать же словам фиксированные поля в 32 символа (тогда) для размещения имени. А сегодня - ну пусть даже 256 байт на имя и 10 тыс. записей в статической структуре данных. Потерю 2,5 Мбайт современные ПК и смартфоны просто не заметят.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Вс ноя 21, 2021 18:58 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5034
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 61 раз.
pk-fr-76-2 писал(а):
Будет ли это считаться за бессловарный форт?

Языковая среда программирования
Сначала было слово

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Пн ноя 22, 2021 09:39 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1207
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
mOleg писал(а):
А это не важно, список слов всеравно будет, и поиск будет, а, значит будет интерфейс(слова для добавления и поиска лексем и связанных с ними кода и данных).


Интересно) Никогда не думал что списком будет считаться просто набор безсвязных структур :D

Еще одна идея для безсловарного форта: Сделать а-ля объектный файл.
Сама форт-система просто EXE со скомпилированными словами.
А указатели на код, имена, флаги и прочая находятся в каком-то отдельной текстовом файле (json, например).

Только нужна программа-компилятор, которая будет это все женить и создавать программу)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Пн ноя 22, 2021 15:13 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5034
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 61 раз.
Victor__v писал(а):
Интересно) Никогда не думал что списком будет считаться просто набор безсвязных структур :D

Еще раз, нет словаря - нет Форта. Устройство словаря совершенно не важно, вид идентификаторов в принципе тоже не важен, это могут быть и иконки и музыкальные фразы и все, что придумаете. Я показал, что Словари могут распознавать вообще несчетные множества.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Вт дек 07, 2021 00:17 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 1684
Благодарил (а): 6 раз.
Поблагодарили: 62 раз.
Это, конечно, не безсловарный Форт (т.к. до полноценного Форта в этом варианте ещё шагать и шагать)
но если принять во внимание кросс компиляцию Форт подобного языка, то где то рядом. :)

т.е. по материалу статьи Cи в роли промежуточного языка
немного расширил возможности стекового языка представленного в данной статье (добавил IF ELSE THEN и некоторые слова по работе с стеком + некоторый вариант ввода/вывода с клавиатуры данных KEY в примере это на данный момент аналог Бейсиковского INPUT :)

Изменённые файлы

Forth2c.py
Код:
#!/usr/bin/python

import sys
special = {
  ':':'data* ',
  ';':'return s; }',
  '.':'PRINT();',
  'key':'KEY();',
  'wkey':'WKEY();',
  'emit':'EMIT();',
  'begin':'do {',
  'until':'} while(!*s++);',
  'repeat':'} while(1);',
  'while':'if(!*s++) break;',
  'if':'if((*s++)!=0) {',
  'else':'} else {',
  'then':'};',

  #!'for':'do { if((*s++)!=0) {--rs, rs[0]=s[-1],'
  #!'next':'--s, s[0]=rs[0], rs+1 } while (!*s++) break;',

  #!'?dup':'if((*s++)!=0) {--s, s[0]=s[1];}',
}

binops='+ - * / = < > <> mod <= >=  and xor or lshift rshift'.split()
op2c={ 'lshift':'<<', 'rshift':'>>', '=':'==', '<>':'!=', 'and':'&', 'xor':'^', 'or':'|', 'mod':'%'}

def forth2c(inf,out):
  n = 0
  for line in inf:
    n += 1
    #!ddkjdkjdkljdkljd
    print >> out,'\n#line',n,'"%s"'%infile
    for token in line.lower().strip().split():
      if token in special:
        print >> out,special[token],
      else:
        try:
          num = int(token)
          print >> out, 'PUSH(%d);'%num,
        except ValueError:
          if token in binops:
            print >> out,'OP2(%s);'%op2c.get(token,token),
          else:
            if defining:
              print >> out,token+'(data* s) {',
            else: # call
              print >> out,'s=%s(s);'%token,
      defining = token == ':'

out = open('forth_program.c','w')
print >> out, '#include "forth_runtime.h"'
for infile in sys.argv[1:]:
  forth2c(open(infile),out)


forth_runtime.h
Код:
#include <stdio.h>
#include <wchar.h>

typedef long data;


#define PUSH(item) (--s, *s = (item))
#define OP2(op) (s[1] = s[1] op s[0], ++s)
#define PRINT() (printf("%ld ", s[0]), ++s)
#define cr(s) (printf("\n"), s)
#define drop(s) (s+1)
#define dup(s) (--s, s[0]=s[1], s)
#define tuck(s) (--s, s[0]=s[1], s[1]=s[2], s[2]=s[0], s)
#define swap(s) (--s, s[0]=s[1], s[1]=s[2], s[2]=s[0], s+1)
#define over(s) (--s, s[0]=s[2], s)

#define EMIT() ( putc(s[0],stdout), ++s)
#define KEY() (--s, s[0]=getc(stdin), s)
#define WKEY() (--s, s[0]=getwchar(), s)

#define put(s) (s[*s+1]=s[1], s+2)
#define pick(s)  (s[0]=s[*s], s)

#define sp0(s) (--s, s[0]=sp, s)
#define rp0(s) (--s, s[0]=rs, s)
#define mem0(s)(--s, s[0]=mem,s)

#define poke(s) (mem[s[0]]=s[1], s+2)
#define pike(s) (s[0]=mem[s[0]], s)

#define to_r(s)  (--rs, rs[0]=s[0], s+1)
#define r_to(s)  (--s, s[0]=rs[0], rs+1, s)

#define to2_r(s)  (--rs, rs[0]=s[0], --rs, rs[0]=s[0], s+2)
#define r2_to(s)  (--s,  s[0]=rs[0], rs+1, s[0]=rs[0], rs+1)

//#define loop(s)(
//#define ?dup(s) (if((!*s++)!=0) {--s, s[0]=s[1], s};)
#define init(s) (rs=stack, s)


#define MAX_DEPTH 8192 //произвольно
#define RSP 1024
#define SPC 2048

data mem[MAX_DEPTH];
data* stack=mem;
data* rs=mem+RSP;
data* sp=mem+SPC;

data* forth_main(data*);
int main() { forth_main(mem+MAX_DEPTH); return 0; }


Проверочные файлы
gcd.4th
Код:
: gcd
  begin
    dup
  while
    tuck
    mod
  repeat
  drop
;

main.4th
Код:
: forth_main
  5 init   rp0 . 6 10 put
   10 pick .
   11 20 poke
   20 pike .
   55 to_r
   r_to .
  5 2 / .
  begin key dup 10 <> while emit repeat drop
  cr  countdown
  cr
  10 6 gcd .
  35 75 gcd .
  12856 3248 gcd .
  cr
;

contdown.4th
Код:
: COUNTDOWN
-123 0 <>  IF 1 . ELSE 0 . THEN

  BEGIN
    DUP .
    1 -
    DUP 0 =
  UNTIL
  DROP
;

Ну и скрипт для запуска Питон скрипта в Linux

Script.sh
Код:
#!/bin/sh
./forth2c.py countdown.4th gcd.4th main.4th
#!gcc -g -static -Wall -o forth_program forth_program.c
gcc  -Wall -o forth_program forth_program.c
./forth_program

В этом тестовом примере результирующий бинарный файл получился ~7.5 Кб

Вроде ничего не пропустил

P.S. Можно попробовать дальше раскрутить Форт с этого базисного построения по примеру eForth.
Добавление циклов сходу не получилось, а также задумался как результирующему получаемому Си файлу для запуска, к примеру, добавить обработку слов u< и подобных, а также других слов + элементы конструктива построения полноценного Форт. Наверное, добавлениe ассемблера с уровня Форт может тоже понадобиться.

Может у кого то будут интересные решения по развитию такого варианта раскрутки Форт системы.
Как начальную демо-программу можно, вероятно, доделать кросс до запуска, к примеру, консольного Форт тетриса.

Мне одному "кажется", что название топика написано с ошибкой?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Вт дек 07, 2021 11:05 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 276
Откуда: Москва
Благодарил (а): 44 раз.
Поблагодарили: 9 раз.
KPG писал(а):
...
А ассоциативный массив special чем не словарь? :D
gregorbednov писал(а):
...
Словарик в Форте - это некая сущность, в которую можно добавлять слова, чтобы когда-нибудь потом их же в ней же искать... При этом организован он может быть как традиционным способом (список), так и любым другим, начиная от более-менее привычных (те же ассоциативные массивы) и заканчивая абсолютно экзотическими (например, сам исходный текст программы на Форте вполне может считаться словарем, если имеется набор слов для поиска определений в тексте исходника, или, допустим, куча файлов в каталоге - чем не словарь?), здесь фантазия фортостроителя ничем не ограничивается... :)
Совсем без словаря можно, когда поиск не нужен... Например, при кросс-трансляции с подмножества Форт в asm/си/и т.д... Допустим, : abcd ... ; можно транслировать в _61626364: ... ret или в void _61626364() { ... } (здесь 61-64 - ascii-коды букв a-d), а потом вызывать при помощи call _61626364 или _61626364();
А если поиск нужен и реализован, значит без вариантов словарь есть, хотя, повторюсь, физически его как отдельного места для хранения словарных статей может и не быть (как в случае с интерпретацией текста исходника)... :D
KPG писал(а):
"кажется"
Бессловарный написано без ошибок, проверил по словарю... :D
KPG писал(а):
консольного Форт тетриса
Почему-то нигде не встречал компактную реализацию тетриса на Форте, а те реализации, что попадались - очень громоздкие... Эх, придется свою версию писать... :D :D


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Чт дек 09, 2021 16:58 
Не в сети

Зарегистрирован: Сб ноя 20, 2021 06:51
Сообщения: 17
Откуда: Южный Урал
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Ну если не так, то как ещё без словаря?
Иначе без словаря и не возможно, как по мне.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Сб дек 11, 2021 12:16 
Не в сети

Зарегистрирован: Чт ноя 23, 2006 00:44
Сообщения: 430
Откуда: СПб
Благодарил (а): 19 раз.
Поблагодарили: 6 раз.
ТС спрашивал пример сабжа, таки есть пример http://mecrisp.sourceforge.net/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: "Бессловарный" форт?
СообщениеДобавлено: Вт дек 14, 2021 12:11 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 276
Откуда: Москва
Благодарил (а): 44 раз.
Поблагодарили: 9 раз.
Ilya писал(а):
ТС спрашивал пример сабжа, таки есть пример http://mecrisp.sourceforge.net/
Хм, а разве там нет словаря?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


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

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


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

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