Главная » Bascom-8051, Basic, Железо » Стиль надежного программирования с помощью Bascom

0

При программировании рекомендуется использовать простые и надежные программные конструкции, т.к. в  сложных  конструкциях,  при  экзотическом  сочетании  типов  переменных,   имеется  большая  вероятность совершить собственную ошибку или получить ошибку при компиляции. Последнее обусловлено возможностью ошибок в редко применяемых, а  следовательно и мало проверенных операторах или сочетаниях параметров. Кроме того, работу часто употребляемых операторов легче представлять и проще не допускать ошибок.

Всегда нужно помнить, что отсутствие ошибок при компиляции не является признаком безошибочной и работоспособной программы. Это лишь признак отсутствия грубых ошибок.  Безошибочная компиляция всего лишь означает:

а) все операторы записаны правильно и содержат все необходимые параметры;

б) все используемые переменные определены;

в) найдены все метки, на которые имеются ссылки;

г) согласованно применены парные операторы.

В  скомпилированной  программе  могут  оставаться  различные  ошибки  программиста.   Перечислим основные:

а) логические ошибки, неправильное представление о взаимодействии частей программы,  в  результате,

наличие временных или аппаратные конфликтов периферии и т.п.;

б) механические ошибки – пропуск операторов или наличие лишних операторов;

б) неверная запись числового значения, имени (номера) линии порта;

в) неверное определение модели процессора или других параметров настройки компилятора;

г) неправильная инициализация системы прерывания;

д) несбалансированность стека;

е)   отсутствие   инициализации   переменных   при   запуске   программы,   обеспечивающей   нормальное вхождение в стационарный режим работы;

ж) неправильное понимание или применение операторов Bascom.

Могут также иметь место ошибки компилятора:

а)   внутренние   ошибки   библиотеки   компилятора,   причем   ошибки   не   явные,   а   обусловленные неблагоприятным сочетанием каких-то параметров или операторов. Однако,  считать, что неправильная работа программы, есть следствие неверной компиляции нужно в последнюю очередь;

б) применения оператора с параметрами (переменными), не соответствующими размерности результата.

Компилятор часто не определяет это как ошибку. Наиболее фатальный характер для работы  программы имеет превышение   длины   переменных.   В   некоторых   случаях   неверная   строка   текста   программы   вообще   не компилируется без всякого сообщения;

в) неудобная (или неудачная) реализация некоторых операторов Bascom, не позволяющая выполнять одни и те же операции  в основной программе и в прерывании. Имеются в виду операторы, использующие регистры, не сохраняемые в прерываниях.

Стиль   программирования   программы   средствами   Bascom   практически   полностью    соответствует программированию  на  ассемблере,  т.е.  все  исполняется  строго  в  порядке   записи   операторов.  Внутреннее содержание   библиотек   Bascom   также   соответствует   привычной   организации   программ,   написанных   на ассемблере. В результате, получаемый  скомпилированный код по содержанию, практически, такой же, как при программировании на  ассемблере. При тщательной оптимизации программы, полученные с помощью Bascom, имеют размер и время исполнения близкое к ассемблерной. Имеющаяся при этом избыточность обусловлена тем, что компилятор Bascom почти все операции выполняет в своих внутренних регистрах и занимает дополнительные ресурсы на их загрузку и выгрузку.

Чтобы добиться более компактного кода, необходимо принимать ряд мер, многие из которых применимы и к программам, написанным на любом языке программирования. Перечислим эти меры:

а)   повторяющиеся   участки   программы   необходимо   оформлять   в   виде    подпрограмм.    Похожие подпрограммы также стараться объединять, реализуя различия между  ними созданием разных точек входа или выхода;

б)  сокращать  количество  используемых  в  программе  операторов  и  функций.  Это   уменьшит  размер

библиотеки (набора подпрограмм), подключаемой к исполняемому коду;

в) сокращать количество и длину текстовых сообщений;

г) стараться не применять операции сравнения текстовых строк. Лучше построить  программу на других принципах управления алгоритмом;

д) применять табличные методы считывания и загрузки с помощью операторов LOOKUP и  LOOKUPSTR;

е) применять табличные методы передачи управления, действующих в зависимости от значения параметра, с помощью операторов выбора SELECT CASE x или ON x GOTO (GOSUB), и меньше использовать операторы проверки условий (IF … THEN …);

ж) применять ассемблерные вставки там, где они обеспечивают очевидный выигрыш;

и) использовать в сложных программных конструкциях (циклах и проверки условий) короткие переменные

(одно- и двухбайтные);

к)  применять  возможно  более  простые  программные  конструкции.  Лучше  две  простых  вместо  одной сложной.

Количество   используемых   в   программе   переменных   также   входит   в   понятие   стиля   надежного программирования.  Всегда  нужно  стремиться  к  их  сокращению  потому,  что  когда  переменных  становится

слишком  много,  то,  все  равно,  приходится  идти  на  усложнение  программы  для  экономии   пространства оперативной  памяти.  Очень  хорошие  результаты  дает  прием  использования  для   хранения  промежуточных

результатов   специальных   переменных   (локальных).   Во   всех   примерах,   показанных   здесь,   этот   прием

используется. Bascom предлагает средства определения и стирания (оператором ERASE) временных (локальных) переменных. Однако этой возможностью лучше не пользоваться, т.к.  эффективность ее невысока. Компилятор устанавливает указатель стека сразу на максимальное  значение, освобождая место и тем переменным, которые будут   определены   позже.   После   уничтожения   временных   переменных   указатель   стека   не   возвращается компилятором ниже  (да и не имеет права этого делать). Таким образом, делать переопределение переменных в программе больше одного-двух раз практически не удастся. Единственная польза от такого  переопределения переменных состоит только в возможности изменения распределения  зарезервированного пространства между переменными разного типа.

Минимальное время исполнения программы и объем полученного кода совершенно  мало зависит от краткости записи операций. В большей степени это функция размерности используемых переменных и сложности совершаемых действий. Bascom позволяет достаточно широко варьировать операторами для достижения одного и того же результата. Этим обязательно нужно пользоваться, оптимизируя программу по времени исполнения или размеру исполняемого кода.

Структура  программы  должна  базироваться  на  функционально  законченных  блоках   или  модулях, неважно как оформленных (процедурах, программах и подпрограммах) и  содержащих не более 50 операторов. Каждый блок или функциональный модуль должен выполнять одно сложное действие, и быть, легко обозримым,

быстро понимаемым и хорошо откомментированным. Функциональный блок должен использовать и передавать

для дальнейшей обработки минимальное количество данных, в как можно более компактном и стандартном виде. Собственно говоря, место в программе, где данные имеют осмысленный вид или наиболее удобны для передачи, и является  естественным  местом  разделения  на  функциональные  модули.  Еще  один  признак  функционального блока – один вход и один выход. Для управления работой программы (изменения естественного хода выполнения операторов) достаточно и следует использовать только семь конструкций:

а) переход к метке (оператор GOTO);

б) вызов процедуры или подпрограммы (операторы CALL, GOSUB);

в) неполную альтернативу (конструкция IF … THEN … ) с пропуском участка программа и полную – с выбором одного из двух действий (IF … THEN … ELSE / IFELSE … );

г) множественное ветвление (с помощью конструкций SELECT CASE … или ON … GOTO или ON … GOSUB);

д) цикл «ПОКА» (конструкция WHILE … WEND);

е) цикл «ДО» (конструкция DO … LOOP UNTIL …);

ж) цикл с изменяемым параметром (FOR … TO/DOWNTO … NEXT).

Функционально   структурированной   программа   выполняется   не   для   улучшения   ее   работы   или оптимизации  производительности  –  это,  в  большей  степени,  метод  организации   и  оптимизации  процесса программирования.   Ведь   очевидно,   что   если   убрать   комментарии   и   лишние   команды   CALL   и   RET, структурированная  программа  будет  мало  отличаться   от  неструктурированной.  Модули  структурированной программы  впоследствии  могут  использоваться  в  других  программы  неоднократно,  в  готовом  виде  или  с небольшими  доработками. Метод структурного  программирования сокращает сроки получения программного продукта за счет накопление программного задела, обеспечивает создание больших и очень больших программ с разделением  задач  между  несколькими  исполнителями.  Таким  образом,   применение  метода  структурного программирования  положительно  сказывается  на  качестве  и   надежности  создаваемых  программ,  т.к.  дает возможность быстрее выявлять ошибки и использовать лучшие готовые решения.

Структурирование   программы   это   и   метод   программирования   и   способ   форматирования   текста программы.   При   создании   функционального   программного   элемента   добиваются   его   независимости   и законченности, а при оформлении текста программы используют приемы разделения функциональных элементов, например, с помощью отступов строк от левого края листа. Применяются и элементы вертикального разделения. Несмотря  на  то,  что  Бейсик  допускает  записывать  несколько  операторов  в  одной  строке,  операторы  разных функциональных элементов нужно располагать в отдельных строках.

Источник: М.Л.Кулиш, СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ BASCOM-8051, Краснодар 2001

По теме:

  • Комментарии