เหตุใดจึงมีการมอบหมายให้ใช้แบบคงที่เดียวมากกว่ารูปแบบการส่งผ่านต่อเนื่องในคอมไพเลอร์ที่ใช้ในอุตสาหกรรมจำนวนมาก?


16

ตามหน้า Wikipedia เกี่ยวกับการกำหนดค่าคงที่เดียว (SSA) , SSA ถูกใช้โดยโครงการขนาดใหญ่และเป็นที่รู้จักเช่น LLVM, GCC, MSVC, Mono, Dalvik, SpiderMonkey และ V8 ในขณะที่หน้าโครงการที่ใช้รูปแบบการส่งต่อ (CPS)ขาดการเปรียบเทียบเล็กน้อย

ฉันมีความเห็นว่า CPS เป็นที่ต้องการโดยผู้รวบรวมและล่ามที่ใช้ภาษาที่ใช้งานได้เป็นหลักโดยเฉพาะ Haskell และ Scheme ดูเหมือนจะมีความโน้มเอียงอย่างมากต่อรูปแบบ CPS เนื่องจากข้อ จำกัด เรื่องการกลายพันธุ์หรือความต้องการการสนับสนุนต่อเนื่องชั้นหนึ่ง Smalltalk นั้นอาจจะต้องการสิ่งนี้เช่นกัน) วรรณกรรมสำคัญที่ฉันพบว่าใช้ CPS ดูเหมือนว่าจะเป็นงานที่เกี่ยวกับ Scheme หรือเกี่ยวข้องกับ Scheme ในบางประเด็น

มีเหตุผลใดที่ทำให้ SSA ถูกนำไปใช้ในอุตสาหกรรมนอกเหนือจากแรงผลักดันในการยอมรับ? SSA และ CPS มีความสัมพันธ์ใกล้ชิด นั่นหมายความว่ามันจะง่ายต่อการระบุในแง่อื่น แต่บางทีการแสดงข้อมูลจะมีขนาดเล็กลงหรือมีประสิทธิภาพน้อยกว่าสำหรับ CPS


3
IIRC เป็นการเพิ่มประสิทธิภาพแบบดั้งเดิมสำหรับภาษาที่จำเป็นซึ่งได้รับการออกแบบในยุคของการวิเคราะห์ดาต้าโฟลว์แบบดั้งเดิมที่ถ่ายโอนไปยังฟอร์ม SSA ได้ง่ายกว่า CPS .. โดยเฉพาะโซ่การใช้งานและ def-use ความเฉื่อยนับบางสิ่งบางอย่าง
นามแฝง

คำตอบ:


9

ฉันคิดว่าผู้ใช้งานคอมไพเลอร์จำนวนมากสำหรับภาษาที่จำเป็นทั่วไปนั้นไม่คุ้นเคยกับเทคนิคการรวบรวมโดยใช้ 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 (ซึ่งพวกเขากำหนด) สำหรับภาษาที่ไม่มีตัวควบคุมควบคุม


2
มันไม่นานมานี้ตั้งแต่คำตอบเริ่มต้น แต่ฉันรู้สึกดีพอที่จะยอมรับคำตอบเพราะฉันเข้าใจมากกว่า 10% ...
CinchBlue

2

ฉันไม่ใช่ผู้เชี่ยวชาญด้านคอมไพเลอร์ดังนั้นให้พูดสิ่งที่ฉันพูดด้วยเกลือเม็ดหนึ่งฉันหวังว่าผู้เชี่ยวชาญตัวแปลภาษาตัวจริงจะตีระฆังฉันได้รับการบอกว่า:

  • รหัส CPSed มีแนวโน้มที่จะข้ามไปมากที่ไม่ใช่ในท้องถิ่นซึ่งทำลายสถานที่แคชดังนั้นประสิทธิภาพ
  • CPS ต้องการการรวบรวมขยะที่มีราคาแพงกว่าการคอมไพล์ทั่วไปซึ่งโดยทั่วไปสามารถจัดเก็บข้อมูลจำนวนมากบนสแต็ก (ซึ่งเร็วกว่าในการจัดสรรและยกเลิกการจัดสรรคืน)

ทั้งสมคบคิดกับการสร้างโค้ดที่คอมไพล์โดย CPS-transform ค่อนข้างช้า


3
ฉันคิดว่าคุณกำลังผสมซอร์สโค้ด CPS ที่แปลงสภาพ(หรือการแปลงซอร์สไปยังซอร์ส) ด้วยการใช้ CPS และภาษาระดับกลาง สมมติว่าภาษาที่คุณป้อนไม่รองรับเอฟเฟกต์การควบคุมอย่างเช่นcall/ccจะใช้การต่อเนื่องกับระเบียบวินัย - ไม่ต้องมีตัวเก็บขยะ กราฟดังนั้นจะไม่มีการกระโดดพิเศษใด ๆ คุณไม่จำเป็นต้องใช้การดำเนินการต่อโดยใช้การใช้งานทั่วไปของฟังก์ชั่นการสั่งซื้อที่สูงขึ้น
Derek Elkins ออกจาก SE

@DerekElkins ไม่ชัดเจนสำหรับฉันในสิ่งที่ OP ถาม
Martin Berger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.