Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

200
Views
¿Cómo puedo obtener TypeScript para realizar Tail Recursion Optimization?
const isPositive = (n: number) => n > 0; function fitsIn(dividend: number, divisor: number, count: number, accum: number): number { if (accum + divisor > dividend) { return count; } return fitsIn(dividend, divisor, count + 1, accum + divisor); } function divide(dividend: number, divisor: number): number { let timesFits = fitsIn(Math.abs(dividend), Math.abs(divisor), 0, 0); return isPositive(dividend) === isPositive(divisor) ? timesFits : -timesFits; } console.log(divide(10, 3)); // 3 console.log(divide(-2147483648, -1)); // RangeError: Maximum call stack size exceeded console.log(divide(10000, 1)); // RangeError: Maximum call stack size exceeded

Intenté ejecutar este código con TypeScript 4.6.2 en modo estricto y provocó que la pila se desbordara. La llamada recursiva está al final de la función y la acumulación se realiza dentro de las llamadas de funciones recursivas. ¿No debería optimizarse este código para la recursión de cola? ¿Qué se debe cambiar para que se produzca la optimización de recursión de cola?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

TypeScript no optimiza las funciones recursivas llamadas colas. Consulte microsoft/TypeScript#32743 para obtener una respuesta autorizada.

Por lo general, el término "optimización de llamada de cola" en JavaScript denota la reescritura de una función recursiva de cola a una versión iterativa. Esto difiere un poco de la "eliminación de llamada final", que generalmente significa mantener la recursividad pero reescribir el marco de pila actual en lugar de insertar uno nuevo en la pila. Ambos se comportan de manera similar desde el exterior si lo único que le importa es el crecimiento de la pila, pero la optimización de llamadas de cola generalmente ocurre en un nivel de abstracción más alto que la eliminación de llamadas de cola.


Si está sugiriendo que TypeScript implemente la optimización de llamadas de cola como una mejora del rendimiento, eso no es algo que encaje con los objetivos de diseño de TypeScript . En términos generales, si escribe un código que es JavaScript sintácticamente correcto para su entorno de tiempo de ejecución de destino, el compilador emitirá ese código tal cual. No se supone que TypeScript optimice su JavaScript, solo emita. Así que no hay posibilidad de que haga esto por sí mismo.


Por otro lado, es posible que esté hablando de la eliminación de llamadas de cola adecuada , como se introdujo en la especificación ECMAScript 2015 (ES2015/ES6). Esta función se diseñó para que los motores de tiempo de ejecución de JavaScript detectaran las llamadas finales y no se agregaran a la pila de llamadas en tales casos.

Esta característica nunca fue ampliamente adoptada; actualmente solo los navegadores basados en Safari parecen hacer esto consistentemente.

Cuando los diseñadores de motores de tiempo de ejecución buscaron implementar esto, se encontraron con problemas con una posible degradación del rendimiento, confusión del desarrollador, etc. Consulte esta publicación de blog V8, por ejemplo. La mayoría de los motores de tiempo de ejecución parecen haber optado por un enfoque de "esperar y ver" para obtener una versión más deseable de esto, como una sintaxis para optar explícitamente por dicha eliminación. Y la única propuesta notable para tal sintaxis ha estado "inactiva" durante años. Entonces parece que la parte de "esperar" de "esperar y ver" podría durar para siempre.

Si bien sería posible que TypeScript rebaje el nivel adecuado de la eliminación de llamadas de cola a algo como la optimización de llamadas de cola, es probable que se encuentre con los mismos problemas y se han negado a hacerlo.


Para bien o para mal, parece que la eliminación automática de llamadas de cola es una característica muerta de facto, y TypeScript no la va a revivir para nosotros.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!