ฉันคิดว่าผู้ใช้งานคอมไพเลอร์จำนวนมากสำหรับภาษาที่จำเป็นทั่วไปนั้นไม่คุ้นเคยกับเทคนิคการรวบรวมโดยใช้ CPS และ CPS ในชุมชนการเขียนโปรแกรมการทำงานทั้งการรวบรวม CPS และ CPS เป็นเทคนิคที่รู้จักกันดี - หลังจากการทำงานของ Guy Steele อย่างไรก็ตามแม้จะอยู่ในชุมชน FP คอมไพเลอร์ส่วนใหญ่ไม่ได้ใช้เทคนิค CPS-based call/cc
สำหรับการรวบรวมเว้นแต่ภาษาตัวเองสนับสนุนผู้ประกอบการควบคุมเช่น บางสิ่งบางอย่างมากขึ้นเช่นการบริหารปกติแบบฟอร์ม (ANF) (บางครั้งเรียกว่าเอกปกติในแบบฟอร์มที่เกี่ยวข้องอย่างใกล้ชิดด้วยเหตุผลที่จะกลายเป็นที่ชัดเจน) ถูกนำมาใช้ซึ่งมีความสัมพันธ์ที่แนบแน่นยิ่งขึ้นไปกว่า SSA CPS ไม่
ถ้าฉันจำได้อย่างถูกต้องรูปแบบปกติของผู้ดูแลระบบจะได้รับชื่อจากข้อเท็จจริงที่ว่าการรวบรวมโดยใช้ CPS สามารถนำไปสู่เบต้า - เรกซ์ในรหัสกลางที่ไม่สอดคล้องกับสิ่งใดในซอร์สโค้ด สิ่งเหล่านี้เรียกว่า "การบริหาร redexes" สิ่งเหล่านี้สามารถลดลงได้ในเวลาคอมไพล์ แต่มีงานวิจัยจำนวนมากเกี่ยวกับการแปลง CPS ที่จะเอาท์พุทโค้ดโดยไม่มีการจัดการ redexes ในตอนแรก เป้าหมายคือเพื่อผลิตผลลัพธ์ในรูปแบบปกติที่ redexes "การบริหาร" ทั้งหมดลดลงและนี่คือที่มาของฟอร์ม Normal Administrative ใช้เวลาไม่นานในการรู้ว่าไม่มีประโยชน์มากมายในการดูสิ่งนี้เป็นกระบวนการสองขั้นตอน (การเพิ่มประสิทธิภาพ n) กระบวนการ: การแปลง CPS ลดการใช้ redexes โดยเฉพาะอย่างยิ่ง, รูปแบบการบริหารแบบปกติดูเหมือนจะเป็นแบบ monadic ที่ฝึกฝน (ด้วยมือ) ที่สะดุดตาที่สุดใน Haskell การแปลง CPS นั้นสามารถเข้าใจได้ว่าเป็นการแปลงเป็นแบบ monadic ซึ่งคุณเพิ่งจะใช้กับ CPS monad (ดังนั้นจึงมีหลายวิธีในการ "แปลง" เป็น monadic-style ที่สอดคล้องกับคำสั่งประเมินที่แตกต่างกัน) โดยทั่วไปแล้วคุณสามารถใช้ monad ที่แตกต่างกันมากดังนั้นการแปลงเป็น monadic-style ดังนั้นรูปแบบการดูแลระบบทั่วไปจึงไม่เกี่ยวข้องกับ CPS โดยเฉพาะ
อย่างไรก็ตามมีประโยชน์บางอย่างกับ CPS เมื่อเทียบกับ ANF โดยเฉพาะอย่างยิ่งมีการเพิ่มประสิทธิภาพบางอย่างที่คุณสามารถทำได้ใน CPS ด้วยการปรับมาตรฐานเพียงอย่างเดียวเช่นการลดเบต้าซึ่งต้องมีกฎ Ad-hoc สำหรับ ad-hoc (ดูเหมือน) จากมุมมองของ monadic กฎเหล่านี้สอดคล้องกับการแปลง ผลที่สุดคือตอนนี้มีทฤษฎีที่สามารถอธิบายว่าควรเพิ่มกฎใดและทำไม กระดาษที่ผ่านมาให้ (ใหม่และ) คำอธิบายที่ชัดเจนสวยนี้ (จากมุมมองเชิงตรรกะ) และส่วนงานที่เกี่ยวข้องทำหน้าที่เป็นสั้น ๆ แต่ดีจากการสำรวจและการอ้างอิงวรรณกรรมในหัวข้อที่ผมพูดถึง
ปัญหาเกี่ยวกับ CPS นั้นเชื่อมโยงกับหนึ่งในผลประโยชน์หลักของมัน การแปลง CPS ช่วยให้คุณสามารถนำโอเปอเรเตอร์การควบคุมเช่นcall/cc
นี้ไปใช้ซึ่งหมายความว่าการเรียกใช้ฟังก์ชันที่ไม่ใช่ท้องถิ่นในรหัสสื่อกลาง CPS จะต้องได้รับการปฏิบัติเหมือนเป็นการควบคุมผล หากภาษาของคุณมีโอเปอเรเตอร์การควบคุมนี่ก็เป็นไปตามที่ควรจะเป็น (ถึงแม้ว่าฟังก์ชั่นส่วนใหญ่อาจไม่ได้ใช้การควบคุมแบบเซียนนิแกน) หากภาษาของคุณไม่รวมถึงผู้ควบคุมการใช้งานก็มีค่าคงที่ทั่วโลกในการใช้การต่อเนื่องที่ไม่ชัดเจนในพื้นที่ ซึ่งหมายความว่ามีการเพิ่มประสิทธิภาพที่ไม่น่าพึงพอใจที่จะดำเนินการกับรหัส CPS ทั่วไปที่จะให้เสียงดีในการใช้งาน CPS ที่มีความประพฤติดี วิธีหนึ่งที่ปรากฏอยู่นี้การเปลี่ยนแปลงในความแม่นยำของข้อมูลและการวิเคราะห์การควบคุมการไหล (การแปลง CPS ช่วยในบางวิธี, เจ็บในอื่น ๆ , แต่วิธีที่ช่วยได้ส่วนใหญ่มาจากการทำซ้ำมากกว่าด้าน CPS เอง) 1 แน่นอนคุณสามารถเพิ่มกฎและปรับการวิเคราะห์เพื่อชดเชยนี้ (เช่นการใช้ประโยชน์ ค่าคงที่ทั่วโลก) แต่จากนั้นคุณได้พ่ายแพ้บางส่วนหนึ่งในผลประโยชน์ที่สำคัญของการรวบรวมโดยใช้ CPS ซึ่งมีวัตถุประสงค์พิเศษมากมาย (ดูเหมือน) การเพิ่มประสิทธิภาพ Ad-hoc กลายเป็นกรณีพิเศษของการเพิ่มประสิทธิภาพทั่วไป (โดยเฉพาะการลดเบต้า )
ท้ายที่สุดยกเว้นว่าภาษาของคุณมีผู้ควบคุมระบบมักไม่มีเหตุผลมากนักที่จะใช้รูปแบบการคอมไพล์ด้วย CPS เมื่อคุณชดเชยปัญหาที่ฉันกล่าวถึงข้างต้นโดยทั่วไปแล้วคุณได้ตัดประโยชน์ของการคอมไพล์ที่ใช้ CPS และสร้างบางสิ่งที่เทียบเท่ากับการไม่ใช้ CPS ณ จุดนี้ CPS กำลังทำโค้ดระดับกลางที่ซับซ้อนเพื่อผลประโยชน์ไม่มากนัก อาร์กิวเมนต์สำหรับการคอมไพล์ที่ใช้ CPSจากปี 2007 จะจัดการกับปัญหาเหล่านี้และนำเสนอผลประโยชน์อื่น ๆ โดยใช้การแปลง CPS ในรูปแบบอื่น สิ่งที่กระดาษนำมาขึ้นอยู่กับบางส่วนโดยกระดาษ (2017) ที่ฉันกล่าวถึงก่อนหน้านี้
1 ความไม่เท่าเทียมกันระหว่าง SSA และ CPS ทำให้สิ่งนี้เป็นไปไม่ได้มากขึ้นหรือน้อยลง? ไม่หนึ่งในสิ่งแรก ๆที่กระดาษที่นำเสนอสถานะความเท่าเทียมนี้คือความไม่เท่าเทียมกันไม่สามารถใช้กับรหัส CPS ตามอำเภอใจแต่มันทำงานได้กับเอาต์พุตของการแปลง CPS (ซึ่งพวกเขากำหนด) สำหรับภาษาที่ไม่มีตัวควบคุมควบคุม