Auf der Suche nach einer guten funktionalen / oop / meta Programmiersprache mit: [geschlossen]

9

Ich will es wird

  • native Codegenerierung // Kann mit so etwas wie GHC kompiliert werden
  • plattformübergreifend (win / linux)
  • Funktional und etwas objektorientiert
  • Lambdas, Pattern Matching, Tupel und andere funktionale Dinge
  • Großartige Unterstützung für die Metaprogrammierung
  • Einrückungs- und Mindestgrenzen
  • statische Eingabe
  • Ich möchte auch Mixin- Unterstützung :)
  • Die Möglichkeit, Websites basierend auf einigen Frameworks zu erstellen, ist ebenfalls ein gutes Plus.
  • Also und ja, Leistung und Stabilität sind wichtig.

Ich habe Haskell gestartet , bin mir aber immer noch nicht sicher, weil es OCaml gibt. Und ich habe F # Erfahrung. Aber soweit ich weiß, ist OCalm ein bisschen OOP und manchmal sogar schneller (nicht sicher), ich habe es nie ausprobiert. Es gibt auch erlang, ich weiß nichts über erlang . Und vielleicht fehlt mir noch etwas ..? Python , ich habe keine Ahnung von Python hier, es ist funktional und es ist oop und es unterstützt Mixin und beliebt und schnell, aber ich glaube nicht wirklich, dass Python für all die funktionale Magie geeignet ist, ich denke es kann nicht.

Ich weiß, dass dieser Thread / dieses Thema wie ein Reden über nichts oder wie ein Sprachkrieg ist, aber ich bin ernsthaft und möchte wirklich Ihre Vision davon hören.

cnd
quelle
2
Ich denke, dass das Erfordernis der nativen Codegenerierung die Optionen stark einschränkt. Ich denke, Nemerle ist einen Versuch wert.
back2dos
@ back2dos ye, ich mag Nemerle, aber es mit Mono für kleine Utils oder Web zu verwenden, ist ein bisschen ODD-Job. Ich glaube schon. Und der Einzug bekam immer noch schlechte Unterstützung. Ich benutze Nemerle, aber manchmal. Im Moment benutze ich es weniger als F #.
CND
Sieht so aus, als ob Sie C ++ mit einem (Laufzeit-) Funktionsparadigma möchten (es hat bereits ein Funktionsparadigma zur Kompilierungszeit).
Klaim
@Klaim Ich will wirklich kein C ++. Generieren von nativem Code mit ghc -> gcc ist für mich in Ordnung.
cnd
2
Eine Sprache mit all diesen Anforderungen? Wahrscheinlich eine, die du selbst schreibst.
Rein Henrichs

Antworten:

8

Clojure scheint ziemlich gut zu all Ihren Anforderungen zu passen.

  • Native Code-Generierung / Kann mit etwas wie GHC kompiliert werden - Ja (der gesamte Clojure-Code wird in Java-Bytecode kompiliert, der anschließend über JIT in der JVM in nativen Code kompiliert wird.)

  • plattformübergreifend (Win / Linux) - Ja - überall dort, wo die JVM ausgeführt wird

  • Funktional und etwas objektorientiert - Ja - Clojure ist in erster Linie eine funktionale Sprache, bietet aber auch OO-Unterstützung, wenn Sie dies wünschen (entweder über Java-Interoperabilität oder Objekte im CL-Stil). Trotzdem wird OO in Clojure allgemein als unidiomatisch angesehen.

  • Lambdas, Pattern Matching, Tupel und andere funktionale Dinge - Ja - diesbezüglich ist es eine ziemlich standardmäßige funktionale Sprache. Der Autor (Rich Hickey) war etwas von Haskell inspiriert.

  • Hervorragende Unterstützung für die Metaprogrammierung - Ja - "Code-is-Data" gilt wie bei allen Lisps und Sie erhalten eine hervorragende Makrofunktionalität

  • Einrückung und Mindestgrenzen - Ja, obwohl dies sicherlich eher ein Editor als eine Sprachfunktion ist ?

  • statische Eingabe - Ja - Clojure ist standardmäßig dynamisch, Sie können jedoch jederzeit statische oder primitive Typhinweise für eine Leistungssteigerung bereitstellen

  • Ich möchte auch Mixin-Unterstützung :) - Ja - kann auf verschiedene Arten (z. B. Makros) erreicht werden, obwohl Sie es wahrscheinlich nicht wollen oder brauchen, nachdem Sie die Protokollfunktionalität von Clojure entdeckt haben ....

  • Die Möglichkeit, Websites basierend auf einigen Frameworks zu erstellen, ist ebenfalls ein gutes Plus. - Ja - es gibt Frameworks wie Ring / Compojure in Clojure und Sie können auch beliebige Java-Frameworks verwenden

  • Also und ja, Leistung und Stabilität sind wichtig. - Ja - Sie erhalten im Grunde die gesamte Leistung / Stabilität der JVM, die in Unternehmensanwendungen ziemlich gut bewiesen ist.

Abgesehen davon verfügt Clojure über einige wirklich beeindruckende Funktionen rund um die Parallelität. Es lohnt sich wirklich, dieses Video anzuschauen: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

mikera
quelle
1
"Alles wird über JIT in der JVM zu nativem Code kompiliert" Völlig falsch ... in nativem Code kompiliert bedeutet, dass wir so etwas wie eine virtuelle Maschine nicht benötigen. Hier brauchen wir es.
BenjaminB
1
Es hängt davon ab, warum Sie nativen Code benötigen. Wenn Sie sich nur um die Leistung im eingeschwungenen Zustand kümmern, ist die JVM mit nativem Code absolut auf dem neuesten Stand. Wenn Sie native Bibliotheken benötigen, können Sie JNI aus der JVM verwenden (was für Echtzeit-3D-Spiele gut genug ist). Wenn Sie jedoch eine Startzeit in Millisekunden benötigen oder schwerwiegende Speicherbeschränkungen wie bei einem eingebetteten Gerät haben, ist die JVM möglicherweise nicht ideal.
Mikera
mikera, Sie möchten möglicherweise auch eine einfache Bereitstellung (eine Abhängigkeit weniger für ein Linux-Paket oder keine Anforderung, dass der Benutzer die JRE unter Windows installieren muss, möglicherweise sogar, um jemandem eine EXE- oder Elfen-Datei zu geben). Ja, nur eine Binärdatei anzugeben ist ein Eckfall, aber dennoch ist dies mit einer nativen Anwendung möglich, jedoch nicht mit einem Programm, das die JVM benötigt.
Alexander
1
@Alexander - stimmen Sie zu, dass Sie eine einfache Bereitstellung wünschen, obwohl dies abhängig von Ihrer Perspektive auf Abhängigkeiten immer noch ein Pluspunkt für Clojure sein kann: Clojure-Apps haben genau eine direkte Abhängigkeit (die JVM), während eine native Binärdatei mindestens zwei (das Betriebssystem) hat und die spezifische Hardwarearchitektur)
Mikera
"Alles wird über JIT auf der JVM zu nativem Code kompiliert": NEIN. (Klären Sie das und ich entferne meine -1)
Haylem
8

Common Lisp

Es scheint alle oben genannten Anforderungen zu unterstützen. Über den Link gelangen Sie zu einem Online-Buch, das alles enthält, was Sie wissen müssen, um loszulegen.

Gary Rowe
quelle
1
Common Lisp generiert nativen Code?
Klaim
6
@Klaim: Common Lisp ist die Programmiersprache. Programmiersprachen generieren keinen Code, Compiler schon. Genau wie für so ziemlich jede andere Programmiersprache auf dem Planeten (C, C ++, Java, Ruby, ECMAScript, wie Sie es nennen) gibt es Compiler für Common Lisp, die nativen Code generieren. Und genau wie bei so ziemlich jeder anderen Programmiersprache gibt es Compiler, die JVML-Bytecode, CIL-Bytecode, C-Quellcode und ECMAScript-Quellcode generieren. Und genau wie bei so ziemlich jeder anderen Programmiersprache gibt es Dolmetscher.
Jörg W Mittag
2
@Klaim: Sprechen Sie über die evalFunktion? Es ist nur eine Funktion, die Sie nach Belieben implementieren können. Einige Implementierungen verfügen über einen separaten Interpreter, den sie mit der kompilierten ausführbaren Datei liefern. Einige versenden nur den Compiler selbst mit der kompilierten ausführbaren Datei. Einige kompilieren den Code sowieso nur zur Laufzeit. Und wenn Sie zu Makros sprechen: diejenigen nur ausführen Kompilierung sowieso. Das ist das Schöne daran.
Jörg W Mittag
2
@nCdy Die () s in Lisp entstehen durch die Bereitstellung einer Syntax zur Unterscheidung zwischen Listen und Atomen innerhalb eines s-Ausdrucks.
Gary Rowe
1
@ Jörg W Mittag: Ich fange an , dass Sie sich wie zu vermuten , zu sagen , das Wort „orthogonal“. ;)
FrustratedWithFormsDesigner
5

OCaml ist die einzige Sprache, die alle von Ihnen gewünschten Funktionen bietet. (Aber ich weiß es nicht für Mixin.) Es hat sogar ein Webframework namens Ocsigen und es ist mehr als eine Hype-Sprache, es ist eine alte Sprache, mit einer echten Benutzerbasis (Unternehmen, Universitäten, Hobbyisten) und jahrelangen Verbesserungen und Tests .

BenjaminB
quelle
2
Die Metaprogrammierung erfolgt jedoch nur mit einem externen Tool in einem Durchgang (CamlP4).
SK-Logik
Beachten Sie, dass einige der heutigen "Hype-Sprachen" möglicherweise zu den "alten Sprachen" von morgen werden, mit einer echten Benutzerbasis [...] und jahrelangen Verbesserungen und Tests ". Sie könnten sogar das gleiche Maß an Marktdurchdringung und öffentlicher Akzeptanz erreichen. :)
Haylem
2

Auf jeden Fall kann Scala Ihren Anforderungen entsprechen:

  1. kompiliert und läuft auf JVM, so dass es Win / Linux / Mac ist.
  2. unterstützt sowohl funktionale als auch OO-Programmierung.
  3. Es unterstützt funktionale Dinge, die Sie erwähnen. Pattern Matching sieht gut aus und wird aktiv genutzt. Es fehlt die Unterstützung für die Schwanzrekursion, da JVM dies nicht unterstützt, aber Rekursionsaufrufe können in einigen Fällen optimiert werden.
  4. Metaprogrammierung wird nicht unterstützt. Die Sprache ist großartig ^ W ziemlich gut für DSL. (Fest)
  5. es hat Mixins (Eigenschaften).
  6. Schauen Sie sich das Lift Web Framework an. Es verwendet funktionale Merkmale der Sprache und verfügt über erweiterte Funktionen, die sehr interessant anzusehen sind. Es gibt auch einige andere Web-Frameworks (play!, Etc.)
  7. basierend auf JVM so stabil.
  8. Die Syntax ist ziemlich sauber. Dort drüben gibt es keine Hölle in Klammern (sorry lispers, das ist nur meine persönliche Meinung) und die Verwendung von Semikolons ist in vielen Fällen auf optional reduziert.

Darüber hinaus bietet Scala eine hervorragende Unterstützung für die parallele Programmierung (durch Schauspieler). Die Scala-Community wächst und wird in realen Projekten (Twitter) verwendet. Die Sprache ist ziemlich schwer zu lernen, da sie viele Funktionen und syntaktischen Zucker enthält, aber sobald Sie damit fertig sind, werden Sie sicherlich Spaß daran haben, damit zu programmieren.

Sinn ergeben
quelle
Im Vergleich zu clojure Scala Merkmale erlaubt mixin composistion in welcher Eigenschaft (Schnittstelle) Klassen über erben kann Typ-Linearisierungs .
Prasonscala
2
4. Metaprogrammierung wird überhaupt nicht unterstützt. DSLs werden in Funktionen höherer Ordnung und Überladung ohne Hilfe der Metaprogrammierung implementiert. Infolgedessen sind diese DSLs begrenzt, einschränkend und langsam. In Scala ist keine Codegenerierung zur Kompilierungszeit verfügbar. Nichts wie Lisp-Makros.
SK-Logik
Ich mag Scala-Syntax doch nicht wirklich ... Es ist persönlich)
cnd
1
@ SK-Logik Ich habe es überprüft und jetzt stimme ich Ihnen zu. Nachdem ich "DSL in Aktion" durchgesehen hatte und es ein Scala DSL-Beispiel gab, dachte ich, dass es für DSL in Ordnung ist. Offensichtlich wird Lisp, Clojure hier viel besser funktionieren.
Make_sense