Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
Hishnik писал(а): Дескать, пропал человек, депрессия у него, видимо, что угодно с собой учинить может, надо срочно искать и спасать, а контактов не оставил. Так все обошлось, выходит, можно девушку успокоить? Выходит - можно, но зависит от ее самочувствия: если та на сносях, тогда лучше не беспокоить; да и я еще вольной жизни не нахлебался сполна. Впрочем, на самом деле моя безвременная пропажа связана главным образом с переездом в собственное жилище. Обитаю я теперь на отшибе, - Проспект Вернадского, - зато в гордом одиночестве. Не Охотный Ряд, конечно, однако, как говориться - дареному коню... Ладно, хватит о личном, надо оставить что-нибудь для мемуаров. Hishnik писал(а): Да те же у них картинки приборов с дисплеями. Просто программисты упертые и Форт продают как бренд. А проблема в том, что за бренд свой цепляются, а больше никому технологией пользоваться толком не дают. Официальная позиция - все, что делает Forth Inc, стандартно по определению. Остальные выкручиваются как хотят. Картинки те же, а задачи разные. У Максима Галкина тоже наверняка компьютер есть, но он его несколько иначе чем вы использует. То есть, других коммерческих продуктов, в том числе компиляторов, на рынке околоязыкового ПО нет? Да, возможно, Forth Inc слегка надменно позицианирует себя правоприемником первородного Форта, но, в то же время, небезосновательно. Во многих языках, если посмотреть, также существуют свои диктаторы, несмотря на обилие апокрифических реализаций. Forth Ink на текущий момент единственные, кто предоставляет гарантированную профессиональную поддержку для своих клиентов; именно профессиональную, а не любительски-студенческую а-ля "протрезвею, может - помогу". Так что с задачей условного ориентира они справляются.
[quote="Hishnik"] Дескать, пропал человек, депрессия у него, видимо, что угодно с собой учинить может, надо срочно искать и спасать, а контактов не оставил. Так все обошлось, выходит, можно девушку успокоить? :)) [/quote] Выходит - можно, но зависит от ее самочувствия: если та на сносях, тогда лучше не беспокоить; да и я еще вольной жизни не нахлебался сполна. Впрочем, на самом деле моя безвременная пропажа связана главным образом с переездом в собственное жилище. Обитаю я теперь на отшибе, - Проспект Вернадского, - зато в гордом одиночестве. Не Охотный Ряд, конечно, однако, как говориться - дареному коню... Ладно, хватит о личном, надо оставить что-нибудь для мемуаров.
[quote="Hishnik"] Да те же у них картинки приборов с дисплеями. Просто программисты упертые и Форт продают как бренд. А проблема в том, что за бренд свой цепляются, а больше никому технологией пользоваться толком не дают. Официальная позиция - все, что делает Forth Inc, стандартно по определению. Остальные выкручиваются как хотят.[/quote] Картинки те же, а задачи разные. У Максима Галкина тоже наверняка компьютер есть, но он его несколько иначе чем вы использует. То есть, других коммерческих продуктов, в том числе компиляторов, на рынке околоязыкового ПО нет? Да, возможно, Forth Inc слегка надменно позицианирует себя правоприемником первородного Форта, но, в то же время, небезосновательно. Во многих языках, если посмотреть, также существуют свои диктаторы, несмотря на обилие апокрифических реализаций. Forth Ink на текущий момент единственные, кто предоставляет гарантированную профессиональную поддержку для своих клиентов; именно профессиональную, а не любительски-студенческую а-ля "протрезвею, может - помогу". Так что с задачей условного ориентира они справляются.
|
|
|
|
Добавлено: Вс апр 09, 2017 22:43 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
Zinger писал(а): Или нанимать в придачу для укомлектовки О! Нашлась пропажа! А то его тут девушка обыскалась, по форумному админскому адресу писала, слезно просила срочно найти. Дескать, пропал человек, депрессия у него, видимо, что угодно с собой учинить может, надо срочно искать и спасать, а контактов не оставил. Так все обошлось, выходит, можно девушку успокоить? Zinger писал(а): К тому же эти двое работают исключительно с и над Фортом, а ваша контора, видимо, и прочими махинациями занимается. Да те же у них картинки приборов с дисплеями. Просто программисты упертые и Форт продают как бренд. А проблема в том, что за бренд свой цепляются, а больше никому технологией пользоваться толком не дают. Официальная позиция - все, что делает Forth Inc, стандартно по определению. Остальные выкручиваются как хотят.
[quote="Zinger"]Или нанимать в придачу для укомлектовки[/quote] О! Нашлась пропажа! А то его тут девушка обыскалась, по форумному админскому адресу писала, слезно просила срочно найти. Дескать, пропал человек, депрессия у него, видимо, что угодно с собой учинить может, надо срочно искать и спасать, а контактов не оставил. Так все обошлось, выходит, можно девушку успокоить? :))
[quote="Zinger"]К тому же эти двое работают исключительно с и над Фортом, а ваша контора, видимо, и прочими махинациями занимается.[/quote] Да те же у них картинки приборов с дисплеями. Просто программисты упертые и Форт продают как бренд. А проблема в том, что за бренд свой цепляются, а больше никому технологией пользоваться толком не дают. Официальная позиция - все, что делает Forth Inc, стандартно по определению. Остальные выкручиваются как хотят.
|
|
|
|
Добавлено: Вс апр 09, 2017 20:32 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
Hishnik писал(а): Меня творчество Forth Inc &Co вообще сильно настораживает как таковое. Я не говорю, что там вообще никто не может написать ничего толкового - живут же они как-то и за аренду платят. Даже вон хвалились, что они ведущая форт-компания в мире, потому что могут себе позволить целых двух (подумать только!) программистов на full-time. На что мне осталось только пойти пить водку с медведем, заказав ему сыграть что-нибудь жалобное на балалайке. Потому что дойти до этого их показателя - это ж нам увольнять людей теперь, что ли? Или нанимать в придачу для укомлектовки, - вдруг у них столь выокооплачиваемые специалисты, что на двоих получают больше, чем вся ваша орава, вместе с цыганами и медведями... К тому же эти двое работают исключительно с и над Фортом, а ваша контора, видимо, и прочими махинациями занимается. Давайте еще Forth Inc с Microsoft сравнивать...
[quote="Hishnik"] Меня творчество Forth Inc &Co вообще сильно настораживает как таковое. Я не говорю, что там вообще никто не может написать ничего толкового - живут же они как-то и за аренду платят. Даже вон хвалились, что они ведущая форт-компания в мире, потому что могут себе позволить целых двух (подумать только!) программистов на full-time. На что мне осталось только пойти пить водку с медведем, заказав ему сыграть что-нибудь жалобное на балалайке. Потому что дойти до этого их показателя - это ж нам увольнять людей теперь, что ли? :D [/quote] Или нанимать в придачу для укомлектовки, - вдруг у них столь выокооплачиваемые специалисты, что на двоих получают больше, чем вся ваша орава, вместе с цыганами и медведями... К тому же эти двое работают исключительно с и над Фортом, а ваша контора, видимо, и прочими махинациями занимается. Давайте еще Forth Inc с Microsoft сравнивать...
|
|
|
|
Добавлено: Вс апр 09, 2017 17:53 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
dmitry-st писал(а): Ответ на свой вопрос я получил. Дальше буду сам О! А я уже было собрался написать экспорт в .h dmitry-st писал(а): Пользовался ли кто-нибудь вот этой библиотекой: https://github.com/irdvo/fflМеня заинтересовало в ней несколько вариантов деревьев. Насколько эта библиотека стабильна и продуманна? Меня творчество Forth Inc &Co вообще сильно настораживает как таковое. Я не говорю, что там вообще никто не может написать ничего толкового - живут же они как-то и за аренду платят. Даже вон хвалились, что они ведущая форт-компания в мире, потому что могут себе позволить целых двух (подумать только!) программистов на full-time. На что мне осталось только пойти пить водку с медведем, заказав ему сыграть что-нибудь жалобное на балалайке. Потому что дойти до этого их показателя - это ж нам увольнять людей теперь, что ли? А в целом у меня претензия к ним формулируется очень просто - "а куда вы вообще идете?". Конкретно по библиотекам - какую задачу вы себе поставили, как она решается конкретно здесь, где преимущества/недостатки? Как тестировать? Где типичные сценарии использования? Кодирование с подготовительной работой по осмыслению неимоверно эффективнее, чем просто кодирование, какими бы красивыми формальностями оно не обрастало. При выкладывании в open source вообще есть интересный мотив. Программист, кроме чистого альтруизма, может иметь желание привлечь побольше людей для поддержки и развития, а заодно создать себе красивое резюме, в котором будет числиться сколько-то проектов на github. Объем проекта там не запредельный, тем более что указан всего 1 разработчик. Такое, при наличии четкой задачи и сформулированных контрольных точек, вполне выращивается с нуля, причем в том виде и стиле, которые нужны.
[quote="dmitry-st"]Ответ на свой вопрос я получил. Дальше буду сам [/quote] О! А я уже было собрался написать экспорт в .h :)
[quote="dmitry-st"]Пользовался ли кто-нибудь вот этой библиотекой: https://github.com/irdvo/ffl Меня заинтересовало в ней несколько вариантов деревьев. Насколько эта библиотека стабильна и продуманна?[/quote] Меня творчество Forth Inc &Co вообще сильно настораживает как таковое. Я не говорю, что там вообще никто не может написать ничего толкового - живут же они как-то и за аренду платят. Даже вон хвалились, что они ведущая форт-компания в мире, потому что могут себе позволить целых двух (подумать только!) программистов на full-time. На что мне осталось только пойти пить водку с медведем, заказав ему сыграть что-нибудь жалобное на балалайке. Потому что дойти до этого их показателя - это ж нам увольнять людей теперь, что ли? :D
А в целом у меня претензия к ним формулируется очень просто - "а куда вы вообще идете?". Конкретно по библиотекам - какую задачу вы себе поставили, как она решается конкретно здесь, где преимущества/недостатки? Как тестировать? Где типичные сценарии использования? Кодирование с подготовительной работой по осмыслению неимоверно эффективнее, чем просто кодирование, какими бы красивыми формальностями оно не обрастало. При выкладывании в open source вообще есть интересный мотив. Программист, кроме чистого альтруизма, может иметь желание привлечь побольше людей для поддержки и развития, а заодно создать себе красивое резюме, в котором будет числиться сколько-то проектов на github. Объем проекта там не запредельный, тем более что указан всего 1 разработчик. Такое, при наличии четкой задачи и сформулированных контрольных точек, вполне выращивается с нуля, причем в том виде и стиле, которые нужны.
|
|
|
|
Добавлено: Вс апр 09, 2017 15:41 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
dmitry-st писал(а): Искренне благодарен true-grue и Hishnik за примеры!!! ... Меня заинтересовало в ней несколько вариантов деревьев. И совсем ничего, что примеры не относятся к задаче! И что, в отличие от моего, они нерабочие! В полку FORTH-дебилов прибыло!
[quote="dmitry-st"]Искренне благодарен true-grue и Hishnik за примеры!!! ... Меня заинтересовало в ней несколько вариантов деревьев.[/quote]И совсем ничего, что примеры не относятся к задаче! И что, в отличие от моего, они нерабочие! В полку FORTH-дебилов прибыло!
|
|
|
|
Добавлено: Вс апр 09, 2017 11:38 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
Искренне благодарен true-grue и Hishnik за примеры!!! Ответ на свой вопрос я получил. Дальше буду сам Благодарю всех участвовавших! Пользовался ли кто-нибудь вот этой библиотекой: https://github.com/irdvo/fflМеня заинтересовало в ней несколько вариантов деревьев. Насколько эта библиотека стабильна и продуманна?
Искренне благодарен true-grue и Hishnik за примеры!!! Ответ на свой вопрос я получил. Дальше буду сам :work; Благодарю всех участвовавших!
Пользовался ли кто-нибудь вот этой библиотекой: https://github.com/irdvo/ffl Меня заинтересовало в ней несколько вариантов деревьев. Насколько эта библиотека стабильна и продуманна?
|
|
|
|
Добавлено: Вс апр 09, 2017 10:12 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
vpn289 писал(а): Вы хотите сказать, что при написании форта на ассемблере (правильно я понял?) CREATE ничего не компилирует на вершину словаря (кодофайла)? Компилирует код push here ret. vpn289 писал(а): Я размышлял о системе с изолированными адресными пространствами. Отдельное для стека возвратов, отдельное для стека данных, отдельное для низкоуровневого кода, отдельное для кодофайла. Неоправданно сложно получалось. Это как раз существенно проще. Отдельное пространство кода и данных позволяет не задумываться о способах обхода данных, выделенных прямо посередине кода. Отсюда и всяческие поля параметров. В машинном коде есть поле связи, поле имени (с примыкающими флагами), а дальше идет просто код, завершающийся ret. Пока определение не завершено, выполнять ALLOT при общем адресном пространстве бессмысленно - данные просто сядут внутрь текущего определения. Если же данные находятся в собственном пространстве, этой проблемы нет. Так что CREATE не изменяет HERE (зато изменяет [C]HERE, которое указывает на первую свободную ячейку в пространстве кода).
[quote="vpn289"]Вы хотите сказать, что при написании форта на ассемблере (правильно я понял?) CREATE ничего не компилирует на вершину словаря (кодофайла)? [/quote] Компилирует код push here ret. [quote="vpn289"]Я размышлял о системе с изолированными адресными пространствами. Отдельное для стека возвратов, отдельное для стека данных, отдельное для низкоуровневого кода, отдельное для кодофайла. Неоправданно сложно получалось.[/quote] Это как раз существенно проще. Отдельное пространство кода и данных позволяет не задумываться о способах обхода данных, выделенных прямо посередине кода. Отсюда и всяческие поля параметров. В машинном коде есть поле связи, поле имени (с примыкающими флагами), а дальше идет просто код, завершающийся ret. Пока определение не завершено, выполнять ALLOT при общем адресном пространстве бессмысленно - данные просто сядут внутрь текущего определения. Если же данные находятся в собственном пространстве, этой проблемы нет. Так что CREATE не изменяет HERE (зато изменяет [C]HERE, которое указывает на первую свободную ячейку в пространстве кода).
|
|
|
|
Добавлено: Сб апр 08, 2017 21:05 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
А у меня тоже образовалось решение Код: 1024 CONSTANT MAXFIELDS 256 CONSTANT MAXNAME
1 CONSTANT #INT 2 CONSTANT #STRING
CREATE STRUCTNAME[] MAXFIELDS MAXNAME * ALLOT CREATE FIELDNAME[] MAXFIELDS MAXNAME * ALLOT CREATE FIELDTYPE[] MAXFIELDS ALLOT CREATE FIELDPARENT[] MAXFIELDS CELLS ALLOT
CREATE FIELDMIN[] MAXFIELDS CELLS ALLOT CREATE FIELDMAX[] MAXFIELDS CELLS ALLOT CREATE FIELDDEFAULT[] MAXFIELDS CELLS ALLOT
0 VALUE STRUCTS 0 VALUE FIELDS
: ClearParents MAXFIELDS 0 DO -1 FIELDPARENT[] I -TH ! LOOP ; ClearParents
: STRUCT PARSE STRUCTNAME[] STRUCTS MAXNAME * + SMOVE ;
: STRUCT; 1 +TO STRUCTS ;
: int PARSE FIELDNAME[] FIELDS MAXNAME * + SMOVE // field name #INT FIELDTYPE[] FIELDS + C! // field type STRUCTS FIELDPARENT[] FIELDS -TH ! // field parent 1 +TO FIELDS ;
: string PARSE FIELDNAME[] FIELDS MAXNAME * + SMOVE // field name #STRING FIELDTYPE[] FIELDS + C! // field type STRUCTS FIELDPARENT[] FIELDS -TH ! // field parent 1 +TO FIELDS ;
: min FIELDMIN[] FIELDS 1- -TH ! ;
: max FIELDMAX[] FIELDS 1- -TH ! ;
: default FIELDDEFAULT[] FIELDS 1- -TH ! ;
// ***** some reporting *****
: LIST-FIELDS // N -- MAXFIELDS 0 DO FIELDPARENT[] I -TH @ OVER = IF " -> " PRINT FIELDNAME[] I MAXNAME * + PRINT FIELDTYPE[] I + C@ CASE #INT OF " int " PRINT ENDOF #STRING OF " string " PRINT ENDOF ENDCASE " min: " PRINT FIELDMIN[] I -TH @ . " max: " PRINT FIELDMAX[] I -TH @ . " default: " PRINT FIELDDEFAULT[] I -TH @ . CR THEN LOOP DROP ;
: LIST-STRUCTS CR STRUCTS 0 DO I . STRUCTNAME[] I MAXNAME * + PRINT CR I LIST-FIELDS LOOP ;
// ***** TEST *****
STRUCT UserGroup int priority 1 min 10 max 5 default string name STRUCT;
STRUCT HishnikGroup int size 1 min 2000000000 max 2000000000 default string roar STRUCT;
LIST-STRUCTS
Вложения: |
struct.png [ 28.07 Кб | Просмотров: 19019 ]
|
А у меня тоже образовалось решение [code] 1024 CONSTANT MAXFIELDS 256 CONSTANT MAXNAME
1 CONSTANT #INT 2 CONSTANT #STRING
CREATE STRUCTNAME[] MAXFIELDS MAXNAME * ALLOT CREATE FIELDNAME[] MAXFIELDS MAXNAME * ALLOT CREATE FIELDTYPE[] MAXFIELDS ALLOT CREATE FIELDPARENT[] MAXFIELDS CELLS ALLOT
CREATE FIELDMIN[] MAXFIELDS CELLS ALLOT CREATE FIELDMAX[] MAXFIELDS CELLS ALLOT CREATE FIELDDEFAULT[] MAXFIELDS CELLS ALLOT
0 VALUE STRUCTS 0 VALUE FIELDS
: ClearParents MAXFIELDS 0 DO -1 FIELDPARENT[] I -TH ! LOOP ; ClearParents
: STRUCT PARSE STRUCTNAME[] STRUCTS MAXNAME * + SMOVE ;
: STRUCT; 1 +TO STRUCTS ;
: int PARSE FIELDNAME[] FIELDS MAXNAME * + SMOVE // field name #INT FIELDTYPE[] FIELDS + C! // field type STRUCTS FIELDPARENT[] FIELDS -TH ! // field parent 1 +TO FIELDS ;
: string PARSE FIELDNAME[] FIELDS MAXNAME * + SMOVE // field name #STRING FIELDTYPE[] FIELDS + C! // field type STRUCTS FIELDPARENT[] FIELDS -TH ! // field parent 1 +TO FIELDS ;
: min FIELDMIN[] FIELDS 1- -TH ! ;
: max FIELDMAX[] FIELDS 1- -TH ! ;
: default FIELDDEFAULT[] FIELDS 1- -TH ! ;
// ***** some reporting *****
: LIST-FIELDS // N -- MAXFIELDS 0 DO FIELDPARENT[] I -TH @ OVER = IF " -> " PRINT FIELDNAME[] I MAXNAME * + PRINT FIELDTYPE[] I + C@ CASE #INT OF " int " PRINT ENDOF #STRING OF " string " PRINT ENDOF ENDCASE " min: " PRINT FIELDMIN[] I -TH @ . " max: " PRINT FIELDMAX[] I -TH @ . " default: " PRINT FIELDDEFAULT[] I -TH @ . CR THEN LOOP DROP ;
: LIST-STRUCTS CR STRUCTS 0 DO I . STRUCTNAME[] I MAXNAME * + PRINT CR I LIST-FIELDS LOOP ;
// ***** TEST *****
STRUCT UserGroup int priority 1 min 10 max 5 default string name STRUCT;
STRUCT HishnikGroup int size 1 min 2000000000 max 2000000000 default string roar STRUCT;
LIST-STRUCTS [/code]
|
|
|
|
Добавлено: Сб апр 08, 2017 21:01 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
true-grue писал(а): ... Я, понимаю, что читать чужое решение (которое всего на порядок короче) лень. Но условие задачи прочесть-то было можно?
[quote="true-grue"]...[/quote]Я, понимаю, что читать чужое решение (которое всего на порядок короче) лень. Но условие задачи прочесть-то было можно?
|
|
|
|
Добавлено: Сб апр 08, 2017 15:51 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
Задача на тему "дерева в памяти" мне показалась любопытной. Не буду сейчас поднимать вопрос практической целесообразности, в конце концов, написание программ на Форте часто сравнивают с разгадыванием головоломки в духе "Судоку". Итак, за основу возьму описание структуры силами фортовского DSL, а на выходе создам "дерево в памяти", которое еще и распечатаю в виде S-выражения. Почему не в виде C-выражения? Так ведь надо же что-то (кроме вывода возможны и преобразования дерева) оставить и в качестве упражнения для читателя! Я несколько отвык от Форта за последнее время, так что прошу простить мне "не идиоматический подход". В частности, я не собираюсь тратить время на определяющие слова и словари. Более того, мне и со SWAP, ROT и подобными фортизмами связываться не хочется. Поэтому начну я с реализации локальных переменных. Код: create locals 1024 cells allot variable lptr locals lptr ! : loc+ ( n) cells lptr +! ; : loc ( i) lptr @ swap 2 + cells - @ ; : loc! ( x i) lptr @ swap 2 + cells - ! ; : loc: ( .. n) lptr @ >r 0 do lptr @ ! 1 loc+ loop r> lptr @ ! 1 loc+ ; : loc; -1 loc+ lptr @ @ lptr ! ; Никаких имен, только индексы. Код с применением таких конструкций не является читабельным, но, по крайней мере, его несколько удобнее писать. Чем потенциально хороши DSL на Форте? Помимо последовательностей слов, разделяемых пробелами, достаточно выразительно выглядят "префиксные" выражения с использованием WORD. Но работу со строками в Форте удобной не назовешь. Тот же WORD сохраняет текст во временную область. Раз уж взялся за задачу, реализую хранилище для строк. Код: create strings 1024 allot variable sptr strings sptr ! : >str ( a - a) dup count 1 + 3 loc: sptr @ 1 loc! 0 loc sptr @ 2 loc cmove 2 loc sptr +! 1 loc loc; ; Слово >str получает строку со счетчиком и сохраняет ее в области strings. Как же хранить пресловутое дерево в памяти? Буду использовать классический алгоритм размещения дерева в линейном массиве. Сначала в массив помещаются дочерние узлы, затем -- родительский узел. Каждый узел состоит из числа элементов и последовательности адресов дочерних узлов. Код: create nodes 1024 cells allot variable nptr nodes nptr ! : node+ ( n) cells nptr +! ; : node ( .. n) nptr @ >r dup r@ ! 1 node+ dup >r loc: r> 0 do i loc nptr @ ! 1 node+ loop loc; r> ; Слово node берет со стека n дочерних узлов и формирует с их помощью новый узел в nodes. Теперь следует заняться печатью дерева в виде S-выражения. Буду считать атомом узел, у которого вместо адреса первого дочернего узла хранится 0. Код: : .atom ( a) count type ; : n@ ( a i - a) cells + @ ; : .ast ( a) dup 1 n@ 0 = if 2 n@ .atom exit then ." (" dup @ 2 loc: 1 loc if 0 loc 1 n@ .atom 1 loc 1 - 0 ?do ." " 0 loc i 2 + n@ recurse loop ." )" then loc; ; Далее понадобится несколько вспомогательных слов. Код: : id ( "name" - a) bl word >str 1 loc: 0 0 loc 2 node loc; ; : ` postpone postpone ; immediate : tree: 1 loc+ ; : tree; -1 loc+ ; Наконец, пришло время реализовать DSL. Код: : (var) 0 loc 1 + 0 loc! 2 1 loc: ; : var: ( "name") ` (var) c" var" ` literal id ` literal ; immediate : var; 0 loc node loc; ;
: array: ( "name") ` (var) c" array" ` literal id ` literal ; immediate : array; var; ;
: struct: ( "name") ` (var) c" struct" ` literal id ` literal ; immediate : struct; var; ;
: (type) 0 loc 1 + 0 loc! 2 node ; : type: ( "name") c" type" ` literal id ` literal ` (type) ; immediate
: max: ( "name") c" max" ` literal id ` literal ` (type) ; immediate : min: ( "name") c" min" ` literal id ` literal ` (type) ; immediate : default: ( "name") c" default" ` literal id ` literal ` (type) ; immediate : size: ( "name") c" size" ` literal id ` literal ` (type) ; immediate
Привожу пример описания и вывода структуры. Код: : code-tree tree: struct: UserGroup var: priority type: int min: 10 max: 10 default: 10 var; array: name type: char size: MAX_GROUP_NAME_LENGTH default: "" array; struct; tree; ;
code-tree .ast
(struct UserGroup (var priority (type int) (min 10) (max 10) (default 10)) (array name (type char) (size MAX_GROUP_NAME_LENGTH) (default "")))
Как можно видеть, ручная реализация примитивных операций в Форте не так уж сложна. По моему опыту, она во многих случаях проще, чем попытки приспособить какие-то готовые конструкции из стандартного Форта. Как известно, Форт -- язык не алгебраический. И дело тут даже не в отсутствии способов записи инфиксных выражений. В Форте, к сожалению, мало уделяется внимания таким важным свойствам математических структур, как замкнутость и композиционность.
Задача на тему "дерева в памяти" мне показалась любопытной. Не буду сейчас поднимать вопрос практической целесообразности, в конце концов, написание программ на Форте часто сравнивают с разгадыванием головоломки в духе "Судоку".
Итак, за основу возьму описание структуры силами фортовского DSL, а на выходе создам "дерево в памяти", которое еще и распечатаю в виде S-выражения. Почему не в виде C-выражения? Так ведь надо же что-то (кроме вывода возможны и преобразования дерева) оставить и в качестве упражнения для читателя!
Я несколько отвык от Форта за последнее время, так что прошу простить мне "не идиоматический подход". В частности, я не собираюсь тратить время на определяющие слова и словари. Более того, мне и со SWAP, ROT и подобными фортизмами связываться не хочется. Поэтому начну я с реализации локальных переменных.
[code]create locals 1024 cells allot variable lptr locals lptr ! : loc+ ( n) cells lptr +! ; : loc ( i) lptr @ swap 2 + cells - @ ; : loc! ( x i) lptr @ swap 2 + cells - ! ; : loc: ( .. n) lptr @ >r 0 do lptr @ ! 1 loc+ loop r> lptr @ ! 1 loc+ ; : loc; -1 loc+ lptr @ @ lptr ! ;[/code]
Никаких имен, только индексы. Код с применением таких конструкций не является читабельным, но, по крайней мере, его несколько удобнее писать.
Чем потенциально хороши DSL на Форте? Помимо последовательностей слов, разделяемых пробелами, достаточно выразительно выглядят "префиксные" выражения с использованием WORD. Но работу со строками в Форте удобной не назовешь. Тот же WORD сохраняет текст во временную область. Раз уж взялся за задачу, реализую хранилище для строк.
[code]create strings 1024 allot variable sptr strings sptr ! : >str ( a - a) dup count 1 + 3 loc: sptr @ 1 loc! 0 loc sptr @ 2 loc cmove 2 loc sptr +! 1 loc loc; ;[/code]
Слово >str получает строку со счетчиком и сохраняет ее в области strings.
Как же хранить пресловутое дерево в памяти? Буду использовать классический алгоритм размещения дерева в линейном массиве. Сначала в массив помещаются дочерние узлы, затем -- родительский узел. Каждый узел состоит из числа элементов и последовательности адресов дочерних узлов.
[code]create nodes 1024 cells allot variable nptr nodes nptr ! : node+ ( n) cells nptr +! ; : node ( .. n) nptr @ >r dup r@ ! 1 node+ dup >r loc: r> 0 do i loc nptr @ ! 1 node+ loop loc; r> ;[/code]
Слово node берет со стека n дочерних узлов и формирует с их помощью новый узел в nodes.
Теперь следует заняться печатью дерева в виде S-выражения. Буду считать атомом узел, у которого вместо адреса первого дочернего узла хранится 0.
[code]: .atom ( a) count type ; : n@ ( a i - a) cells + @ ; : .ast ( a) dup 1 n@ 0 = if 2 n@ .atom exit then ." (" dup @ 2 loc: 1 loc if 0 loc 1 n@ .atom 1 loc 1 - 0 ?do ." " 0 loc i 2 + n@ recurse loop ." )" then loc; ; [/code]
Далее понадобится несколько вспомогательных слов.
[code]: id ( "name" - a) bl word >str 1 loc: 0 0 loc 2 node loc; ; : ` postpone postpone ; immediate : tree: 1 loc+ ; : tree; -1 loc+ ;[/code]
Наконец, пришло время реализовать DSL.
[code] : (var) 0 loc 1 + 0 loc! 2 1 loc: ; : var: ( "name") ` (var) c" var" ` literal id ` literal ; immediate : var; 0 loc node loc; ;
: array: ( "name") ` (var) c" array" ` literal id ` literal ; immediate : array; var; ;
: struct: ( "name") ` (var) c" struct" ` literal id ` literal ; immediate : struct; var; ;
: (type) 0 loc 1 + 0 loc! 2 node ; : type: ( "name") c" type" ` literal id ` literal ` (type) ; immediate
: max: ( "name") c" max" ` literal id ` literal ` (type) ; immediate : min: ( "name") c" min" ` literal id ` literal ` (type) ; immediate : default: ( "name") c" default" ` literal id ` literal ` (type) ; immediate : size: ( "name") c" size" ` literal id ` literal ` (type) ; immediate [/code]
Привожу пример описания и вывода структуры.
[code]: code-tree tree: struct: UserGroup var: priority type: int min: 10 max: 10 default: 10 var; array: name type: char size: MAX_GROUP_NAME_LENGTH default: "" array; struct; tree; ;
code-tree .ast
(struct UserGroup (var priority (type int) (min 10) (max 10) (default 10)) (array name (type char) (size MAX_GROUP_NAME_LENGTH) (default ""))) [/code]
Как можно видеть, ручная реализация примитивных операций в Форте не так уж сложна. По моему опыту, она во многих случаях проще, чем попытки приспособить какие-то готовые конструкции из стандартного Форта. Как известно, Форт -- язык не алгебраический. И дело тут даже не в отсутствии способов записи инфиксных выражений. В Форте, к сожалению, мало уделяется внимания таким важным свойствам математических структур, как замкнутость и композиционность.
|
|
|
|
Добавлено: Сб апр 08, 2017 15:31 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
Hishnik писал(а): HERE всегда возвращает адрес первой свободной ячейки в пространстве данных. Да. Так точнее. Hishnik писал(а): При реализации Форта в машинном коде HERE вообще не изменяется при работе CREATE. При использовании шитого кода возможны разные варианты, зависящие от того, что именно разработчик хочет хранить в данных. Ну тут каша какая-то. Вы явно пытаетесь мне объяснить очевидные вещи, но мне сложно следить за ходом Вашей мысли. Приходится переспрашивать. Вы хотите сказать, что при написании форта на ассемблере (правильно я понял?) CREATE ничего не компилирует на вершину словаря (кодофайла)? Я размышлял о системе с изолированными адресными пространствами. Отдельное для стека возвратов, отдельное для стека данных, отдельное для низкоуровневого кода, отдельное для кодофайла. Неоправданно сложно получалось.
[quote="Hishnik"] HERE всегда возвращает адрес первой свободной ячейки в пространстве данных.[/quote] Да. Так точнее. [quote="Hishnik"] При реализации Форта в машинном коде HERE вообще не изменяется при работе CREATE. При использовании шитого кода возможны разные варианты, зависящие от того, что именно разработчик хочет хранить в данных.[/quote] Ну тут каша какая-то. Вы явно пытаетесь мне объяснить очевидные вещи, но мне сложно следить за ходом Вашей мысли. Приходится переспрашивать. Вы хотите сказать, что при написании форта на ассемблере (правильно я понял?) CREATE ничего не компилирует на вершину словаря (кодофайла)? Я размышлял о системе с изолированными адресными пространствами. Отдельное для стека возвратов, отдельное для стека данных, отдельное для низкоуровневого кода, отдельное для кодофайла. Неоправданно сложно получалось.
|
|
|
|
Добавлено: Сб апр 08, 2017 11:17 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
vpn289 писал(а): HERE во время создания слова указывает в несколько разных мест. По завершению работы CREATE, да, HERE указывает на поле параметров. HERE всегда возвращает адрес первой свободной ячейки в пространстве данных. При реализации Форта в машинном коде HERE вообще не изменяется при работе CREATE. При использовании шитого кода возможны разные варианты, зависящие от того, что именно разработчик хочет хранить в данных.
[quote="vpn289"]HERE во время создания слова указывает в несколько разных мест. По завершению работы CREATE, да, HERE указывает на поле параметров.[/quote] HERE всегда возвращает адрес первой свободной ячейки в пространстве данных. При реализации Форта в машинном коде HERE вообще не изменяется при работе CREATE. При использовании шитого кода возможны разные варианты, зависящие от того, что именно разработчик хочет хранить в данных.
|
|
|
|
Добавлено: Сб апр 08, 2017 00:49 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
Hishnik писал(а): Стоп, разбираемся с начала. Что делает CREATE? Оно выбирает из входного потока имя и создает в словаре слово. Это слово сразу содержит код push xxx ret, где xxx - HERE на момент создания слова. Ох уж этот "момент" создания слова HERE во время создания слова указывает в несколько разных мест. По завершению работы CREATE, да, HERE указывает на поле параметров. (Хотя многие и не верят в поле параметров, но оно есть всегда Теперь ясно, что Вы имели ввиду. Пусть теперь топикстартер поподробнее разъяснит задачу. Сдается мне некорректна она несколько. Или он или я за деревьями леса не видим.
[quote="Hishnik"] Стоп, разбираемся с начала. Что делает CREATE? Оно выбирает из входного потока имя и создает в словаре слово. Это слово сразу содержит код push xxx ret, где xxx - HERE на момент создания слова. [/quote] Ох уж этот "момент" создания слова :) HERE во время создания слова указывает в несколько разных мест. По завершению работы CREATE, да, HERE указывает на поле параметров. (Хотя многие и не верят в поле параметров, но оно есть всегда :) Теперь ясно, что Вы имели ввиду. Пусть теперь топикстартер поподробнее разъяснит задачу. Сдается мне некорректна она несколько. Или он или я за деревьями леса не видим.
|
|
|
|
Добавлено: Сб апр 08, 2017 00:18 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
vpn289 писал(а): Не понял. CREATE кладет на стек pfa. DOES> заменяет действие CREATE, подменяет поле кода слова, определенного через CREATE на действие после DOES>. Только перед действием по DOES> на стеке лежит еще pfa, слова определенного через CREATE. HERE там разный. А как определена структура? Почитаю-ка тред еще. Стоп, разбираемся с начала. Что делает CREATE? Оно выбирает из входного потока имя и создает в словаре слово. Это слово сразу содержит код push xxx ret, где xxx - HERE на момент создания слова. CREATE часто ассоциируют с "конструкцией CREATE DOES>", но на самом деле DOES> не обязано каждый раз закрывать CREATE. Вот такой пример создает массивы. Код: CREATE X[] 100 ALLOT CREATE Y[] 100 ALLOT X[] будет создан так, чтобы класть на стек, допустим, 10000. После этого совершенно независимая от CREATE конструкция 100 ALLOT передвинет HERE, и в момент вызова второй строчки Y[] будет создан так, чтобы класть на стек уже 10100. Теперь что делает DOES>. Оно принудительно затирает последнюю команду (а это ret) в только что созданном слове и вписывает туда jmp на себя. Поэтому если мы определим константу, прямо в том виде, как описано у Баранова, то получится: Код: : CONSTANT CREATE , DOES> @ ;
5 CONSTANT ПЯТЬ Итак, ПЯТЬ сначала положит на стек HERE (но не текущий, а тот, который был на момент его создания, т.е. это не вызов HERE, а просто число). Запятая после CREATE уже занесла в эту ячейку число со стека. Код слова ПЯТЬ после DOES> выглядит уже как push xxx jmp, и перейдет оно на "хвост" после DOES>. А там @. Поэтому ПЯТЬ сначала положит на стек адрес ячейки, где лежит значение константы, а потом прочитает на стек число из этого адреса памяти. Вот такой нехитрый прием позволяет сделать много полезного. Оно выглядит как связанные действия, но таковыми не является.
[quote="vpn289"]Не понял. CREATE кладет на стек pfa. DOES> заменяет действие CREATE, подменяет поле кода слова, определенного через CREATE на действие после DOES>. Только перед действием по DOES> на стеке лежит еще pfa, слова определенного через CREATE. HERE там разный. А как определена структура? Почитаю-ка тред еще.[/quote] Стоп, разбираемся с начала. Что делает CREATE? Оно выбирает из входного потока имя и создает в словаре слово. Это слово сразу содержит код push xxx ret, где xxx - HERE на момент создания слова. CREATE часто ассоциируют с "конструкцией CREATE DOES>", но на самом деле DOES> не обязано каждый раз закрывать CREATE.
Вот такой пример создает массивы.
[code]CREATE X[] 100 ALLOT CREATE Y[] 100 ALLOT[/code]
X[] будет создан так, чтобы класть на стек, допустим, 10000. После этого совершенно независимая от CREATE конструкция 100 ALLOT передвинет HERE, и в момент вызова второй строчки Y[] будет создан так, чтобы класть на стек уже 10100.
Теперь что делает DOES>. Оно принудительно затирает последнюю команду (а это ret) в только что созданном слове и вписывает туда jmp на себя. Поэтому если мы определим константу, прямо в том виде, как описано у Баранова, то получится:
[code]: CONSTANT CREATE , DOES> @ ;
5 CONSTANT ПЯТЬ[/code]
Итак, ПЯТЬ сначала положит на стек HERE (но не текущий, а тот, который был на момент его создания, т.е. это не вызов HERE, а просто число). Запятая после CREATE уже занесла в эту ячейку число со стека. Код слова ПЯТЬ после DOES> выглядит уже как push xxx jmp, и перейдет оно на "хвост" после DOES>. А там @. Поэтому ПЯТЬ сначала положит на стек адрес ячейки, где лежит значение константы, а потом прочитает на стек число из этого адреса памяти.
Вот такой нехитрый прием позволяет сделать много полезного. Оно выглядит как связанные действия, но таковыми не является.
|
|
|
|
Добавлено: Пт апр 07, 2017 23:45 |
|
|
|
|
|
Заголовок сообщения: |
Re: Генератор на Форте кода для C |
|
|
Hishnik писал(а): Конкретно, при использовании внутри слова оно должно класть на стек имя этого слова. Hishnik писал(а): Нет, идея в том, чтобы создать слово, кладущее на стек указатель на структуру. Маркетоиды ошибок не признают-с! Хотя, скорее всего, он и в первый, и во второй раз писал, не думая...
[quote="Hishnik"]Конкретно, при использовании внутри слова оно должно класть на стек имя этого слова.[/quote] [quote="Hishnik"]Нет, идея в том, чтобы создать слово, кладущее на стек указатель на структуру.[/quote] Маркетоиды ошибок не признают-с! Хотя, скорее всего, он и в первый, и во второй раз писал, не думая...
|
|
|
|
Добавлено: Пт апр 07, 2017 23:32 |
|
|
|
|