Что вы можете сделать в C без "std"? Являются ли они частью "С" или просто библиотек?

Прошу прощения, если это субъективный или повторяющийся вопрос. Это неловко искать, поэтому я не был уверен, какие условия включать.

Что я хотел бы знать, так это то, что базовые инструменты/функции основаны на C, когда вы не включаете стандартные библиотеки, такие как stdio и stdlib.

Что делать, если нет printf(), fopen() и т.д.

Кроме того, являются ли эти библиотеки технически частью языка "C", или они являются очень полезными и эффективными основными библиотеками?

Ответ 1

В стандарте C это сказано (5.1.2.3/5):

Наименьшие требования к соответствующему реализация:

- В точках последовательности неустойчивые объекты являются стабильными в том смысле, что предыдущие доступа являются полными и последующими доступа еще не произошло.

- При завершении программы все данные записанные в файлы, должны быть одинаковыми к результату, что выполнение программа в соответствии с рефератом семантика.

- Динамика входа и выхода интерактивные устройства как указано в 7.19.3.

Таким образом, без стандартных функций библиотеки единственное поведение, гарантируемое программой, связано со значениями изменчивых объектов, поскольку вы не можете использовать какой-либо гарантированный доступ к файлам или "интерактивные устройства". "Чистый C" обеспечивает взаимодействие только через стандартные библиотечные функции.

Pure C - это не вся история, хотя, поскольку ваше оборудование может иметь определенные адреса, которые делают определенные вещи при чтении или записи (будь то SATA или PCI-шина, необработанная видеопамять, последовательный порт, что-то делать звуковой сигнал или мигающий светодиод). Итак, зная что-то о вашем оборудовании, вы можете много писать в C без использования стандартных функций библиотеки. Потенциально, вы могли бы реализовать стандартную библиотеку C, хотя для этого может потребоваться доступ к специальным инструкциям CPU, а также к специальным адресам памяти.

Но в чистом C, без расширений и стандартных функций библиотеки, вы в принципе не можете ничего делать, кроме как читать аргументы командной строки, выполнять некоторую работу и возвращать код состояния из main. Чтобы не быть обнюхиваемым, все равно Тьюринг полностью подчиняется ограничениям ресурсов, хотя ваш единственный ресурс - это автоматические и статические переменные, без распределения кучи. Это не очень насыщенная среда программирования.

Стандартные библиотеки являются частью спецификации языка C, но на любом языке, как правило, делается линия, заключенная между языком "как таковым" и библиотеками. Это принципиальная разница, но в конечном счете не очень важная в принципе, потому что в стандарте говорится, что они собрались вместе. Любой, кто делает что-то нестандартное, может так же легко удалить языковые функции, как библиотеки. В любом случае результат не соответствует реализации C.

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

Ответ 2

Что ты мог сделать? Все!

В Си нет магии, кроме, возможно, препроцессора.

Сложнее всего, возможно, написать putchar - так как это зависит от платформы ввода/вывода.

Хорошее упражнение для старшекурсников - создать свою собственную версию varargs, и как только вы ее получите, создайте свою собственную версию vaprintf, затем printf и sprintf.

Я делал все это на Macintosh в 1986 году, когда меня не устраивали процедуры stdio, поставляемые с Lightspeed C, - я написал свой собственный обработчик окон с win_putchar, win_printf, in_getchar и win_scanf.

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

Ответ 3

Вы, конечно, не обязаны использовать стандартные библиотеки, если они вам не нужны. Довольно много встроенных систем либо не имеют стандартной поддержки библиотеки, либо не могут использовать ее по той или иной причине. Стандарт даже конкретно говорит о реализации без поддержки библиотеки, стандарт C99 5.1.2.1 "Свободная среда":

В автономной среде (в которой выполнение программы C может иметь место без какой-либо выгоды от операционной системы), имя и тип функции, вызываемой при запуске программы, определяются в соответствии с реализацией. Любые библиотечные средства, доступные для автономной программы, отличные от минимального набора, требуемого в соответствии с разделом 4, определяются реализацией.

Заголовки, требуемые C99, доступны в автономном исполнении: <float.h>, <iso646.h>, <limits.h>, <stdarg.h>, <stdbool.h>, <stddef.h> и <stdint.h>. Эти заголовки определяют только типы и макросы, поэтому нет необходимости в библиотеке функций для их поддержки.

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

Ответ 4

Что делать, если нет printf(), fopen() и т.д.

Пока вы знаете, как взаимодействовать с системой, которую вы используете, вы можете жить без стандартной библиотеки C. Во встроенных системах, где у вас всего несколько килобайт памяти, вы, вероятно, вообще не хотите использовать стандартную библиотеку.

Вот Hello World! пример в Linux и Windows без использования каких-либо стандартных функций C:

Например, в Linux вы можете вызывать системные вызовы Linux непосредственно в встроенной сборке:

/* 64 bit linux. */

#define SYSCALL_EXIT 60
#define SYSCALL_WRITE 1

void sys_exit(int error_code)
{
    asm volatile
    (
        "syscall"
        : 
        : "a"(SYSCALL_EXIT), "D"(error_code)
        : "rcx", "r11", "memory"
    );
}

int sys_write(unsigned fd, const char *buf, unsigned count)
{
    unsigned ret;

    asm volatile
    (
        "syscall"
        : "=a"(ret)
        : "a"(SYSCALL_WRITE), "D"(fd), "S"(buf), "d"(count)
        : "rcx", "r11", "memory"
    );

    return ret;
}

int _start()
{
    const char hwText[] = "Hello world!\n";

    sys_write(1, hwText, sizeof(hwText));
    sys_exit(12);

    return 0;
}

Скомпилируйте это с помощью:

gcc -nostdlib nostd.c 

И он выводит Hello world! и выходит.

В Windows системные вызовы не публикуются, а скрываются за другим уровнем абстракции - kernel32.dll. Это всегда загружается, когда ваша программа запускается независимо от того, хотите вы этого или нет. Таким образом, вы можете просто включить windows.h и использовать Win32 API:

#include <windows.h>

int _start()
{
    const char str[] = "Hello world!\n";
    HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD written;

    WriteFile(stdout, str, sizeof(str), &written, NULL);
    ExitProcess(12);

    return 0;
}

windows.h не имеет ничего общего со стандартной библиотекой C, так как вы также можете писать программы Windows на любом другом языке.

Вы можете скомпилировать его с помощью инструментов MinGW, например:

gcc -nostdlib C:\Windows\System32\kernel32.dll nostdlib.c

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

Если вы разобрали программу, вы увидите только ваш код, там нет стандартной библиотеки.

Итак, вы можете использовать C без стандартной библиотеки.

Ответ 5

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

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

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

Некоторые части библиотек указаны как часть ANSI C; они являются частью языка, я полагаю, но не в его основе.

Ответ 6

Ни один из них не является частью языковых ключевых слов. Однако все дистрибутивы C должны включать реализацию этих библиотек. Это обеспечивает переносимость многих программ.

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

С практической точки зрения, библиотечные функции в первую очередь предназначены для того, чтобы спасти вас от работы по переосмыслению колеса. Некоторые вещи (например, строковые и библиотечные функции) легче реализовать. Другие вещи (например, I/O) очень сильно зависят от операционной системы. Написание собственной версии возможно для одного O/S, но это сделает программу менее переносимой.

Но вы могли бы писать программы, которые делают много полезных вещей (например, вычисляют PI или смысл жизни или моделируют автоматы). Однако, если вы напрямую не использовали ОС для ввода-вывода, было бы очень сложно наблюдать, что такое выход.

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

Ответ 7

Библиотеки std являются "стандартными" библиотеками, поскольку для компилятора C, совместимого со стандартом (например, C99), эти библиотеки должны быть "include-able". Для интересного примера, который может помочь понять, что это означает, посмотрите на вызов Джессики Маккеллар здесь:

http://blog.ksplice.com/2010/03/libc-free-world/

Ответ 8

CRT является частью языка C так же, как ключевые слова и синтаксис. Если вы используете C, ваш компилятор ДОЛЖЕН предоставить реализацию вашей целевой платформы.

Изменить: Это то же самое, что и STL для С++. Все языки имеют стандартную библиотеку. Может быть, ассемблер как исключение, или некоторые другие языки с очень низким уровнем. Но большинство средних/высоких уровней имеют стандартные библиотеки.

Ответ 9

Стандартная библиотека C является частью ANSI C89/ISO C90. Недавно я работал над библиотекой для компилятора C, который ранее не был ANSI-совместимым.

Книга Standard C Library П. Дж. Плаугера была отличным справочным материалом для этого проекта. В дополнение к изложению требований стандарта Plauger объясняет историю каждого файла .h и причины, лежащие в основе разработки API. Он также предоставляет полную реализацию библиотеки, что мне очень помогло, когда что-то в стандарте было неясно.

Стандарт описывает макросы, типы и функции для каждого из 15 заголовочных файлов (включая stdio.h, stdlib.h, но также float.h, limit.h, math.h, locale.h и другие).

Компилятор не может претендовать на статус ANSI C, если он не включает стандартную библиотеку.

Ответ 10

Язык ассемблера имеет простые команды, которые перемещают значения в регистры процессора, памяти и других основных функций, а также выполняют основные функции и вычисления машины. Библиотеки C - это в основном куски кода сборки. Вы также можете использовать код сборки в своих программах на C. var - инструкция кода сборки. Когда вы используете 0x перед номером, чтобы сделать его шестнадцатеричным, это инструкция сборки. Код сборки - это читаемая форма машинного кода, которая представляет собой визуальную форму фактических состояний переключателей путей цепей.

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

Ответ 11

Да, вы можете сделать кучу вещей без библиотек.

Спасатель - __asm__ в GCC. Это ключевое слово, так что да, вы можете.

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