Как я могу получить стандартные потоки моего процесса без какой-либо библиотеки?

#io #stream #compiler-construction

#io #поток #компилятор-конструкция

Вопрос:

Я пишу свой собственный язык программирования и хочу иметь возможность создавать консольные приложения, это означает, что мне нужно иметь возможность перехватывать стандартные потоки моего процесса.

Кто-нибудь может дать мне представление о том, как это делается на других языках? Например, как класс Console в C # работает за кулисами? Или для чего компилируется cout в C ?

Любая информация помогла бы, у меня нет надежного зацепки.

Ответ №1:

Нет переносимого решения без библиотеки. Действительно, смысл стандартной библиотеки ввода-вывода C заключается в предоставлении переносимого решения.

Каждая платформа также будет иметь свои собственные библиотеки (для различных поддерживаемых языков), которые вы могли бы использовать, если ваш компилятор может создать соответствующую последовательность вызовов.

Существование трех стандартных потоков (ввода, вывода и вывода ошибок) частично является артефактом стандартной библиотеки C, но обычно существует очевидный перевод из собственного интерфейса платформы.

Например, интерфейс Posix, в котором на каждый поток ввода-вывода ссылается небольшое целое число, называемое «файловый дескриптор» (fd), резервирует fds 0, 1 и 2 для трех стандартных потоков. Оболочки Posix обеспечивают правильную привязку этих fd при запуске консольного приложения.

В Windows есть другой механизм, о котором вы, вероятно, можете прочитать в документации Windows. (Интерфейс оболочки сильно отличается.)

И так далее.

Комментарии:

1. Возможно, я неправильно объяснил себя. Я пишу компилятор на C #, поэтому я мог бы просто определить некоторые ключевые слова, которые переводятся непосредственно в консольный класс C #, но, учитывая, что это практический проект, я бы предпочел этого не делать. Это то, что я имею в виду, когда говорю, что не хочу использовать библиотеку.