จำเป็นหรือไม่ที่จะต้องเข้าใจว่าเกิดอะไรขึ้นที่ระดับฮาร์ดแวร์เพื่อเป็นโปรแกรมเมอร์ที่ดี?


24

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

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

ความเข้าใจในระดับลึกของกระบวนการเขียนโปรแกรมต้องเป็นโปรแกรมเมอร์ที่ดีได้อย่างไร


3
คำแนะนำของฉัน: เรียนรู้ x86 ชุดประกอบ (DOS หรืออย่างอื่น) จากนั้นเรียนรู้การอ่านเอาต์พุตแอสเซมเบลอร์ของโค้ด C ชิ้นเล็ก ๆ ถามคำถามหากคุณไม่เข้าใจผลลัพธ์ ทำซ้ำ สิ่งนี้จะบังคับให้คุณเข้าใจสิ่งที่เกิดขึ้นในระดับ CPU
Earlz


Earlz - คุณหมายถึงว่าฉันควรเรียนรู้การเขียนโปรแกรมโดยใช้ชุดคำสั่ง x86 หรือไม่? นั่นคือ 'ระดับ CPU' หรือไม่
bev

Job - ขอบคุณที่สนุก ที่จริงเขาทำผิดพลาดเล็กน้อยเพียงแค่ FYI
bev

คำตอบ:


33

ไม่ไม่มีใครเข้าใจสิ่งที่เกิดขึ้นในระดับฮาร์ดแวร์

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

แต่แล้วอีกครั้ง ...

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

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

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

อีกสิ่งที่คุณอาจมองเข้าไปก็คือหัวหอมฝังตัว เอ้อฉันหมายถึงระบบฝังตัว มีหลายแพลตฟอร์มฝังตัวที่ใช้งานง่ายสวย: ArduinoและBASIC Stampเป็นสองตัวอย่าง นี่คือไมโครโปรเซสเซอร์ขนาดเล็กที่มีคุณสมบัติในตัวมากมาย คุณสามารถคิดว่าพวกมันเป็นหัวหอมที่มีเลเยอร์น้อยกว่าเดสก์ทอปพีซีทั่วไปของคุณดังนั้นจึงเป็นไปได้ที่คุณจะได้รับความเข้าใจอย่างละเอียดเกี่ยวกับสิ่งที่เกิดขึ้นในระบบทั้งหมดตั้งแต่ฮาร์ดแวร์ไปจนถึงซอฟต์แวร์


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

@bev: ในกรณีนี้คุณควรตรวจสอบแพลตฟอร์มอย่าง Arduino
คาเลบ

ขออภัยที่น่าเบื่อ แต่ฉันตรวจสอบ Arduino และฉันไม่เห็นจริง ๆ ว่าการใช้มันจะช่วยให้ฉันเข้าใจว่าคอมไพเลอร์ปฏิบัติต่อพอยน์เตอร์และอาร์เรย์แตกต่างกันอย่างไร ฉันไม่เห็นอะไร
bev

@bev: ถ้าคุณแค่อยากรู้ว่าจะเรียกฟังก์ชั่นอย่างไรคุณอาจใช้เวลา 30 นาทีในการอ่านและทำ หากคุณต้องการความเข้าใจที่ดีขึ้นเกี่ยวกับการทำงานร่วมกันทุกอย่างมันจะง่ายที่สุดในระบบขนาดเล็ก เป็นวิธีที่ดีที่สุดที่จะได้รับหัวหอมทั้งหมดในหัวของคุณในครั้งเดียว AVR ตระกูลของชิปที่ใช้ Arduino นั้นเป็นระบบที่ใช้งานง่ายและใช้งานง่ายพร้อมชุดคำสั่งที่มีขนาดเล็กพอที่จะเรียนรู้ได้โดยไม่มีปัญหามากเกินไป
คาเลบ

อาโอเค. หน้าแรกมืดครึ้มเล็กน้อยในแง่มุมของผลิตภัณฑ์ของพวกเขา ฉันจะดูอีกครั้ง
bev

10

คุณไม่ได้พูดถึงระดับฮาร์ดแวร์คุณกำลังพูดถึงสิ่งที่คอมไพเลอร์ทำกับสิ่งที่คุณบอกให้ทำ

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


Loren - ใช่แล้ว! ขอบคุณสำหรับความจริงที่เรียบง่าย ตอนนี้ฉันต้องหาวิธีที่ดีที่สุดในการเรียนรู้ว่าคอมไพเลอร์ c ++ ทำอะไรกับประเภทข้อมูลของพวกเขา BTW ในฐานะ EE ฉันรู้ว่าไม่ใช่ระดับฮาร์ดแวร์อย่างแท้จริง ฉันไม่รู้ว่าคุณกำลังพูดถึง CS ในสิ่งใด (ยังไม่เหมาะสำหรับเรื่องนั้นระดับคอมไพเลอร์?)
bev

BTW - หน่วยความจำกระทืบ?
bev

@Bev: คุณเพิ่งพิสูจน์จุดของฉันที่นี่ - ถ้าคุณไม่รู้ด้วยซ้ำว่าหน่วยความจำกระทืบคืออะไรคุณจะมีเวลามากในการค้นหาจุดบกพร่องเนื่องจากปัญหา หน่วยความจำกระทืบคือเมื่อสิ่งที่เขียนไปยังตำแหน่งที่ไม่ควรและลบ (stomps on) สิ่งที่เกิดขึ้นจะมี หากคุณโชคดีสิ่งที่คุณได้รับนั้นสำคัญอย่างยิ่งในทันทีและอย่างน้อยมันก็ระเบิด หากคุณโชคไม่ดีโปรแกรมก็ยังคงมีข้อมูลอยู่ในตัว
Loren Pechtel

ขอขอบคุณสำหรับการชี้แจง. มันยังแสดงให้ฉันเห็นว่าฉันไม่รู้เท่าที่ฉันรู้ว่าฉันเพิ่งเขียนไปยังกองหรือกองซ้อนโดยไม่มีการควบคุมที่ดีกว่า
bev

@Bev: ปัญหาเกิดขึ้นเมื่อคุณเขียนบางที่คุณไม่คิดว่าคุณกำลังเขียน คุณมีบางอย่างในสแต็กและคุณสร้างพอยน์เตอร์ให้กับมัน คุณออกจากงานประจำ - รายการนั้นหายไปตัวชี้ไม่ได้ ตอนนี้จะเกิดอะไรขึ้นเมื่อคุณเขียนถึงตัวชี้? หรือคุณมีรายการ 100 ชุด - จะเกิดอะไรขึ้นเมื่อคุณเขียนไปยังรายการ # 200
Loren Pechtel

6

ทำความเข้าใจเกี่ยวกับหน่วยความจำโปรแกรม! = ทำความเข้าใจกับฮาร์ดแวร์

ทำความเข้าใจกับลำดับชั้นของหน่วยความจำ == ทำความเข้าใจกับฮาร์ดแวร์


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

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

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


Stargazer - ฉันยังไม่ถึงจุดที่ฉันสามารถกังวลเกี่ยวกับปัญหาด้านประสิทธิภาพ เร็ว ๆ นี้หวังว่า ขอบคุณสำหรับความคิดเห็นของคุณ
bev

5

หากคุณไม่ตัดสินใจที่จะเรียนรู้บิตของการประกอบคุณอาจจะเรียนรู้สิ่งที่ชอบ 6502 ประกอบใน 64 จัตวา (เทิดทูนของหลักสูตร) หรือ 68000 ในเอมิ

คุณสามารถรับความคิดของ Commodore 64 ได้ที่นี่ ...

http://thepiratebay.org/torrent/4609238/Tag3-Saal2-Slot16_00--ID2874-the_ultimate_commodore_64_talk-Main

หนังสือคลาสสิกทุกอย่างที่คุณจำเป็นต้องรู้คือหนังสือที่อธิบายไว้ที่นี่ ...

http://reprog.wordpress.com/2010/03/12/programming-books-part-3-programming-the-commodore-64/

คุณอาจพบสแกน PDF หากมองไปรอบ ๆ

IMO, 6502 นั้นง่ายกว่า Z80 และ 68000 นั้นง่ายกว่า 8086 - ชุดคำสั่งปกติทั่วไป ฯลฯ

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

ข้อดีอย่างหนึ่งของ 6502 ใน C64 คือไม่เพียง แต่เป็นซีพียูแบบง่าย ๆ แต่ยังมีฮาร์ดแวร์ที่แฮ็คได้อย่างง่ายดายอีกด้วย ฉันเคยสนุกกับการเล่นกับชิปเพลง SID

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

สิ่งที่มีประโยชน์ที่คุณสามารถเรียนรู้การทำงานในแอสเซมเบลอร์ ...

  • วิธีการลงทะเบียน CPU ทำงาน
  • หน่วยความจำทำงานอย่างไร
  • สแตกของ CPU ทำงานอย่างไร
  • วิธีการทำงานของ bitwise logic
  • วิธีที่ CPU ควบคุมอุปกรณ์ I / O
  • การขัดจังหวะทำงานอย่างไร

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

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

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

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

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

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

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

นี่คือหนังสือเล่มโปรดสำหรับฉันที่ ...

http://dickgrune.com/Books/MCD_1st_Edition/

นอกจากเนื้อหาเกี่ยวกับการแจงและ AST ฯลฯ มันครอบคลุมการสร้างโค้ดสำหรับกระบวนทัศน์ทางภาษาที่หลากหลาย - จำเป็น, OOP, การทำงาน, ตรรกะ, ขนานและกระจาย - และสำหรับการจัดการหน่วยความจำ หากคุณต้องการทราบวิธีการเรียกใช้วิธี polymorphic ทำงานโดยไม่ต้องจมลงในรายละเอียดชุดคำสั่ง CPU หนังสือเช่นนี้เป็นเพื่อนของคุณ - และมีรุ่นใหม่ออกมาเร็ว ๆ นี้


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

1
ฉันขอแนะนำให้ผู้ประกอบ PDP-11 เป็นคนที่ดีกว่าที่จะเรียนรู้มากกว่าคนอื่น ๆ ที่กล่าวถึงทั้งหมด สิ่งที่คนอื่น ๆ สอนคือข้อ จำกัด ที่บังคับโดยทรัพยากรฮาร์ดแวร์ที่ จำกัด มากขึ้นและ / หรือโดยการออกแบบฮาร์ดแวร์ที่ จำกัด มากขึ้นและการคาดการณ์ล่วงหน้า บางอย่างที่เหมือนกันในตระกูล 8051 ที่พบได้ทั่วไปสอนว่ารูปแบบการเขียนโปรแกรมที่แปลกประหลาดจริง ๆ สามารถใช้กับฮาร์ดแวร์ที่ จำกัด ได้อย่างไร (ซึ่งสตีฟพูดถึงพื้นที่ที่อยู่ที่แตกต่างกันตัวอย่างเช่นเข้ามาเล่น)
Greg A. Woods

@Greg - ฉันไม่เคยเล่นกับ PDP-11 ฉันกลัว หรือ 8051 - ฉันทำงานฝังตัวอยู่พักหนึ่ง แต่นั่นก็ใช้ชิปตระกูล 8096 ฉันเพิ่งดูที่นี่ว่า - น่าสนใจ ฉันเคยได้ยินเกี่ยวกับสถาปัตยกรรมฮาร์วาร์ดมาก่อนสักพักแล้ว แต่ฉันไม่รู้ว่ามีบางสิ่งที่เป็นที่นิยมและยังใช้งานอยู่
Steve314

4

ยี่สิบปีที่ผ่านมามันเป็นสิ่งสำคัญ แต่ไม่มากตอนนี้ - มีชั้นที่เป็นนามธรรมมากขึ้นระหว่างซอฟต์แวร์และฮาร์ดแวร์ที่ทันสมัย

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

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


ใช่คุณพูดถูกฉันเกี่ยวข้องกับคอมไพเลอร์มากขึ้น ขอบคุณสำหรับคำแนะนำของคุณเกี่ยวกับหลายเธรดหลายคอร์ ฯลฯ มันเพิ่งเข้าสู่ไฟล์ toLearn notes ของฉัน
bev

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

@Skeith - ขอบคุณสำหรับเคล็ดลับ ฉันจะเก็บไว้ในใจ
bev

4

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

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

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

มุมมองคอมพิวเตอร์ของฉันก็เปลี่ยนไปเช่นกัน ฉันเคยไปที่ Hot Chips และก่อนหน้านั้นฟอรัม Microprocessor จะกลับไปในช่วงกลางปี ​​1990 หรือมากกว่านั้น ฉันอาจรู้เกี่ยวกับฮาร์ดแวร์ไมโครโพรเซสเซอร์มากกว่าอย่างน้อย 99% ของโปรแกรมเมอร์ - และรู้ว่าฉันทำอะไรฉันจะพูดแบบนี้: มันไม่ธรรมดาอีกต่อไป พวกเขาทำผิดกฎของฟิสิกส์ ฉันได้ทำการทดสอบระดับต่ำมากและฉันสามารถพูดได้อย่างแน่นอน: ผ่านภาพลวงตาที่สร้างโดย CPU และไปสู่ระดับที่แสดงว่าฮาร์ดแวร์ใช้งานได้จริงได้ยากอย่างไม่น่าเชื่อ ฉันอยากจะโพสต์ภาพของหนึ่งในการตั้งค่าของเรากับคอมพิวเตอร์ฝังอยู่ใต้สายจากไม่น้อยกว่า 4 วิเคราะห์ตรรกะเพียงเพื่อให้ถูกต้องวัดหนึ่ง แง่มุมของวิธีการแคชกับซีพียูสมัยใหม่ (ไม่ต้องพูดถึงการเขียนโปรแกรมที่พิถีพิถันอย่างแท้จริงเพื่อให้แน่ใจว่าสิ่งที่เราวัดนั้นเป็นสิ่งที่ซีพียูกำลังทำอยู่และไม่มีอะไรอื่น)


Jerry - ขอบคุณสำหรับความคิดเห็นของคุณ การเป็น EE ฉันรู้สึกสะดวกสบายกับระดับทรานซิสเตอร์มากกว่าระดับนามธรรมที่สูงกว่า ฉันแค่สงสัยในสิ่งที่ฉันต้องรู้เพื่อเป็นโปรแกรมเมอร์ C ++ ที่ดี
bev

ภาพนั้นฟังดูน่าสนใจ ทำไมคุณถึงโพสต์ไม่ได้?
Mason Wheeler

@Bev: คุณไม่จำเป็นต้องรู้อะไรเลยในระดับทรานซิสเตอร์เพื่อเป็นโปรแกรมเมอร์ที่ดี abstractions เหล่านั้นอยู่ที่นั่นด้วยเหตุผลและคุณสามารถพิจารณาอะไรที่เป็นนามธรรมในระดับที่ต่ำกว่ารหัสเครื่อง / ชุดประกอบที่ไม่เกี่ยวข้องอย่างสมบูรณ์และคิดว่ามันใช้งานได้จริง
Mason Wheeler

@MasonWheeler: ฉันเอามันไปใช้ในที่ทำงาน แต่เนื่องจากฉันไม่ได้ทำงานที่นั่นอีกเลยการเข้าถึงมันอาจจะยากขึ้นอีกนิด .. )
Jerry Coffin

1

ภาษาที่แตกต่างกันทำงานในระดับต่าง ๆ ของสิ่งที่เป็นนามธรรม C และ C ++ อยู่ในระดับต่ำมาก ในทางกลับกันภาษาในทางกลับกันคุณต้องรู้น้อยลงเกี่ยวกับรายละเอียดพื้นฐาน

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

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


สก็อตต์ - โดย "ความเข้าใจที่ดีว่าซีพียูสมัยใหม่ทำงานอย่างไร .. " คุณหมายถึงการทำงานของตรรกะดิจิทัล (เช่นวิธีแผนที่คาร์นาห์ตารางความจริงและ / หรือประตู NOR / XOR) หรือคุณหมายถึงทรัพยากรใดที่คอมไพเลอร์ใช้โดยตรง (เช่นการลงทะเบียน)
bev

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

1
@bev - ไม่ฉันไม่คิดว่าคุณจะต้องลงไปที่ระดับประตู หากคุณเพิ่งรู้สถาปัตยกรรมพื้นฐาน (หน่วยความจำบัส CPU) วิธีโหลดคำสั่งดำเนินการจัดเก็บผล ฯลฯ คุณอาจตกลง คุณต้องเข้าใจว่าคอมไพเลอร์แสดงพื้นที่หน่วยความจำของโปรแกรมอย่างไรรวมถึงวิธีการใช้สแต็กและฮีป
Scott Whitlock

@ScottWhitlock - ขอบคุณ - นี่เป็นเพียงคำแนะนำเฉพาะที่ฉันกำลังมองหา
bev

0

ฉันต้องการเพิ่มประเด็นเกี่ยวกับการออกแบบโดยรวมของภาษาระดับสูงกว่าเช่น C

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

กระดาษความสามารถในการพกพาของโปรแกรม DMR และระบบ UNIXเป็นสิ่งแรกที่ฉันจำได้เพื่อหารือเกี่ยวกับรูปแบบเครื่องจักร (นามธรรม) สำหรับ C

ฉันคิดว่าบทความของ DMR เกี่ยวกับประวัติและการพัฒนาของ C นั้นมีประโยชน์อย่างมากในการแสดงว่าฮาร์ดแวร์จริงมีผลต่อการออกแบบภาษาอย่างไรและอาจเป็นแบบอย่างของการออกแบบภาษาโปรแกรมเบื้องต้น: การพัฒนาภาษา C


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

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

และ btw ฉันตอบจริงแล้วอัลเลียตโดยปริยายคำถามจริงหนึ่งข้อจาก OP: หนึ่งควรมีความเข้าใจฮาร์ดแวร์เพียงพอที่จะสามารถจำลองเครื่องนามธรรมที่เป็นแกนหลักของการออกแบบภาษา
Greg A. Woods
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.