Forth http://fforum.winglion.ru/ |
|
Несколько общих вопросов. http://fforum.winglion.ru/viewtopic.php?f=24&t=2130 |
Страница 1 из 1 |
Автор: | harmless [ Чт май 28, 2009 17:50 ] |
Заголовок сообщения: | Несколько общих вопросов. |
Здравствуйте, уважаемые участники форума! Фортом заинтересовался сравнительно недавно, пока время провожу в песочнице, играясь интерпретатором. Лучший способ научиться - это создать реальное, действующие приложение. Появилась мысль, в свободное от работы время так сказать "дублировать" приложения, создаваемые на работе. И при этом полностью соблюсти ТЗ и прочие особенности, для пущего реализма. В связи с чем возникло несколько вопросов, пока естественно не в реализации, а на самом общем уровне. 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.: Не подумайте, что решил взяться за все это сразу и одновременно, просто хочется понять в каком направлении стоит начинать копать. |
Автор: | Mihail [ Пт май 29, 2009 09:54 ] |
Заголовок сообщения: | |
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 писал(а): Пример кода:
Под виндой не удалось загрузить. |
Автор: | harmless [ Пт май 29, 2009 12:03 ] |
Заголовок сообщения: | |
Михаил, спасибо большое за ответы. Цитата: Под виндой не удалось загрузить.
Это к сожалению единственный пример который удалось найти, он исключительно для 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, причем весьма специфический, появилось стойкое желание заранее продумывать подобные варианты. |
Автор: | ygrek [ Пт май 29, 2009 12:33 ] |
Заголовок сообщения: | |
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> |
Автор: | mOleg [ Пт май 29, 2009 14:42 ] |
Заголовок сообщения: | |
harmless писал(а): 1. У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру?
обычно делают сравнительно стандартный. по крайней мере пока кроссплатформенного не существует. Впрочем, ассемблер не очень хорошая в Форте штука (точнее очень ограниченно нужная) - гораздо лучше создать нужные примитивы на внешнем ассемблере и дальше все уже разрешать только на высоком уровне. |
Автор: | harmless [ Пт май 29, 2009 14:57 ] |
Заголовок сообщения: | |
Цитата: Если я не ошибаюсь "настоящих" коллбэков нет, поэтому для сложной 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" заменены одним делающим все за один "присест"? |
Автор: | mOleg [ Пт май 29, 2009 15:00 ] |
Заголовок сообщения: | |
harmless писал(а): 2. Форт может работать без операционной системы, так? Его зашивают в ПЗУ устройства и он загружается при запуске? Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал. В обычном случае: windows/linux, драйвер для устройства, софт для работы с устройством. Но дело в том, что использоваться он (компьютер) будет по сути только для вывода информации и настройке приемника. И желательно даже, чтобы операционная система была при этом недоступна. А реально ли сделать так: драйвера для устройства на форте, софт на форте? Или для этого получается нужна некоторая форт-ос?
посмотрите в сторону OPENBOOT однако сразу скажу, что на форуме особых знатоков его не имеется. С другой стороны, если у вас нет необходимости иметь кучу драйверов, лучше взять какую-нибудь маленькую форт-систему, переписать FVM под нужную платформу (это около 30-60 ассемблерных кусочков длиной от нескольких ассемблерных инструкций до 2-3 десятков) и "раскручивать" уже ее. |
Автор: | ygrek [ Пт май 29, 2009 15:28 ] |
Заголовок сообщения: | |
harmless писал(а): Тут простой вывод из стека заменен на некий параметризованный на подобие printf() в Си и два слова "gtk{" и "}gtk" заменены одним делающим все за один "присест"?
да. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |