Опубликован: 21.08.2007 | Уровень: для всех | Доступ: платный
Лекция 4:

Машинно ориентированное программирование

< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Аннотация: В данной лекции рассматриваются подходы к машинно-независимому эффективному программированию. Приведены примеры программирования на языке Форт, отмечены его основные преимущества и недостатки

Рассматривается два подхода к машинно независимому эффективному программированию. Язык Forth - пример организации вычислений над стеком. Можно рассматривать как язык-ядро с возможностью практически неограниченного проблемно-ориентированного расширения. Язык Little - пример традиционной организации вычислений над структурированными битовыми строками. Основные конструкции аналогичны фортрановским, но с учетом современных решений, упрощающих реализацию компилятора. Оба языка допускают порождение эффективного кода "хорошо" написанных программ [ [ 3 ] , [ 32 ] ].

Появление в 70-х годах микропроцессорных средств с малым объемом памяти и сравнительно невысоким быстродействием вызвало очевидные трудности в применении привычных языков высокого уровня. Не удивительно, что поиск подходящих средств программирования сменил приоритеты в оценке свойств языков и систем программирования. На передний план вышли машинно-ориентированные языки-оболочки, поддерживающие достижение эффективности и компактности программ при достаточном уровне абстрагирования от конкретики процессоров, сравнимом с абстрагированием в языках высокого уровня. Особо ярким явлением в эти годы стал язык Forth, сохранивший многочисленных приверженцев и в наши дни, когда пресс технических характеристик изрядно помягчал [ [ 6 ] ]. Little приведен как пример альтернативного подходе к решению проблемы машинно ориентированного программирования.

Наиболее убедительное применение Forth получил как средство разработки специализированных систем, создаваемых по методике раскрутки, начиная с тщательно минимизированного ядра с рядом последовательных шагов расширения в рамках единой оболочки. Сам язык устроен по такому же принципу, так что такая технология пошагового программирования впитывается при изучении идей и средств системы программирования на базе Forth-а. Кроме общеизвестных примеров про системы управления астрономическими телескопами и лазерами, следует упомянуть IBMCAD - аналог системы инженерного AutoCAD и систему автоматизации издательского дела МРАМОР. Для последней именно на Форте была создана предельно компактная операционная система объемом около 4 килобайт. Форт был успешно применен при реализации языка PostScript, до сих пор используется при разработке видеоигр и систем начальной загрузки ОС, чувствительных к скорости срабатывания. При значительном внешнем несходстве Форт обладает концептуальным родством с языком Лисп, что побудило в 80-е годы к разработке языка ФоЛи, объединяющего достоинства обоих языков.

Программирование на Форте требует вдумчивости и аккуратности. Достижимость лаконичных форм дается ценой нестандартных индивидуальных решений, мало приспособленных к передаче программ в чужие руки. Лозунги "Программируйте все сами!" и "Не бойтесь все переписывать заново!" правильно отражают подход к программированию на Форте. Успех достигается явным максимализмом в тщательной отладке и способностью видеть задачу программирования в развитии.

Язык Форт предложен Чарльзом Муром в 1968 году. К середине 70-х Форт стал третьим по популярности после Бейсика и Паскаля, завоевавшим свои позиции при освоении микропроцессоных средств. По технике программирования Форт весьма похож на макроассемблер, только вместо системы команд над машинными словами в нем используется система операций над стеком.

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

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

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

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

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

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

Традиционно отмечаемые недостатки Форта:

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

Активный популяризатор Форта Мур отметил: "Форт не уравнитель, а усилитель!"

Итак, программа на Форте строится как последовательность слов. Данные - это тоже слова. Логическое значение "истина" - 0. В качестве элементарных данных выступают литеры, целые без знака и со знаком, неотрицательные целые, адреса, двойные слова и др. типы данных.

Имеются константы TRUE и FALSE, символизирующие логические значения.

Заключение в кавычки "строка" означает вариант со счетчиком и ограничитель - 0

Состояние системы программирования можно исследовать на уровне системных переменных. Различается состояние компиляции (создание кода программы) и интерпретации (непосредственное исполнение программы). Если STATE = 0, то система ведет исполнение программы.

Системная переменная BASE задает систему счисления.

Исполнение программы организовано как диалог над стеком. Каждая команда знает, что взять из стека и во что преобразовать:

DROP (X --)1Круглыми скобками  выделена схема изменения стека 
                           = сбросить из стека
DUP        (X -- X X)                      = скопировать вверх
NIP        (X1 X2 -- X2)                   = сбростиь предпоследний
OVER       (X1 X2 -- X1 X2 X1)             = предпоследний наверх
PICK       (XN ... X0 N -- XN ... X0 XN)   = выборка из середины стека
ROLL       (XN ... X0 N -- XN-1 ... X0 XN) = перестановка на заданную глубину
ROT        (X1 X2 X3 -- X2 X3 X1)          = перестановка трех верхних элементов
SWAP       (X1 X2 -- X2 X1)                =  обмен местами
TUCK       (X1 X2 -- X2 X1 X2)             = копирование под вершину
DEPTH      (-- N)                          = глубина   
?DUP       (X -- X X\=0)                   = ? истина

Кроме обычных арифметических операций имеются эффективно реализуемые:

1+ 
1-  
2+ 
2- 
2/ половина

Слово стека занимает 16 разрядов, но имеются операции над двойными словами - в 32 разряда:

2drop 
2dup 
2over 
2rot 
2swap

Есть вариант умножения чисел без потери точности - результат пишется в двойное слово:

UM*      (a,b -> cc)

Система программирования использует при работе ряд стеков:

R - стек возвратов
C - стек компиляции
F - стек чисел 
S  - стек словарей

Имеются операции, работающие с адресами и памятью:

@          (adr -- x)     чтение - разыменование
!          (x adr --)     запись

ALLOCATE   выделить память
FREE       освободить память
RESIZE     заменить размер
IOR        код завершения операции   

ALLOT  (N -- адр)  резервирование памяти в словах
HERE   (-- А)      адрес слова
,                  компиляция со стека
UNUSED (-- N)      остаток памяти
< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?

Данила Некрасов
Данила Некрасов
Россия, Пермь, ПНИПУ
Сергей Федоров
Сергей Федоров
Россия