C ++アプリケーションを作成するときは、通常、SDLやwxWidgetsなどのライブラリを使用します。しかし、ライブラリを作成する場合、ライブラリを使用してライブラリを作成する必要がありますか?または、ライブラリ全体をコアC ++コードで作成できますか?これも可能ですか?
はい。
私の言いたいことは、ライブラリにはそれ自体の基礎となるものが何もないという点があるに違いないので、使用できるのはコアC++だけです。
いいえ。
C&C ++は、第三世代言語の例です。そのため、システムごとの実装の詳細を隠そうとします。第3世代プログラミング言語(3GL)レイヤーの基礎となるのは、 x86アセンブリなどの第2世代プログラミング言語(2GL)です。この下にマシンコードの説明があります。
josefxですでに指摘されているように、C++ライブラリを純粋なC++で実装することもできます。ただし、システムライブラリ(特にデバイスを制御するためのライブラリ)は、アセンブラで記述される場合があります。また、一般的に、ライブラリはCOBOLやFortran、さらにはBrainfuckで作成することもできます。
2GL/3GL
コードをlibrary
C++でリンクできるに実際に変換するのは、アセンブラー/コンパイラー/リンカープロセスです。
blah.c
これは、標準のランタイムライブラリにリンクしない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
カーネル)を利用します。ちなみに、これはサードパーティによっても実装される可能性があります。