Forth http://fforum.winglion.ru/ |
|
Креншоу, Давайте создадим компилятор (на Форт :) http://fforum.winglion.ru/viewtopic.php?f=2&t=3140 |
Страница 1 из 5 |
Автор: | KPG [ Сб сен 16, 2017 17:13 ] |
Заголовок сообщения: | Креншоу, Давайте создадим компилятор (на Форт :) |
Скомпоновал предварительно материал на основе рускоязычного перевода: Джек Креншоу. Давайте создадим компилятор! и варианта с иллюстрацией на IForth В тексте есть ещё не обработанные моменты (дальше можно подпровлять) и лишние места в сравнении и с IForth версией, но воможно и такой вариант пока будет тоже познавательным. Аддаптациию к особенностям другой Форт-системы не делал ещё. Креншоу_Iforth.rtf.zip в формате RTF[ Креншоу_Iforth в формате PDF P.S. Понимаю, что материал ещё несколько сыроват и требует к себе некоторого внимания для приведения к законченному виду, если это по данной тематике возможно В этой же теме можно делать замечания, правки и обсуждения. Хотя, программируя на Форт, можно обходится и без создания "компиляторов". Разместил в данном подфоруме т.к. здесь возможно добавлять мне файлы (модераторы могут перенести в подходящее место) Думаю, что данный материал может демонстрировать часть сильных сторон Форт подхода в учебных целях. |
Автор: | KPG [ Вс сен 17, 2017 23:07 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
Встретился такой вариант небольшой реализации (по классике) по вычислению скобочного выражения. |
Автор: | Victor__v [ Чт сен 21, 2017 12:10 ] | ||
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) | ||
Раз пошёл такой разговор Однако, нет приоритета операций.
|
Автор: | Ethereal [ Пн сен 25, 2017 09:11 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
С приоритетом операций будет примерно вот так : Код: REQUIRE CASE lib\ext\case.f Тут инфиксное выражение выворачивается постфиксным и сразу фортовскими операциями + - * / NEGATE считается.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 Тут можно сделать конечно проще, но я сохранил логику компилятора - входной поток литер ch преобразуется в поток синтаксических сущностей (символов) sym и уже они разгребаются. На вырост, так сказать. |
Автор: | KPG [ Чт янв 21, 2021 05:51 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
На сайте решений rosettacode.org нет примерa на Форт по решению задачи разбора арифметического выражения Arithmetic evaluation P.S, А, на Github есть и такой ещё проект cc64 is a small-C compiler, written in Forth, targeting the 6502 CPU. |
Автор: | Ethereal [ Чт фев 04, 2021 00:13 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
Ну вот нарисовал навскидку. На 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 Если на ваш взгляд эта прожка достойна представлять Форт на том сайте, ну так закиньте туда. А если не совсем, то разрешаю ее причесать. Алгоритм синтаксичесого разбора в ней выписан архинаглядно и с поюзанием достоинств Форта. Разбор выворачивает выражение постфиксно и в процессе разбора параллельно по фортовски на стеке считает. З.Ы. Чуть исправил, чтобы полаконичней было. |
Автор: | Total Vacuum [ Пн мар 01, 2021 15:29 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
Забавно, что наверху плавают две темы с противоположным смыслом: "Форт на ЯВУ" и "Давайте создадим компилятор (на Форт)" (т.е. "ЯВУ на Форт", если простыми словами)... Надо сделать компилятор на Форт, а потом подключить forth.h, чтобы прикрутить Форт к этому компилятору... |
Автор: | Hishnik [ Вт мар 02, 2021 01:37 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
Компилятор чего-нибудь на Форте - это отголосок попыток хоть как-то популяризовать Форт. Причем устаревшими приемами - дескать, давайте напишем что-нибудь крутое, все увидят, какой Форт мощный и бросятся его изучать. А вот недавняя программа анализа трафика наглядно показала, что результаты получаются существенно меньшими усилиями. Собственно, и предыдущая большая волна Форта базировалась на eServ и nnCron. |
Автор: | zma [ Вт мар 02, 2021 11:35 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
Мне кажется, Форт никогда не будет популярен в роли универсального языка так, как популярны, например, C++ или Java, хотя бы за счёт непривычного синтаксиса. Да это и не нужно (что получит конкретный фортер от этой популярности?). А в роли метода разработки языка под задачу он и так себя замечательно сейчас чувствует. Не лишним, может, было бы систематизировать современный подход к применению этого метода в какой-нибудь брошюре/статье для новичков, а то при изучении языка приходилось адаптировать описываемые в литературе системы (написанные на ассемблере, 16-битные и с блоками по 1024 байта) к текущему положению дел (обилие языков высокого уровня и трансляторов для них, наличие библиотек для решения большинства распространённых задач, возможность взаимодействия различных программных компонентов в рамках одного приложения для решения более сложных задач). |
Автор: | Hishnik [ Ср мар 03, 2021 11:26 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
zma писал(а): Не лишним, может, было бы систематизировать современный подход к применению этого метода в какой-нибудь брошюре/статье для новичков, а то при изучении языка приходилось адаптировать описываемые в литературе системы Видимо, пора... |
Автор: | KPG [ Ср мар 03, 2021 11:40 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
zma писал(а): Не лишним, может, было бы систематизировать современный подход к применению этого метода в какой-нибудь брошюре/статье для новичков, а то при изучении языка приходилось адаптировать описываемые в литературе системы Есть и перевод, в частности Jonesforth Минимальный Forth с нуля P.S. Реализации, например на С, можно брать и из всего многообразия Форт-систем сделанных на Си. ("отсечь лишнее" может оказаться эффективнее чем "нарастить") В других "особенных" случаях, да имеет смысл документировать полученные схемы/решения в реализации каких то Форт-систем. Вот со "собиранием" реализованной алгоритмической базы Форт кода в море i-net не всегда очевидно что и где для начинающих. Здесь отправные точки для этого можно как то актуализировать в рамках местного форума в каком то топике - типа FAQ. (как пример такой отправной точки FLAG ), и других разных источников, в том числе и самих Форт-систем. Hishnik писал(а): Видимо, пора... При малой пользовательской базе Форт и самодостаточности фортёров не так очевидно видимо. |
Автор: | Hishnik [ Ср мар 03, 2021 12:02 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
KPG писал(а): Есть и перевод, в частности Jonesforth Минимальный Forth с нуля Можно и "минимальнее". Ассемблер некоторым образом уходит из Форт-мейнстрима, по разным причинам. Компактность и скорость перестают быть ключевыми аргументами, потому что такая компактность на многих платформах уже не актуальна, а скорость все равно не сравнится со скоростью кода, написанного без промежуточной стековой прослойки. |
Автор: | KPG [ Ср мар 03, 2021 13:44 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
zma писал(а): Мне кажется, Форт никогда не будет популярен в роли универсального языка так, как популярны, например, C++ или Java, хотя бы за счёт непривычного синтаксиса. Да это и не нужно (что получит конкретный фортер от этой популярности?). Достаточно и того, чтобы он был нормально известен в мире IT и, чтобы, например, тот же Github был проиндексирован на предмет его использования в разных вариантах и сторонних языков. P.S. У ассемблера ещё более "необычный синтаксис", но это не делает его не применимым. При наличии на рынке MISC-Forth процессоров/контроллеров, а не только их реализации в FPGA, Форт и вполне конкурентен в "ассемблерном" использовании. Примеры же были, например и даже с отсылкой к четырёх-битному MARC4 контроллеру в портфеле бывшей Atmel, но они его не развивали и даже инструменты работы с ним оставили в ДОС исполнении. |
Автор: | Hishnik [ Ср мар 03, 2021 14:11 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
KPG писал(а): Достаточно и того, чтобы он был нормально известен в мире IT и, чтобы, например, тот же Github был проиндексирован на предмет его использования в разных вариантах и сторонних языков. А для чего это нужно - известность, индексация? Болеть за Форт, как за породистого рысака, сидя на трибунах? |
Автор: | KPG [ Ср мар 03, 2021 14:22 ] |
Заголовок сообщения: | Re: Креншоу, Давайте создадим компилятор (на Форт :) |
Hishnik писал(а): А для чего это нужно - известность, индексация? Болеть за Форт, как за породистого рысака, сидя на трибунах? Может голосование провести по этому пунктику? P.S. Кстати, интересно, что например DSP процессоры от Analog Devices начального уровня для обработки аудио сигнала (типа ADAU 1467, 1452, 1701 ... на ядре Sigma) программируются в рамках графической среды SigmaStudio и вот в рамках, например, внутреннего промежуточного представления программы Форт мог, наверное, тоже не плохо вписаться с его свойствами. |
Страница 1 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |