Другие языки программирования и технологии

Реализация функций СИ

На чем написаны функции СИ? Например в си нет операторов ввода и вывода, но с помощью функций printf, scanf это реализовано. Эти конкретные функции ведь писались не просто на си? Может в них есть ассемблерные вставки для общения с аппаратной частью?
Написанная на С/С++ программа после запуска создаёт несколько стандартных потоков, в том числе и поток вывода – stdout, который является указателем на файл FILE* и по умолчанию направлен к консоли, но в ряде операционных систем может быть перенаправлен в другое устройство (Windows в их числе). Таким образом стандартные потоки являются неотъемлемой частью языка Си. Потоки содержат последовательности байтов. Функция printf записывает в стандартный поток вывода аргументы из своего списка под управлением аргумента форматной строки. Всё что нужно, это различные типы преобразовать в последовательность байтов в соответствии с заданным форматированием и связать результат с указателем на поток. Это можно и нужно сделать на Си, так как бешеное быстродействие для вывода не актуально, а аппаратная зависимость ни к чему.
СК
Саша Краснов
73 376
Лучший ответ
А_М_И_Р . > Всё что нужно, это различные типы преобразовать в последовательность байтов в соответствии с заданным форматированием и связать результат с указателем на поток.

Ну так а дальше что? Вот "связали" мы с FILE*. Как после этого строка окажется у нас перед глазами на экране?
лучше бы про украину писал
Нет. printf, sprintf написаны на C

С позволяет писать функции с переменным числом аргументов.
$$$Niko$$$ Remo как и ассемблер
а где есть операторы ввода вывода? в c++?
переназначенные операторы это не более чем неявно вызываемые функции, написанные на том же c++
просто более завуалированно, не оптимально, зато с виду просто и интуитивно. :)

в конечном итоге и printf и "cout <<" осуществляют вызов функции ядра, отвечающей за небуферезированный вывод в файловый описатель через апи, предоставляемый операционной системой.

printf написана на си. в интернете можно найти свободные реализации стандартной библиотеки си, включающие эту функцию.
функция ядра, являющаяся ее бэкендом, тоже обычно написана на си, так как чаще всего на нем написано само ядро операционной системы

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

запустив программу, использующую как printf("Hello"), так и cout << "Hello" под strace в linux, можно увидеть такую строчку
write(1, "Hello", 5Hello) = 5
это как раз тот самый низкоуровневый вызов функции записи.
> Может в них есть ассемблерные вставки для общения с аппаратной частью?

Есть вызовы платформозависимых функций для ввода/вывода.

Вот, можешь почитать, как в GNU libc printf работает http://blog.hostilefork.com/where-printf-rubber-meets-road/ .
Дмитрий Божок ну в этих функциях что-то кроме как операторов си присутствует?
Это верно, что ассемблер используется для реализации основных "не-библиотечных" функций. Остальное создается за счет примитивных логических и арифметических операторов и сети библиотек.
Anton Anisimov
Anton Anisimov
2 330
Дмитрий Божок Тоесть "не-библиотечных" ?