LINUX.ORG.RU

Ещё один Форт

 


1

3

Здравствуйте, коллеги!

Любите ли вы язык Форт так же, как полюбил его я? До недавнего времени его не любил. Уважал - да, но любви не было. Как к какому-то забытому старичку из прошлого к нему относился. Лабораторные когда-то в древности на Форте делал. Сделал и забыл. Но так произошло, что в недавнем времени пришлось нудно и долго писать на ассемблере. Иногда такое бывает, тогда и вспомнился язык Форт. И чем больше вспоминаю узнаю Forth, тем он мне кажется интересней и интересней. И кажется незаслуженно забытым.

В общем, ежели вдруг кто захочет освежить память или ознакомиться с языком Форт, то загляните сюда - https://github.com/L4OS/yaforth

Если понравилось - дайте как-нибудь знать. Найдёте ошибку - вдвойне дайте знать.

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

Спасибо за внимание, ведь именно его так не хватает.

★★★
Ответ на: комментарий от anonymous

вот, например: Atua-WWW.retro [VT100.retro] (https://github.com/crcx/retroforth/blob/master/example/VT100.retro)

хорошие, наглядные литературно-грамотно откомментированные исходники

гофер-сервера на форте ретро и эмуляции VT100 соответственно

в таком духе можно писать и конпелятор типа tinykiss.frt

и прочий всяческий метапрог (который сам себя откомментирует, лолъ :)) )

anonymous
()
Ответ на: комментарий от MKuznetsov

Мне Форт интересен что он маленький и его можно легко встраивать в софт. (при том что в плане возможностей - он сильно интереснее например lua)

wait no more – можно совместить

поиск по LuaForth находит такое, и даже несколько реализаций

например: why wiki.c2.com/?ForthInLua, и наконец:

Bootstrapping a Forth in 40 lines of Lua code luaforth

Flua, a Forth-like language written in Lua+C+Nasm

April, 2011: Lua bindings for Retro. See: http://anggtwu.net/RETRO/

ещё есть какой-то https://github.com/vifino/luaforth

в общем, идея про совместить форт с луа – довольно-таки популярная

anonymous
()
Ответ на: комментарий от anonymous

Если посмотреть на код автора форта, то там нету никаких парсеров выражений, https://colorforth.github.io/ide.html

Расширять среду можно по разному, делать из форта какой то фортран, это странно. Расширять его возможностями, если нужно, это уже другое дело.

Форт подход и более простой, и более надежный. Вот взять например реализацию enum, кто то бы сделал парсер, синтаксис, но ведь можно просто:

0 variable enum-counter

: enum ( "name" -- )
  enum-counter @ constant
  1 enum-counter !+ ;

enum RED
enum GREEN
enum BLUE

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от anonymous

например, форт-ассемблеры про форт-подобный синтаксис ассемблера на форте

Не вижу смысла синтаксис переносить, лучше сделать стековый ассемблер.

хотя можно и fasm.dll вызывать с трансляцией строк

Потом еще понадобится decompiler.dll, лучше декларативно описать инструкции, сделать инструмент для нескольких архитектур, как fasmg.

MOPKOBKA ★★★★★
()

Форт и его адепты это та еще секта, но секта безобидная и даже в чем-то умилительная, потому что здорово наблюдать столь увлеченных какой-то в целом неплохой идеей людей. Не Лишп точно 😁.

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

что с твоей L4OS? заглох проект или есть что-то новое?

Пока postponed. На arm или x86 не залезть никак, там уже всё поделено между Windows, Linux, Mac OSX.

Поэтому пришёл к идее поместить «аппаратное микроядро» в железо - https://github.com/L4OS/Slagheap

Собственно Форт для этого и понадобился и генерирует он ассемблер для этого эмулятора.

Сам эмулятор выложу, возможно, на выходных, на прошлых выходных усиленно прикручивал в нему CI/CD.

Спасибо всем за информацию и ссылки на документацию. Понимаю как приятно увидеть ответ на своё сообщение - сам такой же. Но пока нет физической возможности. Тема получилось отличным справочником по Форту и здесь масса полезной информации.

alman ★★★
() автор топика
Ответ на: комментарий от MOPKOBKA
  1. Вывод числа на самом деле стоит начинать реализовывать в компиляторе не со слова ., а со слов форматирования <# sign # #>:

Кстати, сейчас понимаю почему так. Когда начал пытаться в оптимизацию. Наверное именно на эту задачу нужно срочно переключиться, а остальное подождёт.

alman ★★★
() автор топика
Ответ на: комментарий от anonymous

внезапно, нашел такое вот:

жгутики и проводочки смоллтоковые

eev – это векторный гипертекстовый – запускалка escripts (старое)

вида

An e-script is usually made of:
free-form text,
hyperlinks (including `to’s), and
code for shell-like programs (as shown in this video).

или (новое) elisp-links, links-intro

выше он запускает смоллтоковые блоки кода рисующие жгутики с проводочками что-то такое в Morphic

очевидно, что подобным же образом можно и запускать какой-то форт формируя юпитер-ноутбуковые executable logs

anonymous
()
Ответ на: комментарий от kto_tama

форт - это язык, который сам обучается ?

внезапно, да, но почти нет:

dl.ACM:DOI:10.1145/307824.307853:

Mind. Forth’ Thoughts on Artificial Intelligence and Forth

 Mind.Forth, also referred to as Project Mentifex, describes an artificial intelligence program begun by Arthur
T. Murray. Murray describes himself as the 'night auditor at a small 33-room hotel in Seattle'. In fact, he is
obviously a full-time scholar and AI buff. Project Mentifex was originally written as 'Mind.rexx' about four
years ago; it has been rewritten in the Forth language
and reemerged as Mind.Forth. Murray appears to have
made this change to capitalize on the superb hardware
control capabilities of Forth [1], and to elicit the cooperation of the small but creative Forth programming community. But programming languages alone are not his
main focus: it is the 'Theory of Mind' behind the program
which is far more important to him, as well it should be.
Murray has made the source code for Mind.Forth available on the Internet as an open system in the public domain in order to encourage the collaboration of all interested parties [2]. 

mentifex_faq

mindforth

mind.sf.net/mind_faq

mind.sf.net/mind4th

anonymous
()
Ответ на: комментарий от anonymous

внезапно, e-scripts запускалки форта тоже имеются:

gforth.e forth.e fortho.e flua.e

в общем, это такой типа org-mode только с более гиперссылками.

например, с гиперссылками на блок кода на форте.

отрисовывающем жгутики с проводочками что-то интересное, ога.

anonymous
()
Ответ на: комментарий от anonymous

занятно… </!ъ-mode> :

Shortest path to self-hosting for an «almost C» compiler Dusk OS self-hosts in about 1000 lines of assembly and a few hundred lines of Forth (the exact number depends on the target machine). From there, it bootstraps to DuskCC, which is roughly 1500 lines of Forth code. To my knowledge, Dusk OS is unique in that regard.

You can pick any C compiler that requires POSIX and it will automatically require orders of magnitude more lines of code to bootstrap because you need that POSIX system in addition to the C compiler. So even if you pick a small C compiler such as tcc, you still need a POSIX system to build it, which is usually in the millions of LOCs.

To be fair, Dusk OS is not the first project thinking of optimizing that path. Efforts at making our modern software world bootstrappable lead to an «almost C», M2-Planet with a feature set comparable to DuskCC with very few lines of code. M2-Planet itself is about 5K lines of code and the various stages that lead to it are generally a few hundred lines each. The project initially ran on top of regular kernels (as in «fat kernels with lots of code»), but some bare metal stages (1, 2) were created and now this little chain end up being comparable to Dusk in terms of lines of code. Still more than Dusk, but in the same ballpark.

Although this path is short and technically leads you to an «almost C» compiler, you can hardly use it because it has no «real kernel» (those bare metal stages mentioned above are enough to compile M2-Planet ([1], see also [2]), but really not much else, they’re extremely limited) and no shell. You’ll need those if you want to use your shiny compiler.

One of your best picks, should you try this path, would be Fiwix screenshot , a minimal POSIX i386 kernel weighting less than 50K lines of C+asm. But then, M2-Planet is not enough. You need to compile tcc (which M2-Planet can compile after having applied a few patches) which weights 80K. Userspace is worse. Bash+coreutils are 400K, even busybox is 190K. We still end up with a pretty minimal and simple system, but it’s still a lot more code than Dusk.

So, unless someone tells me about some option I don’t know about, DuskCC is quite innovative on the aspect of self-hosting path length.

даже Doom есть, лол :)

anonymous
()
Ответ на: комментарий от alman

кстати, а ты знаешь о проекте OS/3 osFree ?

Микроядро L4 как основа ядра ОС
status roadmap screenshots

TL;DR там изобретают свою полуось, на этот раз на базе микроядра L4.

реализовали часть её API, некоторые утилиты командной строки.

как видно на по скриншотам, что-то уже работает – но довольно мало.

Ryan C. Gordon (который icculus) тем временем пилит свой аналог WINE: 2INE который запускает бинарники с API OS/2

там что-то более полноценное реализовано.

но в целом, OS/3 пилят полтора анонимуса.

внезапно – в Fiwix даже дум запускается, вот.

хотя это монолит (пусть и весьма компактный), а не микроядро.

вот интересно – ты пытался связаться и/или объединиться с этими проектами?

или интереснее пилить своё микроядро на базе L4?

anonymous
()

В роскосмосе есть некая группа людей, которые еще давно дизассемблировали компилятор PL/1, который был еще 16 битный, и портировали его на 64 бита, под Windows, про компилятор и оптимизации постоянно пишет один человек:

https://habr.com/ru/articles/748262/

https://pl1.su/o-realizacii-metoda-optimizacii-pri-kompiljacii/

Я думаю это может быть интересно тем, что используются довольно простые методы, и возможно все делает один человек.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Вот этот человек: Караваев Дмитрий Юрьевич

все статьи в одном месте

начинать читать можно с этой: опыт самостоятельного развития средства программирования

он практически в одиночку разработал этот свой компилятор PL/I

взял честно купленный в 1987 году лицензионный PL-1 компилятор от Гарри Килдалла, автора DR DOS, CP/M и PL/M и PL/1 под DOS

дизассемблировал и существенно доработал:

  1. русскоязычные ключевые слова и идентификаторы на русском языке

  2. размерность физических констант, проверяемая при компиляции (см. отдельную статью)

  3. реализован диалект PL/I ANSI X3.74 (ISO 6160) Subset G, значительно доработанный и расширенный.

  4. портировал под Win64, сделал привязки к DirectX например, либо прочим С библиотекам, WinAPI.

здесь нужно понимать, что PL/I – язык от IBM (также, как и фортран и кобол).

он подразумевался как универсальный язык №1 – в смысле, алголоподобные вложенные области видимости, структуры из кобола и матричная/векторная математика из фортрана.

то есть: вместо отдельного языка для инженеров с правильной математикой (фортрана) и отдельного языка для экономистов (коммон бизнес обжект язык – общий контролируемый плановый язык программирования бизнес-объектов, в 3.5/4GL стиле, со структурами в специфическом виде, и денежными типами, отчётами и т.п., вот это всё)

– общий универсальный язык, унифицирующие оба этих языка :))

в PL/I нет зарезервированных ключевых слов. есть общая структура PL-выражений (наподобие того, как интерпретируются S-выражения лиспа) – возможно, расширяемая.

в результате можно создавать свои диалекты. IBM этим пользовался в своих диалектах, создавая например, асинхронные задачи и подзадачи, CALL TASK ... по аналогии с подпрограммами и обработку исключений.

правда, полноценная реализация таких вот собственных диалектов у них была только под мейнфреймы, ну и под полуось ещё.

в результате – PL/I-KT это довольно любопытная и компактная реализация: один компактный архив в 0,7 Мб содержит в одном бинарнике и компилятор, и стандартные библиотеки, рантайм, линкер.

resource.zip показывает как добавлять собственные ресурсы – например рантайм, стандартные библиотеки, или обёртки к WinAPI.

в общем, довольно любопытная реализация. к тому же есть книжки и документация.

линкер там свой собственный – т.к. формат поддерживается относительно старых объектников (хотя Intel OMF формат получился на удивление расширяемым – даже под Win64 PE64 удалось допилить относительно несложно, в какой-то статье описано)

в общем, для ресурсов брали Ilink32 от Borland (полагаю, IBM-овский от VisualAge тоже пойдёт) и собирали L86/A86 OMF библиотеки своим линкером.

тут надо наверное спасибо сказать самому Гари Килдаллу про довольно понятную архитектуру тулчейна оригинального PL/I (там PL/I 80 под CP/M, а имеется в виду аналогичный ему досовский): и ассемблера RASM-86

например, расширяемый макроязык – cм. про регистры также про экстракоды

то есть: через дцать лет после того как Гари Килдал написал свой расширяемый макроассемблер – его относительно простым способом портировали на 32,64 бита и вообще под другой формат PE64.

anonymous
()
Ответ на: комментарий от anonymous

под OS/2 также была книжка, презентации и учебный курс Эберхарда Штурма, ЕМНИП, про Visual Age PL/I

с наглядной визуальной табличкой, сравнивающей возможности PL/I и Cи

там про реализацию REXX-подобного DSL и конструкции PARSE оттуда средствами исключительно препроцессора PL/I

в отличие от Си, PL/I препроцессор (из VisualAge) умеет полностью сформировать текстовую строку управляемым образом, и подать её к компиляции

в общем, в препроцессоре можно вызывать любую функцию самого PL/I чтобы этакую строку сформировать.

поэтому например, REXX выглядит как интерпретируемый PL/I.

который при желании можно сделать компилирумым DSL средствами исключительно препроцессора самого PL/I.

в PL/I-KT, правда, препроцессор не настолько кузявый как в IBM-овских реализациях вроде VisualAge.

anonymous
()
Ответ на: комментарий от anonymous

в общем, по реализации тоже есть мемуары Гари Килдала про реализацию исходного оригинального PL/I компилятора под ДОС.

Фрайбургхаус(автор подмножества стандарта Subset G) по ошибке пригласил Килдалла на конференцию про PL/1 рассказать про реализацию его компилятора, и оценить полноту соответствия стандарту X3.74 и его подмножеству G.

Килдалл после того как его пригласили рассказал, что вообще-то он в CP/M и в Intel всю дорогу реализовывал PL/M а не PL/I – совсем другой язык (переносимый ассемблер высокого уровня – но не Си, раскрученный из реализации на фортране под мейнфреймы)

но увлёкся и в охотку всё-таки написал за пару недель компилятор упрощённого подмножества PL/I, о чём на следующей конференции и доложил :))

PL1_KT.pdf:

Этот язык, благодаря усилиям фирмы IBM, с середины 60-х создавался как универсальный язык для всех (!) задач, причем на этот, невыполнимый, как сегодня ясно, проект было потрачено много сил и средств. Впрочем, IBM вообще не собиралась конкурировать с другими языками, считая, что ее PL/1 и IBM 360 – это и вершина, и конец развития средств программирования. Разумеется, никакой вершины и конца не случилось. Поэтому в 1980 году американский специалист д-р Фрайбургхаус задался целью скорректировать язык PL/1 и сделать из него компактное подмножество, оставив удачные находки языка и убрав неудачные или просто громоздкие.

Он провел ряд семинаров и совещаний по данному вопросу в Калифорнии, пригласив на них ведущего специалиста по микропроцессорам Гарри Килдэла. Дело в том, что Фрайбургхаус, услышав, что Килдэл разработал язык PL/M, ошибочно решил, что тот уже создал компилятор PL/1 для микрокомпьютеров и хотел услышать его мнение по поводу сокращений в языке. Но у Килдэла не было компилятора PL/1, а его язык PL/M был, по сути, разновидностью ассемблера. Получилось наоборот, послушав Фрайбургхауса о сокращениях в языке, Килдэл решил создать компилятор для Intel 8080 и для этого нового языка, который ему понравился (а PL/1 от IBM не нравился). Через полтора года такой компилятор был создан и получил название PL/I-80.

Все это совпало с началом эры персональных компьютеров IBM, и компилятор был доработан для Intel 8086, получив название PL/I-86. Вполне вероятно, что это программное средство получило бы самое широкое распространение в мире вместе с персональными компьютерами IBM.

anonymous
()
Ответ на: комментарий от anonymous

Но поскольку раньше произошла странная и мутная история по поводу операционной системы CP/M-86 между Килдэлом с одной стороны, и Билом Гейтсом и IBM с другой, то ОС CP/M-86, а заодно и компилятор PL/I-86, не получили рекламы и не входили в официальный состав системного ПО IBMPC/XT. Хотя компилятор Килдэла, работавший и под CP/M-86 и под MS DOS, продавался небольшим тиражом, он не мог не уступить примитивным Бейсику и Си, поскольку не получил миллионной аудитории. А кроме этого давил авторитет Э. Дейкстры, эмоционально критиковавшего язык.

Тем не менее, в 1985 году компилятор PL/I-86 попал и в Советский Союз, благодаря институту Радио, имевшему большой задел ПО на этом языке и активно использовавшему математику комплексных чисел. Увы, данное подмножество языка не имело комплексных чисел и поэтому компилятор в институте не получил должного применения. Однако, благодаря личным связям, компилятор попал в другую организацию – в НПО «Энергия», где, наконец, оказался весьма кстати. Он стал использоваться для решения инженерных задач, связанных с разработкой системы «Энергия-Буран». Часть программистов перешла с ЕС ЭВМ, часть с БЭСМ-6. Использование IBM-PC/XT и компилятора PL/I-86 резко повысило эффективность и скорость работы, причем легко удалось сохранить и существенную долю имеющегося задела ПО и не только на PL/1, но даже и на БЭСМ-Алгол. Хотя при этом число пользователей PL/I-86 на предприятии все же было небольшим. По мере получения опыта и решения все более сложных задач пришло понимание, что для дальнейшего развития (и использования возрастающих возможностей компьютеров) необходимо самостоятельно совершенствовать как компилятор, так и сам язык, поскольку его авторской поддержки уже не было. Это позволило избежать главной ошибки копирования IBM 360 – отказа развивать далее самостоятельно системное ПО, используя имеющееся как начальную базу. В данном случае уже имевшийся компилятор PL/I-86, позволил, с одной стороны, не создавать свое инструментальное ПО с нуля, а с другой – стал той самой стартовой площадкой дальнейшего развития языка и воплощения этого развития в компиляторе.

в общем, интересная судьба у этого языка и конкретно этого конпелятора.

anonymous
()
Ответ на: комментарий от anonymous

z80.eu/pli про оригинальный компилятор Гари Килдалла

DR PL/I 1.0 compiler for DOS incl. samples (locally mirrored)

pl1gcc – давненько не обновлялся, и собрать его тот ещё квест

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

про конструкцию PARSE из REXX реализованную как DSL на препроцессоре PL/I в VisualAge OS/2 PL/I compiler – я, оказывается, писал на ЛОРе ещё года четыре назад: тыц и далее по тексту топика

ссылка на книжку и примеры, курс Эберхарда Штурма

а вот тут во всех ссылках есть остальное:

Power vs. Adventure - PL/I and C – сравнительная табличка со сравнениями PL1 и C.

First I want to present 5 theses: Too many things in C…

are different from what they seem to be! are undefined! are poorly defined! cannot be checked by the compiler! are not checked by the compiler!

When I contrast the C paradigms to those of PL/I I will often return to these theses.

How does a program look?

Let’s start with the outward appearance of a C and a PL/I program:

<табличко>

Си сосёт со своим UB by design, кстати.

парсе.сру про реализацию PARSE диалекта из REXX-а посредством чисто препроцессора VisualAge OS/2 PL/I

обратите внимание, даже по сравнению с сишечкой – это уже огромный шаг вперёд.

макросы PL/I гораздо круче макросов Си.

не говоря уже о макросах лиспа, или компилирующих слов форта.

anonymous
()
Ответ на: комментарий от MOPKOBKA

жгутики и проводочки

Там текст и терминалы.

не текст – а гипертекст!!!

и вектора картинками. из нажимаемых в репл гиперсслок

векторный гипертекстовый фидонет же

понимать надоть :))

anonymous
()
Ответ на: комментарий от MOPKOBKA

кстати, судя по привязкам к WinAPI GDI и DirectX

жгутики и проводочки метапроговые вполне себе возможно

написать на PL/I-KT, на русском языке (с картинками)

невозбранно достигнув желаемого

хотя я вот примеры из RED языка потыкал про реактивности, лайвкодинг и часики и сплайны векторные

так там на RED ещё проще получается.

главное, конечно – понимать что вообще и как вообще нужно моделировать.

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

а написать можно на чём угодно – главное понимать, как именно оно должно метапрогать.

и куда там рисовать и к чему тянуть жгутики с проводочками

anonymous
()