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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 67 ]  На страницу 1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Сб сен 16, 2017 17:13 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Скомпоновал предварительно материал на основе рускоязычного перевода: Джек Креншоу. Давайте создадим компилятор!
и варианта с иллюстрацией на IForth
В тексте есть ещё не обработанные моменты (дальше можно подпровлять) и лишние места в сравнении и с IForth версией, но воможно и такой вариант пока будет тоже познавательным.
Аддаптациию к особенностям другой Форт-системы не делал ещё.

Креншоу_Iforth.rtf.zip в формате RTF[
Креншоу_Iforth в формате PDF


P.S. Понимаю, что материал ещё несколько сыроват и требует к себе некоторого внимания для приведения к законченному виду, если это по данной тематике возможно :)
В этой же теме можно делать замечания, правки и обсуждения. Хотя, программируя на Форт, можно обходится и без создания "компиляторов".
Разместил в данном подфоруме т.к. здесь возможно добавлять мне файлы (модераторы могут перенести в подходящее место)
Думаю, что данный материал может демонстрировать часть сильных сторон Форт подхода в учебных целях. :)


Последний раз редактировалось KPG Ср фев 23, 2022 22:09, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Вс сен 17, 2017 23:07 
Не в сети

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



За это сообщение автора KPG поблагодарил: vikt
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Чт сен 21, 2017 12:10 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Раз пошёл такой разговор
Однако, нет приоритета операций.


Вложения:
short-mat.f [1.19 Кб]
Скачиваний: 1755

_________________
Цель: сделать 64-битную Нову под Винду
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Пн сен 25, 2017 09:11 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
С приоритетом операций будет примерно вот так :
Код:
REQUIRE CASE    lib\ext\case.f
REQUIRE /STRING lib\include\string.f

\ Синтаксические символы :
0 CONSTANT null   \ неизвестный символ
1 CONSTANT plus
2 CONSTANT minus
3 CONSTANT star
4 CONSTANT slash
5 CONSTANT lparen
6 CONSTANT rparen
7 CONSTANT number
8 CONSTANT eot    \ конец входного потока или нулевая литера в нем

VARIABLE  STREAM \ указатель на текущую литеру входного потока
VARIABLE #STREAM \ число неразобранных литер во входном потоке
VARIABLE ch      \ прочитанная из входного потока литера
VARIABLE sym     \ прочитанный из входного потока синтаксический символ
VARIABLE val     \ прочитанное из входного потока число

: Error
  ( n --)
  CASE
    0 OF ." Too big number" ENDOF
    1 OF ." ) expected"     ENDOF
    2 OF ." Wrong syntax"   ENDOF
  ENDCASE
  CR BYE
;

: Read \ чтение литеры из входного потока
  #STREAM @ DUP IF 1- #STREAM ! STREAM @ C@ STREAM 1+! THEN ch !
;

: Number \ извлечение из входного потока числа val
  ( n -- )
  val !
  BEGIN
    Read ch C@
    10 DIGIT
  WHILE
    0 val @ 10 UM* D+ IF 0 Error THEN val !
  REPEAT
;
: Get \ чтение синтаксического символа из входного потока
  BEGIN
    ch C@ 1- BL U<
  WHILE
    Read
  REPEAT
  ch C@
  CASE
    0 OF eot ENDOF
    [CHAR] + OF Read plus   ENDOF
    [CHAR] - OF Read minus  ENDOF
    [CHAR] * OF Read star   ENDOF
    [CHAR] / OF Read slash  ENDOF
    [CHAR] ( OF Read lparen ENDOF
    [CHAR] ) OF Read rparen ENDOF
    10 DIGIT TRUE OF Number number ENDOF
    null SWAP
  ENDCASE
  sym !
;

VECT @выражение

: множитель
  sym @
  CASE
    number OF val @ Get ENDOF
    lparen OF Get @выражение sym @ rparen - IF 1 Error THEN Get ENDOF
    2 Error
  ENDCASE
;

: слагаемое
  множитель
  BEGIN
    sym @
    CASE
      star  OF Get множитель * ENDOF
      slash OF Get множитель / ENDOF
      DROP EXIT
    ENDCASE
  AGAIN
;

: выражение
  sym @
  CASE
    plus  OF Get слагаемое        ENDOF
    minus OF Get слагаемое NEGATE ENDOF
    DROP слагаемое 0
  ENDCASE
  BEGIN
    sym @
    CASE
      plus  OF Get слагаемое + ENDOF
      minus OF Get слагаемое - ENDOF
      DROP EXIT
    ENDCASE
  AGAIN
;
' выражение TO @выражение

: CALCULATE
  SOURCE >IN @ /STRING #STREAM ! STREAM !
  Read Get выражение
  sym @ eot - IF 2 Error THEN . CR
  [COMPILE] \
;

CALCULATE 7 + 3 * (5 - 1) / 2
CALCULATE -7 + 3 * (5 - 1) / 2

BYE
Тут инфиксное выражение выворачивается постфиксным и сразу фортовскими операциями + - * / NEGATE считается.
Тут можно сделать конечно проще, но я сохранил логику компилятора - входной поток литер ch преобразуется в поток синтаксических сущностей (символов) sym и уже они разгребаются. На вырост, так сказать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Чт янв 21, 2021 05:51 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
На сайте решений rosettacode.org нет примерa на Форт по решению задачи разбора арифметического выражения
Arithmetic evaluation

P.S, А, на Github есть и такой ещё проект cc64 is a small-C compiler, written in Forth, targeting the 6502 CPU.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Чт фев 04, 2021 00:13 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Ну вот нарисовал навскидку. На SPF
Код:
: BAD ." Wrong syntax" BYE ;

: (GET) 0 HERE C! HERE 1 H-STDIN READ-FILE 2DROP ;
: SEPARATOR? ( -- flag ) HERE C@ 1- BL U< ;
: GET
  BEGIN
    (GET) SEPARATOR? 0=
  UNTIL
;

VECT (EXPRESSION)
: FACTOR
  HERE C@ 10 DIGIT
  IF
    BEGIN
      (GET) HERE C@ 10 DIGIT
    WHILE
      SWAP 10 * +
    REPEAT
    SEPARATOR? IF GET THEN
  ELSE
    HERE C@ [CHAR] ( - IF BAD THEN
    GET (EXPRESSION)
    HERE C@ [CHAR] ) - IF BAD THEN
    GET
  THEN
;

: TERM
  FACTOR
  BEGIN
    HERE C@ [CHAR] * =
    IF
      ['] *
    ELSE
      HERE C@ [CHAR] / =
      IF
        ['] /
      ELSE
        EXIT
      THEN
    THEN
    >R GET FACTOR R> EXECUTE
  AGAIN
;

: EXPRESSION
  HERE C@ [CHAR] - =
  IF
    GET TERM NEGATE
  ELSE
    HERE C@ [CHAR] + = IF GET THEN
    TERM
  THEN
  BEGIN
    HERE C@ [CHAR] + =
    IF
      ['] +
    ELSE
      HERE C@ [CHAR] - =
      IF
        ['] -
      ELSE
        EXIT
      THEN
    THEN
    >R GET TERM R> EXECUTE
  AGAIN
;
' EXPRESSION TO (EXPRESSION)

: MAIN
  H-STDIN FILE-SIZE NIP NIP 0= IF GET EXPRESSION HERE C@ IF BAD THEN . THEN
;

' NOOP MAINX ! ' MAIN TO <MAIN> S" CalcArithm.Exe" SAVE BYE

Использование простое. Откомпилировать. Получится файл CalcArithm.Exe
Создать какой-нибудь текстовый файл и в него поместить арифметическое выражение.
Например такое:
1 + 2*(3 - 2*(3 - 2)*((2 - 4)*5 - 22/(7 + 2*(3 - 1)) - 1)) + 1
и скормить этот файл программе на стандартный вход
CalcArithm.Exe < text.txt
Программа честно его посчитает и выдаст результат. В данном случае 60

Программа написана в беспеременном стиле. Используется только один байт по адресу HERE
Если на ваш взгляд эта прожка достойна представлять Форт на том сайте, ну так закиньте туда. А если не совсем, то разрешаю ее причесать. Алгоритм синтаксичесого разбора в ней выписан архинаглядно и с поюзанием достоинств Форта. Разбор выворачивает выражение постфиксно и в процессе разбора параллельно по фортовски на стеке считает.

З.Ы. Чуть исправил, чтобы полаконичней было.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Пн мар 01, 2021 15:29 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Вт мар 02, 2021 01:37 
Не в сети
Administrator
Administrator
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Вт мар 02, 2021 11:35 
Не в сети

Зарегистрирован: Пн янв 28, 2019 03:10
Сообщения: 174
Благодарил (а): 20 раз.
Поблагодарили: 13 раз.
Мне кажется, Форт никогда не будет популярен в роли универсального языка так, как популярны, например, C++ или Java, хотя бы за счёт непривычного синтаксиса. Да это и не нужно (что получит конкретный фортер от этой популярности?).
А в роли метода разработки языка под задачу он и так себя замечательно сейчас чувствует. Не лишним, может, было бы систематизировать современный подход к применению этого метода в какой-нибудь брошюре/статье для новичков, а то при изучении языка приходилось адаптировать описываемые в литературе системы (написанные на ассемблере, 16-битные и с блоками по 1024 байта) к текущему положению дел (обилие языков высокого уровня и трансляторов для них, наличие библиотек для решения большинства распространённых задач, возможность взаимодействия различных программных компонентов в рамках одного приложения для решения более сложных задач).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Ср мар 03, 2021 11:26 
Не в сети
Administrator
Administrator
Аватара пользователя

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

Видимо, пора...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Ср мар 03, 2021 11:40 
Не в сети

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

Есть и перевод, в частности Jonesforth Минимальный Forth с нуля

P.S. Реализации, например на С, можно брать и из всего многообразия Форт-систем сделанных на Си. :)
("отсечь лишнее" может оказаться эффективнее чем "нарастить")
В других "особенных" случаях, да имеет смысл документировать полученные схемы/решения в реализации каких то Форт-систем.

Вот со "собиранием" реализованной алгоритмической базы Форт кода в море i-net не всегда очевидно что и где для начинающих.
Здесь отправные точки для этого можно как то актуализировать в рамках местного форума в каком то топике - типа FAQ.
(как пример такой отправной точки FLAG ), и других разных источников, в том числе и самих Форт-систем.

Hishnik писал(а):
Видимо, пора...

При малой пользовательской базе Форт и самодостаточности фортёров не так очевидно видимо.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Ср мар 03, 2021 12:02 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
KPG писал(а):
Есть и перевод, в частности Jonesforth Минимальный Forth с нуля

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Ср мар 03, 2021 13:44 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
zma писал(а):
Мне кажется, Форт никогда не будет популярен в роли универсального языка так, как популярны, например, C++ или Java, хотя бы за счёт непривычного синтаксиса. Да это и не нужно (что получит конкретный фортер от этой популярности?).

Достаточно и того, чтобы он был нормально известен в мире IT
и, чтобы, например, тот же Github был проиндексирован на предмет его использования в разных вариантах и сторонних языков.

P.S. У ассемблера ещё более "необычный синтаксис", но это не делает его не применимым.
При наличии на рынке MISC-Forth процессоров/контроллеров, а не только их реализации в FPGA, Форт и вполне конкурентен в "ассемблерном" использовании.
Примеры же были, например и даже с отсылкой к четырёх-битному MARC4 контроллеру в портфеле бывшей Atmel,
но они его не развивали и даже инструменты работы с ним оставили в ДОС исполнении.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Ср мар 03, 2021 14:11 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
KPG писал(а):
Достаточно и того, чтобы он был нормально известен в мире IT
и, чтобы, например, тот же Github был проиндексирован на предмет его использования в разных вариантах и сторонних языков.

А для чего это нужно - известность, индексация? Болеть за Форт, как за породистого рысака, сидя на трибунах?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Креншоу, Давайте создадим компилятор (на Форт :)
СообщениеДобавлено: Ср мар 03, 2021 14:22 
Не в сети

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

Может голосование провести по этому пунктику? :shuffle;

P.S. Кстати, интересно, что например DSP процессоры от Analog Devices начального уровня для обработки аудио сигнала
(типа ADAU 1467, 1452, 1701 ... на ядре Sigma) программируются в рамках графической среды SigmaStudio и вот в рамках, например, внутреннего промежуточного представления программы Форт мог, наверное, тоже не плохо вписаться с его свойствами.


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

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


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

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


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

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