Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт май 27, 2016 04:15

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Форт-транслятор в Ассемблер
Автор Сообщение
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
ArtemKAD писал(а):
Появилось тут желание для нужд целевой компиляции вместо использования Форт-асма использовать ассемблер стороннего поизводителя.

ну, как, дело-то продвинулось?
Сообщение Добавлено: Сб дек 27, 2014 14:39
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
Ethereal писал(а):
forth.exe < source.txt
Это обеспечивает ОС. Можно сколько угодно говорить о ее отсутствии, это только вопрос терминологии.

Ethereal писал(а):
Если [CHAR] ) PARSE вернула строку, которая
распространяется до конца входного буфера, то она вообще символа )
не нашла (в противном случае строка хотя бы на сам символ ) до конца
буфера не дотягивалась бы). Не нашла. А раз не нашла, то принимаем
еще строку по REFILL и продолжаем искать (ить от многострочных комментариев
отказываться то не хотим, а значит если начался комментарий по (
, то нужно жевать строки пока не встретим ")" ).
Об этом я и говорил.
Но,
1) Факт "не нашла" становится известен уже в WORD.
2) Подобный REFILL, очевидно, понадобится во всех подобных (использующих WORD) словах.
Поэтому я и предложил засунуть вызов REFILL в WORD.
Сообщение Добавлено: Сб дек 20, 2014 13:35
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
>Выкинуть! Само понятие "структурной обработки исключительных ситуаций" - бяка.
Выкинуто. Точнее данное положение стандарта переистолковано по другому.

gudleifr писал(а):
У Вас имеем:
Код:
: ( [CHAR] ) PARSE + TIB >IN @ + =
    WHILE REFILL 0= UNTIL THEN ; IMMEDIATE

Т.е. какая-то хрень: сначала мы запускает WORD, которому пофигу наши "заполнители TIB", а затем сами его заполняем (REFILL).

Нет тут никакой хрени. Если [CHAR] ) PARSE вернула строку, которая
распространяется до конца входного буфера, то она вообще символа )
не нашла (в противном случае строка хотя бы на сам символ ) до конца
буфера не дотягивалась бы). Не нашла. А раз не нашла, то принимаем
еще строку по REFILL и продолжаем искать (ить от многострочных комментариев
отказываться то не хотим, а значит если начался комментарий по (
, то нужно жевать строки пока не встретим ")" ).

А REFILL - это то-же самое, что QUERY TRUE
Код:
: REFILL                                                \ CORE EXT
  SOURCE-ID IF FALSE EXIT THEN QUERY TRUE
;

Введено только для реализации стандарта ANSI-Forth во всей полноте.
Точнее, чтобы Форт-система забыла про многострочные комментарии при EVALUATE ибо
: EVALUATE TRUE TO SOURCE-ID ... FALSE TO SOURCE-ID ;

А QUERY - это прием новой строки во входной буфер вплоть до появления CR/LF.
: QUERY TIB C/L ACCEPT #TIB ! >IN 0! ;
Ну и до кучи :
Код:
// : ACCEPT ( c-addr +n1 -- +n2 )
//   OVER + OVER
//   BEGIN
//      KEY DUP >R
//      CASE
//        8 OF
//            2 PICK OVER <> IF R@ EMIT SPACE R@ EMIT 1- THEN
//          ENDOF
//        13 OF
//             RDROP CR NIP SWAP - EXIT
//           ENDOF
//        DUP BL U< INVERT
//        IF
//          2DUP <> IF R@ EMIT R@ OVER C! CHAR+ THEN
//        THEN
//      ENDCASE
//      RDROP
//   AGAIN
// ;
Сообщение Добавлено: Сб дек 20, 2014 11:41
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
gudleifr писал(а):
Попробую по-порядку: в DOS-версиях FOBOS я тупо вводил с консоли по INT 21(0A), понятно, если комментарий не успевал закончиться до конца строки, это было его проблемой (но кто будет вводить с консоли комментарии?). В качестве "дисковой памяти" использовал блоки, очевидно, т.к. блок читался в память целиком, проблемы "конца строки" у него не было.

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

Это вопрос исповедуемой идеологии. У вас клавиатура - это одно, а файл это другое.
Я же исповедую идеологию, взятую от RT-11 и от Unix, кстати и под MS-DOS она
есть, только несколько в убогом виде. Есть понятие поток - stream.
Форт принимает поток, который называется "стандартный ввод".
А откуда я этот поток физически запущу - с клавиатуры или
из файла - это мое дело. Форт одно от другого не различит.
Грубо говоря, если я под MS-DOS запушу Форт так
forth.exe
то он будет принимать с клавиатуры.
Если так
forth.exe < source.txt
то из файла, поскольку я переназначит стандартный ввод на файл.

Если Вы пользовались INT 21(0A) , то с чего вы решили, что это был
обязательно ввод с консоли ? Это поток "стандартного ввода" и этот
стандартный ввод может идти не только с клавиатуры, но и из файла и
из другого устройства. Если Вашу систему запустить с переназначением
ввода
forth.exe < source.txt
, то ввод пойдет из файла source.txt , а в нем вполне естественны комментарии.
gudleifr писал(а):
P.S. Кстати, то, что Вы употребляете слово "файл" свидетельствует о том, что ОС присутствует и не только в виде FORTH-огрызка. Просто она стоит на другом конце Вашей двухмашинной связки, в которй "младший брат" не является вполне самостоятельным.

Младший брат не вполне самостоятелен только в процессе сборки
приложения и его отладки. После того как приложение собрано старший брат
в виде ПК от младшего брата отключается и младший брат работает совершенно
самостоятельно.
При таком подходе достигаются следующие преимущества.
1.) Мне не надо реализовывать никаких блоков или файловой системы на
младшем брате. Только посимвольный ввод и вывод через UART
2.) Я при сборке приложения пользуюсь всеми благами ОС и редактирую исходники
в виде файлов на ПК. Подключившись терминальной программой к младшему брату
или с клаваитуры им управляю, или скармливаю ему текстовые файлы с ПК, просто
переназначая входной поток на файл.
3.) Все, что на младшем брате не нужно после сборки приложения (ОС, шмос), так его там и нет. Все (почти) лишнее после сборки приложения отключается/отсекается. ОС, использовавшаяся до этого, отключается простым отключением кабеля от ПК. Словарь тоже отсекается. Он или в отдельной микросхемке ведется 24c256, тогда когда приложение собрано, микросхемка вынимается из колодки и все, словаря нет, или в хвосте EEPROM и тогда после сборки напоследок этот кусок памяти затирается.
Сообщение Добавлено: Сб дек 20, 2014 11:14
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
Ethereal писал(а):
Вам бы еще талант изъясняться понятно.

Что есть...

Попробую по-порядку: в DOS-версиях FOBOS я тупо вводил с консоли по INT 21(0A), понятно, если комментарий не успевал закончиться до конца строки, это было его проблемой (но кто будет вводить с консоли комментарии?). В качестве "дисковой памяти" использовал блоки, очевидно, т.к. блок читался в память целиком, проблемы "конца строки" у него не было.

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

Теперь посмотрим общий случай: EXPECT читает порциями.

Баранов и Ноздрунов:
Код:
  : INTERPRET ( ->) BEGIN ... WORD ... FIND ... EXECUTE ... AGAIN ;
  : ФОРТ-СИСТЕМА ( ->) BEGIN QUERY INTERPRET AGAIN ;

Т.е. упершись в конец TIB, WORD честно возвращает слово "имя нулевой длины" (которое представляет собой тот же EXIT) и его честно EXECUTE, т.е. работа бесконечного цикла INTERPET прекращается и запускается следующая итерация ФОРТ-СИСТЕМА.
Понятно, такое сожрет комментарий только если он влезает целиком.

У Вас имеем:
Код:
: ( [CHAR] ) PARSE + TIB >IN @ + =
    WHILE REFILL 0= UNTIL THEN ; IMMEDIATE

Т.е. какая-то хрень: сначала мы запускает WORD, которому пофигу наши "заполнители TIB", а затем сами его заполняем (REFILL). Если мы так делаем при каждом использовании WORD, то этот REFILL проще туда (в WORD) и засунуть, ведь проверка конца TIB там уже есть. (Т.о. WORD будет выдавать "нулевое слово" только после полного конца ввода). Не будет очевидной реакции на Enter? Это вопрос драйвера клавиатуры. При чтении из файла - пофиг.
Ethereal писал(а):
Так это тупая цитата из стандарта ANSI-Forth.
Выкинуть! Само понятие "структурной обработки исключительных ситуаций" - бяка.
Ethereal писал(а):
ОС тут даже и работы не найдется.
То, что ее делает FORTH, не значит, что ее нет. Он она в большой степени и есть.

P.S. Кстати, то, что Вы употребляете слово "файл" свидетельствует о том, что ОС присутствует и не только в виде FORTH-огрызка. Просто она стоит на другом конце Вашей двухмашинной связки, в которй "младший брат" не является вполне самостоятельным.
Сообщение Добавлено: Пт дек 19, 2014 19:20
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
gudleifr писал(а):
Для этого не нужно никаких исключений.
Вам бы еще талант изъясняться понятно. Про какие исключения в этой фразе идет речь ? Вы про это что-ли ?
\ Исключительная ситуация возникает, если длина извлеченной строки
\ больше максимальной длины строки со счетчиком.

Так это тупая цитата из стандарта ANSI-Forth. Тут имеется ввиду не столько исключительная ситуация, сколько неверный результат. В моей реализации длина строки, извлекаемой по WORD, всегда усекается до максимум 31-го символа. Никакого исключения при этом не происходит.
gudleifr писал(а):
Мы с Вам опять вернулись к началу: от "никакой операционной системы" - к обработке исключений, буферизации и прочим полезным мелочам, которые ее и составляют.
Форт сам обрабатывает свои исключения, выкидываемые словом THROW, и сам входную строку буферизирует. ОС тут даже и работы не найдется.
Сообщение Добавлено: Пт дек 19, 2014 18:34
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
Ethereal писал(а):
При этом в файлах встречаются многострочные комментарии и система их игнорирует.
Для этого не нужно никаких исключений.

Мы с Вам опять вернулись к началу: от "никакой операционной системы" - к обработке исключений, буферизации и прочим полезным мелочам, которые ее и составляют.
Сообщение Добавлено: Пт дек 19, 2014 18:17
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
gudleifr писал(а):
Вводить игнорируемый комментарий с консоли? Да Вы, батенька, извращенец. А из файла все прекрасно читается и без исключений.
По моему извращение не иметь возможности распечатывать текстовые файлы на консоль. Не руками же их все время набирать.
Связь со встроенной системой от ПК по UART, то есть через консоль. Встроенная система собственного доступа к файлам на ПК не имеет. Иногда работаешь с этой системой пальчиками через клавиатуру, а иногда копируешь готовые текстовые файлы на консоль и они улетают встроенной системе, точно также, как если бы ты их набрал с клавиатуры. При этом в файлах встречаются многострочные комментарии и система их игнорирует.

P.S. Во встроенной системе ОС нет.
Сообщение Добавлено: Пт дек 19, 2014 18:13
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
Ethereal писал(а):
\ ." ABORT" ( .( залепить на ассемблере ?
Они прекрасно работают с WORD.
Напомню изначальная ошибка состояла в том, что выражение пустого комментария
Код:
( )

вдруг оказалось работающим неправильно (закрывающая скобка распознавалась как ведущая).
Дыру заткнули PARSE. Однако, как писал выше, проще исправить WORD. Я встречал в своей практике требование "пропустить не-пробелы" не более двух раз.
Ethereal писал(а):
Кроме многострочных комментариев по слову (
Вводить игнорируемый комментарий с консоли? Да Вы, батенька, извращенец. А из файла все прекрасно читается и без исключений.

P.S. По сути, это ответ на Ваш вопрос: "Зачем нужна операционная система?"
Сообщение Добавлено: Пт дек 19, 2014 18:00
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
gudleifr писал(а):
И зачем исключение, если конец строки по жизни обрабатывается штатно?
Кроме многострочных комментариев по слову (
Сообщение Добавлено: Пт дек 19, 2014 17:54
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
gudleifr писал(а):
Ethereal писал(а):
PARSE идет с пользой в реализацию слов
Я и говорю: дурость. Проще исправить изначальную ошибку в WORD: пропускать ведущие пробельные символы только если введен пробел.
И 5 слов \ ." ABORT" ( .( залепить на ассемблере ?
Сообщение Добавлено: Пт дек 19, 2014 17:52
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
gudleifr писал(а):
Кстати, не увидел в Вашем листинге (пропустил?) расширения списка искомых символов в случае пробела (до всех пробельных).
Вот только во встроенной системе дополнительной обработки табуляции, как тоже пробела, нам и не хватало. Ну вот не могли мы без нее прожить.
Сообщение Добавлено: Пт дек 19, 2014 17:50
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
Ethereal писал(а):
PARSE идет с пользой в реализацию слов
Я и говорю: дурость. Проще исправить изначальную ошибку в WORD: пропускать ведущие пробельные символы только если введен пробел.
Сообщение Добавлено: Пт дек 19, 2014 17:48
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
gudleifr писал(а):
добавлением никому не нужного PARSE.

PARSE идет с пользой в реализацию слов :
\ в форме "код_непечатного_символа" PARSE
." ABORT" в форме [CHAR] " PARSE
( .( в форме [CHAR] ) PARSE
Код:
: \  1 PARSE 2DROP  ; IMMEDIATE

: .(                                                    \ CORE EXT
  [CHAR] ) PARSE TYPE
; IMMEDIATE

: (                                                     \ CORE
  BEGIN
    [CHAR] ) PARSE + TIB >IN @ + =
  WHILE
    REFILL 0=
  UNTIL THEN
; IMMEDIATE

: ."                                                    \ CORE
  COMPILE (.")
  [CHAR] " PARSE DUP C,
  HERE OVER ALLOT SWAP CMOVE ALIGN
; IMMEDIATE
Сообщение Добавлено: Пт дек 19, 2014 17:45
  Заголовок сообщения:  Re: Форт-транслятор в Ассемблер  Ответить с цитатой
Ethereal писал(а):
зачем это PARSE введено в стандарт ?
Исключительно, по дурости. Ошибка с "ненужностью пропуска чего-либо впереди идущего, кроме пробелов" удобнее исправляется в самом WORD, чем добавлением никому не нужного PARSE.
Кстати, не увидел в Вашем листинге (пропустил?) расширения списка искомых символов в случае пробела (до всех пробельных).
И зачем исключение, если конец строки по жизни обрабатывается штатно?
Ethereal писал(а):
Слово WORD с двумя кирпичами и именно-что "прошитое"
Разложение не на "кирпичи", а на совсем уж универсальные "атомы" смысла не имеет. Понятности не добавилось. Размер вырос.
Например, у Вас около 70 прошитых кодов. У меня - 121 байт в (32-х разрядном режиме).
Но даже в таком простом примере видно, что найти полезное применение всего двум кирпичам трудно.
Ethereal писал(а):
В формировании условия с такой уж непреклонностью не требует :
Изящно, по крайней мере, если не короче, то быстрее. Но требуется обычно только "<".
Ethereal писал(а):
Ну а если создавать удобный, но не в ущерб расходу памяти удобный ?
А Вы посмотрите на WORD. Удобный язык требует разбиения программы на удобные куски, а не SWAP и DUP, перемежаемых R@. Например, в приведенный Вами код всяко просится создание "цикла с двумя выходами".
Сообщение Добавлено: Пт дек 19, 2014 17:30

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


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