Forth http://fforum.winglion.ru/ |
|
"Бессловарный" форт? http://fforum.winglion.ru/viewtopic.php?f=24&t=3315 |
Страница 1 из 1 |
Автор: | gregorbednov [ Пт ноя 19, 2021 16:12 ] |
Заголовок сообщения: | "Бессловарный" форт? |
В ходе обсуждений видел мнение, что, возможно, форт может работать без словарей - естественно, речь не идёт о "просто наборе команд", упрощении до некоего "ассемблера", ведь в этом случае форт перестанет быть фортом, даже если сохранит двухстековую архитектуру, а именно о каком-то другом способе организации. В конце концов, за исключением аппаратно-диктуемых различий между фортами, именно устройство словаря чаще всего отличается в различных реализациях. Не нашлось ли примеров, когда форт действительно организован не через словари? |
Автор: | mOleg [ Пт ноя 19, 2021 20:21 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
gregorbednov писал(а): В ходе обсуждений видел мнение, что, возможно, форт может работать без словарей так, можно, и есть такие системы, Но, это не означает, что нет списка слов (то есть грубо говоря есть только словарь FORTH, единственный словарь, который нельзя переключать) gregorbednov писал(а): В конце концов, за исключением аппаратно-диктуемых различий между фортами, именно устройство словаря чаще всего отличается в различных реализациях. я такого не заметил. Отличия в основном не принципиальные (даже в моем случае интерфейс более-менее стандартный, хотя словари устроены значительно сложнее и позволяют больше) |
Автор: | Victor__v [ Пт ноя 19, 2021 23:44 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
Ну, может. Однако как-то определения искать надо) Тут еще вопрос, а что считать словарём? Будет ли считаться словарём отдельно взятая таблица со служебными данными? Или словарь это только односвязный список определений? Но можно и вообще без этого) Если поизвращаться, то имея HERE и зная адрес начала форт-системы, можно для поиска слов использовать обычное слово SEARCH Медленно, ненадёжно и прикольно. |
Автор: | mOleg [ Вс ноя 21, 2021 08:06 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
Victor__v писал(а): Если поизвращаться, то имея HERE и зная адрес начала форт-системы, можно для поиска слов использовать обычное слово SEARCH А это не важно, список слов всеравно будет, и поиск будет, а, значит будет интерфейс(слова для добавления и поиска лексем и связанных с ними кода и данных). Другое дело, что написанная на форте программа может не содержать имен слов и всей словарной структуры, что тоже делалось как минимум в нескольких системах (это при условии, что в программе рабочей не будет поиска имен слов) |
Автор: | pk-fr-76-2 [ Вс ноя 21, 2021 09:23 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
А если в системе просто будет стек, куда можно будет класть значения, и одно слово, которое будет проверять, что находится на стеке и в зависимости от этого выполняет что-либо. Будет ли это считаться за бессловарный форт? |
Автор: | Hishnik [ Вс ноя 21, 2021 16:00 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
pk-fr-76-2 писал(а): и одно слово, которое будет проверять, что находится на стеке и в зависимости от этого выполняет что-либо. В Форте для такого используется слово EXECUTE. Это уже про внутренний движок Форта, когда мы запустили программу. А словари - про способ компиляции кода. В целом можно же и другие структуры данных использовать. Словари используют связанный список, который в числе прочего дает экономное размещение данных в памяти. Для 70-х годов это было крайне актуально - не давать же словам фиксированные поля в 32 символа (тогда) для размещения имени. А сегодня - ну пусть даже 256 байт на имя и 10 тыс. записей в статической структуре данных. Потерю 2,5 Мбайт современные ПК и смартфоны просто не заметят. |
Автор: | mOleg [ Вс ноя 21, 2021 18:58 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
pk-fr-76-2 писал(а): Будет ли это считаться за бессловарный форт? Языковая среда программирования Сначала было слово |
Автор: | Victor__v [ Пн ноя 22, 2021 09:39 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
mOleg писал(а): А это не важно, список слов всеравно будет, и поиск будет, а, значит будет интерфейс(слова для добавления и поиска лексем и связанных с ними кода и данных). Интересно) Никогда не думал что списком будет считаться просто набор безсвязных структур Еще одна идея для безсловарного форта: Сделать а-ля объектный файл. Сама форт-система просто EXE со скомпилированными словами. А указатели на код, имена, флаги и прочая находятся в каком-то отдельной текстовом файле (json, например). Только нужна программа-компилятор, которая будет это все женить и создавать программу) |
Автор: | mOleg [ Пн ноя 22, 2021 15:13 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
Victor__v писал(а): Интересно) Никогда не думал что списком будет считаться просто набор безсвязных структур :D Еще раз, нет словаря - нет Форта. Устройство словаря совершенно не важно, вид идентификаторов в принципе тоже не важен, это могут быть и иконки и музыкальные фразы и все, что придумаете. Я показал, что Словари могут распознавать вообще несчетные множества. |
Автор: | KPG [ Вт дек 07, 2021 00:17 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
Это, конечно, не безсловарный Форт (т.к. до полноценного Форта в этом варианте ещё шагать и шагать) но если принять во внимание кросс компиляцию Форт подобного языка, то где то рядом. т.е. по материалу статьи 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 ассемблера с уровня Форт может тоже понадобиться. Может у кого то будут интересные решения по развитию такого варианта раскрутки Форт системы. Как начальную демо-программу можно, вероятно, доделать кросс до запуска, к примеру, консольного Форт тетриса. Мне одному "кажется", что название топика написано с ошибкой? |
Автор: | Total Vacuum [ Вт дек 07, 2021 11:05 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
KPG писал(а): ... А ассоциативный массив special чем не словарь? gregorbednov писал(а): ... Словарик в Форте - это некая сущность, в которую можно добавлять слова, чтобы когда-нибудь потом их же в ней же искать... При этом организован он может быть как традиционным способом (список), так и любым другим, начиная от более-менее привычных (те же ассоциативные массивы) и заканчивая абсолютно экзотическими (например, сам исходный текст программы на Форте вполне может считаться словарем, если имеется набор слов для поиска определений в тексте исходника, или, допустим, куча файлов в каталоге - чем не словарь?), здесь фантазия фортостроителя ничем не ограничивается... Совсем без словаря можно, когда поиск не нужен... Например, при кросс-трансляции с подмножества Форт в asm/си/и т.д... Допустим, : abcd ... ; можно транслировать в _61626364: ... ret или в void _61626364() { ... } (здесь 61-64 - ascii-коды букв a-d), а потом вызывать при помощи call _61626364 или _61626364(); А если поиск нужен и реализован, значит без вариантов словарь есть, хотя, повторюсь, физически его как отдельного места для хранения словарных статей может и не быть (как в случае с интерпретацией текста исходника)... KPG писал(а): "кажется" Бессловарный написано без ошибок, проверил по словарю... KPG писал(а): консольного Форт тетриса Почему-то нигде не встречал компактную реализацию тетриса на Форте, а те реализации, что попадались - очень громоздкие... Эх, придется свою версию писать...
|
Автор: | pk-fr-76-2 [ Чт дек 09, 2021 16:58 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
Ну если не так, то как ещё без словаря? Иначе без словаря и не возможно, как по мне. |
Автор: | Ilya [ Сб дек 11, 2021 12:16 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
ТС спрашивал пример сабжа, таки есть пример http://mecrisp.sourceforge.net/ |
Автор: | Total Vacuum [ Вт дек 14, 2021 12:11 ] |
Заголовок сообщения: | Re: "Бессловарный" форт? |
Ilya писал(а): ТС спрашивал пример сабжа, таки есть пример http://mecrisp.sourceforge.net/ Хм, а разве там нет словаря?
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |