ทำหน้าที่เป็นภาษาแรก


คำตอบ:


16

ปัญหาที่สำคัญอย่างหนึ่งก็คือถ้าคุณเริ่มต้นด้วยภาษาอย่าง Haskell ทุกอย่างจะดูไม่ถึงขนาด

สุจริตฉันคิดว่าเริ่มต้นด้วยภาษาเช่น Haskell หรือรูปแบบจะเป็นความคิดที่ดี

(ฉันยอมรับว่าฉันเป็นคนติดภาษาที่ใช้งานได้) แก้ไข:

ตกลงสิ่งที่ฉันชอบเกี่ยวกับทั้งสองภาษา:

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

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


เพื่อความเป็นธรรมกลุ่มภาษาทั้งหมดได้รวมเอาแง่มุมที่ใช้งานได้มากขึ้นเข้าด้วยกันดังนั้นชีวิตจึงไม่เลวร้ายอย่างที่เคยเป็นมา
Tikhon Jelvis

จริงและสำหรับคนที่รัก FP นี่มันไม่มีอะไรนอกจากเป็นสิ่งที่ดี
Zachary K

3
ฉันรู้ - ฉันแนะนำว่านี่เป็นเหตุผลที่ดีสำหรับการเรียนรู้ FP ก่อน มันเป็นเทรนด์ที่ทำให้ฉันมีความสุขไปพักหนึ่งแล้ว
Tikhon Jelvis

ไม่ได้พูดมากนักเพื่อตอบคำถาม แต่ทำไมคุณถึงชอบ Haskell (หรือ Scheme)? พวกเขาจะดีเหมือนภาษาแรกสำหรับการเรียนรู้หรือไม่? ทำไม?
jimwise

เพิ่มความคิดเห็นบางอย่างเกี่ยวกับทั้งสองภาษา
Zachary K

6

ข้อได้เปรียบที่ใหญ่ที่สุดของการเรียนรู้ภาษาที่ใช้งานได้ก่อนเรียนรู้ OOP lang คือทักษะการเขียนโปรแกรมของคุณได้รับการพัฒนาก่อนแล้วคุณจะสามารถเข้าใจแนวคิด OOP ได้อย่างง่ายดาย หากคุณเริ่มต้นด้วยภาษา OOP คุณจะต้องเรียนรู้สองสิ่งพร้อมกัน: "คิดเกี่ยวกับรหัส" และ "คิดถึง OOD" มันสามารถทำให้เสียสมาธิ เริ่มฝึกภาษาที่ใช้งานได้และพัฒนาทักษะการเขียนโปรแกรมของคุณ จากนั้นเรียนรู้ OOP และกระบวนทัศน์อื่น ๆ เนื่องจาก OOP ถูกออกแบบมาเพื่อชดเชยการเขียนโปรแกรมเชิงโครงสร้างมันจะง่ายกว่าที่จะเข้าใจว่าทำไม นั่นคือเหตุผลที่หลักสูตร CS เริ่มต้นด้วย C จากนั้นไปที่ C ++


1
ที่มหาวิทยาลัยของฉันเราเริ่มต้นด้วยภาษาที่ใช้งานได้มาตรฐาน ML และเรียนรู้ว่าผลข้างเคียงคืออะไร หลังจากนั้นเราเรียนรู้ C แต่เราไม่เคยเรียน C ++
Jonas

@Jonas ฉันเดาว่าประเทศ / มหาวิทยาลัยต่าง ๆ มีโครงสร้างหลักสูตรที่แตกต่างกันมาก ในมหาวิทยาลัยของฉัน C ตามด้วย C ++ เป็นมาตรฐานสำหรับหลักสูตร Comuter Science Engg แต่สำหรับสาขาวิศวกรรมอื่น ๆ มีเพียงสอน C เท่านั้น
DPD

ที่มหาวิทยาลัยของฉันเราเริ่มต้นด้วย Java จากนั้นใช้ภาษาที่เหมาะสมกับหลักสูตรหลังจากนั้น ตัวอย่างเช่น C / C ++ ใช้สำหรับการเขียนโปรแกรมระบบ C # สำหรับ UI ภาษาแอสเซมบลีต่าง ๆ สำหรับองค์กรคอมพิวเตอร์และฉันคิดว่าสิ่งที่คุณต้องการสำหรับการเขียนโปรแกรมเกม
Carson Myers

ที่มหาวิทยาลัยของฉันเราเริ่มต้นด้วยการเรียนรู้โครงการ (กับ SICP) สองสามสัปดาห์แรกมีการทำงานอย่างสมบูรณ์ OOP ได้รับการแนะนำอย่างดีในหลักสูตร ฉันคิดว่ามันเป็นโครงร่างที่ดีมากและค่อนข้างชอบหลักสูตร
Tikhon Jelvis

6

สำหรับคำถามเกี่ยวกับวิธีการเรียนรู้การเขียนโปรแกรมโดยเริ่มจากฟังก์ชั่นการเขียนโปรแกรมสองข้อแนะนำแบบคลาสสิก:

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

  • ข้อความล่าสุดที่ครอบคลุมพื้นที่ส่วนใหญ่ในระดับเดียวกันและเน้นไปที่วิศวกรรมซอฟต์แวร์คือวิธีการออกแบบโปรแกรมโดย Matthew Felleisen และกลุ่มอื่น ๆ จากทีม Racket / PLT ซึ่งใช้ภาษาของ Racket โครงการ มันยังออนไลน์เช่นเดียวกับความคืบหน้าในรุ่นที่สอง หนังสือเล่มนี้มีข้อได้เปรียบที่ออกแบบมาเพื่อใช้กับสภาพแวดล้อมการเขียนโปรแกรม DrRacket ซึ่งให้ส่วนต่อประสานที่เป็นมิตรมากสำหรับผู้เริ่มต้นและผู้เชี่ยวชาญในการทดลองใช้โค้ด

เกี่ยวกับคำถามของเหตุผลที่เริ่มต้นด้วยการเขียนโปรแกรมการทำงานผมอยากจะชี้ไปที่บล็อกบ๊อบฮาร์เปอร์ Carnegie Mellon เพิ่งปรับปรุงหลักสูตร CS ของพวกเขาเพื่อสอนการเขียนโปรแกรมการทำงานก่อนและ Harper ได้ครอบคลุมความคืบหน้าของพวกเขาระเบิดในบล็อกของเขา ในฐานะที่เป็นหนึ่งในผู้อยู่เบื้องหลังคำจำกัดความของ Standard ML เป็นที่ชัดเจนว่าเขาสำหรับการย้ายครั้งนี้และเขาได้ระบุเหตุผลที่ดี

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


5

ข้อได้เปรียบหลัก (หรือไม่ใช่ข้อเสีย) ของการเริ่มต้นด้วย FP คือแนวคิดส่วนใหญ่สามารถนำไปใช้กับการเขียนโปรแกรมที่จำเป็นเช่นกัน Realm of Racketใช้วิดีโอเกมแบบอะนาล็อกเพื่อสอนทั้งแนวคิดเชิงหน้าที่และเชิงบังคับและนักเรียนที่อุทิศตนไม่เพียง แต่เป็นเกมใช้งาน (npi) เท่านั้น แต่ยังมีความเข้าใจเกี่ยวกับเงื่อนไขการวนซ้ำวนซ้ำ ADTs และการออกแบบที่ขับเคลื่อนด้วยเหตุการณ์ แนวคิดเหล่านี้แพร่หลายในการเขียนโปรแกรมสมัยใหม่และมีการใช้อย่างต่อเนื่อง

สิ่งที่สำคัญยิ่งกว่าคือการเรียนรู้วิธีการเข้ารหัส abstractionsซึ่ง FP มีความยอดเยี่ยมด้วยการใช้ฟังก์ชันลำดับสูงและชนิดข้อมูล วิธีการออกแบบโปรแกรมใช้วิธีการที่ไม่ซ้ำกันโดยการสอนผ่านการเหนี่ยวนำ ตัวอย่างเช่นนักเรียนเรียนรู้วิธีการfoldทำงานโดยดูที่รหัสเพื่อรับทั้งผลรวมและผลงานของรายการการค้นหาสิ่งที่พวกเขามีเหมือนกันและได้รับการนำไปใช้เอง

OOP ที่เทียบเท่ากับข้างต้นอาจเกี่ยวข้องกับสิ่งใดสิ่งหนึ่งต่อไปนี้: อินเทอร์เฟซคลาสนามธรรม generics ฟังก์ชั่นหรือ (ถ้าคุณทำผิด) singletons ในขณะที่สิ่งเหล่านี้เป็นรูปแบบการออกแบบที่ยอมรับได้อย่างสมบูรณ์ใน Java แต่ IMHO พวกเขาไม่ได้อยู่ในหลักสูตรเบื้องต้นและให้บริการเพียงเพื่อทำให้งงงวยหลักการพื้นฐาน แม้ในขณะที่บางคนที่ได้รับการแนะนำให้รู้จักกับภาษา FP "สาย" ฉันสามารถพูดได้ว่าการนำทางทะเลที่เปลี่ยนแปลงตลอดเวลาของ OOP นั้นทำได้ง่ายขึ้นอย่างมากโดยมีจุดยึดที่แข็งแรง


เกือบลืม: RACKETEERSถ้าคุณต้องการที่จะซื้อดินแดนของแร็กเกตลองคูปองนี้: ไม่แน่ใจว่าเมื่อมันหมดอายุขออภัย
ข้อผิดพลาด

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

1
ฉันไม่เคยได้ยิน Realm of Racket แต่จากชื่อทันทีรู้ว่ามันคืออะไรเพราะชื่อนี้มีการอ้างอิงถึงดินแดนแห่ง Lisp พี่ชายของมัน
Magus

4

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

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

ดังนั้นทุกอย่างขึ้นอยู่กับสิ่งที่คุณกำลังมองหา


2

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


1
ฉันคิดว่าสมมติฐานของคุณผิด มีเป็นบทเรียนที่ดี, หนังสือ, เอกสารและอื่น ๆ เกี่ยวกับสิ่งที่ทำงาน ยิ่งไปกว่านั้นมีเอกสารมากมายที่เกี่ยวข้องกับสิ่งพิเศษเช่นระบบพิมพ์, การนำไปใช้งาน, เครื่องเสมือน, แลมบ์ดาแคลคูลัสเป็นต้น
Ingo

1

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

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

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

ดังนั้นเรียนรู้ทั้งสอง! หรืออาจจะดีกว่า: ก่อนอื่นเรียนรู้ภาษาที่รวบรวมทั้งสองอย่างเช่น Scala หากคุณไม่สนใจเสื้อยืดผูกเนคไทและสำเนียงดัตช์เล็กน้อยคุณอาจพบว่าการบรรยาย FP โดยดร. Erik Meijerมีประโยชน์ซึ่งอยู่ใน MSDN

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