На компьютере есть набор инструкций, машинный код, который определяет, что можно сделать на компьютере. По сути, ассемблерный код является более удобным представлением этого, поэтому ассемблерный код может делать все, что может делать машина. Язык программирования более высокого уровня должен работать на машине, поэтому он не может делать ничего, что машина не может сделать, хотя вполне может быть в состоянии выразить это более удобно (например, print "foo"
, а не несколько десятков машинного кода). инструкции). Выбор реализации зависит от того, генерирует ли компилятор для этого языка программирования непосредственно машинный код, или ассемблерный код, или любую другую форму, которая может нуждаться в дальнейшей обработке.
Это подводит нас к вопросу о том, может ли программа (независимо от того, в чем она написана) делать то, что ОС явно не предусматривает. Я нахожу это странным способом выразить это, поскольку цель написания программы - дать вам некоторые возможности, которых у вас не было раньше, поэтому в некотором смысле вы пишете программы только для тех вещей, которые ОС явно вам не предоставляет. Проблема заключается в определении того, что «обеспечивает» ОС. Если это ОС общего назначения, то ее разработчики, вероятно, намереваются «предоставить» вам возможность писать широкий спектр программ. ОС может выбрать предоставление какой-либо удобной функции (например, возможность создавать файлы), но если она не предоставляет такую функцию, вы, возможно, можете сделать это самостоятельно, учитывая подходящую мотивацию (и, для примера создания файла, возможность выполнить дисковый ввод-вывод - возможно, для этого потребуется также написать драйвер диска).