Was ist die orthogonalste Programmiersprache? [geschlossen]

46

Ich ärgere mich immer wieder darüber, dass ich Neulingen spezielle Sprachregeln beibringen muss (wie den Array-to-Pointer-Zerfall), die absolut nichts mit Programmierung an sich zu tun haben. Also habe ich mich gefragt:

Was ist die Programmiersprache mit der geringsten Anzahl von speziellen Sprachregeln, in der alles erstklassig ist und ohne störende technische Einschränkungen komponiert werden kann? Wäre eine solche Sprache nicht die perfekte Unterrichtssprache?

Moderator Hinweis

Wir suchen lange Antworten, die einige Erklärungen und Zusammenhänge liefern. Listen Sie nicht nur eine Sprache auf: Bitte erklären Sie, warum die Sprache Ihrer Meinung nach die Frage beantwortet. Antworten, die nichts erklären, werden gelöscht. Weitere Informationen finden Sie unter Gutes Subjektiv, Schlechtes Subjektiv .

fredoverflow
quelle
1
Versuchen Sie es mit Unlambda - es gibt nahezu die kleinstmögliche Anzahl von Sprachbausteinen. Eine etwas ernstere Antwort: Schema (speziell R5RS).
SK-logic
@ SK-Logik, Unlambda ist da nicht orthogonal I=SKK. Das Ultimative in orthogonalen Sprachen sind Einzelanweisungssprachen wie Jot und RSSB.
Peter Taylor
11
@Peter - ich glaube nicht, dass er streng genommen Minimal meint. Eine minimale Sprache hat nur alle zusätzlichen Definitionen in der Bibliothek, so dass die Schüler sie in beiden Richtungen lernen müssen. Die Art und Weise, wie ich diese Frage lese, ist "Welche Sprache folgt am besten dem Prinzip der geringsten Überraschung?".
Steve314
1
@Peter Taylor: Können Sie ein Beispiel nennen, bei dem Timtowtdi mit der Orthogonalität in Konflikt steht?
Keppla
1
Ich denke, "Orthogonalität" ist hier eine schlechte Wortwahl. Wie Peter und Steve festgestellt haben, ist das, was Sie wirklich meinen, „Prinzip der geringsten Überraschung“ oder eine eng verwandte Qualität.
Konrad Rudolph

Antworten:

53

Wenn es um "sehr wenige Regeln" geht, würde ich argumentieren, Lisp oder Smalltalk würden gewinnen. Die nackte Syntax kann auf einen Bier-Tab geschrieben werden.

Aber meiner Erfahrung nach bedeutet die Einfachheit von Lisp und Smalltalk nicht, dass sie einfach zu verstehen und zu unterrichten sind. Meiner Erfahrung nach ist der To-Do-Listen-Stil von imperativen Sprachen für Neulinge am einfachsten zu verstehen.

Daher würde ich Python, Ruby oder etwas Ähnliches vorschlagen : Sie finden (fast) jedes grundlegende Konzept in ihnen (OK, keine Hinweise), aber Sie müssen es nicht von Anfang an verstehen, um etwas zum Laufen zu bringen.

keppla
quelle
33
beeindruckende Arbeit Messung der Syntax in Einheiten einer Bier-Registerkarte.
PSR
3
Und vergiss Perl nicht. Es gibt viel mehr Perl als die meisten Leute denken und die Benutzergemeinschaft ist riesig .
Randal Schwartz
20
Perl mag sehr mächtig sein, aber ein Typ, der es für den einfachsten Weg zum Programmieren hält, muss das Äquivalent von Indiana Jones '
Tempeltunneln
9
Perls Syntax könnte auf einen Bier-Tab passen, vorausgesetzt, Sie trinken genug Bier.
Dave Sherohman
4
@ Randal, die Frage fragt nach einer orthogonalen Sprache. Perls Philosophie ist es, nicht orthogonal zu sein - "es gibt mehr als einen Weg, dies zu tun".
Peter Taylor
41

Ich würde sagen, LISP oder Schema oder eine Sprache aus dieser Familie wäre die orthogonalste. Mit let, lambda, define, if, cons, list, und ( )man kann so ziemlich alles lehrt , dass Sie in einem Intro Kurs wollen würden. Es ist auch nicht erforderlich, Anweisungen oder int main()ähnliches vorab zu verarbeiten, was die Schüler nur einschließen, aber keinen Grund dafür sehen.

In meinen CS-Einführungskursen haben wir mit Scheme viele wirklich coole Dinge gemacht: eine Turing-Maschine implementieren, einen TC-201-Computer implementieren, eine kontextfreie Grammatik schreiben, Rekursion verwenden, Zusammenführen und Einfügen sortieren, Addierer implementieren und jede Menge andere Sachen.

Ich hatte Java in AP comp sci vor dem College gemacht, aber Scheme war großartig, weil ich die Unordnung beseitigen und mich auf die tatsächlichen Konzepte in meinem Programm konzentrieren konnte. Es war eine großartige Klasse und ich würde Ihnen wärmstens empfehlen, sie für Ihren Unterricht auszuprobieren.

BlackJack
quelle
5
Zustimmen. Racket (ehemals PLT-Schema) ist eine etwas freundlichere Schema-Variante, die unsere Schule mit großem Erfolg in Einführungsklassen einsetzt.
NickAldwin
3
Was ist mit Haskell? Ich weiß nicht viel über Haskell, aber ich würde erwarten, dass es eine orthogonale Sprache ist.
Giorgio
4
@ Giorgio: Die Haskell-Syntax ist ziemlich kompliziert, obwohl ich vermute, dass nur eine Teilmenge verfügbar ist. Die Tatsache, dass Sie von Anfang an mit IO-Monaden interagieren müssen, um ein interessantes Programm zu erhalten, ist angesichts des OP-Ziels ein wenig ärgerlich.
Matthieu M.
4
Für "orthogonal" stimme ich für Schema, insbesondere die Racket- Implementierung. Die Umgebung von Racket ist so konzipiert, dass der Weg eines Lernenden einfacher ist als so etwas wie rohes Common Lisp. Die Sprache ist sauber, mit wenigen Regeln. Vor langer Zeit entschied sich das MIT, das Schema für den Unterricht von Freshman-Studenten mit dem Buch SICP zu verwenden . Diejenigen Studenten, die überlebt haben, scheinen sich auf dem Markt recht gut zu behaupten. Dieser Ansatz bringt den Schülern jedoch nicht direkt bei, wie man kommerziellen Code in den am häufigsten verwendeten Sprachen schreibt.
John Tobler
2
Ja! Die Tatsache, dass sich Scheme grundlegend von den meisten "echten" Sprachen unterscheidet, ermöglicht es Ihnen, sich auf die Programmierung und nicht auf APIs zu konzentrieren. Das Lernschema ist wie das " Wachsen an, Wachsen aus " der Codierung; Es scheint Zeitverschwendung zu sein, bis Sie feststellen, dass Sie den Computer besser verstehen als zuvor.
Benzado
17

Pascal wurde speziell für den Programmierunterricht entwickelt. Es ist leicht zu lernen (es war eine der ersten Programmiersprachen, die ich gelernt habe).

Henrik
quelle
3
Ich habe auch gelernt, mit Pascal zu programmieren und finde, dass es eine sehr saubere Sprache ist. Die einzige nicht orthogonale Eigenschaft, die ich mir vorstellen kann, ist die Syntax der Prozeduren writeln () und readln (), die eine variable Anzahl von Argumenten aufweisen und die Angabe der Formatierung ermöglichen.
Giorgio
Ich fand es eine sehr frustrierende Sprache. Aber ich kann projizieren, da ich einen sehr, sehr schlechten Lehrer hatte.
greyfade
14

Logo: Es ist noch am Leben und munter !

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

Es scheint eher ein Spielzeug als eine Programmiersprache zu sein, aber für viele wäre es kein schlechter erster Schritt. Die Syntax ist sehr einfach, aber die Schildkröte bietet eine konkretere Form des Feedbacks als die meisten Sprachen / Umgebungen. Der Versuch, eine bestimmte Form zu erstellen, ist eine großartige Möglichkeit, den Prozess des Vorausdenkens zur Lösung eines Problems zu erlernen.

Wenn Sie eine Abneigung gegen Schildkröten haben, denke ich wirklich, dass Schema der richtige Weg ist.

benzado
quelle
1
Ob Sie es glauben oder nicht, Logo ist ein Lisp, genau wie Schema. Die meisten Benutzer kommen nicht weit genug über einfache Loop- und Turtle-Grafiken hinaus, um dies zu lernen.
Sean McSomething
@SeanMcSomething Das ist interessant, da der Schwerpunkt eher auf Nebenwirkungen (Bewegen der Schildkröte) als auf der Bewertung von Ausdrücken liegt.
Benzado
10

Ich würde sowohl SML als auch Haskell vorschlagen. Die Orthogonalität war für beide ein Hauptentwurfspunkt. Insbesondere ist der Kern von SML (dh der Teil der Sprache, der sich nicht mit Modularität befasst) so ziemlich ein typisierter Lambda-Kalkül. Infolgedessen werden die meisten Sprachfunktionen von Typen gesteuert, und die Typen steuern wiederum die Einführungs- und Eliminierungsformulare für die Werte. Das ist so ziemlich ideal.

Es gibt in beiden Sprachen ein paar nicht-typentheoretische Warzen (eqtypes in SML, seq in Haskell), aber sie schlagen immer noch die Hosen von irgendetwas anderem, was bizarre Wechselwirkungen von nicht verwandten Sprachmerkmalen betrifft.

Lambdageek
quelle
7

Was auch immer die Wahl ist, ich würde dringend empfehlen, eine „echte“ Sprache zu unterrichten . Das Unterrichten von Spielzeugsprachen funktioniert für manche Menschen, aber für andere ist es sehr, sehr frustrierend, da die Verbindung zur realen Welt unterbrochen ist. Einige Menschen brauchen Relevanz für die Praxis als Lernmotivation, und es ist nicht unsere Aufgabe, diese Lernstrategie zu beurteilen (das ist in der Tat ein weit verbreitetes Missverständnis).

Dies disqualifiziert Sprachen wie Logo, aber auch domänenspezifische Sprachen wie Processing . Während letzteres für bestimmte Dinge (z. B. das Erstellen von Infografiken) äußerst nützlich ist, ist die Verwendung für die meisten Verwendungszwecke (und damit für die meisten Benutzer) zu eingeschränkt. Dies schließt auch Gofer aus , eine unbrauchbare Haskell-Untergruppe. Es auch schließt Pascal denn obwohl letztere hat in realen Projekten verwendet worden, es ist einfach nicht mehr relevant und es fehlt einfach wesentliche Merkmale (zB Einbau-Strings).

Von den praktischen Sprachen stimme ich den bereits erwähnten zu: moderne Lisp- oder Scheme-Dialekte, Haskell, Python oder Ruby. Persönlich würde ich wahrscheinlich Python verwenden, aber all diese Entscheidungen haben ihre Vor- und Nachteile.

Konrad Rudolph
quelle
2
Es ist ein Trugschluss zu behaupten, dass das Unterrichten einer "echten" Sprache die Möglichkeit bietet, Relevanz für die Praxis zu erlangen. Es ist die Aufgabe des Lehrers, zu zeigen, wie die "Spielzeug" -Sprache mit realen Fähigkeiten zusammenhängt. Jonglieren lernen, indem Sie mit Messern beginnen, bedeutet nicht, dass Sie relevantere Jonglierfähigkeiten erlernen.
Benzado
3
@benzado Du hast meinen Standpunkt falsch verstanden. Wenn Sie ein Spielzeug Sprache lernen müssen Sie übertragen Ihre Fähigkeiten für sie relevant zu Problemen der realen Welt zu machen. Mein ganzer Punkt war, dass diese Übertragung eine zusätzliche Indirektion ist, die einige Menschen aktiv am Lernen hindert . Unterschiedliche Menschen lernen auf ganz unterschiedliche Weise, und manche Menschen brauchen diese Unmittelbarkeit wirklich. Mit Messern jonglieren zu lernen ist nicht dasselbe. Die wirkliche Analogie wäre das Erlernen des Programmierens durch Schreiben eines Live-Raketenleitsystems als erstes Projekt, und das habe ich nie vorgeschlagen.
Konrad Rudolph
3
Ich verstehe was sie meinen. Wir sind uns einfach nicht einig. Ich denke, die Übertragung ist wichtig, es erfordert, dass der Schüler ein tieferes Verständnis hat als einer, der eine erfolgreiche Rätselstrategie hat (z. B. einer, der Wortprobleme "löst", indem er Zahlen auswählt und sie in die Formeln am Anfang des Kapitels einfügt ). Mit anderen Worten, wenn sie nicht übertragen können, was sie gelernt haben, haben sie es nie gelernt. Um die Motivation der Schüler zu erhalten, müssen Sie nur die richtigen Probleme auswählen, die unabhängig von der Sprache, "echt" oder "Spielzeug" wichtig sind.
benzado
@benzado Transfer ist wichtig, kein Argument da. Aber es ist eine ganz andere Disziplin, die unterrichtet werden muss, und einige Schüler haben sie nicht. Außerdem ist der Teil „tieferes Verständnis“ auch wahr, aber auch neben dem Punkt: Dies ist bereits ein fortgeschrittener Zustand, der erreicht werden muss . Sobald die Schüler „es“ gelernt haben, können sie es übertragen. Aber zuerst müssen sie lernen, und dazu benötigen einige Schüler Relevanz. Die Übertragung erfolgt später.
Konrad Rudolph
In Math Edu (wo ich nur wenig Erfahrung habe) ist "Lernen ohne Verstehen" ein großes Problem: Der Fokus darauf, wie man es ohne das Warum macht . Ich behaupte, wenn Sie die Konzepte des Programmierens unterrichten, reicht eine Spielzeugsprache aus, und wenn Sie Erfolg haben , wird die Übertragung in eine "echte" Sprache nicht schwierig sein. (Wenn die Übertragung schwierig ist, haben Sie Verfahren und keine Konzepte vermittelt.) Eine Spielzeugumgebung hindert die Menschen nicht am Lernen, erfordert jedoch eine gute Unterrichtsplanung, um sich zu engagieren. (Ich mag diesen Thread, aber ich denke, wir sind in das Diskussionsgebiet
übergegangen
6

Tcl hat 12 Regeln , die die gesamte Sprache regeln.

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

Es gibt nur sehr wenige Sonderfälle oder reservierte Wörter oder Zeichen.

Bryan Oakley
quelle
4

Was ist die Programmiersprache mit der geringsten Anzahl von speziellen Sprachregeln, in der alles erstklassig ist und ohne störende technische Einschränkungen komponiert werden kann? Wäre eine solche Sprache nicht die perfekte Unterrichtssprache?

Um meinen Kommentar zu erweitern, in Jot ist alles erstklassig (weil es ein Lambda-Kalkül ist) und kann komponiert werden. Es gibt nur eine Anweisung. Es ist eine absolut schreckliche Unterrichtssprache.

Im Allgemeinen gibt es in Turing-Tarpits nur wenige Sonderregeln, und Sie müssen die Grundlagen der Berechnung sehr gut kennen, bevor Sie etwas tun können. Die perfekte Unterrichtssprache ermöglicht es den Schülern, zu experimentieren, ohne sich die Haare auszureißen. Daher sind Abstraktionen auf höherer Ebene eigentlich eine gute Sache.

Peter Taylor
quelle
Vielen Dank, dass Sie mich mit dem Begriff "Tarpit" bekannt gemacht haben. Für diese Einfachheit brauchte ich immer einen Begriff.
Keppla
Ich bin damit einverstanden, dass die Schüler experimentieren können sollten, aber es scheint, als ob der ganze Sinn des Unterrichts darin besteht, dass man Verständnis braucht, bevor man "irgendetwas machen" kann.
Benzado
@benzado, ich stimme zu, dass der Sinn des Unterrichts darin besteht, Verständnis zu vermitteln. Aber bei den meisten Menschen muss man mit den Grundkonzepten beginnen, sie sollten sich darum kümmern und ihnen dann Zwischenbegriffe beibringen. Sie möchten also eine Sprache, in der jemand, der ein wenig versteht, Programme schreiben kann, die ein wenig können. Es gibt einen Grund, warum die meisten Programmierkurse nicht mit dem Unterrichten von Turing-Maschinen oder Minsky-Registermaschinen beginnen.
Peter Taylor
1
Richtig, ich denke, wir unterscheiden uns darin, was "ein bisschen tun" bedeutet. Wenn Sie (zum Beispiel) das Kontingent "Zeig mir, wie man Videospiele macht" beschwichtigen möchten, können Sie einige Dinge tun, aber sie kommen zu einem Punkt, weil sie keine Fortschritte machen können und frustriert sind, und dann müssen Sie Gehe zurück zu den "langweiligen Teilen", damit sie das Verständnis dafür erlangen, vorwärts zu kommen. Zu diesem Zeitpunkt sind sie bereits in einer schlechten Weise frustriert und können einfach aufgeben; Auf der anderen Seite bedeutet es ständigen Fortschritt, zuerst die "langweiligen Teile" zu machen und nach oben zu bauen. Aber offensichtlich fängt man nicht mit einem Streifen halb-unendlichen Bandes an.
benzado
2

Die wichtigsten Funktionen in einer Sprache, die Sie lernen, sind:

  • Prinzip der geringsten Überraschung (PASCAL)

  • Lesbarkeit (Ada)

Meiner Meinung nach übertrifft der Zweite den Ersten, da das Lesen von Code noch wichtiger ist als das Schreiben.

Jetzt schreibe ich wieder C #, Java, Objective-C und Javascript, die alle schreckliche Macken haben: D

Wenn ich jedoch zunächst eine Sprache auswählen müsste, würde ich mich für C # entscheiden. Es ist relativ einfach zu lesen, hat an sich nur wenige schwerwiegende Überraschungen (sie sind meistens in MS-Tools / Frameworks verborgen ...) und eine enorme Menge an zu lesendem Code und Dokumentation, die beide für ein gutes Lernen unerlässlich sind.

Kheldar
quelle
Wenn es nur um die Lesbarkeit und nicht um die statische Typisierung und Sicherheit von ada geht, haben Python und Visual Basic (ja, ich weiß, nicht die coole Art von Kindern) eine ähnliche übersichtsfreie Syntax, imho.
Keppla
Ja, ich stimme dir zu, aber "wenn es in Ada kompiliert wird, sollte es laufen". Verhindert jedoch keine Logikfehler, wie Ariane V feststellen kann: D
Kheldar
Ich habe darüber nachgedacht, ob statisches Tippen für Anfänger nützlich ist oder nicht. Es gibt mehr Unterstützung (wie Stützräder), aber dies kann sowohl als gute als auch als schlechte Sache angesehen werden. Dadurch wird die Verantwortung vom Schüler auf das Typensystem verlagert.
Aivar
@Kheldar, keine Programmiersprache kann Managementfehler verhindern, wie sie für den Ausfall der Ariane V verantwortlich waren. Du solltest deine Hausaufgaben machen.
John R. Strohm
@ JohnR.Strohm das war genau mein Punkt: Manchmal ist es nicht die Sprache, sondern der fehlerhafte technische Ablauf (z. B. Management). Sie hätten Ihren Kommentar jedoch meiner Meinung nach weniger aggressiv formulieren können.
Kheldar