ฉันไม่รู้ซีและทำไมฉันจึงควรเรียนรู้ [ปิด]


58

ภาษาโปรแกรมแรกของฉันคือ PHP ( อ้าปากค้าง ) หลังจากนั้นฉันเริ่มทำงานกับ JavaScript ฉันเพิ่งทำงานใน C #

ฉันไม่เคยดูภาษาระดับต่ำหรือระดับกลางเช่น C

ฉันทามติทั่วไปในการเขียนโปรแกรมชุมชน - ขนาดใหญ่คือ "โปรแกรมเมอร์ที่ไม่ได้เรียนรู้อะไรบางอย่างเช่น C, ตรงไปตรงมาก็ไม่สามารถจัดการแนวคิดการเขียนโปรแกรมเช่นตัวชี้ประเภทข้อมูลค่าผ่านการอ้างอิง ฯลฯ "

ผมไม่เห็นด้วย. ฉันยืนยันว่า:

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

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

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

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

ไม่มีใครมีตัวอย่างในโลกแห่งความจริงของสิ่งที่เขียนในภาษาระดับสูง - พูด Java, Pascal, PHP หรือ JavaScript - ได้รับประโยชน์อย่างแท้จริงจากความรู้ก่อนหน้าของ C? ตัวอย่างจะได้รับการชื่นชมมากที่สุด


@ สตีเฟ่นขอโทษ ... ฉันเข้าใจผิด (แต่คุณจะเห็นว่าทำไมคุณต้องเรียนรู้ c / c ++ ใช่มั้ย)
ApprenticeHacker

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


คุณช่วยให้บริบท (url) กับเราที่ "ไม่สามารถจัดการกับแนวคิดการเขียนโปรแกรมเช่นตัวชี้ ... " มาจากไหน?
k3b

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

คำตอบ:


113

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

ระดับที่ต่ำกว่า C คือชุดประกอบที่พูดโดย CPU เฉพาะ

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


12
Frank: คุณโดนตะปูบนหัว การทำความเข้าใจว่าคอมพิวเตอร์ทำงานอย่างไรการจัดการหน่วยความจำและการจัดสรรพร้อมกับแนวคิดที่ว่าคุณสามารถชื่นชมภาษาระดับสูงกว่านี้คือเหตุผลในการเรียนรู้ C. ฉันโชคดีที่เราต้องเรียนรู้ C เพื่อใช้งานคลาสโครงการเช่นการนำเลเยอร์ TCP พื้นฐานผ่าน UDP .
Chris

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

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

18
@TheLQ ฉันพูดไม่ออก คุณจะได้ประโยชน์จากการรู้ว่าคอมพิวเตอร์ทำงานอย่างไรภายใน คุณได้รับความเข้าใจที่ชัดเจนขึ้นเกี่ยวกับสิ่งที่คุณกำลังทำ ค่อนข้าง: คุณกำลังเรียนรู้ว่าคุณกำลังทำอะไรกับเครื่องจักรในตอนแรก
Frank Shearar

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

72

ฉันไม่คิดว่าคำตอบใด ๆ ที่นี่เป็นสิ่งที่ OP ต้องการดังนั้นฉันจะแสดงความคิดเห็นของตัวเอง

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

อย่างไรก็ตามในทางปฏิบัติไม่ว่าคุณจะรู้หรือไม่ว่าคุณกำลังทำอะไรในฐานะโปรแกรมเมอร์ไม่จำเป็นต้องป้องกันคุณจากการพัฒนาซอฟต์แวร์ที่มีประโยชน์และยอดเยี่ยมโดยใช้เครื่องมือระดับสูง ฉันหมายความว่าผู้สร้าง Stack Overflow, Jeff Atwood ดูเหมือนจะไม่รู้ด้วยซ้ำว่า C แต่ฉันจะบอกว่า Stack Overflow เป็นเว็บแอพพลิเคชันที่ดี

ไม่ว่าคุณจะตัดสินใจเรียนรู้ C (หรือ C ++ หรือแอสเซมบลี) หรือไม่นั้นขึ้นอยู่กับประเภทของโปรแกรมเมอร์ที่คุณต้องการ หากคุณเพียงแค่ต้องการพัฒนาแอปพลิเคชันเว็บหรือแอปทางธุรกิจที่ยอดเยี่ยมไม่จำเป็นต้องเรียนรู้ C. แต่ถ้าคุณต้องการที่จะทำให้คุณเก่งในสิ่งที่คุณทำ - ถ้าคุณต้องการที่จะทำงานในโครงการที่ยอดเยี่ยมจริงศิลปะคุณต้องจริงจังกับตัวเองอย่างจริงจังในฐานะโปรแกรมเมอร์เพื่อให้เข้าใจถึงการทำงานของคอมพิวเตอร์ เนื่องจาก C เป็นภาษาหลักของระบบปฏิบัติการรวมถึงภาษาที่ให้ความสำคัญกับทุกสิ่ง (ตั้งแต่เคอร์เนล Linux ไปจนถึง Java VM ส่วนใหญ่ไปจนถึงล่าม Python และ Ruby ฐานข้อมูล SQL เว็บเซิร์ฟเวอร์และไดรเวอร์อุปกรณ์ทุกชนิด) ความเข้าใจอย่างลึกซึ้งของภาษาไปไกล

ไม่ต้องพูดถึงว่าการรู้ว่า C (หรือ C ++) เปิดโอกาสครั้งใหญ่สำหรับการมีส่วนร่วมในโครงการโอเพ่นซอร์สขนาดใหญ่ที่ส่งผลกระทบต่อผู้คนนับล้าน (หรือหลายร้อยล้านคน) ต้องการทำงานเพื่อปรับปรุง Python interpreter หรือ Chromium เว็บเบราว์เซอร์หรือไม่ ทีนี้คุณต้องรู้ C สำหรับอันแรกและ C ++ สำหรับอันหลัง

นั่นเป็นเหตุผลที่เปรียบเทียบ C กับภาษาธรรมชาติที่ตายแล้วเช่นละตินหรือเทคโนโลยีที่ล้าสมัยเช่นม้าและรถม้าผิดทั้งหมด โครงสร้างพื้นฐานซอฟต์แวร์ส่วนใหญ่ในศตวรรษที่ 21 ของเราขับเคลื่อนด้วยรหัส C ซึ่งเป็นสาเหตุที่ C ยังคงมีความเกี่ยวข้องในทุกวันนี้

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


5
คุณไม่ได้เสียงที่ทระนง โอเคอาจจะเล็กน้อย :)
Stephen

7
คำตอบที่ยอดเยี่ยม ฉันตั้งโปรแกรมสำเร็จเป็นเวลาสิบปีโดยไม่ได้เรียนรู้ C และ C ++ และสามารถทำงานที่เหลือได้โดยไม่ต้องเรียนรู้ แต่เมื่อฉันเรียนรู้เมื่อปีที่แล้วฉันได้เขียนซอฟต์แวร์ที่ดีกว่าไม่ใช่เฉพาะใน C ++ แต่เป็นภาษาอื่นของฉันด้วย
John M Gant

3
ต่อไปนี้เป็นสิ่งที่ผู้สร้างรายอื่นของ SO กล่าวเกี่ยวกับการรู้ C: joelonsoftware.com/articles/ThePerilsofJavaSchools.html joelonsoftware.com/articles/CollegeAdvice.html joelonsoftware.com/articles/fog0000000319.html
Isaac Kleinman

3
ทำไมจึงเป็น "ผิดอย่างสมบูรณ์" เพื่อเปรียบเทียบ C กับละติน? ฉันคิดว่ามันเป็นการเปรียบเทียบที่ยอดเยี่ยม ละตินมีอยู่ทุกหนทุกแห่งรอบตัวเรา 58% ของคำศัพท์ภาษาอังกฤษได้รับอิทธิพลจากละติน (โดยตรงหรือผ่านภาษาอื่น ๆ ที่โรแมนติก) ละตินยังถือเป็นกุญแจสำคัญในการทำความเข้าใจวัฒนธรรมของเรา กฎหมายประชาธิปไตยศาสนาโครงสร้างพื้นฐานการวางผังเมืองและพื้นที่อื่น ๆ สามารถสืบย้อนไปถึงจักรวรรดิโรมันได้ คุณสามารถเลือกที่จะเพิกเฉย C ได้ในวิธีเดียวกับที่คุณไม่สนใจภาษาละติน แต่คุณไม่สามารถหลีกเลี่ยงได้ "ละตินและกรีกไม่ใช่ภาษาที่ตายแล้วพวกเขาเพิ่งจะตาย" (JW McKail)
Anders Sjöqvist

2
@ AndersSjöqvistมันจะผิดเพราะไม่มีใครพูดภาษาละตินอีกต่อไปแม้ว่ามันจะมีอิทธิพลอย่างลึกซึ้งต่อการพัฒนาภาษาสมัยใหม่ ในขณะที่ C ถูกใช้อย่างแข็งขันและใช้งานได้ทุกที่ในเกือบทุก OS, VM, ฐานข้อมูลหรือล่าม ละตินเป็นเช่นสมมติว่า ... Simula - ภาษาตายส่วนใหญ่ที่มีอิทธิพลต่อภาษาที่มีชีวิตอย่างลึกซึ้ง แต่ยังไม่ได้ใช้นอกวิชาการ
Charles Salvia

12

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

นี่ก็หมายความว่าถ้าคุณทำงานใน C / C ++ อย่างน้อยคุณควรจะสามารถอ่านแอสเซมบลีบนแพลตฟอร์มของคุณได้

สำหรับการเรียนรู้ C เมื่อคุณต้องการ: การสังเกตของฉันคือโปรแกรมเมอร์ส่วนใหญ่สามารถเรียนรู้ Perl / Python / Javascript ตามต้องการ แต่แอสเซมเบลอร์ / C / Lisp ดูเหมือนจะต้องใช้เวลามากขึ้น เกิดขึ้น


9
ตกลง "C / C ++" ฉันสามารถอยู่กับได้ (ทนายความด้านภาษาถูกสาป) และ "Perl / Python / Javascript" ก็สมเหตุสมผลดี แต่สำหรับความรักของพระเจ้าทำไม "แอสเซมเบลอร์ / C / เสียงกระเพื่อม"? นั่นก็เหมือนกับการพูดว่า "apple / orange / Barrack Obama" สามภาษานั้นไม่มีความเกี่ยวข้องกัน
Jason Baker

@ Jason สิ่งธรรมดาสามัญเพียงอย่างเดียวที่ฉันแนะนำคือคนส่วนใหญ่พบว่าสามภาษาที่ยากต่อการรับและมันอาจจะคุ้มค่ากับ OP ในขณะที่ใช้เวลากับพวกเขาก่อนที่จะต้องใช้พวกเขาทันที การคำนวณทางคณิตศาสตร์และฟังก์ชั่นการใช้งานของตัวชี้ไม่เหมือนกันมากนักยกเว้นว่าผู้คนจะต้องจ้องมองพวกเขาให้นานขึ้นก่อนที่จะเข้าใจ
Charles E. Grant

ฉันไม่เห็นด้วยเพิ่มเติม ในอีกทางหนึ่งไปสู่ระดับที่สูงขึ้นของสิ่งที่เป็นนามธรรม“ office IT guy / gal” ที่สามารถทำอย่างน้อยการเขียนโปรแกรมบางอย่างมักจะดีกว่าที่ไม่สามารถทำได้
Emmet

7

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

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


2
เรียนรู้การอ่านภาษาแอสเซมบลีบางที ปัญหาคือฉันมีตระกูลโปรเซสเซอร์ที่แตกต่างกันมากกว่า 10 ตระกูลที่ฉันใช้และเรียนรู้ตัวแปรที่แตกต่างกันทั้งหมดเป็นสูตรสำหรับความสับสนและความสับสนวุ่นวาย ลองเปรียบเทียบ AMD SHARC กับ Atmel AVR32 และ TI MSP430
คุณ

@Ian: ถูกต้อง เป็นการดีที่คุณควรเรียนรู้ภาษาแอสเซมบลีของซุ้มประตูที่คุณพัฒนามากที่สุด สำหรับคนส่วนใหญ่ฉันเดาว่านี่จะเป็น x86 หรือ ARM
dsimcha

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

1
@ สตีเฟ่นคุณควรลองเขียนภาษาแอสเซมเบลอร์ซีพียู 8 บิตนั้นไม่ยากและพยายามที่จะใช้สิ่งเล็ก ๆ น้อย ๆ ทั้ง 6502 (เช่น C64) และ Z80 (เช่นเครื่องจักรธุรกิจ CP / M) เป็นเรื่องที่ให้ความรู้ ประสบการณ์เนื่องจากความแตกต่างในการออกแบบขั้นพื้นฐาน (หน้าดัชนีกับการลงทะเบียน)

1 แม้จะเป็นเท็จอย่างโจ๋งครึ่มAll abstractions are leakyคำสั่ง
โทมัส Eding

7

อคติเป็นหนึ่งในสภาพที่เป็นอยู่ ในสมัยก่อน (ยุค 80 และก่อนหน้านี้) C / C ++ นั้นเป็นข้อกำหนดสำหรับแอปพลิเคชันด้านประสิทธิภาพ มีการเปลี่ยนแปลง แต่นักพัฒนาอาวุโสมักมาจากภูมิหลังเก่าและดูสิ่งต่าง ๆ ในบริบทนั้น

สำหรับการพัฒนาภาษาอื่น ๆจะใช้ภาษาC # เป็นภาษาที่นิยมเช่นเดียวกับ Java ในขณะที่ PHP และ Python เป็นที่นิยมสำหรับโครงการภายในและเป็นประโยชน์เสมอที่จะมีใครสักคนอยู่ในมือพร้อมด้วยความรู้พื้นฐานอย่างน้อยในพื้นที่นั้น โครงการ PHP source สำหรับสมมติว่าระบบติดตามบั๊กของคุณ อย่างไรก็ตามรายละเอียดงานยังคงมาจากเทมเพลตมาตรฐานที่เขียนเมื่อ 25 ปีที่แล้ว


6
"รายละเอียดงานยังคงมาจากเทมเพลตมาตรฐานที่เขียนเมื่อ 25 ปีที่แล้ว" คุณไม่ถูกต้องมากขึ้น
สตีเฟ่น

ขอแสดงความยินดีด้วย John!
ทำเครื่องหมาย C

6

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

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


ฮ่า ๆ. Joels ให้คำแนะนำในคอลัมน์ที่เชื่อมโยง: "คุณควรที่จะเพิกเฉยต่อสิ่งที่ฉันกำลังพูดอยู่ที่นี่และควรสร้างซอฟต์แวร์ออนไลน์บางประเภทที่ให้นักเรียนคนอื่นหาคนออกเดทด้วย"
สตีเฟ่น

3
@ สตีเฟ่น: ถ้าคุณต้องการให้คนอื่นสังเกตเห็นคุณจริงๆให้พวกเขาได้รับการวางหรือจ่าย
Fred Nurk

@ เฟร็ดคำแนะนำที่ดีฮ่า ๆ
Stephen

6

ช่างเป็นงานที่ยอดเยี่ยมมาก! (ตามที่พวกเขาควรจะพูดว่า: นี่เป็นการต่อสู้แบบส่วนตัวหรือทุกคนสามารถเข้าร่วมได้หรือไม่)

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

ไม่ได้หมายความว่าครูคนอื่น ๆ มาที่เดียวกัน พวกเขาเริ่มต้นด้วยภาษาระดับสูง (พื้นฐาน :-) และก้าวไปข้างหน้าจากที่นั่นโดยไม่มีผลร้ายใด ๆ

บรรทัดล่างสุดสตีเฟ่นคุณพูดถูก ฉันจะไม่คิดอย่างนั้น แต่ฉันเคยผิดมาก่อน


4

ฉันเดาว่านี่คือความคืบหน้า

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

มีความเชื่อโชคลางเพราะ C ค่อนข้างยากที่จะเรียนรู้และมันแทบจะไม่มี abstractions (พอยน์เตอร์และ byte stream นั้นสวยมาก) การเรียนรู้มันจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้นหรือให้ข้อมูลเชิงลึกเกี่ยวกับการทำงานของฮาร์ดแวร์ ชั้น

สิ่งนี้ไม่เป็นความจริง มาตรฐาน C ไม่ได้ทำให้คุณเข้าใกล้โลหะมากไปกว่า 3GL อื่น ๆ (Pascal, Fortran ฯลฯ ) การใช้งาน C บางอย่างอาจมีตะขอที่ช่วยให้คุณเข้าถึงพื้นที่ได้มากขึ้น แต่ในพอยน์เตอร์ทั่วไปนั้นเกือบจะใกล้เคียงกับที่คุณได้รับซึ่งไม่ได้ใกล้เคียงเลย คุณไม่สามารถเข้าถึงรีจิสเตอร์หรือคำสถานะโดยตรง

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

ด้วยตัวเองการเรียนรู้ C จะไม่ทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น แน่นอนว่ามันจะทำให้คุณรู้คุณค่าสำหรับประเภทสตริงจริงและไลบรารีคอนเทนเนอร์มาตรฐาน


ฉันเดาว่า "การแข็งค่า" เป็นวิธีหนึ่งในการวาง ในชั้นเรียนการเขียนโปรแกรมระดับมัธยมของฉันมันเป็นคำถามส่วนใหญ่ว่า "ฉันต้องใช้ฟังก์ชั่นนี้ฉันจะแปลง LOLOMGCHAR * เป็น WTFBBQCHAR * ได้อย่างไร"
Katana314

ฉันคิดว่า C เรียนรู้ได้ง่าย อย่างน้อยก็สำหรับฉันจากการอ่าน Kernighan & Ritchie
robert bristow-johnson

2

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

ฉันเขียนโค้ดสำหรับระบบฝังตัวที่มีทรัพยากรหน่วยความจำ จำกัด สูง (ที่ใหญ่ที่สุดที่ฉันทำเมื่อไม่นานมานี้คือ 16kbyte และนั่นใหญ่มาก) ในตลาดนี้จากนั้น C หรือแอสเซมเบลอร์เป็นตัวเลือกเดียวและภาษาระดับสูง ๆ


1
เยี่ยมมาก ... แต่ทุกคนไม่ได้ทำอย่างนั้น ความหมายดูเหมือนว่าผู้ที่ไม่ได้เขียนสำหรับระบบฝังตัวเป็นเพียงการเล่นและไม่พัฒนาอย่างจริงจัง - อย่างน้อยก็ให้นำแบบจำลองของคุณไปเปรียบเทียบในบริบทของระบบฝังตัวของคุณ เห็นได้ชัดว่าไม่ใช่กรณีนี้และเป็นไปได้ที่จะเขียนแอปพลิเคชั่นการผลิตขนาดใหญ่โดยไม่ต้องสัมผัส C.
JohnL

แน่นอนว่ามันเป็นไปได้ที่จะเขียนแอปพลิเคชันการผลิตขนาดใหญ่โดยไม่ต้องไปใกล้ C. ฉันเขียนรหัสเป็นเวลา 10 ปีก่อนที่ฉันจะใช้ C. ฉันใช้ PL / M, Pascal, ADA เช่นเดียวกับแอสเซมเบลอร์ สิ่งเหล่านี้ดีพอ ๆ กับ C สำหรับการเรียนรู้กลไกพื้นฐานของเครื่องและมักจะดีกว่าสำหรับการสร้างรหัสปราศจากข้อผิดพลาด
คุณ

เยี่ยมมาก - แม้ว่าคำตอบของคุณด้านบนไม่ได้ให้ความประทับใจแก่ฉันที่คุณคิดเช่นนั้นดังนั้นคำตอบของฉัน ...
JohnL

คุณมีประสบการณ์เกี่ยวกับเครื่องมือ Java ที่กำหนดเป้าหมายการใช้งานแบบฝังตัวหรือไม่

2

จากประสบการณ์ของผม C / C ++ เป็นบัฟเฟอร์ที่ดีที่แยกโปรแกรมเมอร์ที่ดีออกจากตัวแปลงสัญญาณ VB6 หลังจากทำ C / C ++ ห้าปีฉันได้งานทำใน VB6 ฉันประหลาดใจกับคุณภาพ (หรือขาดมัน) ของโคเดอร์ พวกเขามีความสนใจในความกล้าของภาษาการออกแบบหรือประสิทธิภาพ น่าเสียดายที่เมื่อ บริษัท ย้ายไปที่. Net ตัวแปลงสัญญาณ C / C ++ และตัวแปลงสัญญาณ. Net ใช้เครื่องมือเดียวกัน ตัวแปลงสัญญาณ VB นั้นยิ่งเลวร้ายยิ่งขึ้นตัวเข้ารหัส VB.Net สถานการณ์แย่ลงเมื่อการพัฒนาทั้งหมดไปที่ ASP.NET ทันใดนั้นทุกคนที่สามารถลากและวางการควบคุมเป็นโปรแกรมเมอร์

ในตลาดงานแม้ว่าจะไม่มีความแตกต่างของตัวแปลงสัญญาณฮาร์ดคอร์ (เช่น C / C ++) และนักท่องเที่ยว

ดังนั้นการมี C หรือ C ++ ในประวัติการทำงานของคุณอาจช่วยให้คุณแตกต่างจาก riff-raff


2

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

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

PHP / Python / C # ธรรมดามีเลเยอร์ที่เป็นนามธรรมมากมายระหว่างภาษาและ CPU เลเยอร์เหล่านี้หนามากจนไม่อนุญาตให้คุณมองผ่านมัน เมื่อคุณเรียนรู้ C จะมีชีตบาง ๆ ระหว่างคุณกับ CPU และระบบปฏิบัติการ ที่ไม่ทำให้การเขียนโปรแกรมง่ายขึ้น (และอาจไม่ดีกว่า) แต่คุณสามารถเรียนรู้วิธีการทำงานของ CPU ได้ เมื่อคุณรู้จัก "ตัวกลาง" คุณสามารถเริ่มต้นเชื่อมโยงความรู้นั้นกับภาษาระดับสูงกว่าได้ นี่คือผลประโยชน์ทันทีที่คุณจะได้รับ

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

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


2

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

นอกเหนือจากนั้น - ความรู้ขั้นพื้นฐานใน C และความคุ้นเคยขั้นพื้นฐานกับเครื่องต้นแบบ - คุณจะได้รับเวลาที่ดีที่สุดในการเรียนรู้เรื่องจริงเช่น SICP, TCP / IP Illustrated หรือหนังสือเกี่ยวกับคณิตศาสตร์คอนกรีตอัลกอริทึมหรือโครงสร้างข้อมูล . ของจริง

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

ขับเหงื่อออกจากสิ่งที่แข็ง


1

C เป็นภาษาที่ใช้ในการเขียนภาษาอื่น ช่วยให้คุณได้ใกล้ชิดกับ CPU และฮาร์ดแวร์อื่น ๆ ตามที่คุณต้องการ

หากคุณไม่รู้จัก C คุณไม่ทราบว่าภาษาอื่นจะบรรลุผลลัพธ์ที่ได้อย่างไร

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

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

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


1

C (และอาจเป็น C ++) เป็นทะเลที่คุณว่ายน้ำระบบปฏิบัติการที่จะเรียกใช้รหัสของคุณนั้นอาจถูกเข้ารหัสใน C (และ C ++) ดังนั้น native API ของคุณในการเข้าถึงบริการ OS จะเป็น C

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

มันยังขึ้นอยู่กับความเชี่ยวชาญของคุณในด้านการพัฒนา ตัวอย่างเช่นนักพัฒนาเว็บที่เขียน HTML, Javascript และสคริปต์ฝั่งเซิร์ฟเวอร์บางตัวอาจไม่จำเป็นต้องรู้อะไรเกี่ยวกับ C แต่ระบบกระจายหรือนักพัฒนาเกมจะ

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


1

C มีข้อดีหลายประการ:

  1. C เป็นภาษาระดับต่ำคุณสามารถใช้ c เพื่อพัฒนาเคอร์เนลและไดรเวอร์
  2. C เป็นภาษาที่เร็วที่สุดซอฟต์แวร์พลังงานจำนวนมากได้รับการพัฒนาโดยค ตัวอย่างเช่น: memcached, redis, nginx, apache, mysql เป็นต้น
  3. C เป็นภาษาข้ามแพลตฟอร์ม โปรแกรมที่พัฒนาโดย c สามารถทำงานได้ทุกแพลตฟอร์ม ภาษาข้ามแพลตฟอร์มอื่น ๆ ไม่สามารถทำได้ Java, python, php และอื่น ๆ ไม่สามารถทำงานได้ที่แพลตฟอร์ม iOS
  4. C ++ ไม่สามารถทำงานในระบบฝังตัวหลายตัว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.