ภาษาที่ใช้งานได้ตามคำจำกัดความไม่ควรรักษาตัวแปรสถานะ เหตุใด Haskell, Clojure และอื่น ๆ จึงมีการใช้งานซอฟต์แวร์ transactional memory (STM) มีความขัดแย้งระหว่างสองแนวทางหรือไม่?
ภาษาที่ใช้งานได้ตามคำจำกัดความไม่ควรรักษาตัวแปรสถานะ เหตุใด Haskell, Clojure และอื่น ๆ จึงมีการใช้งานซอฟต์แวร์ transactional memory (STM) มีความขัดแย้งระหว่างสองแนวทางหรือไม่?
คำตอบ:
ไม่มีอะไรผิดปกติกับภาษาที่ใช้งานได้ซึ่งรักษาสถานะที่ไม่แน่นอน แม้แต่ภาษาที่ใช้งานได้ "บริสุทธิ์" เช่น Haskell จำเป็นต้องรักษาสถานะเพื่อให้สามารถโต้ตอบกับโลกแห่งความเป็นจริงได้ "Impure" ภาษาที่ใช้งานได้เช่น Clojure อนุญาตให้มีผลข้างเคียงซึ่งอาจรวมถึงสถานะกลายพันธุ์
จุดหลักคือภาษาทำงานกีดกันรัฐไม่แน่นอนจนกว่าคุณต้องการจริงๆ รูปแบบทั่วไปคือการโปรแกรมโดยใช้ฟังก์ชั่นแท้และข้อมูลที่ไม่เปลี่ยนรูปแบบและโต้ตอบกับสถานะที่ไม่แน่นอนที่ "ไม่บริสุทธิ์" ในส่วนเฉพาะของรหัสของคุณที่จำเป็นต้องใช้ ด้วยวิธีนี้คุณสามารถเก็บส่วนที่เหลือของรหัสฐาน "บริสุทธิ์"
ฉันคิดว่ามีหลายสาเหตุที่ทำให้ 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 ในวิดีโอนี้
ภาษาที่ใช้งานได้ตามคำจำกัดความไม่ควรรักษาตัวแปรสถานะ
คำจำกัดความของคุณผิด ภาษาที่ไม่สามารถรักษาสถานะได้ก็ไม่สามารถใช้งานได้
ความแตกต่างระหว่างภาษาที่ใช้งานได้กับภาษาที่จำเป็นนั้นไม่ใช่ว่าหนึ่งในนั้นมีสถานะและอีกภาษาหนึ่งไม่ได้ มันเป็นวิธีที่พวกเขารักษาสถานะไว้
ภาษาที่มีความหมายมีสถานะแพร่กระจายไปทั่วโปรแกรม
ภาษาหน้าที่แยกและรักษาสถานะอย่างชัดเจนผ่านลายเซ็นประเภท และนั่นคือเหตุผลที่พวกเขามีกลไกการจัดการสถานะที่ซับซ้อนเช่น STM
บางครั้งโปรแกรมต้องการสถานะที่ไม่แน่นอน (เช่นเนื้อหาฐานข้อมูลสำหรับเว็บแอป) และมันจะเป็นการดีที่จะสามารถใช้งานได้โดยไม่สูญเสียประโยชน์จากการเขียนโปรแกรมการทำงาน ในภาษาที่ไม่ใช้งานได้รัฐที่ไม่แน่นอนสามารถแทรกซึมทุกอย่าง หากคุณทำให้ชัดเจนด้วยAPI พิเศษบางประเภทคุณสามารถ จำกัด ขอบเขตไว้ในภูมิภาคเล็ก ๆ ที่สามารถระบุตัวตนได้ในขณะที่ทุกอย่างอื่นยังทำงานได้อย่างหมดจด ประโยชน์ของ FP รวมถึงการดีบักที่ง่ายขึ้นการทดสอบหน่วยที่ทำซ้ำได้การทำงานพร้อมกันที่ไม่เจ็บปวดและการรองรับมัลติคอร์ / GPU