“ การเขียนโปรแกรมระบบ” มีความหมายอย่างไร?


33

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

เพิ่มความได้เปรียบ

  • ความรู้เกี่ยวกับ DirectX / OpenGL
  • มีความสามารถทางด้านคณิตศาสตร์และฟิสิกส์ 3 มิติ
  • Visual Studio IDE สำหรับการพัฒนา C ++
  • แนวคิดการเขียนโปรแกรมระบบและระบบปฏิบัติการ

พวกเขาหมายถึงอะไรโดยการเขียนโปรแกรมระบบและแนวคิดของระบบปฏิบัติการ?

ฉันควรเรียนรู้การเขียนโปรแกรม Windows หรือไม่ หรือฉันควรจะไปกับการเขียนโปรแกรม Linux (หมายถึงพวกเขาต้องการให้ฉันรู้แนวคิดที่สำคัญ) หรือมันเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง?


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Josh

"ฉันควรจะศึกษาการเขียนโปรแกรม Windows หรือไม่หรือฉันควรจะใช้โปรแกรม Linux" ทั้งสองอย่างที่เป็นไปได้ อย่างน้อยก็มีการอ่าน API ของพวกเขาบางทีพยายามทำ 'เปิดหน้าต่าง' อย่างง่ายด้วย OS API ที่เกี่ยวข้องเพื่อให้คุณเรียนรู้ว่ามันแตกต่างกันอย่างไรและมีความพยายามแค่ไหน
Pharap

@Phapap ในทางเทคนิคไม่มี Linux "OS API" ที่สามารถเปิดหน้าต่างได้และดีกว่าการใช้ glut, glfw หรือคล้ายกับการเปิดหน้าต่างดังนั้นมันจะทำงานกับทั้ง X และ Wayland (และ Windows และ macOS)
Majora320

@ Majora320 ไม่ แต่มี shell API ที่จัดการกับมันและพวกเขามักจะเฉพาะกับ Linux distros (เช่น X ใช้กับ Linux distros บางตัว แต่โดยทั่วไปไม่ได้อยู่ใน Windows และ Mac) นอกจากนี้คุณยังสามารถใช้ glut / glfw / SDL / อะไรก็ได้จุดสำคัญคือใช้วิธีการระดับต่ำเพื่อให้ OP สามารถใช้การใช้งานเพื่อเรียนรู้เกี่ยวกับแนวคิดพื้นฐาน (ข้อความเหตุการณ์ผู้ใช้ที่ดินเทียบกับ OS- ที่ดิน ฯลฯ ) API แบบพกพา / ระดับสูงขึ้นมีแนวโน้มที่จะสรุปสิ่งต่าง ๆ มากมายที่อาจขัดขวางกระบวนการเรียนรู้
Pharap

@Dhannanjai ถ้าฉันอาจจะเป็นตัวหนาดังนั้นผมอยากจะแนะนำหนังสือที่เรียกว่าระบบปฏิบัติการ Demystified มันช่วยฉันได้มากในปีการศึกษาของฉันในช่วงหน่วยฮาร์ดแวร์ มันอธิบายแนวคิดที่สำคัญหลายประการของระบบปฏิบัติการเช่น POST, เทคนิคการจัดตารางเวลาด้าย (ปัดเศษ, สั่งคิว ฯลฯ ) และไดรเวอร์
Pharap

คำตอบ:


54

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

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

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


2
สั้น ๆ ฉันจะบอกว่าการเขียนโปรแกรมที่ไม่ใช่ระบบ (เกมจริง) ส่วนใหญ่จะเป็นแพลตฟอร์มที่เป็นอิสระ (ไม่สนใจจริงๆถ้าเป็น Mac / PC / Xbox) ในขณะที่การเขียนโปรแกรมระบบจะเป็นแพลตฟอร์มที่เฉพาะเจาะจงมากขึ้น (ตามลำดับ เพื่อจัดเตรียมเลเยอร์ที่ไม่ขึ้นกับแพลตฟอร์มสำหรับโปรแกรมเมอร์ที่ไม่ใช่ระบบ)
TripeHound

22

คำตอบของ Josh นั้นดีมาก แต่ฉันคิดว่าฉันจะทิ้งประเด็นเกี่ยวกับทีม Systems ที่ฉันทำงานอยู่ ฉันไม่ได้ทำงานกับ Systems แต่ทำงานกับพวกเขามาก ความรับผิดชอบของทีมงานระบบนั้นแตกต่างกันไปในแต่ละ บริษัท

ทีมระบบของเรารับผิดชอบหลายสิ่งหลายอย่าง:

  • ห้องสมุดคณิตศาสตร์
  • ไลบรารีการเปลี่ยน STD
  • Core Game Framework
  • Core Application Framework
  • อินพุต
  • ส่งข้อความเหตุการณ์
  • ระบบตัวแทนส่วนประกอบ
  • การเชื่อมสคริปต์
  • (และอื่น ๆ)

มีความรู้เกี่ยวกับโดเมน Windows และ Linux มากมายที่นี่เช่นเดียวกับความรู้มากมายเกี่ยวกับฟิสิกส์ตรรกะของเกมหลักและการจัดการหน่วยความจำระดับต่ำ ทีมระบบมักจะมีส่วนร่วมอย่างน้อยในบางส่วนในแต่ละระบบปฏิบัติการที่รองรับเนื่องจากโครงการส่วนใหญ่จะอยู่ในแต่ละระบบปฏิบัติการในระดับต่ำ

บางสิ่งที่อาจตกอยู่ภายใต้ทีม "ระบบ" ที่เราแบ่งออกเป็นทีมที่แยกต่างหาก (แต่ทีมระบบของเรายังคงมีปฏิสัมพันธ์อย่างหนัก):

  • ฟิสิกส์
  • Linux (เซิร์ฟเวอร์เฉพาะ)
  • การสนับสนุนโดยตรงสำหรับระบบปฏิบัติการอื่น ๆ (iOS / Mac / คอนโซล / อื่น ๆ )
  • สร้างระบบ
  • เสียง

0

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


ฉันไม่คิดว่าโปรแกรมเมอร์กราฟิก (ผู้เชี่ยวชาญ OpenGL) จะสมัครงานโปรแกรมเมอร์ระบบ ...
Vaillancourt

การเขียนโปรแกรมกราฟิกและการเขียนโปรแกรม OpenGL เป็นสองสิ่งที่แตกต่างกัน หนึ่งข้อตกลงกับอัลกอริทึมกราฟิกคอมพิวเตอร์ข้อตกลงอื่น ๆ ที่มีรายละเอียดของ API
Cem Kalyoncu

0

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


-6

เนื่องจากพวกเขาอ้างถึง Visual Studio การเขียนโปรแกรมระบบหมายถึงการเขียนโปรแกรมโดยเฉพาะสำหรับระบบปฏิบัติการ windows หมายถึง: windows syscalls (ตัวอย่างเช่นไม่มีสาย fork-exec) บัญชีผู้ใช้ที่จะวางข้อมูลเฉพาะของผู้ใช้รูปแบบการแบ่งปันข้อมูลใน windows เงยหน้าขึ้นมองเช่นคุณสามารถตรวจสอบผู้ใช้ปัจจุบันใน visual c ++ หรือวิธีการเริ่มกระบวนการใหม่

แนวคิดของระบบปฏิบัติการ, อ้างถึงการกำหนดตารางเวลา, การลบไฟล์, เธรด, userspace ฯลฯ os dev wiki และฟอรัมสามารถอ่านได้ดี

การตรวจสอบผู้ใช้เป็นตัวอย่างในทั้งสองส่วนเนื่องจาก windows เป็นระบบปฏิบัติการผู้ใช้เดียวที่มีการรวมเคอร์เนลที่ลึกกว่าของการจัดการผู้ใช้และส่วนติดต่อผู้ใช้

msdn เป็นฐานความรู้สำหรับทุกสิ่งที่ windows programming apis, ไลบรารีและอื่น ๆhttps://msdn.microsoft.com/

Stackoverflow สำหรับการเข้ารหัสที่แท้จริงถ้าคุณติดอยู่


Windows ไม่ใช่ระบบปฏิบัติการผู้ใช้เดียว
Maximus Minimus

และการเขียนโปรแกรมระบบไม่ได้หมายถึงการเขียนโปรแกรมเฉพาะสำหรับระบบปฏิบัติการที่กำหนด ตัวอย่างเช่นไดรเวอร์สามารถข้ามแพลตฟอร์มได้อย่างง่ายดาย เนื่องจาก syscalls ของ Windows ที่แท้จริงแตกต่างจากรุ่นสู่รุ่นดังนั้นจึงมักจะจัดการผ่าน kernel32.dll และ user32.dll แทนที่จะพูดกับเคอร์เนลโดยตรง
Maciej Piechotka

@MaciejPiechotka Systems โปรแกรมกำลังเขียนโปรแกรมในระดับที่ใกล้กับฮาร์ดแวร์ // ระบบปฏิบัติการ ส่วนหนึ่งของไดรเวอร์ที่เป็นแพลตฟอร์มข้ามคือ api ไม่ใช่ wrapper syscall ใน Linux syscalls นั้นถูกรวมไว้ในไลบรารีมิฉะนั้นคุณไม่สามารถเปลี่ยนการใช้งานที่อยู่ด้านล่างตัวอย่างเช่นการเรียกใช้ cpu temp ผ่านรีจิสเตอร์นั้นแตกต่างกันมากระหว่าง oses
Git

@ LeComteduMerde-fou หากคุณเพียง แต่ดูว่าผู้ใช้จัดการอย่างไร -> คีย์ความปลอดภัย (ctrl + alt + delete), GUI และอื่น ๆ Unix // BSD จัดการกับผู้ใช้ที่แตกต่างอย่างสมบูรณ์
Git

@gismo ฉันเขียนไดรเวอร์เพื่อการใช้ชีวิต - มีอีกมากมายสำหรับไดรเวอร์ที่ไม่ได้เป็นส่วนเฉพาะ OS และ API;) จุดของฉันเกี่ยวกับ syscalls นั้นแยกจากกันแล้วก็เกี่ยวกับไดรเวอร์ แน่นอนใน Linux คุณมีไลบรารี่ แต่ประเด็นของฉันคือลีนุกซ์มี ABI สำหรับ syscalls เช่น syscalls อย่างน้อยก็ในทางทฤษฎีมีความเสถียรและได้รับการจัดทำเป็นเอกสาร สำหรับ Windows userspace <-> ส่วนต่อประสานเคอร์เนลจะไม่ถือว่าเสถียรตลอดทั้งรีลีส
Maciej Piechotka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.