ทำไมบางภาษาที่ใช้งานจำเป็นต้องใช้หน่วยความจำในการทำธุรกรรมซอฟต์แวร์


24

ภาษาที่ใช้งานได้ตามคำจำกัดความไม่ควรรักษาตัวแปรสถานะ เหตุใด Haskell, Clojure และอื่น ๆ จึงมีการใช้งานซอฟต์แวร์ transactional memory (STM) มีความขัดแย้งระหว่างสองแนวทางหรือไม่?


ฉันต้องการเชื่อมโยงบทความที่น่าสนใจนี้ซึ่งอธิบายได้ค่อนข้างมาก
เหยี่ยว

1
ภาษาที่ใช้งานได้ทั้งหมดจะคงสภาพไว้ แต่ความบริสุทธิ์จะกำหนดว่าค่าของตัวแปรจะไม่เปลี่ยนแปลงเมื่อมีการตั้งค่า
Robert Harvey

คำตอบ:


13

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

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

ฉันคิดว่ามีหลายสาเหตุที่ทำให้ STM เป็นภาษาที่ใช้งานได้บ่อยขึ้น:

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

ฉันชอบวิธีของ Clojure ในการอนุญาตความไม่แน่นอน แต่เฉพาะในบริบทของการควบคุมอย่างเข้มงวด "การอ้างอิงที่มีการจัดการ" ที่อาจมีส่วนร่วมในธุรกรรม STM ทุกสิ่งทุกอย่างในภาษาคือ "ทำงานได้อย่างหมดจด"

  ;; define two accounts as managed references
  (def account-a (ref 100))
  (def account-b (ref 100))

  ;; define a transactional "transfer" function
  (defn transfer [ref-1 ref-2 amount]
    (dosync
      (if (>= @ref-1 amount)
        (do 
          (alter ref-1 - amount)
          (alter ref-2 + amount))
        (throw (Error. "Insufficient balance!")))))

  ;; make a stranfer
  (transfer account-a account-b 75)

  ;; inspect the accounts
  @account-a
  => 25

  @account-b
  => 175

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

สำหรับการรู้แจ้งเพิ่มเติมริชฮิคกี้ทำหน้าที่ยอดเยี่ยมในการอธิบาย STM ของ Clojure ในวิดีโอนี้


3

ภาษาที่ใช้งานได้ตามคำจำกัดความไม่ควรรักษาตัวแปรสถานะ

คำจำกัดความของคุณผิด ภาษาที่ไม่สามารถรักษาสถานะได้ก็ไม่สามารถใช้งานได้

ความแตกต่างระหว่างภาษาที่ใช้งานได้กับภาษาที่จำเป็นนั้นไม่ใช่ว่าหนึ่งในนั้นมีสถานะและอีกภาษาหนึ่งไม่ได้ มันเป็นวิธีที่พวกเขารักษาสถานะไว้

ภาษาที่มีความหมายมีสถานะแพร่กระจายไปทั่วโปรแกรม

ภาษาหน้าที่แยกและรักษาสถานะอย่างชัดเจนผ่านลายเซ็นประเภท และนั่นคือเหตุผลที่พวกเขามีกลไกการจัดการสถานะที่ซับซ้อนเช่น STM


2

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


คุณอาจหมายถึงสถานะที่ไม่แน่นอน โปรแกรมทั้งหมดรักษาสถานะแม้กระทั่งโปรแกรมที่ใช้งานได้
Robert Harvey

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