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.
quelle
Antworten:
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.
quelle
string
undbyte[]
. Wie Python 3.x mitstr
undbytes
. C (++) verstehtchar
das fürchterlich falsch.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.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
Hashmap
stattHashmap<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.
quelle
java.util.Date
hat fast alle möglichen Fallstricke und Probleme. Ich kenne nur einen Teil des neuenjava.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.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:
javascript:
eval
oder DeserialisierungsbibliothekenJede 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
x
es sich im Folgenden um eine lokale Variablenreferenz handelt (gemäß einer wörtlichen Lesart einer alten Version der Spezifikation):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
eval
als eine Sprache, die sich selbst als Skriptsprache einbettetWenn 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.
quelle
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.
quelle
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.
quelle
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:
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. :-)
quelle
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.
quelle
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:
quelle
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.
quelle
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.
quelle
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 zuweisenRANGE_ERROR
.Date_Of_Month
(oderMonth_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?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, dasstype 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.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.
quelle
Namenskonventionen (ich sehe Sie PHP)
quelle
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:
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?
quelle
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.
quelle
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.
quelle
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
aber ich würde es vorziehen
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.
quelle
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:
Füllwörter wie is, as, .. ergeben für Programmiersprachen keinen Sinn.
quelle
public static void
.IS
ist, haben Sie Ada nicht verstanden (haben Sie jemals Ada programmiert?):IS
Trennt 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 dasIS
durchaus Sinn macht und überhaupt kein Füllstoff ist.if x then …
zuif (x) …
. Wir haben ein Paar Klammern gegen ein kontextbezogenes Keyword eingetauscht. Dies ist sinnvoll, da die Bedingungx
ein 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.is
ist ein Füllstoff , weil Ada konnte erlaubt haben ,procedure Hello begin ... end
ohne Zweideutigkeit.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.
quelle
(f ∘ g)(x) = f(g(x))
.g
zuerst auf das Argument angewendet, gefolgt vonf
. Wenn Sie eine Liste sortieren, gruppieren und den ersten Eintrag dieser Listen erhalten möchten, schreiben Sie(map head . group . sort) list
odermap head $ group $ sort list
odermap head (group (sort list))
. In jedem Fall schreiben Sie die Operationen rückwärts. Übrigens können Sie beim ImportierenControl.Arrow
sagen(sort >>> group >>> map head) list
, aber der>>>
Operator sieht für mich ziemlich umständlich und wortreich aus.(map head . group . sort) list
liest sich als "das erste Element jeder Gruppe in einer Art vonlist
", 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
".>>>
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 ...Seit wir im Jahr 2011 sind,
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 ...)
quelle
uint16_t
Werten 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.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.
quelle
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
,while
und 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)
quelle
each
, die einen Codeblock als Argument nimmt. (Ruby hat auchfor
undwhile
Schleifen, aber keindo..while
Schleife 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.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:
Es ist natürlich auch ein Eckpfeiler der Unterstützung für verteiltes / Cloud-Computing.
quelle
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.
quelle
quelle
Hinzufügen einer Funktion zu einer vorhandenen Programmiersprache. Die neue Sprache B ist also die alte Sprache A plus Feature X.
Bestehende Beispiele:
quelle
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.
quelle