ฟังก์ชั่นการเขียนโปรแกรม: แนวคิดที่ถูกต้องเกี่ยวกับการทำงานพร้อมกันและรัฐ


21

ผู้เสนอ FP อ้างว่าภาวะพร้อมกันนั้นง่ายเนื่องจากกระบวนทัศน์ของพวกเขาหลีกเลี่ยงสภาวะที่ไม่แน่นอน ฉันไม่เข้าใจ

ลองจินตนาการว่าเรากำลังสร้างการรวบรวมข้อมูลดันเจี้ยนแบบผู้เล่นหลายคน (โร๊คไลค์) โดยใช้ FP ที่เราเน้นฟังก์ชั่นที่บริสุทธิ์และโครงสร้างข้อมูลที่ไม่เปลี่ยนรูป เราสร้างดันเจี้ยนที่ประกอบด้วยห้องโถงทางเดินวีรบุรุษมอนสเตอร์และของขวัญ โลกของเราเป็นกราฟวัตถุของโครงสร้างและความสัมพันธ์อย่างมีประสิทธิภาพ เมื่อสิ่งต่าง ๆ เปลี่ยนการเป็นตัวแทนของโลกเราก็จะได้รับการแก้ไขเพื่อสะท้อนการเปลี่ยนแปลงเหล่านั้น ฮีโร่ของเราฆ่าหนูหยิบดาบสั้น ฯลฯ

สำหรับฉันโลก (ความเป็นจริงในปัจจุบัน) นำแนวคิดของรัฐนี้มาใช้และฉันขาดวิธีที่ FP เอาชนะสิ่งนี้ ในฐานะฮีโร่ของเราดำเนินการฟังก์ชั่นแก้ไขสถานะของโลก ดูเหมือนว่าการตัดสินใจทุกอย่าง (AI หรือมนุษย์) จะต้องขึ้นอยู่กับสถานะของโลกตามที่เป็นอยู่ในปัจจุบัน เราจะอนุญาตให้มีการทำงานพร้อมกันได้ที่ไหน? เราไม่สามารถมีกระบวนการหลายอย่างพร้อมกันทำให้เป็นโมฆะสถานะของโลกว่ากระบวนการหนึ่งจะยึดผลลัพธ์ของมันในบางสถานะที่หมดอายุ ฉันรู้สึกว่าการควบคุมทั้งหมดควรเกิดขึ้นภายในลูปควบคุมเดียวเพื่อให้เราประมวลผลสถานะปัจจุบันที่แสดงด้วยกราฟวัตถุปัจจุบันของโลก

เห็นได้ชัดว่ามีสถานการณ์ที่เหมาะอย่างยิ่งสำหรับการเกิดพร้อมกัน (เช่นเมื่อการประมวลผลงานแยกที่มีสถานะเป็นอิสระจากกัน)

ฉันไม่เห็นว่าการใช้งานพร้อมกันมีประโยชน์ในตัวอย่างของฉันอย่างไรและนั่นอาจเป็นปัญหา ฉันอาจแสดงข้อเรียกร้องผิด ๆ

บางคนสามารถเป็นตัวแทนของการอ้างสิทธิ์นี้ได้ดีขึ้นหรือไม่


1
คุณกำลังอ้างถึงรัฐที่แบ่งปัน รัฐที่ใช้ร่วมกันจะเป็นสิ่งที่เป็นอยู่เสมอและจะต้องมีการซิงโครไนซ์บางรูปแบบรูปแบบที่ต้องการในบรรดาคน FP ที่บริสุทธิ์คือ STM ซึ่งช่วยให้คุณสามารถรักษาหน่วยความจำที่ใช้ร่วมกันเป็นหน่วยความจำในท้องถิ่น เงื่อนไขจะถูกจัดการโดยอัตโนมัติ เทคนิคอื่นสำหรับหน่วยความจำที่ใช้ร่วมกันคือการส่งข้อความโดยที่แทนที่จะมีหน่วยความจำที่ใช้ร่วมกันคุณมีหน่วยความจำภายในและความรู้ของนักแสดงคนอื่น ๆ เพื่อขอหน่วยความจำในพื้นที่ของพวกเขา
Jimmy Hoffa

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

1
หนึ่งคำ, Zippers
jk

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

1
คุณอาจพบว่า "retrogames ที่เล่นได้หมดจด" น่าสนใจ: prog21.dadgum.com/23.html
user802500

คำตอบ:


15

ฉันจะพยายามบอกกล่าวคำตอบ นี่ไม่ใช่คำตอบเพียงภาพประกอบแนะนำเท่านั้น คำตอบของ @jk ชี้ไปที่ของจริงซิป

ลองนึกภาพคุณมีโครงสร้างต้นไม้ที่ไม่เปลี่ยนรูป คุณต้องการแก้ไขหนึ่งโหนดโดยการแทรกลูก เป็นผลให้คุณได้รับต้นไม้ใหม่ทั้งหมด

แต่ต้นไม้ใหม่ส่วนใหญ่นั้นเหมือนกับต้นไม้เก่า การใช้งานที่ชาญฉลาดจะนำชิ้นส่วนของต้นไม้มาใช้ใหม่ส่วนใหญ่การกำหนดเส้นทางพอยน์เตอร์รอบโหนดที่เปลี่ยนแปลง:

จากวิกิพีเดีย

หนังสือของ Okasakiเต็มไปด้วยตัวอย่างเช่นนี้

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

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


3
+1: สำหรับชี้ไปที่หนังสือของ Okasaki ฉันไม่ได้อ่าน แต่อยู่ในรายการที่ต้องทำ ฉันคิดว่าสิ่งที่คุณบรรยายคือทางออกที่ถูกต้อง คุณสามารถพิจารณาประเภทที่เป็นเอกลักษณ์ (ล้าง, en.wikipedia.org/wiki/Uniqueness_type ): การใช้ประเภทประเภทนี้คุณสามารถอัปเดตวัตถุข้อมูลแบบทำลายล้างในขณะที่ยังคงความโปร่งใสในการอ้างอิง
Giorgio

มีประโยชน์สำหรับความสัมพันธ์ที่จะถูกกำหนดโดยการอ้างอิงทางอ้อมผ่านทางคีย์หรือรหัส? นั่นคือฉันคิดว่าการสัมผัสที่แท้จริงน้อยลงของโครงสร้างหนึ่งไปยังอีกโครงสร้างหนึ่งจะทำให้การแก้ไขโครงสร้างโลกน้อยลงเมื่อมีการเปลี่ยนแปลงเกิดขึ้น หรือเทคนิคนี้ไม่ได้ใช้ใน FP จริงๆเหรอ?
Mario T. Lanza

9

คำตอบของ 9000คือครึ่งคำตอบโครงสร้างข้อมูลถาวรช่วยให้คุณสามารถนำชิ้นส่วนที่ไม่เปลี่ยนแปลงกลับมาใช้ใหม่ได้

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

อีกจุดหนึ่งที่มีซิปคือมีซิปสำหรับประเภทข้อมูลใด ๆ ที่คุณต้องการ


ฉันกลัวว่าจะต้องใช้เวลาสักครู่ก่อนจะขุดลงไปใน "รูดซิป" เนื่องจากฉันกำลังอยู่บนขอบที่สำรวจ FP เท่านั้น ฉันไม่มีประสบการณ์กับ Haskell
Mario T. Lanza

ฉันจะลองเพิ่มตัวอย่างภายหลังวันนี้
jk

4

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

ตัวอย่างเช่นสมมติว่าคุณดำเนินการตัดสินใจเกี่ยวกับ AI โดยไม่ขึ้นกับแต่ละฝ่าย พวกเขาไม่ได้ผลัดกันทุกคนตัดสินใจพร้อมกันจากนั้นโลกก็ก้าวหน้า รหัสอาจมีลักษณะเช่นนี้:

func MakeMonsterDecision curWorldState monster =
    ...
    ...
    return monsterDecision

func NextWorldState curWorldState =
    ...
    let monsterMakeDecisionForCurrentState = MakeMonsterDecision curWorldState
    let monsterDecisions = List.map monsterMakeDecisionForCurrentState activeMonsters
    ...
    return newWorldState

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

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


ที่ช่วยค่อนข้างน้อย ฉันเห็นได้ว่าในเกมจะมีประโยชน์อย่างมากในการมีสัตว์ประหลาดตัดสินใจพร้อมกันว่าพวกเขาจะทำอะไรต่อไป
Mario T. Lanza

4

การฟัง Rich Hickey พูดถึงสองสามอย่าง - อันนี้เป็นพิเศษ - ช่วยลดความสับสนของฉัน ในหนึ่งเขาระบุว่ามันก็โอเคที่กระบวนการพร้อมกันอาจไม่ได้สถานะปัจจุบันมากที่สุด ฉันต้องการได้ยินเรื่องนั้น สิ่งที่ฉันกำลังประสบปัญหาในการย่อยคือโปรแกรมจริง ๆ แล้วจะโอเคกับการตัดสินใจเกี่ยวกับสแนปช็อตของโลกที่ถูกแทนที่ด้วยโปรแกรมใหม่ ฉันยังคงสงสัยว่า FP ที่เกิดขึ้นพร้อมกันจะสามารถแก้ไขปัญหาการตัดสินใจเกี่ยวกับสถานะเดิมได้อย่างไร

ในแอปพลิเคชันธนาคารเราจะไม่ต้องการตัดสินใจโดยใช้ภาพรวมของรัฐที่ถูกแทนที่โดยรุ่นใหม่กว่า (เกิดการถอน)

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


0

ผู้เสนอ FP อ้างว่าภาวะพร้อมกันนั้นง่ายเนื่องจากกระบวนทัศน์ของพวกเขาหลีกเลี่ยงสภาวะที่ไม่แน่นอน ฉันไม่เข้าใจ

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

อัลกอริธึมแบบอนุกรม

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

เห็นพ้องง่ายยิ่งขึ้น

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

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

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

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

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

ผลข้างเคียง

ที่กล่าวว่าฉันไม่เห็นด้วยกับส่วนหนึ่งด้วยความเคารพจากเพื่อนทำงานของฉัน (ที่ฉันคิดว่าเด็ดสุด ๆ ):

[... ] เพราะกระบวนทัศน์ของพวกเขาหลีกเลี่ยงรัฐที่ไม่แน่นอน

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

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


1
"สถานะไม่แน่นอน" หมายถึงสถานะในระดับแอปพลิเคชันเสมอไม่ใช่ระดับขั้นตอน การกำจัดพอยน์เตอร์และพารามิเตอร์การส่งผ่านเป็นค่าการคัดลอกเป็นหนึ่งในเทคนิคที่นำเข้าสู่ FP แต่ฟังก์ชั่นที่มีประโยชน์ใด ๆ ที่มีการกลายพันธุ์ของรัฐในบางระดับ - จุดของการเขียนโปรแกรมการทำงานเพื่อให้แน่ใจว่ารัฐไม่แน่นอนซึ่งเป็นโทรไม่ใส่ขั้นตอนและการกลายพันธุ์ที่ไม่ได้ออกจากขั้นตอนการยกเว้นค่าส่งกลับ! แต่มีบางโปรแกรมที่สามารถทำงานได้มากโดยไม่ต้องปิดเสียงเลยและข้อผิดพลาดจะคืบคลานเข้ามาที่หน้าจออีกครั้ง
Steve

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

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

1
@ อย่างน้อยฉันก็อาจเห็นด้วยกับคุณอย่างน้อยครึ่งเนื่องจากฉันอยู่ด้านการสำรวจวิธีการทำสิ่งต่าง ๆ ในวิธีที่ปลอดภัยมากขึ้นจากภาษาเช่น C หรือ C ++ และฉันไม่คิดว่าเราต้องไปอย่างเต็มที่ - เป่าฟังก์ชั่นบริสุทธิ์ที่จะทำมัน แต่ฉันคิดว่าแนวคิดบางอย่างใน FP มีประโยชน์อย่างน้อย ฉันเพิ่งเขียนคำตอบว่าฉันพบ PDS มีประโยชน์ที่นี่ได้อย่างไรและประโยชน์ที่ใหญ่ที่สุดที่ฉันพบเกี่ยวกับ PDS ไม่ใช่ความปลอดภัยของเธรด แต่สิ่งต่าง ๆ เช่น instancing การแก้ไขแบบไม่ทำลายความปลอดภัยยกเว้นการ

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