LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

После раскрытия макросов остаётся язык с функциями и http://www.lispworks.com/documentation/HyperSpec/Body/03_ababa.htm. Т.е. dotimes раскрывается, остаётся tagbody и т.п., они компилируются в такой же код, что и сишный for (чего там, можно считать, что за компиляцию for отвечает код подобный коду макроса dotimes).

CCL:

;;; (dotimes (i 10) (print i))
         (xorl (% save0.l) (% save0.l))          ;    [13]
         (jmp L48)                               ;    [16]

;;; (print i)
L18
         (movq (% save0) (% arg_z))              ;    [18]
         (movl ($ 8) (% nargs))                  ;    [21]
         (movq (@ 'PRINT (% fn)) (% temp0))      ;    [26]
         (nop)                                   ;    [33]
         (callq (@ 10 (% temp0)))                ;    [34]
         (leaq (@ (:^ L0) (% rip)) (% fn))       ;    [37]

;;; (dotimes (i 10) (print i))
         (addq ($ 8) (% save0))                  ;    [44]
L48
         (cmpq ($ 80) (% save0))                 ;    [48]
         (jl L18)                                ;    [52]

^ только вызов print навороченный, что не имеет отношения к макросам и их влиянию на оптимизации.

ECL — Кто хотел лисп, компилирующийся в C++? (комментарий).

Исходная версия quasimoto, :

После раскрытия макросов остаётся язык с функциями и http://www.lispworks.com/documentation/HyperSpec/Body/03_ababa.htm. Т.е. dotimes раскрывается, остаётся tagbody и т.п., они компилируются в такой же код, что и сишный for.

CCL:

;;; (dotimes (i 10) (print i))
         (xorl (% save0.l) (% save0.l))          ;    [13]
         (jmp L48)                               ;    [16]

;;; (print i)
L18
         (movq (% save0) (% arg_z))              ;    [18]
         (movl ($ 8) (% nargs))                  ;    [21]
         (movq (@ 'PRINT (% fn)) (% temp0))      ;    [26]
         (nop)                                   ;    [33]
         (callq (@ 10 (% temp0)))                ;    [34]
         (leaq (@ (:^ L0) (% rip)) (% fn))       ;    [37]

;;; (dotimes (i 10) (print i))
         (addq ($ 8) (% save0))                  ;    [44]
L48
         (cmpq ($ 80) (% save0))                 ;    [48]
         (jl L18)                                ;    [52]

^ только вызов print навороченный, что не имеет отношения к макросам и их влиянию на оптимизации.

ECL — Кто хотел лисп, компилирующийся в C++? (комментарий).