Операционные системы, отличные от ОС UNIX
Здесь мы главным образом рассмотрим, чем отличаются другие операционные системы от ОС UNIX; поэтому если вы пропустили предыдущий раздел, вернитесь назад и прочтите его.
Все отличия можно разделить на две группы:
1. В других операционных системах реализована операция переключения.
2. Компиляторы с языка Си предоставляют возможность использовать операцию переключения.
Мы не можем рассмотреть все возможные операционные системы, поэтому приведем пример только одной из них, но весьма широко распространенной. Это система MS-DOS 2; она вначале была просто "отпрыском" ОС СР/М, а сейчас самостоятельно развивается в сторону операционной системы XENIX, подобной ОС UNIX. В версию MS-DOS были введены операции переключения < и >; они работают в ней точно так же, как было описано в предыдущем разделе.
У нас нет возможности рассмотреть все компиляторы с языка Си. Однако в пяти из шести версий компилятора, предназначенных для микрокомпьютеров, с которыми мы имели дело, для указания операции переключения используются символы < и >. Операция переключения, реализуемая компилятором с языка Си, отличается от аналогичной операции, выполняемой ОС UNIX, в двух аспектах:
1. Указанная операция выполняется при работе программ, написанных только на Си, в то время как в ОС UNIX она может использоватъся при работе любой программы.
2. Между именем программы и знаком операции должен быть один пробел, а между знаком операции и именем файла пробел должен отсутствовать. Ниже приведен пример правильной команды:
input4 <words
Комментарий
Операция переключения - это простое, но мощное средство. С ее помощью мы можем превратить нашу крошечную программу ввод-вывод4 в инструмент для создания, чтения и копирования файлов. Данный способ служит иллюстрацией подхода, принятого в языке Си (и ОС UNIX) и заключающегося в конструировании простых средств, которые можно комбинировать различным образом для выполнения конкретных задач.
Резюме: как переключать ввод и вывод
На большинстве машин, в которых реализован компилятор с языка Си, операцию переключения можно использовать либо для всех программ, благодаря поддержке операционной системы, либо только для программ, написанных на Си, благодаря наличию компилятора с этого языка. Ниже prog будет именем выполняемой программы, a file1 и file2 - именами файлов.
Переключение вывода в файл: >
prog >file1
Переключение ввода в файл: <
prog <file2
Комбинирванное переключение:
prog <file2 >filel или prog >filel <file2
В обеих формах записи файл с именем file2 используется для ввода данных, а файл с именем filel - для вывода.
Расположение пробелов
Некоторые системы (в особенности компиляторы с языка Си) требуют наличия пробела слева от знака операции переключения и его отсутствия справа от этого знака. Другие системы (ОС UNIX например) допускают любое число пробелов (в том числе и ни одного) слева и справа от знака данной операции.
Графический пример
Мы можем воспользоваться функциями getchar( ) и putchar( ) для изображения геометрических фигур при помощи символов. Ниже приведена программа, которая это делает. Она читает символ, а затем печатает его некоторое число раз зависящее от кода ASCII этого символа. Кроме того, она печатает на каждой строке требуемое число пробелов, чтобы текст оказывался в центре строки.
/* фигуры */
/* изображает симметричную фигуру из символов */
#include
main( )
{
int ch; /* переменная для ввода символа */
int index;
int chnum;
while ((ch=getchar( )) != '\n' )
{
chnum - ch %26; /* получение числа от 0 до 25 */
index = 0;
while (index++ <(30 - chnum))
putchar( ); /* печать пробелов сдвига к центру */
index = 0;
while (index++ <(2* chnum + 1))
putchar (ch); /* повторная печать символа */
putchar( \n );
}
}
Единственный новый технический прием здесь - это использование подвыражений таких, как (30-chnum) при записи условии в циклах while. Один цикл while управляет печатью необходимого числа начальных пробелов в каждой строке, а второй - выводом символов на печать. Результат работы программы зависит от данных, которые вводятся. Если, например, вы введете.
What is up?
то на экране появится следующее
wwwwwwwwwwwwwwwwwww
h
ааааааааааааааааааааааааааааааааааааааа
ttttttttttttttttttttttttt iiiiiiiiiiiiiiiiiiiiiiiiiii
sssssssssssssssssssssss
uuuuuuuuuuuuuuuuuuuuuuuuuuu ppppppppppppppppp
??????????????????????????
Что вы можете делать с помощью этой программы? Можете просто игнорировать ее, или же (переписав ее по-другому) изменять вид фигур которые она выводит на печать, либо наконец искать такие комбинации входных символов, что в результате на экране будут появляться привлекательные фигуры например при вводе такой последовательности:
h i j k l m n o p q r s t u i i i
Результат работы программы будет выглядеть так
h i i i j j j j j
k k k k k k k l l l l l l l l l
m m m m m m m m m m m n n n n n n n n n n n n n
o o o o o o o o o o o o o o o p p p p p p p p p p p p p p p p p
q q q q q q q q q q q q q q q q q q q г г г г г г г г г г г г г г г г г г г г г s s s s s s s s s s s s s s s s s s s s s s s
t t t t t t t t t t t t t t t t t t t t t t t t t
u u u u u u u u u u u u u u u u u u u u u u u u u u u 111
l l l
l l l
СИСТЕМНО-ЗАВИСИМЫЕ СРЕДСТВА: ПОРТЫ ВВОДА-ВЫВОДА МИКРОПРОЦЕССОРОВ INTEL 8086/8088
Рассмотрим различные устройства ввода-вывода, поскольку теперь мы хотим обсудить вопрос о том, как приспособить реализацию компилятора с языка Си к требованиям конкретной вычислительной системы. Многие из современных микрокомпьютеров спроектированы на основе микропроцессорных интегральных схем (ИС) INTEL 8086 и INTEL 8088. Наиболее известным является персональный компьютер IBM PC, в котором применяются ИС второго типа. Конкретный пример, который приведен ниже, относится к упомянутому компьютеру, но обсуждаемые принципы применимы и при рассмотрении других мини-машин, построенных на базе семейства микропроцессоров 8086/8088.