NexxDigital - компьютеры и операционные системы

Var n1, n2: Longint;

Function Quantity(x: Longint): Byte;

Var k: Byte;

While x <> 0 Do

Begin

End ;

Quantity:= k;

Begin

Writeln("Введите два числа");

k1:=Quantity(n1);

{количество цифр первого числа}

k2:= Quantity(n2);

{количество цифр второго числа}

Writeln("Одинаковое количество цифр")

If k1 > k2 Then

Writeln("В первом числе цифр больше")

Writeln("Во втором числе цифр больше");

Лекция № 17. Нетрадиционное использование пользовательских подпрограмм. Рекурсия

В ряде алгоритмов решения задач требуется вызов подпрограммы из раздела операторов той же самой подпрограммы.

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

if keypressed then halt; - для прерывания зависания, если таковое произойдет. Keypressed – это функция, возвращающая результат true, если на клавиатуре была нажата клавиша, и false – в противном случае.

Пример 1. Рассмотрим программу вычисления элементов ряда Фибоначчи с использованием рекурсивной процедуры.

procedure fibon(n,fn1,fn:integer); {рекурсивная процедура}

if n > 0 then

writeln(fn1+fn);

fibon(n-1,fn,fn1+fn);

var n,a,b: integer;

write("введите число элементов ряда Фибоначчи: ");

write("...следующими за двумя данными числами: ");

Fibon(n,a,b);

Пример 2. Программа, которая выводит на экран цифры целого положительного числа в обратном порядке.

program rekurs2;

procedure revers(n:integer); {рекурсивная процедура}

If keypressed then halt;

Write(n mod 10);

if (n div 10) <> 0 then

Revers (n div 10);

writeln("vvedi chislo <= : ", maxint);

Revers(n);

Лекция №18. Ввод – вывод данных. Файлы

Файл – это набор данных, хранящихся во внешней памяти компьютера под заданным именем.

Любой файл имеет три характерные особенности:

1. У файла есть имя, что дает возможность программе работать одновременно с несколькими файлами.

2. Файл содержит компоненты одного типа. Типом компонентов файла может любой тип.

3. Длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Для того, чтобы программа нашла нужный файл, необходимо знать путь или маршрут к файлу.

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

Например:

c:\catalog1\catalog2\file1.txt.

Каждое имя каталога соответствует входу в подкаталог с таким именем. Знак ".." соответствует входу в надкаталог. Максимально допустимая длина пути – 79 символов.

В программе на ТР имя файла задается в виде текстовой константы, заключенной в апострофы, которая может быть значением строковой переменной:

"\turbo\pas\table.txt".

Устройства. Использование файлов в ТР было вызвано необходимостью обмена данными с окружением компьютера, его аппаратными средствами: дисплеем, клавиатурой, принтером, каналами ввода-вывода. Все они рассматриваются в ТР как файлы, с которыми можно работать так же, как с обычными файлами. Файлы на внешних устройствах часто называют физическими или внешними файлами . Обращение к устройствам выполняется с помощью специальных имен, которые запрещено использовать для обычных файлов – так называемых имен логических устройств компьютера.

­ CON – консоль . При помощи консоли выводимая информация пересылается на экран дисплея, а вводимая информация воспринимается с клавиатуры;

­ PRN – это наименование принтера . Если к компьютеру подключено несколько принтеров, то обращение к ним осуществляется с помощью логических имен: LPT1, LPT2, LPT3.

­ COM1, COM2, COM3 – это устройства подключения к последовательным портам . Используются для связи с другими компьютерами и для подключения мыши.

­ NUL – нулевое или пустое устройство. Часто используется программистами для отладки программы. Позволяет не создавать отдельный файл. При использовании его для вывода информации – информация никуда не выводится, но сообщается, что вывод произошел успешно.

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

Листинг программы «demol.c» показан на Рис. 6.7. Имя программе придумает программист. Расширение «.с» обязательное. Текст набирается в редакторе «Programmer’s Notepad 2» (сокращённо PN2), который входит в пакет WinAVR вместо графической оболочки. Через него также производится создание проекта, исправление ошибок, компиляция программы и даже программирование MK.

Рис. 6.7. Листинг программы «demol.c».

Рис. 6.8. Внешний вид программы PN2.

Редактор PN2 является самостоятельным проектом со своим интернет-сайтом . Внешний вид головного меню PN2 показан на Рис. 6.8.

Порядок действий.

1.3апустить на выполнение файл «WlnAVR-20100110-install.exe» (29 Мбайт), находящийся на прилагаемом компакт-диске. Этот файл при необходимости можно свободно скачать из Интернета . Инсталлировать WlnAVR по умолчанию в папку C:\WinAVR-20100110\.

2. Открыть редактор PN2: «Пуск - Программы - WinAVR-20100110 - Programmers Notepad ». Включить нумерацию строк: «Tools - Options - General - Default - <поставить «галочку» возле «Show Line Numbers»> - ОК».

3. Создать в редакторе PN2 новый Си-файл: «File - New - С/С++». Ввести с клавиатуры текст программы согласно Рис. 6.7 и сохранить его на жёстком диске: «File - Save As… - <ввести путь и имя файла, например, для однозначности C:\1001\demol.c> - ОК».

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

Пояснения к листингу.

Строка 1 начинается с комментариев, которые ограничиваются слева двумя наклонными линиями «прямой слеш». Весь текст после знаков «//» может быть о чём угодно, на любом языке, с любыми вольностями и сокращениями. Это произвольная информация, которую программист пишет для самого себя, любимого, чтобы через месяц-другой вспомнить, о чём, собственно, шла речь. Обычно указывается краткое название программы и авторство.

Строка 2 тоже содержит комментарии, но уже технического плана. Здесь расписана электрическая схема подключения индикатора HL1 и кнопки SB1 к конкретным линиям портов MK. Названия сигналов соответствуют раскладке из дашита на MHKpocxeMyATmega48A (Рис. 6.9) .

Рис. 6.9. Раскладка сигналов MKATmega48A.

Практика текстового описания несложных схем в «шапке» программы широко распространена в сообществе программистов, которые ленятся рисовать и прикладывать графические схемы, считая, что «и так всё понятно».

Строка 3 указывает параметры «мэйкфайла» («makefile»). Для справки, нормальная работа компилятора AVR-GCC возможна при наличии двух обязательных файлов. Первый из них - файл листинга с расширением «.с», второй - файл системных указаний «makefile» без расширения. «Makefile» создаётся утилитой «MFile» (Рис. 6.10, автор JoergWunsch, Германия), входящей в WinAVR.

Рис. 6.10. Внешний вид программы MFile.

Порядок действий.

1. Запустить на выполнение утилиту «MFile»: «Пуск - Программы - WinAVR- 2010010 – MFile ».

2. Заполнить поля шаблона следующим образом (Рис. 6.11):

В пункте «Makefile - Main file name… - Main file» ввести имя разрабатываемого проекта «demol» и нажать OK;

В пункте «Makefile - MCU type - ATmega» выбрать MK «atmega48a»;

В пункте «Makefile - Optimization level» задать уровень оптимизации «2». Другие возможности: «0» - без оптимизации, «s» - минимальная длина кодов, цифры «1 »…«3» - это три разных метода оптимизации, причём цифра «3» не означает лучший вариант, всё зависит от конкретной Си-программы.

Остальные пункты шаблона «makefile» корректировать не обязательно, пусть остаются принятыми по умолчанию.

Рис. 6.11. Заполнение полей в программе MFile.

Для каждого нового проекта и нового типа МК надо составлять свой «makefile», при этом будет изменяться имя проекта и тип MK.

Строка 4 содержит комментарии, определяющие шестнадцатеричные числа младшего (Low), старшего (High) и расширенного (Ext) байтов конфигурации. Эти значения понадобятся в дальнейшем при программировании «фьюзов» MK.

С« ктг5информационно пустая. Она визуально отделяет текст комментариев от остальной части программы. Вместо одной можно вставить две пустые строки, что не принципиально. Главный смысл заключается в улучшении наглядности. На длину кодов прошивки MK это не влияет.

Внешнее оформление листинга придумывает сам программист, исходя из собственных представлений о красоте картинки и удобстве подачи информации. Часто по стилю оформления «шапки», строк листинга и комментариев можно опознать автора программы или составить его психологический портрет. Интересные заметки по этому поводу приведены в монографии Алена Голуба .

Строка 6 обслуживается препроцессором компилятора. Это не оператор языка Си и не комментарий. Название сложное, а смысл простой. Препроцессор (предварительный ПРОЦЕССОР) ищет в программе строки, начинающиеся с символа «#». Далее, в зависимости от ключевого слова, он выполняет определённое действие, например, «define» - присваивает значения константам, «if defined» - проверяет условие, «inC1ude» - подключает библиотеку функций и т.д.

Для первого знакомства достаточно знать, что библиотека функций представляет собой набор файлов, в которые помещаются тексты стандартных или часто повторяющихся процедур. В данном случае директива «#inC1ude» (в переводе с англ. «включать») активизирует системную библиотеку «avr/io.h», которая отвечает за работу портов ввода/вывода. Эта библиотека в разных компиляторах имеет разное название, но суть неизменна, без неё нельзя управлять ни одной линией портов MK. Следовательно, подключение библиотеки ввода/вывода обязательно для всех микроконтроллерных Си-программ.

Строка 7тоже обрабатывается препроцессором компилятора, но имеет ключевое слово «define» (в переводе с англ. «определять»). Следовательно, она объявляет константу INI и присваивает ей постоянное значение 255. В комментариях указывается перевод числа 255 в шестнадцатиричную 0xFF и двоичную 0bl 1111111 форму счисления. Разница между ними заключается в буквах «х» и «Ь» после обязательной цифры «0». Соответствие чисел в разных системах приведено в Табл. 6.3.

Таблица 6.3. Перевод чисел из шестнадцатиричной формы в двоичную и обратно

Если где-то в «теле» программы встречается константа INI, то компилятор без размышления подставляет вместо неё числовое значение, указанное в строке 7, т.е. 255. Это очень удобно для программистов при коррекции больших по объёму листингов, когда константы разбросаны по всему тексту. Кроме того, само название константы может нести смысловую нагрузку и служить словесной подсказкой. В частности, INI - это сокращение от английского слова «initialization» (инициализация), что означает некоторое начальное значение.

Важность размещения константы именно в «шапке» программы заключается в простоте её поиска и быстроте внесения изменений. Например, один раз откорректировав число «255», можно быть уверенным в том, что везде по тексту оно будет автоматически (и безошибочно!) проставлено через константу lNI.

Имя для константы придумывает программист, исходя из здравого смысла и человеческих предпочтений. По давней традиции названия констант пишутся заглавными символами. Первой в имени обязательно должна идти буква, например, I2CBUS, T34. Употребление кириллицы не допускается.

Объявление константы INI можно было записать ещё двумя равнозначными способами: «#define INI OxFF» или «#define INI Obl 1111111».

Строка 8 содержит оператор описания переменной «а». Переменную можно образно представить в виде шкатулки (ящика, коробки, пенала), где хранится некоторое количество предметов (бусинок, зёрен, спичек). Чтобы «шкатулки» отличались друг от друга, их маркируют разными надписями на корпусе, в данном случае буквой «а». Если в описании переменной не указано начальное число, то считается, что «шкатулка» пустая и она инициализируется нулём (а = 0). По ходу работы программы в «шкатулку» можно добавлять и из неё можно удалять предметы, т.е. увеличивать и уменьшать значение переменной.

Объём «шкатулки» зависит от её исходного объявления. В Табл. 6.4 указаны пределы, принятые в компиляторе AVR-GCC. Как видно, объявление «unsigned char» позволяет положить в «шкатулку» 255 предметов. Вместе с нулевым значением (пустая «шкатулка») всего будет 256 состояний или 256 байтов. Переменная с объявлением «unsigned long» уже больше похожа не на шкатулку, а на целый железнодорожный состав, который рассчитан на 4.2 млрд предметов.

Таблица 6.4. Размерности переменных, принятыевАУК-вСС

Поскольку MK не имеет развитых средств для работы с отрицательными числами, то на первых порах, чтобы не запутаться, лучше в программах использовать только положительные числа, т.е. содержащие объявление «unsigned».

«Отцы-командиры» языка С исдавних времён установили негласный порядок, согласно которому название переменной должно состоять не более, чем из 8 символов. В компиляторе AVR-GCC это правило игнорируется и переменная может содержать столько символов, сколько хочется, но без фанатизма. Единственное, что первой в названии обязательно должна стоять буква латинского алфавита, за ней могут следовать буквы, цифры, символы. Кириллица не допускается.

Переменная, в отличие от константы, содержит некоторое переменное (а не постоянное) число. Чтобы переменные отличались от констант, их записывают малыми буквами. Обычно стараются, чтобы название соответствовало смыслу, например, «count» для счётчика, «data» для данных, «delay» для задержки. Хотя иногда проще, привычнее и компактнее смотрятся однобуквенные переменные, хорошо знакомые со школьной алгебры, - а, b, с, d, i,j, k, x, у, z.

Какую размерность указывать для конкретной переменной, определяет программист. Поскольку переменная «а» в данном листинге является хранилищем для сбора информации с цифрового 8-битного порта «С», значит в неё должно вмещаться «два в восьмой степени» байтов, т.е. от 0 до 255.

Интересно, что компилятор не выдаёт ошибку, если перестраховаться и объявить переменную с запасом как «unsigned long а;». Правда, это приводит к напрасному увеличению объёма кода с 114 до 126 байтов и, соответственно, к небольшому уменьшению скорости выполнения программы.

Другая крайность - недооценка размерности, когда, например, вместо объявления «unsigned int» применяется «unsigned char». Если в такую переменную занести число, большее чем 255, то сохранится лишь остаток от деления на 256, а старшая часть безвозвратно потеряется. Образно говоря, предметы повысыпаются из «шкатулки» наружу. Компилятор не реагирует на подобные ошибки, считая, что программист находится в адекватном состоянии и понимает, что он делает. Правильное и безошибочное определение размерности переменных обычно приходит с опытом.

Строка 9 информационно пустая аналогично строке 5. Вставлять ли её в листинг, зависит от воли программиста.

Строка 10 заполняется комментариями, но для разнообразия они представлены в другом формате. А именно, текст отчёркивается с левой стороны символами «/*», а с правой стороны - символами «*/» Такой стиль берёт начало с самых древних версий языка Си. Позже в комментариях стали применять символы «//», что характерно для языка С++. В WinAVR оба варианта имеют равное право на существование. «Новое» написание проще и нагляднее, а «старое» кое-где является единственно возможным, если требуется прокомментировать начало оператора.

Строка 11 содержит типовой вызов функции «main» согласно правилам Американского института стандартов ANSI (American National Standards Institute). Допускаются, но не рекомендуются, сокращённые выражения: «int main ()», «main ()», «main (void)». Иногда даже пишут «void main (void)», подчёркивая полное отсутствие принимаемых и передаваемых параметров. Для простых MK, не поддерживающих операционные системы реального времени, отрицательных последствий не будет. Однако, если думать о будущем, то лучше сразу заучить полную форму написания, что облегчит в дальнейшем перенос Си-программ на более современные микроконтроллерные платформы.

Строка 12 целиком отводится под первую открывающую фигурную скобку. Такой чести она удостоена не случайно. Компилятор языка Си при выполнении строки 12 производит начальную инициализацию регистров MK, установку стека, распределение адресного пространства. Механику этого ювелирного процесса изучать не надо (в отличие от программ на Ассемблере!).

Для программиста, главное, правильно усвоить две вещи, которые автоматически производит компилятор, входящий в WinAVR:

При старте программы запрещаются все прерывания;

Линии всех портов MK настраиваются как входы без «pull-up» резисторов.

Строка 13. Наконец-таки, появилась первая исполняемая команда программы в виде оператора присваивания. Расшифровка символов:

«DDRB» - условное имя восьмиразрядного регистра DDR порта «В»;

«=» - знак записи данных в регистр DDRB;

«ОЬ» - указание на то, что следующие 8 цифр будут в двоичном коде;

«11111111» - биты записываемого в регистр DDRB двоичного числа, расположенные в порядке 7, 6, 5, 4, 3, 2, 1, 0 (слева старший бит, справа младший бит).

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

Оператор в строке 13 имеет отступ в два пробела слева. Это условность форматирования текста, которой придерживаются многие программисты. Компилятор «промолчит», если начать текст в первом или в седьмом столбце слева, кому как нравится. Существует лишь одна рекомендация: «Листинг Си-программы должен быть удобным для просмотра». Следуя ему, в дальнейшем все тексты будут форматироваться так, чтобы фигурные скобки располагались в нечётных столбцах по вертикали (1, 3, 5 и т.д.), причём в каждом столбце будут находиться только одна открывающая вверху и одна закрывающая внизу фигурные скобки.

Указанный порядок не догма, а способ сокращения листинга по ширине и по длине без потери информативности. Программист «у себя дома», в своих листингах, вправе вводить любое число пробелов, пустых строк и т.д.

Строка /4действует совместно со строкой 13, поскольку конкретное состояние линии порта в AVR-контроллерах определяется связкой двух регистров DDRx и PORTx, где «х» - порядковая буква порта, например, В, С или D. Если учесть, что в каждом регистре имеется 8 бит с номерами от 0 до 7 (условно «z»), то общий расклад по линиям портов выглядит следующим образом:

DDRx.z = 1, PORTx.z = 1 - выход с ВЫСОКИМ уровнем;

DDRx.z = 1, PORTx.z = 0 - выход с НИЗКИМ уровнем;

DDRx.z = 0, PORTx.z = 1 - вход с « pull-up» резистором;

DDRx.z = 0, PORTx.z = 0 - вход без « pull-up» резистора.

Обобщение строк 13 и 14: DDRB.0…DDRB.7 = 1, PORTB.O = 0, PORTB.l = 1, PORTB.2…PORTB.7 = 0, следовательно, линии 0, 2…7 порта «В» будут настроены как выходы с НИЗКИМИ уровнями, а линия 1 - как выход с ВЫСОКИМ уровнем. Поскольку к линии PB1 (вывод 15 микросхемы DD1 на Рис. 6.3) подключается индикатор HL1, то он будет погашен. Получается, что начальная часть технического задания выполнена успешно.

Строки 15, 16аналогичны строкам 13, 14, но для порта «С». Для разнообразия применяется подстановка константы lNI. После выполнения строк 15 и 16 все линии порта «С», даже те, которые не участвуют непосредственно в работе, будут настроены как входы с « pull-up» резисторами. Это стандартный приём начальной инициализации портов, чтобы активизировать внутренние подтягивающие резисторы, которые не дают «висеть в воздухе» КМОП-входам линий МК и устраняют пути проникновения всевозможных помех и наводок.

Строка 17 аналогична строкам 13, 14 и 15, 16, но для порта «D». Он в электрической схеме вообще не задействован, однако следует взять себе за правило - инициализировать в начале программы все без исключения порты. Их свободные линии должны быть настроены как входы с « pull-up» резисторами или как выходы с ВЫСОКИМ/НИЗКИМ уровнем. В будущем такой автоматизм позволит избежать коллизий и недоразумений.

Особенностью является присваивание регистру PORTD значения, ранее присвоенного в строке 13 регистру DDRB, т.е. двоичного числа Obl 1111111. Сделано это в учебных целях, ведь можно было бы поступить проще: «PORTD = OxFF;».

Ещё одна деталь заключается в отсутствии записи регистра DDRD. Это не опечатка, а сознательное сокращение листинга на одну строку, поскольку при включении питания согласно даташиту во все регистры DDRx, PORTx автоматически заносятся «нули», т.е. дополнительно обнулять регистр DDRD не обязательно.

Строка 18содержит оператор цикла «while». Для первого знакомства достаточно запомнить, что выражение «while (1)» означает последовательное выполнение операторов в строках 19…21 в бесконечном цикле.

Строка 19 содержит открывающую скобку и оператор присваивания. Такое совмещение допускается правилами языка Си, что позволяет сделать листинг более компактным по высоте.

После выполнения строки 19 в переменной «а» будет храниться байт состояния восьми линий порта «С», который был прочитан из регистра PINC. Если кнопка SB1 не нажата, то «а = OxFF», а если нажата, то «а = OxFE».

Строка 20сдвигает на один разряд влево содержимое переменной «а». Возможны два варианта: если «а» раньше было OxFF, то станет OxFE, а если было OxFE, то станет OxFD. Зачем это делается, подскажет следующая строка программы.

Строка 21 содержит оператор присваивания, но, по сравнению со строкой 19, переменная «а» и регистр порта поменялись местами. В языке Си такая рокировка приводит к замене операции чтения из порта операцией записи в порт. Итого, в порт «В» будет выведен код 0xFE (если кнопка SB1 не нажата) или код 0xFD (если кнопка SB1 нажата). В первом случае индикатор HL1 будет погашен, во втором - будет светиться, чего и требовалось добиться согласно техническому заданию.

Строки 22, 23 содержат закрывающие фигурные скобки. Если мысленно провести от них две вертикальные линии «снизу-вверх», то они укажут прямо на открывающие скобки в строках 19 и 12. Скобка в строке 22 указывает на повтор цикла в строках 19…21. Скобка в строке 23 начинается в первой слева позиции, следовательно, достигнут конец функции «main», а значит и основной программы.

Строка 24 содержит комментарии о номере версии WinAVR и о длине кодов прошивки, что весьма полезно при компиляции программы другими пользователями. Известно, что версии WinAVR совместимы между собой не на 100%, чему имеются наглядные примеры. Следовательно, длина скомпилированного кода одного и того же листинга может отличаться от релиза к релизу. Практический вывод - компилировать программу надо вначале тем пакетом WinAVR, который указан в строке 24, а уже потом на более старой или более новой версии, сверяясь с полученной длиной кодов как с проверочной контрольной суммой.

Внимательный читатель вправе заметить, что на этапе составления листинга Си-программы невозможно было заранее рассчитать, какой объём занимают коды в памяти MK. Честно говоря, надпись «114 байта (2.8%)» была дописана позже, после компиляции программы. Налицо наглядный пример той самой обратной связи, которая в структурной схеме на Рис. 6.1 была обозначена пунктиром между блоками «К» и «Л».

Строка 25 полностью пустая, но в отличие от строк 5 и 9, она означает физическое окончание листинга. Без этой завершающей строки компилятор выдаёт мягкое, но всё-таки предупреждение: «Warning: no newline at end of file» («Внимание: отсутствует новая линия в конце файла»).

Назначение

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

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

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

Программисты часто переносят исходный код из одного проекта в другой, что носит название повторного использования кода (Software reusability ).

Исходный код - важнейший компонент для процесса портирования программного обеспечения на другие платформы. Без исходного кода какой-либо части ПО, портирование либо слишком сложно, либо вообще невозможно.

Организация

Исходный код некоторой части ПО (модуля, компонента) может состоять из одного или нескольких файлов . Код программы не обязательно пишется только на одном языке программирования. Например, часто программы, написанные на языке Си , с целью оптимизации, содержат вставки кода на языке ассемблера . Также возможны ситуации, когда некоторые компоненты или части программы пишутся на различных языках, с последующей сборкой в единый исполняемый модуль при помощи технологии известной как компоновка библиотек (library linking ).

Сложное программное обеспечение при сборке требует использования десятков, или даже сотен файлов с исходным кодом. В таких случаях для упрощения сборки обычно используются файлы проектов, содержащие описание зависимостей между файлами с исходным кодом, и описывающие процесс сборки. Эти файлы так же могут содержать и другие параметры компилятора и среды проектирования. Для разных сред проектирования могут применяться разные файлы проекта, причем в некоторых средах эти файлы могут быть в текстовом формате, пригодном для непосредственного редактирования программистом с помощью универсальных текстовых редакторов, в других средах поддерживаются специальные форматы, а создание и изменения файлов производится с помощью специальных инструментальных программ. Файлы проектов обычно включают в понятие «исходный код». В подавляющем большинстве современных языковых сред обязательно используются файлы проектов вне зависимости от сложности прочего исходного кода, входящего в данный проект. Часто под исходным кодом подразумевают и файлы ресурсов, содержащие различные данные, например, графические изображения, нужные для сборки программы.

Для облегчения работы с исходным кодом, для совместной работы над кодом командой программистов, используются системы управления версиями .

Качество

В отличие от человека, для компьютера нет «хорошо написанного» или «плохо написанного» кода. Но то, как написан код, может сильно влиять на процесс сопровождения ПО . О качестве исходного кода можно судить по следующим параметрам:

  • читаемость кода (в том числе наличие или отсутствие комментариев к коду;
  • лёгкость в поддержке, тестировании, отладке и устранении ошибок, модификации и портировании;
  • низкая сложность;
  • низкое использование ресурсов - памяти, процессора, дискового пространства;
  • отсутствие замечаний, выводимых компилятором;
  • отсутствие «мусора» - неиспользуемых переменных, недостижимых блоков кода, ненужных устаревших комментариев и т. д.

При компиляции программы можно задать параметр "l" (listing):

Тогда кроме файла с объектным кодом sum. objбудет создан файл с листингомsum. lst:

  • 1 ;sum. asm – программа, вычисляющая S=A+B
  • 2 0000 data segment
  • 3 0000 0001 a dw 01h
  • 4 0002 0002 b dw 02h
  • 5 0004 ???? s dw ?
  • 6 0006 data ends
  • 7 0000 code segment
  • 8 assume ds:data
  • 9 0000 BA 0000s begin: mov dx, data
  • 10 0003 8E DA mov ds, dx
  • 11 0005 A1 0000r mov ax, a
  • 12 0008 03 06 0002r add ax, b
  • 13 000C A3 0004r mov s, ax
  • 14 000F B8 4C00 mov ax, 4C00h
  • 15 0012 CD 21 int 21h
  • 16 0014 codeends
  • 17 endbegin

Листинг - это таблица, содержащая четыре столбца:

    Номер строки.

    Адрес внутри сегмента, т. е. от его начала (смещение).

    Содержимое памяти по данным адресам. В сегменте данных - это значения переменных, в сегменте кода - это машинные коды команд.

    Ассемблерный код.

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

Из листинга видно, что командам процессора соответствуют только строки 9-15. Остальные строки соответствуют т. н. директивам ассемблера.

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

    команды - информация для процессора;

    директивы - информация для самого ассемблера, как скомпилировать программу: как перевести команды на машинный язык и как разместить данные.

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

В рассматриваемой программе имеются следующие директивы:

    segment - директива объявления начала сегмента;

    dw (define word) - директива определения данных (выделения и инициализации области памяти) размером 16 бит;

    ends (end segment) - директива объявления конца сегмента;

    assume - директива назначения сегменту сегментного регистра;

    end - директива указания конца программы, ее аргументом должна быть метка первой команды программы - точки входа в программу.

Есть также следующие директивы определения данных:

    db (define byte) - директива определения области памяти в 8 бит;

    dd (define double word) - директива определения области памяти в 32 бита.

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

    386 - используются несистемные команды процессора i80386;

    386p- используются все команды процессораi80386, в том числе системные.

Строки 3-5 содержат директивы определения переменных A, BиS. В совокупности строки 3-5 и 9-15 содержат информацию для процессора - программу, включающую команды и данные. Они непосредственно отображаются на память компьютера.

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

Что такое листинг

Понятие листинг встречается в разных сферах нашей жизни:

  • Фондовые и криптовалютные биржи – они и будут темой данной статьи. Здесь речь идет о добавлении ценных бумаг или криптомонет в списки торговых платформ.
  • В торговле – это подразумевает добавление продукции того или иного производителя в ассортимент магазина.
  • В программировании – это исходный код (текст) программы, который при помощи компилятора переводится в исполняемый код.
  • В недвижимости – здесь подписываются договора на листинг между собственником недвижимости и торговым агентом, который занимается ее продажей за комиссионные.

Две последние отрасли мы рассматривать не будем. Нас интересует листинг на , а также криптовалютных.

Листинг и делистинг ценных бумаг

Листинг появился в нашем лексиконе от слова list, что с английского переводится как «список». Листинг ценных бумаг на фондовой бирже – это и есть процедура добавления акций, облигаций компаний в список инструментов, которые котируются на платформе. После этого они стают доступны для покупки и продажи на ней.

Пройдя процедуру листинга, ценные бумаги попадают в торговый список биржи

Нередко листингом участники рынка называют сам список. При этом у каждой площадки данный список свой.

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

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

Биржевой листинг важно не путать с IPO. В первом случае компания стремится попасть в котировальной список определенной торговой площадки. А IPO подразумевает, что компания превращается в публичную и ее ценные бумаги стают доступны инвесторам не только через , но и другие каналы, например, через свои отделения.

Этапы листинга

Процедура листинга предусматривает несколько этапов, которые необходимо пройти компании-эмитенту, прежде чем ее бумаги станут доступны инвесторам.

  1. Начинается все с подачи заявления. Сделать это может как сам эмитент, так и лицо, представляющее интересы компании.
  2. Далее наступает стадия экспертиз. Представители биржи анализируют как ценные бумаги, так и все доступные данные о компании. Исследуется рентабельность предприятия, ликвидность его активов. Компания обязана предоставить всю финансовую отчетность, собранную за последние несколько лет.
  3. Специальная комиссия рассматривает результаты экспертиз и решает добавлять ценные бумаги в свой листинг или отклонить заявку.
  4. Если решение положительное, обе стороны – компания и биржа, заключают соглашение.

Процедура, в среднем, занимает около 1-2 месяцев. Чтобы оставаться в списке, эмитенту потребуется, как правило, один раз в квартал, подавать нужные данные бирже.

Правила листинга, предъявляемые торговыми площадками к компаниям, разнятся. Одни могут допускать к листингу только предприятия, капитализация которых составляет не менее 50 миллионов долларов, а время присутствия на рынке – от 3 лет. Другие могут как повышать, так и понижать планку этих и других требований.

Если выполнены не все условия, однако бумаги интересны бирже, они попадают предварительный список бумаг – его еще называют предлистинг . Этими акциями инвесторы также могут торговать, однако вне стен биржи и торговая площадка ответственности за них не несет.

Уровни листинга

Преимущественно на биржах представлено несколько уровней листинга. В первый премиальный попадают наиболее ликвидные бумаги с высоким уровнем надежности.

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

К примеру, на действует Основная и Альтернативная площадки. Первая делится на два уровня: «Стандарт» и «Премиум». Альтернативный рынок предназначен для мелких и средних развивающихся предприятий, которые допускаются сюда по упрощенной процедуре.

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

Виды листинга

Различают первичный и вторичный листинг.

Первичный листинг подразумевает, что акции доступны инвесторам на биржевой площадке внутри страны, где зарегистрирована компания.

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

Существует еще двойной листинг, при котором компания последовательно стремится попасть в котировальные списки нескольких торговых площадок родной страны.

А также кросс-листинг – в данном случае предприятие отправляет заявки на добавление в списки нескольких биржевых платформ в разных странах. При этом если одна из них одобряет добавление ценных бумаг, на других компания получает возможность завершить процедуру листинга по упрощенной схеме. Это сокращает не только материальные расходы, но и время рассмотрения заявки.

В чем преимущества эмитента

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

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

Однако не стоит забывать, что отныне к деятельности компании будет предъявляться повышенное внимание, а любые действия будут моментально сказываться на стоимости акций. Кроме того, процедура листинга не бесплатная. Все проводимые экспертизы стоят денег.

Что это дает инвесторам

Главное – уверенность. Инвесторы, вкладывая деньги в акции компании, знают, что ее благонадежность проверена профессионалами. Присутствие в биржевом листинге избавляет их от самостоятельных проверок благонадежности предприятия.

Что такое делистинг

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

Также привести к делистингу может и стоимость акций, которая не растет со временем, что свидетельствует о низком спросе. Случается, что инициатором делистинга выступает сама компания, например, при слиянии предприятий.

Листинг криптовалют

О листинге часто речь идет и в криптовалютной среде. Здесь в торговом списке биржевых площадок стремятся оказаться цифровые монеты или токены.

Криптовалютные проекты стремятся попасть в листинги популярных бирж

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

Цена вопроса

Один из главных вопросов – стоимость. Малоизвестные биржи могут добавить криптовалюты в листинг и вовсе бесплатно. Попадание в списки известных платформ может обойтись в тысячи, а то и десятки тысяч долларов – деньги берут за анализ монеты перед листингом. Хотя бывают и исключения.

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

В начале года журналисты Business Insider опубликовали статью, согласно которой минимальный порог для вхождения в листинг криптобирж для ICO-проектов составляет 50 тысяч долларов, а в отдельных случаях может достигать и 1 миллиона долларов.

Также были случаи, когда руководство бирж попадалось на взятках за включение монет в листинг. В качестве примера можно привести биржу Coinnest – ее операционному и техническому директорам заплатили около 890 тысяч долларов за добавление в торговый список криптовалюты S-coin.

Как это работает

Чтобы токен попал в листинг, чаще всего на выбранной площадке необходимо подать заявку и заполнить анкету. Однако, популярные монеты биржи могут включать в листинг и самостоятельно, не дожидаясь пока команда проекта предложит сделать это. К примеру, на каждой бирже в обязательном порядке присутствует биткоин (BTC), и как правило, Ethereum (ETH).

Какие вопросы чаще всего встречаются в анкете:

  • название и описание монеты;
  • дата запуска основной сети, а также самой платформы;
  • ссылка на Github;
  • ссылка на Белую книгу проекта;
  • ссылки на социальные сети;
  • присутствует ли майнинг в сети и был ли премайнинг;
  • максимальная эмиссия монет и т.д.

Нередко биржи проводят также конкурсы среди своих пользователей – те голосуют за предложенные криптовалюты, и победившую монету добавляют с котировальный список.

Huobi Global в конце лета 2018 года запустила площадку для автоматического листинга криптовалют. С ее помощью биржа намерена ускорить процесс добавления токенов в торговый список и сделать его прозрачным.

Важные нюансы

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

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

Монеты, которые могут быть признаны ценными бумагами, биржи стараются не добавлять . Например, Poloniex сразу предлагает разработчикам ознакомиться с тестом Хоуи, чтобы определиться может токен подпасть под эти критерии или нет.

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

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

«Эффект бирж»

После добавления в листинги популярных криптобирж, стоимость монет, как правило резко вырастает – в среднем на 25-30%. Эта закономерность даже получила название «эффект бирж». Происходит это благодаря тому, что о монете узнает большее количество пользователей, она стает узнаваемой, повышает на нее спрос. Однако чаще всего этот взлет кратковременный и вскоре стоимость начинает снижаться.

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

Делистинг криптомонет производят по ряду причин:

  • низкий интерес со стороны трейдеров;
  • изменения в законодательстве;
  • взлом блокчейна криптосети;
  • отказ разработчиков от дальнейшей поддержки монеты;
  • жалобы пользователей.

Удаляются токены, как правило, не сразу – биржа дает несколько недель трейдерам на закрытие позиций и вывод средств на собственные кошельки.

Листинг в торговле

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

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



Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter
ПОДЕЛИТЬСЯ:
NexxDigital - компьютеры и операционные системы