19

C ++アプリケーションを作成するときは、通常、SDLWxWidgetsなどのライブラリを使用します。しかし、ライブラリを作成する場合、ライブラリを使用してライブラリを作成する必要がありますか?または、ライブラリ全体をコアC ++コードで作成できますか?これも可能ですか?

私のポイントは、ライブラリにはそれ自体の基礎となるものが何もないという点がなければならないということです。したがって、ライブラリが使用できるのはコアC++だけです。

私はこの理論で正しいですか?そうでない場合、低レベルのライブラリは実際にどのように作成されますか?

(私はこれが幅広い質問であることを知っていますが、私は答えを必要とする非常に好奇心旺盛な人であり、これは私を悩ませているものです。)

4

6 に答える 6

21

低レベルのライブラリは、オペレーティングシステムによって提供されるライブラリを介してハードウェアおよびシステムリソースにアクセスします。オペレーティングシステム自体とそれによってロードされるドライバーは、アセンブリを使用し、事前定義されたメモリアドレスの読み取り/書き込みを使用して、CPUの状態を変更し、ハードウェアと通信します。

ハードウェアまたはユーザーとの通信にはアセンブリまたは追加のライブラリが含まれるため、C++のみに依存するライブラリはユーティリティライブラリにしかなりません。依存関係のない純粋なC++ライブラリの例は、I / Oまたはハードウェアアクセスを必要としないため、数学ライブラリです。

于 2012-05-27T10:40:54.120 に答える
8

C ++アプリケーションを作成するときは、通常、SDLやwxWidgetsなどのライブラリを使用します。しかし、ライブラリを作成する場合、ライブラリを使用してライブラリを作成する必要がありますか?または、ライブラリ全体をコアC ++コードで作成できますか?これも可能ですか?

はい。

私の言いたいことは、ライブラリにはそれ自体の基礎となるものが何もないという点があるに違いないので、使用できるのはコアC++だけです。

いいえ。

C&C ++は、第三世代言語の例です。そのため、システムごとの実装の詳細を隠そうとします。第3世代プログラミング言語(3GL)レイヤーの基礎となるのは、 x86アセンブリなどの第2世代プログラミング言語(2GL)です。この下にマシンコードの説明があります。

josefxですでに指摘されているように、C++ライブラリを純粋なC++で実装することもできます。ただし、システムライブラリ(特にデバイスを制御するためのライブラリ)は、アセンブラで記述される場合があります。また、一般的に、ライブラリはCOBOLFortran、さらにはBrainfuckで作成することもできます。

2GL/3GLコードをlibraryC++でリンクできるに実際に変換するのは、アセンブラー/コンパイラー/リンカープロセスです。

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カーネル)を利用します。ちなみに、これはサードパーティによっても実装される可能性があります。

于 2012-05-27T14:03:46.083 に答える
6

SDLとwxWidgetsは、基盤となるシステムの詳細を抽象化するライブラリです。

同様の機能(グラフィックス、サウンド、入力)を提供するには、WindowsのWindows API、 Mac OS XのCocoa、およびUnixに対して、POSIX APIおよびX11に対して直接コーディングする必要があります(XCBXlib、または生のX11プロトコル)。

于 2012-05-27T10:24:39.857 に答える
3

ライブラリには次の3種類があります。

  1. システムコールを行うライブラリ
  2. 外部関数呼び出しを実装するライブラリ
  3. コアC++で記述または再記述できるライブラリ(asm拡張子を除く)

システムコールを実行するライブラリは、通常、カーネルへのトラップまたは割り込みを作成して、より低い特権リングに切り替えるシステムコール規則の特殊性に依存するため、通常、言語自体で作成することはできません。。純粋なC++には、トラップ/割り込みを生成する機能はありません。OS APIは通常、アセンブリ拡張機能を使用してこれを行います。

2番目のカテゴリは、外国の呼び出し規約を作成または受信するライブラリです。おそらくシステムコールはこれのサブカテゴリですが、システムコールは特権リングスイッチを必要とするのに対し、外部コールは必要としないという点で明らかに異なります。外国の呼び出し規約も通常、アセンブリで記述されます。

リングスイッチや外部呼び出し規約を含まない他のすべてのライブラリは、常にC++自体で記述できます。そうでない場合もありますが、通常はパフォーマンスの目的で使用されます(たとえば、数学ライブラリはこのカテゴリに分類されます)。

いずれにせよ、前の2つのカテゴリに分類されるライブラリには、通常、純粋なC ++で記述された大量のコードがあり、システムコール/外部呼び出しのAPIをC++ツールやプログラマーにとってより馴染みのある形式にラップするだけです。 (例:ヘッダーファイル、その他の便利なユーティリティ)。

于 2012-05-27T15:02:40.420 に答える
1

基本的に、ライブラリは単なるクラスのコレクションです。それらは、他のライブラリに基づいてそれらを拡張したり、新しいライブラリに完全にコアを提供したりすることができます。たとえば、Windows APIを利用するグラフィックライブラリ、使用可能なソケットライブラリを拡張するチャット/通信ライブラリなど、C++コードを使用するだけで独自のライブラリを作成できます。ライブラリはコアC++を使用していると言っても過言ではありません。機能。

于 2012-05-27T10:24:31.337 に答える
0

ライブラリは、コードをリンクできる他のコードにすぎません。それらには魔法や特別なものは何もありません。作成した関数をライブラリに変換できます。ですから、問題は、C ++だけで低レベルの処理を実行できるのか、それとも他のことを実行する必要があるのか​​ということです。そこで、Lie Ryanの答えが出てきます。C++コードだけで、プログラムを記述し、自分のことを実行できます。システムコールを作成したり、C ++では実行できないが実行する必要があることを実行する他の言語(アセンブリなど)で結合することもできます。

結局、これはすべてマシンコードとハードウェアに要約されます。そのマシンコードまたは機能的に同じものを取得するために必要な、または必要な言語またはメソッドは、可能性の範囲内にあります。おそらく、asmを不必要に使用したり、システムコールを使用しなかったりするのが必ずしも賢明なことではありません。

あなたが話しているものに似たオープンソースライブラリがたくさんあります。そこでは、コードを見るだけで、それらがどのように実行されたかを確認できます。そして、1つのエンティティが何かを実装する方法がそれを行う唯一の方法であると言うものは何もありません。

于 2012-05-30T21:15:20.683 に答える