Oberon #01
31 марта 1996

Ликбез - о правилах хорошего тона в программировании.

<b>Ликбез</b> - о правилах хорошего тона в программировании.
  В этой рубрике мы хотим рассказывать вам
о  "правилах хорошего тона" в программиро-
вании.  К сожалению,на страницах "ZX-Ревю"
и  "SPECTROFON"  накопилось уже достаточно
высказываний  и  творений горе-программис-
тов,  которые считают, что достаточно выу-
чить  Ассемблер,  и уже можно писать прек-
расные  программы.  Если  бы  все было так
просто,  то зачем существуют ВУЗы, в кото-
рых  обучают "ратному" ремеслу программис-
тов, и зачем студентов там "мурыжат" целых
пять (иногда пять с половиной) лет ?      
  А  все  очень просто: программист должен
знать  очень много всего, на первый взгляд
не  относящегося к программированию, но на
самом  деле  являющегося небоходимым. Нес-
мотря  на это "ставка" ("SPECTROFON", "ИН-
ФОРКОМ")  дала  "зеленую  улицу" авторским
программам, забыв об этом (а может, просто
не  знала  ?).  И полилась на свет "груда"
ширпотребовских авторских программ, годных
лишь  для того, чтобы их авторы показывали
свои  творения несведующим предствительни-
цам  противоположного  пола  и  говорили :
"смотри какой я умный, такую программу на-
писал,  давай  сегодня  поужинаем вместе".
Вот  мы и решили хоть как-то исправить по-
ложение.                                  
  Данная  рубрика  рассчитана отнюдь не на
профессионалов,  она  для  всех,  для кого
"SPECTRUM" немного больше,чем просто игро-
вой автомат. Мы постараемся не "загружать"
вас  профессиональными терминами, "изврат-
ными"    приемами   программирования,   но
рассказать  вам  о том, как надо (и как не
надо)  составлять программы для "SPECTRUM"
(будь  то  игра  "для  продажи"  или прос-
тенькая  программка  для  "чисто домашнего
исспользования").  Кстати,  попутно мы со-
вершим  экскурс  в  историю ЭВМ, что очень
даже  увлекательное  занятие.  В следующих
номерах мы планируем поведать вам об исто-
рии  и  причинах  появления  на белый свет
ЭВМ,  кибернетики, компьютерных вирусов, и
т.д.  (естественно не в виде нудных лекций
с   фразами   типа:  "таким  образом",  "в
следствии  чего",  ...  ) все это довольно
интересные  истории,  местами напоминающие
фантастические  романы  (но все это наша с
вами история - т.е. быль) и детективы. Так
что, как  говорится  в  одном отличном со-
ветском мультфильме -"покупайте наших сло-
нов !".                                   
   Начнем, как всегда, с терминов. Лично у
нас  фраза "я написал программу в машинных
кодах"  вызывает попеременно два рода эмо-
ций: истерический смех и сильную жалость к
говорящему. Смех из-за картины, встающей у
нас  перед  глазами. Жалость - потому, что
главный герой этой картины в ближайщую не-
делю  попадет  в психбольницу. На занятиях
по информатике, если вы их посещали, самым
первым  делом "вдалбливают" всем про поко-
ления ЭВМ, не так ли ? Ну, так вот. Первые
ЭВМ  не имели ни привычной нам клавиатуры,
ни тем более дисплеев. А как их программи-
ровали  ? В тех самых МАШИННЫХ КОДАХ. Опе-
ратор ЭВМ (отсюда пошла эта специальность)
дабы  освободить  программиста  для  более
тяжких занятий, сам занимался вводом прог-
раммы.  И угадайте, как он это делал ? Со-
вершенно верно. C помощью восьми тумблеров
он  набирал очердной байт (тумблер вверх -
бит  установлен,  тумблер вниз - бит сбро-
шен),  после  чего нажимал на кнопку ввода
байта в память, затем делал все тоже самое
со  следующим  байтом.  А  что делал в это
время программист ? А он писал программу в
виде  этих самых байтов (зачастую в ДВОИЧ-
НОМ  (!!!)  виде)  - программу на МАШИННОМ
ЯЗЫКЕ.  Чувствуете  какая  романтика  ?  А
сколько времени нужно на составление прог-
раммы  и  ее  ввод  в  ЭВМ ! Кстати, такие
программы  писались и отлаживались месяца-
ми, а имели размер ... всего несколько ки-
лобайт.  Потом всем все это надоело и при-
думали  другие  способы  ввода программ, и
самое  главное ЯЗЫКИ ПРОГРАММИРОВАНИЯ. Те-
перь  ясно, причем тут психбольница ? Если
не  догадались,  то  подскажу:  умственная
нагрузка  программистов была настолько вы-
сока,  что  у  них периодически "шарики за
ролики  заскакивали". Да, вот еще что, ад-
реса  размещения  программы представлялись
тоже  в двоичном виде,и программист должен
был оперировать с ними. А строчка програм-
мы  на  машинном  языке выглядела примерно
так:                                      
0001000101   111010101                    
где первое двоичное число - адрес команды,
а второе - сама команда.                  
  Если  вы хотите заниматься живописью, то
хотя-бы мельком посмотрите на классические
полотна.  А если вы программируете, то по-
зор  вам,  если вы посреди ночи не сможете
ничего  сказать  об  истории  ЭВМ, которая
насчитывает, кстати, всего пятьдесят лет -
еще  ваши дедушки и бабушки даже не знали,
что  такое  ЭВМ  и что вообще кусок железа
может  считать,  да  еще намного быстрее и
точнее человека, вдобавок без участия оно-
го.                                       
  Самым   первым  ЯЗЫКОМ  ПРОГРАММИРОВАНИЯ
стал  ... язык АССЕМБЛЕР. Это был (и есть)
язык низкого уровня - он стоит ровно посе-
редине между машинным языком (набором раз-
ных  ДВОИЧНЫХ  (!!)  кодов) и человеческим
разговорным  языком.  Каждая  команда  Ас-
семблера  однозначно соответствует команде
машинного языка, и наоборот. Разница между
ними такая же, как между цифрой "3" и сло-
вом "три": обозначают одно и тоже, но одно
часть арабской системы счисления, а другое
часть  русского  языка !!!!! Следующие две
программки являются одним и тем-же, но на-
писаны  на  разных  языках (машинные коды,
которые  по идее представляются в двоичном
виде,  мы  переведем  в  шестнадцатиричный
код, дабы не загромождать экран):         
                                          
                                          
                                          
   Ассемблер:           Машинные коды:    
                                          
LOOP  LD A,1            #3E,1             
      CALL #3D13        #CD,#13,#3D       
      JR Z,LOOP         #28,#F9           
      OR A              #B7               
      JR NZ,LOOP        #20,#F6           
      RET               #C9               
                                          
   Угадайте,  какую легче понять ? А какую
легче  модифицировать ? Подсказка: если вы
захотите вставить команду после строки "LD
A,1",  то  в машинных кодах вам надо будет
вручную  (!!) пересчитать смещения для ко-
ротких  условных  переходов  (байты  #F9 и
#F6)  т.е.  заново пересчитать адрес и это
только  в  такой  маленькой  и простенькой
программе  (она  "взята  с потолка" и, ес-
тественно,  неработоспособна) !           
  Так  что,  давайте  говорить правильно и
грамотно:  "я  написал  программу  на  Ас-
семблере" ! Иначе вы попадете в ... (все в
туже палату).                             
  Едем дальше. Разрядная сетка.           
  А  это  еще  что такое ? А это, господа,
то,  что влияет на точность математических
вычислений  на любом типе ЭВМ. Это я к то-
му,  что если вы решили сделать программу,
занимающуюся точными расчетами, то полезно
знать  о "подводных камнях" и заранее сми-
риться  с  погрешностью в расчетах (что не
избавляет вас от необходимости  рассчитать
эту  погрешность  и довести ее до сведения
пользователей).                           
  Допустим,  вы  решили сделать программу,
рассчитывающую состояние солнечной системы
в  какой-то момент времени, или игру - по-
летный  имитатор космического  корабля "по
формулам"  (имитация не такая как в ELITE,
а с учетом реальных законов небесной меха-
ники:  к  слову,  я  уже около года "поти-
хоньку" занимаюсь "ваянием" подобного ими-
татора),  или  просто сделать чисто земные
инженерные  расчеты.  Для  примера возьмем
астрономическую  программу.  На вашем пути
стоят  несколько  довольно крупных айсбер-
гов.                                      
  Ну,   во-первых.  Максимальная  точность
"SPECTRUM"  составляет  семь  знаков после
запятой, а этого  для серьезных вычислений
довольно   мало.  Астрономия  оперирует  с
очень  большими числами, прогрешность в 1%
астрономической   единицы  составляет  ка-
ких-то 1 миллион 495 тысяч километров. Ма-
ловато, неправда ли ? А самое неприятное в
любой погрешности - она все время увеличи-
вается,  причем  с  нарастающей скоростью.
Там где были 0.01 процента очень скоро бу-
дет  0.1 процента. Вот и идут разработчики
систем точной обработки информации на спе-
циальные  ухищрения (их мы сейчас касаться
не  будем),  реализовать  которые на нашем
любимом "SPECTRUM" не так уж легко (а даже
если  их все же применить, то расчет может
продолжаться  немалое  время).  Так что не
забывайте о разрядной сетке.              
  Если  вы пробовали написать программу по
потивам  "Лунолетов"  для  программируемых
микрокалькуляторов (смотрите журналы "Тех-
ника-Молодежи"  начиная с 8 номера за 1985
год),  на  Бейсике для "SPECTRUM" (а я пы-
тался  раньше сделать это и собираюсь сно-
ва, но уже с новыми знаниями), то наверное
знаете один "глюк" - без специальных ухищ-
рений  НЕЛьЗЯ правильно вычислить проекцию
вектора  на  координатную  ось (например с
помощью  выражения SIN (<угол>)*<вектор>),
так  как  тригонометрические  функции дают
заметную погрешность, котороя умножаясь на
немаленькое  значение  вектора дает совсем
уж баснословную погрешность.              
  Во-вторых.  Для расчета положения небес-
ного  тела в заданный момент времени, надо
знать  параметры его орбиты и положение на
ней в какой-то начальный момент времени. И
чем  больше  времени  прошло от начального
момента,  тем  больше погрешность (об этом
читайте  несколькими  строчками  выше). И,
чем  дальше  орбита  от  Солнца,  тем  ...
опять-же больше погрешность.              
  "Как  же,как же - скажет иной - наслыша-
ны,  а  что  вы  скажете  по поводу статьи
C.Крушинского  (г.  Москва) в "ZX-Ревю" No
9,10 за 1993 "SPECCY + АСТРОЛОГИЯ"" ? Это,
и  есть  в-третьих.  Автор сам говорит: "в
астрологии  не требуется большая точность,
погрешность  угла  в ∓10  минут нас вполне
устроит".  Правда автор забыл сказать, что
эти 10 минут даже для Марса "выливаются" в
663 тысячи километров, что составляет око-
ло  100 (!!) диаметров самого Марса. Ну, а
что  касается астрологии, то тут давно все
ясно:   "В-е-н-е-р-а  в  с-о-з-в-е-з-д-и-и
В-о-д-о-л-е-я. В-а-с ж-д-е-т в-с-т-р-е-ч-а
с б-л-и-з-к-и-м-и д-р-у-з-ь-я-м-и.  В-о-з-
м-о-ж-н-ы н-е-к-о-т-о-р-ы-е п-р-и-о-б-р-е-
т-е-н-и-я."                               
  В-четвертых."Пзу-шное"  число ПИ годится
только  для прикидочных расчетов. Если вам
не трудно,  лучше занесите это число в пе-
ременную, и пользуйтесь ей как константой.
А заносить следует такое число:           
3.141592653.                              
  Ну,  и  в-пятых.  Если вы решили сделать
серьезную программу, а не чисто демонстра-
цию  своих умений и пристрастий, то "пере-
верните"  гору  литературы  и  найдите ВСЕ
факторы, влияющие на расчет. Конечно, ник-
то с помощью вашей программы не будет рас-
читывать "взаправдашний" полет на Марс или
космолет третьего тысячелетия,но все же...
  Так  что, собираясь написать любую прог-
рамму, выполняющую точные расчеты, предус-
мотрите, пожалуйста, коррекцию хотя-бы не-
которых  погрешностей, и честно предупреж-
дайте пользователей о величине "нескоррек-
тировавшейся"  погрешности  расчетов. А то
ведь  кто-нибудь  может  с  помощью  ваших
программ  получить данные, свидетельствую-
щие  о том, что Луна в 2050 году упадет на
Землю,  и  поверить  в это ! Представляете
что тут начнется ?                        
  И  напоследок.  Ради Аллаха, не переклю-
чайте страницы 128-й памяти с помощью пор-
та #FD. Это большая "лажа", за которую вас
никто  не  похвалит. Команда "OUT (#FD),A"
не дает вам АБСОЛЮТНО никакого выигрыша по
быстродействию - время,затраченное процес-
сором  на  извлечение  из памяти аргумента
команды  (номера  порта, в данном случае -
байта  #FD)  всего на один (!) такт меньше
времени  выполнения  команды  "OUT (C),r".
Если  вам так важно быстродействие, то за-
несите число #7FFD в пару ВС, и пускай оно
там сидит.                                
  Такая  команда  занимает  пару ВС, гово-
рят  поклонники #FD-порта. Да неужто ? Что
же  это  за  программист такой, если он не
может  спроектировать  свой  алгоритм так,
что бы "и волки были сыты, и овцы целы" (а
соблюдение  этого  условия и есть основная
задача  ЛЮБОГО  программиста  при создании
ЛЮБОЙ программы) ? Ведь есть стек, альтер-
нативные  регистры,  память  наконец !!! А
все  объясняется  просто:  кто-то когда-то
"лажанулся"  (возможно просто не знал, про
этот  глюк),  а когда ему вежливо сказали:
"мужик,  твои  программы  не идут на наших
компьютерах из-за порта #FD: поменяй пожа-
луйста  такие-то  и такие-то байты (список
прилагается)  в  уже существующих програм-
мах,  и, пожалуйста, в следующих разработ-
ках применяй полный адрес порта" он просто
уперся  "как  стадо  баранов" (извините за
сравнение, но очень трудно сдержать эмоци-
и).  "Я автор, а ты козел-хаккер, твои со-
веты мне не указ, плевал я на тебя. У тебя
не идет - переделай свой компьютер или во-
обще  выкинь  его". После чего упрямо про-
должает  свое  черное дело, выдумывая кучу
аргументов  в  свою защиту. А негодяй, ко-
зел,.... -  хаккер под улюлюканье и плевки
"SPECTROFON" (прошу у него прощения, я все
еще  не справился со своими эмоциями), ра-
достно  потирая  руки,  "взламывает" новое
творение этого "бедного" автора, добавляет
нормальную  работу с портом #7FFD (тем са-
мым  "вдувая" в программу новую жизнь), не
забыв  написать  свое имя в INTRO (застав-
ке,  инфорамции  об авторах, ...), а потом
воровато  оглядываясь,  продает  ее своему
корешу-перекупщику "взломанного".Прямо сю-
жет из американского детектива получается.
А преступник,как всегда,- хаккер - наруши-
тель авторского права и общественного спо-
койствия... А если б не хаккеры, то как бы
вообще прогрессивное человечество узнало о
ошибках в той или иной программе ?        
  Конечно,  позицию Авторов тоже можно по-
нять, кому охота выслушивать от других уп-
реки в некомпетентности, предавая гласнос-
ти   сведения  о  причинах  неисправностей
программ ?                                
  Но,  к  счастью наш Самарский ZX-Клуб не
разделяет "SPECTROFON"овскую манию притес-
нения  всех хаккеров и ставит хороших хак-
керов (от скромности мы не умрем,правда ?)
в один ряд  с хорошими  авторами,  поэтому
в  нашем  городе  вы  всегда сможете найти
"нормальную"  версию нужной вам программы.
О  программах, которые вы сможете купить в
магазинах  ZX-Клуба,мы будем вам регулярно
рассказывать.                             
  Ну,  и  раз уж мы коснулись хаккеров, то
"под занавес" пару строк о бегущих строках
(каламбур,   можете  записать),  хотя  это
очень  отдаленно  касается  нашей рубрики.
Почему  "SPECTROFON"  так не любит бегущие
строки (кстати, распространители ПО счита-
ют, что хорошая бегущая строка только уве-
личивает прелесть программы) ? Нет, конеч-
но,  строки где сплошные FUCK сильно попа-
хивают матерым профессиональным алкоголиз-
мом,  ну а остальные (где есть приветы, но
все по правилам светского этикета)? А ведь
все  очень просто - в них как раз и содер-
жится информация о недоработках или закос-
тенелых привычках некоторых Авторов, кото-
рая  разносится  на  всю  страну и снижает
рейтинг этих Авторов. Вот такие дела.     
    Ну что же, на сегодня пока хватит. На-
деюсь, вы  простите  мне,  что наша первая
встреча  носит  несколько сумбурный харак-
тер.  До встречи в следующем номере. Пиши-
те, о чем бы вам хотелось почитать в "ЛИК-
БЕЗЕ", и какой вообще вы видите эту рубри-
ку. Адреса для связи с нами  вы  найдете в
рубрике "ОБО ВСЕМ".                       
                          (C) Е.Милун.    
══════════════════════════════════════════
                * * * * * 



Другие статьи номера:

Вступление - Это не шутка, вы действительно читаете Cамарский Электронный Журнал!

Свиток - обзор новых программ: Space Crusade, Rebel Star 1-3.

Свиток - обзор текстового редактора: ZX IBM Editor v1.0

Обзор - обзор новых программ: Animation 2.0, Страна Мифов, Insult Megademo.

Обзор - анализ авторских программ распростронямых фирмой "Инфорком": STS v2.6, TASM 128 v3.0, FWORD FOR GENS v1.0, VIRUS 1-2, The Regeners.

Обо всём - плоды "мозгового штурма хаккера" на некоторые игры: Sea Action, НЛО Враг Неизвестен, Звёздное Наследие. Отрывок письма к группе STEP.

Ликбез - о правилах хорошего тона в программировании.

Железо - порт #FF в русских клонах Спектрума.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Страницы истории - О завтрашнем времени.
Под знаком "Пи" - О музыкалке First Association.
b0nus pAck - buhaem?.zip
Программы, которые мы выбираем - Несколько предложений по усовершенствованию ассемблера.
Хиты - Хит-парад лучших десяти игр раскупаемых на рынке "Ждановичи".

В этот день...   26 апреля