ฉันเห็นการสนทนาเกี่ยวกับภาษาและสิ่งต่าง ๆ มากมายที่นี่ ทำไมคุณต้องใช้หนึ่งในภาษา "ดั้งเดิม" พวกเขาทำอะไรได้ดีกว่า สิ่งที่แย่กว่านั้นคืออะไร? แอปพลิเคชั่นการเขียนโปรแกรมที่ใช้งานได้ดีที่สุดคืออะไร
ฉันเห็นการสนทนาเกี่ยวกับภาษาและสิ่งต่าง ๆ มากมายที่นี่ ทำไมคุณต้องใช้หนึ่งในภาษา "ดั้งเดิม" พวกเขาทำอะไรได้ดีกว่า สิ่งที่แย่กว่านั้นคืออะไร? แอปพลิเคชั่นการเขียนโปรแกรมที่ใช้งานได้ดีที่สุดคืออะไร
คำตอบ:
ภาษาเชิงหน้าที่ใช้กระบวนทัศน์ที่แตกต่างจากภาษาเชิงบังคับและเชิงวัตถุ พวกเขาใช้ฟังก์ชั่นปราศจากผลข้างเคียงเป็นแบบเอกสารสำเร็จรูปพื้นฐานในภาษา สิ่งนี้ทำให้หลายสิ่งหลายอย่างและทำให้หลายสิ่งเป็นเรื่องยากขึ้น (หรือในกรณีส่วนใหญ่แตกต่างจากสิ่งที่ผู้คนคุ้นเคย)
ข้อดีอย่างหนึ่งของการเขียนโปรแกรมที่ใช้งานได้ดีที่สุดคือลำดับของการดำเนินการของฟังก์ชั่นที่ไม่มีผลข้างเคียงนั้นไม่สำคัญ ตัวอย่างเช่นใน Erlang สิ่งนี้ใช้เพื่อเปิดใช้งานการทำงานพร้อมกันอย่างโปร่งใส และเนื่องจากฟังก์ชั่นในภาษาทำงานมีลักษณะคล้ายกับฟังก์ชั่นทางคณิตศาสตร์จึงง่ายต่อการแปลฟังก์ชั่นเหล่านั้นเป็นภาษาที่ใช้งานได้ ในบางกรณีอาจทำให้โค้ดอ่านง่ายขึ้น
ตามเนื้อผ้าหนึ่งในข้อเสียใหญ่ของการเขียนโปรแกรมฟังก์ชั่นก็ขาดผลข้างเคียง มันยากมากที่จะเขียนซอฟต์แวร์ที่มีประโยชน์โดยไม่ใช้ IO แต่ IO นั้นยากที่จะใช้งานโดยไม่มีผลข้างเคียงในฟังก์ชั่น ดังนั้นคนส่วนใหญ่ไม่เคยมีฟังก์ชั่นการเขียนโปรแกรมมากไปกว่าการคำนวณเอาต์พุตเดี่ยวจากอินพุตเดียว ในภาษาผสมกระบวนทัศน์สมัยใหม่เช่น F # หรือ Scala สิ่งนี้ง่ายกว่า
ภาษาสมัยใหม่จำนวนมากมีองค์ประกอบจากภาษาโปรแกรมที่ใช้งานได้ C # 3.0 มีคุณสมบัติการเขียนโปรแกรมที่ใช้งานได้มากมายและคุณสามารถใช้งานโปรแกรมใน Python ได้เช่นกัน ฉันคิดว่าสาเหตุของความนิยมของการเขียนโปรแกรมเชิงฟังก์ชั่นนั้นส่วนใหญ่เป็นเพราะสองเหตุผล: การเห็นพ้องต้องกันเป็นปัญหาที่แท้จริงในการเขียนโปรแกรมปกติเพราะเราได้รับคอมพิวเตอร์แบบมัลติโปรเซสเซอร์มากขึ้นเรื่อย ๆ และภาษาก็เข้าถึงได้มากขึ้น
ฉันไม่คิดว่ามีคำถามใด ๆ เกี่ยวกับวิธีการทำงานของการเขียนโปรแกรม "จับใจ" เพราะมันถูกใช้งาน (เป็นรูปแบบของการเขียนโปรแกรม) ประมาณ 40 ปี เมื่อใดก็ตามที่ผู้เขียนโปรแกรม OO เขียนโค้ดที่สะอาดซึ่งสนับสนุนอ็อบเจกต์ที่ไม่เปลี่ยนรูปรหัสนั้นก็ยืมแนวคิดการทำงาน
อย่างไรก็ตามภาษาที่บังคับใช้รูปแบบการใช้งานได้รับหมึกเสมือนจริงจำนวนมากในปัจจุบันและว่าภาษาเหล่านั้นจะโดดเด่นในอนาคตหรือไม่เป็นคำถามเปิด ความสงสัยของฉันเองคือภาษาแบบผสมผสานหลายกระบวนทัศน์เช่นScalaหรือOCaml น่าจะมีอิทธิพลเหนือภาษาที่ใช้ภาษา "พิถีพิถัน" ในลักษณะเดียวกับภาษา OO บริสุทธิ์ (Smalltalk, Beta เป็นต้น) ที่มีอิทธิพลต่อการเขียนโปรแกรมกระแสหลัก แต่ยังไม่สิ้นสุด เป็นสัญลักษณ์ที่ใช้กันอย่างแพร่หลายมากที่สุด
ในที่สุดฉันก็อดไม่ได้ที่จะชี้ให้เห็นว่าความคิดเห็นของคุณนั้นเป็นไปในแนวขนานกับคำพูดที่ฉันได้ยินจากโปรแกรมเมอร์ขั้นตอนเมื่อหลายปีก่อน:
เช่นเดียวกับอินเทอร์เฟซผู้ใช้แบบกราฟิกและ "รหัสเป็นแบบจำลองของธุรกิจ" เป็นแนวคิดที่ช่วยให้ OO กลายเป็นที่นิยมมากขึ้นผมเชื่อว่าการใช้งานที่เพิ่มขึ้นของ immutability และการขนานที่เรียบง่าย (ขนาดใหญ่) จะช่วยให้โปรแกรมเมอร์เห็นประโยชน์เพิ่มเติม . แต่เท่าที่เราได้เรียนรู้ในช่วง 50 ปีที่ผ่านมาซึ่งประกอบไปด้วยประวัติศาสตร์ทั้งหมดของการเขียนโปรแกรมคอมพิวเตอร์ดิจิตอลฉันคิดว่าเรายังมีอีกมากที่จะเรียนรู้ ยี่สิบปีต่อจากนี้โปรแกรมเมอร์จะหันกลับมามองด้วยความประหลาดใจกับธรรมชาติดั้งเดิมของเครื่องมือที่เราใช้อยู่ในปัจจุบันรวมถึงภาษา OO และ FP ที่ได้รับความนิยมในปัจจุบัน
ข้อดีหลักสำหรับฉันคือความขนานโดยธรรมชาติโดยเฉพาะอย่างยิ่งขณะที่เรากำลังเคลื่อนห่างจาก MHz มากขึ้นและไปสู่แกนหลักมากขึ้นเรื่อย ๆ
ฉันไม่คิดว่ามันจะกลายเป็นกระบวนทัศน์การเขียนโปรแกรมถัดไปและแทนที่วิธีการพิมพ์ OO อย่างสมบูรณ์ แต่ฉันคิดว่าเราจะไปถึงจุดที่เราจำเป็นต้องเขียนโค้ดบางส่วนของเราในภาษาที่ใช้งานได้หรือภาษาวัตถุประสงค์ทั่วไปของเราจะ เติบโตเพื่อรวมโครงสร้างที่ทำงานได้มากขึ้น
แม้ว่าคุณจะไม่เคยทำงานในภาษาที่ใช้งานได้อย่างมืออาชีพการเข้าใจการเขียนโปรแกรมที่ใช้งานได้จะทำให้คุณเป็นนักพัฒนาซอฟต์แวร์ที่ดีขึ้น มันจะทำให้คุณมีมุมมองใหม่เกี่ยวกับรหัสและการเขียนโปรแกรมโดยทั่วไป
ฉันบอกว่าไม่มีเหตุผลที่จะไม่เรียนรู้มัน
ฉันคิดว่าภาษาที่ทำงานได้ดีในการผสมผสานการทำงานและสไตล์ที่จำเป็นนั้นน่าสนใจที่สุดและน่าจะประสบความสำเร็จมากที่สุด
ฉันมักจะสงสัยเกี่ยวกับสิ่งที่ยิ่งใหญ่ต่อไป หลายต่อหลายครั้งเรื่องใหญ่ครั้งต่อไปเป็นอุบัติเหตุที่บริสุทธิ์ของประวัติศาสตร์การอยู่ในสถานที่ที่ถูกต้องในเวลาที่เหมาะสมไม่ว่าเทคโนโลยีจะดีหรือไม่ก็ตาม ตัวอย่าง: C ++, Tcl / Tk, Perl เทคโนโลยีที่มีข้อบกพร่องทั้งหมดประสบความสำเร็จอย่างดุเดือดเพราะพวกเขาถูกรับรู้เพื่อแก้ไขปัญหาของวันนั้นหรือเกือบจะเหมือนกับมาตรฐานที่ยึดที่มั่นหรือทั้งสองอย่าง ฟังก์ชั่นการเขียนโปรแกรมอาจจะยอดเยี่ยม แต่ก็ไม่ได้หมายความว่ามันจะถูกนำมาใช้
แต่ฉันสามารถบอกคุณได้ว่าทำไมผู้คนถึงตื่นเต้นกับการเขียนโปรแกรมเชิงฟังก์ชัน: โปรแกรมเมอร์จำนวนมากมี "ประสบการณ์การแปลง" ที่พวกเขาค้นพบว่าการใช้ภาษาที่ใช้งานได้ทำให้พวกเขามีประสิทธิภาพเพิ่มขึ้นเป็นสองเท่า รหัสที่ยืดหยุ่นในการเปลี่ยนแปลงและมีข้อบกพร่องน้อยกว่า คนเหล่านี้คิดว่าการเขียนโปรแกรมใช้งานได้เป็นอาวุธลับ ตัวอย่างที่ดีของความคิดนี้คือพอลเกรแฮมชนะค่าเฉลี่ย โอ้และการสมัครของเขา? เว็บแอพอีคอมเมิร์ซ
ตั้งแต่ต้นปีพ. ศ. 2549 ก็ได้มีข่าวเกี่ยวกับการเขียนโปรแกรมการทำงานและการขนานกันบ้าง เนื่องจากผู้คนอย่างSimon Peyton Jonesกังวลเกี่ยวกับการขนานกันอย่างต่อเนื่องตั้งแต่อย่างน้อยปี 1984 ฉันจึงไม่กลั้นลมหายใจจนกว่าภาษาที่ใช้งานได้จะช่วยแก้ปัญหามัลติคอร์ได้ แต่มันจะอธิบายเรื่องปากต่อปากเพิ่มเติมบางอย่างเกี่ยวกับตอนนี้
โดยทั่วไปมหาวิทยาลัยในอเมริกากำลังทำงานด้านการสอนการเขียนโปรแกรมฟังก์ชั่นไม่ดี มีแกนกลางที่แข็งแกร่งของการสนับสนุนสำหรับการสอนการเขียนโปรแกรมแนะนำโดยใช้ Schemeและ Haskell ยังสนุกกับการสนับสนุนบางอย่างที่นั่น แต่ก็มีน้อยมากในการสอนเทคนิคขั้นสูงสำหรับโปรแกรมเมอร์ที่ใช้งานได้ ฉันได้สอนหลักสูตรที่ Harvard และจะทำเช่นนั้นอีกครั้งในฤดูใบไม้ผลินี้ที่ Tufts เบนจามินเพียร์ซสอนหลักสูตรนี้ที่เพนน์ ฉันไม่รู้ว่า Paul Hudak ทำสิ่งใดกับเยลหรือไม่ มหาวิทยาลัยในยุโรปกำลังทำผลงานได้ดีกว่ามาก ตัวอย่างเช่นการเขียนโปรแกรมการทำงานจะเน้นในสถานที่สำคัญในเดนมาร์ก, เนเธอร์แลนด์, สวีเดนและสหราชอาณาจักร ฉันมีความรู้สึกน้อยลงเกี่ยวกับสิ่งที่เกิดขึ้นในออสเตรเลีย
ฉันไม่เห็นใครพูดถึงช้างในห้องที่นี่ดังนั้นฉันคิดว่ามันขึ้นอยู่กับฉัน :)
JavaScript เป็นภาษาที่ใช้งานได้ ในขณะที่ผู้คนจำนวนมากทำสิ่งที่ก้าวหน้ายิ่งขึ้นกับ JS โดยเฉพาะอย่างยิ่งการใช้ประโยชน์จากจุดที่ดีขึ้นของ jQuery, Dojo และกรอบงานอื่น ๆ FP จะได้รับการแนะนำโดยผู้พัฒนาเว็บ
ร่วมกับการปิด FP ทำให้โค้ด JS เบาจริง ๆ แต่ยังอ่านได้
ไชโยปล
แอปพลิเคชั่นส่วนใหญ่นั้นง่ายพอที่จะแก้ไขในวิธี OO ปกติ
วิธี OO นั้นไม่ใช่ "ปกติ" เสมอไป มาตรฐานของทศวรรษนี้เป็นแนวคิดที่ถูกลดทอนลงของทศวรรษที่แล้ว
ฟังก์ชั่นการเขียนโปรแกรมเป็นคณิตศาสตร์ Paul Graham บน Lisp (แทนที่การเขียนโปรแกรมใช้งานได้สำหรับ Lisp):
ดังนั้นคำอธิบายสั้น ๆ ว่าทำไมภาษา 1950 นี้จึงไม่ล้าสมัยคือมันไม่ใช่เทคโนโลยี แต่เป็นคณิตศาสตร์และคณิตศาสตร์ก็ไม่น่าเบื่อ สิ่งที่ถูกต้องในการเปรียบเทียบเสียงกระเพื่อมกับไม่ใช่ฮาร์ดแวร์ในปี 1950 แต่พูดว่าอัลกอริทึม Quicksort ซึ่งถูกค้นพบในปี 1960 และยังคงเป็นวัตถุประสงค์ทั่วไปที่เร็วที่สุด
ฉันพนันได้เลยว่าคุณไม่รู้ว่าคุณใช้งานโปรแกรมเมื่อคุณใช้:
โปรแกรมเมอร์ระดับองค์กรโดยเฉลี่ยเช่นคนส่วนใหญ่ที่ฉันทำงานด้วยจะไม่เข้าใจและสภาพแวดล้อมการทำงานส่วนใหญ่จะไม่อนุญาตให้คุณเขียนโปรแกรม
อันนั้นเป็นเพียงเรื่องของเวลา โปรแกรมเมอร์องค์กรโดยเฉลี่ยของคุณเรียนรู้ทุกสิ่งที่เป็นปัจจุบัน 15 ปีที่แล้วพวกเขาไม่เข้าใจ OOP หาก FP จับไม่ได้ "โปรแกรมเมอร์องค์กรโดยเฉลี่ย" ของคุณจะตามมา
มันไม่ได้สอนที่มหาวิทยาลัยจริงๆ (หรือทุกวันนี้)
แตกต่างกันมาก ที่มหาวิทยาลัยของฉัน SML เป็นนักเรียนภาษาคนแรกที่ได้รับการแนะนำให้รู้จัก ฉันเชื่อว่า MIT สอน LISP เป็นหลักสูตรปีแรก ตัวอย่างสองตัวอย่างนี้อาจไม่ได้เป็นตัวแทนของหลักสูตร แต่ฉันเชื่อว่ามหาวิทยาลัยส่วนใหญ่ที่เสนอหลักสูตรตัวเลือกอย่างน้อยที่สุดใน FP แม้ว่าพวกเขาจะไม่ได้เป็นส่วนหนึ่งของหลักสูตรก็ตาม
แอปพลิเคชั่นส่วนใหญ่นั้นง่ายพอที่จะแก้ไขในวิธี OO ปกติ
มันไม่ได้เป็นเรื่องของ "เรียบง่ายพอ" การแก้ปัญหาจะง่ายขึ้น (หรืออ่านได้ง่ายขึ้น, สง่างาม, หรูหรา, นักแสดง) ใน FP มีหลายสิ่งที่ "ง่ายพอที่จะแก้ไขใน Java" แต่ก็ยังต้องใช้รหัสจำนวนมหาศาล
ไม่ว่าในกรณีใดโปรดจำไว้ว่าผู้เสนอ FP ได้อ้างว่าเป็นสิ่งที่ยิ่งใหญ่ต่อไปมาหลายทศวรรษแล้ว บางทีพวกเขาอาจจะถูก แต่จำไว้ว่าพวกเขาไม่ได้เมื่อพวกเขาเรียกร้องเดียวกัน 5, 10 หรือ 15 ปีที่ผ่านมา
สิ่งหนึ่งที่แน่นอนข้อหาในความโปรดปรานของพวกเขา แต่เป็นว่าเมื่อเร็ว ๆ นี้, C # ได้ดำเนินการเปิดคมต่อ FP ในขอบเขตที่ว่ามันจริงเปลี่ยนรุ่นของโปรแกรมเมอร์โปรแกรมเมอร์เข้า FP ให้โดยที่พวกเขาไม่ได้สังเกตเห็น นั่นอาจเป็นการปูทางสำหรับการ "ปฏิวัติ" ของ FP อาจจะ. ;)
มนุษย์ไม่สามารถเข้าใจถึงความสมบูรณ์แบบและความไม่สมบูรณ์แบบของศิลปะที่เขาเลือกหากเขาไม่เห็นคุณค่าในศิลปะอื่น ๆ การปฏิบัติตามกฎจะอนุญาตให้พัฒนาได้จนถึงจุดหนึ่งในเทคนิคเท่านั้นจากนั้นนักเรียนและศิลปินจะต้องเรียนรู้เพิ่มเติมและค้นหาเพิ่มเติม มันสมเหตุสมผลที่จะศึกษาศิลปะอื่น ๆ รวมถึงกลยุทธ์
ใครไม่ได้เรียนรู้อะไรเกี่ยวกับตัวเองมากขึ้นโดยดูกิจกรรมของคนอื่นบ้าง หากต้องการเรียนรู้ดาบศึกษากีตาร์ เพื่อเรียนรู้การค้ากำปั้นศึกษา เพียงศึกษาดาบจะทำให้คุณใจแคบและไม่อนุญาตให้คุณเติบโตออกไปด้านนอก
- Miyamoto Musashi "A Book of Five Rings"
คุณสมบัติหลักอย่างหนึ่งในภาษาที่ใช้งานได้คือแนวคิดของฟังก์ชั่นชั้นหนึ่ง แนวคิดคือคุณสามารถส่งผ่านฟังก์ชั่นเป็นพารามิเตอร์ไปยังฟังก์ชั่นอื่น ๆ และส่งกลับเป็นค่า
ฟังก์ชั่นการเขียนโปรแกรมที่เกี่ยวข้องกับการเขียนรหัสที่ไม่เปลี่ยนสถานะ เหตุผลหลักในการทำเช่นนี้คือการที่การเรียกไปยังฟังก์ชันอย่างต่อเนื่องจะให้ผลลัพธ์เดียวกัน คุณสามารถเขียนรหัสการทำงานในภาษาใดก็ได้ที่รองรับฟังก์ชั่นชั้นหนึ่ง แต่มีบางภาษาเช่น Haskell ซึ่งไม่อนุญาตให้คุณเปลี่ยนสถานะ ในความเป็นจริงคุณไม่ควรสร้างผลข้างเคียงใด ๆ (เช่นการพิมพ์ข้อความ) ซึ่งฟังดูเหมือนจะไร้ประโยชน์อย่างสมบูรณ์
Haskell ใช้วิธีการต่าง ๆ แทน IO: monads เหล่านี้เป็นวัตถุที่มีการดำเนินการ IO ที่ต้องการที่จะดำเนินการโดยระดับบนสุดของล่ามของคุณ ในระดับอื่น ๆ พวกเขาเป็นเพียงวัตถุในระบบ
การเขียนโปรแกรมเชิงฟังก์ชั่นให้ประโยชน์อะไรบ้าง? ฟังก์ชั่นการเขียนโปรแกรมช่วยให้การเขียนโปรแกรมที่มีศักยภาพน้อยลงสำหรับข้อบกพร่องเพราะแต่ละองค์ประกอบจะแยกได้อย่างสมบูรณ์ นอกจากนี้การใช้การเรียกซ้ำและฟังก์ชั่นชั้นหนึ่งช่วยให้สามารถพิสูจน์ความถูกต้องได้ง่ายซึ่งมักจะสะท้อนโครงสร้างของรหัส
ฉันไม่คิดว่าคนที่สมจริงที่สุดคิดว่าการเขียนโปรแกรมที่ใช้งานได้จะกลายเป็นจริง (กลายเป็นกระบวนทัศน์หลักเช่น OO) ท้ายที่สุดปัญหาทางธุรกิจส่วนใหญ่ไม่ใช่ปัญหาทางคณิตศาสตร์ที่น่าสนใจ แต่มีกฎเกณฑ์ที่จำเป็นในการย้ายข้อมูลไปรอบ ๆ และแสดงในรูปแบบต่าง ๆ ซึ่งหมายความว่ามันไม่เหมาะสำหรับกระบวนทัศน์การเขียนโปรแกรมที่ใช้งานได้จริง
OTOH การเขียนโปรแกรมที่ใช้งานได้เป็นสิ่งที่ทำให้การเขียนโปรแกรมสนุก มันทำให้คุณซาบซึ้งในความงามที่เป็นธรรมชาติและไร้กาลเวลาของนิพจน์สั้น ๆ ของคณิตศาสตร์พื้นฐานของจักรวาล ผู้คนบอกว่าการเรียนรู้การเขียนโปรแกรมฟังก์ชั่นจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น แน่นอนว่าเป็นเรื่องส่วนตัว โดยส่วนตัวฉันไม่คิดว่ามันเป็นเรื่องจริงอย่างสมบูรณ์เช่นกัน
มันทำให้คุณมีชีวิตที่ดีขึ้น
ฉันต้องมีความหนาแน่น แต่ฉันก็ยังไม่เข้าใจ มีตัวอย่างจริงของแอปขนาดเล็กที่เขียนด้วยภาษาที่ใช้งานได้เช่น F # ซึ่งคุณสามารถดูซอร์สโค้ดและดูว่าทำไมและทำไมจึงควรใช้วิธีการดังกล่าวดีกว่าพูด C # หรือไม่
ฉันจะชี้ให้เห็นว่าทุกสิ่งที่คุณพูดเกี่ยวกับภาษาที่ใช้งานได้คนส่วนใหญ่พูดเกี่ยวกับภาษาวัตถุเชิงประมาณ 20 ปีที่ผ่านมา ย้อนกลับไปตอนนั้นมันเป็นเรื่องธรรมดามากที่ได้ยินเรื่อง OO
* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways
การเปลี่ยนแปลงต้องมาจากที่ไหนสักแห่ง การเปลี่ยนแปลงที่มีความหมายและสำคัญจะทำให้ตัวเองเกิดขึ้นโดยไม่คำนึงว่าผู้ที่ได้รับการฝึกอบรมเกี่ยวกับเทคโนโลยีก่อนหน้านี้จะเห็นว่าการเปลี่ยนแปลงนั้นไม่จำเป็น คุณคิดว่าการเปลี่ยนแปลงของ OO นั้นดีหรือไม่แม้ว่าจะเป็นคนที่ต่อต้านมันในเวลานั้น?
F # สามารถจับได้เนื่องจาก Microsoft กำลังผลักดันมัน
มือโปร:
Contra:
ดังนั้นฉันให้โอกาส 50:50 แก่ F # ในการกลายเป็นสิ่งสำคัญ ภาษาที่ใช้งานอื่น ๆ จะไม่สร้างขึ้นในอนาคตอันใกล้
ผมคิดว่าเหตุผลหนึ่งคือการที่บางคนรู้สึกว่าเป็นส่วนที่สำคัญที่สุดของการไม่ว่าจะเป็นภาษาที่จะได้รับการยอมรับเป็นวิธีที่ดีที่เป็นภาษา น่าเสียดายที่สิ่งต่าง ๆ นั้นง่ายมาก ตัวอย่างเช่นฉันจะยืนยันว่าปัจจัยที่ใหญ่ที่สุดที่อยู่เบื้องหลังการยอมรับของ Python ไม่ใช่ภาษานั้น (แม้ว่าจะเป็นสำคัญมาก) เหตุผลที่ดีที่สุดที่ Python ได้รับความนิยมคือห้องสมุดมาตรฐานขนาดใหญ่และชุมชนที่ใหญ่กว่าของห้องสมุดบุคคลที่สาม
ภาษาอย่าง Clojure หรือ F # อาจเป็นข้อยกเว้นสำหรับกฎนี้เนื่องจากพิจารณาว่าเป็นภาษา JVM / CLR เป็นผลให้ฉันไม่มีคำตอบสำหรับพวกเขา
แอปพลิเคชันส่วนใหญ่สามารถแก้ไขได้ใน [ใส่ภาษาที่คุณชื่นชอบกระบวนทัศน์ ฯลฯ ที่นี่]
แม้ว่าจะเป็นจริง แต่เครื่องมือต่าง ๆ สามารถใช้แก้ปัญหาต่าง ๆ ได้ ฟังก์ชั่นช่วยให้เกิดสิ่งที่เป็นนามธรรมอีกระดับ (สูงกว่า) ที่ช่วยให้การทำงานของเรามีประสิทธิภาพมากขึ้นเมื่อใช้อย่างถูกต้อง
สำหรับฉันแล้วดูเหมือนว่าคนที่ไม่เคยเรียน Lisp หรือ Scheme มาก่อนในระดับปริญญาตรีกำลังค้นพบมัน เช่นเดียวกับหลายสิ่งในสาขานี้มีแนวโน้มที่จะโฆษณาและสร้างความคาดหวังสูง ...
มันจะผ่านไป
ฟังก์ชั่นการเขียนโปรแกรมที่ยอดเยี่ยม อย่างไรก็ตามมันจะไม่ใช้เวลาทั่วโลก C, C ++, Java, C #, และอื่น ๆ จะยังคงอยู่
ฉันคิดว่าอะไรจะมาจากความสามารถข้ามภาษา - ตัวอย่างเช่นการนำสิ่งต่าง ๆ มาใช้ในภาษาที่ใช้งานได้และจากนั้นให้เข้าถึงสิ่งนั้นในภาษาอื่น
เมื่ออ่าน "ภาษาโปรแกรมหลักต่อไป: มุมมองของนักพัฒนาเกม" โดย Tim Sweeney, Epic Games ความคิดแรกของฉันคือ - ฉันต้องเรียน Haskell
สิ่งต่าง ๆ ได้เคลื่อนไหวไปในทิศทางที่ใช้งานได้ระยะหนึ่งแล้ว เด็กใหม่สองคนที่ยอดเยี่ยมในช่วงไม่กี่ปีที่ผ่านมาคือ Ruby และ Python ทั้งคู่มีความใกล้ชิดกับภาษาที่ใช้งานได้ดีกว่าสิ่งที่เกิดขึ้นก่อนหน้าพวกเขามากจนทำให้ Lispers บางคนเริ่มสนับสนุนอย่างใดอย่างหนึ่ง
และด้วยฮาร์ดแวร์แบบขนานขนาดใหญ่ที่สร้างแรงกดดันให้กับทุกคน - และภาษาที่ใช้งานได้ดีที่สุดในการจัดการกับการเปลี่ยนแปลง - มันไม่ได้กระโดดไกลอย่างที่ครั้งหนึ่งเคยคิดว่า Haskell หรือ F # จะเป็นเรื่องใหญ่ต่อไป
คุณได้ติดตามวิวัฒนาการของภาษาการเขียนโปรแกรมเมื่อเร็ว ๆ นี้? ภาษาการเขียนโปรแกรมกระแสหลักทุกรุ่นใหม่ดูเหมือนว่าจะยืมคุณสมบัติมากขึ้นจากการใช้งานโปรแกรม
การปิดฟังก์ชั่นที่ไม่ระบุตัวตนการผ่านและการส่งคืนฟังก์ชั่นเป็นค่าที่เคยเป็นคุณสมบัติแปลกใหม่ที่แฮ็กเกอร์ Lisp และ ML รู้จักเท่านั้น แต่ค่อยๆ C #, Delphi, Python, Perl, Javascript ได้เพิ่มการสนับสนุนสำหรับการปิด มันเป็นไปไม่ได้สำหรับภาษาที่กำลังจะมาถึงนี้ที่จะต้องดำเนินการอย่างจริงจังโดยไม่ต้องปิด
หลายภาษาโดยเฉพาะอย่างยิ่ง Python, C #, และ Ruby มีการสนับสนุนดั้งเดิมสำหรับรายการความเข้าใจและรายการกำเนิด
ML เป็นหัวหอกในการเขียนโปรแกรมทั่วไปในปี 1973 แต่การสนับสนุนยาชื่อสามัญ ("parametric polymorphism") เป็นเพียงมาตรฐานอุตสาหกรรมในช่วง 5 ปีที่ผ่านมา ถ้าฉันจำได้อย่างถูกต้อง Fortran สนับสนุน generics ในปี 2003 ตามด้วย Java 2004, C # ในปี 2005, Delphi ในปี 2008 (ฉันรู้ว่า C ++ ได้รองรับเทมเพลตตั้งแต่ปี 1979 แต่ 90% ของการสนทนาบน STL ของ C ++ เริ่มต้นด้วย "นี่มีปีศาจ" .)
สิ่งที่ทำให้คุณสมบัติเหล่านี้น่าสนใจสำหรับโปรแกรมเมอร์? มันควรจะชัดเจนชัดถ้อยชัดคำ: มันจะช่วยให้โปรแกรมเมอร์เขียนโค้ดสั้น ทุกภาษาในอนาคตจะได้รับการสนับสนุนอย่างน้อยก็ปิดหากพวกเขาต้องการที่จะแข่งขัน ในแง่นี้การเขียนโปรแกรมการทำงานอยู่ในกระแสหลัก
แอปพลิเคชั่นส่วนใหญ่นั้นง่ายพอที่จะแก้ไขในวิธี OO ปกติ
ใครบอกว่าไม่สามารถใช้การเขียนโปรแกรมฟังก์ชั่นสำหรับสิ่งที่ง่ายเกินไป? ไม่ใช่ทุกฟังก์ชั่นโปรแกรมที่จำเป็นต้องเป็นคอมไพเลอร์, ผู้พิสูจน์ทฤษฎีบท, หรือสวิตช์การสื่อสารโทรคมนาคมแบบขนานอย่างหนาแน่น ฉันใช้ F # เป็นประจำสำหรับสคริปต์เฉพาะกิจนอกเหนือไปจากโครงการที่ซับซ้อนกว่าของฉัน
มันเป็นเรื่องที่น่าจับตามองเพราะเป็นเครื่องมือที่ดีที่สุดในการควบคุมความซับซ้อน ดู:
- สไลด์ 109-116 ของ Simon Peyton-Jones พูดคุย "A Taste of Haskell"
- "ภาษาโปรแกรมกระแสหลักต่อไป: มุมมองของนักพัฒนาเกม" โดย Tim Sweeney
ฉันเห็นด้วยกับจุดแรก แต่เวลาเปลี่ยน บริษัท จะตอบสนองแม้ว่าพวกเขาจะรับช่วงปลายหากพวกเขาเห็นว่ามีข้อได้เปรียบที่จะมี ชีวิตเป็นแบบไดนามิก
พวกเขาสอน Haskell และ ML ที่ Stanford ในช่วงปลายยุค 90 ฉันแน่ใจว่าสถานที่เช่น Carnegie Mellon, MIT, Stanford และโรงเรียนที่ดีอื่น ๆ กำลังนำเสนอให้กับนักเรียน
ฉันยอมรับว่าแอป "เปิดเผยฐานข้อมูลเชิงสัมพันธ์บนเว็บ" ส่วนใหญ่จะดำเนินต่อไปในหลอดเลือดดำเป็นเวลานาน Java EE, .NET, RoR และ PHP ได้พัฒนาวิธีแก้ปัญหาที่ดีสำหรับปัญหานั้น
คุณเคยเจอกับบางสิ่งที่สำคัญ: อาจเป็นปัญหาที่ไม่สามารถแก้ไขได้อย่างง่ายดายด้วยวิธีการอื่นที่จะช่วยเพิ่มการเขียนโปรแกรมการทำงาน มันจะเป็นอะไร?
ฮาร์ดแวร์มัลติคอร์ขนาดใหญ่และการประมวลผลแบบคลาวด์จะผลักดันพวกเขาไปด้วยหรือไม่
เนื่องจาก FP มีประโยชน์อย่างมากในแง่ของผลผลิตความน่าเชื่อถือและการบำรุงรักษา หลายคอร์อาจเป็นแอพพลิเคชั่นนักฆ่าที่ในที่สุดก็ได้รับ บริษัท ขนาดใหญ่เพื่อสลับไปมาแม้จะมีรหัสดั้งเดิมจำนวนมากยิ่งไปกว่านั้นแม้แต่ภาษาเชิงพาณิชย์ขนาดใหญ่เช่น C # ก็ยังมีฟังก์ชั่นการใช้งานที่แตกต่าง ไม่เหมาะกับการเกิดพร้อมกันและการขนาน
ฉันไม่เห็นด้วยที่โปรแกรมเมอร์ "ปกติ" จะไม่เข้าใจ ในที่สุดพวกเขาก็จะเข้าใจเหมือนกันว่าในที่สุดพวกเขาก็เข้าใจ OOP (ซึ่งเป็นเรื่องลึกลับและแปลกประหลาดหากไม่เป็นเช่นนั้น)
นอกจากนี้มหาวิทยาลัยส่วนใหญ่สอน FP หลายคนถึงกับสอนเป็นหลักสูตรการเขียนโปรแกรมแรก
ว้าว - นี่คือการสนทนาที่น่าสนใจ ความคิดของฉันเกี่ยวกับเรื่องนี้:
FP ทำให้บางงานค่อนข้างง่าย (เทียบกับภาษาที่ไม่มี FP) ไม่มีภาษา FP กำลังเริ่มนำแนวคิดจาก FP มาใช้แล้วดังนั้นฉันจึงสงสัยว่าแนวโน้มนี้จะดำเนินต่อไปและเราจะเห็นการรวมที่มากขึ้นซึ่งจะช่วยให้ผู้คนกระโดดข้ามไปสู่ FP ได้ง่ายขึ้น
ฉันไม่รู้ว่ามันจะทันหรือไม่ แต่จากการตรวจสอบของฉันภาษาการทำงานนั้นเกือบจะคุ้มค่าที่จะเรียนรู้และจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น เพียงแค่ทำความเข้าใจความโปร่งใสในการอ้างอิงทำให้การตัดสินใจในการออกแบบเป็นเรื่องง่ายขึ้นมาก โดยทั่วไปหากคุณพบปัญหาก็มีแนวโน้มที่จะมีปัญหากับการส่งออกของฟังก์ชั่นเดียวมากกว่าปัญหาที่มีสถานะไม่สอดคล้องกันซึ่งอาจมีสาเหตุมาจากหลายร้อยชั้นเรียน / วิธีการ / ฟังก์ชั่น ในภาษา imparative ที่มีผลข้างเคียง
ลักษณะไร้สัญชาติของ FP แผนที่เป็นธรรมชาติมากขึ้นกับลักษณะไร้รัฐของเว็บและทำให้ภาษาที่ใช้งานได้ง่ายขึ้นไปยังเว็บแอป RESTFUL ที่หรูหรากว่า ตัดกับกรอบ JAVA และ. NET ที่ต้องหันไปใช้ HACKS ที่น่าเกลียดอย่างเช่นปุ่ม VIEWSTATE และ SESSION เพื่อรักษาสถานะของแอปพลิเคชันและคงไว้ซึ่งภาษาที่จำเป็นในการใช้งานไร้สาระเช่นเว็บ
ยิ่งแอปพลิเคชั่นของคุณไร้สัญชาติยิ่งสามารถประมวลผลแบบขนานได้ง่ายขึ้น สำคัญอย่างยิ่งสำหรับเว็บหากเว็บไซต์ของคุณได้รับความนิยม มันไม่ได้ตรงไปตรงมาเสมอเพียงแค่เพิ่มฮาร์ดแวร์เข้ากับเว็บไซต์เพื่อให้ได้ประสิทธิภาพที่ดี
มุมมองของฉันคือว่ามันจะจับในขณะนี้ว่า Microsoft ได้ผลักดันมันมากขึ้นในกระแสหลัก สำหรับฉันมันน่าสนใจเพราะมันสามารถทำอะไรให้เราได้เพราะมันเป็นความท้าทายใหม่และเพราะโอกาสในการทำงานที่มันไม่พอใจสำหรับอนาคต
เมื่อเข้าใจแล้วจะเป็นอีกเครื่องมือหนึ่งที่ช่วยให้เราทำงานได้มากขึ้นในฐานะโปรแกรมเมอร์
ประเด็นที่ขาดไปในการอภิปรายคือระบบประเภทที่ดีที่สุดนั้นพบได้ในภาษา FP ร่วมสมัย ยิ่งไปกว่านั้นคอมไพเลอร์สามารถอนุมานทุกประเภท (หรืออย่างน้อยที่สุด) โดยอัตโนมัติ
เป็นที่น่าสนใจที่หนึ่งใช้เวลาครึ่งหนึ่งในการเขียนชื่อประเภทเมื่อเขียนโปรแกรม Java แต่ Java นั้นยังไม่ปลอดภัยเท่าที่ควร แม้ว่าคุณจะไม่สามารถเขียนชนิดในโปรแกรม Haskell (ยกเว้นเอกสารที่ตรวจสอบคอมไพเลอร์) และรหัสนั้นปลอดภัย 100%
นอกเหนือจากคำตอบอื่น ๆ แล้วการหล่อแก้ปัญหาด้วยฟังก์ชันการทำงานที่บริสุทธิ์นั้นทำให้เราต้องเข้าใจปัญหาให้ดีขึ้น ในทางกลับกันการคิดในรูปแบบที่ใช้งานได้จะช่วยพัฒนาทักษะการแก้ปัญหาได้ดีขึ้น
* อาจเป็นเพราะกระบวนทัศน์การทำงานดีกว่าหรือเพราะจะสามารถเพิ่มมุมการโจมตีได้