Welche Probleme können auftreten, wenn Konzepte aus anderen Sprachen emuliert werden?

12

Ich habe schon oft im Internet gelesen, dass Sie dies tun sollten, wenn Ihre Sprache bestimmte Konzepte wie Objektorientierung oder Funktionsaufrufe nicht unterstützt.

Das einzige Problem, das ich jetzt sehe, ist, dass andere Programmierer Ihren Code möglicherweise zu unterschiedlich finden als sonst, was das Programmieren für sie schwierig macht. Welche anderen Probleme könnten sich Ihrer Meinung nach daraus ergeben?

Julio Rodrigues
quelle
3
Die Leute werden sich zum einen über dich lustig machen :-)
Karl Bielefeldt
Ich habe einmal einen verschachtelten Funktionsparser von D in Java übersetzt, aber ich gebe zu, es ist nicht der sauberste Code, den ich je geschrieben habe (eine große Funktion mit einer Schnittstelle und mehreren Klassen, die sie implementieren)
Ratschenfreak

Antworten:

23

Eines der Probleme besteht darin, dass Sie möglicherweise viel Code schreiben, um etwas so auszudrücken, wie Sie es in einer anderen Sprache tun, während die Sprache, die Sie verwenden, einfacher ist.

Zum Beispiel, in einer Antwort auf Stack - Überlauf , habe ich erklärt , wie Code Verträge, Konzept in .NET Framework verwendet wird , können teilweise in PHP emuliert werden , die sie nicht unterstützt. Ich habe viel Code für nichts geschrieben, da das gleiche mit einfachen Arrays möglich war.

Im Allgemeinen hat jede Sprache ihre eigene Kultur, ihre eigenen Best Practices und ihren eigenen Stil.

  • Wenn ich anfange, C # -Code zu schreiben, als wäre es C, wäre es hässlich.

  • Wenn ich Haskell als Java-Entwickler verstehe, der gezwungen war, Haskell zu verwenden, aber seine Stärken nicht verstehen und nur die Konzepte von Java klonen möchte, leidet der Code, den ich schreiben würde.

  • etc.

Es ist nichts Falsches daran, die Sprache zu verbessern (zum Beispiel C # durch die Einführung von Maßeinheiten wie in F # zu verbessern ), aber wenn Sie zu viel tun, sollten Sie vielleicht eine andere Sprache wählen, die tatsächlich Ihren Bedürfnissen entspricht.

Arseni Mourzenko
quelle
+1 Gute Antwort, und danke für die zusätzlichen Suchbegriffe beim Hinzufügen von Maßeinheiten zu C # wie in F #.
2
Als jemand, der einmal seinen Job gekündigt hat, weil er gezwungen war, Java zu verwenden, meine zwei Cent: Man kann nicht gezwungen werden, Haskell zu verwenden, man verliebt sich in es und dann saugt es Sie an, bis es keine Rückkehr mehr gibt. Haskell ist wie ein hübsches schwarzes Loch, in das man nur hineinfallen möchte - und im Gegensatz zu einem echten leben Sie immer noch, um die Geschichte zu erzählen :)
Cetin Sert
Sie sollten vielleicht eine andere Sprache wählen, außer wenn Sie keine andere Wahl haben, wie beispielsweise clientseitiges JavaScript. (Trotzdem ist es keine Entschuldigung, keine andere Wahl zu haben, um eine klassenbasierte OOP-Emulation in einer Prototypsprache zu implementieren. Es ist weitaus effizienter, nur zu lernen, wie die Sprache funktioniert.)
kojiro
@kojiro: oder ein anderer Job. Ich selbst hatte das gleiche Problem, als ich gezwungen war, PHP zu verwenden, und ich versuchte ständig, die Sprache zu ändern, einschließlich des Schreibens meines eigenen Compilers. Eine weniger verrückte Lösung war, meinen Job zu wechseln und nur an Projekten zu arbeiten, die kein PHP verwenden.
Arseni Mourzenko
1
@Cetin Sert: Ich stimme zu, Haskell ist eine ausgezeichnete Sprache. Aber wenn jemand es nicht lernen möchte und die funktionale Programmierung nicht versteht, ist es schwierig, Haskell zu schätzen.
Arseni Mourzenko
10

Die Abnahme der Lesbarkeit ist an sich schon ein Problem: Sie verringert drastisch den Personenkreis, der Ihr Projekt möglicherweise ohne eine umfassende Schulung von Ihnen warten könnte.

Zusätzlich,

  • Die Implementierung des fremden Paradigmas kann mehr kosten als die potenziellen Einsparungen durch dessen Verwendung
  • Ihre Anpassung der Fremdfunktionalität ist möglicherweise fehlerhaft, was die Wartungskosten erhöht
  • Durch die Anpassung der Fremdfunktionalität kann Ihr Technologiestack an die Grenzen stoßen, die für Ihre native Implementierung erforderlich sind.
dasblinkenlight
quelle
2
Ich musste einmal C ++ Dynamic Dispatch (virtuelle Tabellen usw.) in Vanilla C emulieren und stieß auf genau dieses Problem: C-Programmierer, die Dynamic Dispatch nicht verstanden haben, konnten nicht zum Projekt beitragen oder es warten.
Kommensturm
4

Es ist keine so gute Idee, wie sie auf dem Papier erscheint.

Beispiel 1: Wenn Sie alt genug sind, können Sie sich an die Tage erinnern, als C das neue Kind in der Stadt war. Pascal- und Ada-Programmierer mochten Cs enge Klammern zum Öffnen und Schließen nicht. Sie definieren beginund endöffnen Klammer und schließen Klammer, und voila! CAda! Das unglückliche Ergebnis war aus der Sicht von Ada oder C hässlich.

Beispiel 2, persönlich: Eines der Dinge, die ich am Common Lisp Object System wirklich mochte, ist, dass es vor, nach und um Methoden geht. Sie können also an mehreren Stellen sehr nützlich sein. Deshalb habe ich dieses Konzept in C ++ an einigen ausgewählten Stellen emuliert. Die einzige Möglichkeit, diese Konstrukte in C ++ zu emulieren, besteht darin, dass der Entwickler einer abgeleiteten Klasse die gleichnamige Methode der übergeordneten Klasse an der richtigen Stelle im Code aufruft. Dies stellte eine Anforderung an Entwickler, die aus meinen Klassen stammten, die der C ++ - Programmierung ein wenig fremd waren, und möglicherweise gegen den Strich der C ++ - Programmierung. Unabhängig davon, wie gut diese Anforderung dokumentiert war, haben die Benutzer die Richtlinien einfach nicht befolgt, da sie nicht ganz dem C ++ - Paradigma entsprachen.

David Hammen
quelle
2

Welche Probleme können auftreten, wenn Konzepte aus anderen Sprachen emuliert werden?

Undichte Abstraktionen.

Jim G.
quelle
Es kann hilfreich sein, weitere Details in Ihre Antwort aufzunehmen. Der Artikel bezieht sich auf einen Fall, in dem eine Abstraktion keine signifikante Leistungsoptimierung erfasst. Größere Probleme ergeben sich jedoch aus inkonsistentem Eckfallverhalten und inkonsistenten Garantien. Ein Beispiel für letzteres wäre der Versuch von C #, outParameter in einem Framework zu emulieren , das sie nicht wirklich unterstützt. C # geht davon aus, dass jede Funktion immer in alle outParameter schreibt , aber Nicht-C # -Methoden, die von C # -Methoden aufgerufen werden, bieten keine solche Garantie.
Supercat
1

Es kann unerschwinglich schwierig sein. Stellen Sie sich vor, Sie möchten LINQ von C # in Ihre Java-Anwendung implementieren. Oder wie wäre es einfach, einer Sprache lexikalische Closures hinzuzufügen? Sie müssten so ziemlich einen neuen Compiler schreiben, der Ihnen so ziemlich eine neue Sprache gibt.

In Fällen, in denen Sie keine eigene Sprache implementieren müssen, können Sie sich auch vorstellen, Sammlungsmethoden mit Funktionen höherer Ordnung (z. B. map) in einer Sprache zu implementieren, die keine Codeblöcke oder Lambda-Funktionen oder Abschlüsse oder Funktionen als Erstes enthält Klassenobjekte. Jede Funktion höherer Ordnung muss als Schnittstelle deklariert und explizit implementiert werden, und jeder Zustand, der in einem Closure erfasst worden wäre, muss explizit in der implementierenden Klasse gespeichert werden. Es ist so viel mehr Tippen und so viel schwerer zu lesen, dass es sich oft nicht lohnt.

bA
quelle