Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Ср ноя 14, 2018 10:36

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Несколько общих вопросов.
СообщениеДобавлено: Чт май 28, 2009 17:50 
Не в сети

Зарегистрирован: Ср май 27, 2009 11:37
Сообщения: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте, уважаемые участники форума!

Фортом заинтересовался сравнительно недавно, пока время провожу в песочнице, играясь интерпретатором. Лучший способ научиться - это создать реальное, действующие приложение. Появилась мысль, в свободное от работы время так сказать "дублировать" приложения, создаваемые на работе. И при этом полностью соблюсти ТЗ и прочие особенности, для пущего реализма. В связи с чем возникло несколько вопросов, пока естественно не в реализации, а на самом общем уровне.

1. У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру?

2. Форт может работать без операционной системы, так? Его зашивают в ПЗУ устройства и он загружается при запуске? Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал. В обычном случае: windows/linux, драйвер для устройства, софт для работы с устройством. Но дело в том, что использоваться он (компьютер) будет по сути только для вывода информации и настройке приемника. И желательно даже, чтобы операционная система была при этом недоступна. А реально ли сделать так: драйвера для устройства на форте, софт на форте? Или для этого получается нужна некоторая форт-ос? И помимо драйвера устройства потребуется драйвера для видео и всего прочего?

3. Кто-нибудь пробовал использовать gforth и GTK server? Вопрос с gui и кросс-платформой стоит довольно остро. Если использовать не доводилось, посмотрите пожалуйста и выскажите свое мнение:
http://www.turtle.dds.nl/gtk-server/intro.html
http://www.gtk.org/features.html
Пример кода:
Код:
#! /usr/bin/env gforth-0.6.2
\ Sample gtk application using gtk-server

require unix/socket.fs
vocabulary gui  also gui  definitions

sh gtk-server -tcp=localhost:5000 -detach

0 value handle
create buf 256 allot

: gtk{ ( -- , send subsequent output to gtk-server)
    handle to outfile-id ;

: }gtk ( -- , finish output to gtk-server, receive response)
    cr stdout to outfile-id
    buf 1+ 255 handle read-line abort" GTK read error" drop
    buf c! ;

: gtkres ( -- x, evaluate gtk-server response )
    buf count evaluate ;

: s ( "delimiter" "string" -- , compile string with strange delimiter)
    char parse postpone sliteral ; immediate compile-only

: init ( -- , init connection with gtk-server)
    s" localhost" 5000 open-socket to handle
    gtk{ ." gtk_init NULL NULL" }gtk ;

: show ( widget -- )
    gtk{ ." gtk_widget_show " . }gtk ;

: window" ( "title" -- win )
    gtk{ ." gtk_window_new 0" }gtk gtkres
    gtk{ ." gtk_window_set_title " dup . [char] " parse type }gtk ;

: table ( homogeneous colums rows -- widget )
    gtk{ ." gtk_table_new " . . . }gtk gtkres ;

: add ( widget container -- )
    gtk{ ." gtk_container_add " .  . }gtk ;

: label" ( "label" -- widget )
    gtk{ s ' gtk_label_new "' type
         [char] " parse type [char] " emit }gtk gtkres ;

: attach ( bot top right left widget table -- )
    gtk{ ." gtk_table_attach_defaults " . . . . . . }gtk ;

: button" ( "name" -- widget )
    gtk{ s ' gtk_button_new_with_label "' type
          [char] " parse type [char] " emit }gtk gtkres ;

: iteration ( -- , perform mainloop iteration )
    gtk{ ." gtk_main_iteration" }gtk ;

: check ( -- widget , check for activity )
    gtk{ ." gtk_server_callback 0" }gtk gtkres ;

: done ( -- , disconnect from gtk-server )
    gtk{ ." gtk_server_exit" }gtk ;

init
window" title" constant win
1 30 30 table constant tab
tab win add
label" Hello world" constant lab
7 3 29 1 lab tab attach
button" exit" constant but
button" nothing" constant but0
27 23 28 20 but tab attach
lab show  but show  tab show  win show
: loop  begin  iteration check but =  until done bye ;
loop


P.S.: Не подумайте, что решил взяться за все это сразу и одновременно, просто хочется понять в каком направлении стоит начинать копать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 29, 2009 09:54 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
harmless писал(а):
У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру?


Ассемблер есть ассемблер. Генерит нативный код.
Может тебя смущает то, что в \arch\386\asm.fs не используется "C," для генерации кода(только ",") .
Я тоже этого не понял. Я не использую gforth. Здесь, почти все, сидят на СПФ http://spf.sf.net .

harmless писал(а):
Форт может работать без операционной системы, так?


Как и любой интерпретатор. Однако, Форт легче приспособить к новой среде базирования,
тат как он проще устроен.

harmless писал(а):
Его зашивают в ПЗУ устройства и он загружается при запуске?


Бывает такое.

harmless писал(а):
Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал.


Я делал распределенные форт-системы. Часть форт-системы расположена на персоналке
а часть на контроллере. Для MSP http://fpauk.narod.ru/spmfor.1.rar

harmless писал(а):
А реально ли сделать так: драйвера для устройства на форте, софт на форте?


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

harmless писал(а):
Пример кода:


Под виндой не удалось загрузить.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 29, 2009 12:03 
Не в сети

Зарегистрирован: Ср май 27, 2009 11:37
Сообщения: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Михаил, спасибо большое за ответы.

Цитата:
Под виндой не удалось загрузить.

Это к сожалению единственный пример который удалось найти, он исключительно для unix/linux. Хотя адаптация под windows на первый взгляд кажется не сложной, но это на первый взгляд конечно же.
Код:
sh gtk-server -tcp=localhost:5000 -detach

Выглядит просто как вызов внешней программы, видимо необходимо заменить на аналогичный в sp или gforth под win. А можно думаю и просто bat файлом организовать.
Код:
gtk-server -tcp=localhost:5000 -detach
programm.exe

Запустит в фоне сервер с которым программа будет общаться через 5000 порт по tcp, а в конце вызовет done и сервер благополучно выгрузится из памяти.
Код:
: done ( -- , disconnect from gtk-server )
    gtk{ ." gtk_server_exit" }gtk ;

Помимо tcp, поддерживаются еще STDIN, FIFO и UDP.

Как только будет достаточно опыта попробую разобраться. Ну и может кто-нибудь еще заинтересуется. Вещь весьма интересная, и переносимость хорошая получается, на любой win/linux/mac платформе будет один и тот же gtk-api использоваться. После того, как на работе переносили здоровый аппаратно-программный комплекс под linux, причем весьма специфический, появилось стойкое желание заранее продумывать подобные варианты.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 29, 2009 12:33 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
quick and dirty перевод на spf/linux
Для windows надо ввод/вывод заменить на ReadSocketLine/WriteSocketLine
Если я не ошибаюсь "настоящих" коллбэков нет, поэтому для сложной gui это может быть не очень хороший выбор, хотя подход забавный.
Родные биндинги к gtk делать -- не сложно, а если взять тот же cfg файл от gtk-server, то можно сразу сгенерить слова-врапперы к gtk api, и тем самым избежать лишних прослоек.
<pre>
\ Sample gtk application using gtk-server

REQUIRE ConnectHost ~ygrek/lib/linux/sockets.f
REQUIRE STYPE ~ac/lib/str5.f
REQUIRE CASE-INS lib/ext/caseins.f

\ sh gtk-server -tcp=localhost:5000 -detach

0 value handle
create buf 256 allot

: read
buf 1+ 255 handle read-line abort" GTK read error" drop
buf c! ;

: gtk ( s -- ) H-STDOUT >R handle TO H-STDOUT STYPE R> TO H-STDOUT read ;

: result ( -- x, evaluate gtk-server response )
buf count evaluate ;

: init ( -- , init connection with gtk-server)
s" localhost" 5000 ConnectHost THROW to handle
" gtk_init NULL NULL" gtk ;

: show ( widget -- ) " gtk_widget_show {n}" gtk ;

: window" ( "title" -- win )
" gtk_window_new 0" gtk result DUP
[char] " parse ROT
" gtk_window_set_title {n} {s}" gtk ;

: table ( homogeneous colums rows -- widget )
" gtk_table_new {n} {n} {n}" gtk result ;

: add ( widget container -- )
" gtk_container_add {n} {n}" gtk result ;

: label" ( "label" -- widget )
[char] " parse " gtk_label_new {''}{s}{''}" gtk result ;

: attach ( bot top right left widget table -- )
" gtk_table_attach_defaults {n} {n} {n} {n} {n} {n}" gtk ;

: button" ( "name" -- widget )
[char] " parse " gtk_button_new_with_label {''}{s}{''}" gtk result ;

: iteration ( -- , perform mainloop iteration )
" gtk_main_iteration" gtk ;

: check ( -- widget , check for activity )
" gtk_server_callback 0" gtk result ;

: done ( -- , disconnect from gtk-server )
" gtk_server_exit" gtk ;

init
window" title" constant win
1 30 30 table constant tab
tab win add
label" Hello world" constant lab
7 3 29 1 lab tab attach
button" exit" constant but
button" nothing" constant but0
27 23 28 20 but tab attach
lab show but show tab show win show
: loop begin iteration check but = until done bye ;
loop
</pre>

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 29, 2009 14:42 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
harmless писал(а):
1. У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру?

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 29, 2009 14:57 
Не в сети

Зарегистрирован: Ср май 27, 2009 11:37
Сообщения: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Цитата:
Если я не ошибаюсь "настоящих" коллбэков нет, поэтому для сложной gui это может быть не очень хороший выбор, хотя подход забавный.

Насчет callback'ов надо будет почитать, ну а сложность gui не слишком лично для меня принципиальна, по работе чаще всего приходится делать довольно простые приложения. Главное чтоб переносились из одной операционной системы в другую с минимальными модификациями. Начальство наконец осознало проблемы рождаемые привязанностью к определенной платформе, когда весь рабочий софт под win, заказчик требует чтобы все работало под linux, а помимо прочего есть программы ни под чем кроме dos'а не работающие. К примеру сейчас из анналов истории у нас пытаются извлечь проблемно-ориентированный язык, написанный черт его знает когда и черт знает на чем, в связи с чем кстати и возник интерес к форту.

Цитата:
Родные биндинги к gtk делать -- не сложно, а если взять тот же cfg файл от gtk-server, то можно сразу сгенерить слова-врапперы к gtk api, и тем самым избежать лишних прослоек.

Родные биндинги - это как раз идеальный вариант, если со временем к этому придет - будет просто прекрасно. Вообще GTK+ вещь очень интересная.

И на последок один вопрос: правильно ли я понял в чем различия следующих двух участков кода?
Код:
: attach ( bot top right left widget table -- )
    gtk{ ." gtk_table_attach_defaults " . . . . . . }gtk ;

и
Код:
: attach ( bot top right left widget table -- )
    " gtk_table_attach_defaults {n} {n} {n} {n} {n} {n}" gtk ;

Тут простой вывод из стека заменен на некий параметризованный на подобие printf() в Си и два слова "gtk{" и "}gtk" заменены одним делающим все за один "присест"?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 29, 2009 15:00 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
harmless писал(а):
2. Форт может работать без операционной системы, так? Его зашивают в ПЗУ устройства и он загружается при запуске? Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал. В обычном случае: windows/linux, драйвер для устройства, софт для работы с устройством. Но дело в том, что использоваться он (компьютер) будет по сути только для вывода информации и настройке приемника. И желательно даже, чтобы операционная система была при этом недоступна. А реально ли сделать так: драйвера для устройства на форте, софт на форте? Или для этого получается нужна некоторая форт-ос?

посмотрите в сторону OPENBOOT однако сразу скажу, что на форуме особых знатоков его не имеется.
С другой стороны, если у вас нет необходимости иметь кучу драйверов, лучше взять какую-нибудь маленькую форт-систему, переписать FVM под нужную платформу (это около 30-60 ассемблерных кусочков длиной от нескольких ассемблерных инструкций до 2-3 десятков) и "раскручивать" уже ее.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 29, 2009 15:28 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
harmless писал(а):
Тут простой вывод из стека заменен на некий параметризованный на подобие printf() в Си и два слова "gtk{" и "}gtk" заменены одним делающим все за один "присест"?

да.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB