Auf was möchten Sie als Sprachdesigner achten? [geschlossen]

38

Der Zweck dieser Frage besteht nicht darin, eine Wäscheliste mit Programmiersprachenfunktionen zusammenzustellen, auf die Sie nicht verzichten können oder auf die Sie sich in der Hauptsprache Ihrer Wahl gefreut haben. Der Zweck dieser Frage ist es, die Ecken des Sprachdesigns zu beleuchten, über die die meisten Sprachdesigner möglicherweise nicht nachdenken. Denken Sie also, anstatt über das Sprachmerkmal X nachzudenken, etwas philisophischer.

Eine meiner Vorurteile, die vielleicht kontrovers diskutiert wird, ist, dass die weichere Seite des Engineerings - das Warum und Wofür - um ein Vielfaches wichtiger ist als die konkretere Seite. Beispielsweise wurde Ruby mit dem erklärten Ziel entwickelt, die Zufriedenheit der Entwickler zu verbessern. Während Ihre Meinungen darüber, ob es lieferte oder nicht, unterschiedlich sein mögen, bedeutet die Tatsache, dass dies ein Ziel war, dass einige der Entscheidungen im Sprachdesign von dieser Philosophie beeinflusst wurden.

Bitte nicht posten:

  • Syntax Flame Wars. Seien wir ehrlich, wir haben unsere Vorlieben und die Syntax ist wichtig für das Sprachdesign. Ich möchte nur epische Schlachten der Natur von Emacs gegen VI vermeiden (von denen eine große Anzahl von Menschen heutzutage nichts weiß).
  • "Jede Sprache, die nicht über Feature X verfügt, verdient es nicht, vorhanden zu sein", geben Sie Kommentare ein. Es gibt mindestens einen Grund, warum alle Programmiersprachen existieren - gut oder schlecht.

Bitte tun Beitrag:

  • Philisophische Ideen, die Sprachdesigner zu vermissen scheinen.
  • Technische Konzepte, die häufig nur unzureichend umgesetzt werden. Bitte geben Sie ein Beispiel für die dadurch verursachten Schmerzen und geben Sie an, wie sie funktionieren sollen.
  • Dinge, die Sie sich gewünscht haben, befanden sich in der gemeinsamen Bibliothek der Plattform, sind es aber selten. Dies gilt auch für Dinge, die sich normalerweise in einer gemeinsamen Bibliothek befinden und die Sie gerne hätten.
  • Konzeptionelle Funktionen wie die integrierte Unterstützung für Test / Assertion / Contract / Error Handling, die alle Programmiersprachen ordnungsgemäß implementieren und definieren sollen.

Ich hoffe, dass dies ein lustiges und anregendes Thema wird.

Edit: Klargestellt, was ich mit Syntax Flame Wars meine. Ich versuche nicht, alle Diskussionen über Syntax zu vermeiden, insbesondere weil Syntax ein grundlegender Bestandteil des Entwurfs von Programmiersprachen ist.

Berin Loritsch
quelle
Zu sagen, dass die Syntax nur ein Implementierungsdetail ist, ist einfach falsch. Syntax-Design ist ein grundlegender Bestandteil beim Entwerfen einer Sprache. Und viele der Punkte, die Sie veröffentlicht sehen möchten, können tatsächlich Syntax beinhalten. Das Mitleid. Schien eine interessante Frage zu sein.
Konrad Rudolph
Was ich vermeiden möchte, ist der Flammenkrieg. Wenn Sie die Syntax diskutieren können, ohne einen Flammenkrieg auszulösen, versuchen Sie es.
Berin Loritsch

Antworten:

49

Standardmäßig Unicode-Unterstützung

Heutzutage werden Programme entwickelt, die international verwendet werden sollen, oder unter der Annahme, dass sie international verwendet werden könnten. Sie müssen ihre Zeichensätze unterstützen oder in dieser Sprache geschriebene Programme unbrauchbar machen.

Malfist
quelle
2
+1 Tatsächlich sollte die Sprache es Ihnen ermöglichen, ein beliebiges Zeichen für Ihre Bezeichner zu verwenden. Wir sind nicht alle Engländer.
Berin Loritsch
13
@Berin: Eigentlich bevorzuge ich englische Programme, obwohl ich Franzose bin. Das Problem ist die Kommunikation. Wenn Sie Programme mit ungarischen, spanischen oder portugiesischen Bezeichnern schreiben, erwarten Sie nicht, dass ich jemals dazu in der Lage bin. In einem Kontext der Internationalisierung ist es äußerst wichtig, dass Entwickler untereinander kommunizieren können Dies setzt voraus, dass eine gemeinsame Sprache für Bezeichner, Kommentare und Dokumentation verwendet wird. Englisch ist die Verkehrssprache der Entwickler.
Matthieu M.
11
Ich würde hinzufügen, dass Unicode-Unterstützung bei der Verwendung der Sprache natürlich sein sollte. Wenn möglich, sollte es keinen zusätzlichen Aufwand erfordern, es "hinzuzufügen", es sollte "einfach funktionieren" (wo es angemessen ist).
RHSeeger
4
Entsprechend sollte die Sprache grundsätzlich zwischen Textdaten (Zeichenfolge) und Binärdaten (Bytefolge) unterscheiden. C # macht das richtig mit stringund byte[]. Wie Python 3.x mit strund bytes. C (++) versteht chardas fürchterlich falsch.
Dan04
1
@ RHSeeger - in der Tat !!! Auch in Python muss man tippen u'My Unicode Štring'. Ich wünschte, Sie könnten einfach vergessen, mit welcher Art von Zeichenfolge Sie es zu tun haben, und Code schreiben.
Orokusaki
25

Ich habe ein paar:

  • Generika / Vorlagen. Java-Generika sind beispielsweise leistungsstark, aber nicht unbedingt flexibel. Außerdem habe ich Probleme damit gesehen, sie abstrakt zu implementieren, insbesondere in Interfaces, da sie die Typlöschung verwenden. Und der Compiler sollte nicht warnen, wenn ein unspezifisches Generikum verwendet wird (Like Hashmapstatt Hashmap<String, int>). Ich denke, sie könnten deutlich verbessert werden. Gutes Templating ist sehr nützlich, wird aber oft vernachlässigt.

  • Good Date-Unterstützung in der Standardbibliothek. Ich meine, in der Lage zu sein, Daten, Stunden und Minuten zu addieren und zu subtrahieren und nicht mit der Anzahl der Millisekunden seit dem 1. Januar 1970 umgehen zu müssen.

Michael K
quelle
2
"good date support" ist allerdings eine ziemlich hohe Anforderung! was bedeutet das überhaupt? Ich denke, Datums- und Uhrzeitangaben gehören zu den Dingen, bei denen man es nicht gut kriegen kann. Entweder du machst es einfach und falsch oder du machst es richtig und gottlos kompliziert. Es ist WIRKLICH schwer, einen guten Mittelweg zu finden.
Sara
@kai Der Punkt ist, dass Datums-Support normalerweise ziemlich schrecklich ist. Das alte java.util.Datehat fast alle möglichen Fallstricke und Probleme. Ich kenne nur einen Teil des neuen java.time.*Pakets, aber es ist sauber, benutzerfreundlich und AFAICT-fehlerfrei. Fortgeschrittene Benutzer finden möglicherweise Probleme, aber es ist eine enorme Verbesserung. +++ Das Problem scheint zu sein, dass es ein kompliziertes Problem ist und die erste Version gehetzt und kaputt ist.
Maaartinus
24

Bitte machen Sie Ihre Sprache für Computer-Sicherheitsleute analysierbar / überprüfbar.

Sicherheitsleute müssen in der Lage sein, Sicherheitslücken in einem Programm zu finden, bevor es ausgeliefert wird. Im Idealfall werden wir frühzeitig angerufen und können die Codebasis während ihrer Entwicklung kommentieren, aber oft nicht.

Wenn eine neue Version der Sprache oder der Kernbibliotheken herauskommt, sind Dinge, die zuvor sicher waren, möglicherweise nicht mehr:

  1. Bibliotheken können leistungsfähiger werden: zB URL-Bibliothek unterstützt jetzt javascript:
  2. Möglicherweise gibt es neue Möglichkeiten, Zeichenfolgen oder Bytes in Code zu konvertieren: z. B. evaloder Deserialisierungsbibliotheken
  3. Techniken zur Sprachreflexion können leistungsfähiger werden: z. B. die Darstellung lokaler Variablen

Jede dieser Änderungen kann die Anzahl der missbräuchlichen Berechtigungen eines Programms erhöhen. Da sich jedoch die Anzahl der vom Programm verwendeten Berechtigungen (im Umgang mit nicht böswilligen Clients) nicht geändert hat, ist es für Sicherheitsleute schwierig, dies ohne großen Aufwand herauszufinden erneutes Audit.

Denken Sie also bitte an uns, wenn Sie die Sprache entwerfen und versionieren. Nachfolgend einige Tipps:

Definieren Sie einige Grundelemente, in die ein Programm zerlegt werden kann.

HTML5 ist auf diese Weise besonders schlecht. Sie haben offensichtlich viel über Sicherheit nachgedacht und haben einige sehr kluge Leute, aber anstatt neue Programmelemente wie alte zu spezifizieren <video>oder eine gemeinsame Abstraktion zu schaffen, für die sowohl neue <video>als auch alte <img>spezifiziert werden können, <video>ist dies noch nicht der Fall ein weiteres einmaliges Programmelement mit eigenen Sicherheitsfolgen.

Machen Sie Ihre Sprache für statische Analysen zugänglich (auch wenn sie nicht statisch geschrieben ist).

Sicherheitsleute verwenden häufig statische Analysen, um Muster zu finden und Teile eines Programms auszuschließen, damit sie sich auf die wirklich kniffligen Dinge konzentrieren können.

Es sollte offensichtlich sein, welche Bezeichner lokale Variablen sind und welche nicht.

Machen Sie zum Beispiel nicht den gleichen Fehler wie bei alten Versionen von JavaScript, bei denen nicht festgestellt werden konnte, ob xes sich im Folgenden um eine lokale Variablenreferenz handelt (gemäß einer wörtlichen Lesart einer alten Version der Spezifikation):

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

Lassen Sie zerlegbare Sicherheit zu

Viele sichere Systeme basieren auf einem sicheren Kernel, der die Sicherheitseigenschaften beibehält, so dass sich die Sicherheitsleute darauf konzentrieren können, eine kleine Menge Code zu analysieren und die meisten Programmierer von nervigen, pedantischen und paranoiden Sicherheitsleuten zu befreien .

Es sollte möglich sein, einen solchen Kernel in Ihrer Sprache zu schreiben. Wenn eine der Sicherheitseigenschaften Ihrer Sprache ist, dass nur eine bestimmte Teilmenge von URLs abgerufen wird, können die Kernel-Writer dann etwas tun, um alle URLs, die über ihren Code abgerufen werden, zu kanalisieren? Oder können statische Build-Prüfungen (wie das Betrachten von Importen) die gleiche Funktion erfüllen.

Einige Sprachen wie Newspeak verwenden ein Objektfähigkeitsmodell. Das ist großartig und eine großartige Möglichkeit, um zerlegbare Sicherheit zu erhalten.

Wenn Sie dies jedoch nicht tun können, können Sie einen erheblichen Nutzen daraus ziehen, das Moduldiagramm zu einem statisch auswertbaren Artefakt zu machen. Wenn ich nachweisen kann, dass ein Modul das Datei-E / A-Modul nicht erreichen kann (außer durch Aufrufen von Code in einem Modul im TCB), kann ich ganze Klassen von Problemen von diesem Modul ausschließen.

Beschränken Sie die Autorität eingebetteter Skriptsprachen

Viele nützliche Systeme sind als statischer Kern organisiert, der eine Menge in dynamischen (sogar funktionalen) Sprachen geschriebenen Codes anstößt.

Durch das Einbetten von Skriptsprachen kann ein System erheblich erweitert werden.

Eine Skriptsprache sollte jedoch nicht die volle Berechtigung der VM besitzen.

Wenn Sie eingebettete Skriptsprachen zulassen, können Sie dem Aufrufer die Einschränkung der von ihm ausgeführten Aktionen erleichtern. Ein Objektfähigkeitsmodell (siehe Kommentar zu Newspeak oben) ist hier sehr angebracht; Wenn Sie also Code in einer Skriptsprache auswerten, muss der Aufrufer den auszuführenden Code und alle globalen Variablen für diesen Code übergeben.

Behandle dich evalals eine Sprache, die sich selbst als Skriptsprache einbettet

Wenn Ihre Sprache einen eigenen Compiler aufrufen kann, um eine Zeichenfolge in Code umzuwandeln, können Sie zulassen, dass sie wie jede eingebettete Skriptsprache in einer Sandbox gespeichert wird.

Verwenden Sie ein einfaches Parallelitätsmodell

Wir Sicherheitsleute müssen uns nicht um die Rennbedingungen kümmern, wenn wir herausfinden wollen, ob eine Sicherheitseigenschaft erhalten bleibt.

Bitte ziehen Sie Alternativen zum Threading in Betracht, bevor Sie sich für Threads entscheiden. Dies ist eine fast unmöglich zu sichernde Standardoption.

Eine einfache ist die Parallelität von Ereignisschleifen, wie sie in E, Verilog und JavaScript zu finden ist.

Fördern Sie nicht das Zitieren von Verwirrung

Einige Sprachen sind Klebesprachen und es kommt vor, dass sie sich mit Zeichenfolgen in vielen verschiedenen Sprachen befassen.

Beispielsweise setzt JavaScript häufig Zeichenfolgen aus HTML, CSS, XML, JSON und sogar JavaScript zusammen. Für Programmierer ist es sehr schwierig, sich daran zu erinnern, Klartext-Strings richtig zu codieren, wenn sie zu Strings in anderen Sprachen kombiniert werden. Daher gibt es in JS-Programmen, wie es nicht überraschend ist, alle Arten von Problemen mit Zitaten: XSS ist das Schlimmste.

Wenn Sie Funktionen zum Erstellen von Zeichenfolgen verwenden möchten, versuchen Sie, die Sicherheitslast des Programmierers zu verringern. DSLs, hygienische Makros und eingebettete Templatensprachen können eine großartige Möglichkeit sein, dies zu tun, indem der Aufwand für einen ordnungsgemäßen Fluchtweg zu Bibliotheks- oder Sprachentwicklern und weg vom Endentwickler verlagert wird.

Mike Samuel
quelle
Schöner Zusammenbruch.
Qix
23

Einige der besten Sprachen wurden von Leuten entworfen, die eine Sprache für sich selbst machen wollten.

Daher denke ich, dass Sprachdesigner ihren Benutzern weniger Aufmerksamkeit schenken sollten. Sie können nicht allen gefallen und sollten es auch nicht versuchen.

dan_waterworth
quelle
4
Das mag bis zu einem gewissen Grad zutreffen. Wenn Sie jedoch niemals auf Ihre Benutzer hören, wissen Sie nie, welchen Schmerz Sie ihnen zufügen, wenn sie versuchen, Ihr Gehirnkind zu benutzen. Ohne diesen Schmerz zu hören / zu fühlen, werden Sie nie auf die nächste großartige Idee kommen, die dieses Problem und andere Probleme löst. Kein Mensch ist eine Insel. Schmerz kann ein großer Motivator für Inovation sein.
Berin Loritsch
5
@Berin: Ich denke, es geht nicht darum, dass Sie niemals auf Ihre Benutzer hören sollten , sondern nicht auf die Benutzer, die die Sprache für etwas verwenden möchten, für das sie nicht entwickelt wurde. Wenn Sie eine Sprache entwickelt haben, um einen bestimmten Satz oder bestimmte Probleme zu lösen, sollten Sie sich an die Benutzer wenden, die diese Probleme ebenfalls lösen müssen. Sie sprechen jedoch das Extrem an und manchmal kann eine Sprache eine Nische in einer neuen Domäne finden, also +1.
Jeremy Heiler
2
@ Jeremy, ja, das ist genau das, was ich sage, aber ich denke, es ist ungewöhnlich, dass eine Sprache in einer Domäne, für die sie nicht entwickelt wurde, gut funktioniert.
Dan_waterworth
@dan_waterworth: Erfolgreiche Sprachen funktionieren in der Regel oft gut in Domänen, für die sie nicht entwickelt wurden.
David Thornley
8
Anstelle von "Nicht auf Benutzer hören" lautet der Rat besser "Nicht auf Benutzer hören, die Sie nicht haben".
Chrisaycock
16

Nur 5-10% der Zeit werden für das Schreiben von Code aufgewendet. Sprachdesigner sollten auf die Schwierigkeiten achten, die auftreten können, wenn Software funktioniert. Dies bedeutet, dass Fehler und Fehler behoben werden.

Das heißt, es sollte von Anfang an einen guten Debugger geben. Kein Tool mit arkaner Syntax und Tastaturbefehlen, das nur geringfügig besser ist als jede Menge Druckanweisungen.

Whatsisname
quelle
2
+1. Das Debuggen ist einer der Orte, an denen einige Sprachen besser sind als andere - und einige IDEs machen den Unterschied zwischen einer verwendbaren Sprache und einer, die Ihnen im Weg steht.
Berin Loritsch
2
Ich werde dem noch ein wenig hinzufügen und, wo möglich, nützliche Stack-Traces nennen. Wenn ein Fehler auftritt (oder eine unaufgefangene Ausnahme oder was auch immer, abhängig von Ihrer Sprache), möchte ich in der Lage sein, den gesamten Aufrufstapel, der zu ihm gelangt ist, zusammen mit den Werten der verwendeten Argumente anzuzeigen. Tcl macht das außergewöhnlich gut. Um ehrlich zu sein, ist in Tcl alles ein String, sodass Sie den Wert von allem relativ einfach drucken können.
RHSeeger
1
Nicht nur das Debuggen, sondern auch das Schreiben von Fehlern. Ich war so froh, als Java die automatische Überprüfung der Grenzen von Arrays einführte ... aber jetzt, 15 Jahre später, machen wir diese Fehler immer noch in anderen Sprachen.
Alex Feinman
3
Wäre es nicht besser, eine Sprache zu haben, die die Bugs beim Kompilieren findet? Wenn ich beispielsweise Ada verwende, verbringe ich erheblich weniger Zeit im Debugger als mit C oder C ++.
Martin
12

Ich denke, sie sollten auf Python achten, der mehr Dinge richtig macht als jede andere Sprache, der ich begegnet bin (und das, selbst wenn Sie einige der Funktionen nicht mögen). Das bedeutet nicht, dass sie Python emulieren sollten, aber es ist wichtig zu wissen, was Python richtig gemacht hat, auch wenn Sie keine Sprache wie Python erstellen möchten.

Was die dort relevanten philosophischen Ideen betrifft, so sind dies die wichtigsten aus dem Zen von Python:

  • Explizit ist besser als implizit.
  • Lesbarkeit zählt.
  • Sonderfälle sind nicht speziell genug, um die Regeln zu brechen.
  • Obwohl die Zweckmäßigkeit die Reinheit übertrifft.
  • Es sollte einen - und am besten nur einen - offensichtlichen Weg geben, dies zu tun.
  • Wenn die Implementierung schwer zu erklären ist, ist es eine schlechte Idee.
  • Namespaces sind eine großartige Idee - machen wir mehr davon!

Ich denke, eine Sprache, die diesen Regeln folgt, muss unbedingt ganz in Ordnung sein, aber ich kenne nur eine, die dies tut, und das ist Python. Trotz all der Ähnlichkeiten, die beispielsweise mit Ruby in der Implementierung bestehen, lässt Ruby Dinge wie Lesbarkeit aus und lädt Sie ein, Codegolf zu spielen, was Spaß macht, aber in einer professionellen Umgebung nicht nützlich ist.

Die einzige technische Funktion, die ich in Python vermisse, ist eine "till" -Anweisung (wie while, aber nicht beim ersten Mal testen). Dann gibt es in Python und anderen Standardbibliotheken eine Menge Dinge, die verbessert werden könnten, aber das ist keine reine Sprache , das ist also eine andere Frage. :-)

Lennart Regebro
quelle
4
Ich halte zwei andere Dinge für wichtiger, insbesondere in Bezug auf das Sprachdesign: "Sonderfälle sind nicht speziell genug, um die Regeln zu brechen." weil eine Sprache mit tausend Sonderfällen oder arkanen Regeln in Verbindung mit "Obwohl Praktikabilität die Reinheit übertrifft" nur schwer zu gebrauchen ist. denn sonst driftet man in das Reich der Turing Tarpits.
15
Wenn explizit besser ist als implizit, warum müssen Sie dann keine Variablen deklarieren? Wenn ein einfacher Tippfehler schwer zu debuggende Fehler verursachen kann (im Gegensatz zu Fehlern, die zur Kompilierungszeit auftreten oder Laufzeitfehlern, die offensichtlich und leicht zu debuggen sind), ist dies ein schwerwiegender Schlag gegen die Sprache IMO.
Mason Wheeler
4
@Mason Wheeler: Der einzige Grund, warum Sie Variablen in anderen Sprachen deklarieren müssen, ist, dass Sie deklarieren müssen, welcher Typ sie sind. Python ist dynamisch, sodass keine Typdeklaration erforderlich ist und daher keine Deklaration erforderlich ist. Ich verstehe nicht, wie das irgendetwas mit implizit / explizit zu tun hat. Die Typen in Python sind explizit. So sind die Variablen. Nach zehn Jahren hat ein Tippfehler niemals einen schwer zu debuggenden Fehler verursacht. In der Tat sind sie trivial zu debuggen.
Lennart Regebro
8
+1 für die Liste, -1 für die Fanboy-Ness. Es erscheint pragmatischer , allen Sprachen, die einen beachtlichen Erfolg erzielt haben, Aufmerksamkeit zu schenken und zu versuchen, die Anwendbarkeit dieser Elemente zu berücksichtigen oder zumindest zu analysieren.
Steven Evers
3
@Lennart: Ich würde sagen, dass es eine gute Sache ist, die Funktionstypen explizit angeben zu können (aber nicht zu müssen, siehe Regel 4). Es ähnelt dem vertraglichen Entwurf. Das ist der Punkt, den ich ansprechen möchte.
Theo Belaire
11

Die Möglichkeit, die Sprache an Ihre Bedürfnisse anzupassen, ist für mich sehr wichtig. Für Lisp ist das mit Makros erledigt, für Tcl mit Uplevel. In geringerem Umfang verwendet Ruby Lambdas und dergleichen. Ich möchte nur die Möglichkeit haben, neue Kontrollstrukturen hinzuzufügen, die dem Problem entsprechen, anstatt meine Probleme auf die verfügbaren Kontrollstrukturen abzustimmen. Als einfaches Beispiel ist das Konstrukt "do .. until", das in einigen Sprachen, aber nicht in anderen Sprachen vorhanden ist, eine sauberere Methode, um einige Fälle zu behandeln als "while". Es ist äußerst nützlich, neue Strukturen hinzufügen zu können, um andere Fälle zu erfüllen.

Im Allgemeinen ist dies eine Metaprogrammierung ... aber ich verwende sie hauptsächlich zum Aufbau neuer Kontrollstrukturen.

RHSeeger
quelle
Interessant. Es kann schwierig sein, eine gute Meta-Programmierunterstützung zu finden, aber sehr leistungsfähig, wenn dies der Fall ist. Ich habe von Leuten gehört, die Lisp mögen, dass die Implementierung von Lisp zu den besten gehört - aber sie sagen das über alles in Lisp. Irgendwelche Beispiele dafür, was Ihrer Meinung nach Metaprogrammierung richtig macht?
Berin Loritsch
"Metaprogrammierung richtig gemacht" muss dort sein, wo es einfach ist, richtig zu machen (na ja, für eine vernünftige einfache Aktivität) und wo sich das Endergebnis wie ein natürlicher Teil der Sprache anfühlt.
Donal Fellows
1
Nicht nur modifizierbar, sondern auch entzifferbar. Wenn Sie etwas in der Sprache neu zugeordnet haben, sollte ich als Leser in der Lage sein, es schnell herauszufinden. Anmerkungen oder andere äußere Markierungen könnten dabei helfen.
Alex Feinman
Ich denke, Mata-Lua oder Template Haskell leisten einen guten Job, um dies bereitzustellen. (Nicht so schön wie Schema-Makros, aber das ist, was Sie bezahlen, wenn Sie mehr als Parens in einer Sprache verwenden)
Theo Belaire
10

Das Wichtigste ist, dass Ihre Sprache einen "Stil" haben muss. Zum Beispiel würde ich C eine Zeiger-basierte Programmiersprache für Systeme nennen. Ich würde Erlang eine hochkonkurrierende funktionale Programmiersprache nennen. Einige andere Sprachen (wie C ++ und wahrscheinlich Java) sind die von Allan Kay als "agglutinativ" bezeichneten Sprachen: Frankenstein-Sprachen bestanden aus einer Reihe von zusammengefügten Funktionen.

Als nächstes ist es am wichtigsten, dass Änderungen an der Sprache selbst das letzte Mittel sind. Selbst die harmlosesten Klänge können in Kombination mit den anderen Merkmalen der Sprache komplex werden. Ich würde sagen, dass Sie Folgendes tun müssen, um eine neue Funktion in eine Sprache zu integrieren:

  1. Beweisen Sie, dass es wirklich notwendig ist.
  2. Beweisen Sie, dass dies in einer Bibliothek nicht möglich ist.
  3. Beweisen Sie, dass es in der Sprache gehört.
Jason Baker
quelle
2
Mit anderen Worten, die Sprache sollte ein übergeordnetes Gestaltungsprinzip haben, und die Sprache sollte mit diesem Prinzip übereinstimmen. Kommentare zur Sprachentwicklung sind angebracht (ich habe dies einige Male verpfuscht gesehen).
Berin Loritsch
1
Erinnert mich an mein Lieblings-C ++ - Zitat ... Ein Tintenfisch, der durch das Aufnageln zusätzlicher Beine auf einen Hund hergestellt wurde.
ocodo
4
Beweisen Sie, dass dies in einer Bibliothek nicht möglich ist . +1
Qix
2
Ich mag den Leckerbissen in der Bibliothek. Es ist cool, wie Sprachen wie haskell keine eingebauten Kontrollfunktionen wie Schleifen, Ausnahmen oder Fortsetzungen haben. Sie sind einfach in der Sprache zu definieren, halten die Syntax sauber und fördern die Erweiterbarkeit und Kompositionsfähigkeit, indem sie eine Reihe cleverer Sprachfunktionen enthalten.
Sara
10

Vielen Dank für eine tolle Frage. Du bekommst ein paar ziemlich gute Antworten.

Nicht um über deine Augen zu glänzen, aber ich betrachte einen Programmierer als Informationskanal. Ideen / Konzepte / Anforderungen gehen in ein Ende, und Code kommt das andere heraus.

Wenn Sie eine Reihe von Anforderungen (unabhängig davon, wie sie angegeben sind) und die Codemenge auf einem riesigen Whiteboard verwenden und Linien zeichnen, die jede Anforderung dem Code zuordnen, der sie implementiert, hängt die Komplexität dieses Diagramms davon ab, wie gut der Code ist drückt die Anforderungen aus. Idealerweise sollte es ziemlich direkt und eins zu eins sein, aber das ist in der Praxis schwer zu realisieren.

Ich messe die Domain-Spezifität einer Sprache als das Ausmaß, in dem sie dieses Diagramm vereinfacht. Dies ist eine äußerst wünschenswerte Eigenschaft und kann auf verschiedene Arten erreicht werden, angefangen von der Definition der richtigen Klassen / Routinen (Substantive / Verben) über Makros bis hin zum Schreiben eines eigenen Parsers und Interpreters / Compilers.

Lassen Sie mich nur ein Beispiel geben, was ich meine. Aufgrund des Problems der Erstellung flexibler Dialogbenutzeroberflächen müssen bei dieser Technik keine Ereignishandler geschrieben und keine Daten verschoben werden, wie dies normalerweise in Benutzeroberflächen der Fall ist. Es führt auch zu einer Reduzierung des Quellcodes um eine Größenordnung. Die Metasprache ist wirklich nur ein paar Routinen und Makros in C / C ++ / Lisp, und ich habe es auch in Sprachen ohne Makros gemacht.

Wenn das Implementieren einer Anforderung mit 5-Punkt-Änderungen am Code oder mit 10 durchgeführt werden kann, bedeutet dies nicht nur weniger Code, sondern auch weniger Chancen, einen Schritt zu verpassen und einen Fehler zu verursachen. Je domänenspezifischer eine Sprache ist, desto kleiner, wartbarer und fehlerfreier ist der Code. Ich denke, wir müssen wissen, wie wir dahin fahren können. Dies bedeutet nicht, dass der Code besser lesbar ist, es sei denn, der Leser hat in die Lernkurve investiert, um die Technik zu verstehen.

Mike Dunlavey
quelle
9

Eingeschränkte und unterschiedliche Ganzzahlentypen wie in Pascal und Ada. Ganz ehrlich: Wie oft benötigen Sie den vollen Bereich einer ganzen Zahl? Ich denke, es gibt viel zu verbessern bei primitiven Typen, um die reale Welt besser darzustellen.

Martin
quelle
2
Eingeschränkte Integer-Typen wie C, C ++, D, Java, C # usw. haben mit Sicherheit ihren Platz. Einige Arten der Programmierung kümmern sich nicht darum und benötigen lediglich die Unterscheidung zwischen Ganzzahl und Gleitkomma. Selbst dann brauchen wir vielleicht nur einen Nummerntyp und kümmern uns später um den integralen Teil der Nummer? Kurz gesagt, Business-Programmierung reagiert weniger auf den spezifischen Integer-Typ als auf die Tatsache, dass eine Zahl eine Ganzzahl ist. Wenn Sie ein Protokoll auf niedriger Ebene implementieren, ändern sich die Regeln drastisch.
Berin Loritsch
2
Was ich dachte, wo Typen wie in Ada, wo man nur sagen type Date_Of_Month is 1 .. 31;und Entscheidungen wie 16 oder 32 Bit dem Optimierer überlassen kann . Noch wichtiger ist jedoch, dass Sie einer Variablen des Typs eine Zahl von 32 oder 0 oder -5 zuweisen RANGE_ERROR.
Martin
Bereiche eignen sich gut für Dinge wie Date_Of_Month(oder Month_Of_Year), bei denen ein offensichtlicher Bereich zu verwenden ist, aber viele - wahrscheinlich die meisten - Fälle sind verschwommen. type Persons_Age is 0..120? Was ist, wenn jemand den Langlebigkeitsrekord bricht? type Year is 0..9999? Was ist, wenn Sie ein Ägyptologe sind?
Dan04
Wenn Sie ein Ägyptologe sind, brauchen Sie nichts type Egyptian_Year is -9999 .. 300;. Nach meiner Erfahrung können Sie die meiste Zeit nützliche Grenzen für ganze Zahlen finden. In dieser Hinsicht sollten Sie berücksichtigen, dass type Scrolls_Found is array Egyptian_Year of Natural;Sie keinen unbeschränkten Typ als Array-Index haben können / sollten. Es ist nur ein Angriffsvektor für Hacker. Übrigens: Mit Ada können Bereichsgrenzen zur Laufzeit berechnet werden.
Martin
1
@kai niemand sagte, dass diese besondere Eigenschaft von Typsystemen überall ohne Ausnahmen verwendet werden muss. Ich bin sicher, Ada erlaubt auch die Verwendung "normaler" numerischer Typen. Und begrenzte numerische Typen sind sicherlich nützlich für einige (ziemlich häufige) Probleme.
Sarge Borsch
8

Es gibt Funktionen, mit denen die Verwendung von Programmiersprachen nach dem Erlernen einfach ist, und es gibt Funktionen, mit denen die Verwendung der Programmiersprachen einfach zu erlernen ist. Da Benutzer einer Sprache im Idealfall eine langfristige Beziehung zu dieser Sprache haben, ist die Optimierung hinsichtlich der Benutzerfreundlichkeit besser als die Optimierung hinsichtlich der Erleichterung des Lernens. Machen Sie Dinge nicht schwieriger als nötig, aber opfern Sie nicht die Ausdruckskraft (in der Lage zu sein, einen kleinen Code zu schreiben, der viel bewirkt), um die Lesbarkeit für diejenigen zu verbessern, die mit der Sprache nicht vertraut sind. Andererseits sollte die Sprache für Leute, die jahrelang damit gearbeitet haben, nicht wie Leitungsgeräusche gelesen werden. das wäre nicht einfach zu bedienen oder zu lernen.

Larry Coleman
quelle
8

Namenskonventionen (ich sehe Sie PHP)

Malfist
quelle
Es ist jedoch weniger ein Problem mit dem Sprachdesign. Sicher, Sie müssen immer ein Auge darauf haben, was in die Standardbibliothek eingeht, aber Sprachentwickler können keine Namenskonventionen durchsetzen;)
3
Sie können für die Standardbibliothek.
Malfist
3
Erwähne nicht einmal PHP. Die am schlechtesten verwendete Sprache. Nicht von einem Informatiker entworfen, sondern von einem Typen, der Vorlagen und Steroide haben wollte.
Keyo
@delnan: Einige Sprachen, wie Mercury oder Eiffel, schreiben Namenskonventionen vor (alle Namen von Kapitalklassen, Variablen, die mit einem Großbuchstaben beginnen usw.) und werden vom Compiler erzwungen. Fortran sagte, dass Variablen, die mit i, j, k beginnen, Integer sind (daher die traditionelle Verwendung als Schleifenvariablen in den meisten Sprachen ...). Und so weiter. Irgendwie ärgerlich, wenn man die Konvention nicht mag, aber zumindest für die Konsistenz der Quellcodes gut ist.
PhiLho
@PhiLho: Das ist allerdings sehr begrenzt. Es kann nicht - nur ein Beispiel - eine konsistente, sinnvolle (für den menschlichen Leser) Verwendung von Groß- und Kleinschreibung oder Unterstrichen erzwingen (es könnte versuchen, aber die Vernunft der Programmierer in diesem Prozess gefährden).
7

Erstklassige Integration in Entwicklungsumgebungen.

Heutzutage wird das Codieren in einer reichen Umgebung durchgeführt. Für HTML / CSS / JS haben wir Firebug und andere interaktive Tools. Für Java, Eclipse und IDEA und andere echte IDEs. Und so weiter. Es gibt eine Reihe von Werkzeugen, die mit dem Editor beginnen und dort nicht enden:

  • Organisation von Code innerhalb und zwischen Dateien
  • Intelligente Hervorhebung
  • Smart Completion / Predictive Typing
  • Statisches Debugging (Kennzeichnung von Syntax-, Semantik- und Stilfehlern)
  • Erstellung und Verwendung von Vorlagen und Makros
  • Versionskontrolle (Versionierung, Zusammenführen, Verzweigen, ...)
  • Verteilte Entwicklung mit mehreren Autoren (Kommentare, Inline-Dokumente, Anmerkungen, ...)
  • Laufzeit-Debugging (Stack-Traces, Steppen, Beobachten, ...)
  • Interaktives "Live" -Debugging (wie Firebug - Editierverhalten eines Live-Systems)
  • ... Ich weiß nicht einmal, was als nächstes kommt.

Sprachen sollten entwickelt werden, um diese Aktivitäten zu unterstützen. Einige Fortschritte wurden erzielt - beispielsweise Anmerkungen in Java, die anderen Entwicklern helfen sollen, die Absicht des Codes zu verstehen.

Aber meistens handelt es sich um gehacktes Zeug, wie die Verwendung von $ Id $ in einem Kommentar, sodass CVS-gesteuerte Quellen eine Versionsnummer enthalten können. Warum kann ich so etwas nicht aus der Sprache selbst machen?

Alex Feinman
quelle
Sie meinen so etwas wie ASIS (ISO / IEC 15291: 1999 “Ada Semantics Interface Specification”)? ASIS deckt nicht alles ab, was Sie wollen, aber ziemlich viel. Ich habe mir oft etwas wie ASIS für andere Programmiersprachen gewünscht. Weitere Informationen finden Sie unter sigada.org/wg/asiswg .
Martin
Einige dieser Dinge sind relativ billig zu erledigen oder werden in Ihrer IDE kostenlos angeboten: Code-Organisation, Syntax-Hervorhebung, Code-Faltung, Versionskontrolle, Vorlagen / Makros. Andere erfordern viel mehr Aufwand: Laufzeit-Debugging, statisches Debugging, Smart Completion / Predictive Typing, Refactoring usw. Obwohl sie oft vernachlässigt werden, ist das Entwerfen einer konsistenten Sprache viel schwieriger, wenn Sie sich auch um IDE-Plugins kümmern müssen.
Berin Loritsch
6

Verteilte Berechnung

Das kostenlose Mittagessen ist vorbei. Heute braucht man Programme, die auf mehreren Kernen / mehreren Prozessoren (und unter besonderen Umständen auf mehreren Computern) laufen.

Leider ist das Schreiben von Multithread-Code konzeptionell schwierig, sodass die Sprache nicht als Barriere hinzugefügt werden muss.

Die Verwendung von C ++ 0x für die Zukunft ist auf jeden Fall interessant, da es als Bibliothek bereitgestellt wird und Sie nicht von tatsächlichen Synchronisationsproblemen befreit (Sie wissen, dass diese einfach zu lösen sind ...).

Ich mag Go 's Herangehensweise an das Problem sehr: Multithreading ist eingebaut, und die Herangehensweise (Kanäle und Goroutinen) stellt eine viel einfachere Denkweise dar als die traditionellen Semaphor / Mutex / Lock-Herangehensweisen. Es ist dennoch einfach, gleichzeitig auf eine nicht synchronisierte Struktur zuzugreifen (Go hat Zeiger) oder zu blockieren (Zyklus des Wartens auf Kanäle ...)

Ich denke, dass Sprachen, die die Unveränderlichkeit von Daten bevorzugen, wie funktionale Sprachen, möglicherweise das Recht dazu haben (ich mag es jedoch, dort Erfahrungen zu sammeln).

Auch das Actor- Modell könnte unser nächstes Ziel sein. Es war auch für verteiltes Rechnen gedacht.

Matthieu M.
quelle
Ein anderes Beispiel wäre Erlang. Ein gemeinsames Thema unter Sprachen dieser Art ist ein gemeinsamer Nichts- Ansatz, bei dem der Zustand im Wesentlichen zusammen mit der Nachricht weitergegeben wird. Der Ansatz skaliert gut.
Berin Loritsch
@Berin: Du hast Recht, obwohl ich Erlang in der Nachricht nicht zitiert habe, weil ich wenig darüber weiß, erinnere ich mich richtig, dass es das Actor-Modell implementiert.
Matthieu M.
6

Nenn mich verrückt, aber eines der wichtigsten Sprachmerkmale für mich ist die Verfügbarkeit einer guten Online-Referenz mit Beispielen. Ich weiß, dass ich gute Suchergebnisse für jede Sprache finden kann, aber ich mag die MSDN- und Java-APIs-Site wirklich. Sie erleichtern die Programmierung einer Person, die nicht viel Erfahrung in der jeweiligen Sprache hat.

apoorv020
quelle
JavaDoc, CppDoc, RubyDoc usw. waren ein großer Vorteil beim Verständnis der Standardbibliotheken sowie der von Ihnen erstellten Bibliotheken. Sie sind nicht alle gleich und einige sind einfacher zu navigieren als andere.
Berin Loritsch
Einverstanden, die Java-API-Site ist ein hervorragendes Asset. Es ist großartig, ein Standardformat für die Erstellung von API-Dokumentation zu haben. Der Produktivitätsgewinn durch die Verwendung einer IDE mit integrierter Unterstützung für die Analyse von JavaDoc (NetBeans) ist erstaunlich. Obwohl ich ein schreckliches Gedächtnis habe, nützt es mir wahrscheinlich mehr als anderen.
toc777
6

Mehr Möglichkeiten, dem Compiler zu helfen, Ihren Code zu überprüfen.

Als Programmierer für eingebettete Systeme verwende ich immer C. Aber ich wünschte immer, ich hätte mehr / bessere Möglichkeiten, dem Compiler mitzuteilen, was ich von meinem Code erwarte, damit er ihn überprüfen kann.

ZB kann ich eine Funktion haben

f(int x)

aber ich würde es vorziehen

f(int range[-5..25] x)

EG Ich möchte in der Lage sein, Aussagen über Funktionen mit einer höheren funktionalen Sprache wie Lisp oder Haskell zu machen. Diese würden nicht in Code kompiliert, sondern könnten für statische oder dynamische Analysen verwendet werden.

Raketenmagnet
quelle
Grundsätzlich ein effizienter Weg, um Grenzen zu überprüfen? Das wäre ziemlich cool. Allerdings möchte ich zumindest, dass dies zur Laufzeitüberprüfung sowie zur Überprüfung der Kompilierzeit hinzugefügt wird. Wenn Sie Informationen aus einer Datenbank oder von der Benutzeroberfläche abrufen, stellen Sie immer sicher, dass der Wert gültig ist. Wenn dies ein Sprachfeature wäre, würde ich es auch für diese Zwecke verwenden wollen.
Berin Loritsch
3
Du solltest Pascal benutzen. Sie können einen Typ definieren, der einen beliebigen Zahlenbereich abdeckt, z. B. -5 bis 25, den der Compiler zur Kompilierungszeit überprüfen kann. (Solange Sie nur Konstanten zuweisen, natürlich.)
Mason Wheeler
1
@Kugel: Was anderes als ein Compiler-Feature ist zu behaupten? Und Unit-Test überprüft den Code in der Produktion nicht. Und wenn man nicht in die Produktion eincheckt, ist das so, als würde man die lebenden Boote nach der Jungfernfahrt ausziehen. Um Kraftstoff zu sparen und das Schiff schneller zu machen.
Martin
1
Ich würde Ada verwenden, außer dass die Plattform, auf der ich arbeite, keinen Ada-Compiler hat. Es gibt nur einen C-Compiler, das ist also alles akademisch.
Rocketmagnet
1
Ich verwende bereits viele Behauptungen, aber es wäre noch besser, diese und andere Dinge als Sprachfeatures zu haben.
Rocketmagnet
5

Kleine Syntax mit möglichst wenigen Schlüsselwörtern, da die ausführliche Syntax schwer zu erlernen ist und die Lesbarkeit nicht verbessert.

Das schlechteste Beispiel ist Ada:

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

Füllwörter wie is, as, .. ergeben für Programmiersprachen keinen Sinn.

Brainlag
quelle
4
Ich denke, das schlechteste Beispiel sind Sprachen, in denen Sie sagen public static void.
Joey Adams
1
Die Idee ist nicht neu und bereits in der Form von SmallTalk implementiert, das überhaupt keine Schlüsselwörter hat. Sie hätten also SmallTalk als positives Beispiel für Ihre Behauptung verwenden sollen. Übrigens: Wenn Sie nicht wissen, wofür das ISist, haben Sie Ada nicht verstanden (haben Sie jemals Ada programmiert?): ISTrennt die Prozedurdeklaration von der Deklaration lokaler Variablen und unterscheidet eine Spezifikation von der Implementierung. Natürlich merkt man erst beim Vergleich von Spezifikation und Implementierung einer Funktion, dass das ISdurchaus Sinn macht und überhaupt kein Füllstoff ist.
Martin
1
Vergessen zu erwähnen: Die SmallTalk-Syntax passt auch auf die Rückseite einer Postkarte. So wird es auch Ihrem Wunsch nach "klein" gerecht. Natürlich sind die meisten Ideen hier bereits irgendwo in einer Sprache umgesetzt, und die meisten Poster hier verwenden diese Sprachen als positives Beispiel, anstatt ein fehlerhaftes negatives Beispiel zu machen. Ich würde dich ablehnen, wenn ich genug Ansehen hätte. Nicht weil deine Idee schlecht ist - sondern weil du ein negatives Beispiel benutzt.
Martin
7
Füllwörter können tatsächlich einen Zweck erfüllen, wenn sie dazu beitragen, die Syntax zu disambiguieren. Zum Beispiel habe ich viel lieber if x then …zu if (x) …. Wir haben ein Paar Klammern gegen ein kontextbezogenes Keyword eingetauscht. Dies ist sinnvoll, da die Bedingung xein komplexer Ausdruck mit eigenen Klammern sein kann. Durch das Eliminieren des äußersten Paares kann die Lesbarkeit drastisch erhöht werden. Eine Alternative ist natürlich, hier einen Doppelpunkt zu verwenden, wie in Python. Tatsächlich glaube ich, dass die meisten dieser eindeutigen Füllstoffe durch Doppelpunkte ersetzt werden könnten. Ich bin mir nicht sicher, welche Methode ich bevorzuge.
Konrad Rudolph
3
@Konrad: Wenn es die Syntax missachtet, ist es kein Füllzeichen . Das is ist ein Füllstoff , weil Ada konnte erlaubt haben , procedure Hello begin ... endohne Zweideutigkeit.
dan04
4

Ich würde gerne mehr Sprachen lernen . Nicht nur Sprachen für absolute Anfänger mit Einschränkungen, die höher sind als du , sondern auch Sprachen für Leute, die bereits Programmieren können und neue Konzepte erlernen oder das Programmieren im Allgemeinen verbessern möchten.

Für mich ist Haskell ein großartiges Beispiel dafür, was ich unter einer "Lernsprache" verstehe (obwohl sie im Laufe der Jahre auch an Popularität und allgemeinem Nutzen gewonnen hat). Haskell hat mich gelehrt, kürzere Funktionen zu schreiben, (+2) . (*3)indem ich die vertraute C-Syntax aufgegeben und Operatoren für die Rückwärtsfunktionskomposition verwendet habe (z. B. ist eine Funktion, die mit 3 multipliziert und dann mit 2 addiert wird). Die unbarmherzige Typprüfung hat mir geholfen, die Sprache schneller zu lernen und meine Fähigkeit, über Code logisch nachzudenken, zu verbessern. Beide Vorteile haben sich auf andere Sprachen ausgewirkt, sogar auf die Montage.

Die Ziele des Sprachenlernens und die der Allzwecksprachen stehen häufig in Konflikt. Das Lernen einer Lernsprache sollte eine Herausforderung und eine Belohnung darstellen und einen bestimmten Stil durchsetzen, auch wenn dieser Stil für viele Anwendungen nicht der beste ist. Eine Allzwecksprache sollte gut sein, um Dinge zu erledigen, und die Verwendung von Abstraktionen sollte sorgfältig gemessen und "sinnvoll" sein. Wenn Sie beispielsweise eine Website reparieren, ist das Erlernen von Monaden das Letzte, woran ein Programmierer denkt. Auf der anderen Seite sollte jemand, der Programmieren lernt, nicht durch den Quatsch "public static void" waten müssen, wenn er noch nicht einmal etwas über Funktionen gelernt hat.

Wenn Sie ein Sprachdesigner sind, entscheiden Sie sich bitte, ob Ihre Sprache eine Lernsprache oder eine angewandte Sprache ist. Dies bestimmt, inwieweit Sie Reinheit in Ihrem Design verwenden möchten.

Joey Adams
quelle
2
Wie ist Haskells Funktionszusammensetzung in irgendeiner Weise rückständig? Es ist eine direkte Übersetzung von (f ∘ g)(x) = f(g(x)).
Jon Purdy
@ Jon Purdy: Es bedeutet, dass Sie die Funktionen in umgekehrter Reihenfolge ihrer Anwendung schreiben müssen. Wird in beiden Formen gzuerst auf das Argument angewendet, gefolgt von f. Wenn Sie eine Liste sortieren, gruppieren und den ersten Eintrag dieser Listen erhalten möchten, schreiben Sie (map head . group . sort) listoder map head $ group $ sort listoder map head (group (sort list)). In jedem Fall schreiben Sie die Operationen rückwärts. Übrigens können Sie beim Importieren Control.Arrowsagen (sort >>> group >>> map head) list, aber der >>>Operator sieht für mich ziemlich umständlich und wortreich aus.
Joey Adams
2
Ich weiß nicht, ich denke immer noch, dass das von rechts nach links Sinn macht. (map head . group . sort) listliest sich als "das erste Element jeder Gruppe in einer Art von list", was ganz natürlich ist - und meines Erachtens funktionaler als (sort >>> group >>> map head) list, was eher zwingend und rückwärts als "dann sortieren Gruppe" liest, dann nimm das erste Element jeder Gruppe. .. list".
Jon Purdy
@ JoeyAdams - der >>>Operator sieht ziemlich umständlich und wortreich aus - Einige neuere funktionale Sprachen haben damit begonnen, |>einen Operator für die Verkettung von links nach rechts zu verwenden, was für die Augen vielleicht etwas einfacher ist ...
Jules
4

Seit wir im Jahr 2011 sind,

  • eine absolut vollständige Spezifikation. Keine architekturabhängigen Löcher wie in C
  • Multithreading-Unterstützung; Nicht nur Synchronisationsfunktionen (Sperren), sondern auch Sprachfunktionen, die Multithreading so einfach machen wie das Schreiben einer Schleife:

    all (o in myCollection) {o.someMethod ()}

  • Multiparadigma; Lassen Sie mich als Programmierer von Fall zu Fall entscheiden, ob ich die Sicherheit beim Kompilieren einer statischen Sprache oder die Kürze einer dynamischen Sprache möchte. gib mir objektorientierte Merkmale, funktionale Merkmale usw.

  • Konsistenz (Ich weiß, es ist ein bisschen viel verlangt sowohl nach Konsistenz als auch nach Multiparadigma ...)

user281377
quelle
Ich bin zu 100% bei Ihnen für eine vollständige Spezifikation. Multiparadigma und Konsistenz werden definitiv ein Spagat sein. Sie können eine Reihe von Verhaltensweisen für ein dynamisches Paradigma als Teilmenge der Verhaltensweisen für die statische Überprüfung angeben - aber ich denke, diese beiden Ansätze eignen sich für sehr unterschiedliche Programmierstile. Zu diesem Zeitpunkt dürften sie wirklich getrennte Sprachen sein. Vielleicht ist ein Paar konsistenter Sprachen mit 100% Kompatibilität das, wonach Sie suchen?
Berin Loritsch
Sprachen wie Scala (und vielleicht Haskell? Ich kenne es nicht genug) haben ein starkes statisches Typensystem und eine starke Knappheit, dank Typinferenz und Implikationen.
PhiLho
2
Architekturabhängige Funktionen sind in Ordnung, wenn ein Programmierer in einer Sprache festlegen kann, was wichtig ist oder nicht. Was C schrecklich macht, ist, dass es keine Möglichkeit gibt, "numerischen Typ, der modulo 65536 umschließt" zu deklarieren. Selbst wenn eine Plattform uint16_t implementiert, verlangt der Standard, dass einige Implementierungen den Unterschied zwischen zwei uint16_tWerten als vorzeichenbehaftet und andere den Unterschied als nicht vorzeichenbehaftet betrachten. es bietet keine Möglichkeit für das Programmiergerät, um anzugeben , welches Verhalten gewünscht ist.
Supercat
Ich bin nicht einverstanden mit Multiparadigma; das lässt viel zu viel Spielraum für Kämpfe im Coding-Stil. Bibliothek A ist mit einer Reihe dynamischer Paradigmen geschrieben . Bibliothek B ist mit einer Reihe von statischen Paradigmen geschrieben . Nun, jetzt muss Bibliothek A mit Bibliothek B sprechen. Wo ist der Mittelweg? Wenn Sie Klebstoff zwischen zwei Codeteilen in derselben Sprache schreiben müssen, ist die Sprache IMO von Natur aus fehlerhaft.
Qix
3

Leichte Prozesse

Ich hätte gerne leichte Prozesse wie in Erlang. Es ist hauptsächlich ein Problem für die Laufzeit. Dies fehlt in JVM und .NET CLR. LWP hilft bei der Erstellung von Software, die gleichzeitig ausgeführt wird. Idealerweise sollte das Erstellen eines Prozesses nicht teurer sein als das Erstellen eines Objekts in einer Sprache. Ich möchte in meinen Anwendungen Millionen von Prozessen erstellen.

Es ist als Thread-Pool mit vorbeugender Zeitplanung implementiert, sodass eine einzelne Task die andere Task nicht blockiert und die Tasks auf jedem verfügbaren CPU-Kern geplant werden können.

Unterstützung für die Schwanzrekursion

Ich hätte gerne Unterstützung für die Schwanzrekursion. Dies kann auch ein Problem für die Laufzeitumgebung sein. Beispielsweise unterstützt JVM keine Schwanzrekursion.

Einfache verteilte Programmierung

Ich möchte Unterstützung für das Senden ( ! ) Und Empfangen von Grundelementen für Teile der Anwendung haben, die auf anderen Computern im selben Netzwerk wie in Erlang ausgeführt werden. Dies erleichtert die Erstellung skalierbarer Anwendungen, z. B. verteilter Datenspeicher. Das Hinzufügen der in der Sprache eingebauten Serialisierung ist ebenso hilfreich wie in Erlang. Und nicht wie in Java muss ich es manuell machen.

Jonas
quelle
Schwanz-Rekursion: c2.com/cgi/wiki?TailRecursion
Berin Loritsch
Scala hat eine Schwanzrekursion und wird in die JVM kompiliert. Auch der IBM Java-Compiler kann manchmal eine Schwanzrekursion durchführen.
Martin
3

Erleichtern Sie die Metaprogrammierung.

Sonderformen einschränken

In Python gibt es keinen guten Grund, warum es keine eingebaute Funktion gibt. Es sieht aus und wirkt wie eine Funktion, außer dass es nichts mit Parens zu tun haben soll.

Haben wir wirklich brauchen for, foreach, whileund dergleichen , die jeweils ihre eigene besondere Form. Wie wäre es mit einem Schleifenkonstrukt und einigen Standardmakros, um den syntaktischen Zucker der varianten Schleifenformen bereitzustellen.

Metaprogrammierung für Sonderformen

form['if'](test-fn, body-fn)

Dietbuddha
quelle
Ruby Art hat "spezielle Formen" zum Schleifen, zumindest in dem Sinne, dass iterierbare Objekte normalerweise eine Methode wie diese haben each, die einen Codeblock als Argument nimmt. (Ruby hat auch forund whileSchleifen, aber kein
respektvoller
@mipadi: Ich bin ein großer Fan von Ruby-Blöcken und den damit verbundenen Redewendungen.
Dietbuddha
vielleicht denken sie - du wirst dein Auge ausschießen. :) Ich denke, es war die Assoziation von euch allen mächtigen "Python" und "kein guter Grund warum". Trotzdem ist die Metaprogrammierung eine gültige Frage des Sprachdesigns, die häufig vernachlässigt wird. Aus diesem Grund stimme ich dem zu.
Berin Loritsch
@Berin: Ich benutze und bin ein Fan von Python, was es amüsanter macht.
Dietbuddha
Eine Art von Schleife würde den Codefluss undeutlich machen. Wie würde beispielsweise eine do..whileSchleife aussehen, wenn es eine Art von Schleife gäbe, bei der die Bewertung oben steht? Es würde überhaupt nicht nach einer do..while-Schleife aussehen.
Qix
2

Netzwerkfähigkeiten

Eine Sprache, die ohne Netzwerkunterstützung ausgeliefert wird, ist in der heutigen Welt ziemlich lahm.

Die meisten realen Anwendungen müssen über eine Art Netzwerk kommunizieren:

  • Automatisches Update
  • Datenbankzugriff
  • Internetdienste

Es ist natürlich auch ein Eckpfeiler der Unterstützung für verteiltes / Cloud-Computing.

Matthieu M.
quelle
8
Aber es kann auch eine Standardbibliotheksfunktion sein .
Donal Fellows
@Donal: Ich habe nie etwas anderes gesagt (oder zumindest nicht gedacht), die Frage ist sowohl für Sprach- als auch für Bibliotheksfunktionen offen. Mein Punkt ist nur, dass, wenn Sie ein Sprachpaket erhalten und es keine Netzwerkfähigkeit gibt, Sie den Schmerz eher früher als später füllen werden :)
Matthieu M.
3
Die Standardbibliothek ist wirklich Teil der Spracherfahrung und sollte mit der gleichen Sorgfalt und dem gleichen Respekt behandelt werden. Ich bin auch mit dieser Anforderung für eine Standardbibliothek einverstanden.
Berin Loritsch
1

Ich mag eine Programmiersprache, die leicht zu erlernen und zu kombinieren ist, um neue Dinge zu erschaffen.

Zum Beispiel ist es zwar attraktiv, viele Möglichkeiten zu haben, etwas zu schreiben, aber ich denke, es ist besser, nur eine oder zwei Möglichkeiten zu haben, es zu schreiben. Auf diese Weise ist das Programm leichter zu warten.

Eine Sprache, deren Konzepte für alle Elemente gelten können, ist sehr hilfreich (ich denke, dies wird als Orthogonalität bezeichnet). Wenn Sie also das nächste Mal auf ein neues Sprachfeature stoßen, können Sie ableiten, wie es verwendet wird.

Ich verstehe, dass manchmal die Sprachsyntax in die Quere kommen muss, um in der Kompilierungs- / Interpretationsphase bessere Ergebnisse zu erzielen, aber manchmal habe ich das Gefühl, dass der Sprachdesigner diese Arbeit dem Entwickler überlässt. Zum Beispiel mehrzeilige Zeichenfolgen in Java oder Javascript.

Schließlich ist die Sprachsyntax die Benutzeroberfläche und sollte daher klar, prägnant, intuitiv und benutzerfreundlich sein und Ihre Gewohnheiten respektieren.

OscarRyz
quelle
Orthogonal bedeutet, dass jede Funktion etwas anderes ausführt. Schauen Sie sich Werkzeuge wie grep oder awk an. Sie machen eine Sache gut. Sie schließen sie dann in verschiedenen Reihenfolgen an, um alles zu tun, was Sie brauchen.
Theo Belaire
1
  • Lesbarkeit : Je weniger / kleinste Symbole in der Grammatik verwendet werden, desto sauberer und besser.
  • Objektorientierte Typen : Methoden, keine Funktionen.
  • Verständlichkeit : Integrierte fließende Schnittstellen, umfassende und kurze Namen für Bibliotheksklassen / -schnittstellen und die Sortierungen.
Dukeofgaming
quelle
1
Tut mir leid, aber ich muss dir eine -1 geben, weil du hier völlig falsch liegst. Knappheit hilft dabei , Code schneller zu schreiben , aber es macht Code definitiv nicht lesbarer, über ein bestimmtes Minimum hinaus. Ein gewisses Maß an Ausführlichkeit erleichtert das Lesen von Code erheblich, da diese zusätzlichen Wörter und Symbole eine Bedeutung haben und dem Programmierer aussagekräftige Informationen liefern, insbesondere, wenn sie ursprünglich von einer anderen Person geschrieben wurden und Sie nicht den Vorteil haben, bereits eine mentale Komponente zu haben Modell davon in deinem Kopf.
Mason Wheeler
Sauberer Code ist für mich lesbarer Code. Ich sagte auch das Kleinste: ":" anstelle von "=>" in PHP-Arrays oder "." anstelle von "->" wäre sicherlich eine Verbesserung (und ich genieße PHP bereits).
dukeofgaming
4
@Mason: Ich und viele gute technische Redakteure (zB William Zinsser) sind anderer Meinung. Ausführlichkeit ist der Feind der Lesbarkeit, nicht der Kürze.
Konrad Rudolph
2
Ich strebe eine Form der Knappheit an, die durch Symbole definiert wird . Ich bin jedoch ziemlich zufrieden mit Symbolen mit mehreren Zeichen, solange dies Dinge sind, die der Leser natürlich als ein einziges Symbol behandelt (z. B. ein Wort ist ein Symbol).
Donal Fellows
1
Ihr erster Punkt steht in direktem Konflikt mit den beiden letzteren.
Qix
1

Hinzufügen einer Funktion zu einer vorhandenen Programmiersprache. Die neue Sprache B ist also die alte Sprache A plus Feature X.

Bestehende Beispiele:

  1. C Klassen hinzufügen => C ++
  2. Java fügt ein paar Sachen hinzu => C #
umlcat
quelle
2
Dies ist eine enorme Vereinfachung. Ein viel besseres Beispiel wäre der Unterschied zwischen C und Objective-C.
Jon Purdy
0

Wenn es um Technologie / Plattform / Sprache / Datenbank usw. geht, kommt es meistens auf die Leistung an. In Zukunft werden viele heutige Softwareprogramme möglicherweise in einer grafischen Sprache erstellt, da wir über eine leistungsfähigere Rechenleistung verfügen.

Ich hoffe auf den Tag, an dem wir über Rechenleistung und eine Sprache verfügen, in der Sie Ihre Anwendung entwerfen und sich nicht um Sprachdetails kümmern müssen .

Update: Ich sende einen Link zu einer solchen Sprache LabView

Update: Ich sollte näher erläutern, was ich unter "rechenstark" verstehe. Die Leistung kompilierter Software ist möglicherweise nicht so hoch wie die Leistung kompilierter Software, die auf der Syntaxsprache basiert. Ich stelle mir grafische Programmierung als eine höhere Programmierebene vor und es könnte mehr Aufwand geben. Die heutigen Computer können und können problemlos grafische Programmiersprachen ausführen.

Amir Rezaei
quelle
3
Computer sind bereits leistungsstark genug, um dies zu tun. Es ist einfach nicht praktisch, da Sie sich aus irgendeinem Grund mit dem Code befassen müssen .
Jeremy Heiler
2
Es ist immer noch eine Art Sprache. Es gab mehr als einen Versuch, dies Wirklichkeit werden zu lassen. UML-Tools generieren eine bestimmte Menge an Code. Wenn das Modell jedoch ausreichend detailliert ist, um ein funktionsfähiges Produkt zu erstellen, kann es für das Codeverständnis nicht mehr verwendet werden. Ich glaube, dass es in der Unix-Umgebung etwas für die grafische Verkabelung von Anwendungen gab, aber es erforderte eine Menge Konfiguration, um es richtig zu machen. Workflow-Engines verwenden diese Metapher, um es Nicht-Programmierern zu ermöglichen, den Workflow zu entwerfen.
Berin Loritsch
1
Kurz gesagt, obwohl ich die Nützlichkeit dieses Ansatzes im Allgemeinen ernsthaft bezweifle, gibt es bestimmte Anwendungen, in denen er derzeit verwendet wird und für diese Anwendung gut funktioniert. Betreff: Ihre Punkte ... 1. Computer haben die Rechenleistung, die technische Seite ist nicht das Problem. 2. Das Problem besteht darin, eine Bildsprache bereitzustellen, die ausdrucksstark genug ist, um die Arbeit im allgemeinen Sinne zu erledigen, ohne sich in den Details zu verlieren. Außerhalb von Nischenanwendungen scheint Text eine viel kompaktere Darstellung eines Programms zu sein. Ich habe zugestimmt, weil es auf die gestellte Frage zutrifft.
Berin Loritsch
1
@Amir: Dann erklären Sie bitte, warum Computer leistungsfähiger sein müssen, damit "grafische Programmierung" die Softwareentwicklung vorantreibt.
Jeremy Heiler
7
@Amir: Sie verwechseln eine technische Einschränkung mit einer grundlegenderen. Der Grund, warum wir nicht viele grafische Computersprachen haben, ist, dass wir nicht wissen, wie man sie gut macht (und nicht wissen, ob sie gut gemacht werden können). Ich kenne LabView und habe schon genug gehört, wenn es darum geht, komplizierte Dinge zu tun oder einfache Dinge zu ändern. Wir brauchen auch keine leistungsfähigeren Computer, um eine solche Sprache zu entwerfen. Versuchen Sie also, einige Beispielprogramme in einer solchen hypothetischen Sprache zu entwerfen.
David Thornley