Как создаются библиотеки низкого уровня?
Когда я иду и создаю приложение на С++, я обычно использую библиотеки, такие как SDL или WxWidgets и так далее. Но если мне нужно создать библиотеку, мне нужно будет использовать библиотеку для создания библиотеки? Или я могу сделать всю библиотеку из основного кода на С++, возможно ли это?
Моя точка зрения заключается в том, что должна существовать точка, в которой библиотеке нечего строить, и поэтому единственное, что она может использовать, это ядро С++.
Я прав с этой теорией? Если нет, то как создаются низкоуровневые библиотеки?
(Я знаю, что это широкий вопрос, но я очень любопытный человек, которому нужны ответы, и это то, что меня беспокоило.)
Ответы
Ответ 1
Библиотеки низкого уровня получают доступ к аппаратным и системным ресурсам через библиотеки, предоставляемые операционной системой. Сама операционная система и загруженные ею драйверы используют сборку и чтение/запись предопределенных адресов памяти для изменения состояния процессора и взаимодействия с оборудованием.
Библиотека, которая зависит только от С++, может быть только полезной библиотекой, поскольку любая связь с аппаратным обеспечением или пользователем будет включать либо сборку, либо дополнительную библиотека. Примером чистой библиотеки С++ без зависимостей будет математическая библиотека, так как она не требует ввода/вывода или доступа к аппаратным средствам.
Ответ 2
Когда я иду и делаю С++-приложение, я обычно использую такие библиотеки, как SDL или wxWidgets и т.д. Но если мне нужно создать библиотеку, мне нужно будет использовать библиотеку для создания библиотеки? Или я могу сделать всю библиотеку из основного кода на С++, возможно ли это?
Да.
Моя точка зрения должна быть в том, что в библиотеке нет ничего, на что можно основываться, и поэтому единственное, что она может использовать, это ядро С++.
Нет.
C и С++ - примеры языков третьего поколения. Поэтому они пытаются скрыть многие системные детали реализации. В основе третьего поколения язык программирования (3GL) - это second -генерирующий язык программирования (2GL), такой как сборка x86; ниже мы имеем инструкции машинного кода.
Как уже отмечалось josefx, вы действительно можете реализовать библиотеку С++ в чистом С++. Однако системные библиотеки (особенно те, которые используются для управления устройствами) могут быть и часто написаны на ассемблере. И вообще, библиотека также может быть написана в COBOL или Fortran или даже Brainfuck.
Процессы ассемблера/компилятора/компоновщика фактически преобразуют коды 2GL/3GL
в library
, которые могут быть связаны с С++.
Вот небольшой пример программы C, blah.c
, которая ссылается на стандартные библиотеки времени выполнения нет, но по-прежнему удается распечатать материал с помощью функции в * запатентованной библиотеке, libfoo.a,
, записанный в x86 assembler
:
blah.c:
/*-----------------------------------------------
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
),; которые, кстати, также могут быть реализованы третьими сторонами.
Ответ 3
SDL и wxWidgets - это библиотеки, которые абстрагируют детали базовой системы.
Чтобы обеспечить аналогичную функциональность (графику, звук, ввод), вам нужно будет напрямую кодировать Windows API в Windows, Cocoa на Mac OS X и Unix непосредственно против POSIX API и X11 (используя XCB, Xlib или необработанный протокол X11).
Ответ 4
Существует три типа библиотек:
- библиотеки, которые выполняют системные вызовы
- библиотеки, реализующие вызов внешней функции
- которые могут быть записаны или переписаны в ядре С++ (например, исключение asm extension)
Библиотеки, которые выполняют системные вызовы, вообще не могут быть записаны в самом языке, поскольку они зависят от особенностей соглашения о системном вызове, которое обычно включает в себя создание ловушки или прерывания для ядра, чтобы вызвать переключатель в ниже привилегированное кольцо. В чистом С++ нет средства генерации ловушки/прерывания; OS API обычно использует расширения для сборки.
Вторая категория - это библиотеки, которые создают или принимают соглашения о внешних вызовах; возможно, системный вызов является подкатегорией этого, но системный вызов явно отличается в том, что для системного вызова требуется переключатель вызова привилегий, а внешние вызовы - нет. Соглашение о внешних вызовах также обычно записывается в сборку.
Все другие библиотеки, которые не связаны с кольцевым коммутатором или внешним вызовом, всегда могут быть записаны в самом С++; хотя иногда это не так, обычно для служебной цели (например, математическая библиотека относится к этой категории).
В любом случае библиотеки, которые попадают под прежние две категории, обычно также имеют большой объем кода, написанный на чистом С++, который ничего не делает, кроме как обертывает API системного вызова/внешнего вызова в форму, более привычную для С++ инструменты и программисты (например, файлы заголовков и другие удобные утилиты).
Ответ 5
В самом ядре библиотеки - это просто коллекции классов. Они могут быть основаны на других библиотеках, чтобы расширить их или полностью обеспечить ядро для новой библиотеки. Вы можете создать свою собственную библиотеку только с использованием кода на С++, например, графической библиотеки, которая использует преимущества Windows API, библиотеки чата/связи, которая расширяет доступные библиотеки сокетов и т.д. Вы правильно говорите, что библиотеки используют основной С++ функциональность.
Ответ 6
Библиотеки - это не что иное, как другой код, с которым вы можете связать свой код. в них нет ничего волшебного или особенного. Вы можете взять функции, которые вы написали, и превратить их в библиотеку. Таким образом, на самом деле вопрос заключается в том, что вы можете использовать только низкоуровневый контент только С++ или вам нужно сделать что-то еще? Ну, вот куда приходит ответ Ли Райан. Вы можете написать свою программу, сделать свою вещь, только с кодом на С++. Вы можете делать системные вызовы, и вы можете связать другие языки (например, сборку), которые делают то, что вы не можете сделать на С++, но это нужно сделать.
В конце концов, все это сводится к машинным кодам и аппаратным средствам. Любой язык или метод, желаемый или требуемый для получения этого машинного кода или что-то функционально то же самое, находится в пределах возможностей. возможно, не всегда самая умная вещь, чтобы излишне использовать asm или не использовать системный вызов и т.д.
Существует большое количество библиотек с открытым исходным кодом, которые похожи на те, о которых вы говорите, где вы можете просто просто посмотреть код, чтобы увидеть, как они это сделали. И нет ничего, что говорит о том, как один объект реализовал что-то, это единственный способ сделать это.