Warum schreiben Leute einige Bibliotheken in viele Programmiersprachen um?


13

Es gibt einige Bibliotheken, die in ihren Versionen in vielen verschiedenen Programmiersprachen verfügbar sind, wie zum Beispiel Lucene , das in Java geschrieben ist (sozusagen 100% reines Java), aber auch seine Versionen in C ++, C, Perl hat , Ruby, Lisp und einige andere Sprachen. Und ich spreche von Implementierungen in diesen Sprachen, nicht nur von FFI- Schnittstellen.

Warum machen die Leute das? Ich kann einen offensichtlichen Grund erkennen: Bereitstellung und Verteilung (und wahrscheinlich auch Entwicklung) sind einfacher, wenn ein Projekt weniger Abhängigkeiten aufweist. Aber gibt es noch etwas? In welchen Situationen lohnt es sich?


4
Es kann sehr teuer sein, über die natürlichen Grenzen Ihrer Ausführungsumgebung hinweg zu kommunizieren.

1
@Thor: Einige Sprachen / Umgebungen fördern jedoch positiv das Überschreiten natürlicher Grenzen (C ist ein weit verbreitetes Beispiel dafür und ein starkes Thema unter Tcl-Programmierern). Ich vermute, es bezieht sich hauptsächlich auf die Speicherverwaltung (und gelegentlich auf die Verwaltung anderer Ressourcen). Es ist wirklich nicht gut, zwei Speichermanager im selben Prozess zu haben, besonders wenn sie nicht für die Koexistenz konzipiert wurden. Am Ende kommt es wohl darauf an, welche Annahmen Sie machen und welche Operationen sie wiederum unzulässig machen ...
Donal Fellows

Antworten:


16

Einige Gründe, warum ich es getan habe (in meinem Fall C-Code in Haskell umschreiben):

  • Einfachere Bereitstellung: Nur eine Build-Kette
  • weniger Abhängigkeiten (um mehr Akzeptanz zu erlangen)
  • portabler (z. B. auf Windows), wenn der Code in einer höheren Sprache vorliegt
  • Unterstützung für Parallelität hinzufügen, die in niedriger Stufe C nicht einfach zu bewerkstelligen ist
  • um den Code mit seinen Ressourcen ein bisschen sicherer zu machen
  • um den Code vertrauenswürdiger zu machen
  • idiomatischer (starke Typen, einfachere API, mehr Wiederverwendung)

19

Das Neuimplementieren einer Bibliothek, die auf einer bestimmten Plattform "nativ" ist, ermöglicht in der Regel Folgendes:

  • Einfachere Bereitstellung und Verteilung
  • Einfacheres Debuggen
  • Weitere idiomatische APIs, die für Ihre genaue Plattform geeignet sind
  • Oft bessere Leistung (Plattform-Interop kann schmerzhaft sein)
  • Beheben von Designproblemen, die aus Kompatibilitätsgründen noch im Original vorhanden sind

Zum Beispiel habe ich das Noda Time- Projekt als Hafen von Joda Time gestartet . Es ist einfach nicht praktisch, Joda Time direkt aus .NET heraus zu verwenden. Sie möchten wirklich keine JVM starten, um Datums- und Zeitberechnungen durchzuführen und herauszufinden, wie die Interop-Vorgänge zwischen den beiden ausgeführt werden die Zwei. Ein automatisierter Port (a la J #) wäre vielleicht machbar gewesen, aber das Endergebnis wäre keine angenehme und idiomatische API gewesen, die von C # aus verwendet werden könnte.


11

Einige Leute tun es, um eine neue Sprache zu lernen. Sie wählen eine Bibliothek aus, mit der sie in einer früheren Sprache vertraut waren, stellen fest, dass sie in der neuen Sprache benötigt wird, und beginnen, sie zu portieren.

Etwas Vertrautes zu portieren ist die beste Möglichkeit, sich nur auf die Sprachteile einer neuen Sprache zu konzentrieren und sich nicht wirklich um die Problemdomäne zu kümmern.

Es hat auch den zusätzlichen Vorteil, dass Code nicht weggeworfen werden muss, wie es bei so vielen Beispielprojekten in einem Buch oder Tutorial der Fall wäre. Es kann tatsächlich etwas sein, das die Community nutzen, ergänzen, überarbeiten, diskutieren usw. kann.


0

Manchmal entwickeln Sie für eine Plattform, auf der das Tool, in dem die Software geschrieben wurde (Java bei Lucene), keine Option ist. Wenn Sie die Funktionen nutzen möchten, ohne den Code von Grund auf neu entwickeln zu müssen, portieren Sie den Code.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.