In Colleges und in Algorithmuslehrbüchern ist es durchaus üblich, dass Lehrer und Autor den Kontrollfluss im Pseudocode erklären. Ist es angesichts des Aufkommens ausdrucksstärkerer Sprachen wie Python und Haskell vernünftig, dass Hochschulen wechseln, um Algorithmen über eine dieser Sprachen zu erklären?
Der einzige Vorteil von Pseudocode, den ich mir vorstellen kann, ist, dass er angeblich sprachunabhängig ist. Aber es ist nicht. Einige Pseudocodes verwenden einen imperativen Ansatz, andere Pseudocodes sehen funktional aus. Autoren leihen sich die Semantik einfach aus der Programmiersprache aus, die sie gerne verwenden, oder beschreiben die Semantik nur in natürlicher Sprache. Wenn Pseudocode also nicht wirklich sprachunabhängig ist, was ist dann der Vorteil, ihn zu verwenden? Wäre es nicht besser, nur eine vorhandene Sprache zu verwenden?
quelle
Antworten:
Nein. Der Punkt des Pseudocodes ist, dass er nicht kompiliert werden muss. Ich kann irrelevante Details schnell beschönigen. Im Gegensatz dazu können selbst Sprachen, die auf den ersten Blick wie Pseudocode aussehen, sehr nicht intuitive Details enthalten, die den Algorithmus nur beeinträchtigen würden. Nehmen wir zum Beispiel Quicksort in Haskell:
oder dasselbe in Python:
Der Vorteil in beiden Fällen ist, dass dies ausführbarer Code ist und als solcher von Schülern getestet, typgeprüft und gespielt werden kann. Beide enthalten jedoch syntaktische Details, die ablenken. Die Schüler werden normalerweise besser von einem Pseudocode bedient, der die Absicht des Algorithmus veranschaulicht, nicht von Implementierungsdetails:
Bemerkenswerte Unterschiede:
Ich kann mir einfach eine Listenverständnis-Syntax ausdenken, die wie Mathematik aussieht, anstatt erklären zu müssen, warum Python ein
for
undif
hier hat.Ich muss die Syntax dieser Sprache für die Listenverkettung nicht erklären. Warum verwendet Python
+
Addition? Was ist:
in Haskell? Ich kann einfach eine Syntax wählen, die den Punkt klarer vermittelt.Die Typensignatur
Ord a => [a] -> [a]
ist nur ein Implementierungsdetail. Obwohl dies in diesem Fall möglicherweise hilfreich ist, können die von Haskell manchmal benötigten Typensignaturen absurd werden.Ich muss nicht erklären, warum Python leere Sammlungen für falsch hält und was
array[1:]
das bedeuten soll.Ich vermeide kluge Schüler, die darauf hinweisen, dass ich
yield
das Python-Beispiel wirklich verwenden sollte .Haskell ist scheiße, wenn es darum geht, veränderbare Datenstrukturen wie Hash-Tabellen, RB-Bäume usw. zu erklären.
Die Dinge werden sehr sprachspezifisch, sobald wir komplexe Datensätze benötigen, um unsere Algorithmen auszudrücken. Zum Beispiel hat Pythons Objektsystem einige Überraschungen, die nur ablenken.
Trotzdem kann es sehr wertvoll sein, zusätzlich zum Pseudocode eine dieser Sprachen zu verwenden. Beschriften Sie einfach sorgfältig, was was ist.
quelle
I don't have to explain ... what array[1:] is supposed to mean.
, aber dann mussten Sie wirklicharray[1, ...] -- the rest of the array without the pivot
in den Kommentaren erklären, weil niemand hätte herausfinden können, wasarray[1, ...]
bedeutet (ist Ihr Pseudocode-Array 0- oder 1-basiert, was zum Teufel diese Auslassungspunkte bedeuten usw.). Ich denke, das spricht wirklich dafür, echte Sprache als Grundlage für Pseudocode zu verwenden, da Sie einfach auf die Dokumentation / das Tutorial einer realen Sprache verweisen können, anstatt Ihre Pseudocode-Syntax lernen zu müssen.Nein.
Der gesamte Zweck von Pseudocode besteht darin, die Details und Komplexitäten einzelner Sprachen zu abstrahieren, sodass Sie sich auf das konzentrieren, was das Programm tun soll, und nicht darauf, wie es es tut. Mit Pseudocode können Sie beliebige Regeln erstellen, die nicht den tatsächlichen Implementierungsanforderungen entsprechen müssen, wie dies in realen Sprachen der Fall ist, sondern nur den Anforderungen des aktuellen Themas.
Wenn die Logik so dargestellt wird, dass Sie (als Schüler) sie nicht einfach kopieren / in eine Datei einfügen, kompilieren und fertig stellen können, müssen Sie die Lösung selbst dann implementieren, wenn die Lösung selbst beschrieben wird für dich. Dies regt zum individuellen Nachdenken über das Kopieren / Einfügen von Betrug an.
quelle
Was ist real?
Weil Real nur für einen Dolmetscher definiert ist .
Ist Mandarin mehr oder weniger real als Englisch?
Real ist also nicht einmal die Frage. Lasst es uns umformulieren:
Warum wird Pseudocode anstelle einer formalen Sprache verwendet?
Ein einfaches VENN-Diagramm kann das Problem leicht hervorheben. Die Menge aller Menschen, die Englisch und Mandarin sprechen, ist die Teilmenge der Englisch oder Mandarin. Da es schwierig ist, Kenntnisse in einer beliebigen Sprache zu erlangen, ist die Schnittmenge im Allgemeinen viel kleiner als die Gewerkschaft.
Das Lehrbuch über Programmierung kann davon ausgehen, dass Sie mindestens eine natürliche Sprache verstehen, die Sprache, in der das Lehrbuch geschrieben ist. Es ist im Allgemeinen sicher, dies anzunehmen, da sonst ein anderes besser lesbares Lehrbuch ausgewählt worden wäre. Schließlich ist es schwierig genug, eine Sprache zu lernen - zwei sind schwieriger.
Dies gibt den ersten Grund für die Verwendung eines Pseudocodes an. Es maximiert das Publikum, das das Buch leicht lesen kann. Dies geschieht durch Befolgung etablierter Sprachkonventionen, die bereits in der natürlichen Sprache zu finden sind. Sagen Sie Rezepte aus dem Kochen, mathematischen Formeln usw. Jede Lücke kann durch eine schnelle Erklärung der natürlichen Sprache oder durch einen endgültigen Rückgriff auf unser visuelles System mit Bildern geschlossen werden.
Warum konnte die gemeinsame Sprache nicht die Programmiersprache sein? Ich überlasse es Ihnen zu überlegen, wie viel Mandarin (oder eine Sprache, die Sie noch nicht sprechen) Sie gelernt haben, indem Sie ein Buch über Programmierung gelesen haben, das anhand von Beispielen in einer vertrauten Programmiersprache geschrieben wurde.
Was ein Lehrbuch erreicht
Überlegen Sie als zweiten Grund, was ein Lehrbuch leisten muss:
Warum programmieren
Der größte Teil des Buches muss Sie davon überzeugen, warum Sie diese fremde Sprache oder eine ähnliche Sprache lernen und verwenden möchten. Dies bedeutet, das Wesentliche der Programmierung selbst zu diskutieren.
Das meiste davon hat nichts mit den Maschinen selbst zu tun, es ist hauptsächlich eine Diskussion darüber, wie Fleischwaren funktionieren sollten, um ein Programm zu erstellen. Das ist ziemlich komplex, weil es zeigen muss, warum wir unsere menschlichen Weltraumziele verknüpfen, Weltraumprobleme programmieren und danach streben, sie zu lösen.
Programm beschreiben
Die zweite Lehrbuchleistung beschreibt eine Sprache. Jetzt können die meisten Programmiersprachen mit einer Grammatik und einigen semantischen Regeln beschrieben werden. Am flachen Ende befinden sich Sprachen wie JSON, die innerhalb von drei oder mehr Seiten ziemlich vollständig definiert werden können. Komplexere Sprachen benötigen eine größere Spezifikation, benötigen jedoch größtenteils kein umfassendes Verständnis, um nützlich zu sein. Was diese Beschreibungen sind, sind jedoch Pseudocode. Sie spezifizieren die formale Sprache in Form einer natürlichen Sprache. Der Unterschied besteht darin, dass diese Pseudocodes im Voraus festgelegt werden.
Angesichts der Tatsache, dass selbst formale Sprachen selbst (ausführbare) Pseudocodes sind, stellt sich die Frage, was bei der Beschreibung eines Algorithmus am wichtigsten ist. Der nächstgrößere Kontext.
Zu keinem Zeitpunkt ist die Sprache, in der der Algorithmus geschrieben ist, wichtig. Wenn überhaupt, sind nur wenige Schlüsseloperationen entscheidend für den Erfolg der Algorithmen. Die Frage lautet dann:
Angesichts der Tatsache, dass das Erlernen einer Sprache schwierig ist und der Leser eine Sprache gelernt haben muss, um den Algorithmus zu verstehen, was sollten Sie als Verfasser eines Lehrbuchs vom Leser verlangen?
quelle
Ich würde hier gegen den Strich gehen und argumentieren, dass Bücher und Tutorials Pseudocode verwenden sollten, der auf echten Hochsprachen basiert, anstatt eine völlig neue Pseudocode-Syntax zu erfinden.
Ich möchte jedoch auch Autoren und Leser warnen, dass dies in diesem Zusammenhang eine Pseudoversion der realen Sprache sein sollte und dass die Autoren darauf achten sollten, die Syntax und die Einschränkungen der Sprache nicht zu streng zu befolgen. Stattdessen sollten Autoren sorgfältig darüber nachdenken, was sie versuchen, mit dem Snippet zu kommunizieren, und irrelevante Details hinter Funktionsaufrufen und / oder Kommentaren verbergen, anstatt nach einer vollständigen, tatsächlich kompilierbaren Implementierung oder Code zu streben, der für die ausgewählte Basissprache idiomatisch ist .
Autoren sollten sich etwas kreative Freiheit in Bezug auf die Sprache nehmen, um ihren Standpunkt zu verdeutlichen, damit selbst jemand, der nur die Grundlagen der Sprache kennt, den Kern des Snippets noch verstehen kann, während diejenigen, die eine genauere Semantik suchen, auf die Dokumentation der Sprache verweisen oder auf diese zurückgreifen können ihre Vorkenntnisse über die Sprache, um die Details zu ergänzen.
quelle