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.