Wrap riesige C ++ - Bibliotheken zu C für den Import in Swift / Go

8

Nehmen wir an, ich habe eine riesige Bibliothek in C ++ (mit vielen Abhängigkeiten, benötigt es etwa 3h für einen vollständigen Build unter GCC). Ich möchte auf dieser Bibliothek aufbauen, möchte aber nicht in C ++ sondern in einer produktiveren Sprache. Wie kann ich das externe lib-Paket tatsächlich überbrücken oder umhüllen, so dass ich es in einer anderen Sprache aufrufen und darüber programmieren kann?

Berücksichtigte Sprachen:

  • Schnell
  • Gehe

Was ich gefunden habe, ist, dass beide Sprachen automatisches Bridging oder Wrapping für C-Bibliotheken und -Code bereitstellen (ich weiß nicht, was der Unterschied zwischen Wrapping / Bridging ist). Also, wenn ich einen c-Code habe, kann ich ihn einfach in das selbe Swift- oder Go-Projekt werfen und kann ihn mit einem einfachen Import in meinem Projekt verwenden.

Dies funktioniert jedoch nicht in beiden Sprachen für C ++ - Code. Also habe ich gegoogelt, wie man C ++ - Bibliotheken in C-Code umwandelt oder Autowrappers generiert. Ich habe folgendes gefunden:

  1. swig.org - automatischer Wrapper für C ++ - Bibliotheken
  2. Comeau C ++ Compiler - überträgt C ++ automatisch in C-Code
  3. LLVM - sollte in der Lage sein, beliebige -Eingaben zu nehmen und sie in beliebige -Ausgabe umzuwandeln, zu der LLVM fähig ist.

Frage:

  1. Ist es sogar in den Bereichen nutzbar / realistisch / managbar zu bauen oben auf solch eine riesige Bibliothek in anderen Sprachen wie Swift / Go, wenn Auto-Wrapping oder automatische Überbrückung verwenden?
  2. Was von den 3 aufgeführten Bibliotheken / Programmen / Frameworks am besten für den Prozess von C ++ - & gt; C (weil Swift und Go beide C automatisch zur Verfügung stellen Verpackung).
  3. Gibt es bessere Alternativen als bisher?
  4. Wäre es besser, einfach "bei C ++ zu bleiben", da die Verwendung anderer Tools für den Wrapping- / Bridging-Prozess viel zu viel wäre arbeiten, um den Nutzen einer produktiveren Sprache auszugleichen wie Swift / Go?

Danke:)

Haftungsausschluss: Es gibt auch die Möglichkeit, eine C ++ - Bibliothek in C manuell zu verpacken, aber das würde für solch eine riesige Bibliothek unerträglich viel Arbeit erfordern.

    
Shiuyin 23.08.2016, 15:06
quelle

1 Antwort

1

Q1: Ist das realistisch?

Nicht realistisch, weil jede große komplizierte C ++ - Schnittstelle zu kompliziert wird. Automatische Tools sind wahrscheinlich fehlgeschlagen und manuelle Arbeit ist zu schwer.

Q2: Was ist das Beste?

Ich weiß nicht und gegeben A1 scheint es nicht zu interessieren.

Q3: Alternative? F4: Ist C ++ nur die beste Alternative?

Wenn Sie bestehenden C ++ - Code aus einer anderen Sprache unabhängig von der Sprache nutzen möchten, ist die beste Option in komplexen Szenarien die Verwendung eines hybriden Ansatzes.

Die meisten Sprachen bieten aufgrund von Nicht-Standard-C ++ - Namenskonventionen Interoperabilität mit C und nicht mit C ++. Mit anderen Worten, fast jede Sprache bietet Zugriff auf einfache C-Funktionen, aber C ++ wird häufig nicht unterstützt.

Da Ihre Bibliothek komplex ist, würde die beste Lösung auf dem "Fassaden" -Muster basieren. Erstellen Sie eine neue C-Bibliothek, und implementieren Sie anwendungsspezifische Logik, die C ++ - Bibliothek verwendet. Versuchen Sie, diese Bibliothek so dünn wie möglich zu gestalten. Das Ziel besteht nicht darin, alle Geschäftslogik zu schreiben, sondern C-Funktionen bereitzustellen, die C ++ - Objekte enthalten und C ++ - Funktionen aufrufen. Der GO-Level-Sprachcode würde dann diese Bibliothek aufrufen, um die C ++ - Bibliothek darunter zu verwenden. Dieser Ansatz unterscheidet sich von dem Q1-Ansatz. In Q1 versuchen Sie, einen Interop-Aufruf pro C ++ - Funktion oder Objektmethode auszuführen. In Facade versuchen Sie, C ++ - Anwendungsszenarien zu implementieren, die nur für Ihre Anwendung gelten.

Mit Facade reduzieren Sie den Umfang der Interop-Arbeit, weil Sie Ihre Anwendungsszenarien gezielt einsetzen. Gleichzeitig mindern Sie die Komplexität von C ++ auf GO-Sprache.

Sie müssen z. B. einen Temperatursensor mithilfe der C ++ - Bibliothek lesen.

In C ++ müssen Sie Folgendes tun:

  1. Datei öffnen
  2. Lesen Sie den Stream, bis Sie den SLIP-Terminator finden
  3. lies einen "Datensatz"
  4. Datei schließen

Mit Fassade erstellen Sie eine einzelne Funktion namens "readTemperature (deviceFileName)" und diese C-Funktion führt 4 Aufrufe gleichzeitig aus.

Das ist ein falsches Beispiel, nur um den Punkt zu zeigen.

Mit Fassade möchten Sie möglicherweise ursprüngliche C ++ - Objekte ausblenden und an dieser Stelle wird es eine kleine Schicht. Das Ziel ist es, fokussiert zu bleiben und Ihre Anwendungsanforderungen durch Generalisierung auszugleichen, um Ihre Anwendung zu unterstützen.

Interessanterweise ist der Facade-Ansatz eine Möglichkeit, die Interoperabilität zu verbessern. Interop in fast jeder Sprache ist teurer als der normale Betrieb, da die Laufzeitumgebung von langauage verwaltet und geschützt werden muss. Viele Interop-Aufrufe verlangsamen die Anwendung (wir sprechen hier von Millionen). Wenn beispielsweise 10 Interop-Aufrufe zu 1 kombiniert werden, wird die Leistung verbessert, da die Anzahl der itnerop-Vorgänge reduziert wird.

    
Sergei G 01.09.2017 17:37
quelle

Tags und Links