การเรียก / cc ของ Scheme สามารถใช้โครงสร้างการไหลของการควบคุมที่รู้จักทั้งหมดได้หรือไม่


13

หน้า"แผนการขั้นสูง: บาง Naughty Bits"ระบุ:

Continuations เป็นโครงสร้างการควบคุมการไหลที่ทรงพลังซึ่ง อาจมีโครงสร้างการไหลของการควบคุม [... ] อื่นเกือบ

ผมคิดว่าโครงการของcall/ccถูกที่เกี่ยวข้อง (*) ปีเตอร์ร่อนลงของผู้ประกอบการเจสามารถนำมาใช้ในการดำเนินการใด ๆโครงสร้างการควบคุมการไหลที่รู้จักกัน?

ด้วย "โครงสร้างการควบคุมการไหล" ฉันกำลังคิดถึงคำอธิบายของวิกิพีเดียเป็นพิเศษเช่นข้อยกเว้น coroutines เธรดสีเขียวและอื่น ๆ

มีตัวอย่างของโครงสร้างการควบคุมการไหลที่ไม่สามารถนำไปใช้งานได้call/ccหรือไม่?

(*) ฉันไม่สามารถที่จะขุดกระดาษใด ๆ ที่ระบุว่าcall/ccมีประสิทธิภาพเท่ากับตัวดำเนินการ J บทความโดย Felleisen (ซึ่งฉันไม่ได้อ่านและยอมรับว่ามีปัญหาในการทำความเข้าใจอย่างเต็มที่) ตรวจสอบเรื่องนี้และดูเหมือนจะสรุปได้ว่าถึงแม้ว่าพวกเขาจะอยู่ในชั้นเรียนที่มีความซับซ้อนแตกต่างกันก็ตาม

(โปรดทราบว่าฉันได้อัปเดตคำถามตามความคิดเห็นด้านล่าง)

ปรับปรุง

จากคำตอบที่ยอดเยี่ยมโดย @Neel ด้านล่างฉันได้ดูไซต์ที่แสดงความคิดเห็นเกี่ยวกับความต่อเนื่องที่คั่นและไม่ จำกัดและดูเหมือนว่าในขณะที่การcall/ccไม่ถูก จำกัด นั้นไม่เพียงพอ ในขณะที่ชั้นแรกที่คั่นต (ชอบshift/reset) สามารถนำมาใช้ดูเหมือนว่าจะแสดงโครงสร้างการควบคุมการไหลใด ๆ


5
คำจำกัดความที่เป็นทางการของ "โครงสร้างการไหลของการควบคุม" คืออะไร?
Huck Bennett

4
Re: การเชื่อมต่อที่ไม่ถูก จำกัด คุณอ่านบทความที่อ้างถึงโดย Hayo Thielecke หรือไม่? การเรียกร้องที่เกิดขึ้นจริงคือการที่ต undelimited ให้เป็นไปตามcall/ccที่ไม่สามารถแสดงข้อยกเว้นในกรณีที่ไม่มีของรัฐ ( ณ Thielecke ไปในการชี้ให้เห็นข้อยกเว้นสามารถดำเนินการโดยผ่านรอบสองตหนึ่งสำหรับโปรแกรมและอื่น ๆ สำหรับการจัดการข้อยกเว้น แต่ที่ต้องมีมากกว่าเพียงแค่call/cc.)
RICI

@Rici: ฉันอ่านแค่สองสามหน้าแรกเท่านั้น (การอ่านกระดาษต้องใช้เวลานาน ) ขอบคุณสำหรับความคิดเห็น!
csl

@ HuckBennett ฉันไม่มีคำจำกัดความที่เป็นทางการ แต่อย่างไม่เป็นทางการฉันหมายถึงสิ่งที่อธิบายไว้ที่en.wikipedia.org/wiki/Control_flow - โดยเฉพาะฉันหมายความว่าคุณสามารถใช้การดำเนินการต่อเพื่อแสดง เธรดสีเขียว, ข้อยกเว้น, คำสั่งambescape, -operator และอื่น ๆ
csl

2
@csl นอกเหนือจากการทำให้แม่นยำยิ่งขึ้นว่า "โครงสร้างการไหลของการควบคุม" หมายถึงอะไรคุณต้องมีความชัดเจนมากขึ้นในการ "แสดง" สิ่งที่มีความหมาย นี่เป็นปัญหาที่ยากและคำตอบสำหรับคำถามของคุณขึ้นอยู่กับสิ่งที่คุณนับว่าแสดงออก ท้ายที่สุดคุณสามารถเขียนรหัสเครื่องทัวริงซึ่งเข้ารหัสล่ามภาษาที่มีข้อยกเว้น (เช่น Java) แต่นั่นอาจไม่ใช่สิ่งที่คุณมีอยู่ในใจดังนั้นคุณจำเป็นต้องมีข้อ จำกัด ที่แข็งแกร่งในแนวคิดของ "การแสดงออก" (เช่นการจัดองค์ประกอบและ / หรือนามธรรมเต็ม)
Martin Berger

คำตอบ:


11

ในคำตอบนี้ผมจะใช้เวลา "แสดงออก" หมายถึง "มหภาคแสดงออก" ในความรู้สึกของ Felleisen 1991 บนแสดงออกพลังของภาษาการเขียนโปรแกรม (อย่างสังหรณ์ใจคุณลักษณะภาษาสามารถแสดงออกได้อย่างชัดเจนถ้าคุณสามารถกำหนดให้มันเป็นการแปลงที่มาในท้องถิ่นโดยไม่ต้องใช้การแปลงทั้งโปรแกรม)

ด้วยคำจำกัดความนี้คำตอบคือไม่ : ตัวควบคุมที่มีการคั่นไม่สามารถแสดงได้ในแมโครในแลมบ์ดา - แคลคูลัส + การโทร / ซีซี ในการแสดงตัวดำเนินการควบคุมที่ใช้ตัวคั่นโดยใช้การเรียก / cc ในการใช้ตัวคั่นควบคุม (ส่วนรีเซ็ตของกะ / รีเซ็ต) คุณต้องมีสถานะบางอย่างเพื่อจำลองเครื่องหมายต่อเนื่องเพื่อเข้ารหัสสแต็กเพื่อจำลองอายุการใช้งานแบบไดนามิกของเครื่องหมายต่อเนื่อง

อย่างไรก็ตามการควบคุมแบบคั่นมีผลสากลในแง่ต่อไปนี้ ของเขาในวิทยานิพนธ์ปริญญาเอก , Andrzej Filinskiแสดงให้เห็นว่ามีผลข้างเคียงใด ๆ แสดงออกเป็น encodable ใช้ตคั่นอย่างใดอย่างหนึ่งหรือโทร / ซีซีและเซลล์เดียวของรัฐ โดยประมาณ "เอฟเฟ็กต์ที่แสดงออกได้อย่างชัดเจน" คือเอฟเฟกต์ใด ๆ ที่ประเภท monadic สามารถกำหนดได้ในรูปแบบของภาษาการเขียนโปรแกรม

น่าแปลกที่ความคิดนี้ดูเหมือนจะน่าสนใจทีเดียวในทางปฏิบัติ ในทศวรรษที่ผ่านมากอร์ดอนพล็อตคินและจอห์นพาวเวอร์ได้สนับสนุนแนวคิดเกี่ยวกับทฤษฎีทางเอฟเฟกต์เชิงพีชคณิตเกี่ยวกับพีชคณิต : แนวคิดคือคุณต้องระบุการดำเนินการด้านผลกระทบที่คุณสนใจและสมการที่คุณคาดหวัง คุณสามารถได้รับความหมายโดยทั่วไปโดยการ monad ฟรีมากกว่าทฤษฎีนี้

Matija Pretnar และ Andrej Bauer ใช้วิธีการทางคณิตศาสตร์นี้แล้วนำไปใช้ในภาษา Eff ของพวกเขาในการประดิษฐ์ภาษาใหม่ที่สร้างขนานนามว่า "เอ็ฟเฟ็กต์เอฟเฟ็กต์": คุณสามารถเขียนโค้ดที่ใช้ชุดของคุณสมบัติที่จำเป็น โดยการเขียนตัวจัดการชุดที่บอกวิธีการใช้งานแต่ละการดำเนินการที่มีประสิทธิภาพ


แต่ถ้าคำจำกัดความคือ: "คุณสามารถใช้โครงสร้างการไหลของการควบคุมใด ๆ โดยใช้ Scheme และ call / cc" (โดยไม่มีการจำลอง) ดังนั้นคำตอบจะต้องเป็นใช่หรือไม่? ดูที่การอภิปรายLtU lambda-the-ultimate.org/node/966ดูเหมือนว่า Oleg Klysouv ดำเนินการตัวดำเนินการ F สี่ตัวใน Scheme ด้วยการเรียก / cc: okmij.org/ftp/continuations/ … - ตัดตอน "รหัสอาศัย ในการเรียก / cc สำหรับการจับภาพต่อเนื่องไม่ จำกัด และใช้เซลล์ที่ไม่แน่นอนในระดับโลกหนึ่งเซลล์ปรากฎว่าสิ่งนี้ไม่เพียงพอสำหรับการใช้ [... ] ตัวดำเนินการ F อื่น ๆ " ... "-F- ถึง + F + F"
csl

ฉันรับทราบว่าคุณใช้ "ความชัดเจนของมาโคร" ของ Felleisen เพื่อเป็นกรอบสำหรับคำตอบของคุณ แต่อย่างที่คุณเห็นว่าฉันได้เปลี่ยนคำถามของฉันไปเป็นค่าเฉลี่ย "นำไปใช้ [ใน Scheme] โดยใช้ call / cc" และในขณะที่ Oleg Klysov ต้องการที่จะแนะนำเซลล์ที่ไม่แน่นอนในระดับโลกเพื่อใช้ตัวดำเนินการ F ทั้งสี่สำหรับการดำเนินการต่อเนื่องที่มีตัวคั่นฉันไม่คิดว่าจำนวนนี้จะเป็น "การปรับโครงสร้างที่สำคัญระดับโลกของโปรแกรม" แน่นอน
csl

ฉันจะยอมรับคำตอบนี้ ฉันต้องการชี้ไปที่ข้อความที่okmij.org/ftp/continuations/undelimited.html#delim-vs-undelimซึ่งมีพอยน์เตอร์เพิ่มเติม นอกจากนี้ยังดูเหมือนว่าการดำเนินการต่อเนื่องที่ใช้ตัวคั่นระดับเช่น shift / reset สามารถนำไปใช้เพื่อนำโครงสร้างการควบคุมการไหลไปใช้ จากลิงค์: "การดำเนินการต่อเนื่องที่มีตัวคั่นชั้นหนึ่งสามารถแสดงเอฟเฟกต์การคำนวณใด ๆ ที่ชัดเจนรวมถึงข้อยกเว้นและสถานะที่ไม่แน่นอน"
csl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.