Vraag Hoe werkt een programma geschreven in C ++?


Wanneer we een Java-programma uitvoeren als JRE niet is geïnstalleerd, werkt het niet.
Ik kwam erachter dat de meeste van de bekende applicaties zoals Google Chrome browser is geschreven in C ++. Dus hoe werkt Windows zo'n programma zonder een runtimeomgeving voor C ++? Wat gebeurt er eigenlijk tijdens de installatie?


17
2017-09-04 05:58


oorsprong


antwoorden:


Dus hoe werkt Windows zo'n programma zonder enige runtime   omgeving voor C ++?

Het uitgangspunt van de vraag is eigenlijk niet waar. Ten minste op Windows is er in feite een runtime-omgeving voor C ++. Eén component van deze runtime (waarschijnlijk de belangrijkste) wordt de C Runtime of de CRT genoemd. :-)

Meestal voordat uw programma zelfs de main() functie, voert de CRT een reeks initialisatieroutines uit en wanneer u terugkeert van de main() functie die hij na zichzelf opruimt. Het hele doel van deze dans is om standaardfunctionaliteit te bieden die vrijwel alle C- en C ++ -programma's vereisen.

Als je ooit een fout over een vermissing hebt gezien msvcrt.dll of iets dergelijks (bijv. msvcr110.dll voor nieuwere programma's) bij het starten van een Windows-programma is het ontbreken van de CRT waar het programma over klagen. De msvcrt.dll is het bestand dat de CRT implementeert. Het staat voor "Microsoft Visual C Runtime".

Duidelijk, msvcrt.dll en zijn familieleden worden geleverd met het Windows-besturingssysteem, waardoor u normaal gesproken geen problemen ondervindt met een ontbrekende runtime-omgeving, in tegenstelling tot de JRE, die moet worden geïnstalleerd door de gebruiker of door de fabrikant van de computer.

Windows C ++ -toepassingen zijn echter gecompileerd om een ​​specifieke versie van de MSVCRT te gebruiken, en als u de fout versie van de MSVCRT, dan zal het besturingssysteem op dezelfde manier klagen als dat het ontbrak. * Wat installateurs meestal doen is controleren of het besturingssysteem de juiste versie heeft en als het dat niet doet, kopieert het het ergens op uw computer vanaf zijn eigen installatiebestanden.

De MSVCRT is echter geen noodzakelijke of voldoende voorwaarde om alle Windows-programma's te laten werken. Het is heel goed mogelijk om een ​​programma te schrijven dat niet afhankelijk is van de MSVCRT, en het is ook heel goed mogelijk dat een Windows-programma andere afhankelijkheden dan de MSVCRT heeft. Vrijwel alle niet-triviale Windows-programma's zijn afhankelijk van de MSVCRT en andere componenten van het besturingssysteem. Het installatieprogramma van het programma zou ook hierop controleren.

Er zijn enkele belangrijke verschillen tussen de JRE en de MSVCRT. Een groot verschil is dat de JRE een virtuele machine-omgeving implementeert voor Java-toepassingen (zo bereikt het zijn "platformonafhankelijke" mogelijkheden), met inbegrip van just-in-time compilatie, enz. Terwijl de MSVCRT alleen standaardfuncties biedt en niets doet over de assemblagecode van je C ++ -programma's.


* Dit is niet helemaal correct omdat C ++ -toepassingen dit kunnen statisch link naar de MSVCRT, die niet afhankelijk is van de DLL. De meeste Windows C ++ -toepassingen echter dynamisch link ernaar, in welk geval de juiste DLL vereist is.


25
2017-09-04 06:01



De vraag lijkt voor de hand te liggen, maar als we een beetje graven lijkt het verre van evident. Ik zal u een meer abstracte weergave geven:

Elke taal kan worden "uitgevoerd" door een geschikte machine die de taalstructuur bestrijkt naar een specifiek stuk hardware dat de bewerking "doet". Het verschil is hoe de "bedrading" is voltooid: hoeveel direct het is en wanneer het is opgezet.

Een windows (maar hetzelfde werkt ook voor linux) machine is op zijn minst een set functies die worden blootgesteld aan bepaalde "vitale" DLL's (bijvoorbeeld Kernel.dll) die door de processor machinecode worden gebeld.

C-programma's worden doorgaans tijdens het compileren vertaald in machinecode die systeemaanroepen plaatst met inachtneming van dat "protocol". Een programma dat geen andere functionaliteit vereist kan nativelly uitgevoerd worden in die omgeving.

Een programma dat andere functionaliteiten vereist, kan:

  • Koppel statisch aan de bibliotheek die de functies in machinecode implementeert (in feite met de code ervan): dit maakt het programma nog steeds native uitvoerbaar.
  • Dynamisch aan die bibliotheken koppelen: het programma moet die bibliotheek laden en koppelen tijdens het opstarten of tijdens de uitvoering: als die bibliotheek zelf al deel uitmaakt van het besturingssysteem draait het programma gewoon, anders moeten die bibliotheken ergens op een manier worden geplaatst programma kan ze vinden (het is het geval van de C runtime-ondersteuning, voor een andere versie dan die gebruikt om het OS zelf te compileren)

Een Java-programma, door de manier waarop de Java-taal is ontworpen en geïmplementeerd, vertaalt zich niet direct in machinecode. Het vertaalt zich in een tussentaal (de byte-code) die moet worden gebruikt als "invoer" voor een interpeter (de java-machine) die zijn instructie daadwerkelijk uitvoert door in machinecode op de onderliggende machine te werken.

Omdat Windows zelf niet in Java is geschreven, heeft het zelf geen dergelijke interpreter nodig, dus je kunt het niet rechtstreeks in een Windows-installatie vinden, maar je moet het daar plaatsen als je het nodig hebt.


3
2017-09-04 06:59



om dit te verduidelijken, wordt een Java-programma gecompileerd naar bytecode via jdk en wordt vervolgens in de jre uitgevoerd

een c ++ -programma wordt rechtstreeks gecompileerd naar machineleesbare code, net zoals de jre moet worden gecompileerd om in vensters te worden uitgevoerd


2
2017-09-04 06:05



Runtime (of C of C ++ standaardbibliotheken) zijn typecally geïnstalleerd met besturingssysteem (glibc, msvcrt, ...).

C / C ++ -programma's kunnen ook "statisch" worden gecompileerd, waarbij bibliotheekonderdelen die door het programma worden gebruikt, zijn gekoppeld (samengevoegd) in een uitvoerbaar bestand, dus het programma heeft bibliotheken in zijn eigen binaire bestand.

Wat betreft "Virtuele machine" die Java-code uitvoert. C ++ wordt meestal gecompileerd tot de systeemcode van het systeem waarop het zal worden uitgevoerd. CPU is die niet-virtuele machine die het zal uitvoeren.

Het is ook mogelijk om C ++ -programma's te compileren in verschillende soorten "bytecode" (.NET CLR, LLVM), maar dit komt minder vaak voor.


2
2017-09-04 06:24