Pregunta

La gente dice que la implementación de clojure es excelente, aparte de la limitación de no tener una optimización de llamada de cola, una limitación de la implementación de jvm, no de clojure.

http://lambda-the-ultimate.org/node/2547

Se ha dicho que implementar TCO en Python sacrificaría

  • volcados de seguimiento de pila y
  • regularidad de depuración.

Explícame cuál es el gran problema con la optimización de llamadas de cola y por qué Python lo necesita

¿Deberían hacerse los mismos sacrificios para una implementación jvm de TCO? ¿Tendría que sacrificarse algo más?

¿Fue útil?

Solución

Si bien es diferente (ya que las instrucciones il ya existían) vale la pena señalar el esfuerzo adicional que .Net El equipo JIT de 64 bits tuvo que pasar para respetar todas las llamadas de cola.

Llamo en particular el comentario:

  

El inconveniente, por supuesto, es que si tiene que depurar o perfilar un código optimizado, prepárese para lidiar con las pilas de llamadas que parecen faltar algunos fotogramas.

Creo que es muy poco probable que la JVM pueda evitar esto tampoco.

Dado que, en circunstancias en las que se solicitó una optimización de llamada de cola, el JIT debería asumir que es requerido para evitar un desbordamiento de la pila, esto no es algo que simplemente se puede desactivar en las compilaciones de depuración. No son muy útiles para la depuración si se bloquean antes de llegar a la parte interesante. La "optimización" es, de hecho, una característica permanente y un problema para los seguimientos de pila afectados por ella.

Vale la pena señalar que cualquier optimización que evite crear un marco de pila real cuando se realiza una operación que el programador describe / entiende conceptualmente como una operación de pila (por ejemplo, llamar a una función) provocará una desconexión entre lo que se presenta al usuario al depurar / proporcionar el seguimiento de la pila y la realidad.
Esto es inevitable ya que el código que describe la operación se separa cada vez más de la mecánica de la máquina de estado que realiza la operación.

Otros consejos

El trabajo está en curso ahora para agregar llamadas de cola a la JVM. Hay una página wiki que habla sobre algunos detalles.

Sí, por lo general, la implementación de TCO evitará que obtenga rastros completos de la pila. Esto es inevitable porque el objetivo de TCO es evitar crear marcos de pila adicionales.

También vale la pena notar que Clojure tiene un "recurrir" que no consume pila. función para sortear esta restricción en las versiones actuales de JVM.

Ejemplo:

(defn triangle [n accumulator] 
  (if 
    (<= n 0)  
      accumulator
      (recur (dec n) (+ n accumulator))))

(triangle 1000000 0)

=> 500000500000     (note stack does not explode here!)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top