2008-09-26 12 views
10

Ich überlege mir, eine Anwendung zu erstellen, die eine Mischung aus einer dynamischen Sprache (Python oder Ruby) und einer kompilierten Sprache ist und etwas Hilfe braucht, um mich davon zu überzeugen, dass dies eine gute Idee ist.Polyglot-Programmierung: Ist die Erstellung von Anwendungen mit mehreren Sprachen eine gute Übung?

Mein Gedanke ist, dass ich eine dynamische Sprache verwenden kann, um viel Code schnell zu schreiben und dann auf eine kompilierte Sprache wie c/C++ zu reduzieren, um leistungskritischen Code zu implementieren.

kann ich eine Menge Vorteile dieses Ansatzes sehen:

  1. Erhöhte Produktivität durch die Anlage vorwiegend Codierung in der dynamischen Sprache
  2. Verfügbarkeit von Bibliotheken aus beiden Sprachen

Aber es gibt auch einige Nachteile:

  1. Aufrechterhaltung einer Brücke zwischen den beiden Sprachen
  2. Abhängigkeit von zwei Sprachen und Sprache/Bibliothek Bugs statt einer

Was die anderen Vor/Nachteile dieses Ansatzes sind? Kennt jemand irgendwelche Ressourcen und/oder Best Practices in diesem Bereich?

Antwort

12

Ich denke, Ihre Vorgehensweise ist sehr vernünftig. Der Weg, die Nachteile zu beheben, besteht darin, im Voraus herauszufinden, wie einfach es ist, die dynamische Sprache mit C oder C++ zu verbinden, bevor Sie entscheiden, ob Sie sie für Ihr Projekt verwenden wollen oder nicht.

Außerdem müssen Sie darüber nachdenken, ob Ihre Anwendung plattformübergreifend sein soll oder nicht. Eine dynamische Sprache ist wahrscheinlich weniger plattformabhängig als eine kompilierte Sprache. Das kann ein Faktor bei der Entscheidung sein, welche Teile der App in C oder C++ ausgeführt werden sollten.

3

Ja. Viele Programme sind eine Mischung aus einer Hochsprache wie Python oder Ruby und einer Low-Level-Sprache wie C. Sie erhalten die Vorteile der Codelogik in einer Garbage-Collection-OO-Sprache und können Register in engen inneren Schleifen immer noch manuell verwalten .

1

Ich denke, das ist eine gute Idee.

Da die meisten (fast alle?) Betriebssysteme in C oder C++ geschrieben sind, ist jede dynamische oder interpretierte Sprache auf einer bestimmten Ebene auf eine kompilierte, optimierte Sprache für Low-Level-Zeug zurückgefallen.

5

Ja, bien sur, mein freund. Es ist in der Tat un'idea meravigliosa. Boa sortiere.

Ich scherze natürlich. Ein Webentwickler macht das jeden Tag, ohne es überhaupt zu bemerken: Java, JSP, EL/OGNL, HTML, CSS, Javascript, Ameise, XML, XSLT ...

Ich denke, polyglotte Programmierung ist natürlich, leistungsfähig, leistungsfähig und mehr als sonst cool. Es muss natürlich richtig angewendet werden, um die maximale Kraft jeder Sprache zu nutzen und die anderen Leute in Ihrem Team nicht zu verwirren.

+0

Genau - die meisten Dinge, die ich schreibe, sind in PHP, XML, XSLT, CSS, HTML und JS. Web-Entwicklung verwendet das beste Werkzeug für den Job an mehreren Orten die ganze Zeit. –

+0

XSLT? Es ist wie Griechisch für mich. Sie haben jedoch SQL auf dieser Liste vergessen. –

+0

@ Christopher Mahan: Ja! Genau, wie gesagt, "ohne es überhaupt zu merken" :) –

2

Möglicherweise stellen Sie fest, dass Sie bis zu einem späteren Zeitpunkt keine leistungskritischen Komponenten implementieren müssen. Also würde ich hart gegen den Eintritt einer dieser leistungskritischen großen Änderungen kämpfen, bis Sie wirklich sicher sind, dass Sie es tun müssen.

Ansonsten wählen Sie einfach eine Stammsprache, Perl und Ruby verwenden c, so dass ihre Einbindung ist ziemlich einfach. Sie könnten auch python (jython) oder ruby ​​(jrunby) auf einer Java VM ausführen, wodurch Sie Java als Backend erhalten würden. Obwohl es einige andere Probleme geben könnte, da ich nicht vertraut bin mit der Entwicklung gegen diese Versionen der jeweiligen Sprachen.

Bei allen Leistungsproblemen müssen Sie jedoch auf eine Low-Level-Sprache zurückgreifen. Versuchen Sie also, sie zuerst in einer Sprache zu lösen, bevor Sie schnell zu einer anderen springen.

Viel Glück,

2

Ich bin für das beste Werkzeug für den Job. Im Falle der Softwareentwicklung bedeutet das, polyglott zu sein. Man würde niemals erwarten, dass ein Zimmermann nur einen Hammer benutzt, egal, was er gebaut hat. Warum sollte es für uns anders sein?

0

Es ist ziemlich häufig, aber stellen Sie sicher, dass Sie wissen, warum Sie es so gestalten, wie Sie es tun.

Ein Beispiel ist in der Spiele-Programmierung. In vielen Spielen wird die performance-kritische Spiel-Engine in C geschrieben, während Dinge wie Level-Scripting in Python, Scheme, einer selbstgewählten Sprache oder was auch immer gemacht werden.

Dies bedeutet, dass die Performance-Geeks in einer Sprache arbeiten, die sie mögen und die ihnen die erforderliche Low-Level-Kontrolle gibt, während die Level-Designer in einer höheren Sprache arbeiten können, in der sie sich nicht um Speicherverwaltung kümmern müssen so weiter.

2

@Zorkerman

Ich habe Erfahrung mit sowohl Jython und JRuby ... viel mehr mit JRuby.

Ich muss sagen, sie sind großartige Plattformen, und Sie erhalten den großen Vorteil dynamischer Sprachen, PLUS die reiche 3rd und 1st Party Library Unterstützung von Java, PLUS eine hoch plattformunabhängige Basis kompilierte Sprache, PLUS Speicherbereinigung in beiden Sprachen (Es ist wichtig, das Speichermanagement zu verstehen, aber ich bin der Meinung, dass es besser ist, es zu vermeiden, es sei denn, du brauchst es wirklich, zum Beispiel wenn du Treiber oder Kernel-Level-Sachen machst oder Sachen, die jede Menge Leistung erfordern).

Ich möchte nur eine kurze Anekdote geben. Ich habe kürzlich ein Ruby-Skript erstellt, um eine Solr-Instanz zu indizieren, und ich musste auf eine DB2-Datenbank zugreifen (die Quelle unserer zu indizierenden Daten). Straight Ruby ist kläglich gescheitert ... es hat eine schreckliche DB2-Unterstützung, die eine vollständige Installation von DB2 Express Edition erfordert ... die immer noch nicht wie angekündigt funktionierte (Ich konnte die Ruby-Treiber nicht kompilieren, nachdem ich die Installation beendet hatte). Die Lösung bestand darin, einfach zu JRuby zu wechseln und JDBC auf der Ruby-Seite zu verwenden, wobei einige einfach zu installierende JAR-Dateien verwendet wurden (und viel viel kleinere Dateien als die DB2-Installation).

Ich würde JRuby oder Jython definitiv empfehlen, anstatt C als Back-End zu verwenden ... Ich habe festgestellt, dass Algorithmus und Ressourcenleistung normalerweise einen viel größeren Einfluss auf die Anwendungsleistung haben als die gewählte Sprache die Java-Plattform hat so viel zu bieten (und es hat einen langen Weg seit den frühen Tagen zurückgelegt, als die Leute es als viel langsamer als C/C++ entschlüsselten). Sofern Sie nicht sehr rechenintensive Dinge tun, die nicht algorithmisch refaktoriert werden können, müssen Sie höchstwahrscheinlich nicht auf die kompilierte Sprache zurückgreifen, unabhängig von Ihrer Wahl.


PS Durch die Integration mit Java in JRuby ist sehr nahtlos (von der JRuby auf Java Seite sowieso), so eine Brücke Aufrechterhaltung kein Thema ist. Jython denke ich ist das gleiche, aber wieder ist meine Erfahrung damit viel weniger.

6

Ich lese gerade Ihre Frage - Ihren Vorschlag, C für leistungskritischen Code zu verwenden. Jede dynamische Sprache, die es wert ist, verfügt über Werkzeuge, mit denen Sie effizient auf nativen Code zugreifen können. Beginne damit, das Ganze in der dynamischen Sprache zu schreiben. Vielleicht finden Sie, dass Sie C nicht brauchen.

Aber wenn Sie das tun, brechen Sie einen Profiler, sorgfältig wählen Sie etwas zu optimieren, und gehen Sie dafür.

2

Es ist erwähnenswert, dass Gambit Scheme und Chicken (und ein paar andere Implementierungen für diese Angelegenheit) in einem interpretierten Modus ausgeführt werden, und kann dann

1

Einige Leute C. unten kompiliert werden argumentieren, dass wir Programmierer beherrschen müssen viele Sprachen. Sie argumentieren, dass das Hinzufügen einer Sprache A Bad Thing ist.

Der gesamte Datenzugriff in SQL, Präsentation in HTML/CSS scheint irreversibel zu sein.

Das XML-Ding ist ein wenig ermüdend: Einige Leute versuchen, alles in XML zu tun, als ob XML magische Kräfte hat, um Software besser zu machen.

Auch gibt es eine Menge Redundanz wegen der verschiedenen Sprachen. Alle sprachübergreifenden Bindungen bedeuten, dass die Dinge zweimal geschrieben werden, einmal in jeder Sprache.

Verwandte Themen