O que significa "código aberto" algo em comum?
no manual de utilizador do SBCL existem várias referências ao Termo "código aberto". Hackers comuns Lisp também usam este termo quando se referem a otimização de código.
Pode explicar o que significa "código aberto" e dar um exemplo de como funciona?1 answers
O que
Código aberto, também conhecido por inlining , significa substituir as chamadas de funções por um conjunto incorporado.
A ideia é que funcall
é caro (requer poupança e restauração da pilha &C) e substituí-lo pelas poucas operações que constituem a função pode ser benéfica.
Por exemplo, a função 1+
é uma única instrução quando o argumento é um fixnum (que normalmente é na prática), de modo a transformar a funcall nos dois ramos paralelos (fixnum
e caso contrário) seria uma vitória.
Controlo
Declarações
O utilizador pode controlar esta optimização explicitamente pelo inline
declaração.
O Utilizador também pode influenciar esta optimização pela optimize
declaração.
Ambos irão afectar o código de uma função definida apenas como uma função (ver abaixo).
Macros
A maneira "velha" é implementar a função como uma macro. Por exemplo, em vez disso de
(defun last1f (list)
(car (last list)))
Escreve
(defmacro last1m (list)
`(car (last ,list)))
E last1m
estarão sempre em código aberto. O problema com esta abordagem é que você não pode usar last1m
como uma função - você não pode passá-la para, digamos, mapcar
.
Thus Common Lisp has an alternative way - compiler macros , which tell the compiler how to transform the form before compiling it:
(define-compiler-macro last1f (list)
`(car (last ,list)))
Veja também os excelentes exemplos na página do CLHS.