Подтвердить что ты не робот

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

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

Моя точка зрения заключается в том, что должна существовать точка, в которой библиотеке нечего строить, и поэтому единственное, что она может использовать, это ядро ​​С++.

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

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

4b9b3361

Ответ 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 или не использовать системный вызов и т.д.

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