Warum verwenden Lehrbücher eher Pseudocode als echte Sprachen?

8

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?

Sternchen
quelle
5
"Ich hätte die Sprache einer bestimmten Maschine X wählen können, aber dann würden diejenigen Leute, die keine Maschine X besitzen, denken, dass dieses Buch nur für X-Leute ist. Außerdem hat Maschine X wahrscheinlich viele Eigenheiten, die für die völlig irrelevant sind Material in diesem Buch, das noch erklärt werden muss; und in zwei Jahren wird der Hersteller von Maschine X Maschine X + 1 oder Maschine 10X herausbringen, und Maschine X wird für niemanden mehr von Interesse sein. " (Donald Knuth, TAOCP)
Kilian Foth
@ KilianFoth Schön. Ich glaube, Knuth sagte auch, er habe eine Zukunft vorausgesehen, in der Programme auf Englisch geschrieben und durch Leerzeichen getrennt werden würden (obwohl ich die Quelle nicht finden kann), was fast so ist, als würde man sagen, dass der Pseudocode ausführbar wäre :) Obwohl die Eigenheiten wirklich ablenken, Eine formale Teilmenge von Merkmalen wäre akzeptabel.
Sternchen
1
@Asterisk Sie denken an literarische Programmierung . Ich würde sicherstellen, dass man auch EWD667 liest : Über die Dummheit der "Programmierung in natürlicher Sprache". von Dijkstra. Ich möchte auch auf die Schwierigkeit hinweisen, dass die Leute hier Fragen formulieren, die konsistenten englischen Regeln für Zeichensetzung, Großschreibung und Rechtschreibung folgen. Ich schaudere bei dem Gedanken, dass diese Leute beim Schreiben von Prosa-Programmierung Code nach ähnlichen Stilen schreiben.
1
"Advent"? Beide Sprachen sind über 20 Jahre alt. Und Haskell ging zumindest Miranda voraus, die eine fast identische Syntax hatte, und ich glaube, sie ist jetzt 30 Jahre alt.
Jules
@Jules Nun, ich habe diese benannt, weil sie die sauberste und prägnanteste Syntax haben, die für Pseudocode geeignet erscheint. Beide haben in den letzten 10 Jahren (oder mehr wie in den letzten 5 Jahren) eine größere Zugkraft erlangt. Python knackt die Top 10 in PyPl und Haskell unter 50. Es gibt andere Sprachen, die wachsen (aus welchen Gründen auch immer), aber sie haben eine schwerere Syntax und merkwürdige Funktionen. Die Industrie besteht immer noch zu 50% aus C ++ und Java, und dann gibt es JavaScript (das wie eine umgekehrte Sprache aussieht. Fügen Sie zuerst Funktionen hinzu und definieren Sie dann Regeln und Einschränkungen).
Sternchen

Antworten:

18

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:

qs :: Ord a => [a] -> [a]
qs [] = []
qs (pivot:xs) = (qs smaller) ++ pivot:(qs larger)
  where smaller = [x | x <- xs, x <= pivot]
        larger  = [x | x <- xs, x > pivot]

oder dasselbe in Python:

def qs(array):
  if not array:
    return []
  pivot = array[0]
  xs = array[1:]
  smaller = [x for x in xs if x <= pivot]
  larger  = [x for x in xs if x > pivot]
  return qs(smaller) + [pivot] + qs(larger)

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:

algorithm QUICKSORT(array)
  return [] if array is empty
  pivot  array[0]
  xs  array[1, ...] -- the rest of the array without the pivot
  smaller  [x | x  xs, x <= pivot] -- all smaller or equal elements
  larger  [x | x  xs, x  > pivot] -- all larger elements
  return [QUICKSORT(smaller)..., pivot, QUICKSORT(larger)...]

Bemerkenswerte Unterschiede:

  • Ich kann mir einfach eine Listenverständnis-Syntax ausdenken, die wie Mathematik aussieht, anstatt erklären zu müssen, warum Python ein forund ifhier 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 yielddas 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.

amon
quelle
9
Ich stimme Ihnen im Allgemeinen zu, aber Ihr Beispiel widerspricht einigen Ihrer Argumente - Ihr Pseudocode und das Python-Beispiel sehen sich sehr ähnlich. Das ist meiner Meinung nach eine Folge der Python-Sprache, die eine Menge "gesunden Menschenverstand" enthält.
Doc Brown
2
Wenn nur eine Teilmenge der Sprachfunktionen / API verwendet wird, ist dies mit der Essenz des Pseudocodes synchron. Wenn wir uns jedoch damit befassen, was der beste oder esoterischste Weg wäre, dies in einer bestimmten Sprache zu erreichen, wäre dies Ablenkung. Die Wissenschaftler, die den Algorithmus beschrieben, entwickelten eine eigene Notation, die der Mengenlehre stark ähnelte. Nachdem die Idee der Turing-Maschine etabliert war und C, Fortran, Lisp Pseudo-Code gefunden hatte, begann er, Ideen von ihnen
auszuleihen
2
Ich würde hinzufügen, dass, wenn Code "wie er ist" kompiliert werden kann, ein sehr reales Risiko besteht, dass "Schüler Ausschneiden und Einfügen verwendet und nichts gelernt haben".
Brendan
3
Sie haben gestritten I don't have to explain ... what array[1:] is supposed to mean., aber dann mussten Sie wirklich array[1, ...] -- the rest of the array without the pivotin den Kommentaren erklären, weil niemand hätte herausfinden können, was array[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.
Lie Ryan
1
@amon Zum Guten oder Schlechten sind mathematische Notationen nicht so gut definiert wie Programmiersprachen. Auch die Verwendung von Auslassungspunkten in Sequenzen hat keine spezifische Bedeutung. Manchmal bedeutet es, dass es sich um eine arithmetische Folge handelt, manchmal um eine geometrische Folge, manchmal um das nächste Element in einer beliebigen Reihenfolge, über die der Autor spricht, und Sie müssen fünf Absätze vom Code entfernt lesen, um dies zu erfassen. Die Slice-Notation hat eine genau definierte Bedeutung, sie ist nicht mehrdeutig. Auch wenn Ellipsen in der Sequenz häufig vorkamen, hatten Sie noch nicht angegeben, wie die Sequenz mit eckigen Klammern interagiert.
Lie Ryan
10

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.

Leichtigkeitsrennen im Orbit
quelle
0

Was ist real?

Weil Real nur für einen Dolmetscher definiert ist .

Ist Mandarin mehr oder weniger real als Englisch?

  • Sicherlich ist Mandarin für einen Englisch sprechenden Menschen nicht besonders nützlich
  • Ähnlich ist Englisch für einen Mandarin-Sprecher so viel Unsinn
  • es sei denn, sie sprechen beide.

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:

  • Erklären Sie, warum sie sich die Mühe machen würden, eine fremde Sprache zu lernen, anstatt nur ihre natürliche Sprache zu verwenden.
  • Erklären Sie dem Leser eine fremde Sprache, damit er sie möglicherweise selbst sprechen kann.

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.

  • Wie erkennen Sie ein Problem?
  • Wie brechen Sie ein Problem auseinander?
  • Wie erstellen Sie die Daten?
  • Wie gestalten Sie die Prozesse?
  • Wie verwalten Sie die Abhängigkeiten?
  • Wie erkennen Sie Fehler?
  • und mehr

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.

  1. Der Algorithmus hat ein Ziel, das in diesem Zusammenhang angemessen ist:
  2. Dieser Kontext hat einige Einschränkungen.
  3. und der Algorithmus ist eine Beschreibung, wie diese Einschränkungen behandelt werden können, während das Ziel erreicht wird.

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:

  • Ist es besser, ein Fleischwarenprogramm zu beschreiben, das die vollständige Spezifikation einer formalen Sprache wie C ++ / C # / Python / etc ... interpretieren kann, um den Algorithmus zu verstehen
  • oder Definieren Sie einfach die 4 oder so Grundelemente, die zum Verständnis des Algorithmus erforderlich sind.

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?

Kain0_0
quelle
0

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.

Lie Ryan
quelle