Есть несколько вопросов, которые вы можете задать себе, чтобы практиковаться в решении этого вопроса.
- Была ли система изначально продана без этой программы? Angry Birds может быть «приложением-убийцей» для смартфона (причина, по которой его кто-то покупает), но это все еще отдельное стороннее приложение, написанное спустя долгое время после появления телефона. Написание этого было бы программированием приложений. Но драйвер дисплея того же смартфона крайне важен для его использования, так что это было бы системное программирование.
- Можете ли вы представить перенос кода на другую платформу без переписывания? TeX и
troff
были портированы практически на любую систему с небольшими изменениями, поэтому они являются приложениями, даже если они расположены в нижней части цепочки инструментов, которую обычно используют люди. Файловая система, в которую TeX записывает свои выходные данные, например UFS или VFAT, является пограничным случаем. Вы могли бы портировать файловую систему на другую ОС, если она была совершенно потрясающей, но обычно люди просто берутся за потрясающие идеи и пишут свои собственные файловые системы для своих собственных ОС. Это делает системное программное обеспечение файловых систем.
- Реализована ли функциональность в ядре или в отдельных двоичных файлах? (Файловые системы также занимают здесь промежуточное положение. Многие части многих файловых систем фактически являются кодом ядра, но многие имеют существенную часть в пространстве пользователя.) Драйверы графического дисплея в принципе могут быть подключаемыми внешними компонентами, но они часто реализуются в ядре или, по крайней мере, с привилегированным прямым доступом к ядру (или даже к оборудованию). Это было бы системное программирование. С другой стороны, компьютерные игры, использующие стек графического дисплея, являются приложениями.
На ваши вопросы, написание ОС Android было определенно системным программированием. Написание программы, использующей вызовы API Windows, является прикладным программированием. Он не так переносим, как если бы вы использовали кросс-платформенные библиотеки, такие как SDL или OpenGL, но в принципе его можно портировать, он является сторонним кодом и работает в пространстве пользователя. Консольное приложение, отображающее состояние ядра Linux, представляет собой интересный мысленный эксперимент. Я бы определенно сказал, что это связано с системным программированием, поскольку вам нужно много знать о структуре Linux (обратите внимание, что «Linux» - это, по сути, только ядро, а не дистрибутив), чтобы писать и, возможно, даже использовать его!