Endüstride kullanılan birçok derleyicide devam eden geçiş stiline göre neden statik-tekli atama tercih edilir?


16

Statik-tek atama (SSA) hakkındaki Wikipedia sayfasına göre , SSA, LLVM, GCC, MSVC, Mono, Dalvik, SpiderMonkey ve V8 gibi büyük ve iyi bilinen projeler tarafından kullanılırken, devam eden stili kullanan projelerdeki sayfa (CPS) karşılaştırıldığında biraz eksik.

CPS'nin öncelikle işlevsel dilleri uygulayan derleyiciler ve tercümanlar tarafından tercih edildiğini düşünüyorum - özellikle Haskell ve Scheme, mutasyon kısıtlamaları veya birinci sınıf devam desteğine duyulan ihtiyaç nedeniyle CPS stiline karşı güçlü eğilimlere sahip gibi görünüyor (sanırım Smalltalk'ın buna da ihtiyacı olacaktır). CPS kullanan karşılaştığım başlıca literatür, öncelikle Şema üzerinde çalışan veya bir açıdan Şema ile ilgili olanlar gibi görünüyor.

SSA'nın benimsenme momentumunun yanı sıra endüstride kullanılmasının belirli bir nedeni var mı? SSA ve CPS'nin yakın bir ilişkisi vardır; bu, bir başkası açısından belirtmenin kolay olacağı anlamına gelir, ancak belki de bilgi gösterimi CPS için daha az kompakt veya daha az verimli olacaktır.


3
IIRC, geleneksel veri akışı analizi günlerinde tasarlanan zorunlu diller için geleneksel optimizasyonlar SSA formuna CPS'ye daha kolay aktarılır. Özellikle, kullanım-def ve def-kullanım zincirleri SSA temsilini doğrudan "okuyabilir". Atalet bir şey için sayılır
Pseudonym

Yanıtlar:


9

Tipik zorunluluk dilleri için birçok derleyici uygulayıcının CPS ve CPS tabanlı derleme tekniklerine aşina olmadığına inanıyorum. İşlevsel programlama topluluğunda hem CPS hem de CPS tabanlı derleme çok iyi bilinen tekniklerdir - Guy Steele'nin çalışmasından ikincisi. Bununla birlikte, FP topluluğunda bile, dilin kendisi gibi kontrol operatörlerini desteklemediği sürece, derleyicilerin çoğu derleme için CPS tabanlı teknikleri kullanmaz call/cc. Daha fazla gibi bir şey İdari Normal Form (bazen olarak anılacaktır (ANF) Monadik Normal Form yakından belli olacak nedenlerden dolayı ilişkilidir) olan kullanılır CPS yaptığından daha SSA daha sıkı bir ilişki .

Doğru hatırlıyorsam, yönetim normal formu adını CPS tabanlı derleme ara kodda kaynak kodunda hiçbir şeye karşılık gelmeyen beta-redexes yol açabilir gerçeğinden alır. Bunlar "idari redeksler" olarak adlandırıldı. Bunlar derleme zamanında azaltılabilir, ancak ilk etapta yönetim redeksleri olmadan kod çıkaracak bir CPS dönüşümü gerçekleştirme konusunda iyi bir araştırma vardı. Daha sonra amaç, tüm "idari" redekslerin azaltıldığı normal bir formda çıktı üretmekti ve bu İdari Normal Formun kaynağıydı. Bunu iki aşamalı bir süreç (n optimizasyonu) olarak görmenin pek bir yararı olmadığını anlamak uzun sürmedi: CPS dönüşümü, yönetimsel redeksleri azaltın. Özellikle, idari normal form, özellikle Haskell'de (elle) uygulandığı gibi monadik stile benziyor. CPS dönüşümü, sadece CPS monadını kullandığınız monadik stile bir dönüşüm olarak anlaşılabilir (bu nedenle farklı değerlendirme siparişlerine karşılık gelen monadik stile "dönüştürmenin" gerçekten çok yolu vardır). Bununla birlikte, genel olarak, oldukça farklı bir monad kullanıyor olabilirsiniz ve bu nedenle monadik stile ve dolayısıyla idari normal forma dönüşüm özellikle CPS ile gerçekten ilişkili değildir.

Bununla birlikte, ANF'ye karşı CPS'nin bazı faydaları vardı. Özellikle, beta azaltma gibi ANF için (görünüşte) geçici kurallar gerektiren standart optimizasyonlarla CPS'de yapabileceğiniz bazı optimizasyonlar vardı. Monadik açıdan bakıldığında, bu kurallar işe gidip gelme dönüşümlerine karşılık gelir. Sonuç olarak, hangi kuralların ekleneceğini ve nedenini açıklayabilecek bir teori var. Bir son kağıt (mantıksal açıdan) bu bir (yeni ve) oldukça net bir açıklama verir ve ilgili çalışma bölümü Bahsetmek konularda literatürüne bir kısa ama bir iyi anket ve referanslar olarak hizmet vermektedir.

CPS ile ilgili sorun ana faydalarından birine bağlıdır. CPS dönüşümü, gibi kontrol operatörlerini uygulamanıza izin verir call/cc, ancak bu, CPS ara kodundaki yerel olmayan her işlev çağrısının potansiyel olarak performans gösteren kontrol efektleri olarak ele alınması gerektiği anlamına gelir. Dilinizde kontrol operatörleri varsa, bu olması gerektiği gibi (o zaman bile çoğu işlev muhtemelen herhangi bir kontrol parlaklığı yapmıyor). Dil ise gelmez kontrol operatörleri dahil ederseniz lokal belirgin olmayan devamlılık gösteren kullanımına ilişkin küresel değişmezleri vardır. Bu, özellikle iyi davranılmış CPS kullanımı üzerinde sağlam bir ses olan genel CPS kodunda gerçekleştirilmesi uygun olmayan optimizasyonlar olduğu anlamına gelir. Bunun tezahür etmesinin bir yoluveri hassasiyeti ve kontrol akış analizlerindeki değişim . (CPS dönüşümü, bazı şekillerde yardımcı olur, başkalarında acı verir, ancak yardımcı olduğu yollar, çoğunlukla CPS yönünün kendisinden ziyade çoğaltmadan kaynaklanmaktadır.) 1 Elbette, bunu telafi etmek için kurallar ekleyebilir ve analizleri ayarlayabilirsiniz (yani, sömürmek için) küresel değişmezler), ancak daha sonra CPS tabanlı derlemenin en önemli avantajlarından birini kısmen yendiniz; bu, görünüşte özel amaçlı, ad-hoc optimizasyonların genel amaçlı optimizasyonun (özellikle beta azaltma) özel durumları haline gelmesidir. ).

Sonuçta, dilinizde kontrol operatörleri yoksa, CPS tabanlı bir derleme şeması kullanmak için genellikle fazla bir neden yoktur. Yukarıda bahsettiğim sorunları telafi ettikten sonra, genellikle CPS tabanlı derlemenin faydalarını ortadan kaldırdınız ve CPS kullanmamaya eşdeğer bir şey ürettiniz. Bu noktada, CPS çok fazla fayda sağlamak için kıvrık görünümlü ara kod yapıyor. 2007'den itibaren CPS tabanlı derleme argümanı bu sorunların bazılarını ele alır ve farklı bir CPS dönüşümü biçimi kullanarak başka avantajlar sunar. Kağıdın ortaya çıkardığı şeyler kısmen daha önce bahsettiğim (2017) makalesi tarafından kapsanmaktadır .

1 SSA ve CPS arasındaki denklik bunu daha fazla veya daha az imkansız hale getirmiyor mu? Hayır ilk şeylerden biri bu denklik tanıtan kağıt durumlarını denklik yapmasıdır değil için çalışma keyfi CPS kodu, ama bir dil için (bunlar tanımladığımız) dönüşümü bir CPS çıkışı için çalışır olmadan kontrol operatörleri.


2
İlk cevaptan bu yana biraz zaman geçti ama sonunda cevabı kabul edecek kadar iyi hissediyorum çünkü% 10'dan fazla anlıyorum ...
CinchBlue

2

Bir derleyici uzmanı değilim, bu yüzden söylediklerimi bir tuz tanesi ile al, umarım gerçek bir derleyici uzmanı devreye girer.

  • CPSed kodu önbellek yerini, dolayısıyla performansı bozan yerel olmayan bir çok atlama eğilimindedir.
  • CPS, tipik olarak yığın üzerinde çok fazla şey depolayabilen (tahsis edilmesi ve yeniden ayrılması daha hızlı olan) geleneksel derlemeden daha pahalı çöp toplama gerektirir.

Her ikisi de CPS dönüşümü tarafından derlenen kodu nispeten yavaş hale getirmeye çalışır.


3
Bence bir ara dil CPS kullanarak CPS dönüştürülmüş kaynak kodu (veya bir kaynaktan-kaynağa dönüşüm) karıştırıyorsunuz . Giriş dilinizin kontrol efektlerini desteklemediğini varsayarsak, örneğin, devamlar bir yığın disiplini ile kullanılacaktır - çöp toplayıcısına gerek olmayacak ve devamlar kontrol akışının kenarlarına az çok karşılık gelecektir. ek atlama olmayacak. Süreklilikleri üst düzey işlevlerin genel amaçlı bazı uygulamalarını kullanarak uygulamanız gerekmez. call/cc
Derek Elkins SE

@DerekElkins Bana OP'nin ne istediğini açık değildi.
Martin Berger
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.