ทำไมมันไม่ดีที่จะพึ่งพาการเปลี่ยนแปลงสถานะ?


16

คำถามนี้เกิดขึ้นจากคำถาม/software/25569/is-haskell-worth-learning

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

ทำไม?

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

มันเกี่ยวข้องกับการเข้าถึงหน่วยความจำฮาร์ดแวร์หรืออย่างอื่นซึ่งเป็นผลการดำเนินงานที่ยิ่งใหญ่?


2
Haskell เป็นนักวิชาการ ฉันจะดูการบรรยายโดย Rich Hickey เกี่ยวกับ Clojure - ที่นั่นเขามีข้อโต้แย้งเชิงปฏิบัติที่น่าสนใจ (คล้ายกับ 3 คะแนนโดย Javier แต่ก็ทำได้ง่ายๆ)
งาน


6
เพียงเพราะ Haskell เป็น "วิชาการ" ไม่ได้หมายความว่ามันเป็นไปไม่ได้หรือไม่สามารถปฏิบัติได้
Tikhon Jelvis

คำตอบ:


17

มีข้อได้เปรียบใหญ่อย่างน้อยสามประการจากส่วนบนของหัวของฉัน

  1. มันทำให้โปรแกรมใกล้เคียงกับนิพจน์ทางคณิตศาสตร์มากขึ้น ในคณิตศาสตร์xไม่เปลี่ยนแปลงคุณแค่ไม่รู้ว่ามันคืออะไรจนกว่าคุณจะแก้สมการ

  2. ในท้ายที่สุดมีคือการเปลี่ยนแปลงของรัฐ (หลังจากทั้งหมดว่าเป็นวิธีที่คอมพิวเตอร์ทำงานในระดับต่ำ); แต่มันถูก จำกัด โดยภาษาในสถานที่เฉพาะ ที่ทำให้คอมไพเลอร์มีโอกาสมหาศาลในการย้ายโค้ดไปรอบ ๆ เพื่อปรับให้เหมาะสมเนื่องจากจะรู้ว่าจะไม่เปลี่ยนแปลงสิ่งใด ๆ

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


3
การเขียนโปรแกรมเชิงฟังก์ชั่นทำให้เกิดความเครียดมากที่สุด # 3 ซึ่งก็คือการทำให้การใช้งานพร้อมกันง่ายขึ้น
Mchl

4
@Mchl: จากประสบการณ์ของฉันพวกเขาให้ความสำคัญกับ "มันง่ายที่จะเข้าใจและมีเหตุผลเกี่ยวกับ" ซึ่งเป็นชนิดที่สอดคล้องกับ 1 แม้ว่าฉันคิดว่าอาจแตกต่างกันระหว่างชุมชนภาษา
sepp2k

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

คำตอบที่ดี # 2 คือสิ่งที่ฉันสันนิษฐานว่าเป็นคำตอบและแม้ว่าฉันจะอ่านบ่อยเกี่ยวกับข้อดีของการประมวลผลหลายครั้ง
ocodo

1
@Yttrill ภาษาที่ใช้งานไม่ซ้ำกันในการพึ่งพาการรวบรวมขยะและการรวบรวมขยะนั้นง่ายกว่ามากเมื่อคุณจัดการกับข้อมูลที่ไม่เปลี่ยนรูปแบบ การทำการคำนวณใด ๆ กับสถาปัตยกรรมที่ใช้คำสั่งหมายถึงการปรับเปลี่ยนสถานะซึ่งไม่ได้หมายความว่าภาษาที่ใช้งานได้ยากในการขนานกัน ภาษาที่ใช้ในการทำงานนั้นสั่นสะเทือนอย่างขนานกัน ค้นหาข้อมูลขนาน Haskell มันเป็นคุณสมบัติที่แทบจะเป็นไปไม่ได้ที่จะเพิ่มในภาษาที่จำเป็น
dan_waterworth

4

นี่คือข้อดีอีกประการหนึ่งคือลดการมีเพศสัมพันธ์ หากคุณมีรหัสเช่น:

 function doStuff(x) { return x + y;}

และที่อื่น ๆ คุณมี:

 function doOtherStuff(x) { y++; return y + x;}

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

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


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

2

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

บรรทัดล่างในการวิเคราะห์ข้างต้นคือมันไม่สามารถป้องกันได้โดยไม่ต้องมีความคิดเห็นอธิบายถึงความตั้งใจที่ไม่แปรเปลี่ยนและความหมาย: สิ่งเหล่านี้อาจยากที่จะตีความและมันอาจเป็นเรื่องยากที่จะตรวจสอบความหมายที่จะปฏิบัติตามในรหัสจริง

คำตอบนี้เป็นส่วนขยายของ @ Javier's point 1

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

มีข้อสังเกตว่าการเขียนโปรแกรมการทำงานไม่ได้คำตอบ คำตอบที่ถูกต้องคือระบบที่รองรับทั้งการเขียนโปรแกรมแบบอินดัคทีฟและการทำงานแบบหยอดเหรียญดังนั้นเครื่องมือที่เหมาะสมสามารถจัดการกับการเขียนโปรแกรมทั้งแบบไร้รัฐและไร้สัญชาติได้ เป็นเพียงว่าทฤษฎีเชิงสร้างสรรค์ (functional) นั้นได้รับการยอมรับอย่างดีในขณะที่ทฤษฎีการจัดการของรัฐยังอยู่ในช่วงเริ่มต้น


การผสมฟังก์ชั่นการทำงานและความจำเป็นในการเขียนโปรแกรมเป็นสิ่งที่ Haskell ทำ - ฟังก์ชั่นปกติใช้งานได้ในขณะที่การคำนวณแบบ stateful สามารถแสดงด้วยการทำเครื่องหมายที่ช่วยให้คุณแยกและควบคุมสถานะที่ไม่แน่นอนได้อย่างระมัดระวัง นี่คือเหตุผลที่ภาษาที่มีการดำเนินงานที่ STM ปฏิบัติมากที่สุดคือHaskell
Tikhon Jelvis

การจดบันทึกไม่ได้มีสิ่งใดที่จะทำการคำนวณแบบรัฐต่อ sese Do-notation เป็นเพียงไวยากรณ์ที่ง่ายกว่าที่ด้านบนของท่อฟังก์ชัน monadic การคำนวณแบบ Stateful เป็นเพียงหนึ่งในสิ่งที่สามารถแสดงโดยใช้ monads และด้วยเหตุนี้การทำเครื่องหมาย
Jonathan Sterling

ฟังก์ชั่นการผสมและการเขียนโปรแกรมที่จำเป็นคือสิ่งที่เกือบทุกภาษาในการดำรงอยู่ไม่ Haskell อาจมีวิธีแยกส่วนที่เป็นรัฐ แต่นั่นไม่ได้ทำให้มันเป็นส่วนผสมที่เหมาะสม: การกุศลเป็นเหมือนวิธีที่ควรจะเป็น (IMHO)
Yttrill

2

ในฐานะผู้เขียนSiege , DBMS ที่เขียนใน Haskell บางคนอาจเรียกมุมมองของฉันเกี่ยวกับสถานะที่ไม่แน่นอนที่ขัดแย้งกัน ฉันหวังว่าจะแสดงเป็นอย่างอื่น

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

เปรียบเทียบสิ่งนี้กับสภาวะที่ไม่เปลี่ยนรูปซึ่งใช้ในการถ่ายทอดข้อเท็จจริง มีกี่กระทู้ในวันที่ 12 สิงหาคม?

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

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