Що означає «системне програмування»?


33

Я готуюсь до стажування як ігровий програміст у всесвітньо відомій компанії з розробки ігор. Коли я шукав на їхньому веб-сайті необхідні передумови, він показав мені це:

Додано перевагу

  • Знання DirectX / OpenGL.
  • Сильна команда з 3D математики та фізики.
  • Visual Studio IDE для розробки C ++.
  • Системне програмування та концепції ОС.

Що саме вони розуміють під системним програмуванням та концепціями ОС?

Чи слід вивчати програмування Windows? Або я повинен працювати з програмуванням Linux (тобто вони хочуть, щоб я знав важливі поняття). Або це щось зовсім інше?


Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
Джош

"Чи слід вивчати програмування Windows? Або я повинен працювати з програмуванням Linux" І те, де це можливо. Принаймні, прочитайте їх API, можливо, спробуйте зробити просте "відкрити вікно" з відповідними API API, щоб ви дізналися, наскільки вони різні та які зусилля можуть бути.
Фарап

@Pharap Технічно не існує Linux "OS API", який би міг відкрити вікно, і краще використовувати glut, glfw або подібне, щоб відкрити вікно, щоб воно працювало як з X, так і з Wayland (і Windows і macOS).
Majora320

@ Majora320 Ні, але є API оболонки, який обробляє його, і вони, як правило, специфічні для дистрибутивів Linux (тобто X використовується в деяких дистрибутивах Linux, але, як правило, не для Windows та Mac). Ви також можете використовувати glut / glfw / SDL / що завгодно, важливим моментом є використання підходу на низькому рівні, щоб ОП може використовувати реалізацію, щоб дізнатися про основні поняття (повідомлення про події, користувач-земля проти os-land тощо). Портативні / вищі рівні API, як правило, абстрагують багато речей, які можуть перешкоджати навчальному процесу.
Фарап

@Dhannanjai Якщо я можу бути настільки сміливим, я хотів би порекомендувати книгу під назвою Операційні системи DeMYSTiFieD . Це мені дуже допомогло в роки навчання в коледжі під час апаратного підрозділу. Він пояснює багато важливих концепцій операційних систем, таких як POST, методи планування потоків (круговий робочий стіл, упорядковані черги тощо) та драйвери.
Фарап

Відповіді:


54

"Системне програмування" (або "системне програмування") означає програмування, виконане на більш низькому рівні абстракції, ніж (наприклад) ігрове програмування. Програмування ігрових процесів зазвичай полягає в побудові фактичної механіки гри та функцій передньої панелі, яку може бачити користувач, тоді як системне програмування - це більше про побудову рамки, над якою працюють програмісти ігрових процесів.

Це може означати графіку, завантаження та потокове передавання ресурсів, аудіо, управління пам’яттю, IO файлів, API абстрагування платформи тощо. Деталі відрізняються досить сильно, і оскільки в ігровій індустрії немає стандартів на посади, не існує стандартів для назв областей програмування. На одній студії ви можете виявити, що "програмування систем" означає все, що я перераховував вище. З іншого боку, ви можете виявити, що вони виділяють "графічне програмування" як окремий домен, а всі інші завдання програмування, що не стосується геймплея, називають "програмуванням систем". В іншому, вони можуть взагалі не використовувати цей термін і просто називають його "програмуванням двигуна".

Оскільки це домен нижчого рівня і, як правило, передбачає взаємодія більш безпосередньо з платформою API для будь-яких платформ, для яких гра буде побудована, знання цих платформ буде корисним, як і знання більш загального домену (наприклад, , концепцій ОС, не зважаючи на те, наскільки конкретна робота ОС, наприклад, що таке віртуальна пам'ять або як потоки, як працює буферизація IO тощо.


2
У двох словах, я б сказав, що несистемне програмування (фактична гра) буде здебільшого незалежним від платформи (не дуже важливо, чи це Mac / PC / Xbox), тоді як системне програмування буде набагато більш платформеним (для того, щоб забезпечити незалежний від платформи рівень для несистемних програмістів).
TripeHound

22

Відповідь Джоша дійсно хороша, але я зрозумів, що я кину кілька пунктів про команду "Системи", де я працюю. Я не працюю над системами, але багато працюю з ними. Обов'язки колективу "Системи" сильно відрізняються від компанії до компанії.

Наша команда систем відповідає за багато чого:

  • Математична бібліотека
  • Заміна бібліотеки STD
  • Основна ігрова рамка
  • Основна рамка програми
  • Вхідні дані
  • Повідомлення подій
  • Компонентно-цілісні системи
  • Обв’язування сценарію
  • (і більше)

Тут багато знань про домен Windows та Linux, а також багато знань з фізики, логіки основних ігор та управління пам'яттю низького рівня. Системні команди, як правило, будуть задіяні принаймні в якійсь частині в кожній підтримуваній ОС, оскільки більшість їх проектів перебувають у кожній ОС на досить низькому рівні.

Деякі речі, які можуть підпадати під команду "Системи", ми розбиваємося на окремі команди (але наша команда "Систем" все ще сильно взаємодіє):

  • Фізика
  • Linux (виділений сервер)
  • Пряма підтримка інших ОС (iOS / Mac / Консолі / тощо)
  • Системи побудови
  • Аудіо

0

Програмування систем дуже чітко визначено, але компанії намагаються розтягнути його на свої потреби. Якщо ви використовуєте або записуєте системні дзвінки, ви займаєтесь програмуванням систем. Системні дзвінки - це функції, які надаються ядром або драйверами простору користувачів. Сюди входить OpenGL, оскільки в основному це драйвер.


Я не думаю, що графічні програмісти (експерти OpenGL) застосовуватимуться до роботи системного програміста ...
Vaillancourt

Графічне програмування та програмування OpenGL - це дві різні речі. Один стосується алгоритмів комп'ютерної графіки, інший стосується деталей API.
Cem Kalyoncu

0

Додаткові переваги, перелічені вище, здебільшого стосуються програмування ігрових механізмів, коли це необхідно, таким чином, використання API низького рівня. Системне програмування тут очікує, що ви знаєте, як здійснювати дзвінки в аудіо ОС, управління процесами, маніпуляція файлами, мережеві дзвінки тощо ...


-6

Оскільки вони посилаються на Visual Studio, системне програмування стосується написання програм спеціально для операційних систем Windows, тобто: системні дзвінки Windows (наприклад, немає ланцюга fork-exec), облікові записи користувачів, куди слід розміщувати конкретні користувачеві дані, моделі обміну даними windows Знайдіть, наприклад, як ви можете перевірити поточного користувача у візуальному c ++ Або як почати новий процес

Концепції ОС, відносяться до планування, абстрагування файлів, потоків, користувальницького простору тощо. Os dev wiki та форуми можуть бути добре прочитані

Аутентифікація користувача є, наприклад, в обох розділах, оскільки Windows - це єдина операційна система користувача, яка має набагато глибшу інтеграцію ядра управління користувачами та інтерфейсом користувача.

Msdn - це база знань для всіх програм Windows, програмування apis, бібліотек тощо https://msdn.microsoft.com/

Stackoverflow для фактичного кодування, якщо ви застрягли.


Windows - це не одна ОС користувача.
Максим Мінімус

А системне програмування не означає написання програм спеціально для даної ОС. Наприклад, драйвери можуть бути легко платформенними. Оскільки фактичні системні дзвінки Windows відрізняються від випуску до випуску, тому, як правило, обробляється через kernel32.dll та user32.dll замість того, щоб безпосередньо спілкуватися з ядром.
Maciej Piechotka

@MaciejPiechotka Systemsprogramming - це програмування на рівні поблизу апаратного забезпечення // операційна система. Частина драйвера, яка перетинається платформою, - це api, а не обгортка syscall. У Linux системні виклики також загорнуті в бібліотеки, інакше ви не можете змінити реалізацію внизу. Наприклад, отримання темпу процесора через регістри дуже різниться між oses.
Git

@ LeComteduMerde-fou, якщо ви дивитесь лише на те, як користувачі звертаються, це так. -> Ключі безпеки (ctrl + alt + delete), графічний інтерфейс тощо. Unix // BSD обробляє користувачів абсолютно різними
Git

@gismo Я пишу драйвери для життя - для драйвера є набагато більше, що не є частиною ОС, а потім API;) Моя думка про syscalls була окремою, ніж про драйвери. Звичайно, в Linux у вас є бібліотеки, але, на мою думку, Linux має ABI для системних дзвінків, тобто систематичні дзвінки, принаймні теоретично, є стабільними і документально підтвердженими (і закрито моделюються після POSIX). Для Windows інтерфейс ядра <-> ядра не вважається стабільним у релізах.
Maciej Piechotka
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.