การเขียนโปรแกรมระดับต่ำ - มีอะไรให้ฉันบ้าง [ปิด]


32

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

ตอนนี้เพราะฉันไม่เห็นความจำเป็นที่จะเกิดขึ้นฉันรู้สึกว่าฉันควรจะกำหนดเวลาในการศึกษาหัวข้อหรือวางแผนตลอดไป

ตำแหน่งของฉัน

ในช่วง 4 ปีที่ผ่านมาฉันได้มุ่งเน้นไปที่ "เทคโนโลยีเว็บ" ซึ่งอาจเปลี่ยนแปลงได้และฉันเป็นผู้พัฒนาแอปพลิเคชันซึ่งไม่น่าจะเปลี่ยนแปลงได้

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

เพื่อให้บรรลุการใช้งานที่ดีฉันเชื่อว่าสิ่งต่อไปนี้เป็นไปได้

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

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

คำถามของฉัน

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

บทสรุปของฉัน

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


6
@TheLQ: คำถามของฉันไม่ได้ใช้เหตุผลแต่สิ่งที่ฉันจะเรียนรู้จากมัน
back2dos

1
ตัวอย่าง: Back to Basics

ความเป็นไปได้ซ้ำซ้อนของความรู้ระดับต่ำชนิดใด
ริ้น

คำตอบ:


9

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

คิดว่ามันเป็น Haikus หรือ Limericks ซึ่งข้อ จำกัด ทำให้มันน่าสนใจ

เพื่อให้คุณเข้าใจถึงสิ่งที่เป็นไปได้ในสิ่งที่ดูเหมือนเป็นไปไม่ได้ในวันนี้นี่คือหนึ่งในแฮ็คที่ยิ่งใหญ่ที่สุดที่เคยมีมา หมากรุกใน 1 Kb RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/


1
ฉันคิดว่าฉันจะไปที่ "ข้อ จำกัด ทำให้มันน่าสนใจ" จากทุกสิ่งที่กล่าวถึงที่นี่น่าจะดีที่สุด กลับมาที่โรงเรียนฉันได้เขียนโปรแกรมเกมบนเครื่องคิดเลขที่มีหน่วยความจำ 32kB และ CPU 8Mhz มันสนุก แต่ฉันก็ไม่ได้เรียนรู้อะไรมากมายจากตอนนี้
back2dos

Downvoter โปรดพูดถึงว่าทำไม

29

ฉันเพิ่งคิดเมื่อเร็ว ๆ นี้ ตอนนี้ฉันคิดว่าตัวเองเป็นนักพัฒนา C # - ซึ่งก็ดีสำหรับอาชีพของฉัน

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

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

เมื่อใช้ภาษาเก่าฉันคิดว่าคุณถูกบังคับให้ทำทุกอย่างด้วยตัวเอง ใน C # myArray.SortBy(x=>x.Name)ฉันสามารถทำสิ่งที่ชอบ ไม่มีทางที่ฉันจะสามารถทำได้ในซีฉันยอมรับว่าภาษาจะเรียงลำดับที่ดีที่สุดสำหรับฉัน ถ้าฉันจะทำใน C ฉันจะสามารถย้อนกลับไปในสมัยของโมดูลมหาวิทยาลัยและแก้ไขอัลกอริทึมการเรียงลำดับและการค้นหาที่แตกต่างกันของฉัน

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


15
+1 สำหรับการเปล่งความรักในการพูดคุยเกี่ยวกับในฮาร์ดแวร์และเห็นสิ่งที่กระตุก - geek ที่แท้จริง
Gary Rowe

2
คุณสามารถเขียนฟังก์ชันเรียงลำดับด้วยตัวเองใน C # ได้ถ้าต้องการ คุณสามารถใช้ฟังก์ชันไลบรารีเพื่อเรียงลำดับใน C ได้เช่นกันหากคุณต้องการ: gnu.org/s/libc/manual/html_node/Array-Sort-Function.html ฉันจะพูดด้วยการใช้ภาษาที่เก่ากว่าคุณต้องทำสิ่งต่าง ๆ ด้วยตัวเองน้อยลง เพราะปัญหาส่วนใหญ่ได้รับการแก้ไขแล้ว นั่นไม่ได้ป้องกันผู้คนจากการเพิ่มวงล้ออีกต่อไป:
back2dos

15

ข้อเสนอแนะของฉันคือการเล่นกับ C เป็นความอยากรู้ทางปัญญา อย่าลงทุนครั้งใหญ่เพราะมันไม่คุ้ม

เป้าหมายที่แนะนำ:

  • รีเฟรชหน่วยความจำของคุณเกี่ยวกับโครงสร้างข้อมูลและอัลกอริทึมพื้นฐาน
    • มันเป็นเรื่องดีที่ต้องรู้เช่นพีชคณิตและเรขาคณิต
    • ลองทำแบบฝึกหัดตำราเรียนวิทยาลัยหรือไขปริศนาโปรแกรมใน C
  • ลำดับชั้นของหน่วยความจำ (แบนด์วิดท์) ที่ดีขึ้นเรื่อย ๆตั้งแต่ CPU แคชไปจนถึงเวลาแฝงเครือข่ายข้ามมหาสมุทร นี่จะช่วยทักษะการพัฒนาแอปพลิเคชันของคุณในทุกระดับ
    • ที่สำคัญที่สุดก็คือการที่ดีในการเรียนรู้เกี่ยวกับสถานการณ์ที่เล็กสายใยเด่นของรหัสที่ระดับสูงจะส่งผลในการแสดงละครการปรับปรุงความเร็ว
      • บางครั้งเหตุผลสามารถเข้าใจได้ในการใช้งานในระดับต่ำในบริบทของลำดับชั้นหน่วยความจำ
      • ไม่เข้าใจสาเหตุตามธรรมชาติของความเป็นไปได้นำไปสู่การนี้เพื่อความไม่รู้ , กลัวและในที่สุดก็จะปฏิเสธความคิดว่ามันเป็นความผิดสำหรับนักพัฒนาระดับสูงต่อการประปาเป็นชนิดของการเพิ่มประสิทธิภาพนี้ ในความเป็นจริงไม่มีอะไรผิดกับสิ่งนั้น
  • ชื่นชมความงามของระบบซอฟต์แวร์ที่ใช้ส่วนประกอบซึ่งช่วยให้ส่วนประกอบระดับต่ำที่พัฒนาใน C / C ++ / Assembly สามารถใช้งานได้กับระบบระดับสูง
    • ความสวยงามนั้นเหมือนกับการใช้งานซอฟต์แวร์:
      • การออกแบบที่ดี (มีประสิทธิภาพใช้งานง่ายคิดดี)
      • ความถูกต้อง
      • ความยืดหยุ่น (ส่วนขยายและพฤติกรรมใหม่ผ่านองค์ประกอบของชิ้นส่วนที่มีอยู่แต่ละส่วนมีจุดประสงค์ที่ชัดเจน)
      • ประสิทธิภาพ (ไม่ซับซ้อนในการใช้งาน)
    • ในขณะที่คุณอาจไม่ได้ออกแบบส่วนประกอบระดับต่ำของคุณเองความเข้าใจของคุณจะช่วยให้คุณประเมินและเลือกส่วนประกอบที่ดีเพื่อใช้ในโครงการระดับสูงของคุณ
  • สุดท้ายขอขอบคุณที่ส่วนประกอบระดับต่ำมักจะมีความซับซ้อนในการนำไปใช้งานของพวกเขาห่างไกลจากความเข้าใจยากโดยเพียงแค่ดูที่อินเทอร์เฟซ
    • ระดับต่ำนั้นซับซ้อนเสมอ ห้องสมุดที่ดีจะซ่อนความซับซ้อนโดยไม่ลดทอนอำนาจลง
    • เรียนรู้การอ่าน "บันทึกทางเทคนิค" ที่เขียนโดยนักพัฒนาส่วนประกอบซึ่งเป็นคำแนะนำสำหรับผู้ใช้ส่วนประกอบระดับสูงเกี่ยวกับวิธีการใช้ส่วนประกอบให้ดีที่สุด

8

หากคุณต้องการเข้าใจวิธีการทำงานของเครื่องไม่ใช่แค่เครื่องเสมือนที่ใช้ภาษาระดับสูงของคุณแล้วแอสเซมบลีจะสอนสิ่งนี้กับคุณ

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

มันจะปรับปรุงพื้นฐานของคุณ แต่มันอาจจะไม่ปรับปรุงแอปบนเว็บของคุณ


6
C ทำงานได้ดีเช่นกัน แนวคิด C ส่วนใหญ่สามารถแปลเป็นภาษาเครื่องได้อย่างง่ายดาย เรียนรู้ C และดูแอสเซมเบลอร์อย่างรวดเร็วและคุณอยู่ในสภาพดี
David Thornley

ฉันกำลังจะโพสต์คำตอบที่คล้ายกัน ฉันขอยืนยันว่า C ยังให้ความชื่นชมต่อวิธีการทำงานของเครื่องโดยเฉพาะเมื่อจัดการกับหน่วยความจำที่เกี่ยวข้อง นอกจากนี้หลายภาษาที่ความซับซ้อนของเครื่องนามธรรมเขียนด้วยภาษาซีอย่างน้อยคน ๆ นั้นจะได้รับความเข้าใจอย่างแท้จริงว่าพวกเขาปรนเปรอแค่ไหน :)
Tim Post

1
@Jorg: น่าสนใจ และซีพียูเหล่านี้มีกี่ตัวที่ใช้งานเชิงพาณิชย์เปรียบเทียบกับ Intel x86 หรือ 6502s
Steven A. Lowe

1
@ Jörgคุณจะพบ CPU เหล่านี้อยู่ที่ไหน

1
@Thor: ความเร็วไม่ใช่คำถามที่นี่การศึกษาคือ
Steven A. Lowe

8

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


2
+1 สำหรับความคิดว่าทุกภาษาเปลี่ยนวิธีที่คุณคิดอย่างไร
Sean

7

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


1
+1 เพื่อความสนุกที่เกินบรรยาย แม้ว่าฉันต้องบอกว่าฉันไม่ได้เกินบรรยาย และฉันเกลียดฮาร์ดแวร์ :)
back2dos

1
ความแตกต่างของความเร็วมักไม่เกี่ยวข้อง นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับเว็บแอปซึ่งการประมวลผลฝั่งเซิร์ฟเวอร์มักจะไม่ใช่ปัญหาคอขวด
David Thornley

เดวิด: ฉันพอใจกับแอพพลิเคชั่นเว็บขนมปังและเนยโดยเฉลี่ย ในโดเมนอื่นความแตกต่างอาจมีความเกี่ยวข้องมาก
281377

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

2
ให้หน่วยความจำเพียงพอ Java เร็วหรือเร็วกว่า C.

5

ไชโยสำหรับความอยากรู้!

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

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

สิ่งที่ดีที่สุดถัดไปหลังจากนั้น: เล่นรอบ ๆ ในซีพียูตัวจำลอง (อีมูเลเตอร์หรือไม่ฉันได้คำศัพท์เหล่านั้นมารวมกัน) - สิ่งเหล่านี้มีอยู่สำหรับ Z80, 6502, 8086 ... ทั้งหมด 8 บิตเก่า นั่นอาจจะเป็นการศึกษาที่ดีที่สุดและสนุกสำหรับนักเขียนโปรแกรมที่ไม่รู้ว่าปลายหัวแร้งค้างไว้ที่ใด (แม้ว่าจะเรียนรู้ว่าเร็วมาก :) ข้อความที่เขียนลงในหน่วยความจำวิดีโอนั้นเป็นอย่างไร .. มีสิ่งสนุกสนานมากมายให้สำรวจในระดับนี้

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


+1 เพราะนี่เป็นคำตอบเดียวที่ชี้ไปที่ตัวชี้ ฉันคิดว่ามันจะเป็นอันดับ 1 และได้รับคำตอบที่ยอมรับ
Erik

4

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

นอกจากนี้ความสามารถในการกลับไปหาใครก็ตามที่ตั้งโปรแกรมในภาษาอื่นใดและไปได้ 'ดีถ้าคุณไม่ยอมใครง่ายๆพอ ... ' เป็นเด็กสนุกสนุกเหมือนเด็ก


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

หนึ่งสามารถหลีกเลี่ยงความลึกลับที่อยู่ภายใต้ประทุนได้ด้วยการสร้าง CPU ของตัวเองจากทรานซิสเตอร์และชิปตรรกะ: D (หนึ่งในจินตนาการของเทคโนโลยีที่ฉันโปรดปราน!) อย่างไรก็ตาม +1 สำหรับคำตอบที่ดี
DarenW

จุดประสงค์! แม้ว่าครั้งสุดท้ายที่ฉันใช้การรวมตัวกันแบบไฮเปอร์เธรดอาจจะใช้วิธีการเย็บเร็วกว่าซีพียูมากกว่า ...
Dan O

2

มีเหตุผลที่ดีในการเรียนรู้ / ฝึกการเขียนโปรแกรมระดับต่ำหรือไม่ ฉันมีคำตอบที่หลากหลายขึ้นอยู่กับบริบท

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

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

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

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


1

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


1
ฉันไม่แน่ใจว่ามีพื้นที่ประสิทธิภาพสูงมากมายเหลืออยู่ การเล่นเกมไม่จำเป็นต้องใช้ภาษาระดับต่ำ สำหรับเกมคุณมักจะใช้เอ็นจิ้นหรืออย่างน้อยก็เริ่มด้วย OpenGL หรืออะไรทำนองนั้น และสำหรับการขนานวิทยาศาสตร์นั้นสำคัญมากและถูกต้อง ฉันคิดว่าคุณน่าจะดีกว่าด้วย OCaml หรืออะไรบางอย่าง พื้นที่สำคัญในการปฏิบัติงานไม่ใช่พื้นที่ที่มีจำนวนมากอีกต่อไป แต่ที่ใช้บ่อยครั้งมากเช่นเมล็ดไดรเวอร์อุปกรณ์จัดเก็บข้อมูลและอื่น ๆ ฉันเดาว่าน้อยกว่า 1% ของนักพัฒนาทั้งหมดจะได้สัมผัสสิ่งเหล่านั้นจริงๆ
back2dos

4
@ back2dos เอ็นจิ้นเกมอย่าเพิ่งปรากฏออกมาจากที่อื่น - มีคนต้องเขียนมัน และคุณคิดว่า OpenGL เขียนเป็นอะไร? ไม่ใช่ C # หนึ่งไม่จำเป็นต้องใช้ภาษาระดับต่ำสำหรับการใช้งานส่วนใหญ่วันนี้ ... แต่คนจำนวนมากทำงานในพื้นที่อื่น ๆที่ต้องใช้มัน
GrandmasterB

1

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

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

1) เทคนิคหน่วยความจำสกปรก C เป็นวิธีที่ดีที่สุดในการเข้าใจว่าไม่มีความผิดพลาดในโปรแกรมเมอร์ :)

2) มีการใช้ GOTOs (และมีประโยชน์) กับข้อผิดพลาดในการย้อนกลับ

3) เรียนรู้เพิ่มเติมว่าการจัดสรรหน่วยความจำทำงานอย่างไร (ความแตกต่างระหว่างฮีปและสแต็คใคร?)

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


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

1

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

นี่คือตัวอย่างของแนวคิดระดับต่ำที่สามารถส่งผลกระทบต่อภาษาระดับสูง

ตัวชี้:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Strings:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

รายการ:

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

-

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


1

การเขียนโปรแกรมระดับต่ำสามารถสอนอะไรฉันได้ภาษาอื่นจะไม่สอนฉัน

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

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

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

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