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

Детализация базовых функций

< Лекция 6 || Лекция 7: 123 || Лекция 8 >

Функциональная модель процессора абстрактной машины

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

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

Объявление системы команд машины и их определения:

(DEFUN put (at ind def) (setf (get at ind) def))
    (put 'a 'SYM '(LAMBDA () (setq st (CONS (caar st)
                   (CDR st)))
    ))
    (put 'd 'SYM '(LAMBDA () (setq st (CONS (cadar st)
                   (CDR st)))
    ))
    (put 'at 'SYM '(LAMBDA () (setq st (CONS
                   (ATOM (CAR st))
                   (CDR st)))
    ))
    (put 'co 'SYM'(LAMBDA () (setq st (CONS
                   (CONS (CAR st) (cadr st))
                   (cddr st)))
    ))
    (put 'equ 'SYM '(LAMBDA () (setq st (CONS
                   (EQ (CAR st) (cadr st))
                   (cddr st)))
    ))
    (put 'sum 'SYM '(LAMBDA () (setq st (CONS
                   (+ (CAR st) (cadr st))
                   (cddr st)))
    ))
    (put 'def 'SYM '(LAMBDA () (setq st (CONS
                   (- (CAR st) (cadr st))
                   (cddr st)))
    ))
    (put 'mlt 'SYM '(LAMBDA () (setq st (CONS
                   (* (CAR st) (cadr st))
                   (cddr st)))
    ))
 
    (put 'ldc 'SYM '(LAMBDA ()
    ; CP — продолжение программы вслед за LDC
          (setq st (CONS (CAR cp)
             st))
          (setq cp (CDR cp))
    ; CP — без константы, переданной в стек
    ))
 
    ; Определение интерпретатора машины
 
    (DEFUN secd (LAMBDA ()(cond ((null cp)
    (print "?end-of-program!"))
          ((EQ (CAR cp) 'STOP)
          (print "!normal-finish!"))
          ((get (CAR cp)'SYM)
          (command (CAR cp) (CDR cp))
          (secd))
          (T (print "?error-command!")
          (setq cp (CDR cp))
          (secd))
    )))
    (DEFUN command (LAMBDA (acp dcp) (setq cp dcp)
          (print acp)
          (apply (get acp 'SYM)'())
          (prsecd)
          (read)
    ))
 
    ; Вывод на экран состояния машины
    (DEFUN prsecd (LAMBDA()(prst)(prcp)))
    (DEFUN prst (LAMBDA ()(print (list "stack:=" st 
       ))))
    (DEFUN prcp (LAMBDA ()(print (list "control:=" cp 
       ))))
 
    ; Задание состояния машины :
    ; ST — стек
    ; CP — управляющая программа
    ; ENV — контекст
    ; DM — память для восстановления состояния
    (setq st '())
    (setq cp '(ldc 1 ldc 2 ldc 3 mlt def ldc 4 equ 
       stop ))
    (secd)
    (prsecd)
    (read)
    (system)
 
    (setq st '(a ((1 2) (4 5)) 3 6 7 8 9 11 13 12 14 
       21 25 9 1 0))
    (setq cp '(at de co at equ stop sum def mlt stop))
    (prsecd)
    (secd)
    (prsecd)
       (setq st (cddr st))
    (setq cp (CDR cp))
    (prsecd)
    (secd)
    (prsecd)
       (system)
       (apply (get 'a 'SYM)'())
    (prst)
    (setq st (CDR st))
    (apply (get 'd 'SYM)'())
    (prst)
    (setq st (CDR st))
       (apply (get 'at 'SYM)'())
    (prst)
    (setq st (CDR st))
       (apply (get 'co 'SYM)'())
    (prst)
       (apply (get 'at 'SYM)'())
    (prst)
       (setq st (CDR st))
       (setq st (CDR st))
       (apply (get 'equ 'SYM)'())
    (prst)
    (setq st (CDR st))
       (apply (get 'sum 'SYM)'())
    (prst)
    (setq st (CDR st))
       (apply (get 'def 'SYM)'())
    (prst)
       (setq st (CDR st))
       (apply (get 'mlt 'SYM)'())
    (prst)
    (setq st '(12 12 12) )
    (prst)
    (setq st (CDR st))
       (apply (get 'equ'SYM)'())
    (prst)
    (system)
< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Алина Ленкова
Алина Ленкова
Россия, Ставрополь, СФ МГУПИ, 2014
Валерий Ромашов
Валерий Ромашов
Россия