Как создаются низкоуровневые библиотеки?

Когда я иду и делаю приложение на C++, я обычно использую такие библиотеки, как SDL или WxWidgets и так далее. Но если бы мне нужно было создать библиотеку, нужно ли было бы мне использовать библиотеку для создания библиотеки? Или я могу сделать всю библиотеку из основного кода C++, это вообще возможно?

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

Прав ли я с этой теорией? Если нет, то как на самом деле создаются низкоуровневые библиотеки?

(Я знаю, что это широкий вопрос, но я очень любопытный человек, которому нужны ответы, и это меня беспокоит.)


person DavidColson    schedule 27.05.2012    source источник
comment
Да, низкоуровневые библиотеки могут не зависеть от других библиотек в выполнении своей работы. Например, Стандартная библиотека C++ зависит только от основного языка и больше ни от чего. .   -  person Frédéric Hamidi    schedule 27.05.2012
comment
@FrédéricHamidi: Это не совсем так. Некоторые части стандартной библиотеки C++ зависят от возможностей операционной системы, поэтому зависят от предоставляемых ОС API. Эти средства эффективно обеспечивают абстракцию для службы ОС (например, std::fstream, std::exit).   -  person CB Bailey    schedule 27.05.2012
comment
И API ОС. Базовый язык не обеспечивает ввод-вывод.   -  person Puppy    schedule 27.05.2012
comment
вам также может быть интересно узнать, что компиляторы c, такие как gcc, написаны в основном на c ;)   -  person violet313    schedule 27.05.2012
comment
@ Чарльз, ах, хорошая мысль, я не думал об этом. Но можно ли считать системные вызовы библиотечными зависимостями? Я имею в виду, они почти всегда нужны...   -  person Frédéric Hamidi    schedule 27.05.2012
comment
@FrédéricHamidi: Ну, они являются зависимостью, даже если не зависимостью от библиотеки, но стандартную библиотеку C++ не нужно создавать непосредственно на системных вызовах. Вы можете построить (например) <fstream> поверх Win32 CreateFile, ReadFile, WriteFile API или даже поверх C fopen, fread и т. д.   -  person CB Bailey    schedule 27.05.2012
comment
@ Чарльз, понял. Тогда я исправляюсь.   -  person Frédéric Hamidi    schedule 27.05.2012
comment
@ violet313 больше нет, gcc недавно перешел на c ++ для своей реализации.   -  person josefx    schedule 27.05.2012
comment
@josefx: неправда, он совместим с C как C ++, иначе --disable-build-[poststage1-]with-cxx не сработает.   -  person    schedule 27.05.2012
comment
@Fanael Я не знаю, что делает эта опция и когда ее можно использовать. Однако из того, что я прочитал, код gcc может содержать определенный набор функций C++ (en.wikipedia.org /wiki/GNU_Compiler_Collection#Development), это делает исходный код gcc несовместимым с c.   -  person josefx    schedule 27.05.2012
comment
@FrédéricHamidi: Фактически, подсистема ввода-вывода C++ основана на библиотеке C stdio (поскольку библиотека C является частью библиотеки C++, вы можете возразить, что на самом деле это не зависимость от другой библиотеки). Таким образом, обычная последовательность вызовов для ввода/вывода следующая: C++ → C → операционная система, где часть операционной системы — это C stdio → функции ввода/вывода POSIX → системный вызов → ядро ​​в Linux и C stdio → Windows API → собственный API → системный вызов. → ядро ​​в Windows.   -  person Philipp    schedule 27.05.2012
comment
Спасибо за всю информацию ребята!   -  person DavidColson    schedule 27.05.2012
comment
@Fanael Я проверил еще раз, и кажется, вы правы, по крайней мере, функциональность, необходимая для компилятора c, не использует C++. (В мою защиту есть несколько статей, в которых утверждается, что gcc перешел на C++, хотя на самом деле они разрешали использовать только код C++ )   -  person josefx    schedule 27.05.2012
comment
Также специфичный для процессора ASM для реализации longjmp и контекстного набора функций C.   -  person J. M. Becker    schedule 28.09.2016


Ответы (6)


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

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

person josefx    schedule 27.05.2012

Когда я иду и делаю приложение на C++, я обычно использую такие библиотеки, как SDL или wxWidgets и так далее. Но если бы мне нужно было создать библиотеку, нужно ли было бы мне использовать библиотеку для создания библиотеки? Или я могу сделать всю библиотеку из основного кода C++, это вообще возможно?

да.

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

No.

C и C++ — это примеры языков третьего поколения. Таким образом, они пытаются скрыть многие системные детали реализации. В основе слоя языка программирования третьего поколения (3GL) лежит язык программирования второго поколения (2GL), такой как сборка x86; ниже этого у нас есть инструкции по машинному коду.

Как уже было указано josefx, вы действительно можете реализовать библиотеку C++ на чистом C++ . Однако системные библиотеки (особенно для управления устройствами) могут быть и часто пишутся на ассемблере. И вообще, библиотека также может быть написана на COBOL или Fortran или даже Brainfuck.

Именно процессы ассемблера/компилятора/компоновщика фактически преобразуют 2GL/3GL коды в library, с которыми можно связать в C++.

Вот небольшой пример программы на C, blah.c, которая ссылается на отсутствие стандартных библиотек времени выполнения, но все же умудряется выводить данные с помощью функции в *проприетарной библиотеке, libfoo.a, написанной на x86 assembler:

бла.с:

/*-----------------------------------------------
blah.c
Invokes some assembly
------------------------------------------------*/
void _start() 
{
    char sz[]={"oOoook\n"};
    foo(sz,sizeof(sz));
    byebye();
}

foo.asm:

;----------------------------------------------------------------------------
;Some foo assembly: exposes system write & exit
;----------------------------------------------------------------------------  

    SECTION .text
    global  foo
    global  byebye

foo:
    push    ebp
    mov     ebp,esp

    mov     edx, [ebp+12]
    mov     ecx, [ebp+8]
    mov     ebx,1
    mov     eax,4               ;syscall for __NR_write
    int     0x80                ;service interrupt               

    mov     esp,ebp
    pop     ebp

    mov     eax,0
    ret

byebye:
    mov     ebx,0
    mov     eax,1               ;syscall for __NR_exit
    int     0x80                ;service interrupt               
    ret

И вот как он устроен:

$ nasm -felf -ofoo.o foo.asm
$ ar rs libfoo.a foo.o
$ gcc  -L. -oblah blah.c -lfoo -nostartfiles -nostdlib -nodefaultlibs
$ ./blah
oOoook
$


Как видно, библиотека использует системные вызовы (в данном случае к ядру linux); которые, кстати, также могут быть реализованы третьими лицами.

person violet313    schedule 27.05.2012

SDL и wxWidgets — это библиотеки, которые абстрагируют детали базовой системы (систем).

Чтобы обеспечить аналогичную функциональность (графика, звук, ввод), вам нужно написать код непосредственно для Windows API в Windows, Cocoa в Mac OS X и в Unix, прямо против API POSIX и X11 (с использованием XCB, Xlib или необработанный протокол X11).

person gnud    schedule 27.05.2012
comment
И вы даже не можете кодировать Cocoa на (чистом) C++. (Глупое яблоко.) - person Seth Carnegie; 27.05.2012
comment
@SethCarnegie Думаю, ты немного ошибаешься. Взгляните на это: stackoverflow.com/questions/10289890/. Очевидно, что для C++ (который позволяет писать код на C) идея остается той же. - person Richard J. Ross III; 27.05.2012
comment
@RichardJ.RossIII Я имею в виду, что нет первоклассного интерфейса. Как сказал парень в комментариях, чтобы избежать изучения Objective-C, теперь вам нужно изучить детали реализации и API уровня C среды выполнения Objective-C, что является чушью. - person Seth Carnegie; 27.05.2012

Существует три вида библиотек:

  1. библиотеки, которые выполняют системные вызовы
  2. библиотеки, реализующие вызов сторонних функций
  3. библиотеки, которые можно написать или переписать на ядре C++ (например, исключая расширение asm)

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

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

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

В любом случае библиотеки, подпадающие под первые две категории, обычно также имеют большой объем кода, написанного на чистом C++, который ничего не делает, кроме как оборачивает API системного/внешнего вызова в форму, более знакомую инструментам и программистам C++. (например, заголовочные файлы и другие полезные утилиты).

person Lie Ryan    schedule 27.05.2012

По сути, библиотеки — это просто наборы классов. Они могут быть основаны на других библиотеках, чтобы расширить их или полностью предоставить ядро ​​​​новой библиотеке. Вы можете создать свою собственную библиотеку, просто используя код C++, например, графическую библиотеку, которая использует преимущества Windows API, библиотеку чата/общения, которая расширяет доступные библиотеки сокетов и т. д. Вы правы, говоря, что библиотеки используют ядро ​​C++. функциональность.

person Darren    schedule 27.05.2012

Библиотеки — это не что иное, как другой код, с которым вы можете связать свой код. в них нет ничего волшебного или особенного. Вы можете взять написанные вами функции и превратить их в библиотеку. Итак, вопрос на самом деле в том, можете ли вы делать низкоуровневые вещи только на C++ или вам нужно что-то еще? Ну, вот тут-то и появляется ответ Ли Райана. Вы можете написать свою программу, делать свое дело, используя только код C++. Вы можете делать системные вызовы, и вы можете использовать другие языки (например, ассемблер), которые делают то, что вы не можете делать в C++, но должны делать.

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

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

person old_timer    schedule 30.05.2012