เหตุใดจึงไม่สามารถใช้ช่วงสำหรับการทำงานของไลบรารีของไพพ์


10

โจนาธาน Boccara (ผู้เขียนเหมือนเจ้าของภาษา C ++ ) เขียนห้องสมุดที่เรียกว่าท่อ

"piping" หน้าหลักของที่เก็บกล่าวว่าไม่เหมือนกับการใช้ช่วงแม้ว่ามันจะดูเหมือนกัน: มันไม่ได้ขึ้นอยู่กับการดึงแบบขี้เกียจ แต่อยากที่จะผลักดัน แต่มันระบุไว้ว่าเราไม่สามารถใช้ไลบรารีช่วงเพื่อดำเนินการ 'ไปป์' ที่หลากหลาย ตัวอย่างเช่น:

  • เปิดเครื่องรูด - รับอินพุตซิป - ช่วงของ k-tuples เป็นหลัก - และสร้างเอาต์พุตแยกอิสระ k
  • fork - สร้างสำเนาของคอนเทนเนอร์ / พิสัยหลายชุด (อิสระ)

ฉันไม่เข้าใจว่าทำไมในหลักการแล้วเป็นกรณีนี้ (แน่นอนว่ามีข้อยกเว้นของช่วงที่คุณไม่สามารถรับตัววนซ้ำสุดท้าย / Sentinel ได้)

คำตอบ:


7

สิ่งที่ถูกกล่าวถึงเป็นหลักคือความแตกต่างระหว่างวิธีการประมวลผลแบบกดและแบบดึง ในระบบพุชเช่นไลบรารี่ไพพ์นี้คุณสร้างสายการประมวลผลและแต่ละขั้นตอนการประมวลผลจะดันข้อมูลลงในถัดไปโดยตรง ใน pull-system like range คุณสร้างการแสดงข้อมูลซึ่งคุณสามารถเข้าถึงและแก้ไขได้ตามต้องการ การประมวลผลไม่ได้เกิดขึ้นเอง มันเกิดขึ้นเฉพาะเมื่อมีคนพยายามที่จะใช้ช่วง

unzipและforkการดำเนินงานมีทั้งการดำเนินการอย่างใดอย่างหนึ่งต่อหลายคนที่พวกเขาใช้การป้อนข้อมูลเดียวและแผนที่ไปยังการดำเนินงานการประมวลผลจำนวนมาก

ในฐานะที่เป็นระบบพุชไลบรารีของท่อสามารถจัดการการทำงานแบบหนึ่งต่อหลายคนได้เนื่องจากโครงสร้างของ API การดำเนินการถูกแสดงโดยการเรียกใช้ฟังก์ชัน อินพุตถูกบอกเป็นนัยโดยจุดใช้งาน (ใช้>>=หรือส่งต่อไปยังตัวประมวลผล) พารามิเตอร์ของฟังก์ชันกำหนดเอาท์พุท (ละเว้นพารามิเตอร์ที่มีความหมายสำหรับตัวประมวลผลเอง) และเนื่องจากฟังก์ชั่น C ++ สามารถมีพารามิเตอร์จำนวนเท่าใดก็ได้ดังนั้นการทำแผนที่แบบหนึ่งต่อหลายคนจึงไม่เป็นไปตามธรรมชาติ คุณเพียงจัดหาโปรเซสเซอร์ที่เหมาะสมสำหรับเอาต์พุตต่างๆ

ในฐานะที่เป็นระบบดึงช่วงจะขึ้นอยู่กับค่าตอบแทน C ++ ไม่มีกลไกภาษาในการคืนค่าหลายค่าดังนั้นสิ่งที่ดีที่สุดที่เราทำได้คือคืนค่า "ค่า" ที่แสดงถึงค่าหลายค่า

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

ดังนั้นตอนนี้คุณต้องใช้ชนิด "ไม่ใช่ช่วง" และทำให้อแด็ปเตอร์ช่วงทั้งหมดของคุณใช้งานได้ การใช้อะแดปเตอร์ช่วงจะต้องออกอากาศการดำเนินการนั้นข้ามประเภทการสร้างการดำเนินงานหลายต่อหลายคน การทำเช่นนั้นไม่ใช่เรื่องง่าย

แต่ที่สำคัญกว่า ... ที่อาจจะไม่ใช่สิ่งที่คุณต้องการ หากคุณforkเป็นช่วงหนึ่งคุณอาจต้องการทำการประมวลผลที่แตกต่างกันในช่วงการจำลองแบบ และนั่นเป็นการปิดโอกาสในการใช้การ|ดำเนินการทั้งหมด คุณจะต้องสร้างวิธีในการปรับใช้อะแดปเตอร์กับส่วนต่าง ๆ ของสิ่งเหล่านี้ และวิธีการเหล่านั้นมีลักษณะคล้ายกับโปรเซสเซอร์แบบกด

ในตอนท้ายของวันระบบแบบดึงจะมีเพียงหนึ่งเอาต์พุตในแต่ละระดับ นั่นเป็นเพียงส่วนหนึ่งของแนวคิดหลักของการเช่น API: การแต่ละขั้นตอนการประมวลผลสร้างช่วง สิ่งนี้มีข้อดี (การประมวลผลที่ขี้เกียจ) แต่การแทนการดำเนินงานแบบหนึ่งต่อหลายเป็นหนึ่งในพื้นที่ที่อ่อนแอ

ช่วงสามารถมีunzipฟังก์ชั่นได้อย่างแน่นอน( forkเป็นเพียงการคัดลอกช่วง) แต่มันจะไม่ใช่|อะแดปเตอร์สไตล์ มันจะเป็นฟังก์ชั่นที่รับช่วงเหนือบางชนิดที่ย่อยสลายได้และส่งกลับค่า tuple ของช่วง หากคุณต้องการทำการประมวลผลเพิ่มเติมกับพวกเขาคุณจะต้องเก็บค่า tuple ในค่าเข้าถึงแต่ละองค์ประกอบและใช้ตามที่เห็นสมควร

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