7
votes

Est-il possible de détecter l'optimisation des appels queue dans WebKit?

J'ai une fonction récursive et l'épuisement de la pile d'appels est un problème que je rencontre parfois. Je sais que je peux utiliser des ruisseaux, des promesses avec Settimeout, mais je voudrais simplement écrire du code qui déclenche une optimisation des appels de queue. Jusqu'à présent, seul WebKit semble avoir mis en œuvre une optimisation des appels de queue (TCO) . Autre que connaître la théorie, est-ce que mon code vérifie si mon code déclenchera TCO, avec DevTools ou en examinant la sortie du compilateur WebKit?


0 commentaires

3 Réponses :


1
votes

pourrait utiliser .tostring () code>, regexp.test () code> Pour vérifier retour code> Énoncé suivi de SADERSCORE, ou $ signe, AZ personnages; suivi de parenthèses ouvertes suivie de tous les caractères suivis d'une parenthèse de fermeture

p>

function forEach(arr, callback, start) {
  if (0 <= start && start < arr.length) {
    callback(arr[start], start, arr);
    return forEach(arr, callback, start + 1); // tail call
  }
}

console.log(/return [_a-z$]+\(.*\)/i.test(forEach.toString()))


2 commentaires

Clever, mais je veux savoir si le moteur JS détecte et faire du TCO, pas si le moteur JS devrait être capable de faire du TCO. Pour l'instant, le moteur JS étant JavaScriptcore.


Mais puisque Regex est amusant, voici un test de test si une fonction est récursive; / fonction ([\ w] +) (?: [^] +) retour \ 1 \ (. * \ \) / . De plus, votre regex pourrait être amélioré pour couvrir les noms de fonction avec des chiffres dans ceux-ci / retourner [\ w $] + \ (. * \ \) / . Et une version au courant de l'unicode serait / retourner [\ w $] + \ (. * \ \) / U pour es6.



0
votes

Vous pouvez toujours le faire dans la fonction récursive de la queue de chemin la plus idiote - Essayez de prendre un bloc avec des arguments «gros». Si cela jette, TCO ne fonctionne pas.


0 commentaires

6
votes

Je sais que ce n'est pas parfait, mais je pense que c'est la meilleure option que nous avons actuellement.

Considérons cette fonction: p> xxx pré>

error.stack Code> n'est pas standard, mais il dispose d'un soutien de base dans tous les navigateurs modernes. Il a des valeurs différentes dans différents navigateurs, néanmoins, quand une fonction de fonction nommée plus longue est une balance plus courte nommée, la trace de la pile: p>

  • avec TCO: devient plus court, car le cadre de pile de la fonction extérieure est remplacé par le cadre de pile de la fonction interne. li>
  • sans TCO: devient plus longtemps, car le cadre de pile de la fonction interne est annexé. Li> ul>

    à partir de maintenant, cela renvoie true code> pour Safari et false code> pour les autres navigateurs, qui est le support TCO actuel. P>

    p>

    Is TCO available? 
    <div id="result"></div>


7 commentaires

C'est très intelligent. Je veux attendre un peu avant d'accepter cette réponse. Il ne doit pas donner de faux positifs et puisque JavaScriptcore est le seul moteur avec Un support de TCO infligible TCO, il est difficile de tester.


@DotNetCarpenter Sure Thing. Faites-moi savoir comment ça marche.


@DotNetCarpenter, nœud donne une réponse positive aussi, si vous l'exécutez avec le paramètre - harmonie .


Je viens de tester cela dans le nœud 7.5.0 et 6.7.0, sans le drapeau - harmonie et les deux environnements renvoyés true pour détectent () . Dans quelle version du nœud V8 a-t-il soutenu TCO?


Wow. Il est. Je n'en avais aucune idée. Je ne peux pas sembler trouver la date de sortie.


Très intelligent en effet. Cela devrait être la réponse acceptée.


Cela revient vrai au chrome 72.