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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 236 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8 ... 16  След.
Автор Сообщение
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Вс июл 21, 2019 00:11 
Не в сети
Administrator
Administrator
Аватара пользователя

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

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

https://ria.ru/20160906/1476195857.html


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Вс июл 21, 2019 19:29 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 463
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
Друзья, всем спасибо за содержательные и развернутые ответы. Понимания стало чуточку больше. Но, естественно, мне еще нужно какое-то время повариться в этой каше, чтобы все окончательно расставить по полочкам. :D


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Вс июл 21, 2019 19:42 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 463
Откуда: Москва
Благодарил (а): 57 раз.
Поблагодарили: 22 раз.
f02732 писал(а):
Фишка форта в расширяемости, если у тебя нет возможности быть самому себе парсером и компилятором, нет возможности создавать оперделяющие слова, immediate слова, то ты точно не форт, даже если включаешь много слов из него.

Рассмотрим частный случай: есть некий кросс-компилятор, который запускается на ПК и получая на вход текст программы на Форте, на выходе выдает "прошивку" для какого-нибудь микроконтроллера. При этом используется подпрограммный шитый код.

Так вот. Сразу появляются вопросы. Для чего такому компилятору нужно уметь компилировать еще и себя, выдавая на выходе исполняемый файл для x86? А если этот компилятор написан не на Форте, тоже должен уметь? Нужен ли в таком трансляторе режим интерпретации? И, если не нужен, то есть ли необходимость в наборе слов, используемых в этом режиме?

И немножко не по теме вопрос: в чем принципиальная разница между
Код:
1024 CONSTANT SIZE
и
Код:
: SIZE 1024 ;

Понятно, что для этих случаев может генерироваться разный код, но все-таки...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Вс июл 21, 2019 20:13 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Total Vacuum писал(а):
Рассмотрим частный случай: есть некий кросс-компилятор, который запускается на ПК и получая на вход текст программы на Форте, на выходе выдает "прошивку" для какого-нибудь микроконтроллера.
Ну, самое по Фортовски будет запускать Форт не на ПК, а на железяке внутри которой микроконтроллер. Для этого железяке нужно иметь только две вещи :
1.) RS232
2.) Возможность самоперешивания флеш.
Тогда к железяке можно будет подключиться терминалом и собирать и отлаживать программу прямо на ней. Компиляция всей программы при этом будет выглядеть как копипаст всего исходника в терминал. Я такое уже делал (запихнул Форт в приемник спутникового телевидения и еще запихнул в смарт-карту). Побочным эффектом такого подхода является то, что к железяке всегда можно подключиться терминалом и управлять ее вручную. Для этого в железяке надо предусмотреть какую нибудь перемычку, которую замкнул и управление вывалилось на QUIT, т.е. на управление от терминала. Или какую-нибудь другую внешнюю команду. Космические системы например так делают, когда железяку, которая уже на орбите, можно перевести в управление через терминал и перегрузить заново в нее исправленный софт или поуправлять ей вручную.

А кросскомпилятор запускаемый на ПК это технология в которой Форт слабо раскрывает свои достоинства. Это технология, взятая от других языков. В ней Форт не лучше прочих.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Вс июл 21, 2019 20:35 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Total Vacuum писал(а):
Нужен ли в таком трансляторе режим интерпретации?
Ну классически в Форте исходник программы - это тоже программа. Которая интерпретируется и в процессе своей интрепретации в частности может породить другую программу, которая будет исполняться потом. Именно так на Форте создаются exe-шники. Исходник интерпретируется и исполняясь создает exe-шник, который будет исполняться потом. В этом смысле интерпретатор нужен. Просто при кросс-компиляции одно и то-же слово будет иметь два смысла. Один смысл будет в словаре FORTH, а второй в словаре COMPILER . Например слово 1+ в словаре FORTH будет иметь код для ПК, а в словаре COMPILER код для контроллера. Можно сделать чтобы в режиме интерпретации слова брались из словаря FORTH , а в режиме компиляции из словаря COMPILER . Правда я кросс-компилятора никогда не создавал и представляю все это только гипотетически.

Но также никто ведь не запрещает написать программу-транслятор, которая разбирая исходник на Форте будет создавать прошивку для микроконтроллера. Но это уже совсем другая технология из других языков. Тут уже как бы дух Форта выветрится и получится просто компилятор. Правда необычного, шитого кода. И в нем слова интерпретатора будут не нужны. Зато будет нужен написанный парсер транслятора. Одно теряем, другое появляется.

Это вот как бы три разных подхода - Форт в микроконтроллере, Форт-система которая кросс-компилирует вплоть до того что себя сама в духе cmForth Чарльза Мура (который я уже два раза садился разбирать, но не догнал и половины, понял только, что Мур на всю голову грохнутый гений) и просто кросс-компилятор Форта как обычный компилятор, ничем не примечательный.


Последний раз редактировалось Ethereal Вс июл 21, 2019 21:39, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Вс июл 21, 2019 21:07 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Total Vacuum писал(а):
И немножко не по теме вопрос: в чем принципиальная разница между
Код:
1024 CONSTANT SIZE
и
Код:
: SIZE 1024 ;

Понятно, что для этих случаев может генерироваться разный код, но все-таки...
В первом случае значение константы может удобно вычисляться в процессе интерпретации исходника программы.

Пример, поддержка записей :
: -- ( n1 n2 -- n1+n2 ) CREATE OVER , + DOES> @ + ;

Определяем запись как тип :
0
CELL -- style
CELL -- lpfnWndProc
CELL -- cbClsExtra
CELL -- cbWndExtra
CELL -- hInstance
CELL -- hIcon
CELL -- hCursor
CELL -- hbrBackground
CELL -- lpszMenuName
CELL -- lpszClassName
CONSTANT sizeof(WindowClass) \ автоматически вычисленный размер сделали константой

Создаем экземпляр записи :
CREATE wc sizeof(WindowClass) ALLOT wc sizeof(WindowClass) ERASE

Доступ к полю записи :
HEX
400000 wc hInstance !

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Вс июл 21, 2019 22:00 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Total Vacuum писал(а):
Рассмотрим частный случай: есть некий кросс-компилятор, который запускается на ПК и получая на вход текст программы на Форте, на выходе выдает "прошивку" для какого-нибудь микроконтроллера. При этом используется подпрограммный шитый код.

Так вот. Сразу появляются вопросы. Для чего такому компилятору нужно уметь компилировать еще и себя, выдавая на выходе исполняемый файл для x86? А если этот компилятор написан не на Форте, тоже должен уметь? Нужен ли в таком трансляторе режим интерпретации? И, если не нужен, то есть ли необходимость в наборе слов, используемых в этом режиме?


Хорошее дело, у нас таких инструментов в одно время было написано довольно много - еще во времена, когда за Си для МК надо было платить деньги. Даже сейчас этот вопрос не стоит считать закрытым, потому что на подпрограммном ШК можно в итоге сделать определенные "шаги в сторону" относительно компилятора Си - либо по размеру кода, либо по апдейтам софта, либо что-то еще.

Для МК обычно бывало так:
1. Минимально рабочий вариант - все компилируется на ПК, в МК пишется готовый образ памяти... ура, работает, доделываем проект.
2. Интерпретатор - это когда посылки байтов в качестве управляющих команд уже не хватает, да и хочется текста. Тогда появляется интерпретатор, необязательно полноценный.
3. Компилятор на борту - почему-то по факту оказался редкостью, потому что редко когда нужно тащить на апдейт именно исходные тексты. Но в принципе да, почему нет.

Поэтому лично мне кажется даже урезанный Форт в МК - вполне рабочая и пригодная к рассмотрению вещь. Интерпретатор и компилятор на борту - опционально, при наличии конкретных сценариев их использования. А если их нет, то они просто время отнимут.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Вс июл 21, 2019 22:03 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Total Vacuum писал(а):
И немножко не по теме вопрос: в чем принципиальная разница между
Код:
1024 CONSTANT SIZE
и
Код:
: SIZE 1024 ;

Понятно, что для этих случаев может генерироваться разный код, но все-таки...


CONSTANT определяется как : CONSTANT CREATE , DOES> @ ;
То есть в этом случае 1024 пойдет в память данных и передвинет HERE на одну ячейку.

Если написать : SIZE 1024 , то в коде будет что-то вроде mov eax, 1024, то есть это литерал и он будет в памяти команд. Хотя теоретически ничто не мешает организовать литералы в памяти данных, но тогда код будет только сложнее

mov eax, addr
mov eax, dword ptr [eax]

По сравнению с загрузкой литерала сразу в регистр это лишнее телодвижение и лишняя ячейка данных.

В целом это все справедливо для x86 и подобных архитектур. Где-то может быть и по-другому.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Пн июл 22, 2019 11:53 
Не в сети

Зарегистрирован: Пн июл 01, 2019 14:01
Сообщения: 69
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Total Vacuum писал(а):
Для чего такому компилятору нужно уметь компилировать еще и себя, выдавая на выходе исполняемый файл для x86? А если этот компилятор написан не на Форте, тоже должен уметь? Нужен ли в таком трансляторе режим интерпретации? И, если не нужен, то есть ли необходимость в наборе слов, используемых в этом режиме?

Я говорил не компиляции себя, а о расширении себя. Например как выше в сообщении Hishnik'а определение слова CONSTANT, и это слово после определения может сразу использоваться. И такие слова в форте обычное дело. Вот например:
Код:
\ тут CONSTANT интерпретируется (выбирает следуещее за ним слово и создаёт для
\ него определение с нужной семантикой):
0 CONSTANT FALSE
-1 CONSTANT TRUE
1 CONSTANT MAYBE

\ а тут оно будет скомпилировано
\ и будет вызыватся при вызове (FLAG)
: (FLAG)  ( n "<spaces>name" -- n*2 )
   DUP CONSTANT 2* ;

: FLAGS: ( n "ccc<eol>" -- )
   BEGIN
     SkipDelimiters
     >IN @ #TIB @ <
   WHILE
     (FLAG)  \ опять скомпилировали определяющее слово
   REPEAT DROP ;

\ теперь у нас есть новая конструкция

\ тут FLAGS: интерпретируется, и почти само занимется парсингом оставшейся
\ строки (через вызов (FLAGS) , которое в свою очередь зовёт CONSTANT ,
\ FLAGS: только следит достигнут ли конец строки):
1 FLAGS: A B C D B' Z

Я не знаю как такое делать без режима интерпретации.

Или, например, управляющие слова (BEGIN WHILE IF и пр.), слова S" [CHAR] LITERAL и многие другие являются IMMEDIATE-словами (слова которые интерпретируются в режиме компиляции), возможны и такие пользовательские слова. Вот, например, ломаем цикл BEGIN ... WHILE ... UNTIL ... ELSE ... THEN (SPF only, из-за особенности реализации управляющих слов):
Код:
: (IF1)  ( -- orig 1 / flag -- )  POSTPONE IF 1 ;
: (IF2)  ( n -- orig n+1 / flag -- )  POSTPONE IF ROT 1+ ;
' (IF1) ->VECT IF IMMEDIATE

: ELSE  ( origA n -- origB n / -- )
   -ROT POSTPONE ELSE ROT
   ['] (IF2) TO IF ; IMMEDIATE

: THEN  ( orig*n n -- / -- ) CR DEPTH .
   0 DO 4 . POSTPONE THEN LOOP
   ['] (IF1) TO IF ; IMMEDIATE



: TEST
   DUP 1 =
   IF  ." ONE"
   ELSE  DUP 2 =  IF  ." TWO"
   ELSE  DUP 3 =  IF  ." THREE"
   ELSE  DUP 4 =  IF  ." FORTH"
   ELSE  ." SOMETHING OTHER"
   THEN DROP CR ;

В вашем воображаемом кросс-компиляторе такое вряд ли возможно.

В этом кстати кроется один из минусов форта: программа на форте в качестве рантайма требует саму форт-систему, поэтому его не уместишь в совсем дохлые контроллеры, например, с 1 Кб памяти.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Пн июл 22, 2019 12:19 
Не в сети

Зарегистрирован: Пн июл 01, 2019 14:01
Сообщения: 69
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Total Vacuum писал(а):
в чем принципиальная разница между
Код:
1024 CONSTANT SIZE
и
Код:
: SIZE 1024 ;

Как уже написал Ethereal не годится при случае когда константа вычисляется перед определением, вариант : SIZE 1024 1024 * ; в системе без оптимизатора всегда будет сперва вычислятся, вариант : SIZE [ 1024 1024 * ] LITERAL ; неудобен и некрасив. А переписать код приведёный Ethereal в таком виде вряд ли получится.

В добавок ко всему CONSTANT может быть оптимизировано, например:
Код:
: CONSTANT
   CREATE ,
   DOES> @
     STATE @
     IF
       [ BASE @ HEX ]  \ кстати о необходимости 2-х режимов
       68 C, ,  \ 0x68 -- push на x86
       [ BASE ! ]
     THEN ;

Т.е. с 1024 CONSTANT SIZE в коде будет пуш, а с : SIZE 1024 ; скорее всего будет вызов подпрограмы.

PS. SP-Forth справляется с оптимизацией такого случая (определение через : вместо CONSTANT) до простого PUSH, а SwiftForth нет.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Пн июл 22, 2019 12:35 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
f02732 писал(а):
Total Vacuum писал(а):
предлагаю в качестве эксперимента упростить Форт до неприличия

Например, хардкорная версия набора слов:
Код:
C@ C! EXECUTE
и числа, остальное можно реализовать с помощью них (при условии, конечно, что код и данные в одном адресном пространстве и мы знаем о внутреннем устройстве системы).
Касперски бы оценил :D

Да уж и такое было :)
A 3-INSTRUCTION FORTH FOR EMBEDDED SYSTEMS WORK


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Пн июл 22, 2019 12:49 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
f02732 писал(а):
В добавок ко всему CONSTANT может быть оптимизировано, например:
Код:
: CONSTANT
   CREATE ,
   DOES> @
     STATE @
     IF
       [ BASE @ HEX ]  \ кстати о необходимости 2-х режимов
       68 C, ,  \ 0x68 -- push на x86
       [ BASE ! ]
     THEN ;

Т.е. с 1024 CONSTANT SIZE в коде будет пуш, а с : SIZE 1024 ; скорее всего будет вызов подпрограмы.

PS. SP-Forth справляется с оптимизацией такого случая (определение через : вместо CONSTANT) до простого PUSH, а SwiftForth нет.


Лучше так не делать. Когда при компиляции чего-либо потребуется исполнить константу, это приведёт к ошибкам.
Это вредная оптимизация.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Пн июл 22, 2019 13:12 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
f02732 писал(а):
Вот, например, ломаем цикл BEGIN ... WHILE ... UNTIL ... ELSE ... THEN (SPF only, из-за особенности реализации управляющих слов): В вашем воображаемом кросс-компиляторе такое вряд ли возможно.
Возможно в любом компиляторе, если определять так
: BEGIN HERE ; IMMEDIATE \ Неизбежное определение, если неразрешенные ссылки хранить на некоем стеке
: WHILE POSTPONE IF SWAP ; IMMEDIATE \ Вот такая форма WHILE очень удачна
тогда UNTIL будет сжирать HERE от BEGIN и будет оставаться голый IF


Последний раз редактировалось Ethereal Пн июл 22, 2019 13:14, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Пн июл 22, 2019 13:14 
Не в сети

Зарегистрирован: Пн июл 01, 2019 14:01
Сообщения: 69
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Victor__v писал(а):
Когда при компиляции чего-либо потребуется исполнить константу, это приведёт к ошибкам.

Вы про случай типа:
Код:
: [do-smth]  ' EXECUTE ( ... )  ; IMMEDIATE
?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Что есть Форт?
СообщениеДобавлено: Пн июл 22, 2019 13:25 
Не в сети

Зарегистрирован: Пн июл 01, 2019 14:01
Сообщения: 69
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Ethereal писал(а):
Возможно в любом компиляторе

Это я к тому, зачем форту интерпретация. В простом компиляторе предложенном Total Vacuum'ом:
Total Vacuum писал(а):
некий кросс-компилятор, который запускается на ПК и получая на вход текст программы на Форте, на выходе выдает "прошивку" для какого-нибудь микроконтроллера.
[...]
Нужен ли в таком трансляторе режим интерпретации?

Это вряд ли будет возожным.

И потому я и написал "ломаем", потому что я переопределил IF ELSE THEN и на стеке они оставляют совсем другие значения.


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

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


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

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


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

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