เหตุใดจึงยังไม่ได้เขียนโปรแกรมที่ใช้งานได้ไป


197

ฉันได้อ่านข้อความบางส่วนเกี่ยวกับการเขียนโปรแกรมเชิงประกาศ / การใช้งาน (ภาษา) ลองใช้ Haskell และเขียนด้วยตัวเอง จากสิ่งที่ฉันได้เห็นการเขียนโปรแกรมการทำงานมีข้อดีหลายประการมากกว่ารูปแบบที่จำเป็นคลาสสิก:

  • โปรแกรมไร้สัญชาติ ไม่มีผลข้างเคียง
  • เห็นพ้องด้วย; เล่นได้ดีมากด้วยเทคโนโลยีมัลติคอร์ที่สูงขึ้น
  • โปรแกรมมักจะสั้นกว่าและในบางกรณีก็ง่ายต่อการอ่าน
  • ผลผลิตเพิ่มขึ้น (ตัวอย่าง: Erlang)

  • การเขียนโปรแกรมเชิงความคิดเป็นกระบวนทัศน์ที่เก่าแก่มาก (เท่าที่ฉันรู้) และอาจไม่เหมาะสำหรับศตวรรษที่ 21

เหตุใด บริษัท ที่ใช้หรือโปรแกรมที่เขียนในภาษาที่ใช้งานได้ยังคง“ หายาก”

ทำไมเมื่อดูข้อดีของการเขียนโปรแกรมเพื่อการทำงานเรายังคงใช้ภาษาการเขียนโปรแกรมที่จำเป็นหรือไม่

อาจจะเร็วเกินไปสำหรับในปี 1990 แต่วันนี้


1
หมายเหตุ:คำถามนี้ถูกพูดถึงใน meta อย่างน้อยสองครั้งและฉันทามติก็คือว่ามันควรจะเก็บไว้แม้ว่าจะเก็บไว้ผ่านล็อค "ความสำคัญทางประวัติศาสตร์" ดังกล่าวข้างต้น ฉันขอแนะนำให้ทุกคนที่ดูสิ่งนี้ด้วยตาที่จะปลดล็อคแทนที่จะหยุดและขอขอบคุณที่ไม่ได้มีส่วนร่วมในการอภิปรายที่น่าเบื่ออีกครั้งเกี่ยวกับคำถามนี้เพลิดเพลินไปกับคำตอบที่พวกเขาเป็นและดำเนินธุรกิจ
Shog9

คำตอบ:


530

เพราะข้อดีเหล่านั้นก็มีข้อเสียเช่นกัน

โปรแกรมไร้สัญชาติ ไม่มีผลข้างเคียง

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

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

เห็นพ้องด้วย; เล่นได้ดีมากด้วยเทคโนโลยีมัลติคอร์ที่สูงขึ้น

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

โปรแกรมมักจะสั้นกว่าและในบางกรณีก็ง่ายต่อการอ่าน

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

ผลผลิตเพิ่มขึ้น (ตัวอย่าง: Erlang)

ผลผลิตต้องเพิ่มขึ้นมากเพื่อพิสูจน์ว่าค่าใช้จ่ายจำนวนมากของผู้ว่าจ้างโปรแกรมเมอร์ที่รู้วิธีการเขียนโปรแกรมในรูปแบบการใช้งาน

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

การเขียนโปรแกรมเชิงซ้อนเป็นกระบวนทัศน์ที่เก่าแก่มาก (เท่าที่ฉันรู้) และอาจไม่เหมาะสำหรับศตวรรษที่ 21

ฟังก์ชั่นโปรแกรมเก่าเกินไป ฉันไม่เห็นว่าอายุแนวคิดมีความเกี่ยวข้องกันอย่างไร

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

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


41
"เมื่อเจนสมิ ธ ทำบัญชีแต่งงานและเปลี่ยนชื่อของเธอเป็นเจนโจนส์ฐานข้อมูลที่สนับสนุนกระบวนการทางธุรกิจที่พิมพ์งานของเธอน่าจะเป็นเรื่องการจัดการการกลายพันธุ์แบบนั้น" จะมีบันทึกชื่อเดิมของ Jane Smith เราจะไม่อัปเดตย้อนหลังทุกกรณีของชื่อเดิมของ Jane เป็นชื่อใหม่ของเธอ;)
Juliet

40
@ Juliet: แน่นอน จุดของฉันคือว่าถ้าคุณมีวัตถุที่แสดงถึงพนักงานก็ทำให้ความรู้สึกที่คิดว่าการดำเนินการ "เปลี่ยนชื่อของพนักงาน" ที่จะมีการกลายพันธุ์ของวัตถุที่เป็นตัวแทนของพนักงานที่ไม่เปลี่ยนแปลงตัวตนของวัตถุ เมื่อมีการเปลี่ยนแปลงเจนสมิ ธ เธอชื่อคุณไม่ได้สร้างความแตกต่างกันของพนักงานที่เรียกว่าเจนโจนส์ที่เป็นอย่างอื่นเหมือนกัน ไม่มีพนักงานสองคนที่มีสองชื่อแตกต่างกัน มันเป็นเรื่องธรรมดาที่จะทำแบบจำลองกระบวนการนี้ว่าเป็นการกลายพันธุ์ของวัตถุไม่ใช่การสร้างวัตถุใหม่
Eric Lippert

24
นี่เป็นคำตอบที่ดี แต่ฉันคิดว่าคุณพูดเกินจริงกรณีของคุณ เช่นเดียวกับ Juliet กล่าวแม้ว่าผู้คนอาจคิดว่ามันเป็นการเปลี่ยนชื่อ แต่จริงๆแล้วมันคือการเปลี่ยนชื่อในระดับที่ลึกกว่า และแม้ว่าโปรแกรมการทำงานอาจเป็นเรื่องยากสำหรับคนที่จะอ่าน (เพราะเป็นทักษะที่เรียนรู้) ซึ่งไม่ได้เป็นเพราะพวกเขาใช้เวลานาน โปรแกรม Haskell มักจะเป็นคำศัพท์ที่ยาวกว่าโปรแกรม Java - แม้จะอยู่ในโดเมน "ไม่เหมาะสม" ที่มีสถานะโดยธรรมชาติจำนวนมาก
Chuck

29
+1 มันเป็นอากาศที่บริสุทธิ์มากเมื่อได้อ่านคำตอบนี้ ยอดเยี่ยมที่จะได้ยินลัทธิปฏิบัตินิยม (ด้วยความหลงใหลพื้นฐานสำหรับการเขียนโปรแกรมฟังก์ชั่น) จากใครบางคนในตำแหน่งของคุณ
Daily

11
"เพราะข้อดีทั้งหมดที่ยังมีข้อเสียโปรแกรมไร้สัญชาติ; ไม่มีผลข้างเคียง." เท่าที่ผมเข้าใจ (ผมไม่ทราบว่าพอเกี่ยวกับ FP การเขียนคำตอบเผด็จการ) นี่คือไม่ถูกต้อง ฟังก์ชั่นการเขียนโปรแกรมเป็นเรื่องเกี่ยวกับความโปร่งใสในการอ้างอิงไม่ได้เกี่ยวกับการหลีกเลี่ยงรัฐ Haskell อนุญาตให้รัฐและการกลายพันธุ์ มันมีเครื่องมือที่แตกต่างกัน (อย่างใดอย่างหนึ่งสามารถโต้แย้งได้ดีกว่า) สำหรับการให้เหตุผลเกี่ยวกับมัน
Giorgio

38

Masterminds ของการเขียนโปรแกรม: การสนทนากับผู้สร้างภาษาการเขียนโปรแกรมที่สำคัญ

[Haskell]

ทำไมคุณถึงคิดว่าไม่มีภาษาโปรแกรมที่ใช้งานได้เข้าสู่กระแสหลัก?

John Hughes:การตลาดแย่! ฉันไม่ได้หมายถึงโฆษณาชวนเชื่อ เรามีสิ่งนั้นมากมาย ฉันหมายถึงทางเลือกที่ระมัดระวังของช่องทางการตลาดเป้าหมายที่จะครอบงำตามด้วยความพยายามที่มุ่งมั่นที่จะทำให้การเขียนโปรแกรมการทำงานโดยวิธีที่มีประสิทธิภาพมากที่สุดในการแก้ไขช่องที่ ในวันที่มีความสุขในยุค 80 เราคิดว่าการเขียนโปรแกรมใช้งานได้ดีสำหรับทุกสิ่ง - แต่การเรียกเทคโนโลยีใหม่ "ดีสำหรับทุกอย่าง" นั้นเหมือนกับการเรียกมันว่า แบรนด์ควรจะเป็นอะไร? นี่เป็นปัญหาที่ John Launchbury อธิบายอย่างชัดเจนในการพูดคุยเชิญของเขาที่ ICFP การเชื่อมต่อของ Galois เกือบจะดำเนินต่อไปเมื่อแบรนด์ของพวกเขาคือ "ซอฟต์แวร์ในภาษาที่ใช้งานได้" แต่พวกเขาได้พัฒนาตั้งแต่จุดแข็งไปจนถึงจุดแข็งตั้งแต่มุ่งเน้นไปที่ "ซอฟต์แวร์ที่มีความน่าเชื่อถือสูง"

หลายคนไม่รู้ว่านวัตกรรมทางเทคโนโลยีเกิดขึ้นได้อย่างไรและคาดหวังว่าเทคโนโลยีที่ดีกว่านั้นจะกลายเป็นสิ่งที่โดดเด่นด้วยตัวของมันเอง (เอฟเฟ็กต์กับดักหนูที่ดีกว่า ) แต่โลกไม่ได้เป็นเช่นนั้น


36
Haskell: หลังจากผ่านไป 20 ปีความสำเร็จชั่วข้ามคืน!
Juliet

ตามลิงค์และอ่านความคิดเห็นสำหรับโรคค่อนข้างสนุกของ Grady Booch ไม่มีความคิดว่า Booch คือใคร แต่มันทำให้ฉันกลัวอยู่ดี
fearofawhackplanet

4
ในที่สุด Grady Booch ก็ร่วมงานกับ Jacobson และ Rumbaugh สำหรับสิ่งที่น่ารังเกียจนั่นคือ UML
เพียงความคิดเห็นที่ถูกต้องของฉัน

27

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

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

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


นี่เป็นสิ่งที่ลึกซึ้งและเป็นประโยชน์อย่างมาก คำตอบที่ดีที่สุดแน่นอนฉันได้เห็นคำถามนี้ในทุกรูปแบบ
Benson

อาจเป็นเพราะภาษาที่ทั้งคู่เป็นพลเมืองชั้นหนึ่งจะได้รับความนิยม
Kevin Kostlan

1
ยอมรับ 110% หลายต่อหลายครั้งฉันพยายามเข้าร่วม FP แต่ฉันก็หมดความตั้งใจที่จะดำเนินการต่อหลังจากผ่านไปสองสามสัปดาห์ ฉันเขียนโปรแกรมมาเป็นเวลานานกว่า 30 ปีแล้วและฉันก็ชินกับการเขียนโปรแกรมที่จำเป็น นี่เป็นเรื่องจริงของอุตสาหกรรมไอทีในวงกว้าง การเปลี่ยนแปลงจะไม่เกิดขึ้นอย่างง่ายดายและรวดเร็ว
Richard Eng

26

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

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

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

สถานะที่ทันสมัยในปัจจุบันคือภาษาที่จำเป็น (เช่น C #) ยืมคุณสมบัติจากโลกที่ใช้งานได้ (เช่นคำสั่งแลมบ์ดา) และในทางกลับกัน


3
OOP ไม่ใช่ชุดย่อยของการเขียนโปรแกรมที่จำเป็นหรือไม่
pankrax

9
OOP เป็นซูเปอร์เซ็ต OOP มีความจำเป็นเช่น C ++ คือ C
Robert Harvey

10
ฉันไม่คิดว่า OOP จำเป็นต้องพึ่งพาการเขียนโปรแกรมที่จำเป็น ดู Clojure หรือ CLOS - ทั้งสองฟังก์ชั่น แต่ยังเชิงวัตถุ
Gabe

9
ภาษา OO มีความจำเป็น แต่ไม่จำเป็นต้องเป็น OCaml เป็นภาษาที่ใช้งานได้ดี (แม้ว่าจะไม่ใช่ภาษาล้วนๆ) ซึ่ง raison d'etre ทั้งหมดเป็น OO
Chuck

7
ฉันไม่เข้าใจว่าเพราะเหตุใด OOP จึงเป็นโปรแกรมที่จำเป็นอย่างยิ่ง ไม่ใช่รหัสที่จำเป็นทั้งหมดคือ OOP และไม่ใช่รหัสการทำงานทั้งหมดที่ไม่ใช่ OOP ฉันอยากจะบอกว่า OOP คือการเขียนโปรแกรมที่จำเป็นและการเขียนโปรแกรมที่ใช้งานได้เช่นปีกแอโรไดนามิกเพื่อแข่งรถหรือเครื่องบินหรือจรวดหรือพัดลมระบายความร้อนหรือกังหันลมหรือ ... นั่นคือแนวคิดที่เกี่ยวข้อง แต่ไม่แน่นหนาใน การเชื่อมต่อแบบ 1 ต่อ 1
เซบาสเตียนมัค

21

ไม่ใช่เหรอ

Smalltalk เป็นระบบเชิงวัตถุที่ยอดเยี่ยมในสมัยนั้น เหตุใดจึงไม่เขียนโปรแกรมเชิงวัตถุ ก็มี มันดูไม่เหมือน Smalltalk ภาษากระแสหลักได้รับ Smalltalk มากขึ้นเช่น C ++, Java, C #, ฯลฯ การเปลี่ยนแปลงสไตล์และสไตล์ช้ากว่าสิ่งใดดังนั้นเมื่อ OO เข้าสู่กระแสหลักเราได้รับโดยการติดกาวส่วนของ OO เป็นภาษาเก่าดังนั้นมันจึงดูเหมือนว่า C จะกลืน .

ฟังก์ชั่นเป็นวิธีเดียวกัน Haskell เป็นภาษาที่ใช้งานได้ดี แต่เรามีโปรแกรมเมอร์จำนวนมากที่ใช้ไวยากรณ์เหมือน C ในปัจจุบันเมื่อ 20 ปีที่แล้ว ดังนั้นมันต้องดูเหมือน C. Done: ดูนิพจน์ LINQ ใด ๆ และบอกฉันว่ามันใช้งานไม่ได้


2
จุดที่น่าสนใจ แต่ภาษากระแสหลักได้รับเหมือนสมอลล์ทอล์คมากขึ้นได้อย่างไร? ตัวอย่างเช่น C ++, Java และ C # ไม่ได้ขึ้นอยู่กับการส่งข้อความซึ่ง (ฉันเชื่อว่า) เป็นส่วนที่สำคัญที่สุดของกระบวนทัศน์ Smalltalk
Jonathan Sterling

4
Jonathan: เลือกฟีเจอร์ Smalltalk และสังเกตว่าจุดอ่อนที่สุดใน C ++ (เก่าที่สุด), OK ใน Java และดีกว่าใน C # ตัวอย่างเช่น GC (Java / C # เท่านั้น), autoboxing (ภายหลัง Java / C # เท่านั้น), การปิด (C # เท่านั้น) และการสะท้อนกลับ (มีอยู่ใน Java, ดีกว่าใน C #) หากคุณต้องการข้อความผ่านดูที่ C # dynamic4 นั่นเป็น Smalltalk-y ที่สุดของฟีเจอร์เหล่านี้ดังนั้นจึงไม่แปลกใจเลยที่มันจะปรากฏเฉพาะในเวอร์ชั่นล่าสุดของสามภาษาที่ทันสมัยที่สุด :-)
Ken

Javascript, Python และ Ruby เป็นภาพประกอบที่ดีว่ามีจริงอย่างไรบ้าง
nafg

15

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

ผู้โพสต์คนหนึ่งกล่าวว่ารหัสที่จำเป็นต้องเข้าใจง่ายกว่าโค้ดโปรแกรมที่ใช้งานได้ สิ่งนี้จะเกิดขึ้นจริงหากผู้อ่านได้เห็นโค้ดที่จำเป็นแล้วโดยเฉพาะอย่างยิ่งหากตัวอย่างก่อนหน้าเป็นส่วนหนึ่งของ "ตระกูล" เดียวกัน (เช่น C / C ++, Perl, PHP และ Java) ฉันจะไม่อ้างว่ามันเป็นเรื่องจริงสำหรับภาษาที่จำเป็นใด ๆ ลองเปรียบเทียบ Java กับ Forth เพื่อเป็นตัวอย่างที่ยอดเยี่ยม

สำหรับฆราวาสภาษาการเขียนโปรแกรมทั้งหมดเป็นสิ่งที่ไม่สามารถพูดได้ซึ่งแยกออกไม่ได้ยกเว้นภาษา verbose เช่น Hypertalk และ SQL (จากบันทึกย่อ SQL เป็นภาษาที่ประกาศและ / หรือภาษาที่ใช้งานได้และได้รับความนิยมอย่างมาก)

หากเราได้รับการฝึกอบรมเบื้องต้นในภาษา Lisp-y หรือ Haskell-y ตั้งแต่เริ่มต้นเราทุกคนคิดว่าภาษาการเขียนโปรแกรมที่ใช้งานได้นั้นเป็นเรื่องปกติอย่างสมบูรณ์แบบ


"ผู้โพสต์คนหนึ่งกล่าวว่ารหัสที่จำเป็นนั้นง่ายต่อการเข้าใจมากกว่าโค้ดโปรแกรมที่ใช้งานได้นี่เป็นเรื่องจริงหากผู้อ่านได้เห็นโค้ดที่จำเป็นแล้วโดยเฉพาะอย่างยิ่งหากตัวอย่างก่อนหน้านี้เป็นส่วนหนึ่งของตระกูลเดียวกัน" (เช่น C / C ++ Perl, PHP และ Java) ": จริงมาก (+1): ฉันจำได้ว่าฉันต้องใช้ความพยายามมากแค่ไหนในการเรียนรู้ Pascal และ C เมื่อฉันเริ่มโปรแกรม และมันง่ายแค่ไหนที่จะอ่าน Scala, Haskell หรือ Scheme ตอนนี้ที่ฉันมีประสบการณ์กับภาษาเหล่านี้
จอร์โจ

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

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

14

คุณได้คำตอบเพียงพอแล้วที่ฉันจะพูดถึงเพียงไม่กี่สิ่งที่ฉันยังไม่เห็นพูดถึง

ครั้งแรกและ (ในใจของฉัน) ที่สำคัญที่สุดภาษาขั้นตอนได้รับประโยชน์อย่างมากจากระดับสามัญของพวกเขา ยกตัวอย่างเช่นใครก็ตามที่รู้ภาษาเกือบทุกขั้นตอน (หรือ OO) เกือบทุกระดับสามารถอ่านคนอื่น ๆ ได้ดีพอสมควร ฉันหลีกเลี่ยงการทำงานใน Java, C #, Cobol, Fortran หรือ Basic (ตัวอย่างเพียงไม่กี่ตัวอย่าง) แต่สามารถอ่านสิ่งเหล่านี้ได้ดีพอสมควร - ในความเป็นจริงแล้วผู้คนใช้พวกเขาทุกวัน

ด้านการใช้งานนั้นมีมากนั้นจริงน้อยกว่ามาก ตัวอย่างเช่นฉันสามารถเขียน Scheme ได้ค่อนข้างสมเหตุสมผลเช่นกัน แต่นั่นก็มีประโยชน์เล็กน้อยในการอ่าน Ocaml หรือ Haskell (สำหรับตัวอย่างสองสามตัวอย่างเท่านั้น) แม้แต่ในครอบครัวเดียวกัน (เช่น Scheme vs. , Common LISP) ที่คุ้นเคยกับสิ่งหนึ่งดูเหมือนจะไม่สามารถแปลได้ดีเหมือนกัน

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

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

ภาษาที่ใช้งานได้เพียงไม่กี่ภาษาสามารถแข่งขันได้ดีกับ APL สำหรับซอร์สโค้ดแบบสั้น (แม้ว่าในความเป็นธรรม APL รองรับการสร้างฟังก์ชั่นระดับสูงขึ้นเช่นกันดังนั้นจึงไม่แตกต่างกันมากนักในบางกรณี) Contrariwise, Ada และ C ++ (สำหรับตัวอย่างเพียงสองสามข้อ) สามารถแข่งขันได้ในแง่ของจำนวนการดำเนินการที่จำเป็นเพื่อให้งานสำเร็จตามที่กำหนด แต่ไวยากรณ์คือ (อย่างน้อยโดยปกติ) verbose มากขึ้นอย่างมีนัยสำคัญ


ความคิดเห็นที่ยอดเยี่ยม! ฉันเห็นด้วยสุดใจ ฉันพบว่าภาษาที่ใช้ในขั้นตอนส่วนใหญ่นั้นอ่านและเข้าใจได้ค่อนข้างง่ายถึงแม้ว่าฉันจะเป็นผู้เชี่ยวชาญที่ยอดเยี่ยมเพียงไม่กี่คนเท่านั้น พูดแบบเดียวกันเกี่ยวกับภาษา FP ไม่ได้
Richard Eng

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

11

ไม่จำเป็นต้องรับรู้

ฉันจำคำตอบบอส Boss Cline เก่าของฉันเมื่อฉันแสดงสำเนาคำบรรยายทัวริงของ John Backus 'Turing Award เรื่องการเขียนโปรแกรมสามารถปลดปล่อยจากสไตล์ von Neumann ได้หรือไม่?

คำตอบของเขา: "บางทีพวกเราบางคนอาจไม่ต้องการปลดปล่อยจากสไตล์ของ von Neumann!"


10

เหตุใดจึงยังไม่ได้เขียนโปรแกรมที่ใช้งานได้ไป

ฟังก์ชั่นจะดีกว่าสำหรับบางสิ่งและแย่กว่าสำหรับคนอื่นดังนั้นมันจะไม่ "เข้ายึด" มันแพร่หลายอยู่แล้วในโลกแห่งความจริงแม้ว่า

โปรแกรมไร้สัญชาติ ไม่มีผลข้างเคียง

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

เห็นพ้องด้วย; เล่นได้ดีมากกับเทคโนโลยีแบบมัลติคอร์ที่สูงขึ้นโปรแกรมมักจะสั้นกว่าและในบางกรณีการอ่านง่ายขึ้นผลผลิตเพิ่มขึ้น (ตัวอย่าง: Erlang)

คุณกำลังสับสนในเวลาเดียวกันและขนานกัน

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

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

เหตุใด บริษัท ที่ใช้หรือโปรแกรมที่เขียนในภาษาที่ใช้งานได้ยังคง“ หายาก”

สกาล่ามักถูกมองว่าเป็นภาษาที่ใช้งานได้ แต่มันไม่สามารถใช้งานได้มากกว่า C # ซึ่งเป็นหนึ่งในภาษาที่ได้รับความนิยมมากที่สุดในโลกในปัจจุบัน

ทำไมเมื่อดูข้อดีของการเขียนโปรแกรมเพื่อการทำงานเรายังคงใช้ภาษาการเขียนโปรแกรมที่จำเป็นหรือไม่

การเขียนโปรแกรมที่ใช้งานได้จริงมีข้อเสียร้ายแรงจำนวนมากดังนั้นเราจึงใช้ภาษาที่ใช้งานไม่ได้เช่น Lisp, Scheme, SML, OCaml, Scala และ C #


7

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

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

  2. แต่เมื่อคุณมีความขี้เกียจมันก็ยากที่จะให้เหตุผลเกี่ยวกับการใช้หน่วยความจำ การเปลี่ยนแฟล็กคอมไพเลอร์ Haskell บ่อยครั้งจะเปลี่ยนจำนวนหน่วยความจำที่ใช้โดยอัลกอริทึมจาก O (N) เป็น O (1) ยกเว้นบางครั้งก็ไม่ สิ่งนี้ไม่ได้รับการยอมรับจริง ๆ เมื่อคุณมีแอปพลิเคชั่นที่ต้องการใช้ประโยชน์สูงสุดจากหน่วยความจำที่มีอยู่ทั้งหมดและมันก็ไม่ได้ยอดเยี่ยมแม้แต่สำหรับแอพพลิเคชั่นที่ไม่ต้องการหน่วยความจำทั้งหมด


ความเกียจคร้านยังโต้ตอบน้อยกว่าการดีบั๊กด้วย
Brian

3
ในขณะที่ฉันพบว่าข้อบกพร่องมากมายที่ฉันไล่ล่าในภาษาอื่นนั้นเกี่ยวข้องกับการขาดความโปร่งใสในการอ้างอิงฉันไม่ค่อยกังวลเกี่ยวกับปัญหาการดีบักแม้ว่าบางครั้งพวกเขาจะเจ็บปวด
sigfpe

6

สองสิ่ง:

  1. ใช้เวลาไม่ว่าเทคโนโลยีจะดีแค่ไหน แนวคิดเบื้องหลัง FP มีอายุประมาณ 70 ปี แต่การใช้งานหลักในด้านวิศวกรรมซอฟต์แวร์ (ในสนามเพลาะในอุตสาหกรรม) อาจน้อยกว่า 10 ปี การขอให้นักพัฒนาซอฟต์แวร์ใช้ความคิดใหม่ ๆ ทางเชื้อชาติเป็นไปได้ แต่ต้องใช้เวลา (หลายปี) ตัวอย่างเช่น OOP ได้รับการใช้งานจริงอย่างมากในต้นปี 1980 อย่างไรก็ตามมันไม่ได้หยุดนิ่งจนกว่าจะถึงปลายปี 1990
  2. คุณต้องการคนที่จะถูกบังคับให้ต้องเผชิญกับความแรงของเทคโนโลยีก่อนที่มันจะฮิตมันใหญ่ ขณะนี้ผู้คนกำลังใช้เครื่องมือที่ไม่ได้ใช้ประโยชน์จากความเท่าเทียมและสิ่งต่าง ๆ ใช้ได้ดี เมื่อแอพที่ไม่ได้ใช้คู่ขนานจะช้าเกินทน จากนั้นหลายคนจะถูกบังคับให้ใช้เครื่องมือคู่ขนานและ FP อาจจะได้รับความนิยม สิ่งนี้อาจนำไปใช้กับจุดแข็งอื่น ๆ ของ FP ด้วย

3
FP เป็นโค้ดที่ดีมาก น่าจะดีกว่านี้แล้ว OO ฉันต้องจัดการกับมันในที่ทำงานสองสามครั้งการโยกย้ายไปยังประเภทต่าง ๆ และระบบใหม่และมันก็ไม่เจ็บปวด
nlucaroni

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