Herhangi bir JavaScript motoru kuyruk çağrısı (TCO) optimize edilmiş mi?


91

JavaScript'te uyguladığım ve herhangi bir (tümü?) Tarayıcının yığın taşması istisnaları alıp almayacağını bilmek istediğim bir kuyruklu yinelemeli yol bulma algoritmam var.


2
Aslında özyinelemeli bir algoritma mı yoksa özyineleme ile uygulanan yinelemeli bir algoritma mı? Anladığım kadarıyla TCO yalnızca ikincisine yardımcı olabilir.
nmichaels

1
Yalnızca TCO'nun onlybir optimizasyon olmadığını eklemek istiyorum . TCO ile bir yorumlayıcı / derleyiciye yazılan kod muhtemelen TCO'suz bir yorumlayıcı / derleyici üzerinde çalışmayacağından, bunu desteklemek, derleyici / yorumlayıcı değil, dil belirtiminin bir parçası olmalıdır.
Hoffmann

1
Kangax'ın ES6 uyumluluk tablosunda mevcut desteği görebilir ve motorlar arasında nasıl geliştiğini buradan izleyebilirsiniz
Roy Tinker

Yanıtlar:


47

ECMAScript 4 spesifikasyonu başlangıçta TCO için destek ekleyecekti, ancak bırakıldı:

JavaScript'te artık kuyruk çağrısı yok mu?

Bildiğim kadarıyla, yaygın olarak bulunabilen hiçbir JavaScript uygulaması şu anda otomatik TCO yapmıyor. Yine de bu sizin için yararlı olabilir:

Kuyruk Çağrısı Optimizasyonu

Esasen, akümülatör modelini kullanmak aynı etkiyi sağlar.


1
Bilginize, Rhino'nun "yorumlanmış" modda (opt = -1) Devamlılıklarla
Mark Porter

5
(trolling için özür dilerim) ECMAScript 6, spesifikasyona Uygun Kuyruk Çağrıları olarak adlandırılan TCO'yu dahil etmiştir.
soğuk

@sclv: Trambolin referansı nedir?
bukzor

39
Toplayıcı modeli, TCO ile aynı etkiyi sağlamaz. Yalnızca özyinelemeli algoritmaları kuyruk özyinelemeli forma dönüştürür. Bu, TCO'nun mümkün olabilmesi için bir ön koşuldur, ancak bunun yerine geçmez. Yine de, kuyruk aramalarını optimize etmeyen bir dilde yığını patlatacaksınız.
Marcelo Cantos

"Yaygın olarak bulunabilen hiçbir JS uygulaması şu anda otomatik TCO yapmaz" Bu, doğru bayrağı geçerseniz Düğüm 6.2.0'dan itibaren yanlıştır
Janus Troelsen

26

Şu an neşe yok, ancak neyse ki Harmony için uygun kuyruk aramaları planlanıyor (ECMAScript sürüm 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls


1
@MarkWilbur Soru, ECMAScript'in tüm mevcut uygulamaları değil , özellikle tarayıcılarla ilgiliydi .
Yararsız Kod

1
@UselessCode Nope, bu soru "Javascript motorları" ile ilgili, yani ... sadece tarayıcılar değil
BT

1
@BT Aslında pek çok tarayıcı olmayan JS ortamı var ve başlık daha genel "Javascript motorlarını" kullanıyor ancak sorunun gövdesi "... herhangi bir (tümü?) Tarayıcıda yığın alıp alamayacağını bilmek istiyor taşma istisnaları. "
Yararsız Kod

Karşı koymalıyım "ama başlık ..." diyor. Sanırım her ikisinden de bahsettiği için soru ikisiyle ilgili. Ama yanıtı geçersiz kılmadığını söylüyorsan haklısın.
BT

4
@MarkWilbur Bildiğim kadarıyla v8'in kromla aynı sürümünü kullanan düğüm - şu anda TCO'yu desteklemiyor JS ile bir özüm
mcfedr

12

Karşılaştığınız hemen hemen her tarayıcı "çok fazla özyineleme" yi engelleyecektir. İşte V8 hata takipçisinde muhtemelen okunması ilginç olacak bir giriş .

Basit bir kendi kendine özyineleme ise, kuyruk çağrısının ortadan kaldırılmasını ummaktansa, açık yinelemeyi kullanma çabasına muhtemelen değer.


Hata nihayet kabul edildi. Destanı altında: "Özellik İsteği Uyum". Umarım bu, V8'deki ES6 desteğine eklemeyi planladıkları anlamına gelir.
Txangel

Internet Explorer'da TCO desteğine buradan oy verebilirsiniz: wpdev.uservoice.com/forums/257854-internet-explorer-platform/…
Roy Tinker

12

Kuyruk arama optimizasyonu, gelecekte ECMAScript 6 katı modunda desteklenecektir. Ayrıntılar için http://www.2ality.com/2015/06/tail-call-optimization.html adresini kontrol edin .

Mevcut motor desteği için http://kangax.github.io/compat-table/es6/ adresini kontrol edin .

Şu anda (18-07-2019) aşağıdaki motorlar kuyruk arama optimizasyonunu desteklemektedir:

  • Safari> = 10
  • iOS> = 10
  • Kinoma XS6
  • Duktape 2.3

"deneysel JavaScript özellikleri" -işareti açıksa destek:

  • Düğüm 6.5
  • Chrome 54 / Opera 41 Uyumluluk tablosunun mevcut sürümü artık listelemiyor

3

Kuyruk çağrısı optimizasyonu artık JavaScript'te derlenen LispyScript'te mevcuttur . Bu konuda daha fazla bilgi bulabilirsiniz burada .


Karşılıklı özyineleme ne olacak?
kedi

2

Şu anda hiçbir JavaScript uygulaması kuyruk özyinelemeyi tanımıyor. Değişiklikler de yapılıyor ECMAScript'e 6 ve diğerleri söylediler, açık bir bilet var V8 .

Burada, kuyruk özyineleme işlevi için V8'in oluşturduğu assembler'ı görebilirsiniz:

V8'in özyinelemeyi nasıl derlediğine dair örnek

Bunu, Clang'ın aynı işlevi C'de nasıl derlediğiyle karşılaştırın

C derleyicisi kuyruk özyinelemesi örneği

V8 özyinelemeli çağrıyı tutarken, C derleyicisi kuyruk özyinelemesini tanıdı ve bir döngüye dönüştürdü.


"Şu anda hiçbir JS uygulaması kuyruk özyinelemeyi tanımıyor." Bu, Düğüm 6.2.0 itibariyle yanlış, ancak bir bayrağı geçmelisiniz
Janus Troelsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.