Forum: PC-Programmierung Was genau versteht man unter Laufzeitbibliothek


von test1 (Gast)


Lesenswert?

Hi Leute,

der Titel sagt eigentlich schon alles, ich verstehe das Prinzip nicht 
ganz.
Nehmen wir an ich habe ein simples C-Programm mit 3 printf-Ausgaben.
Also printf ist in der Laufzeitbibliothek vom Compiler integriert als 
Objectcode.(soweit so richtig? :P)

Was passiert jetzt beim Kompilieren bzw Linken ?
Wird bei den Programm mit den angenommenen 3 printf-Ausgaben jetzt an 
jeder Stelle der Maschinencode von printf dafür "platziert" ?

Oder wird die printf-Funktion einmal zum Programm dazugebindet und beim 
Ausführen in den RAM geladen und dann 3mal aufgerufen? sprich das 
Programm ist insgesammt kleiner.

mfg

von Karlos (Gast)


Lesenswert?

test1 schrieb:
> Also printf ist in der Laufzeitbibliothek vom Compiler integriert als
> Objectcode.(soweit so richtig? :P)

Soweit, so gut.

> Was passiert jetzt beim Kompilieren bzw Linken ?
> Wird bei den Programm mit den angenommenen 3 printf-Ausgaben jetzt an
> jeder Stelle der Maschinencode von printf dafür "platziert" ?

Das gerade nicht. Es wird nur jeweils ein Verweis auf die Funktion in 
der Bibliothek gesetzt. Vorteil: Das Programm ist kleiner. Nachteil: 
Ohne die Bibliothek läuft das Programm nicht. Unter Windows kennt man 
das: Bei manchen Programmen gibts dann die Fehlermeldung: "DLL xx nicht 
gefunden".

> Oder wird die printf-Funktion einmal zum Programm dazugebindet und beim
> Ausführen in den RAM geladen und dann 3mal aufgerufen? sprich das
> Programm ist insgesammt kleiner.

Nein, die Funktion selbst wird nicht "dazugebindet". Nur ein Verweis auf 
die Funktion in der Bibliothek.

von test1 (Gast)


Lesenswert?

OK.

von wikipedia:
"Zum Beispiel benötigt die Programmiersprache C nur eine minimale 
Laufzeitbibliothek, schreibt aber eine große Standardbibliothek (die 
sogenannte Standard C Library) von Funktionen vor, die jede 
C-Implementation mitbringen muss."

und was ist jetzt der unterschied zwischen der Laufzeitbibliothek und 
der Standard Library??

von nur so am vorbeischauen (Gast)


Lesenswert?

test1 schrieb:
> und was ist jetzt der unterschied zwischen der Laufzeitbibliothek und
> der Standard Library??

die Laufzeitbibliothek wird erst beim Start des Programms geladen
und mit dem Hauptprogramm "verbunden" (dynamisches Linken)

Standard Library bezieht sich auf Ansi-C und damit auf den Funktions-
umfang und nicht auf das Linken.

Beim statischen Linken wird nach dem Übersetzen die Bibliothek
mit deinem Programm "verbunden" und als Ganzes abgelegt.

Dynamisches Linken:
Funktion1 in Laufzeitbibliothek1 wird von Prog1, Prog2 und Prog3
verwendet: Prog1, Prog2, Prog3 und Laufzeitbibliothek1 werden
getrennt auf der Platte (od. aehnl.) gespeichert und beim Start
von Prog1 wird Prog1 und die Laufzeitbibliothek1 in den Arbeits-
speicher geladen.

Statisches Linken:
Funktion1 in Bibliothek1 wird von ProgA, ProgB, ProgC verwendet:
Prog1 und Funktion1 aus Bibliothek1 werden zusammengebunden zu ProgA
Prog2 und Funktion1 aus Bibliothek1 werden zusammengebunden zu ProgB
Prog3 und Funktion1 aus Bibliothek1 werden zusammengebunden zu ProgC
und auf der Platte gespeichert. Gestartet wird ProgA (bzw. B/C)
D.h. Funktion1 ist anschließend in jedem ProgX vorhanden.

viel Gruesse

von Rolf M. (rmagnus)


Lesenswert?

Dieser Wikipedia-Artikel ist verwirrend. Allerdings finde ich auch den 
Begriff nicht sonderlich gelungen. Er führt zwangsläufig zur Verwirrung.

nur so am vorbeischauen schrieb:
> test1 schrieb:
>> und was ist jetzt der unterschied zwischen der Laufzeitbibliothek und
>> der Standard Library??
>
> die Laufzeitbibliothek wird erst beim Start des Programms geladen
> und mit dem Hauptprogramm "verbunden" (dynamisches Linken)

Nein. Damit hat das nichts zu tun. Direkt vor dem oben zitierten Satz 
steht in der  Wikipedia auch:

"Nicht verwechselt werden darf das Konzept der Laufzeitbibliothek mit 
dem einer normalen Programmbibliothek, wie sie von einem 
Anwendungsprogrammierer erstellt oder einem Dritten geliefert wird, oder 
einer dynamischen Bibliothek, was eine zur Laufzeit gelinkte 
Programmbibliothek bezeichnet."

test1 schrieb:
> und was ist jetzt der unterschied zwischen der Laufzeitbibliothek und
> der Standard Library??

Am Anfang des Wikipedia-Artikels steht es, wenn auch etwas schwer 
erkennbar:

"Er [Der Begriff "Laufzeibibliothek"] bezeichnet eine spezielle 
Programmbibliothek, eine Sammlung von Softwarefunktionen, die benutzt 
wird, um innerhalb eines Computerprogramms die in eine 
Programmiersprache eingebauten Funktionen zur Zeit der Ausführung des 
Programms (Laufzeit) zu realisieren"

Wichtig ist hier "_eingebaute_ Funktionen". Die Laufzeitbibliothek ist 
also gerade nicht die Standardbibliothek, sondern eine Bibliothek, die 
das implementiert, was schon in der Basis der Sprache enthalten ist, 
z.B. den Startup-Code, der die Funktion main() aufruft oder die 
Initialisierung der globalen Variablen durchführt. Bei C gibt's nicht 
arg viel mehr, aber bei anderen Sprachen schon. In C++ z.B. das 
Excpetion-Handling oder der Operator new. In manchen anderen Sprachen 
ist noch viel mehr in der Laufzeitbibliothek.

Der obige Wikipedia-Satz zeigt auch, warum der Begriff eigentlich blöd 
ist. Auch andere Bibliotheken realisieren ihre Funktionen zur Laufzeit. 
Deshalb auch die Verwirrung hier.
Ich denke, der Grund für den Namen ist, daß diese Bibliothek den Teil 
der Sprachbasis implementiert, der erst zur Laufzeit durchgeführt werden 
kann.

von (prx) A. K. (prx)


Lesenswert?

Eine Laufzeitbibliothek enthält Funktionen, die man nicht selbst 
explizit aufruft, sondern die der Compiler implizit verwendet. 
Beispielsweise für Multiplikation/Division und Fliesskommarechnung.

Printf jedoch gehört nicht zur Laufzeitbibliothek sondern zur 
Standardbibliothek.

Der Wiki Artikel ist auch deshalb so verwirrend, weil in Sprachen wie 
Fortran die I/O Bestandteil der Sprache ist, und daher die entsprechde 
Implementierung zur Laufzeitbibliothek zählt. In C ist das anders.

von g. b. (gunb)


Lesenswert?

Guten Morgen,

das ist eine interessante Diskussion! Ich frage mich nämlich gerade, ob 
diese genaue Trennung zwischen SCL (Standard C Lib) und RTL (Runtime 
Lib) in der Praxis immer so genau vorgenommen wird?!

Ich stimme den Erklärungen von Rolf Magnus und A.K. zu, habe aber soeben 
noch einmal im C/C++ Kompendium von Dirk Louis nachgeschaut, da er im 
Anhang die eigentlich der Standard Lib zugehörigen Header in der 
Überschrift mit "C++-Laufzeitbibliothek" bezeichnet, was eigentlich 
falsch ist.

Weiteres Nachlesen bei Wikipedia unter "Standard C Library" ergibt:

>(Seit der Standardisierung von C muss es weder Header noch separaten 
>Präprozessor geben; z. B. muss der „magische“ Befehl #include stdio.h
>in einem „hosted environment“ die stdio-Funktionalität ermöglichen, egal ob es 
>überhaupt eine Datei stdio.h gibt oder nicht.) Die tatsächliche Implementierung 
>der Funktionen ist meist in eine Programmbibliothek ausgelagert (z. B. libc.so.6 
>unter Linux, msvcrt.dll unter Windows).

und weiter unten:

>Programme für Microsoft Windows nutzen häufig die von der
>„Microsoft-Visual C++-Laufzeitumgebung“ („msvcrt.dll“) bereitgestellte 
>SCL-Implementierung, die keinen besonderen Namen trägt, da sie nicht separat 
>verfügbar ist.

Nach meinem Verständnis komme ich dann zu dem Schluss, dass nach 
strenger C-Standarfdefinition die STL und RTL so zu trennen sind, wie 
ihr es oben beschreibt, aber durch die Eingliederung der STL in die RTL 
wie zum Beispiel im Falle Microsofts diese "Grenzen" etwas verwischen 
und die STL dann wie im o.g. Kompendium der RTL zugeordnet wird, obwohl 
dies im strengen Sinne eigentlich falsch wäre.

Wie seht ihr das?

Gruß
Gunb

von Karl H. (kbuchegg)


Lesenswert?

Gunnar B. schrieb:
> Guten Morgen,
>
> das ist eine interessante Diskussion! Ich frage mich nämlich gerade, ob
> diese genaue Trennung zwischen SCL (Standard C Lib) und RTL (Runtime
> Lib) in der Praxis immer so genau vorgenommen wird?!


In C?

Meistens nicht.
Die Trennung in Laufzeitbibliothek und Standardbibliothek ist da 
meistens akademischer Natur.

Allenfalls wenn der Linker ein Kombilinker ist, der mit dem Output 
vieler verschiedener Compiler klar kommen muss/soll, wird da getrennt. 
Aber in früheren Zeiten war es absolut üblich, dass es einfach nur eine 
physische Library war (also eine einzige Datei), die vom Linker 
standardmässig zu einem EXE hinzugelinkt wird und aus der alle noch 
nicht gebundenen Funktionen eingebaut wurden. Alles was dann danach noch 
übrig blieb, ist ganz einfach eine "Undefined Reference".
Der Linker unterscheidet da nicht was Lufzeitlibrary und was 
Standardlibrary ist. Für ihn sind das einfach nur Funktionsaufrufe die 
befriedigt werden müssen. Daher gibt/gab es auch keinen Grund, die 
Einzelteile da jetzt streng nach Zugehörigkeit in verschiedene Libraries 
zu verbannen.

> Wie seht ihr das?

Dass du C und C++ nicht durcheinander werfen solltest :-)
Aber im großen und ganzen denke ich, dass diese Unterscheidung etwas 
ist, was niemandem groß Kopfzerbrechen bereiten sollte. Beim Linken baut 
der Linker aus einer oder mehreren Libraries noch zusätzlichen Code ins 
EXE ein. Den gibts in 2 Varianten: Die erste Variante ist von der Art, 
dass die Funktionen dokumentiert sind und in einer konformen 
Implementierung zur Verfügung stehen müssen. Die zweite Variante ist von 
der Art, dass es sich um Funktionalität handelt, die dem Compiler 
bekannt ist und die er benutzt und auch braucht um ein lauffähiges EXE 
hinzubekommen. Welcher Natur dieser 'undokumentierte Code' ist hängt von 
der Umgebung ab und auch davon was CPU/Compiler an Fähigkeiten 
mitbringen. Diese Funktionalität ist für den Compilerbauer interessant 
aber als ordinärer Programmierer ist das nichts was man wissen müsste.

von g. b. (gunb)


Lesenswert?

Hallo,

Karl heinz Buchegger schrieb:
> Dass du C und C++ nicht durcheinander werfen solltest :-)

Stimmt.

Denke, die nicht korrekte Terminierung in mancher Fachliteratur sorgt 
manchmal für Fragezeichen. Man möchte ja in Diskussionen die Begriffe 
SCL und RTL richtig verwenden, und auch was an Funktionen dazugehört.

Das Kompendium auf meinem Schreibtisch widerspricht jedenfalls dem, was 
im Netz unter SCL zu finden ist, dort steht es unter RTL. Deswegen kommt 
bei mir die Frage auf, ob der Autor hier nicht ganz korrekt gewesen ist 
oder ob es doch eine Begründung für dessen Zuordnung der 
Standard-C-Funktionen zur C-Laufzeitumgebung kommt. Dies stände nämlich 
im Widerspruch zu dem , was A.K. erklärt hat.

Meine Erklärung wäre dann mit Bezug auf Microsoft-IDEs das, was ich im 
zweiten Wiki-Zitat dazu gefunden habe. Und da ist die SCL als Teil der 
C++Laufzeitumgebung implementiert.

Wie auch immer, es hat mich nur mal so interessiert, am Ende stimme ich 
natürlich voll zu, dass es den Normalo nicht unbedingt interessieren 
braucht, was im Hintergrund im Detail passiert.

Danke für Deine Erklärung! :-)

Schönen Tag noch,
Gunb

von test1 (Gast)


Lesenswert?

Hi Leute

Verdammt ist das verwirrend :D

Ums noch verwirrender zu machen im Mikrocontroller Bereich gibts ja die 
AVR-libc ;) die sich ja auch Laufzeitbibliothek nennt gg aber in der 
sind die normalen C-Funktionen definiert oder? also auch nicht die 
richtige Bezeichnungg...

von Rolf Magnus (Gast)


Lesenswert?

test1 schrieb:

> Ums noch verwirrender zu machen im Mikrocontroller Bereich gibts ja die
> AVR-libc ;) die sich ja auch Laufzeitbibliothek nennt gg

Wo tut sie das?

> aber in der sind die normalen C-Funktionen definiert oder?

Die avr-libc enthält meines Wissens beides.

Gunnar B. schrieb:
> Ich frage mich nämlich gerade, ob diese genaue Trennung zwischen SCL
> (Standard C Lib) und RTL (Runtime Lib) in der Praxis immer so genau
> vorgenommen wird?!

Immer mit Sicherheit nicht, aber manchmal schon.
Wenn ich auf meinem Linux-System mit gcc z.B. ein C-Programm übersetze, 
werden unter anderem folgende Dateien mit drangelinkt:

   crt1.o crti.o crtbegin.o crtend.o crtn.o libgcc.a

Das dürfte die Laufzeitbibliothek sein, während die Standardbibliothek 
in der libc.so steht.
Bei C++ macht er auch eine Trennung. Der C++-spezifische Teil der 
Laufzeitbibliothek steht dort in der libsupc++.a, während die 
Standardbibliohtekt libstdc++.so heißt.
Ob die jetzt wirklich so sauber getrennt sind oder Teile da auch mal in 
der jeweils anderen Bibliothek implementiert sind, weiß ich allerdings 
nicht. Letztendlich sind auch große Teile der C-Standardbibliothek im 
Compiler selbst schon integriert. Selbst printf und das Parsen von 
dessen Formatstrings beherrscht der gcc selber und kann das für 
Optimierungen verwenden.

> Nach meinem Verständnis komme ich dann zu dem Schluss, dass nach
> strenger C-Standarfdefinition die STL und RTL so zu trennen sind, wie
> ihr es oben beschreibt,

Würde ich nicht sagen. Dort wird das, was die Laufzeitbibliothek tut, 
einfach auf magische Weise getan. Wo diese Funktionalität herkommt, ist 
nicht weiter definiert. Es ist auch nicht verboten, sie in die 
Standardbibliothek mit zu integrieren, solange sie nur Namen exportiert, 
die, die laut C-Norm "reserved for the implementation" sind.

> aber durch die Eingliederung der STL in die RTL wie zum Beispiel im
> Falle Microsofts diese "Grenzen" etwas verwischen und die STL dann wie
> im o.g. Kompendium der RTL zugeordnet wird, obwohl dies im strengen
> Sinne eigentlich falsch wäre.

Als Datei und für den Linker ist es eine einzelne Bibliothek, aber von 
der Funktionalität her eben zwei. Streng genommen hast du recht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.