Programmieren * in * eine Sprache vs. Schreiben von C-Code in Ruby

10

Code Complete besagt , dass Sie sollten aways Code in einer Sprache zu Code Gegensatz in ihm. Damit meinen sie

Beschränken Sie Ihr Programmierdenken nicht nur auf die Konzepte, die von Ihrer Sprache automatisch unterstützt werden. Die besten Programmierer überlegen, was sie tun möchten, und bewerten dann, wie sie ihre Ziele mit den ihnen zur Verfügung stehenden Programmierwerkzeugen erreichen können. (Kapitel 34.4)

Führt dies nicht dazu, dass in jeder Sprache ein Programmierstil verwendet wird, unabhängig von den besonderen Stärken und Schwächen der jeweiligen Sprache?

Oder um die Frage in ein besser zu beantwortendes Format zu bringen:

Würden Sie vorschlagen, dass man versuchen sollte, sein Problem so sauber wie möglich mit den Einzelheiten seiner Sprache zu kodieren, oder sollten Sie lieber die eleganteste Lösung insgesamt suchen, auch wenn dies bedeutet, dass Sie möglicherweise umständliche Konstrukte implementieren müssen, die nicht nativ existieren in der eigenen Sprache?

Bastibe
quelle
5
+1 gute Frage. Zu diesem Zeitpunkt kann ich in Perl in einem halben Dutzend verschiedener Sprachen schreiben.
Dan Ray
@ Dan Ray - komisch! Ich schreibe immer C in Perl.
James Anderson

Antworten:

7

Es gibt einen noch besseren Ansatz: Vergessen Sie überhaupt Ihre erbärmliche feste Programmiersprache. Codieren Sie Ihr Problem in einer Sprache, die Sie gerade erfunden haben und die sich aus den Begriffen der jeweiligen Problemdomäne ableitet, codieren Sie es so natürlich wie möglich und denken Sie erst dann daran, diese neue Programmiersprache zu implementieren oder Ihren Code auf die Grenzen der Sprache zu reduzieren vorhandene Sprache.

Dieser Ansatz wird als sprachorientierte Programmierung bezeichnet . Es gibt viele Techniken, um die domänenspezifischen Sprachen effizient zu implementieren , und dies ist ein besonders heißes Thema für die Ruby-Community.

SK-Logik
quelle
1
Die Haskell-Community umfasst auch domänenspezifische Sprachen, und die Programmiersprache Haskell eignet sich besonders für deren Implementierung.
tdammers
Wird die Implementierung eines maßgeschneiderten Skriptsystems, das auf einer eingebetteten Sprache wie Lua oder Tkl basiert, als Schreiben einer DSL angesehen? Wenn ja, wie gehen Sie mit den Mängeln von zB Lua um?
Bastibe
@Paperflyer, in einigen Fällen ist es sinnvoll, Sprachen zusätzlich zu Lua zu implementieren (insbesondere wenn es sich um Metalua handelt), aber es ist einfacher, einen geeigneten Compiler für die meisten typischen DSLs zu schreiben.
SK-Logik
@tdammers, ja, bei Haskell und Scala dreht sich alles um DSLs. Aber ich bin von der dunkleren Seite der Macht: Mein bevorzugter Ansatz ist die Metaprogrammierung. Ich glaube, dass Ad-hoc-Dolmetscher den Compilern fast immer unterlegen sind.
SK-Logik
2
@tdammers, ein DSL, das zusätzlich zu Funktionen höherer Ordnung implementiert ist, ist praktisch ein Ad-hoc-Interpreter. Sie können die Haskell-Syntax nicht so erweitern, wie Sie beispielsweise Lisp erweitern. Auch mit Vorlage Haskell. Es ist eine völlig andere (und ich würde sagen eine begrenzte) Art, DSLs zu implementieren. In vielen Fällen ist es in Ordnung, aber für alles, was wirklich komplex ist, führt es zu völlig unlesbaren Implementierungen, während eine mehrstufige Metaprogrammierung nur trivial ist, egal wie groß und fremd Ihr DSL ist.
SK-Logik
2

Ich glaube, die richtige Antwort und die im Buch vorgesehene lautet:

man sollte versuchen, sein Problem so sauber wie möglich mit den Einzelheiten seiner Sprache zu kodieren

Beim Programmieren in eine Sprache ging ich immer davon aus, dass Techniken außerhalb des normalen Sprachstils verwendet werden sollten, bei denen dies zu einem Vorteil führen würde . Dies ist ein wesentlicher Unterschied zum Schreiben in einem Stil in allen Sprachen.

Zum Beispiel hat das Erlernen von Haskell meine Fähigkeit, Funktionen höherer Ordnung zu verwenden, erheblich verbessert. Wenn ich jetzt in c # programmiere, verwende ich die verschiedenen IEnumerableMethoden, z. B. Selecthäufiger, da die Verwendung dieser Methoden zu saubererem Code führt als das Schreiben von for-Schleifen. Func<int, int>Aufgrund meiner Haskell-Erfahrung neige ich auch dazu, Pass-and-Funktionen (dh ) häufiger zu verwenden. Meine Verwendung der Vererbung ist aus diesem Grund zurückgegangen, und meistens ist das Ergebnis einfacherer Code.

Ich verwende jedoch keine Konzepte wie Monaden oder algebraische Datentypen in c #. Dies liegt daran, dass beide in c # nicht eindeutig darstellbar sind und im Austausch für viel Dunkelheit zu wenig Nutzen führen.

Also benutze ich die Werkzeuge der Sprache, um die Fähigkeiten, die ich habe, optimal zu nutzen. Ich glaube, das programmiert in die Sprache.

David Miani
quelle
0

Würden Sie vorschlagen, dass man versuchen sollte, sein Problem so sauber wie möglich mit den Einzelheiten seiner Sprache zu kodieren, oder sollten Sie lieber die eleganteste Lösung insgesamt suchen, auch wenn dies bedeutet, dass Sie möglicherweise umständliche Konstrukte implementieren müssen, die nicht nativ existieren in der eigenen Sprache?

Der Punkt ist , dass gute Programmierer haben nicht eine Sprache. Das Zitat aus dem Buch spricht von "Programmierwerkzeugen, die ihnen zur Verfügung stehen" - das heißt, wenn Sie Perl und Java kennen, sollten Sie vielleicht Perl für diese schnelle String-Manipulation verwenden. Programmiersprachen sind keine Boxen, die uns einschränken, sondern Werkzeuge, mit denen wir Probleme lösen. Dies ist (imo) das, worauf Code Complete abzielt. Codieren Sie nicht in einer Programmiersprache / Umgebung, sondern geben Sie die beste Lösung in die beste Programmiersprache / Umgebung für Sie, Ihr Problem und Ihre Lösung ein.

Telastyn
quelle