ก่อนอื่นฉันเห็นด้วยกับเพียงคำตอบของ OPINION ที่ถูกต้องเกี่ยวกับการเรียนรู้ Erlang เป็นภาษาที่ใช้งานได้เป็นส่วนใหญ่ (แม้ว่าการทำงานพร้อมกันจะมีบทบาทใหญ่) และคุณสมบัติทั้งหมดของมันได้รับการเพิ่มเพื่อให้สามารถทนต่อความผิดพลาดและความทนทานซึ่งไม่ใช่เป้าหมายการออกแบบเดียวกับ Javascript ในตอนแรก
ประการที่สองการทิ้ง Node.js เพื่อเข้าสู่ Erlang เป็นการวางผิดที่เล็กน้อย Node.js เป็นเซิร์ฟเวอร์ / เฟรมเวิร์กเดียวที่ดำเนินการทุกอย่างในรูปแบบที่ขับเคลื่อนด้วยเหตุการณ์ด้วยความช่วยเหลือของการเรียกกลับ Erlang มีกรอบงานของตัวเอง (OTP) แต่มันไม่ได้อยู่ในระดับเดียวกันเลย
หากคุณวางแผนที่จะเรียนรู้ Erlang ฉันขอแนะนำรายการบล็อกของฉันจดหมายเปิดผนึกถึงผู้เริ่มต้น Erlang (หรือผู้สังเกตการณ์)เป็นการอ่านบทแนะนำก่อนที่จะดำดิ่งสู่บทเรียน
สิ่งเดียวที่คุณสามารถเปรียบเทียบ Erlang และ Node.js ได้ในแง่ของรูปแบบและการใช้งานคือการขับเคลื่อนเหตุการณ์ อย่างไรก็ตามมีความแตกต่างใหญ่สองประการที่นี่ โมเดลของ Node.js ขึ้นอยู่กับการโทรกลับที่ผูกไว้กับกิจกรรม Erlang ขึ้นอยู่กับคิวข้อความและการรับแบบเลือก ความหมายในนั้นมีอะไรบ้าง
ก่อนอื่นถ้าคุณทำสิ่งต่าง ๆ ในลักษณะที่ใช้การติดต่อกลับวิธีเดียวที่คุณพกพาไปได้คือการทำให้มันเป็นโลกหรือเข้าสู่การเขียนโปรแกรมแบบต่อเนื่อง ประการที่สองคุณต้องดูแลเมทริกซ์เหตุการณ์ทั้งหมดด้วยตัวเอง ตัวอย่างหนึ่งของเรื่องนี้คือว่าถ้าเราจินตนาการกลไกสถานะอัน จำกัด อย่างง่ายมาก: เซมาฟอร์ Mutex, เป็นตัวขับเคลื่อนเหตุการณ์
เซมาฟอร์ Mutex มีสองสถานะ: ถูกล็อกและว่าง เมื่อใดก็ตามที่หน่วยการคำนวณที่กำหนด (ผู้ปฏิบัติงานกระบวนการฟังก์ชั่นหรือเธรด) ต้องการเข้าถึง mutex มันจะต้องเริ่มต้นเหตุการณ์ที่บอกว่า 'ฉันสนใจ' ตอนนี้คุณต้องสนใจกิจกรรมประเภทต่อไปนี้:
- mutex นั้นฟรีและคุณขอล็อค
- Mutex ถูกล็อคโดยบุคคลอื่นและคุณต้องการได้รับการล็อค
- Mutex ถูกล็อคด้วยตัวเองและคุณต้องการปลดปล่อย Mutex
จากนั้นคุณมีกิจกรรมเพิ่มเติมที่ต้องพิจารณาเช่นหมดเวลาเพื่อหลีกเลี่ยงการหยุดชะงัก:
- mutex ถูกล็อคและคุณรอนานเกินไปตัวจับเวลาในการหยุดยิง
- mutex ถูกล็อคและคุณรอนานเกินไปรับการล็อคจากนั้นหมดเวลาใช้งาน
จากนั้นคุณมีกิจกรรมนอกขอบเขต:
- คุณเพิ่งล็อค mutex ในขณะที่คนงานบางคนคาดว่ามันจะเป็นอิสระ ตอนนี้แบบสอบถามของคนงานจะต้องถูกจัดคิวเพื่อที่เมื่อว่างก็จะจัดการกลับ
- คุณต้องทำให้การทำงานแบบอะซิงโครนัสทั้งหมด
เมทริกซ์ของเหตุการณ์ซับซ้อนขึ้นอย่างรวดเร็ว FSM ของเราที่นี่มี 2 สถานะเท่านั้น ในกรณีของ Erlang (หรือภาษาใด ๆ ที่มีการรับและเลือกแบบอะซิงโครนัสกับเหตุการณ์ที่อาจเกิดขึ้นแบบซิงโครนัส) คุณต้องใส่ใจกับกรณีบางกรณี:
- mutex นั้นฟรีและคุณขอล็อค
- Mutex ถูกล็อคโดยบุคคลอื่นและคุณต้องการได้รับการล็อค
- Mutex ถูกล็อคด้วยตัวเองและคุณต้องการปลดปล่อย Mutex
และนั่นคือมัน ตัวจับเวลาจะได้รับการจัดการในกรณีเดียวกับที่ทำเสร็จและสำหรับทุกสิ่งที่เกี่ยวข้องกับ 'รอจนกว่าจะว่าง' ข้อความจะถูกจัดคิวโดยอัตโนมัติ: ผู้ปฏิบัติงานเพียง แต่ต้องรอการตอบกลับ แบบจำลองนั้นง่ายกว่ามากในกรณีเหล่านี้
ซึ่งหมายความว่าในกรณีทั่วไป CPS และโมเดลที่ใช้การติดต่อกลับเช่นที่อยู่ใน node.js ขอให้คุณฉลาดมากในการจัดการเหตุการณ์หรือขอให้คุณดูแลเมทริกซ์เหตุการณ์ที่ซับซ้อนทั้งหมดเนื่องจาก คุณจะต้องถูกเรียกกลับในแต่ละกรณีที่ไม่สำคัญซึ่งเป็นผลมาจากปัญหาเรื่องเวลาแปลก ๆ และการเปลี่ยนแปลงสถานะ
การเลือกรับมักจะอนุญาตให้คุณมุ่งเน้นเฉพาะในกลุ่มย่อยของเหตุการณ์ที่อาจเกิดขึ้นทั้งหมดและช่วยให้คุณสามารถให้เหตุผลกับเหตุการณ์ในกรณีนั้นได้ง่ายขึ้น โปรดทราบว่า Erlang มีพฤติกรรม (รูปแบบการออกแบบ / การดำเนินงานกรอบ) gen_event
ของสิ่งที่เรียกว่า การใช้งาน gen_event ช่วยให้คุณมีกลไกคล้ายกับสิ่งที่ถูกใช้ใน node.js หากนั่นคือสิ่งที่คุณต้องการ
จะมีประเด็นอื่น ๆ ที่ทำให้เห็นความแตกต่าง; Erlang มีการกำหนดตารางเวลาไว้ล่วงหน้าในขณะที่ node.js ร่วมมือกันทำให้ Erlang เหมาะสำหรับแอปพลิเคชันขนาดใหญ่มาก ๆ (การแจกจ่ายและทั้งหมด) แต่ Node.js และชุมชนมักจะเป็นเว็บที่ฉลาดและมีความรู้เกี่ยวกับแนวโน้มล่าสุดของเว็บ เป็นคำถามของการเลือกเครื่องมือที่ดีที่สุดและสิ่งนี้จะขึ้นอยู่กับพื้นหลังประเภทของปัญหาและความต้องการของคุณ ในกรณีของฉันแบบจำลองของ Erlang เหมาะกับวิธีคิดที่ดีของฉันมาก นี่ไม่ใช่กรณีสำหรับทุกคน
หวังว่านี่จะช่วยได้