Министерствообразования Республики Беларусь
Учреждениеобразования
«Гомельскийгосударственный университет им. Ф. Скорины»
Математическийфакультет
Кафедра МПУ
Курсоваяработа
Особенности языкаФорт
Исполнитель:
Пахоменко А.К.
Гомель 2007
Содержание
Введение
1 Краткое описание языка
2 Работа со стёком данных
3 Константы, переменные и работа с памятью
4 Логические операции
5 Примеры программ
6 Организация диалога в Форте
7 Определяющие слова
Заключение
Введение
Любой языкпрограммирования начинается с идеи определяющей его функциональную структуру,набор команд и отличительные особенности от других языков. Главная идея языкаФорт — это стёковая организация памяти. Для Форта стёк, не дополнительный видпамяти, как например, для языка Паскаль, а основной. Вспомним, что стёк эточто-то вроде трубы, в которую можно бросать мячики. Мячик, который брошенпоследним, будет вынут первым. Чтобы вынуть десятый мячик, нужно вынуть девятьпервых. Это может показаться несколько сложным и неэкономичным, но давайтевспомним, что существует большой класс задач, которые легко решаются с помощьюрекурсивных механизмов. А рекурсия как раз и предполагает наличие стековойпамяти. Конечно, организация рекурсии не достаточно веский аргумент длясоздания специального языка. Существуют и достаточно обычные задачи, решениекоторых удобно с применением стёка. Например, попробуем упорядочить массивчисел в порядке возрастания. Для этого определим каким-либо образом процедуруротации значений стека. При выполнении этой процедуры все значения, лежащие встеке поднимаются на одну позицию вверх, а верхний элемент занимает местонижнего (такая операция имеется в языке Форт).
Тогда, для решения задачинеобходимо описать два вложенных цикл, в котором на каждом шаге будутвыполнятся следующие действия:
1. Ротация стека.
2. Взять с вершиныдва значения А, В
3. Если А>В тоположить на вершину А, В Иначе положить В, А.
Примечание. Процедураротации заключается в смещении всех элементов стёка, таким образом, что каждыйэлемент становится на место соседа. Например, каждый элемент занимает местопредыдущего элемент, а первый становится на место последнего. Конечно, это непроще чем работа с массивами, но и не сложнее./>
1. Краткое описаниеязыка
Вычислительная модель,лежащая в основе языка Форт, состоит из адресного пространства, языка,оперативной памяти до 64 Кб, терминала и поля внешней памяти на магнитныхдисках объёмом до 32 Кб блоков по 1 Кб. каждый. В пределах имеющегося адресногопространства располагаются стёк данных, словарь, буфер для ввода с терминала ибуфер для обмена с внешней памятью. Примечание. Описанные выше ограничения попамяти не принципиальны. Просто в то время были такие машины. По меркам историивычтехники ФОРТ достаточно старинный язык.
Стёк данных обычнорасполагается в старших адресах оперативной памяти и используется для передачипараметров и результатов между исполняемыми словами. Его элементами являютсядвухбайтные значения, которые в зависимости от ситуации могут рассматриватьсяразличным образом: как целые числа со знаком в диапазоне от -32768 до +32767,как адреса оперативной памяти в диапазоне от 0 до 65535, как коды литер дляобмена с терминалом, как номера блоков внешней памяти в диапазоне от 0 до 32767или просто как 16-ти разрядные двоичные значения. В процессе исполнения слов значенияперемещаются на стёк и снимаются с него. Переполнение и исчерпание стёка, как правило,не проверяется; его максимальный объём устанавливается реализацией. Стандартпредусматривает, что стёк растёт в сторону убывания адресов.
Примечание. Обратите внимание,что стёк имеет свое расположение в ОЗУ. Это означает, что не все ОЗУ есть стёк.Часть ОЗУ выделяется под различные системные потребности, и часть ОЗУпредставляет собой обычную статическую память, в которой можно хранить обычныепеременные. Для стековых данных понятие переменной отсутствует. Есть толькопонятие слова, которое может оказаться как командой, так и словом данных. Начальнуючасть адресного пространства обычно занимает словарь — хранилище слов и данных.По мере расширения исходного набора слов словарь растёт в сторону увеличенияадресов. Специальные слова из обязательного набора позволяют управлять вершинойсловаря — поднимать и опускать её.
Примечание. Поясню термин«словарь». Любой язык имеет возможности создавать подпрограммы,процедуры, функции, модули, переменные, константы и т.д. Любой из этих объектовхарактеризуется значением и именем. То есть, любой язык предполагает, что впроцессе работы программист может создать новый объект языка имени для которогонет в языке. Вот СЛОВАРЬ Форта и занимается хранением таких новых имён.2 Работа со стёкомданных
Команды обработки стёка
— DUP — дублирует верхнее значение стёка идобавляет его копию на вершину.
— DROP — убирает верхнее значение стёка
— OVER — дублирует значение, лежащее настёке непосредственно под верхним.
— ROT — переставляет по часовой стрелкетри верхних значения стёка.
— SWAP — меняет местами два верхнихзначения стёка.
— PICK N — дублирует N-ыйэлемент стёка.
— ROLL N — прокручивает по часовой стрелке N верхних элементов стёка.
Чтобы увидеть верхнеезначение стёка используется точка, которая снимает значение в вершины стека ипечатает его на терминале как целое число в свободном формате (т.е. без ведущихнулей и со знаком минус, если число отрицательно). Вслед за последней цифройчисла слово-точка выводит один пробел, чтобы выводимые подряд числа несливались в сплошной ряд цифр.
Арифметические операции
— + сложение
— - вычитание
— * умножение
— / деление
— modостаток от деления
— abs абсолютнаявеличина числа
— negate значение с обратным знаком.
Использование стёка дляхранения промежуточных значений приводит к так называемой «обратнойпольской записи» — одному из способов бесскобочной записи арифметическихвыражений, подразумевающему постановку знака операции после операндов.Например, выражение (А/В + С) * (D * E — F * (G — H)) записывается следующим образом A B/C+D E * F G H — *-*.
Наряду с описанной выше16-ти разрядной арифметикой, язык Форт имеет полный набор средств для работы с 32- разрядными целыми числами через стандартное расширение двойной точности.Внутренним представлением таких чисел является 32 - разрядный двоичныйдополнительный код, представляющий их как числа со знаком в диапазоне от-2147483648 до +2147483647 или как числа без знака в диапазоне от 0 до4294967295. При размещении в стёке число двойной точности занимает дваэлемента: верхний — старшая половина, предыдущий — младшая. Такое расположениеделает простым переход от двойной точности к обычной. Расширение двойных чиселвключает слова, работающие с одинарной точностью к которым добавляется цифрадва: 2DROP, 2DUP и т.д. Примечание. Из сказанного выше ясно, почему вязыке в принципе можно обойтись без констант и переменных. Дело в том, чтопрограммист нуждаётся в механизме обозначения используемых величин. Выдача имёнпеременным и константам просто один из возможных механизмов такого обозначения.Форт, тоже даёт такой механизм. Каждый элемент обозначается просто номеромсвоего расположения в стеке. Здесь, однако, есть небольшое неудобство. А именнопроблема добраться до часто используемой величиной можно только перебрав всезначения стека, а это может замедлять процесс работы программы и усложнять еёлогику. Поэтому Форт все-таки предоставляет и механизм создания обычныхпеременных.3. Константы,переменные и работа с памятью
Программисту часто бываетудобно работать не с анонимными значениями, а с именованными. По аналогии сдругими языками эти средства называются константами и переменными. Слово CONSTANT А работает следующим образом. Состёка снимается верхнее значение, а из входного текста выбирается очередноеслово и запоминается в словаре как новое очередное слово и запоминается всловаре как новая команда. Её действие состоит в следующем: поместить на стёкзначение А, снятое со стёка в момент её определения. Например, 4 CONSTANT XOP. В дальнейшем при исполнении слова XOP число 4 будет положено на стёк.
Слово VARIABLE A резервирует в словаре два байта, а из входного потокавыбирает очередное слово и вносит его в словарь как новую команду, котораякладёт на стёк адрес зарезервированной двухбайтной области. Можно сказать, чтопеременная работает как константа, значением которой является адресзарезервированной двухбайтной области. Работа с переменной помимо получения еёадреса состоит в получении текущего значения и присваивании нового. Для этогоязык Форт имеет следующие слова: @ и !.
Слово @ (читается«разыменовать») снимает со стёка значение и, рассматривая его какадрес области оперативной памяти, кладёт на стёк двухбайтное значение,находящееся по этому адресу. Обратное действие выполняет слово!(восклицательный знак, читается «присвоить»), которое снимает состёка два значения и, рассматривая верхнее как адрес области оперативной памяти,засылает по нему второе снятое значение. Эти слова можно использовать не толькодля переменных, но и для любых адресов оперативной памяти. Следующий протоколработы показывает порядок использования переменной в сочетании с этими словами:
Ø VARIABLE x 1 x !
Ok
Ø x @ .
1 ok
Ø x @ NEGATE x ! x @ .
-1 ok
В первой строкеопределяется переменная x ией присваивается начальное значение 1. Затем текущее значение переменной x распечатывается. После этоготекущее значение меняется на противоположное по знаку и вновь распечатывается.
Слово, обозначающеепеременную, заносится в словарь и связывается с областью памяти, в которойхраниться значение переменной. Используя имя переменной в эту область можнозаносить значения и извлекать их оттуда. Константа от переменой отличается тем,что в словаре храниться имя вместе со своим значением и поэтому константа неможет быть изменена. 4. Логические операции
В языке Форт имеетсятолько один тип значений — 16-ти разрядные двоичные числа, которые,рассматриваются в зависимости от ситуации как целые числа со знаком, какадреса и т.д. Точно также подходят и к проблеме представления логическихзначений ИСТИНА и ЛОЖЬ: число 0 в двоичном представлении которого все разрядынули, представляет значение ложь, а любое другое 16-ти разрядное значениепонимается как ИСТИНА. Вместе с тем стандартные слова, которые должны вкачестве результата иметь логическое значение, из всех возможных представленийзначения ИСТИНА используют только одно: число -1 (или, что то же самое, 65535),в двоичном представлении которого все разряды единицы. Такое соглашение связанос тем, что традиционные логические операции конъюнкции, дизъюнкции и отрицаниявыполняются в Форте поразрядно над всеми шестнадцатью разрядами операндов:
— AND — логическое И
— OR — логическое ИЛИ
— XOR — исключающее ИЛИ
— NOT — логиечское НЕ
Нетрудно увидеть, что дляпринятого в Форте стандартного представления значений ИСТИНА и ЛОЖЬ все этислова работают, как обычные логические операции.
Логические значениявозникают в операциях сравнения, которые входят в обязательный набор слов иимеют общепринятую мнемонику:
A
= A, B -->A = B равно
> A, B --> A >B больше
Эти операции снимают состёка два верхних значения, сравнивают их как числа со знаком и возвращаютрезультат сравнения как значение ИСТИНА или ЛОЖЬ в описанном выше стандартномпредставлении. Возврат результата означает, что на стёк ложится соответствующеецелое число.
Структуры управления
Стандарт языкапредусматривает ряд слов для построения условных операторов и циклов. Эти словаиспользуются внутри определений через двоеточие и разделяют тело определения наотрезки. Действия, соответствующие словам из этих отрезков, выполняются, или невыполняются многократно в зависимости от условий, проверяемых во времявыполнения данного определения. Условные операторы и циклы могут свободновкладываться друг в друга. Условный оператор строится с помощью слов:
IF A à исполнение
ELSE à исполнение
THEN à исполнение
Внутри определения черездвоеточие отрезок текста IF ELSE THEN задаёт следующую последовательностьдействий: Слово IF снимает значениес вершины стёка и рассматривает его как логическое. Если это ИСТИНА (любое ненулевое значение), то выполняется часть «ТО» — слова, находящегосямежду IF и ELSE, а если ЛОЖЬ (равно нулю), то исполняется часть«иначе» — слова между ELSE иTHEN.
В стандарт языка Фортвключены циклы с условием и циклы со счётчиком. Циклы первой группы образуютсяс помощью слов:
BEGIN à исполнение
UNTIL A à исполнение
WHILE A à исполнение
REPEAT à исполнение
И имеют две формы
BEGIN UNTIL
BEGIN WHILE REPEAT
В обоих случаях циклначинается словом BEGIN котороеслужит открывающей скобкой, отмечающей начало цикла, и во время счёта невыполняет никаких действий.
Цикл BEGIN — UNTIL называется циклом с проверкой в конце. Послеисполнения слов, составляющих его тело, на стёке остаётся логическое значение — условие завершения цикла. Слово UNTILснимает это значение со стёка и анализирует его. Если это ИСТИНА, то исполнениецикла завершается, а если это ложь, то управление возвращается к началу циклаот слова BEGIN.
Цикл с проверкой в началеBEGIN — WHILE — REPEATиспользуется если, в цикле есть действия, которые не надо выполнять взаключительной итерации. Исполнение слов, составляющих тело — 1, оставляет настёке логическое значение — условие продолжения цикла. Слово WHILE снимает это значение со стёка ианализирует его. Если это ИСТИНА, то исполняются слова составляющие тело — 2данного цикла до ограничивающего слова REPEAT, после чего вновь выполняется тело — 1 от слова BEGIN. Если же значение условия ЛОЖЬ тоисполнение данного цикла завершается и начинают выполняться слова, следующие заREPEAT. В отличие от предыдущей формы циклапо условию, значение ИСТИНА соответствует продолжению цикла.
Для организации циклов сцелочисленной переменной — счётчиком цикла — используются слова:
DO A, B à исполнение
LOOP à исполнение
+LOOP A à исполнение
I à A исполнение
J à A исполнение
LEAVE à исполнение
Такие циклы записываютсяв одной из следующих двух форм: DO LOOP или DO + LOOP. В обоих случаях цикл начинается словом DO, которое снимает со стёка два значения: начальное и конечноеи запоминает их. Текущее значение счётчика полагается равным начальномузначению, после чего исполняются слова, составляющие тело цикла. Слово LOOP увеличивает текущее значениесчётчика на единицу и проверяет условие завершения цикла. В отличие от негослово +LOOP прибавляет к текущему значениюсчётчика значение шага, которое вычисляется на стёке телом цикла ирассматривается как число со знаком. В обоих случаях условием завершения циклаявляется пересечение границы между А-1 и А при переходе от прежнего значениясчётчика к новому, где А — конечное значение, снятое со стёка словом DO. Если пересечения не произошло, тотело цикла исполняется вновь с новым значением счётчика в качестве текущего.
Внутри тела цикла слово I кладёт на стёк текущее значениесчётчика. Слово LEAVE,употреблённое внутри цикла вызывает прекращение исполнения его тела; управлениепереходит к словам следующим за словом LOOP или +LOOP.В программировании часто применяется конструкция цикл в цикле. Чтобы вовнутреннем цикле получить текущее значение счётчика объемлющего цикла,используется слово J.5Примерыпрограмм
Пример 1: ВычислениефакториалаDup 2 if drop 1 1 если N Пример 2: Вычислениенаибольшего общего делителя2dup =B Begin dup A, B, B While Пока В не ноль 2dup mod А, В, С: остаток Rot B, C, A drop A, B, A=B, B=C Repeat drop; НОД
Пример 3: Вычислениесуммы квадратов 0 swap 0, N S[0] = 0 1+ 1 S[0], N+1, 1 Do I S[I-1], I Dup * + S[I] S[I]=S[I] + I*I Loop S[N] 6Организациядиалога в Форте
Из предыдущих примеров невидно, откуда машина возьмёт те числа над которыми будут выполняться действияпрограммы. Данные как бы уже предполагаются введёнными. Дело в том, что вводданных — это не проблема языка Форт, это проблема Форт-системы. Этот язык неесть язык программирования в чистом виде, как например язык Паскаль которыйработает под управлением той или иной внешней операционной системы. Фортнуждается в собственной операционной системе, которая организует пошаговыйдиалог с пользователем. Работа пользователя заключается во вводе фрагментатекста, который Форт система пытается интерпретировать в соответствии снесложными правилами. Она вводимый текст разделяет на команды отделяющиеся другот друга пробелами и пытается распознать их как команды языка Форт. Если это ейне удаётся, то она пытается их распознать их как числа и положить на стёк. Еслии это ей не удаётся, то Форт-система выдаёт сообщение об ошибке. Таким образом,ввод данных осуществляется как ввод внешнего текста состоящего из записи чиселраздёленных пробелами. Точно так же вводятся фрагменты форт программы, и сталобыть пользователь в процессе диалога с Форт-системой сам определяет порядокобработки данных форт программами. Пользователь на каждом шаге работы программыпросто вводит некоторый текст, а что этот текст из себя представляет, данныеили программу решает форт-система. Это нарушает наше обычное представление оработе программы. Обычно, ввод программы и данных разделяется. Сначалаполностью вводится программа, а уж затем данные. Система Форт в этом отношениинамного гибче.
Пример 4:Упорядочение массива по возрастанию
Это пример, мы разберёмподробно.
Выше уже было разъяснено,как организуется ввод. Поэтому договоримся о том, что перед вводом текстапрограммы, мы уже осуществили ввод данных таким образом, что на вершине стекалежит число — количество элементов массива и под ним лежат все элементымассива.
Мы воспользуемся циклом DO. Для него на вершине стека должнылежать два значения начальное значение параметра и его конечное значение.Запишем команды, которые создадут необходимую структуру стёка.
DUP
1
SWAP
1
Запишем изменения вершиныстека, которые происходят в процессе выполнения этих команд.
Команда 1: N N
Команда 2: 1 N N
Команда 3: N 1 N
Команда 4: 1 N 1 N
Таким образом, требуемаяструктура сформирована и можно записать заголовки цикла
DO
DO
Первый заголовок снял 1 иN и второй заголовок также снял 1 и N. Далее запишем тело циклов. Здесь мыпоступим следующим образом: мы сравним два верхних значения, поменяем ихместами если в этом есть необходимость и осуществим прокрутку стека на однупозицию
2DUP
>
Первый оператор дублируетодно двойное слово или что-то же самое два одинарных, то есть дублирует навершине стёка два значения. Затем операция «больше» снимает двазначения, назовём их А, В и если А > В то кладёт на вершину стёка единицуиначе кладёт ноль. Если на вершине стека единица, то А и В находятся в нужномпорядке и ничего делать не надо, иначе их нужно поменять местами
IF
ELSE
SWAP
THEN
Оператор IF снимает со стека 1 или 0 (результатоперации сравнения), если снята единица то ничего не происходит иначе дваверхних элемента, а это опять А и В меняются местами. И теперь осталосьпровернуть стёк. Для этого необходимо выполнить команду N ROLL. Если N — количество элементов массива, то команда осуществит необходимый нам сдвигстёка. Ясно, что нам опять нужно значение N, но оно было безвозвратно снято со стёка и забыто (о нёмсейчас помнят только заголовки циклов). Вот тут мы сможем с пользой применитьпонятие переменной. Чтобы запомнить в оперативной памяти значение N мы в самом начале программы должнывыполнить следующее
DUP
VARIABLE N
!
Это фрагмент дублируетзначение N лежащее на стёке, следующая команда(Variable) резервирует в необходимоеколичество ячеек памяти и старший адрес зарезервированной области кладёт настёк. Восклицательный знак снимает два значения со стека (адрес и значение N) и значение пересылает по адресу.Если теперь нам необходимо получить значение переменной N мы должны выполнить следующее:
N @
N — теперь воспринимается как командаязыка Форт с её выполнением на стек ложится значение адреса памяти по которомухранится значение переменной. Знак собачки снимает со стека значение адреса,затем пересылает значение, взятое по этому адресу, на вершину стека и теперь мыможем выполнить команду ROLL.Она снимет со стека значение N иосуществит требуемый сдвиг массива.
И осталось завершитьциклы
LOOP
LOOP
Если есть потребностьпросмотреть массив, необходимо вывести все элементы стека на экран циклическимповторением команды точка.
N @ (кладем на стек количествоэлементов массива)
1 (Кладем на стёкначальное значение параметра цикла)
DO (Снимаем со стека параметры цикла иначинаем работу)
. (Снимаем очереднойэлемент стека)
LOOP (Переходим к новому шагу цикла)
Запишем полученнуюпрограмму целиком
(Создание переменной)
DUP
VARIABLE N
!
(Создание необходимойструктуры данных для организации циклов)
DUP
1
SWAP
1
(Обработка массива)
DO
DO
2DUP
>
IF
ELSE
SWAP
THEN
N @
ROLL
LOOP
LOOP
(Вывод массива дляпросмотра)
N @
1
DO
.
LOOP 7. Определяющие слова
Тип данных это не толькоуказание на необходимый объём памяти, но и перечень допустимых операций. Этисамые допустимые операции выглядят так очевидно, что наверное не сразувозникает идея, что допустимые операции также можно определять.
Конечно, те операции,которые приклеиваются к базовым типам, реализуются разработчиком компилятора иони для изменения недоступны, и конечно, нельзя допустить, чтобы программист — пользователь компилятора имел возможность менять код компилятора, но операциюможно реализовать и средствами самого языка высокого уровня. Это будет почти таже самая процедура или функция языка, с той лишь разницей, что она будет жёсткопривязана к конкретным данным. Если таким образом к стандартному типу данных(такому как мы рассматривали в первой лекции) добавить набор процедур ифункций, то получится совершенно новая языковая структура именуемая объектом. Объектхорошо тем, что в нём полностью описывается всё, что нужно для понимания его смысла,обработки, размещения в памяти, поэтому программа, построенная из объектов,становится более понятной и более прозрачной для восприятия. Такой подходшироко распространён. Это сейчас называется объектным программированием, а языкФорт — это один из первых языков, где прозвучала идея объектного программирования. Правда в Форте нет терминов используемых ныне: объект, класс,инкапсуляция и т.д., но ведь это одна из первых попыток! А теперь перейдём кФорту.
Определяющее слово Фортавыполняет две функции: во-первых, определяет понятие (резервирует память, указывает,откуда брать значения и т.д.) и, во-вторых, определяет действия, которые можновыполнять над определёнными понятиями. В соответствии с этим двумя функциямиопределяющее слово состоит из двух составляющих частей: создающей иисполняемой.
Синтаксис определяющегослова
CREATE > СОЗДАВАЕМАЯ ЧАСТЬ
DOES > ИСПОЛНЯЕМАЯ ЧАСТЬ
Рассмотрим в качествепримера определение понятия вектор. При создании вектора будем указывать размер(число элементов), а при обращении к нему — индекс элемента, в результате чегополучается адрес данного элемента. Этот адрес можно разыменовать и получитьзначение элемента или можно заслать по этому адресу новое значение. Еслижелательно контролировать правильность индекса при обращении к вектору, тоопределение может выглядеть так:
; Вектор CREATE DUP, 2*ALLOT
DOES >
OVER 1- OVER U
IF SWAP 2 * + EXIT THEN
. «Ошибка виндексе»
Рассмотрим, как работаетданное определение при создании вектора 10 вектор Х.
Создающая частькомпилирует размер вектора и вслед за этим отводит память на 10*2 байт. Таким образом,в словаре для вектора Х отводится размером 22 байта, в первых двух байтаххранится число 10 — размер вектора. При обращении к вектору Х на стеке должнонаходиться значение индекса. Слово DOES> кладёт сверху адрес области сформированной создающей частью, послечего работает исполняющая часть определения. Проверив, что индекс лежит вдиапазоне между 1 и 10, она оставляет на стёке адрес, равный начальному адресуобласти плюс I*2 то есть адрес I — го элемента вектора, если считать,что элементы располагаются в зарезервированной области подряд. Если окажется,что индекс не положителен или больше числа элементов, то будет напечатаносообщение «Ошибка в индексе» и исполнение закончится через слово ABORT.
Заключение
Вспомним, что первыекомпьютеры обладали очень ограниченной памятью. Это было так не только из-задороговизны оперативной памяти и даже не столько из-за неё, сколько из-заограниченной возможности процессора адресовать память. Разрядность процессораналагает на величину максимального адреса очень жесткое ограничение. Если жеосновная масса памяти организована в виде стека, то проблема адресации уходит,так как запоминать необходимо только одну ячейку — вершину стека. Ещё однакрайне интересная особенность Форта видна в первых трёх примерах. Достаточносложные вычислительные процессы идут совершенно без использования понятияпеременной. Такая организация памяти, как уже упоминалось, существенным образомвлияет на организацию подпрограмм. В некотором смысле их нет, а есть потокзаданий, каждое из которых может представлять собой подпрограмму с точки зренияпользователя, чтобы понять механизм такого действа, нужно более тщательнорассмотреть работу Форт системы в целом, что уже выходит за рамки данной работы.
Литература
1. Вострикова З.П. и др. «Программирование на языке „БЕЙСИК“для персональных ЭВМ». Машиностроение, 1993г.
2. Гохман А.В. и др. «Сборник задач по математической логике и алгебрымножеств», издательство Саратовского Университета, 1969г.
3. Гусев В.В. Основы импульсной техники. М. Советское радио, 1975
4. Касаткин В.Н. «Информация, алгоритмы, ЭВМ», М. Просвещение,1991г.
5. Машовцев В.А. Вступительные экзамены по информатике//Информатика. 1997,№13
6. Орлов В.А. О вступительных экзаменах по информатике//Информатика, 1997,№15
7. Яснева Г.Г. Логические основы ЭВМ//Информатика и образование, 1998, №2
8. Лыскова В.Ю., Ракитина Е.А. Логика в информатике, М. Информатика иобразование 1999
9. Шауцкова Л.З. “Решение логических задач средствами алгебры логики”,газета Информатика 1999, №5.