Войти
ФлеймФорумПрограммирование

Язык Forth - зачем нужен, что можно делать на нём?

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 329 30 Следующая »
#0
4:12, 29 авг. 2021

Я вот тут озадачился языком Forth. Краем уха слышал, что это простой и гибкий язык, в котором есть поддержка изменяющегося синтаксиса.

Поиск литературы в интеренете приводит к скучным ветхозаветным книгам советских времён, или мутным статьям на хабре.

Я не втыкаю, зачем нужен Forth?  Что на нём можно сделать?

Можно ли на нём писать игры?  Управлять регистрами аппаратуры на нём можно?  Как управлять спрайтами на Форте?

В интернете куча упоминаний: "Форт летал в космос", "На Форте писались игры для Atari".

И ещё такой вопрос: "как связать Форт и вызов нативных функций железа - типа: вывести спрайт на экран или вывести звук"?


#1
(Правка: 4:36) 4:35, 29 авг. 2021

Gradius

У нас KPG спец в этом вопросе. :)

Имхо Forth интересен тем, что среди всех не эзотерических языков программирования он максимально прост к реализации.
Как я понял большая часть проектов которые есть на github с упоминанием Forth - это не программы на Forth, а реализации Forth в различным системах, процессорных архитектурах и всяких усовершенствований к тем и другим.
Вот настолько он прост к реализации, что всякий кто с ним ознакомился первым делом пишет свою реализацию.
Я, грешным делом, уже доведя свой 16-битный виртуальный процессор с ассемблером до удобоваримого вида тоже подумываю - не запилить ли Forth на нём для полноты картины? Но пока есть много чего большего чего надо запилить и ладно пока.

А так - да, Forth в принципе работоспособен и всё можно на нём сделать. Реализаций бесчисленное множество и найдётся любая с  нужными фишками и плюшками.

P.S.

Тут даже интересно то, что если охватывать взглядом все языки программирования и выражаемые в них лейт-мотивы, то есть императивные языки, есть функциональные языки и есть Forth. :D

#2
(Правка: 5:21) 5:09, 29 авг. 2021

Gradius
> Я вот тут озадачился языком Forth. Краем уха слышал, что это простой и гибкий
> язык, в котором есть поддержка изменяющегося синтаксиса.
 
Была и есть тема местного обсуждения Форт: https://gamedev.ru/flame/forum/?id=241112

  Боюсь, что гибкость Форта может пойти в разрез с опытом использования мышления сложившегося с Си (структурам, формализмам, типизации и.т.д.) :)

В Форт что то из классики языков программирования добавляют и используют, а какие то практики считают не настолько важными чтобы ими разрушать базовую идею "простого" к использованию и пониманию языка программирования.

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

Изображение

На данной схеме вообще нет никакой информации по граматике языка. Есть только поиск СЛОВ в текущем контексте словарей, анализ признаков найденных СЛОВ ( IMMEDIATE -активное слово для немедленного выполнения, остальные компиляция, если режим компиляции или интерперетации при выполнении.) не нашли СЛОВО, пробуем его понять как число и если успех кладём его на стэк, или напечатать при соответствующем состоянии системы, иначе ошибка.

Всё!

Вся остальная специфика СЛОВ языка оговаривается в стандарте или Сам разработчик определяет из своих предпочтений и.др., но обычно с определёнными следованиями уже существующими решениями дизайна Форт-систем. Даже в выборе названий СЛОВ, не достаточно употребимых, могут быть отхождения по их семантике.

В этой схеме даже не специфицированы детали поиска слов в Форт-системе, который отдаётся на «откуп» разработчику инструментария.

P.S. Дальнейшее «само-раскручивание» Форт-системы происходит на уровне построения вариантов внутренней структуры Форт-системы (как разновидности шитого кода или нативного построения СЛОВ Форт языка, здесь же могут быть проведены и какие то оптимизации)
Это уровень «кухни» Форт-системы, обычно скрывается внутри Форт-системы, но пишется зачастую или на ассемблере или на Форт. Наиболее проста, конечно, классика Форт-систем при использовании механики шитого кода.

т.е. подытоживая формальная теория языков программирования, в общем варианте, не сможет понять логику «право-применения» найденного слова периода исполнения и компиляции сформированную программистом.
Типа даже гипотетически Форт конструкцию CREATE… DOES>

А формальное знание факта, что в начальной основе языка лежат СЛОВА разделённые пробелом, формально же даёт возможность проверки на общность Форт-систем правилам данной граматики, но не более, т.к. должны быть и более значимые результаты сего формализма.

> Поиск литературы в интеренете приводит к скучным ветхозаветным книгам советских
> времён, или мутным статьям на хабре.
  Есть и рускоязычный форум http://fforum.winglion.ru/
  На Хабре мало статей по Форт, в отличии от раздела статей на Форт-форуме.

> Я не втыкаю, зачем нужен Forth? Что на нём можно сделать?
Всё, если говорить просто, но "барьер" его понимания, возможно, придётся пройти.
(например прочтением и двух книг Броуди и Баранова для понимания - лучшая классическая литература по Форт, хоть и ориентированная на стандарт 83года, а не 94г.)

Он проще,  чем например Factor язык программирования - тоже из области конкатенативных языков программирования  Concatenative language

> Можно ли на нём писать игры? Управлять регистрами аппаратуры на нём можно?
> Как управлять спрайтами на Форте?
  Один из примеров, но есть и другие разные наработки и варианты.
  Демо игры проекта запускаемые в браузере: Mako.js
  Изображение
https://github.com/JohnEarnest/Mako

Регистрами управлять в "железном" Форте можно - смотреть как это решается в используемой Форт системе. Для "железа" их много разных понаделали.

Спрайтами в Форт как захотеть так и можно ими управлять. :)

> В интернете куча упоминаний: "Форт летал в космос", "На Форте писались игры для
> Atari".
  Да, но он, в большей степени, оставил за собой нишу встроенных систем и применение в области каких то исследования не всегда публикуемых в открытых источниках

> И ещё такой вопрос: "как связать Форт и вызов нативных функций железа - типа:
> вывести спрайт на экран или вывести звук"?
Если в общем нет Форта для конкретной железки, то его на неё портировать/сделать под свои хотелки следуя или нет общей практике использования Форт. :)

P.S. Форт настолько многогранен в силу убирания многих неоспариваемых догм программирования принятых в классике и в большей степени эксплуатации серого вещества мозга при понимании, что они вовсе не догмы для создания рабочего софт. :)

т.е. он почти всё, если не всё отдаёт на волю разработчика постулируя некоторым образом основы своего построения и понимания.

#3
(Правка: 5:16) 5:15, 29 авг. 2021

=A=L=X=
> У нас KPG спец в этом вопросе. :)
gudleifr забыли? (пока забанен на форуме, но 1-2 дня и появится),
он считает свой взгляд понимания/использования Форт наиболее правильным, хотя и был "за него" забанен на русском форт-форуме. :)

#4
5:24, 29 авг. 2021

=A=L=X=
> Как я понял большая часть проектов которые есть на github с упоминанием Forth -
> это не программы на Forth, а реализации Forth в различным системах,
> процессорных архитектурах и всяких усовершенствований к тем и другим.
> Вот настолько он прост к реализации, что всякий кто с ним ознакомился первым
> делом пишет свою реализацию.

Это прекрасно, что существует много реализацией Форта. Но для чего? Ведь не ради прикола прикручивают Форт, правда?  Какую полезную нагрузку решает Форт в этих системах?

KPG
> Боюсь, что гибкость Форта может пойти в разрез с опытом использования мышления
> сложившегося с Си (структурам, формализмам, типизации и.т.д.) :)

Если язык действительно стоящий, то можно и поднапрячь мозг прелестями обратной польской записи, ограниченным стеком и прочим.

Насколько Форт мощный, по сравнению с тем же С++ ?

KPG
> P.S. Дальнейшее «само-раскручивание» Форт-системы происходит на уровне
> построения вариантов внутренней структуры Форт-системы (как разновидности
> шитого кода или нативного построения СЛОВ Форт языка, здесь же могут быть
> проведены и какие то оптимизации)

Сколько ступеней абстракции мне нужно будет написать, чтобы, к примеру вывести пиксель на экран или послать байт в порт?

Как я понимаю, таких команд в Форте нет и надо будет делать свои нативные функции.  Как это делается?

Не похож ли подход к Форту в этом плане с подходом типа "LUA скрипт"+ виртуальная машина" ? Наподобие, как это сделано в ранее рассмотренной консоли PICO-8.

В конечном итоге, возможно ли создать  своё окружение, поддерживающее написание программ на Форт, при этом иметь доступ к железу  консоли?

Насколько это будет легко/сложно сделать?

KPG
> Спрайтами в Форт как захотеть так и можно ими управлять. :)

Как именно?
Посредством чего в Форте происходит вызов API, рисующего спрайты?

Меня интересует вопрос - каким образом Форт распознает команду вывода спрайта и отошлёт нужные действия драйверу?  Всё также ,  как в LUA и PICO-8 ?

#5
5:59, 29 авг. 2021

Gradius
> Сколько ступеней абстракции мне нужно будет написать, чтобы, к примеру вывести
> пиксель на экран или послать байт в порт?
>
> Как я понимаю, таких команд в Форте нет и надо будет делать свои нативные
> функции. Как это делается?

Делается как функция (слово) Forth типа
POKE - записывает слово на вершине стека в адрес взятый из предыдущей ячейке вершины стека.
Недословно, но как то так.
Связь с нативным кодом вообще не проблема если пишешь еще одну реализацию Forth или пользуешься миллионом готовых.

#6
(Правка: 6:49) 6:13, 29 авг. 2021

Gradius
> Это прекрасно, что существует много реализацией Форта. Но для чего? Ведь не
> ради прикола прикручивают Форт, правда? Какую полезную нагрузку решает Форт в
> этих системах?
  Необходимо смотреть в чём особенности данной Форт системы и есть ли какие то авторские примеры в ней.
Часто Форт инструментарий публикуют как открытую часть проекта сделанного на нём, а специфика может остаться закрытой. (с моей точки зрения)

Gradius
> Если язык действительно стоящий, то можно и поднапрячь мозг прелестями обратной
> польской записи, ограниченным стеком и прочим.
  "Польская" запись, стэк ... - это одна из "фишек" для использования всей гибкости языка.

Gradius
> Насколько Форт мощный, по сравнению с тем же С++ ?
ХЗ как их сравнивать, но та же объектность есть в разных Форт системах и разных реализациях. :)

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

Gradius
> Сколько ступеней абстракции мне нужно будет написать, чтобы, к примеру вывести
> пиксель на экран или послать байт в порт?
Достаточно сделать реализацию вывода пикселя и включить её в список слов для использования,
но если завязываться на какую то уже готовую реализацию то там может уже это всё есть и достаточно прочитать мануал по Словам Форт-системы.
Сами реализации Форт делаются на всём многообразии используемых языков (часто на ассемблере, если это для каких то кристаллов, но есть, к примеру, и на Rust, Haskel, C# ... даже на Python)

Gradius
> Не похож ли подход к Форту в этом плане с подходом типа "LUA скрипт"+
> виртуальная машина" ? Наподобие, как это сделано в ранее рассмотренной консоли
> PICO-8.
Отчасти может быть очень похож, но отличия могут быть очень существенны в реализациях и использовании. Форт запускают и в режиме кросс-компиляции.

Gradius
> В конечном итоге, возможно ли создать своё окружение, поддерживающее написание
> программ на Форт, при этом иметь доступ к железу консоли?
Почему нет?
Примеров таких проектов достаточно.
Как близкий пример, наиболее мне знакомый.
Среда для программирования и внутрисхемной отладки AVR и др

Gradius
> Насколько это будет легко/сложно сделать?
С "нуля" могут быть какие то сложности до того уровня как бы это хотелось иметь и видеть,
а в других вариантах всё должно быть вполне понимаемо.

Gradius
> KPG
> > Спрайтами в Форт как захотеть так и можно ими управлять. :)
>
> Как именно?
> Посредством чего в Форте происходит вызов API, рисующего спрайты?
В базисе Форта всё происходит посредством вызова СЛОВ (функциям, процедурам, "выполнения" переменных ... как то ещё, если это как то определено в Форт-системе)
получающего данные сформированные и переданные (через стэк, локально, через переменные ... как то ещё) до вызова СЛОВ.

В Форт, по классике, доступна вся внутренняя память образа Форт-системы (как и ещё по allocate)
и соответсвенно что, как, и в каких вариантах (структурах) работать с этой памятью Форт программист решает сам. Есть даже стандартное слово HERE дающее "началo" неиспользуемой памяти в загруженной системе.

P.S. т.е. Форт язык - это язык основанный на использовании понятия СЛОВО, а оно в рамках Форт-системы может являться всем чем угодно и иметь любую семантику своего исполнения.

#7
(Правка: 6:55) 6:29, 29 авг. 2021

=A=L=X=
> POKE - записывает слово на вершине стека в адрес взятый из предыдущей ячейке
> вершины стека.
> Недословно, но как то так.
Обычно  !  ( n addr -- )

но слово с названием POKE тоже может встречаться в каких то реализациях и с семантикой заданной в них

стандартное слово  PICK ( ... u – :... w )  взять из стэка u-тое число и положить его на вершину, но редко, если почти никогда не используется в Форт листингах.

P.S. Слово о Форте. Попытка формализации сути языка

Forth Information on Taygeta (c ftp архивом)

#8
(Правка: 7:01) 6:59, 29 авг. 2021

Вот нашёл реализации Форта для разных архитектур. написаны на ассемблерах:

https://github.com/phf/forth

Насколько он похож на оригинальный Форт? Есть ли там самодеятельность? Насколько можно доверять вот таким реализациям?

Вот ещё нарыл весьма наглядное поучительное руководство, давшее мне представление как можно использовать Форт:

https://radiokot.ru/forum/viewtopic.php?f=59&t=130518

С конкретными примерами.

Мне кажется, что писать на Форте очень трудоёмко.  Мало того, будет привязка к железу. А также контроль над данными сильно ужесточается.  При любом мало-мальски большом проекте, мы просто утонем в поиске ошибки.

А хочется кросс-платформенного решения.
Чтобы можно было код на разные архитектуры ставить.

Есть ли реальные примеры масштабных проектов с Фортом?  Например, типа как первые Квейк и Дум, но написанные на Форте?

#9
7:06, 29 авг. 2021

Gradius
> В интернете куча упоминаний: "Форт летал в космос", "На Форте писались игры для
> Atari".
:)
Чужие: странная архитектура инопланетных компьютеров
Старые игры на языке Форт

#10
(Правка: 7:51) 7:12, 29 авг. 2021

Gradius
> Вот нашёл реализации Форта для разных архитектур. написаны на ассемблерах:
>
> https://github.com/phf/forth
описание реализации  JONESFORTH на русском языке здесь есть http://rigidus.ru/
(вполне классика Фортостроения) на Github этот вариант есть в разных вариантах и местах

Gradius
> Мне кажется, что писать на Форте очень трудоёмко. Мало того, будет привязка к
> железу. А также контроль над данными сильно ужесточается. При любом
> мало-мальски большом проекте, мы просто утонем в поиске ошибки.
ХЗ как это оценивать, для кого то эффэктивней чем на классических Си, кто то сомневается, если зарывается в сам язык а не его практическое применение. :)

А, вообще, "быстро" осваиваешься и начинаешь думать о задаче а не языке её реализации.
Форт очень лаконичен в своей записи кода и это достаточно хорошо для обзора написанного кода.

В Форт, обычно, если ранее написанные слова проверены на их поведение, то и у слов их использующих не возникает проблем по их использованию.

Насколько проект должен быть большой, что бы с Форт в нём зарыться?
Мало ли больших в понимании Форт проектов (даже самих Форт-систем) и ничего как то делаются. :)

P.S. От железа Форт тоже можно отвязать сделав небольшую прослойку нужного DSL синтаксиса.
(теже простейшим способом добавляемые в Форт язык структуры данных)

Gradius
> А хочется кросс-платформенного решения.
> Чтобы можно было код на разные архитектуры ставить.
Задача слишком объёмная и мало кем до этого решаемая ввиду незначительной численности Форт сообщества и малого количества коммерческих предложений.
Есть Форт системы в рамках одного разработчика для разного железа
https://www.forth.com/download/
https://www.mpeforth.com/arena.htm (доступны MSP430, Arm Cortex STM32 )
http://soton.mpeforth.com/downloads/VfxCommunity/index.html

но даже с Форт, как впрочем и Си совместимость их только пока нет низкоуровневой работы с железом, хотя какие то используемые СЛОВА создают слой "HAL" совместимости по работе с тем или иным интерфейсом контроллера.

MecrispCube проект для STM32 использует ассемблерное Форт ядро Mecrisp Stellaris, а HAL от CUBE

Для кросс-платформенности делают и Форт на Си, С++ ... в разных вариантах.

Gradius
> Есть ли реальные примеры масштабных проектов с Фортом? Например, типа как
> первые Квейк и Дум, но написанные на Форте?
Вряд ли но для игр Форт, всё же не безнадёжен и на Github есть некоторые разработки вариантов графического движка на нём Например

На VFX Forth, было написано ПО ForthCAD-3D (дизайн кухонь :)

#11
7:47, 29 авг. 2021

KPG
> Насколько проект должен быть большой, что бы с Форт в нём зарыться?
> Мало ли больших в понимании Форт проектов (даже самих Форт-систем) и ничего как
> то делаются. :)

Ну вот банальная вещь - переполнение буфера во время работы программы. При определённых условиях, допустим, программист не предвидел такую возможность. Переполнение буфера затирает смежные данные и...

- программа продолжает работать, но уже не так как надо
- либо программа закроется операционной системой, когда переполнение выйдет за пределы разрешенной памяти

Такие вещи легко отлаживаются санитайзерами, которые отслеживают границы malloc/buffer во время выполнения работы программы.

А на Форте как?  Что с отладкой?

Или вызвали функцию с параметром на +/- 1 больше чем надо.  И всё... стек поплыл...  В том же С, уже на этапе компиляции будет выдана ошибка.

И ещё много всяких тонких моментов.  Как на практике такое отлаживать в Форте?

KPG
> https://github.com/JohnEarnest/Mako
KPG
> Старые игры на языке Форт

Глянул.  Это всё очень мелко.
Нужен пример масштабного проекта, хотя бы уровня NES-игры. Хитовой. Не какой-нибудь хомбрю за 5 минут.

#12
7:57, 29 авг. 2021

Gradius
> Ну вот банальная вещь - переполнение буфера во время работы программы. При
> определённых условиях, допустим, программист не предвидел такую возможность.
> Переполнение буфера затирает смежные данные и...
Линт, конечно, нетривиален для Форт, но если есть потребность, то можно и в Форт навесить всевозможные проверки на переполнение и резать их при выполнении выдавая соответствующие сообщения.
Потом, конечно, их можно отключить или убрать из кода. Почему нет?

Форт - это открытый инструмент "индивидуального" разработчика и что и как и будет ли в нём контролироваться он решает сам.

#13
(Правка: 8:12) 8:04, 29 авг. 2021

Gradius
> Глянул. Это всё очень мелко.
> Нужен пример масштабного проекта, хотя бы уровня NES-игры. Хитовой. Не
> какой-нибудь хомбрю за 5 минут.
Может и есть, но ктож знает где и как сделали игру на Форт в нём?
(хотя это и выглядит маловероятным событием)

Для "NES" (M68) были сделаны разные Форт системы и возможно кто то и игры делал.

Новый проект A Forth-based Game Boy development kit

P.S. Чем хит из 85-года Starflight плох для примера? (но в его Форт коде вряд ли можно разобраться без фанства к игре:)
https://github.com/s-macke/starflight-reverse

#14
8:11, 29 авг. 2021

KPG
> Форт - это открытый инструмент "индивидуального" разработчика и что и как и
> будет ли в нём контролироваться он решает сам.

Это не есть хорошо для случая, когда нужно сосредоточиться на написании самой программы. Придётся тратить время ещё и на создание средств отладки.

Проще говоря, для Форта отсутствует  понятие "тулчейн" - комплект разработки.
Это - уровень NES-ассемблера.  Далеко на таком подходе не уедешь.

Да, можно наворотить макросы или процедуры....  Но, покажите хоть реально нормальный пример масштабной игры на Форте!

KPG
> P.S. Чем хит из 85-года Starflight плох для примера? (но в его Форт коде вряд
> ли можно разобраться без фанства к игре:)
> https://github.com/s-macke/starflight-reverse

Вы меня простите, но называть ЭТО игрой, у меня язык не поворачивается.

Лучше что-нибудь из жанра динамичного 2д-скроллера а-ля  "Градиус" или "Thunder Force" на СЕГАх.

Страницы: 1 2 329 30 Следующая »
ФлеймФорумПрограммирование