Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Tool gesucht: C++ in C übersetzen

Tool gesucht: C++ in C übersetzen

andreas_g
andreas_g29.01.2513:41
Liebe Community,

ich bin auf der Suche nach einem Tool, mit dem ich in C++ geschriebenen Code nach C übersetzen kann.

Das Resultat muss stilistisch nicht perfekt sein. Ich bin durchaus bereit, das Ergebnis noch nachzuarbeiten. Allerdings sollte der resultierende Code für jemanden lesbar sein, der kein C++ beherrscht.

Es scheint diverse kostenpflichte KI-basierte Tools zu geben. Da mein Projekt aber ein nicht-kommerzielles Open-Source-Programm ist, würde ich nur ungern größere Geldsummen investieren.

Hat jemand einen guten Tipp?
0

Kommentare

gfhfkgfhfk29.01.2513:50
Lerne C++ oder schreibe den Code neu. Alles andere ist mehr oder minder sinnlos.
+3
andreas_g
andreas_g29.01.2514:30
Zur Erklärung:
Der vorliegende Code enthält zahlreiche in C++ geschriebene Routinen, die voll funktionsfähig sind, hat aber größere strukturelle Probleme. Weil die strukturellen Probleme ohne tiefgreifende C++-Kenntnisse nicht behebbar sind, soll der Code nun in C sauber neu geschrieben werden, wobei die funktionierenden Routinen erhalten bleiben sollen. Zum Übersetzen dieser Routinen in C würde ich ein Helfer-Tool benötigen.
0
Wauzeschnuff29.01.2515:03
Ganz ehrlich: Ich würde keinem Tool (auch keinem KI-basierten) zutrauen semantisch gleichwertigen C-Code aus einem komplexen C++ Projekt (was ich annehme, da Du "tiefgreifende C++ Kenntnisse" erwähnst) zu erzeugen. Auch wenn C und C++ oft in einem Atemzug erwähnt werden, sind das spätestens seit C++11 doch völlig verschiedene Sprachen.

Meines Erachtens wirst Du (oder ein von Dir avisierter Entwickler) entweder in den sauren Apfel beißen müssen und C++ (im jeweiligen Dialekt) zu erlernen oder aber versuchen den Code an den Routinen die Du erhalten willst sauber zu trennen (aka eine API zu erzeugen) und dann den "Glue-Code" in C neu zu schreiben. Zum Glück können C++ Compiler ja oft auch C-Code übersetzen.
+6
DasFaultier29.01.2515:04
Ich würde schrittweise mit ChatGPT und dem Modell o1 anfangen. Das kann schon viel - 23€ finde ich dafür einen fairen Preis. Die Zeit musst du so oder so investieren.
+1
Nebula
Nebula29.01.2515:12
Ist denn C++ überhaupt so einfach auf C rückportierbar? Arbeiten die Routinen mit Klassen, Objekten, Vererbungen? Wird die Standardbibliothek benutzt? Vermutlich ist es einfacher, C++ zu lernen, als die Funktionalitäten und modernen Features von C++ alle nachzuprogrammieren. Das dürfte auch mit Tools nicht gut klappen. Und wozu etwas neu implementieren, was es schon gibt? KI kann sicher helfen, da sie Code aber nicht wirklich verstehen kann, dürfte bei größeren Projekten viel Nacharbeit nötig sein. Dazu müsste man den alte Code schon verstehen. Früher gab's mal mit cfront ein Übersetzungstool, das dürfte an modernem Code aber wohl scheitern. Einen Monat ein KI-Tool zu testen, dürfte doch bezahlbar sein. Kollegen schwören auf Anthropic Claude als Ergänzung zu Copilot in VS Code.
„»Wir werden alle sterben« – Albert Einstein“
+4
gfhfkgfhfk29.01.2517:30
andreas_g
Zur Erklärung:
Der vorliegende Code enthält zahlreiche in C++ geschriebene Routinen, die voll funktionsfähig sind, hat aber größere strukturelle Probleme.
Das Problem am existierenden Code ist, dass er viel zu sehr C artig ist, und daher wild Zeiger herumreicht ohne dessen Ownership sauber zu handhaben, daher kommen die Probleme. C bietet Dir keinerlei Möglichkeit das besser umzusetzen, und wirst Du dann weiterhin rohe Zeiger herumreichen, ohne zu wissen was wirklich passiert.

Dann wird an einigen Stellen STL Code und eine Template Klasse (84k Sourcecode !!!) mit einer Baumstruktur genutzt. Das portierst Du nicht in absehbarer Zeit auf C.
+2
Schens
Schens29.01.2518:32
Lass das Ding durch ChatGPT laufen und schau, was passiert...

0
Schens
Schens29.01.2518:39
Interessant! Jetzt auch mit Debugging im ChatGPT.




#include "nfsd.h"
#include "NetInfoBindProg.h"
#include "UFS.h"
#include "configuration.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#define NAME_HOST_MAX 256

extern void add_rpc_program(void *pRPCProg, uint16_t port);

typedef struct {
    char *key;
    char *value;
} NIProps;

static char* ip_addr_str(uint32_t addr, size_t count) {
    static char buffer[16];
    switch(count) {
        case 3:
            snprintf(buffer, sizeof(buffer), "%u.%u.%u",
                     (addr >> 24) & 0xFF,
                     (addr >> 16) & 0xFF,
                     (addr >> 8) & 0xFF);
            break;
        case 4:
            snprintf(buffer, sizeof(buffer), "%u.%u.%u.%u",
                     (addr >> 24) & 0xFF,
                     (addr >> 16) & 0xFF,
                     (addr >> 8) & 0xFF,
                     addr & 0xFF);
            break;
    }
    return buffer;
}

void addHost(void *host, const char *name, const char *systemType) {
    add_rpc_program(host, 0);
    // Implement doRegister function accordingly
    // doRegister(host->mTag, host->getPortUDP(), host->getPortTCP());
    
    // Example of adding trusted networks
    // host->mRoot.add("trusted_networks", ip_addr_str(CTL_NET, 3));
    
    char master[256];
    snprintf(master, sizeof(master), "%s/local", name);
    
    // Additional configurations as in the C++ code
}

void configure(int ntp) {
    // Placeholder for configuration logic
    const char *domain = (NAME_DOMAIN[0] == '.') ? &NAME_DOMAIN[1] : &NAME_DOMAIN[0];
    
    // Example of setting up locations in the network
    // locations->add(NIProps("name","resolver")("nameserver",ip_addr_str(CTL_NET|CTL_DNS, 4))("domain",domain)("search",domain));
    
    if (ntp) {
        // Example of adding NTP configuration
        // locations->add(NIProps("name","ntp")("server",NAME_NFSD)("host",NAME_NFSD));
    }
}

void doRegister(const char* tag, uint32_t udpPort, uint32_t tcpPort) {
    // Placeholder implementation for registering
    printf("%s tcp:%d udp:%d\n", tag, tcpPort, udpPort);
}

int procedureREGISTER() {
    return -1; // PRC_NOTIMP equivalent
}

int procedureUNREGISTER() {
    return -1;
}

int procedureGETREGISTER() {
    // Placeholder for get register logic
    return 0; // PRC_OK equivalent
}

int procedureLISTREG() {
    return -1;
}

int procedureCREATEMASTER() {
    return -1;
}

int procedureCREATECLONE() {
    return -1;
}

int procedureDESTROYDOMAIN() {
    return -1;
}

int procedureBIND() {
    uint32_t clientAddr;
    char clientTag[NAME_HOST_MAX];
    char serverTag[NAME_HOST_MAX];
    
    // Placeholder for binding logic
    
    return 0;
}
0
andreas_g
andreas_g29.01.2519:14
Ich habe diese Seite ausprobiert:

Um isolierte Funktionen zu übersetzen, scheint es ganz gut zu funktionieren. Das große Ganze kann ich aber dort nicht zur Übersetzung einspeisen.
0
Schens
Schens30.01.2508:06
Nebula
Ist denn C++ überhaupt so einfach auf C rückportierbar? Arbeiten die Routinen mit Klassen, Objekten, Vererbungen?

ChatGPT listet nach der Konversion auf, was alles geändert wurde. "Die Bibliothek gibt es nicht, darum habe ich jene genommen...." usw.
0
Danger30.01.2509:50
Vielleicht bin ich ja naiv, aber wie soll denn das funktionieren? C ist eine prozedurale Programmiersprache und C++ eine objektorientierte.

So eine automatische Übersetzung klappt bestimmt bei einem Trivialprogramm wie "Hello World", aber nicht bei einem Projekt, das objektorientierte Prinzipien nutzt. Da müsste die KI Kenntnisse über die Architektur des Projekts haben, um das Ding dann in C neu zu schreiben. Ich will nicht sagen, dass es auf keinen Fall geht, aber das ist keine einfache Sache, die man so schnell nebenbei macht.
+2
Nebula
Nebula30.01.2510:34
KI kann übrigens auch gut beim Lernen von C++ helfen. Man füttert es mit Codeschnipseln und bittet um eine Erklärung. Vorher noch sagen, welchen Background man hat.
„»Wir werden alle sterben« – Albert Einstein“
+1
Schens
Schens30.01.2511:09
Danger
Vielleicht bin ich ja naiv, aber wie soll denn das funktionieren? C ist eine prozedurale Programmiersprache und C++ eine objektorientierte.

So eine automatische Übersetzung klappt bestimmt bei einem Trivialprogramm wie "Hello World", aber nicht bei einem Projekt, das objektorientierte Prinzipien nutzt. Da müsste die KI Kenntnisse über die Architektur des Projekts haben, um das Ding dann in C neu zu schreiben. Ich will nicht sagen, dass es auf keinen Fall geht, aber das ist keine einfache Sache, die man so schnell nebenbei macht.

Ich habe keine Dunst. Habe mit 2020 etwas Python zur Erstellung von Screenscrapern mit Selenium angeeignet. Dann habe ich alle Screenscraper in ein Programm genagelt und das funktionierte nicht. Januar 2023 kopierte ich dann das Programm in ChatGPT. ca. 600 Zeilen. Nach 90s wusste ich, was der Fehler war, der wurde dann automatisch korrigiert und das Ding lief.

In so fern: muss man halt probieren. Mehr als "geht ned" kann ja nicht passieren.
+1
Nebula
Nebula30.01.2511:17
Schens
Mehr als "geht ned" kann ja nicht passieren.
Kommt auf den Code an. Wenn er vertraulich ist oder vertrauliche Daten enthält, kann schon mehr passieren. Dürfte aber hier nicht relevant sein.
„»Wir werden alle sterben« – Albert Einstein“
0
LoCal
LoCal30.01.2511:41
andreas_g
Liebe Community,

ich bin auf der Suche nach einem Tool, mit dem ich in C++ geschriebenen Code nach C übersetzen kann.

Das Resultat muss stilistisch nicht perfekt sein. Ich bin durchaus bereit, das Ergebnis noch nachzuarbeiten. Allerdings sollte der resultierende Code für jemanden lesbar sein, der kein C++ beherrscht.

Es scheint diverse kostenpflichte KI-basierte Tools zu geben. Da mein Projekt aber ein nicht-kommerzielles Open-Source-Programm ist, würde ich nur ungern größere Geldsummen investieren.

Hat jemand einen guten Tipp?

Ich habe leider keinen Tipp, ausser dass ich KIs bei solch komplexen Dingen noch nichts zutraue*

Aber ich fände es generell gut, wenn Du in deinen Post etwas konkreter bist worum es sich gerade dreht.
Also ich nehme ja an, dass es sich um deine Arbeit an Previous dreht( da habe ich übrigens großen Respekt vor Dir und finde, dass Du das ruhig erwähnen solltest). Aber wenn Du da für bestimmte Frameworks ersetzen willst, dann wäre es hilfreich,diese zu nennen, denn vielleicht kennt hier jemand ja eine alternative, die nicht so bekannt ist, aber genau das tut was Du brauchst.
„Ich hab zwar keine Lösung, doch ich bewundere dein Problem“
0
ThorsProvoni
ThorsProvoni30.01.2511:51
Wenn es nur einzelne Routinen sind, die nichts aus der C++ Standardbibliothek und objektorientierte Features verwenden - kann man ja mal versuchen. Falls Du einen gut ausgestatteten Mac mit Apple Silicon hast, kannst Du Dir selber ein LLM installieren (mit Ollama) und als UI z.B. AnythingLLM.

Folgende Modelle sind zum coden gut geeignet:
  • qwen2.5-coder:32b
  • deepseek-coder-v2:latest
  • phi4:latest

Wenn es komplexer wird versuche ich es auch manchmal mit deepseek-r1:32b.
Du kannst mir auch 2-3 Routinen schicken, dann jage ich die mal durch die Modelle und Du kannst anhand des Ergebnis entscheiden, ob sich der (relativ geringe) Aufwand lohnt.

Ansonsten die bereits genannten (CodeConvert, Claude, ChatGPT).
0
Raziel130.01.2512:11
LoCal

Ich habe leider keinen Tipp, ausser dass ich KIs bei solch komplexen Dingen noch nichts zutraue*

Also dann hast du die letzten 2-3 Jahre verpasst. Solche Aufgaben sind eine geringe Herausforderung für reguläre LLMs wie GPT. Man muss nur sagen was man will. Und mit Models die Reasoning beherrschen wie O1 von OpenAI hast du auch menschliche Denkansätze mit Schritt für Schritt Überlegungen und gegenprüfung etc
+1

Kommentieren

Sie müssen sich einloggen, um sich an einer Diskussion beteiligen zu können.