Frage

Hier ist eine Art seltsame Frage. Ich bin im Begriff, ein Buch zu schreiben, auf dem Lernen mit formalen Methoden zu programmieren, und ich werde es gegenüber Menschen mit etwas Programmiererfahrung zielen. Die Idee ist, sie zu lehren, qualitativ hochwertige Programmierer sein.

Die grundlegende Notation wird von Dijkstra Discipline of Programming sein, zusammen mit einiger Gleichzeitigkeit und Kommunikations Erweiterungen.

Im Gegensatz zu EWD, ich möchte, dass meine Studenten schließlich tatsächlich ausführbare Programme zu schreiben. Das bedeutet, dass an einem gewissen Punkt übersetzt von EWD Notation in einer anderen Sprache. Als ich die ersten tat formale Programmierung begonnen gezielte I C, aber Sie am Ende eine Menge von Sanitär-Schreiben, dazu gibt es alle Komplexitäten von Zeigern usw. Ruby-Behandlung ein offensichtliches mögliches Ziel ist, wie Scheme oder Lisp ist. Aber es gibt auch die verschiedenen Funktions Sprachen; da ich in Gleichzeitigkeit besonders interessiert bin, scheint Erlang wie eine Möglichkeit.

So, endlich, hier meine Frage: Welche Sprache (n) sollte ich lehre meine Leser ihre formal-Programme entwickelten sich zum Ziel

?
War es hilfreich?

Lösung

Charlie,

Ich habe immer Dijkstra-Meisterwerk mit einem Modell der Programmierung, in der Mitte der Bühne besetzt ist durch Schleifen und Arrays verbunden. Wenn Sie in der Nähe Dijkstra abgelegt haben (zum Beispiel der Berechnung schwächste Vorbedingungen) Ich denke, Sie funktionale Sprachen sind finden keine gute Passform. Von den gängigen Sprachen, die mit Schleifen und Arrays eine gute Unterstützung für imperative Programmierung bieten, vielleicht trägt Python die geringste zusätzliche Gepäck.

Dies ist nicht zu sagen, dass funktionale Sprachen auf formale Methoden nicht geeignet sind --- sie sind sehr gut geeignet, --- aber der Stil ist ganz anders als Dijkstra. Die bevorzugten Methoden betonen rechnerische Beweise; siehe Richard Vogel Papier auf die Lösung von Sudoku (die schwer zu gehen ist) oder das Lehrbuch von Richard Vogel und Phil Wadler.

Für Gleichzeitigkeit es viel hängt davon ab, welches Modell der Parallelität (und welcher formalen Methoden) Sie glauben. John Reppy des Concurrent ML ist ein schönes Message-Passing-Modell. Erlang hat auch ein schönes, sauberes restriktives Modell. Auf der anderen Seite, Programmierung mit Schlössern und kritischen Abschnitten ist so schwierig, kann es in dieser Situation mehr Nutzen formale Methoden sein.

Zwei weitere vorbei Bemerkungen, die für Ihren Hintergrund Forschung von Interesse sein können:

  • Der einzige Programmierer die ich je kennengelernt, die Dijkstra-Methoden in der Praxis auf reale Systeme war Greg Nelson angewendet, der in Modula-3 arbeitete. (Greg und Mark Manasse schrieb das Jochbrücke Fenstersystem zusammen.) Modula-3 war eine sehr schöne Sprache, die Digital-durch Nutzlosigkeit und Inkompetenz sterben erlaubt. Greg hatte ein schönes TOPLAS Papier auf einer Erweiterung der Dijkstra-Kalkül.

  • Gerard Holzmann- Modellierungssprache ist direkt auf Dijkstra Sprache bewacht Befehle SPIN basiert, und es unterstützt auch Gleichzeitigkeit. Sein Zweck ist es Modelchecking, nicht-Programmierung, und es gibt ein paar Eigentümlichkeiten, aber es gibt eine starke Verbindung mit formalen Methoden, und es ist wirklich toll, dass man Ihre Behauptungen modellieren überprüfen. Wer Interesse an formalen Methoden wollen, check it out.

(Edit: Hier ist ein Link auf den Greg Nelson Papier, oder einer von ihnen -. CRM)

Andere Tipps

Das Ignorieren der offensichtlichen, was Ihre Lieblings < a href = "https://stackoverflow.com/questions/273108/which-programming-languages-have-helped-you-to-understand-programming-better"> Programmierung language Antworten, kann ich zwei nützliche Antworten finden Sie unter:

Auf der einen Seite, die Sie versuchen Methoden zu zeigen, was mutmaßlich Zwischen Programmierer sein. Wenn Sie eine Sprache auswählen und als Ihre Bücher Sprache segnen, werden Sie möglicherweise potenzielle Leser entfremden, die nicht passieren, dass die Sprache für einen oder anderen Grund bevorzugen. Da Sie Methoden sind demonstriert, haben Sie den Luxus-Schnipsel in den Sprachen, die Ihren Punkt kurz erläutern passieren. Zum Beispiel ist die einzige Sprache für RIIA demonstrieren wahrscheinlich C ++, aber die gleiche Sprache ist ziemlich schlecht für das zeigt, wie Quellenanalyse durchzuführen. Scheme ist für Quellenanalyse ideal, aber nicht Ihnen sehr viele Möglichkeiten geben, um die Vorteile zu erkunden (und Schwächen) der starken Typisierung. Verwenden Sie viele Sprachen.

Auf der anderen Seite, da man in erster Linie ist bis zu Methoden der Programmierung, ich bin nicht ganz sicher, was Sie brauchen eine wirkliche Sprache überhaupt. Eine gut definierte Notation ist nur so gut, und zwingt den Leser auf den Punkt konzentrieren Sie machen eher als die oberflächlichen Details einer Sprache oder einem anderen.

Ich wuchs auf Lisp und Scheme und lieben sie beide. Ich denke, dass sie große Sprachen sind von Grund auf neu zu lernen, auf. Aber, ich bin nicht sicher, ob jemand mit etwas Programmiererfahrung würde auf diese Sprachen nehmen. Du wirst nicht viele Zugriffe auf Amazon für Ihr Buch mit Schema im Titel erhalten. :)

C # ist eine sehr einfache Sprache zu lernen, und es ist alles der Grundlagen bekommt man ziemlich schnell in Themen wie Parallelität zu tauchen brauchen würde. Es hat mehr Anwendbarkeit, weil Sie können auch OO und Web-Konzepte zielen. Es ist auch ziemlich beliebt und Sie würden Unternehmen für ihre Mitarbeiter Bücher zahlen erhalten, die für den Verkauf immer gut ist ( „Seien Sie ein Kick Ass C # Programmer“ geht viel weiter auf eine Kostenerstattung Blatt als „Concurrency in der modernen Lisp“).

F # ist eine interessante Sprache. Es ist die funktionelle Schönheit eines Lisp oder Scheme bekam (auch nicht ganz, aber fast) und es gibt Ihnen eine gewisse Fähigkeit, in OOP Themen zu tauchen sowie Haken in das .NET Framework für UI-Sachen, wenn Sie etwas aufzupeppen wollen. Aber gerade jetzt, es ist dunkel.

Ich kann Ruby nicht sprechen, so persönlich, würde ich den sauren Apfel beißen und mit C # gehen.

Ehrlich gesagt, kann ich nicht empfehlen Rubin dafür. Als ich von Tag zu Tag programmiere in meiner kommerziellen Welt, wie ich es ziemlich viel, sicherlich viel mehr als C oder Java. Aber die Semantik davon ist so schlecht definiert, dass ich es nicht trauen halb so viel wie C, wo, obwohl ich mehrere Stunden verbringen kann eine Erklärung streiten über und Beratung, dass viele dickeres weißes Buchs, das K & R ersetzt, ich komme aus in der Ende ziemlich überzeugt, dass, wenn ich einen konformen Compiler habe (ja, ich weiß, ich bin ein Träumer, aber die Arbeit mit mir hier) ich weiß, was die andere Seite herauskommen wird.

Ruby ist wunderbar in vielerlei Hinsicht, aber soweit alles formal geht, wird der twain nie treffen.

Ich würde dazu neigen, mich für Haskell zu stimmen, denn jedes Mal, wenn ich mich umdrehe Ich bin erstaunt, wie viel Sinn macht alles in dieser Sprache Definition. (Obwohl zugegebenermaßen nach nur einem Jahr oder so an, ich bin sicher, ich habe 98 die Hälfte der Ecken auch Haskell nicht erforscht.)

Und ich verstehe auch die Dikjstra vs. funktionelle Sache; zurück und liest seine Papiere er in einer imperativen Welt sehr viel ist; Ich bin nicht qualifiziert zu sagen, ob er wirklich den falschen Weg dorthin ging. Vielleicht bin überwältigt ich nur, wie gut sein Schreiben ist, so viel wie sein Denken. Aber es schien ihm zu gefallen, so was über die Verwendung von 60 Algol ?

Das ist eine nette Idee. Ich denke, Scheme ist eine gute Wahl, da es eines ermöglicht in der Praxis umzusetzen (in Form von Bibliotheken) unterschiedliche Abstraktionen mit einem Minimum Wesentlichen. Es ist auch leicht von Schema zu einem Verifikationssystem wie PVS zu übersetzen ( http: //pvs.csl.sri. com / )

cheers

ich glaube, dass Sie sollten sich etwas ganz Erfahrung in der Sprache, die Sie für Ihr Buch verwenden, oder jemand beherrschen Ihren Code zu überprüfen.

Persönlich würde ich Common Lisp verwenden, da ich damit vertraut bin, und es ist eine großartige Sprache jedes Konzept zu implementieren. Andere Optionen könnten Erlang, Haskell, Ruby oder Python, vielleicht sogar einige ML Dialekt sein. Ich bin voreingenommen gegen die C-Familie (einschließlich C # und Java), sie auf ein niedrigeres Niveau stecken scheint über Konzepte zu denken.

Es gibt durchaus ein paar Universitäten für den Unterricht formale Methoden Perfekten Entwickler mit (Disclaimer: Ich bin mit diesem Produkt verbunden ist). Es wird für die Expression von Spezifikationen, Daten Verfeinerung und Algorithmen um eine Sprache aufgebaut. Es verfügt über eine automatische Theorembeweiser zur Verifikation und einen Code-Generator, C ++, C # und Java produzieren kann. Der Entwurf von PD war sehr inspiriert durch „eine Disziplin der Programmierung“ wir jedoch die Schreibweise eher unpraktisch für große Systeme gefunden, so dass die Notation wich etwas von Dijktra ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top