C++ -code converteren naar C

Ik heb wat C++ -code. In de code zijn er veel klassen gedefinieerd, hun lidfuncties, constructeurs, destructors voor die klassen, enkele sjabloonklassen en veel C++ -spullen. Nu moet ik de bron omzetten naar Plain C-code.

I De volgende vragen:

  1. Is er een hulpmiddel om C++ -code- en header-bestanden naar C-code te converteren?

  2. Moet ik totale herschrijving van de code doen (ik zal de constructeurs, destructors moeten verwijderen en die code in een bepaalde init(), deinit()Functies; verander klassen naar structuren, het bestaande lid functioneert als functiewijzers in die nieuw gedefinieerde structuren en vervolgens die functies oproepen met behulp van functiewijzers enz.)?

  3. Als ik het zelf handmatig moet converteren, welke C++ Specifieke code-gegevensconstructies / semantiek moet ik opletten tijdens het doen van de conversie van C++ naar C?


Antwoord 1, Autoriteit 100%

Er is inderdaad zo’n hulpmiddel, Comeau’s C++ Compiler. . Het genereert C-code die u niet handmatig kunt onderhouden, maar dat is geen probleem. U onderhoudt de C++ -code en bekleedt u gewoon naar C op de vlucht.


Antwoord 2, Autoriteit 74%

http://llvm.org/docs/faq.html#Translatecxx

Het behandelt een code, maar zal mislukken voor meer complexe implementaties omdat het niet volledig is bijgewerkt voor een aantal van de moderne C++ -conventies. Probeer dus regelmatig uw code te compileren totdat u een gevoel krijgt voor wat is toegestaan.

Gebruikssytax van de opdrachtregel is als volgt voor versie 9.0.1:

clang -c CPPtoC.cpp -o CPPtoC.bc -emit-llvm
clang -march=c  CPPtoC.bc -o CPPtoC.c

Voor oudere versies (niet zeker van de overgangsversie), gebruik de volgende syntaxis:

llvm-g++ -c CPPtoC.cpp -o CPPtoC.bc -emit-llvm
llc -march=c  CPPtoC.bc -o CPPtoC.c

Merk op dat het een GNU-smaak van C creëert en niet echt ANSI C. U zult willen testen of dit nuttig voor u is voordat u te veel in uw code investeert. Sommige embedded systemen accepteren bijvoorbeeld alleen ANSI C.

Houd er ook rekening mee dat het functionele maar redelijk onleesbare code genereert. Ik raad aan om commentaar te geven op je C++-code en deze te onderhouden en je geen zorgen te maken over de uiteindelijke C-code.

EDIT: hoewel de officiële ondersteuning van deze functionaliteit is verwijderd, kunnen gebruikers nog steeds gebruik maken van ditonofficiële ondersteuning van Julia-taalontwikkelaars om bovengenoemde functionaliteit te bereiken.


Antwoord 3, autoriteit 16%

Hoewel je OO in C kunt doen (bijvoorbeeld door een theType *thiseerste parameter toe te voegen aan methoden, en handmatig iets als vtables voor polymorfisme af te handelen), is dit nooit echt bevredigend als ontwerp, en zal er lelijk uitzien (zelfs met enkele pre-processor hacks).

Ik zou willen voorstellen om op zijn minst naar een herontwerp te kijken om te vergelijken hoe dit zou uitpakken.

Over het algemeen hangt veel af van het antwoord op de belangrijkste vraag: als je werkende C++-code hebt, waarom wil je dan in plaats daarvan C?


Antwoord 4, autoriteit 16%

Misschien is het goede oude cfrontvoldoende?


Antwoord 5, autoriteit 13%

Een compiler bestaat uit twee grote blokken: de ‘front-end’ en de ‘back-end’.
Het front-end van een compiler analyseert de broncode en bouwt een vorm van een ‘intermediaire representatie’ van genoemde broncode die veel gemakkelijker te analyseren is door een machine-algoritme dan de broncode (dwz terwijl de broncode, bijvoorbeeld C++, is ontworpen om help de menselijke programmeurom code te schrijven, de tussenvorm is ontworpen om het algoritmedat de tussenvorm gemakkelijker analyseert, te vereenvoudigen).
De back-end van een compiler neemt de tussenvorm aan en converteert deze vervolgens naar een ‘doeltaal’.

De doeltaal voor compilers voor algemeen gebruik zijn assembler-talen voor verschillende processors, maar er is niets dat een compiler-backend verbiedt om code in een andere taal te produceren, zolang de doeltaal (tenminste) flexibel als een algemene CPU-assembler.

Zoals je je waarschijnlijk wel kunt voorstellen, is C zeker net zo flexibel als de assembler van een CPU, zodat een compiler van C++ naar C echt geen probleem is om vanuit een technische pov te implementeren.

Dus je hebt: C++ —frontEnd—> someIntermediaryForm —backEnd—> C

Misschien wil je deze jongens eens bekijken: http://www.edg.com /index.php?location=c_frontend
(de bovenstaande link is slechts informatief voor wat kanworden gedaan, ze licentiëren hun front-ends voor tienduizenden dollars)

PS
Voor zover ik weet, is er niet zo’n C++ naar C-compiler door GNU, en dit verslaat me helemaal (als ik het goed heb). Omdat de C-taal vrij klein is en de interne mechanismen vrij rudimentair zijn, vereist een C-compiler zoiets als een manjaar werk (ik kan je dit uit de eerste hand vertellen, want ik heb zelf zo’n compiler jaren geleden geschreven, en het produceert een [ virtual] stack machine intermediaire code), en het zou geweldig zijn om een onderhouden, up-to-date C++-compiler te hebben terwijl je maar één keer een C-compiler hoeft te schrijven…


Antwoord 6, autoriteit 6%

Dit is een oude thread, maar blijkbaar heeft de C++ Faqeen sectie(Gearchiveerde versie 2013)hierover. Dit zal blijkbaar worden bijgewerkt als de auteur wordt gecontacteerd, dus dit zal op de lange termijn waarschijnlijk meer up-to-date zijn, maar hier is de huidige versie:

Hangt ervan af wat je bedoelt. Als je bedoelt, is het mogelijk om C++ te converteren naar leesbare en onderhoudbare C-code? dan sorry, het antwoord is Nee – C++-functies zijn niet direct toegewezen aan C, en de gegenereerde C-code is niet bedoeld voor mensen om te volgen. Als je in plaats daarvan bedoelt: zijn er compilers die C++ naar C converteren om te compileren op een platform dat nog geen C++-compiler heeft? dan heb je geluk – blijf lezen.

Een compiler die C++ naar C compileert, controleert het programma volledig op syntaxis en semantiek, en gebruikt toevallig C-code als een manier om objectcode te genereren. Zo’n compiler is niet zomaar een of andere fancy macroprocessor. (En stuur me alsjeblieft geen e-mail met de bewering dat dit preprocessors zijn – dat zijn ze niet – het zijn volledige compilers.) Het is mogelijk om alle functies van ISO-standaard C++ te implementeren door te vertalen naar C, en met uitzondering van het afhandelen van uitzonderingen, resulteert dit meestal in in objectcode met een efficiëntie die vergelijkbaar is met die van de code die wordt gegenereerd door een conventionele C++-compiler.

Hier zijn enkele producten die compilatie naar C uitvoeren:

  • Comeau Computingbiedt een compiler gebaseerd op Edison Design Group’s front-enddie C-code uitvoert.
  • LLVMis een downloadbare compiler die C-code uitzendt. Zie ook hieren hier. Hier is een voorbeeld van C++ naar C conversie via LLVM.
  • Cfront, de oorspronkelijke implementatie van C++, gedaan door Bjarne Stroustrup en anderen bij AT&T, genereert C-code. Het heeft echter twee problemen: het is moeilijk geweest om een licentie te krijgen sinds het midden van de jaren 90, toen het een doolhof van eigendomsveranderingen doormaakte, en de ontwikkeling stopte op datzelfde moment en dus krijgt het geen bugfixes en ondersteunt het geen van de nieuwere taalfuncties (bijv. uitzonderingen, naamruimten, RTTI, lidsjablonen).

  • In tegenstelling tot de populaire mythe, is er op het moment van schrijven geen versie van g++ die C++ naar C vertaalt. Zoiets lijkt te kunnen, maar ik ben me er niet van bewust dat iemand het (nog) heeft gedaan.

Houd er rekening mee dat u doorgaans de CPU, het besturingssysteem en de C-compiler van het doelplatform moet specificeren, zodat de gegenereerde C-code specifiek voor dit platform wordt gebruikt. Dit betekent: (a) u kunt de voor platform X gegenereerde C-code waarschijnlijk niet gebruiken en compileren op platform Y; en (b) het zal moeilijk zijn om de vertaling zelf te doen — het zal waarschijnlijk een stuk goedkoper/veiliger zijn met een van deze tools.

Nog een keer: stuur me geen e-mail met de mededeling dat dit slechts preprocessors zijn — dat zijn ze niet — het zijn compilers.

Other episodes