Комментарии 117
моя студенческая любовь — обязательно скачаю поностальгировать!
+1
А можно не качать, а купить за 100 руб девайс (TI LaunchPad с MSP430, привозят за неделю), прошить в него Форт — www.4e4th.us/ и поностальгировать заодно по компьютерам 80х :)
+2
Да, кстати, статья на тему — we.easyelectronics.ru/msp430/virtualnaya-mashina-i-skriptovoy-dvizhok-v-msp430g2553-prosche-parenoy-repy-4e4th-ti-launchpad.html — чем-то напоминает вышеприведённую :)
+2
Спасибо большое за наводку! Скорее всего закажу несколько штук (одну себе, остальные друзьям/знакомым).
0
Интересует с 98 года. Вся проблема, в том, что я еще не видел КАК с помощью форта считать из текстового файла строки и как выполнить SQL запрос. Да я понимаю, что надо вызывать DLL, но сил больше нет уже. Чтоб небыло обидно я спокойно писал графики на PostScript. Форт красив, но надо простые вводные. Немножко. Ну и спасибо. Это всетаки прорыв на хабре.
+6
Да, вы безусловно правы, что на Форте сложновато решать многие задача разработки, но, в принципе, есть Factor, который так же как и Форт — стековый, но в большей степени развит на данный момент. У него есть стандартная библиотека, которая помогает решить многие прикладные задачи. Так что, если вам интересен Форт, то можно взглянуть на его современную инкарнацию.
+2
Когда сидел под виндой, то в качестве интерпретатора FORTH использовала nnCron, где один из диалектов FORTH использовался в качестве встроенного скриптового языка (а может и сам nnCron на FORTH был написан). Обёртки к о многим функциям Windows32 API там были, как и средства вызова произвольных функций из DLL, благодаря чему написание обёртки к libmysql.dll (или как там она называлась) максимум несколько часов заняло, больше потраченных на изучение собственно API, предоставляемого этой библиотекой. Более того, поскольку обёртки к DLL это не совсем FORTH-way, написал, как бы сейчас назвал, свой DSL на базе этой обёртки, благодаря которому чуть ли не чистый SQL в своих скриптах использовал, то есть писал не нечто вроде
" SELECT * FROM table" MYSQL_QUERY DO MYSQL_FETCH_ROW LOOP
, а почти (подробностей уже не помню) SELECT * FROM table
+4
nnCron целиком написан на русском SP-Forth ( spf.sourceforge.net/ ) и этот же форт в него и встроен.
Еще более крупная и навороченная программа на том же SP-Forth'е — Eserv ( www.eserv.ru/ ) — комплект серверов для Windows (почта, веб, ftp, прокси и т.д.). В него Форт тоже встроен соответственно — используется в конфигах, для расширений и как server-side скриптер. Там, кстати, SQLite используется активно, так что все для работы с SQL во встроенном форте есть.
Для работы с MySQL в SP-Forth есть несколько библиотек (см. по первой ссылке каталог devel на CVS) — работают как через libmsql, так и через ODBC. Уже лет 10 как.
SP-Forth есть версия для Linux, многие популярные портабельные либы (dll/so) единообразно подключаются как к Linux, так и к Windows-версии (см. примеры в devel/~ac/lib/lin/).
Кстати, SP-Forth'у в этом году стукнуло 20 лет!
Еще более крупная и навороченная программа на том же SP-Forth'е — Eserv ( www.eserv.ru/ ) — комплект серверов для Windows (почта, веб, ftp, прокси и т.д.). В него Форт тоже встроен соответственно — используется в конфигах, для расширений и как server-side скриптер. Там, кстати, SQLite используется активно, так что все для работы с SQL во встроенном форте есть.
Для работы с MySQL в SP-Forth есть несколько библиотек (см. по первой ссылке каталог devel на CVS) — работают как через libmsql, так и через ODBC. Уже лет 10 как.
SP-Forth есть версия для Linux, многие популярные портабельные либы (dll/so) единообразно подключаются как к Linux, так и к Windows-версии (см. примеры в devel/~ac/lib/lin/).
Кстати, SP-Forth'у в этом году стукнуло 20 лет!
+3
PostScript же тоже стэковый и весь тьюринг-полный?
Не пробовали написать на ps нортон-коммандер? :)
Не пробовали написать на ps нортон-коммандер? :)
0
PostScript — это фактически специфический графический диалект Форта. Встраиваемый Форт для принтеров. Нортону-коммандеру нечего делать в принтере…
0
Нет. В PostScript есть кодовые блоки — он более современный, более полноценный и более стековый, чем Форт.
+1
Помнится где то ходила инфа про веб сервер, написанный на ps.
0
А я для этого написал свой интерпретатор форта, в котором для выполнения SQL запросов был и операторы типа SELECT". И даже продал его потом…
Выглядело это примерно так:
Параметры для подстановки брались из стека, так что их надо было тоже в обратном порядке туда класть. Правда я не совсем помню как результаты в стек клались…
Выглядело это примерно так:
5 18 SELECT" id, score from users where age>? limit ?"
Параметры для подстановки брались из стека, так что их надо было тоже в обратном порядке туда класть. Правда я не совсем помню как результаты в стек клались…
0
Это, всё же, не совсем Форт-стиль. На Форте, скорее, нужно делать отдельный словарь со всеми словами для формирования запроса. Что-то типа.
SQL:
\…
18 «age>» WHERE 5 LIMIT «id, score» «users» SELECT
Я бы так делал.
Сам, правда, пока в подобном случае использовал тупую обёртку:
SELECT: и тут SQL-запрос до конца строки
SQL:
\…
18 «age>» WHERE 5 LIMIT «id, score» «users» SELECT
Я бы так делал.
Сам, правда, пока в подобном случае использовал тупую обёртку:
SELECT: и тут SQL-запрос до конца строки
0
Согласен. Меня немного извиняет, что это я, ещё учась, писал. Это я ещё забыл упомянуть, что тот интерпретатор был написан на Pascal. Тем не менее случайное изучение Forth — одно из лучших событий в моей жизни как программиста.
0
Это скорее для объектно-ориентированных квери-билдеров словарь… Если при построении запроса надо два раза пропихнуть физически одну и ту же конструкцию — самое оно.
0
В начале 90х написал на форте аналог нортон-коммандера, Просто ради фана
Компилировался он, кстати, в .com файл размером около 40 кб. Почти как ассемблер
Это, скажу я вам, была та еще акробатика :)
Компилировался он, кстати, в .com файл размером около 40 кб. Почти как ассемблер
Это, скажу я вам, была та еще акробатика :)
+4
НЛО прилетело и опубликовало эту надпись здесь
«магистром йодой картинку с новости к поставить если
тему в зайти нельзя будет не»
тему в зайти нельзя будет не»
0
Почти искажённый фиджийский хинди…
0
По поводу этих постоянных приколов над якобы неестественным синтаксисом Форта есть старая заметка: www.forth.org.ru/~ac/rationale/FORTH.TXT
0
С японским языком знакомиться не пробовали, кстати?
0
Не зайти будет нельзя в тему, если Йоду магистра к новости на картинку поставить
Так лучше :)
Так лучше :)
0
У вас в первой части stack overflow: «не зайти» — глагол, а стэк аргументов пустой.
И для «если» агрументы неправильные (впрочем у меня тоже), нужно добавлять слово «тогда» чтобы получилось по йода-forth-ски:
(также это более соответствует всяким китайсикм: сначала тема(известное) потом рема (новое)
Хотя и непонятно как это вообще работает на одном стэке, логично было бы наоборот:
(оператор ЕСЛИ проверяет верх стэка и если там не тру, просто дропает всё до метки ТОГДА) Вродебы на МК-54 так и было.
И с предлогами вы не совсем правы: предлоги обозначаую роли сущности.
Можно рассматривать как функцию модификации сущности, либо как обозначение аргумента функции (типа как именованные аргументы).
Второе, как я понимаю, для forth чуждо.
Зато первое роднее для русского и частично реализуется падежами.
Более стэково правильная формулировка:
«Йоду магистра картинкою новостною поставить если, тема пропущена небудет тогда»
stack trace:
И для «если» агрументы неправильные (впрочем у меня тоже), нужно добавлять слово «тогда» чтобы получилось по йода-forth-ски:
условие ЕСЛИ результат ТОГДА другое ИНАЧЕ
(также это более соответствует всяким китайсикм: сначала тема(известное) потом рема (новое)
Хотя и непонятно как это вообще работает на одном стэке, логично было бы наоборот:
ТОГДА результат условие ЕСЛИ
(оператор ЕСЛИ проверяет верх стэка и если там не тру, просто дропает всё до метки ТОГДА) Вродебы на МК-54 так и было.
И с предлогами вы не совсем правы: предлоги обозначаую роли сущности.
Можно рассматривать как функцию модификации сущности, либо как обозначение аргумента функции (типа как именованные аргументы).
Второе, как я понимаю, для forth чуждо.
Зато первое роднее для русского и частично реализуется падежами.
Более стэково правильная формулировка:
«Йоду магистра картинкою новостною поставить если, тема пропущена небудет тогда»
stack trace:
Йоду "Йода" магистра "магистр Йода" картинкой "магистр Йода" "картинка" новостной "магистр Йода" "новостная картинка" поставить "новостная картинка с магистром Йодой" если (bang!) "факт наличия новостной картинки с магистром Йодой" тема "тема" пропущена "пропущенная тема" небудет "не пропущенная тема" тогда (bang!) "факт наличия новостной картинки с магистром Йодой" -> "не пропущенная тема"
+1
Странно, в лиспе ведь тоже используется почти такая же нотация, только оператор пишется в начале. Но при этом лисп по сравнению с фортом не кажется таким уж причудливым.
0
Необычность Форта только отчасти вызвана постфиксным типом записи, в большей степени необычна его стек-ориентированность. В лиспе хоть и используется префиксная запись, но интерес в нем вызывают другие моменты: ориентированность на лямбда-исчисление, мощное метапрограмммирование. В принципе, проще читать конструкции, где одной функции передается другая, и так далее, то есть, когда идет некая вложенность, чем конструкции, когда все данные лежат в стеке, а мы вызываем в нужном порядке операторы (или слова, в случае Форта) для достижения необходимого результата.
0
Переключением режимов исполнения в Форте можно создать «эффект ФВП». Даже ваш самый первый пример
." Hello World"
таким в какой-то мере является. Аргумент для ." берётся не из стэка ведь, а из последующего ввода. IF… THEN, DO… LOOP из той же серии — они создают свои структуры на стэках, и интерпретируют вложенные команды особым образом. Эти слова — по сути обычные FORTH-слова, через FORTH-слова же и определяемые (только в целях оптимизации их пишут на ассемблере или других языках, как и слова типа 1 или 2, в отличии от слов типа +, которые средствами собственно Форт-машины не реализуются, если на ней не реализовывать ассемблер) элементы библиотеки можно сказать, а не элементы синтаксиса как в мэйнстрим языках. В какой-то (довольно большой) мере DO… LOOP это аналог map/reduce/filter функций в ФП. И если ориентироваться не на синтаксис, а на суть, то Форт куда ближе к функциональным языкам, чем к процедурным. Просто по умолчанию параметры в функции передаются через стэк постфиксным способом. И даже классическая ФВП реализуется на форте легко — используем слово, помещающее адрес любого следующего слова, используемого в качестве ФНП, а в ФВП используем адрес этого слова для его вызова. +1
В Eserv'е реализация большинства интернет-протоколов (SMTP, POP3, IMAP, HTTP, FTP и т.д.) сделана просто как расширение Форта, т.е. эти интернет-протоколы интерпретируются встроенным транслятором Форта — он «думает», что команды протокола — это текст Форт-программы. Для него они «родные». Врядли в каком-либо еще языке программирования такое возможно.
0
Пипец. Как же там ошибки хендлятся? С++ дубль-два: кроссплатформенный ассемблер с макроязыком, корчащий из себя язык высокого уровня… Шаг влево, шаг вправо — имеем хрен знает что с непонятными последствиями, очень трудно поддающееся отладке из серии «проще выкинуть и написать заново, чем выяснять, почему неправильно работает».
-2
В смысле? Что вам не нравится в фортовой обработке ошибок? Есть структурная обработка CATCH/THROW, как в большинстве языков. Аппаратные исключения тоже через этот механизм бросаются и ловятся (в SP-Forth'е по крайней мере).
Отладка в Форте удобнее, чем в С++, т.к. кроме тех же инструментов есть и диалоговый режим.
С высокоуровневостью тоже порядок (что собственно и подверждается существованием такого крупного проекта как Eserv — он развивается с 1996 года).
Отладка в Форте удобнее, чем в С++, т.к. кроме тех же инструментов есть и диалоговый режим.
С высокоуровневостью тоже порядок (что собственно и подверждается существованием такого крупного проекта как Eserv — он развивается с 1996 года).
+1
IF… THEN, DO… LOOP — это не «обычные слова», это слова с немедленным выполнением: они выполняются сразу, а не во время интерпретации. ifelse — это «обычное слово» в PostScript: условный лямбда-оператор: берёт со стека логическое выражение и два кодовых блока и запускает на исполнение (или исполняет — хз, точно не помню) первый или второй.
0
У нас разные понятия слова «интерпретировать» значит :) Для меня Форт-транслятор это прежде всего интерпретатор символов входного потока, который может переключаться в некоторых случаях (типа ":") в режим компиляции, создавая новую статью. При этом в случае чего-нибудь типа
: DUP? IF DUP THEN ;
он временно из режима компиляции переключается обратно в режим интерпретации на словах IF и THEN интерпретируя их немедленно и модифицируя процесс компиляции.0
а поясните, как на одном стэке работает «условие IF результат THEN»?
0
На каком «одном стеке»? У PostScript их тоже два.
0
Грубо говоря, стэк данных используется по разному во время компиляции и исполнения. Когда вы вводите что-то вроде
: слово условие IF результат THEN ;
, то слово IF компилятор не компилирует на прямую, а вставляет служебное слово в статью, аргумент которого адрес перехода (пока пустой) и сохраняет на стэке адрес адреса перехода, после чего возвращается в режим обычной компиляции, а затем слово THEN берёт со стэка адрес адреса возврата и пишет по нему адрес перехода. А скомпилированное служебное слово берёт адрес со стэка и если не тру, то делает переход на адрес, который был записан THEN во время компиляции. +1
В Форте изначально есть и такая новомодная «фича» из Lua, как «тупли»;-)
0
В Форте вполне возможно метапрограммирование. Так же как и Лисп, Форт позволяет переключаться между режимами «компиляции» и «интерпретации», что открывает дорогу для создания макросов, так как помимо стека данных в Форте программисту доступен и стек возвратов, что дает неограниченный простор для создания собственных структур управления и реализации метапрограммирования.
+1
Стековые языки с лямбдой и списками тоже существуют…
0
Наоборот. Лисп заметно сложнее и хитрее в реализации. И намного сложнее на практике. Форт чище синтаксически и имеет несравнимо более простой транслятор. Я не видел реализаций Лиспа в 512 байт на ядро системы и в пару килобайт на всю систему с компилятором :)
0
Я имел в виду причудливость с точки зрения «обычного программиста», а не с точки зрения реализации.
Когда я прочитал первые строки статьи, я сразу всё понял, то есть почему Forth такой старый язык и почему для него так легко сделать компилятор :). Но стеке писать на издевательство форменное программистом над.
Когда я прочитал первые строки статьи, я сразу всё понял, то есть почему Forth такой старый язык и почему для него так легко сделать компилятор :). Но стеке писать на издевательство форменное программистом над.
+1
В Форте есть локальные переменные (стандартное расширение locals), а глобальные переменные есть в базовом форте (т.е. даже если без расширений). Так что, кому сложно уследить за стеком, может упростить себе жизнь.
0
Разница между:
СТЕК НАД ПИСАТЬ
и
(писать (стек, над))
не принципиальна :)
В первом случае хоть скобки считать не надо. Более того, для Thinking Forth заявляется требование, чтобы новое слово не превышало 7±2 слов. То есть очень легко и просто видна вся логика выполнения. А вот в Лиспе постоянно практикуются портянки на целый экран кода, завершающиеся гирляндой скобок. На Форте здорово упрощается работа из-за манипулирования потоком исполнения. Лисп этого лишён.
СТЕК НАД ПИСАТЬ
и
(писать (стек, над))
не принципиальна :)
В первом случае хоть скобки считать не надо. Более того, для Thinking Forth заявляется требование, чтобы новое слово не превышало 7±2 слов. То есть очень легко и просто видна вся логика выполнения. А вот в Лиспе постоянно практикуются портянки на целый экран кода, завершающиеся гирляндой скобок. На Форте здорово упрощается работа из-за манипулирования потоком исполнения. Лисп этого лишён.
+1
Разница между:Принципиальна. Без скобок быстро ломаешь мозг. Вот если бы
СТЕК НАД ПИСАТЬ
и
(писать (стек, над))
не принципиальна :)
((СТЕК) НАД) ПИСАТЬ
и
(писать (над, стек))
или
СТЕК НАД ПИСАТЬ
и
писать над стек
(как в Лого вроде)
— то да, непринципиальна.
0
Если вы считаете скобки в лиспе, то вы что-то делаете не так. Это занятие примерно одного уровня с акробатикой со стеком в форте.
Есть, конечно, недолиспы вроде Clojure, автор которой намеренно сделал синтаксис, который заставляет считать скобки, но это уже проблемы отдельного неосилятора.
Есть, конечно, недолиспы вроде Clojure, автор которой намеренно сделал синтаксис, который заставляет считать скобки, но это уже проблемы отдельного неосилятора.
0
А у HP был ещё и RPL…
0
Там ещё и скобки…
0
Куда больше Starting Forth я рекомендую Thinking Forth. На русском — в переводе Сергея Дмитренко. Полезно далеко не только фортерам. Я даже в PHP использую многие концептуальные подходы оттуда. Ну а вообще, с Фортом на практике работаю с 1991-го :)
0
А кто-нибудь когда-нибудь видел вакансии где знание FORTH хотя бы упоминался в качестве плюса?
-1
Я разрабатываю сайт, на котором пользователь может решать различные задачи на разных языках программирования. Особенность в том, что задачи для каждого языка свои специфические и призваны показать преимущества языка, или просто должны быть интересными для решения на этом языке, или просто расширять кругозор. Меня заинтересовал Forth и я бы хотел его добавить. Какие интересные/красивые/познавательные задачи для Forth вы знаете/решали? Желательно задачи небольшие, пример с аналогом нортон командера из коментов выше будет слишком круто.
0
Кстати,
." Hello world"
— это неправильно. По действующему стандарту надо
.( Hello world)
А с кавычкой — только для режима компиляции (т.е. внутри определений — процедур или функций).
И еще: регистронезависимость — это не свойство Форта, а свойство отдельных реализаций. Стандарт допускает оба варианта и требует это оговаривать в документации.
." Hello world"
— это неправильно. По действующему стандарту надо
.( Hello world)
А с кавычкой — только для режима компиляции (т.е. внутри определений — процедур или функций).
И еще: регистронезависимость — это не свойство Форта, а свойство отдельных реализаций. Стандарт допускает оба варианта и требует это оговаривать в документации.
0
" Hello world" PRINT
Будет более кросс-фортово.
0
Главный плюс Forth — это легковесность. Когда на контроллере память исчислялась байтами, это было очень важно. Сегодня этот плюс уже не актуален. А что осталось из минусов? Жесткий самоконтроль по поводу позиций на стеке, сколько и чего взяли, сколько положили. Одна ошибка и вот мы пошли перекапывать стек. Такой абсурд может продолжатся довольно долго и есть шанс, что все таки все хорошо совпадет и программа выдаст результат, но совершенно бессмысленный.
Попыткой это исправить была особая нотация в комментариях, так что бы компилятор знал сколько и чего берем со стека. Но этот костыль не может найти все ошибки логики, а такие ошибки на Forth очень легко сделать. Ну и наконец извечная игра с перестановками на стеке (мне нужен третий элемент, а не верхний). Если не выработался какой то свой стиль работы со стеком, то вагон ярких эмоций обеспечен. А стиль рубится на корню, если использовать библиотеки слов других разработчиков. Forth вообще такой тонкий способ потроллить своих коллег =)
Попыткой это исправить была особая нотация в комментариях, так что бы компилятор знал сколько и чего берем со стека. Но этот костыль не может найти все ошибки логики, а такие ошибки на Forth очень легко сделать. Ну и наконец извечная игра с перестановками на стеке (мне нужен третий элемент, а не верхний). Если не выработался какой то свой стиль работы со стеком, то вагон ярких эмоций обеспечен. А стиль рубится на корню, если использовать библиотеки слов других разработчиков. Forth вообще такой тонкий способ потроллить своих коллег =)
+4
«Самоконтроль» состояния стека — это вообще не вопрос. Форт-стиль — это короткие, однозначные и «тупые» (без сайд-эффектов и смешанного поведения) слова, которые полностью тестируются по мере написания. Поэтому Форт-программа по факту получается более безопасная, чем код на традиционных языках. Акробатика с параметрами на стеке тоже обычно иллюстрирует прокол в архитектуре. Если тебе понадобился третий параметр с вершины, то нужно внимательно присмотреться, в 90% случаев ты допустил где-то концептуальную ошибку.
+2
Согласен, потому и сказал, что это вопрос выработки стиля. Почему только стиля? Потому, что все таки бывают не только «тупые» слова. Их мало, но они есть (обработка ошибок от внешних сервисов и т.п.). И танцы с позициями на стеке неизбежны. И со временем их становится только больше. Я наком с Forth еще с микроконтроллеров, но мы как то быстро все перешли на C и не пожалели. Сейчас все Scala и Python и уже далеко не под «микроконтроллеры». О Forth вспоминаю с приятной ностальгией, но боже упаси писать на нем снова.
Но! Forth как пища для ума и расширение кругозора — очень даже рекомендую.
Но! Forth как пища для ума и расширение кругозора — очень даже рекомендую.
+2
А мне больше всего импонирует что в Forth все слова имеют определения через другие слова языка. Даже те, которые являются встроенными, для ни определения всё равно есть, хоть и только ради академического интереса.
0
Когда-то тоже разминал мозг (http://habrahabr.ru/post/138667/) конкатенативными языками, и Forth самый известный его представитель. Понравились и Joy, и Factor, это как тренажеры для развития стека у себя в голове и нестадандартных функциональных подходов.
0
Когда то писал на ассемблере для 8087. Немного напомнило Forth. Тоже со стеком извращаться приходилось.
-2
Ничего общего. Тоесть вообще
+1
Ну, кое-что, таки есть…
Постфиксность, стек за которым надо следить.
Но фишка форт систем, конечно-же не в этом.
Хотя технически, форт можно рассматривать как продвинутый макроассемблер: код редактора\интерпретатора + базовые слова (по сути макросы ассемблера) в достаточном объёме, что бы можно было создать\загрузить весь остальной словарь.
Постфиксность, стек за которым надо следить.
Но фишка форт систем, конечно-же не в этом.
Хотя технически, форт можно рассматривать как продвинутый макроассемблер: код редактора\интерпретатора + базовые слова (по сути макросы ассемблера) в достаточном объёме, что бы можно было создать\загрузить весь остальной словарь.
0
Вообще ничего общего? Даже наличие стека как основной структуры данных?
0
моя любовь. когда то я написал на нём BIOS и систему тестов для одного проекта…
0
> в рамках операционной системы Ubuntu.
ну вот и пришло то время, когда Ubuntu уже воспринимается как отдельная операционная система. Какое там Linux или GNU/Linux, как любит поправлять Ричар Столман.
Простите за вброс. Сам сижу на Ubuntu.
По теме: Forth для меня был третьим языком, который я изучал. Теперь его место на почетном месте в музее. Ну и для разминки мозга, как справедливо заметил автор.
ну вот и пришло то время, когда Ubuntu уже воспринимается как отдельная операционная система. Какое там Linux или GNU/Linux, как любит поправлять Ричар Столман.
Простите за вброс. Сам сижу на Ubuntu.
По теме: Forth для меня был третьим языком, который я изучал. Теперь его место на почетном месте в музее. Ну и для разминки мозга, как справедливо заметил автор.
-2
Что реально мешает в стековых языках — это постоянная необходимость ручной манипуляции со стеком: пропустишь DUP — и лови ошибку час…
0
С другой стороны, именно этот момент дисциплинирует, требует постоянно держать в голове как данные, так и предшествующие преобразования над ними. Это неплохо развивает. Возможно. вы никогда не будете после написания первой программы на Forth прикасаться к нему снова, но аккуратность привитая Фортом останется даже при использовании других языков.
0
В смысле «пропустишь DUP»? Почему вы его вдруг должны пропустить? Вы же программист, а не машинистка, набивающая текст с листа.
Никаких специальных манипуляций со стеком при правильном стиле программирования на Forth не требуются. Тут уже писали, что ручные манипуляции со стеком, это как goto структурных языках, признак неправильной архитектуры программы.
Никаких специальных манипуляций со стеком при правильном стиле программирования на Forth не требуются. Тут уже писали, что ручные манипуляции со стеком, это как goto структурных языках, признак неправильной архитектуры программы.
+2
Есть опыт написания скриптлетов на самодельном стековом языке. «Пропустить манипуляцию со стеком» (обычно как раз «DUP») — самая распространённая ошибка, правда в 90% случаев валится на следующем же операторе: на находит на стеке данные подходящих для него типов.
0
Вы же программист, а не машинистка, набивающая текст с листа.Разница невелика: всё равно хочется feedback как можно раньше. Желательно на этапе компиляции или в IDE при наборе кода. У Лиспа, если упустить баланс скобок, так и получится.
0
В режиме интерпретации при наличии тестовых данных, вы его будете практически сразу. Быстрее будет просто не куда… Если вы судите о Forth'е по самописному стековому языку, то это зря…
0
Если вы судите о Forth'е по самописному стековому языку, то это зря…Ну да, тот настроен на командную строку, файлы исходников и скриптлеты. Разница в стиле как у C# и Java — вроде бы VM похожи, но политика настолько разная, что для C# чего-то типа Ant, Maven и богатства библиотек и серверов как для Java ещё долго не предвидится…
0
Чем ближе к железу, тем больше аккуратности и дисциплинированности. Корни, торчащие из управления телескопом, биосы, прошивки спутников, etc — не дают оторваться от реальности. Уже не ассемблер, но еще не похапня. Золотая середина, в каком-то смысле.
Давно не писал на нем, иногда даже скучаю :)
Давно не писал на нем, иногда даже скучаю :)
+1
{1 @y {+x 0 = {}{* ?x 1 - 1 ! !} ? !}! -x} 'factorial !
0
Что плохо в Форте и иже с ним: длинные названия слов.
Что плохо в Форте и Лиспе/Схеме: вся программа представляет собой выражение. В самом клиническом случае — в Форте — если упустишь «баланс скобок», то система посчитает, что так и надо и что-то выполнит с каким-то результатом.
Программы на «нормальных» языках разбиты на куски, внутри которых баланс стека/скобок отслеживается компилятором. Программируя на таком языке, ты программируешь фактически на двух языках: один — язык потока управления, другой — язык выражений. Что вносит разнообразие и даёт более приятные ощущения глазам. На Форте и Схеме язык один (на Форте — один синтаксис, на Схеме — одни выражения). Уровни «логики» и «выражений» никак визуально не разделены.
Что плохо в Форте и Лиспе/Схеме: вся программа представляет собой выражение. В самом клиническом случае — в Форте — если упустишь «баланс скобок», то система посчитает, что так и надо и что-то выполнит с каким-то результатом.
Программы на «нормальных» языках разбиты на куски, внутри которых баланс стека/скобок отслеживается компилятором. Программируя на таком языке, ты программируешь фактически на двух языках: один — язык потока управления, другой — язык выражений. Что вносит разнообразие и даёт более приятные ощущения глазам. На Форте и Схеме язык один (на Форте — один синтаксис, на Схеме — одни выражения). Уровни «логики» и «выражений» никак визуально не разделены.
+2
>Что плохо в Форте и иже с ним: длинные названия слов.
Здрасьте! Как раз Форт характерен массой соглашений по сокращению слов (которые, кстати, нередко создают проблему понимания у новичков). Типа:
. (точка) символизирует печать, вывод
/ — символизирует отношение
# — символизирует количество
@ — чтение
! — запись
и т.д.
Всё это здорово сокращает синтаксис, делая Форт-программы крайне лаконичными.
>Программы на «нормальных» языках разбиты на куски, внутри которых баланс стека/скобок отслеживается компилятором.
На Форте каждая программа разбита на куски — короткие «слова». Каждое из которых легко и полноценно тестируется в момент написания.
Здрасьте! Как раз Форт характерен массой соглашений по сокращению слов (которые, кстати, нередко создают проблему понимания у новичков). Типа:
. (точка) символизирует печать, вывод
/ — символизирует отношение
# — символизирует количество
@ — чтение
! — запись
и т.д.
Всё это здорово сокращает синтаксис, делая Форт-программы крайне лаконичными.
>Программы на «нормальных» языках разбиты на куски, внутри которых баланс стека/скобок отслеживается компилятором.
На Форте каждая программа разбита на куски — короткие «слова». Каждое из которых легко и полноценно тестируется в момент написания.
+1
Для интересующихся фортом (да и вообще для всех, кто любит головоломки), есть прекрасная игра Grobots (Wiki, Documentation, Tutorial).
Жанр — стратегия. Ваша задача написать AI для роботов, на фортоподобном языке. Вот пример кода:
Вначале вы определяете, из каких роботов будет состоять ваша команда, и какие у них будут характеристики:
процессор — скорость выполнения команд
двигатель — определяет скорость передвижения (если вы вообще его ставите на данного робота),
оружие — бластер, гранаты, бомба,
сенсоры — сенсор других роботов, сенсор ресурсов, сенсор летящих снарядов,
ресурсы — вы будете их собирать на карте, или вырабатывать солнечными батареями
Далее вы описываете алгоритм поведения каждого из ваших роботов: когда они будут искать ресурсы, когда атаковать, куда передвигаться, будут ли производить новые юниты — набор тактик неограничен.
Язык — довольно простой. API — тоже не сложный. «Физика» и экономика — неплохо сбалансированы.
Чтобы определить, кто сильнее, запускается симуляция — ваша команда против команд, написанных другими. Задача — убить всех противников, или дожить до конца битвы. Побеждает тот, чьих роботов осталось больше.
Вот скриншот битвы:
Жанр — стратегия. Ваша задача написать AI для роботов, на фортоподобном языке. Вот пример кода:
#type Killer Vegetable
#color F0E
#hardware
solar-cells .3
constructor .3
armor 100
processor 5
energy 100 0
grenades 30 15 34
robot-sensor 15
#code
do
autoconstruct
grenades-reload-time periodic-robot-sensor if
robot-found if
robot-position robot-velocity lead-grenade
then
then
forever
Вначале вы определяете, из каких роботов будет состоять ваша команда, и какие у них будут характеристики:
процессор — скорость выполнения команд
двигатель — определяет скорость передвижения (если вы вообще его ставите на данного робота),
оружие — бластер, гранаты, бомба,
сенсоры — сенсор других роботов, сенсор ресурсов, сенсор летящих снарядов,
ресурсы — вы будете их собирать на карте, или вырабатывать солнечными батареями
Далее вы описываете алгоритм поведения каждого из ваших роботов: когда они будут искать ресурсы, когда атаковать, куда передвигаться, будут ли производить новые юниты — набор тактик неограничен.
Язык — довольно простой. API — тоже не сложный. «Физика» и экономика — неплохо сбалансированы.
Чтобы определить, кто сильнее, запускается симуляция — ваша команда против команд, написанных другими. Задача — убить всех противников, или дожить до конца битвы. Побеждает тот, чьих роботов осталось больше.
Вот скриншот битвы:
+2
Смотрю на код и не вижу что-то там фортоподобного?
-1
Там всего лишь для читабельности добавили идентацию и переносы строк, которые парсер игнорит. Без этого было бы совсем плохо. Вот абсолютно эквивалентный код:
... do autoconstruct grenades-reload-time periodic-robot-sensor if robot-found if robot-position robot-velocity lead-grenade then then forever ...
0
Как-то постфикса не наблюдаю :) понимаю, что извратиться можно так и на форте и писать 2 + 2, а не 2 2 +, но это будет уже не форт.
-1
В одной из ссылок, которую я дал в своем комментарии, есть следующий пример:
What in a conventional language would be:
gamma = 1 / sqrt(1 - (v / c)^2)
is in Grobots:
1 v c / square - sqrt reciprocal gamma!
+1
Особенно «весело» выглядит в стековых языках конкатенация… хоть строк хоть списков…
0
А что с ней не так? Не думаю, что сильно сложнее или запутаннее, чем на любом другом языке получится.
0
В инфиксном виде она выглядит много более наглядно, чем в постфиксном…
0
new_string = "string 1" + "string 2";
" string 1" " string 2" S+ TO new_string
Особой разницы, вроде бы, и нет.
0
Да, и при приклеивании головы к списку нагляднее, когда оператор с той же стороны, что и голова, а не с противоположной.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Публикации
Изменить настройки темы
Разомнем мозг при помощи Forth?