เป็นไปได้หรือไม่ที่ภาษาการเขียนโปรแกรมแบบกองซ้อนพร้อมกัน?


14

ฉันได้อ่านเกี่ยวกับภาษาการเขียนโปรแกรมแบบกองซ้อนเช่นFORTHและCatและดูเหมือนว่าด้วยลักษณะของพวกเขาพวกเขาสามารถดำเนินการได้ครั้งละหนึ่งการกระทำโดยไม่คำนึงถึงกระบวนทัศน์ของพวกเขา (FORTH มีความจำเป็นในขณะที่ Cat ทำงานได้)

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

ดังนั้นภาษาการเขียนโปรแกรมแบบกองซ้อนสามารถพร้อมกันได้หรือไม่ พวกเขาสามารถบรรลุการทำงานพร้อมกันโดยใช้หลายกองในเวลาเดียวกันหรือบางสิ่งบางอย่างเหมือนกันหรือไม่

เป็นไปได้หรือไม่ที่จะใช้การประเมินผลแบบขี้เกียจในภาษาการเขียนโปรแกรมแบบกองซ้อน?

โปรดแก้ไขฉันหากฉันเข้าใจผิดเกี่ยวกับภาษาและแนวคิดที่กล่าวถึงข้างต้น


5
สามารถวิธีใดภาษาความจำเป็นที่จะเกิดขึ้นพร้อมกัน?
Bergi


คุณหมายถึงการเห็นพ้องด้วยกัน (ซึ่งไม่ยากที่จะบรรลุเพียงแค่ใช้หลาย ๆ เธรดที่รันด้วยสแต็กอิสระพร้อมหน่วยความจำแบบแบ่งใช้) หรือการขนาน
Daniel Jour

@DanielJour ถ้าฉันเข้าใจดีความเท่าเทียมหมายถึงการดำเนินการพร้อมกันในขณะที่การเกิดพร้อมกันหมายถึงการดำเนินการที่เป็นอิสระดังนั้นใช่ฉันหมายถึงการทำงานพร้อมกัน คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับสแต็คอิสระสำหรับแต่ละเธรดได้อย่างไร
อาร์มันโดเอช

คำตอบ:


16

ดังนั้นภาษาการเขียนโปรแกรมแบบกองซ้อนสามารถพร้อมกันได้หรือไม่

แน่ใจ

พวกเขาสามารถบรรลุการทำงานพร้อมกันโดยใช้หลายกองในเวลาเดียวกันหรือบางสิ่งบางอย่างเหมือนกันหรือไม่

สำหรับภาษาทั่วไปหลายเธรดมักหมายถึงมีสแต็ค "การโทร" หลายรายการ มันจะเป็นธรรมชาติอย่างสมบูรณ์ที่จะให้แต่ละกลุ่มข้อมูลของตัวเอง มันจะตรงไปตรงมาที่จะมีนักแสดงพูดซึ่งร่างของเขาถูกนำไปใช้โดยรหัสในภาษาสแต็ก การขนานอย่างชัดเจนparคำอธิบายประกอบของ la GHC ควรตรงไปตรงมาอย่างสมเหตุสมผล ปัญหาหลักของการดำเนินการแบบขนานคือคุณไม่รู้ว่าสแต็กเอฟเฟกต์ของรหัสจะเป็นอย่างไรจนกว่าคุณจะรันมัน อย่างไรก็ตามการใช้ซินแทกซ์ที่มีลักษณะคล้าย Joy ก็สามารถจินตนาการได้[a b c] parว่ากำลังดำเนินการอยู่a b cไม่ว่าจะเทียบกับสแต็กที่ว่างเปล่าหรือสำเนาของสแต็กและรักษาองค์ประกอบบนสุดของสแต็คให้เสร็จสมบูรณ์เท่านั้น (หรือผลักดันค่าดัมมี่บางส่วนหากสแต็กว่างเปล่า) คุณสามารถจินตนาการถึงการเปลี่ยนแปลง ความเท่าเทียมโดยปริยายนั้นยากที่จะทำอย่างไร้เดียงสาเมื่อเทียบกับพูดภาษาที่ใช้งานได้อย่างแท้จริง แต่ก็สามารถทำได้เช่นกัน รหัสที่คอมไพล์แล้วของ combinator ที่ผู้ใช้กำหนดมักจะไม่แตกต่างจากรหัส "ปกติ"

เป็นไปได้หรือไม่ที่จะใช้การประเมินผลแบบขี้เกียจในภาษาการเขียนโปรแกรมแบบกองซ้อน?

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

อนึ่งไม่ใช่เรื่องแปลกที่ภาษาสแต็กจะมีสแต็คจำนวนมากเช่น Forth มีสแต็กข้อมูลและสแต็กคืนซึ่งคุณสามารถวางข้อมูลเองได้


8

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

เห็นพ้องด้วย

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

หากจำนวนของโปรแกรมที่เกิดขึ้นพร้อมกันนั้นใหญ่กว่าจำนวนของหน่วยการดำเนินการที่คุณจะไปสำหรับโปรแกรม "หลอกคู่" โดยทั่วไปมีสองวิธีในการทำเช่นนี้: coroutines หรือมัลติทาสกิ้งยึดเอาเสียก่อน ไม่ว่าในกรณีใดมันเป็นไปได้ (ไม่ใช่เรื่องง่าย แต่อธิบายได้ดีในวรรณกรรม) วิธีการบรรลุเป้าหมายนี้และ FORTH ช่วยให้คุณสามารถเข้าถึงทุกสิ่งระดับต่ำที่คุณต้องการ

การประเมินผลขี้เกียจ

แน่นอนคุณสามารถทำได้ใน FORTH เหมือนกับภาษาการเขียนโปรแกรมใด ๆ มันจะไม่หรูหราหรือ "บิวท์อิน" อย่างที่ Haskell พูด ฉันจะใช้ตัวอย่างไร้เดียงสามาก

ความคิดคือคุณกำหนด "ฟังก์ชั่น" (ใช้ที่นี่อย่างอิสระ) ที่ส่งคืนชุดของสิ่งต่าง ๆ ตัวอย่างหนึ่งคือฟังก์ชันที่ส่งคืนจำนวนเต็มทั้งหมด จากนั้นคุณจะดำเนินการกับชุดนี้และเมื่อคุณทำเสร็จแล้วให้ผล ตัวอย่างเช่นคุณอาจต้องการหาผลรวมจำนวนเต็มทั้งหมดจนกว่าผลรวมจะมีขนาดใหญ่กว่า 1,000 แล้วการประเมินที่ไม่ขี้เกียจในตอนแรกจะจัดสรรจำนวนเต็มทั้งหมดเป็นชุดซึ่งเป็นไปไม่ได้เนื่องจากไม่มีจำนวนเต็มจำนวนอนันต์ จากนั้นจะเริ่มทำงานกับชุดนี้ การนำไปใช้ที่ขี้เกียจจะมีวิธี "ให้ค่าถัดไปในชุด" แก่ฉัน การทำเช่นนี้ต้องการเพียงหนึ่งตัวแปรในฟังก์ชั่น "มูลค่าสุดท้ายให้"

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


4
"เพื่อให้มีโปรแกรมที่ทำงานพร้อมกันจริงคุณต้องมีหน่วยปฏิบัติการอย่างน้อยสองหน่วย" นี่เป็นเพียงปัญหาการดำเนินการ จากมุมมองภาษาการเขียนโปรแกรมแทบไม่มีความแตกต่างระหว่างสองเธรดที่รันบน CPU เดี่ยวหรือสองรายการ เรียกได้ว่าแต่ละเธรดถือเป็น 'หน่วยดำเนินการ' ของตนเอง
จิ้งจกไม่ต่อเนื่อง

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

บางครั้งเราทำ อย่างไรก็ตามฉันสงสัยว่านี่เป็นกรณีเช่นนี้ ตัวอย่างเช่นคำถามไม่ได้กล่าวถึงข้อกำหนดการตั้งเวลาตามเวลาจริง
จิ้งจกไม่ต่อเนื่อง

3
"การทำงานพร้อมกัน"! = "การขนาน" หลายเธรดที่รันบนเครื่อง CPU เดียวอาจกล่าวได้ว่ารันพร้อมกันพร้อมกันแม้ว่าจะไม่มีการประมวลผลแบบขนานเกิดขึ้น
โซโลมอนช้า

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