Сохранен 11
https://2ch.hk/pr/res/2582430.html
Прошлые домены не функционирует! Используйте адрес ARHIVACH.VC.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

Forth

 Аноним OP 22/01/23 Вск 04:26:58 #1 №2582430 
forth01.jpg
forth02.jpg
forth03.jpg
Больше идея и подход чем язык, и в этом треде я буду рассказывать о том что это такое.

Где используется:
- Изначально написан для управления телескопом в NRAO (1971)
- Forth-процессоры летают в космос
- В языке скриптования транзакций биткоина
- Open Firmware
Аноним OP 22/01/23 Вск 04:28:45 #2 №2582432 
Единого языка Forth не существует, как и единого компилятора, интерпретатора, этим он похож на
Lisp, но тут правильный подход заключается в том, что бы самому писать свой ассемблер, редактор,
компилятор, интерпретатор, и отладчик, хочешь сделать хорошо - сделай сам.

Изначально Чарльз Мур (создатель Forth), презентовал его как универсальную архитектуру ПО, вы
создаете интерпретатор, язык максимально простой, нужно парсить слова пропуская пробелы, язык
стековый, то есть аналог этого кода

print 10 - 2 + 5

На Forth будет выглядеть

10 2 - 5 + print

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

Так же можно добавлять слова в словарь, через встроенное слово :, и заканчивать определения через слово ;, написать слово которое будет находить среднее из двух аргументов можно так

: avg2 + 2 / ;

Когда интерпретатор встречает :, то Forth-система заводит в словаре новое слово avg2, и система переключается в режим компиляции, и теперь когда она встречает слово, то не выполняет его моментально, а создает машинную команду вызова слова, когда Forth-система встречает слово ;, то происходит запись слова avg2 в словарь, и переключение обратно в интерпретацию

Почему ; не компилируется в машинный код? У этого слова в словаре есть атрибут immediate, когда компилятор встречает слово с этим аттрибутом, то оно моментально выполняется как при интерпретации

Отсюда выводим важную деталь, Forth это одновременно интерпретатор и компилятор

Теперь можно рассмотреть строки, " Hello World", вот так записывается строка "Hello World", обратите внимание на пробел в начале, это нужно что бы распарсилось слово кавычка ("), это тоже immediate слово, и при выполнении оно перемещает курсор интерпретатора/компилятора в конец строки (следующая закрывающая кавычка), при этом помещая контент строки в память, и выдает на стек указатель на строку

Рассмотрим константы, они определяются так

3 constant PI

Слово constant является immediate, читает следующее слово (PI) заводит слово в словаре, и компилирует туда
аргумент со стека (3), все. После этого вызов слова PI будет помещать на стек число 3.

Локальных переменных в форте нету, есть стек, но глобальные нужны, можно определить слово для создания переменной так
: variable here constant 8 allot ;

слово here помещает на стек текущий указатель на память
слово constant описано выше
слово allot сдвигает указатель на память беря количество байт из аргумента, я указал 8 так как это хороший размер для x86_64

теперь после ввода
variable xyz

далее введенное слово xyz будет возвращать зарезервированный адрес в памяти, из которого можно прочесть число с помощью слова "@" или записать с помощью слова "!"

Отсюда выводим важную деталь, Forth можно расширить как угодно, хоть сделать компилятор С++ полноценный
Аноним OP 22/01/23 Вск 04:29:28 #3 №2582433 
Достоинства языка
- Написать свой Forth можно за пару дней
- Полный контроль над своими инструментами, расширять его можно как угодно
- Очень простой и компактный, меньше багов, хорошая переносимость
- Одновременно высокоуровневый и низкоуровневый

А теперь о подходе Forth, но сначала о его достоинствах
- Можно писать 1% кода программы, от количество кода на других языках
- Легко отлаживать
- Легко модифицировать
- Программы более производительные

В чем подход заключается?
- Если хочешь хорошо, сделай это сам, не нужно использовать готовые функции для вычисления косинуса, не нужно использовать сетевые библиотеки, не нужно использовать фреймворки, менеджеры пакетов
- Нельзя писать программы расширяемо, они будут расширяться не так как ожидает программист, в итоге получится пустая трата времени, усложить всегда можно успеть, нужно держать программу как можно более простой
- Писать программу нужно снизу вверх, то есть главными должны быть не абстрации, а ядро, если это вебсервер, то нужно начинать не с роутинга, а с передачи пакетов
- Откажитесь от ненужных абстракций, если вы хотите использовать локальные переменные, или структуры, пересмотрите свой взгляд на проблему, не реализуйте на форте новый синтаксис, не добавляете сложных конструкий если этого не требуется
- Ваши слова (функции) должны быть как можно меньше, хорошее значение 1-6 слов внутри, так их проще отлаживать, изменять
- Не пишите прокладок между низким и высоким уровнем, пусть у вас будут высокоуровневые слова, которые состоят из низкоуровневых
- Откажитесь от переносимости, лучше использовать преимущества конкретной платформы, иначе ваша программа будет плохо работать на всех платформах
- Будьте близки к железу, высокоуровневые абстракции часто бывают лишними, не реализовывайте свой форт на выосоуровневых языках, ассемблер хороший выбор, запись в машинном коде хороший выбор

Эти очевидные правила помогут не написать FizzBuzzEnterprise, а сделать хорошую программу. И это действительно работает Чарльз Мур написал VLSI CAD в около 500 строк, который позволил ему
создать Forth-процессор c 144 ядрами, тем временем альтернативное ПО стоит миллионы долларов и содержит миллионы строк кода.
Аноним OP 22/01/23 Вск 04:29:57 #4 №2582434 
Давайте я продемонстрирую подход конкретно для программистов, в Forth нету структур по умолчанию, как я уже сказал, но к примеру нам понадобилась простая структура, вот как бы я ее реализовал

: structure 0 ;
: field dup constant 8 + ;
: end-structure constant ;

stucture
field x
field y
end-structure point

Слово dup дублирует аргумент на стеке, если на стеке было 1 2 3 4, то станет 1 2 3 4 4
Аноним 22/01/23 Вск 04:33:18 #5 №2582435 
Почитать можно вот эти сайты

http://www.ultratechnology.com/forth0.htm

https://colorforth.github.io/

https://wiki.c2.com/?ForthLanguage

Так же советую книгу Thinking Forth, так как с полного нуля написать свой Forth будет не просто, да и знать как это делать нужно, то советую рассмотреть готовые программы, под Windows можно скачать Sp-Forth, под Linux можно скачать GForth
Аноним 22/01/23 Вск 04:53:20 #6 №2582438 
forth04.jpg
На картинке виден ColorForth, я буду говорить не как о конкретном языке, а как о подходе. Так же напишу свои мысли о написании своего Forth. Это не подсветка синтаксиса, цвета имеют значения, и они задаются программистом, это например позволяет избавится от операторов слов [, ], которые переключают режим интерпретации и компиляции.

ColorForth довольно прост, вся форт система (ОС + инструменты) для x86 занимают 63кб, но одновременно язык позволяет делать все что требуется.

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

Всем кто решится писать свой Forth, я бы советовал изучить сначала ColorForth, он наиболее современен и продвинут, использовать цвета или нет, решать тебе, но набор слов и их поведение обязательно стоит изучить.

Мой Forth написан на ассемблере, под Linux amd64, так как я привязан из за задач к этой ОС, но если бы я мог, я бы отказался от этой зависимости, и написал бы свою ForthOS, это правильный и хороший путь, операционные системы написано очень неоптимально.

Когда я пишу уже прикладные приложения, я использую много слов на ассемблере, так как в моем форте нету продвинутого оптимизатора, но мне он не особо и нужен, хотя некоторые оптимизации я использую, например записываю размер кода слова, и задействую атрибут inline, (та же система атрибутов что и для immediate атрибута), многие операции имеют специальные версии, например "10 +" превратится в
add rax, 10
Тут сразу видна вторая оптимизация, для верхнего значения стека используется регистр rax всегда, что часто позволяет избежать операций с памятью, иначе пришлось бы доставать из памяти стека значение, добавлять 10, и ложить обратно.

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

Мой исполняемый файл Forth не зависит от библиотек, в том числе и от libc, зато у меня есть слово syscall, которое принимает количество аргументов, и в зависимости от него выбирает другие значения из стека, включая значение которое отвечает за номер syscall.
Аноним OP 22/01/23 Вск 05:00:43 #7 №2582440 
Вычисления в стиле лиспа

: ( ' >r@ ;
: ) r@> execute ;
: print . ;

( print ( + 2 ( * 5 2 ) ( - 10 5 ) ) )

слово ' : прочесть следующее слово из исходного кода и положить на стек его адрес

слова >r@, r@>: записать или прочесть значение из второго стека

слово execute: запустить слово по адресу

слово .: печать
Аноним 22/01/23 Вск 05:39:08 #8 №2582457 DELETED
>>2582438
>но одновременно язык позволяет делать все что требуется.
Ну давай, сделай имиджборду мне на нем.
Аноним 22/01/23 Вск 13:06:47 #9 №2582779 
>>2582457
Ты видишь какие то сложности? Нужна простая база данных, которую легко написать самому, реализовать простую файловую систему для картинок, (Forth ОС обычно оперируют блоками на диске а не файлами), написать драйвер сетевой карты и саму имиджборду.

Звучит возможно сложно, но не стоит забывать что на форте пишется только 1% от кода на других программах, например вот драйвер IDE:
https://colorforth.github.io/ide.html

Файловая система не NTFS, скорее просто именование регионов блоков, сама имиджборда это довольно простой код, никакие паттерны, модели, использоваться не будут. У меня уже есть блог на своем форте, в 500 строк я уместил бд, шаблонизатор, админку, раздел для блога, раздел для фотографий, возможность добавлять статичные страницы, но по строкам как то много, надо их сократить, и наполнить блог, как наполню обязательно выложу.
Аноним 22/01/23 Вск 20:55:29 #10 №2583641 DELETED
>>2582779
>как наполню обязательно выложу.
Интересно было бы посмотреть.
Аноним 22/01/23 Вск 21:14:15 #11 №2583648 
>>2582430 (OP)
> Больше идея и подход чем язык, и в этом треде я буду рассказывать о том что это такое
А мы и так знаем.
Про CollapseOS не забудь написать.
comments powered by Disqus