Свой язык
Ребята, которые знают о моём увлечении языками программирования, спрашивают почему я до сих пор свой язык не придумал. Ну, почему же не придумал? Можно вспомнить, например, Price Contertor Small Talk (восьмой язык снизу), язык полный по Тьюрингу, был придуман в 1998 году, интерпретатор, кажется, был на Перле.
Не увидел свет интерпретируемый язык, основная идея которого была в том, что по pipe (как в PowerShell) идут объекты, а, кроме этого, поток можно было направлять в любую сторону (как в Befunge, только у меня поток данных, а не выполнения) и ветвить (как в команде tee, в Linux).
Было ещё несколько подобных вещей, сейчас уже их не найти.
А недавно, листая свои дневники жизни, я обнаружил следующую запись:
18/X — 1991 год
Стал кое-что понимать в Рапире, Алг. языке, Ф<неразборчиво, возможно «Фокале»>, скоро и с Ассемблером разберусь. Написал небольшую брошюру — проект своего языка «BASISE» («Базис»).
Что это был за язык я совершенно не помню, но, кажется, это был мой первый эксперимент на эту тему.
Не говоря уже о DSL. Например, когда я работал в «Казанском портале», придумал DSL (ребята его потом ещё допилили) для описание ограничений форм, правила проверялись сразу на сервере и клиенте. Вот на что это было похоже:
user !{$#} Логин не задан
user !userExists({$#}) Пользователь не существует
pass !{$#} Пароль не задан
pass is_null({{{_USER}}} = userLogon($user, {$#})) Пароль задан неверно
Применялось тогда это очень широко.
Жень, помня тебя в этом лохматом году я вспоминаю твое увлечение достаточно самобытным языком программирования на «Ф»- это был конечно же ФОРТ (язык программирования, в котором программы записываются в постфиксной записи и в стековой нотации). А вот ФОКАЛ наврят ли ты изучал, да и начал что-то понимать в нем- смешно. ФОКАЛ применялся на БК 0010. Это был, кажется, бейсикоподобный язык. Понимать там был нечего. А вот необычность ФОРТа, я помню мы с тобой обсуждали.
Комментарий для Дмитрий:
Про ФОРТ я помню :) Но на этой странице точно не ФОРТ написан, кроме того, на следующей всё-таки упоминается Фокал. По Фокалу у меня брошюрка была, купленная в нашем книжном, ещё несколько лет назад она лежала дома у родителей.
Ну и, соответственно, Фокал я учил по той брошюрке. Там были свои интересные вещи, в «99» ( http://bolknote.ru/99.html ) у меня он есть, 41-й язык снизу.
И еще, чуть позже, ты стал увлекаться Си. Собственно, на сколько помню, твои изыскания по собственному языку были во многом из него и заимствованы. Помниться, тогда еще мулька такая ходила, де Терминатора-2, который Т-1000 нарисовали на Си. Так что Си звучало круто и даже хотелось верить, что стоит освоить Си и сможешь и сам рисовать терминаров не хуже :)
эээ... справедливости ради, скажу, что терминатора на Си ты не собирался рисовать. Изучал так, ради интереса- была у тебя такая синенькая книжка отпечатанная на принтере матричном — небольшая для учебного пособия по Си.
Комментарий для Дмитрий:
В 1991-м про Си я ещё не знал :) Си в поле моего зрения появился гораздо позднее, когда у меня уже 286 был, тогда папа принёс с работы пару учебников по этому языку. Надо сказать, что язык мне тогда не понравился своим синтаксисом, гораздо сильнее мне нравился Паскаль :)
Вот, кстати, страница из дневника, где упоминается неразборчивый язык на «Ф»:
http://img-fotki.yandex.ru/get/5807/bolknote.4d/0_4f4f3_73f7c300_L#basise1.jpg%7Chttp%3A%2F%2Ffotki.yandex.ru%2Fusers%2Fbolknote%2Fview%2F324851%2F%3Fpage%3D0#
Комментарий для Дмитрий:
А вот как выглядела брошюрка по ФОКАЛУ: http://www.libex.ru/detail/book91959.html
Комментарий для Дмитрий:
O!
bolk$ wget http://ftp://www.cozx.com/pub/langs/focal.tar.gz
bolk$ tar xvfz focal.tar.gz
bolk$ cd focal-1.0.2
bolk$ sed -ie ’s!^INSTDIR.*!INSTDIR = /usr/local/Cellar/focal/1.0.2/!’ Makefile
bolk$ make gnukfreebsd
bolk$ make install
bolk$ brew link focal
bolk$ focal
FOCAL-1.0.2 execution begins
*ASK «HOW ARE YOU?»
HOW ARE YOU?*
И моя «Песня про пиво» на ФОКАЛе не работает, оказывается :(
Почему-то эта версия интерпретатора не понимает отрицательный шаг.
Так и есть, вот реализация цикла (команда FOR):
if (!err_flag && (p->for_limit >= v1))
{
/* Set up FOR stack */
p->for_ptr = for_top;
for_top = p;
/* Set up PC stack */
pcpush();
pc_top->pc_flags = FOR_FLG;
/* Execute loop */
execline();
}
Если изменить счётчик цикла с 99…1 на 1…99, то всё работает. Значит реализация просто неполная.
Комментарий для Евгения Степанищева:
Судя по «сколо» вполне возможен и «Фокал» :)
Комментарий для mr-simm.livejournal.com:
Дневник был для себя, я там ещё меньше заморачивался с поиском ошибок, чем сейчас :)