Язык программирования Форт


Что такое память ?


Представьте себе, что имеется 8 переключателей, каждый из которых может быть включен или выключен. Можно их закодировать так, чтобы состояние переключателей представлялось числами. Будем считать, что единице соответствует включенный переключатель, нулю --- выключенный. В показаны числа, построенные таким образом. Восемь переключателей могут представлять до 256 чисел (от 0 до 255). Если немного подумать, вы сможете доказать, что с помощью n переключателей можно запомнить 2^n чисел (2^8=256).

С помощью 16 переключателей или двух банков по 8 переключателей могут быть представлены 65536 чисел (от 0 до 65535).

Предполагается, что для чисел в стеке имеется два банка по 8 переключателей. Вследствие этого наибольшее число, которое можно записать в стек и которое мы называем числом одинарной длины, равно 65535. Для представления чисел двойной длины нужно уже 32 переключателя, и диапазон представляемых чисел увеличивается до 65535 х 65535 = 4271406736.

Итак, мы видим, что память микрокомпьютера -- это не что иное, как большое количество переключателей, которые могут включаться и выключаться с огромной скоростью. Вот так. И все, и ничего больше. Сложность здесь состоит в том, чтобы организовать переключатели для хранения чисел и, следовательно, данных. (Алфавитно-цифровой текст также можно представить в виде закодированных чисел. Например, буква А представляется числом 65.) Каждый переключатель в памяти называется битом, от английского Binary digiT (двоичный разряд, а почему -- мы вскоре узнаем).

А теперь можете забыть о всяких переключателях, будем говорить только о битах. Если значение содержимого бита равно 1, то говорят, что он взведен или установлен; если значение равно 0, то говорят, что он сброшен или выключен. Многие недорогие ЭВМ, например Commodore 84, TRS-80 модель 4, Apple II, используют ЦПУ, которое работает с 8-разрядными числами; их называют 8-разрядными машинами, они обеспечивают доступ к 65536 8-разрядным ячейкам памяти, т.е. к 524288 битам. Более дорогие 16-разрядные машины, например IBM PC и Tandy 2000, работают с 16 разрядами одновременно, обеспечивают доступ к большему числу ячеек памяти, объем памяти здесь, скорее, ограничивается потребностями пользователя и его финансовыми возможностями. 8-разрядный элемент памяти называют байтом, в байтах принято оценивать емкость памяти.
В ЭВМ ранних моделей за единицу емкости принималось четыре разряда.

16 разрядов иногда называют словом, однако, так как слово на больших ЭВМ может быть 32-разрядным или даже 64-разрядным и, кроме того, понятие "слово" в языке Форт имеет совсем другой смысл, будем называть 16-разрядное число ячейкой либо просто числом. Это число -- целое, ибо оно используется для хранения в стеке чисел одинарной длины. Для обозначения больших объемов памяти применяются слова с префиксами кило и Мега-, которые в метрической системе означают соответственно 1000 и 1 миллион.

Например, километр -- это 1000 метров, 1 МегаГерц -- это 1000000 Гц, или 1 млн. колебаний/с. В вычислительной технике применяются другие единицы (не столь строгие). Килобайт (сокращается как Кбайт) -- это приблизительно 1000 байтов, на самом деле он равен 210 = 1024 байта. Мегабайт (сокращенно Мбайт) используется еще более нечетко. Иногда считают его равным 1000 Кбайтам, т.е. 1024000 байтам, а иногда 1024 Кбайтам, т.е. 1048576 байтам. Последнее число представляется как 220 байтов. Это полезная единица для обозначения объема памяти, и мы будем использовать именно это определение. Так, например, модели ЭВМ TRS-80 Modell III и Apple II обычно называют машинами с объемом памяти 64 Кбайта или б4К- машинами; они могут работать с памятью объемом 64 х 1034 = 65536 байтов; IBM PC может работать с памятью объемом до 1 Мбайта, или 1048576 байтов.

Таблица 3.1 Двоичная запись и основание системы счисления



Состояния
переключателей
число Состояния
переключателей
число
000000000000001106
000000011000001117
000000102000010008
000000113000010019
000001004.........
00000101511111111255
Кое-что об этом вы уже знаете. Двоичная запись -- это попросту соглашение о записи чисел с помощью только двух цифр 0 и 1 (отсюда двоичный разряд, или бит). Люди привыкли к десятичной арифметике, которая использует 10 цифр (от 0 до 9) или так называемой десятичной форме записи, но компьютеры имеют дело с единицами и нулями, т.е.


с двоичной системой. Как мы вскоре увидим, иногда (но не очень часто) удобно работать с числами, использующими для записи 8 цифр (от 0 до 7), т.е. восьмеричную форму, а очень часто удобнее использовать 16 чисел (от 0 до 9 и от А до F), или так называемую шестнадцатеричную форму представления. В шестнадцатеричной форме число 10 обозначается буквой А, 11 -- буквой В и т.д., число 15 -- буквой F, число 16 обозначается как 10. Давайте снова рассмотрим таблицу двоичных чисел. Посмотрите, сможете ли вы объяснить, почему для обращения с байтом оказывается удобной шестнадцатеричная система (для этого продолжите таблицу до 16). Если вы не догадались, то через некоторое время это станет понятнее. Хорошее практическое обсуждение оснований систем счисления и других аспектов представления чисел вы можете найти в книге Липшуца "Арифметические основы компьютеров" (1982).

Количество различных цифр, используемых для представления чисел, называется основанием системы счисления или просто основанием. При двоичной записи основание равно 2, при восьмеричной -- 8, при десятичной -- 10, при шестнадцатеричной -- 16 (обозначение ее в Форте HEX происходит от английского названия hexadecimal). Прелесть Форта состоит в том, что, хотя все числа он хранит в двоичной форме (впрочем, как и многие другие языки, что определяется требованиями компьютера), он может принимать их и отображать с любым основанием вплоть до 72. Нам потребуются некоторые слова Форта, которые позволяли бы отображать числа из стека в различных системах счисления, но прежде чем мы с ними познакомимся, необходимо немного отвлечься, чтобы рассмотреть, как мы можем извлекать байты и числа, которые хранятся в памяти. С каждым байтом сопоставляется число, начиная с нуля и больше, которое соответствует его положению в памяти и называется адресом. Таким образом, первый байт имеет 0-й адрес в памяти, в то время как для 8-разрядной ЭВМ адрес самого верхнего байта равен 65535. Для осуществления доступа к содержимому указанного адреса в Форте предусмотрено несколько слов.


Наиболее важными из них являются @ (извлечь) и ! (занести, запомнить). Если в стеке на вершине находится адрес, то слово @ замещает адрес 16-разрядным (двухбайтовым) числом, которое хранится по этому адресу. Если так же на вершине находится адрес, а вторым элементом стека является число, то оператор ! производит запоминание этого числа по указанному адресу. Слово ! следует употреблять осмотрительно, так как можно изменить содержимое важной части памяти, если вы запишете не в то место памяти. Можно использовать слова @ и ! для того, чтобы узнать систему счисления или изменить ее при вводе и выводе чисел. В памяти имеется ячейка (адрес), в которой хранится основание системы счисления, которое действует в настоящий момент при вводе-выводе чисел. Этот адрес выдается в стек когда вы вводите слово BASE. Давайте его испытаем. Вначале дадим компьютеру задание принимать и выводить числа в десятичной системе счисления с помощью слова DECIMAL (десятичный). Слово DECIMAL изменяет число, которое хранится по адресу, возвращаемому в стек словом BASE, на 10 (десятичная система). Теперь основание может быть сделано шестнадцатеричным (основание 16), если ввести

16 BASE !

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

1В DECIMAL .

и получите

12 Ok

Число 12 в десятичной записи -- это то же самое, что 1В в шестнадцатеричной. Следующий пример произведет обратное действие:

13 16 BASE ! .

выдаст на экране 1С, т.е. шестнадцатеричный эквивалент числа 13. Слово HEX, которое не является стандартным, включено в большинство версий Форта.


Оно устанавливает шестнадцатеричную систему счисления так же, как DECIMAL устанавливает десятичную. Во многих версиях есть слова OCTAL и BINARY, которые устанавливают систему счисления 8 и 2 соответственно. Можно проиллюстрировать один важный момент с помощью следующих экспериментов. Попробуем ввести

DECIMAL 2 BASE ! BASE @ .

потом

DECIMAL 8 BАSЕ ! BASE @ .

и

DECIMAL 16 BASE BASE @ .

Во всех случаях вы увидите 10. Почему ? Основание числа во всех случаях представляется как 10, так как это -- два (в двоичной системе), 8 (десятичное) -- это 10 в восьмеричной системе и 16 (десятичное) представляется так же, как 10 в шестнадцатеричной системе. Как же тогда узнать, в какой системе мы находимся ? Вот слово, которое поможет это сделать:

: BASE? BASE @ DUP DECIMAL . BASE ! ;

Вы должны понимать, как оно работает. Если вы введете

16 BASE ! BASE?

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

n BASE !

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

10 BASE !

ничего не произойдет. 10 в двоичной системе -- это десятичное число 2, но мы уже находимся в двоичной системе. А что произойдет, если ввести

10 BASE !

в шестнадцатеричной системе ? Как снова вернуться к основанию 10 ? Если вы были в шестнадцатеричной системе, можете ввести

A BASE !

А -- это шестнадцатеричное число, которое равно 10 (десятичное). Если вы забыли текущее основание, то слово DECIMAL всегда возвратит вас к основанию 10, независимо от того, в какой системе вы были до этого.

Приведем слово, которое показывает в двоичной системе счисления число, находящееся на вершине стека. Обратите внимание, что при этом оно не изменяет содержимое стека:

: .BIN (n - n) DUP BASE @ 2 BASE ! SWAP . BASE ! ;

Вы должны догадаться, как оно работает.

В качестве упражнения (и для использования впоследствии) опишите три слова: .ОСТ, .DEC и .HEX, которые будут печатать число из стека в восьмеричной, десятичной и шестнадцатеричной системе соответственно.Для этого вам надо изменить в слове .BIN всего один символ. Теперь мы сможем написать еще одно слово, которое даст возможность представить число в стеке одновременно в двоичной, восьмеричной, десятичной и шестнадцатеричной системах :

: .NUMS (n -) .BIN .ОСТ .DEC .HEX DROP ;

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


Содержание раздела