Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 03:32

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

Обзор темы - Стандартизация читабельности (понятности) кода ?
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Всё же мне представляетсмя, без длинных имён - пусть не таких - глухо в некоторых задачках
Примеры?
Сообщение Добавлено: Сб янв 17, 2009 05:23
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Всё же мне представляетсмя, без длинных имён - пусть не таких - глухо в некоторых задачках

для этого и нужны словари ;)
Сообщение Добавлено: Пт янв 16, 2009 22:22
  Заголовок сообщения:   Ответить с цитатой
Да. Всё разумно, я отвечу позже. Всё же мне представляетсмя, без длинных имён - пусть не таких - глухо в некоторых задачках
Сообщение Добавлено: Пт янв 16, 2009 22:18
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
mOleg писал(а):

ну, вот, к примеру тут все избыточно:
можно было как-то так:

StrType IF 0 TO StrType ELSE _BASE_POSTFIX_TYPE THEN
но ведь именно так и было, только было NOT, чтобы не забывать, в каком именно смысле используется флаг

я не смотрел как было, потому что оООчень длинные определения и очень слабочитаемые имена.
NOT в принципе просто избыточен, лучше тогда пользовать IFNOT (одно слово вместо двух).

А вообще, уже говорилось, что Сишный подход в Форте не применим, так как дает ужасающие результаты!
Форт - это собственно даже не язык программирования, а ЯЗЫКОВАЯ СРЕДА! Он слабо отличается от естественного, к примеру Русского языка.
Вот, подумай, легко ли разбирать предложения (просто читать) Гоголя, или там Толстого? Ведь язык у них ужасающ! Предложения на пол страницы, где к концу предложения забываешь начало его.
Или вспомни какие проблемы возникают, в естественых даже коротких ситуациях в родном языке, к примеру:
"хлеб на столе, возьми его и принеси сюда!"
коротко? - ДА
ясно? - НЕТ: кого принести? стол или хлеб?
Эти проблемы в форте обострены тем, что компилятор не имеет интеллекта, и будет приносить, скорее всего последнее, причем без хлеба :)
Или возьми к примеру научный текст (тут вообще близко к форту)
там куча терминов бывает! И, если, в одном предложении слишком много незнакомых терминов - оно не понятно, нет, буквы знакомые, даже слова вроде понятные, а что в предложении написано?? не понятно (я о так называемом наукообразном стиле изложения). Получается, что даже родной язык бывает совсем не понятен, или понимается не так, как хочет автор!
а ведь бывают еще приколисты, не заканчивающие предложения, скачущие по смыслу как блохи, и прочие приколы, когда простой текст становится непонятным ни в какую!
Сообщение Добавлено: Пт янв 16, 2009 22:02
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Ну ... а если мне при параллельной обработке 3 строк понадобится 3 или больше индексов-указателей в один момент?

да сколько угодно. Не делай такие длинные имена! они нечитаемы. Беглым взглядом не разобрать чем одно слово от другого отличается - это серьезная проблема, потому что "такты мозга" тратятся на различение слаборазличимых нечитаемых имен.

А вообще, если ты разбираешь несколько источников, то во-первых, синтаксис выдели в отдельную либу (этим ты скроешь как сложность реализации, так и посторонние слова, которые просто не нужны в решаемой задаче), во-вторых, вспомни, что форт УМЕЕТ возвращать много параметров из слова!
В сях для таких нужд используют структуры. На самом деле и в форте это дело полезно. Можно сделать так:
<pre>
0 \
CELL -- off_point \ указатель на текущий разбираемый символ
CELL -- off_str# \ размер строки
0 -- off_body \ начало строки
CONSTANT /parsed
</pre>
и дальше пользоваться только указателем на эту структуру данных. 1-а переменная вместо 3х !!!
Сообщение Добавлено: Пт янв 16, 2009 21:51
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
вопрос писал(а):
что, так намного читабельней?
(разумеется, требуется редактор с подсветкой)

всего в два раза :)
Вообще, все что я скажу дальше не претендует на истину, а относится к моему мнению! Прошу не принимать очень категорично - собственно идеального варианта не знает никто.

Да, многое кажется мне делом вкуса...

mOleg писал(а):
на самом деле не надо коментировать каждую строчку в исходном тексте!

сначала не было, это я потом постарался :D :D
mOleg писал(а):
не надо делать такие длинные имена! их невозможно читать просто сами по себе ужастны: sourcestringbegin transformation_type_flag и так далее, уже на них запинаешься!

если хочется, чтобы имена не перекликались с другими в системе - пиши в отдельном словаре!

Ну ... а если мне при параллельной обработке 3 строк понадобится 3 или больше индексов-указателей в один момент? :( :( :(

mOleg писал(а):
ну, вот, к примеру тут все избыточно:
<pre>
transformation_type_flag NOT \ тип трансформации для строки не назначен программистом
IF _BASE_POSTFIX_TYPE \ в этом случае вызвать инициализацию по умолчанию
ELSE 0 TO transformation_type_flag \ иначе - обнулить флаг (инициализация не забыта)
THEN
</pre>
можно было как-то так:
<pre>
StrType IF 0 TO StrType ELSE _BASE_POSTFIX_TYPE THEN
</pre>
но ведь именно так и было, только было NOT, чтобы не забывать, в каком именно смысле используется флаг

mOleg писал(а):
причем даже в укороченном примере не все понятно ( я не закапываюсь в логику программы )
например, почему в одном случае устанавливается переменная ,а в другом нет - интуитивно ожидается такой вариант:
<pre>
StrType IF 0 ELSE _BASE_POSTFIX_TYPE THEN TO StrType
</pre>
что еще лаконичнее (но не факт, что отражает логику работы программы )

Не отражает ...
смысл таков - поскольку алгоритм позволяет задавать как угодно много строк (которые образцы), то между ними можно выбирать по ходу. При желании можно сделать так, что сначала преобразуется выражение на С++, затем на Паскале, потом на Эйфории и т.п.
Но как сказать функции, какое преобразование нужно?
Задав переменные. Их задают отдельные слова, а чтобы быть в курсе, что переменные заданы, а не содержат лишь бы что в данный момент: такие слова ещё и устанавливают флаг
Тот самый transformation_type_flag. Попользовавшись переменными, >postfix этот флаг обнуляет, тип снова не задан.
Оно и было в одну строку


продолжение - в след. сообщении
Сообщение Добавлено: Пт янв 16, 2009 21:42
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
что, так намного читабельней?
(разумеется, требуется редактор с подсветкой)

всего в два раза :)
Вообще, все что я скажу дальше не претендует на истину, а относится к моему мнению! Прошу не принимать очень категорично - собственно идеального варианта не знает никто.

на самом деле не надо коментировать каждую строчку в исходном тексте!
не надо делать такие длинные имена! их невозможно читать просто сами по себе ужастны: sourcestringbegin transformation_type_flag и так далее, уже на них запинаешься!

если хочется, чтобы имена не перекликались с другими в системе - пиши в отдельном словаре!
ну, вот, к примеру тут все избыточно:
<pre>
transformation_type_flag NOT \ тип трансформации для строки не назначен программистом
IF _BASE_POSTFIX_TYPE \ в этом случае вызвать инициализацию по умолчанию
ELSE 0 TO transformation_type_flag \ иначе - обнулить флаг (инициализация не забыта)
THEN
</pre>
можно было как-то так:
<pre>
StrType IF 0 TO StrType ELSE _BASE_POSTFIX_TYPE THEN
</pre>

причем даже в укороченном примере не все понятно ( я не закапываюсь в логику программы )
например, почему в одном случае устанавливается переменная ,а в другом нет - интуитивно ожидается такой вариант:
<pre>
StrType IF 0 ELSE _BASE_POSTFIX_TYPE THEN TO StrType
</pre>
что еще лаконичнее (но не факт, что отражает логику работы программы )

дальше:
<pre>
SWAP DUP
   TO sourcestringbegin      \ инициализация переменных начала и конца строки
   TO sourcestringpointer    \ совпадает с началом сейчас
   sourcestringbegin + TO sourcestringfinal 
</pre>
этот код логичнее в самом начале поместить, где он будет однозначно ассоциироваться с ( asc # --> ...
на входе
и опять переменные, в которых я сильно сомневаюсь (нужны ли они вообще?): sourcestringbegin и sourcestringpointer sourcestringfinal 
имена ужасающе длинные и нечитаемые (уже на них внимание уходит. Для сишника это может и ничего, но в форте это ужастно выглядит)

мой вариант того же куска: (без изменения имен)
<pre>
OVER + TO sourcestringfinal  DUP TO sourcestringbegin TO sourcestringpointer
</pre>
уже легче проследить что на стеке
но уже этот код можно отделить в какой-нить InitSоurce и будет понятнее что делает код в программе без коментирования его.

<pre>
>postfix_variables_start \ обнулить переменные состояния и т.п.

BEGIN \ цикл, анализирующий содержание строк
sourcestringpointer sourcestringfinal > NOT
WHILE
>postfix.cycle.body
REPEAT
</pre>
подсветка хорошая вещь, но даже она не всегда помогает! код выглядит нормально, но я бы
1) сделал короче все имена
2) иначе отформатировал текст:
<pre>
>postfix_variables_start

BEGIN sourcestringpointer sourcestringfinal > NOT WHILE
>postfix.cycle.body
REPEAT
</pre>
собственно коментарии к коду тут не нужны
смущает только > NOT можно заменить на < ? или использовать WHILENOT (впрочем в СПФе последний не принят, а зря)

<pre>
OPERATOR_STATE OBRACKET_STATE OR \ либо последний - оператор, либо незакрыта скобка
IF ." UNEXPECTED END OF_ STRING " anykey? KEY DROP BYE THEN
end_of_string_match
result_begin ( asc )
result_pointer ( # )
</pre>
тут: KEY DROP BYE выглядит комично, потому что BYE уже пофигу на стеки.
кстати, та же ситуация с THROW для случаев, когда он гарантированно сработатет.
Встречается избыточный код:
IF DROP RDROP -1 THROW THEN
угадайте, что тут лишнее? ;)

ну и
result_begin ( asc ) result_pointer ( # )
не обязательно коментировать было, да и в одну строку было бы легче разместить.
Впрочем, я уже сомневался в необходимости этих переменных

вобщем, уже это слово могло состоять из трех как минимум
быть написано в 5 строчек (максимум)
не иметь коментариев внутри и быть абсолютно читаемым
Сообщение Добавлено: Пт янв 16, 2009 21:01
  Заголовок сообщения:   Ответить с цитатой
Цитата:
Насчет "понятно что Броуди читал" - не понятно, причем после просмотра кода, скорее понятно, что не читал
или точнее не принял (а может не понял)
Ну я тихо и не навязываясь предлагал некоторые рекомендации внести в стандарт, т.к. для форта ввиду больших возможностей это важнее чем для С

На Броуди у меня свой собственный взгляд, может это даже очевидно - некоторые из предлагаемых им приёмов по организации кода чуть ли не более трудоёмки, чем разбор моей функции :( и не во всех случаях применимы

Ну, предположим, я оформлю >postfix так
Код:
: >postfix.cycle.body   
   sourcestringpointer  (  symbol_addr  )               

STRING_STATE    IF       \ word in process: слово проходим - предыдущий символ -не пробел, не ограничитель                
        C@ s_sym               
                   IF  \ а настоящий - пробел                   
             \ naturally, end of word - слово закончилось предыдущим символом
           0 TO STRING_STATE               
           sourcestringpointer  1 -  \ вот этим символом                
           word_to_res               \ на стеке  - конец слова, начало - в переменной 
         THEN
        sourcestringpointer 1 + TO sourcestringpointer                 
                        
      ELSE        \  ---------------------- NO word in process ----------------------
        C@ s_sym    NOT  \ предыдущий символ - пробел а настоящий нет - начало слова         
         IF                                                
         sourcestringpointer   \ где мы?               
         symbol_recognize      \ разобрать, что перед нами с текущей позиции строки
                               \ оператор или скобка (тоже "оператор") = -1                   
              IF             
                 skip_op_symbols   \ если оператор - продвигаемся по строке на его длину           
              ELSE               
              -1 TO STRING_STATE             
              sourcestringpointer TO wordbegin \ в противном случае начало слову
              THEN                     
         THEN           
        sourcestringpointer 1 + TO sourcestringpointer   \ во всех случаях на 1 символ вперёд           
      THEN
   ;

:  >postfix ( asc # --> asc # )

   transformation_type_flag  NOT           \ тип трансформации для строки не назначен программистом
   IF     _BASE_POSTFIX_TYPE               \ в этом случае вызвать инициализацию по умолчанию    
   ELSE   0  TO  transformation_type_flag  \ иначе - обнулить флаг (инициализация не забыта)
   THEN 
    
   SWAP DUP
   TO sourcestringbegin      \ инициализация переменных начала и конца строки
   TO sourcestringpointer    \ совпадает с началом сейчас
   sourcestringbegin + TO sourcestringfinal 
   
   >postfix_variables_start  \ обнулить переменные состояния и т.п.
      
   BEGIN                     \ цикл, анализирующий содержание строк
   sourcestringpointer  sourcestringfinal > NOT             
   WHILE                
          >postfix.cycle.body
   REPEAT 
    
   \ end of string - rest: строка закончена, нужно только выложить операторы, оставшиеся на стеке
   OPERATOR_STATE    OBRACKET_STATE   OR      \ либо последний - оператор, либо незакрыта скобка
   IF ." UNEXPECTED END OF_ STRING "  anykey? KEY DROP BYE  THEN 
   end_of_string_match 
   result_begin ( asc ) 
   result_pointer ( # )  ;


что, так намного читабельней?
(разумеется, требуется редактор с подсветкой)
Сообщение Добавлено: Пт янв 16, 2009 20:21
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Олег, это ведь та же манера, которая так раздражает кого-то в Хищнике.
Надеюсь, понятно, что Броуди я читал.
Также понятно, что Броуди предлагает поучения, а не стандартизацию (не одно).
И Броуди недостаточно.

дык, ведь речь и идет о том, что стандартизация в предлагаемой тобой области не возможна.
В том же Си и пр. есть рекомендации по оформлению кода, но не стандарт!

Насчет "понятно что Броуди читал" - не понятно, причем после просмотра кода, скорее понятно, что не читал :)
или точнее не принял (а может не понял) :)
Сообщение Добавлено: Пт янв 16, 2009 20:06
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Как бы ... так никто и не сомневался, однако когда вопрос о стандарте возник. Хищник не стал говорить "не нужно никакого стандарта, я без стандарта замечательно ... " , а проявил живой интерес. Следовательно, как понять
Стандарта, что характерно, никто не просит остаётся непонятным.

У стандартов есть иерархия - это раз. То есть кварк сейчас выступает как стандарт предприятия - на нем по факту народ начинает новые проекты. Для этого приходится сокращать "полет фантазии" и обращать внимание на востребованность, преемственность и внедрение. И не скажу, что это плохо, наоборот, многие вещи встали на свои места. Поскольку ни один стандарт на Форт в России неприменим, и никто не просит документ о соответствии ANSI или ISO - какой смысл ждать чьего-то стандарта? Тем более при налаженном процессе выпуска софта. У людей давно пропало состояние "а вот бы нам дали стандартный-стандартный Форт, чтобы мы сразу полезли искать компоненты в сети".

Во-вторых, хороший фортер, но плохой специалист по документированию сделает стандарт гораздо хуже, чем хороший специалист по документам, но посредственный фортер. Так что каждому делу надо учиться, и разработке документов в том числе. Пока это действительно не выходит за пределы форума, нужно пробовать. Естественно, я отнюдь не собираюсь следовать форт-религии шиитского толка :) (Из цикла "Почему глючат программы: Ислам (шииты). Только один программист писал верные программы. Верными являются также последующие версии этих программ. Все остальные программы глючат по определению.") То бишь сколько бы людей не пытались, страшно вращая глазами, убедить меня, что вот именно они и являются носителями "истинного духа Форта", "стандарта де-факто" или "действительно свободного и коллективного стандарта", смотреть я буду исключительно по результатам. В данном случае определяющим фактором является то, что Winglion Фортом пользуется, так что весьма вероятно получение удобоваримого результата после ряда итераций с его стороны. В противном случае будет как в мультике "Летели два верблюда". Напомню сюжет - там две зверюшки сочинили неплохую песенку. И вот тут-то на них насели со всех сторон, пытаясь заманить то в рок-группу, то в хор звериного молодняка - и каждый нахлебник тянул их под свое "чуткое руководство". В итоге они на всех плюнули и поскакали куда-то вдаль, распевая песенку :) Потому что они умеют, а остальные без них могут только придумывать, кто и как должен петь / писать на Форте.
Сообщение Добавлено: Пт янв 16, 2009 02:31
  Заголовок сообщения:   Ответить с цитатой
я так понял, что выработка стандарта "на примере" некоего коллективного проекта кажется избыточно трудоёмкой.
Сообщение Добавлено: Пт янв 16, 2009 02:10
  Заголовок сообщения:   Ответить с цитатой
Зачем при этом так ярко подчёркивать, что стандарт где-то совсем не нужен ?
Цитата:
Стандарта, что характерно, никто не просит
Сообщение Добавлено: Пт янв 16, 2009 02:08
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Следовательно, как понять
Стандарта, что характерно, никто не просит остаётся непонятным.


Работают люди, как же это еще понять? ;)
Сообщение Добавлено: Пт янв 16, 2009 02:04
  Заголовок сообщения:   Ответить с цитатой
Хищник писал(а):
вопрос писал(а):
Хищник, ещё раз (Хищнику тоже ... ) нужна попытка коллективной работы, чтобы понять (ткнуться носом в) потребности стандарта - над чем угодно, хоть над крестиками-ноликами

Кгхм. Ничего, что я последние 5+ лет в коллективе над Форт-проектами и работаю? И первое, что принимаю во внимание при оценке предлагаемых технологий - как я это принесу своему коллективу и под каким соусом подам. И нужно ли это конкретным людям, которые на разных (моих и кое-кто уже своих) фортах регулярно перелопачивают десятки килобайт. Стандарта, что характерно, никто не просит. Просят документацию, примеры, периодически новые слова и компоненты. Исходники тоже никому особо не интересны.

Как бы ... так никто и не сомневался, однако когда вопрос о стандарте возник. Хищник не стал говорить "не нужно никакого стандарта, я без стандарта замечательно ... " , а проявил живой интерес. Следовательно, как понять
Стандарта, что характерно, никто не просит остаётся непонятным.
Сообщение Добавлено: Пт янв 16, 2009 01:57
  Заголовок сообщения:   Ответить с цитатой
вопрос писал(а):
Тогда зачем предлагать кварк в качестве именно коллектичной работы ЭТИМ людям?

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

Кгхм. Ничего, что я последние 5+ лет в коллективе над Форт-проектами и работаю? И первое, что принимаю во внимание при оценке предлагаемых технологий - как я это принесу своему коллективу и под каким соусом подам. И нужно ли это конкретным людям, которые на разных (моих и кое-кто уже своих) фортах регулярно перелопачивают десятки килобайт. Стандарта, что характерно, никто не просит. Просят документацию, примеры, периодически новые слова и компоненты. Исходники тоже никому особо не интересны.
Сообщение Добавлено: Пт янв 16, 2009 01:35

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


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