Im Anschluss an meine vorherige Frage zu den dauerhaften Eigenschaften eines Buches über Algorithmen, siehe hier , jetzt möchte ich die Community fragen, in welcher Sprache Sie Beispiele für ein solches Nachschlagewerk schreiben würden.
Ich werde wahrscheinlich nicht MMIX (!) verwenden, um die Beispiele des Buches zu schreiben, aber gleichzeitig denke ich, dass Pseudo-Code weniger interessant wäre als Beispiele in einer echten Sprache.
Dennoch möchte ich, dass das Buch auch eine Quelle für Forscher ist. Was könnte die Wahl der Gemeinschaft sein? Warum?
Antwort : Ich wusste, dass dies eine schwierige Frage war und dass es mehrere verschiedene Antworten geben würde. Beachten Sie, dass die Antworten den gesamten Bereich von Assembly / MMIX (!!) bis Python und Pseudocode abdecken. Die Stimmen und die Argumente zwingen mich, Uris vernünftige Antwort zu wählen, mit einem Vorbehalt: Mein Pseudo-Code wird so nah wie möglich an C sein (natürlich ohne plattformspezifische Probleme), und ich werde möglicherweise bessere Implementierungen diskutieren in Seitennoten (Wie wir alle wissen, ist der mathematische Beweis, dass der Algorithmus funktioniert, weit entfernt von den Problemen der Implementierung).
Das Buch befasst sich mit Algorithmen in einer bestimmten Domäne, nicht mit der Mathematik von Algorithmen im Allgemeinen (viel schlauere Leute haben viel bessere Algorithmen als ich). Eine Sache, die ich für ein solches Buch als wertvoll erachte, ist die Speicherung der Algorithmen, die ich definitiv online in eine begleitende Website stellen werde (vielleicht in ein paar Sprachen, wenn ich die Zeit finde).
Danke für alle Antworten. Manchmal habe ich das Gefühl, ich sollte jeden, der als Co-Autor antwortet, mit einbeziehen. :)
Ein gutes Buch über Algorithmen sollte in psueod-code a-la-CLR geschrieben werden ...
Meiner Erfahrung nach sehen die meisten Bücher, die sich auf sprachspezifische Beispiele beziehen, eher wie ein Lehrbuch aus, als wie eine ernsthafte Referenz oder Lernbücher. Darüber hinaus sind die meisten Sprachen ziemlich klobig, wenn es um Sammlungen geht (insbesondere C ++ und Java, sogar mit Generika). Zwischen all den Details ist zu viel verloren. Sie eliminieren auch sofort eine Menge Ihrer potenziellen Zielgruppe.
Der einzige Vorteil für sprachspezifische Bücher besteht darin, dass der Herausgeber, wenn Sie ein Lehrbuch schreiben, eine CD anhängen und 50 $ zum MSRP hinzufügen könnte.
Es ist einfacher für mich, einen Algorithmus aus (lesbarem) Pseudocode zu verstehen. Wenn ich nicht herausfinden kann, wie ich es mit meinen eigenen Sammlungen in meiner Sprache umsetzen kann, bin ich sowieso in Schwierigkeiten.
Sie könnten zu jedem Pseudocode einen Hinweis zu Implementierungsdetails für bestimmte Sprachen hinzufügen (z. B. verwenden Sie ein TreeSet in Java für die beste Leistung usw.)
Sie könnten auch eine separate Website für das Buch unterhalten (gute Idee), auf der Sie tatsächliche Implementierungen in verschiedenen Sprachen haben. Keine Notwendigkeit, Bäume mit langen Ausdrucken zu töten.
Benutze eine echte Programmiersprache - niemals eine Pseudo-Programmiersprache. Leser sind sehr misstrauisch von Pseudo-Code, Leser wie echte Programmiersprachen. Die Falle mit Pseudo-Sprachen besteht darin, dass Sie Code-Konzepte definieren können, die der Leser nicht in die Sprache seiner Wahl einfließen lassen kann
Eine echte Programmiersprache hat eine Reihe von Vorteilen:
1) Sie können Ihren Code testen und hoffen, dass Ihr Code korrekt ist!
2) Sie können diesen Code in ein veröffentlichtes Format exportieren, um ihn in Ihr Buch einzufügen. Stellen Sie sicher, dass jeder, der Ihrem Code folgt, sucht bei tatsächlich ausführbarem Code.
3) Sie müssten Ihren Pseudo-Code nicht verteidigen.
Die Wahl der Sprache ist offensichtlich subjektiv, aber ich denke, dass fast jede moderne Sprache könnte verwendet werden, aber ich würde eine empfehlen, die 'mindestens Overheads' in Bezug auf schnelles Verständnis hat. Und vorzugsweise eine, dass der Leser einen Compiler / Interpreter bekommen kann. Wenn Sie C verwenden möchten, sollten Sie vielleicht D ausprobieren. Ein verbessertes C.
Zum Beispiel ist Ruby von dieser Sorte, wenn Sie Ihren Code "einfach" halten, Java ist nicht (zu viele Support-Bibliotheken erforderlich), Zu einem früheren Zeitpunkt wäre Pascal ein Kandidat.
Übrigens: Ich benutze Ruby jetzt nicht, da ich Smalltalk & amp; REBOL, aber ich würde es nicht benutzen eine dieser Sprachen in einem Buch. Dein Buch würde direkt zum Restbunker gehen!
Es gibt einen enormen Vorteil in Knuths Darstellung der Algorithmen in einer Sprache auf Assemblerebene. Es zwingt den Leser, genau zu überlegen, was im Silizium passiert, wenn wir Algorithmen in einer höheren Sprache programmieren. Gerade für Systemprogrammierer kann diese Art des Verständnisses nicht anders vermittelt werden.
Knuths neues MMIX ist ideal: Betrachte es als Assembler-Pseudocode.
Mein ideales Lehrbuch würde Algorithmen haben, die in Pseudocode und MMIX geschrieben sind, so dass wir den Algorithmus sowohl in seiner hübschen als auch in seiner komplizierten Form sehen können. Pseudocode sollte den "echten Sprachen" vorgezogen werden, da er sinnlos umgeht "Du hättest diese Sprache nicht benutzen sollen". In diesem Stadium braucht Pseudocode keine Verteidigung - die besten existierenden Algorithmen-Lehrbücher benutzen entweder Pseudocode oder im Fall von Knuth eine Art Assembly-Pseudocode.
Die Wahl wird nicht allen gefallen können.
Robert Sedgewick hat seine " Algorithmen in ... "Bücher in mehreren Sprachen . Ich hatte die C-Version für einen Kurs und kaufte die C ++ - Version, als ich anfing, mit C ++ bei der Arbeit zu arbeiten.
Sie können Sprachfunktionen (sogar Pseudo-Sprachfunktionen) nicht umgehen.
Um möglichst vielen Menschen zu gefallen, können Sie zwei Sprachen wählen, eine funktional und eine nicht. Es könnte helfen, Motivationen bei der Algorithmuswahl zu veranschaulichen.
C-Stil wird oft verwendet, weil viele Sprachen einen sehr ähnlichen Stil verwenden, so dass die meisten Programmierer ihn ohne Erklärung verstehen. Außerdem können Beispiele auf jeder Maschine mit einem C-Compiler ausgeführt werden - das ist fast jede Maschine.
Allerdings erfordern Konzepte auf höherer Ebene oft die Verwendung neuester Technologien und Techniken - OO, funktionale Programmierung usw.
Diese werden oft in der Sprache ausgedrückt, die die erforderlichen Funktionen hat. Java, C #, Erlang, Ada, usw. - die meisten guten Programmierer werden verstehen, was mit nur einer kleinen Erklärung vor sich geht.
Aber C ist fast eine universelle Grundlage - Sie können wirklich nichts falsch machen, wenn Sie einen C-Stil für Beispiele übernehmen.
-Adam
Ich würde keine bestimmte Sprache verwenden. Verwenden Sie eine Pseudosprache, die für jeden, der etwas programmiert hat, klar ist. Normalerweise verwenden diese Bücher etwas, das dem C-Stil sehr ähnlich ist, aber das ist keine Regel. Ich weiß, dass Sie erwähnen, dass Sie keinen Pseudocode verwenden wollen, aber dadurch erreichen Sie ein breiteres Publikum.
Ich würde etwas verwenden, mit dem Sie genau die Idee hinter dem Algorithmus ausdrücken können.
Haskell ist ziemlich ordentlich, aber ich denke, dass mit Algorithmen, die mit dem Staat arbeiten, es dir in den Weg kommen kann und du mehr mit der Sprache beschäftigt bist als mit dem Algorithmus.
Ich würde C oder seine Nachkommen (C ++, C #, Java ...) nicht verwenden, weil sie Ihnen im Weg stehen, wenn Ihre Algorithmen mehr "funktional" sind. Auch hier wären Sie mehr mit der Sprache beschäftigt als mit dem Algorithmus. Ich würde mich sehr unwohl fühlen, wenn ich ohne Funktionen höherer Ordnung arbeiten müsste.
Im Grunde genommen würde ich also eine Multi-Paradigma-Sprache verwenden, mit der Sie vertraut sind und mit der Sie sich sicher fühlen, dass Sie die Algorithmen ausdrücken können, ohne in sprachspezifische Besonderheiten einzutauchen.
Meine persönliche Wahl wäre etwas wie Common Lisp, aber vielleicht ist auch Python oder Scala brauchbar.
Python ist überall eine gute Wahl. Es ist sehr gut lesbar, auch wenn Sie es vorher nicht programmiert haben. Plus, es ist viel weniger wortreich als einige andere gemeinsame Sprachoptionen.
Tags und Links algorithm programming-languages