То, что можно сделать в C без “станд.”, включает? Они, отделяются “C” или просто библиотек?

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

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

Что могло я делать, если существует нет printf(), fopen(), и т.д.?

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

46
задан Lorenzo Donati supports Monica 15 October 2013 в 23:45
поделиться

8 ответов

В стандарте C сказано (5.1 .2.3 / 5):

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

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

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

- Динамика ввода и вывода интерактивных устройств должна выполняться , как указано в 7.19.3.

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

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

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

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

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

29
ответ дан 26 November 2019 в 20:38
поделиться

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

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

2
ответ дан 26 November 2019 в 20:38
поделиться

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

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

0
ответ дан 26 November 2019 в 20:38
поделиться

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

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

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

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

0
ответ дан 26 November 2019 в 20:38
поделиться

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

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

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

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

8
ответ дан 26 November 2019 в 20:38
поделиться

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

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

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

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

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

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

14
ответ дан 26 November 2019 в 20:38
поделиться

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

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

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

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

2
ответ дан 26 November 2019 в 20:38
поделиться

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

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

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

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

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

2
ответ дан 26 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: