Ich bin derzeit hauptsächlich ein D- Programmierer und möchte meiner Toolbox eine weitere Sprache hinzufügen, vorzugsweise eine, die die Metaprogrammierungs-Hacks unterstützt, die in einer statisch kompilierten Sprache wie D einfach nicht möglich sind.
Ich habe ein wenig über Lisp gelesen und würde gerne eine Sprache finden, die einige der coolen Sachen erlaubt, die Lisp macht, aber ohne die seltsame Syntax usw. von Lisp. Ich möchte keinen Sprachflammenkrieg beginnen, und ich bin sicher, dass sowohl Ruby als auch Python ihre Kompromisse haben, also werde ich auflisten, was mir persönlich wichtig ist. Bitte sagen Sie mir, ob Ruby, Python oder eine andere Sprache für mich am besten geeignet ist.
Wichtig:
- Gute Metaprogrammierung. Möglichkeit zum Erstellen von Klassen, Methoden, Funktionen usw. zur Laufzeit. Vorzugsweise minimale Unterscheidung zwischen Code und Daten, Lisp-Stil.
- Schöne, saubere, vernünftige Syntax und konsistente, intuitive Semantik. Grundsätzlich eine gut durchdachte, unterhaltsame, moderne Sprache.
- Mehrere Paradigmen. Kein Paradigma ist für jedes Projekt oder sogar jedes kleine Teilproblem innerhalb eines Projekts richtig.
- Eine interessante Sprache, die tatsächlich die Art und Weise beeinflusst, wie man über Programmierung denkt.
Etwas wichtig:
- Performance. Es wäre schön, wenn die Leistung anständig wäre, aber wenn Leistung eine echte Priorität ist, verwende ich stattdessen D.
- Gut dokumentiert.
Nicht wichtig:
- Community-Größe, Bibliotheksverfügbarkeit usw. Keines davon ist ein Merkmal der Sprache selbst, und alle können sich sehr schnell ändern.
- Verfügbarkeit von Arbeitsplätzen. Ich bin kein hauptberuflicher Programmierer. Ich bin ein Student und Programmierung ist tangential relevant für meine Forschung.
- Alle Funktionen, die hauptsächlich für sehr große Projekte entwickelt wurden, an denen eine Million Code-Affen arbeiten.
python
ruby
lisp
metaprogramming
dsimcha
quelle
quelle
Antworten:
Zumindest auf ideologischer Ebene gibt es keinen großen Unterschied zwischen Python und Ruby. Zum größten Teil sind sie nur verschiedene Geschmacksrichtungen derselben Sache. Daher würde ich empfehlen zu sehen, welcher besser zu Ihrem Programmierstil passt.
quelle
Würden wir nicht alle.
Leider sind die minimale Unterscheidung zwischen Code und Daten und die "seltsame" Syntax Konsequenzen voneinander.
Wenn Sie eine einfach zu lesende Syntax wünschen, haben Sie Python. Der Code wird jedoch in keiner der häufig verwendeten integrierten Datenstrukturen dargestellt. Es schlägt - wie die meisten Sprachen - in Punkt 1 Ihrer "wichtigen" Liste fehl. Das macht es schwierig, nützliche Hilfe zu leisten.
Du kannst nicht alles haben. Denken Sie daran, Sie sind nicht die Ersten, die diesen Gedanken haben. Wenn so etwas wie Ihre ideale Sprache existieren würde, würden wir sie alle verwenden. Da die reale Welt nicht Ihren Idealen entspricht, müssen Sie Ihre Wunschliste neu priorisieren. Der "wichtige" Abschnitt muss neu angeordnet werden, um zu identifizieren, was ist wirklich wichtig ist.
quelle
Ehrlich gesagt sind sich Ruby und Python in Bezug auf Metaprogrammierfunktionen viel ähnlicher, als einige ihrer Anhänger gerne zugeben. Diese Bewertung beider Sprachen bietet einen ziemlich guten Vergleich / Bewertung:
Wählen Sie also einfach eine anhand einiger Kriterien aus. Vielleicht magst du Rails und möchtest diesen Code studieren. Vielleicht ist SciPy dein Ding. Schauen Sie sich das Ökosystem von Bibliotheken, Communitys usw. an und wählen Sie eines aus. Sie werden sicherlich kein Metaprogrammier-Nirvana verlieren, das auf Ihrer Wahl basiert.
quelle
Haftungsausschluss: Ich beschäftige mich nur mit beiden Sprachen, habe aber in beiden Sprachen zumindest kleine Arbeitsprogramme geschrieben (nicht nur schnelle Skripte, für die ich Perl, Bash oder GNU make verwende).
Ruby kann für Punkt 3 "Mehrere Paradigmen" sehr hilfreich sein, da es schwierig ist, die Erstellung domänenspezifischer Sprachen zu vereinfachen. Durchsuchen Sie beispielsweise online und sehen Sie sich ein paar Teile Ruby on Rails-Code und ein paar Teile Rake-Code an. Sie sind beide Ruby, und Sie können die Ähnlichkeiten erkennen, aber sie sehen nicht so aus, wie Sie es normalerweise als dieselbe Sprache betrachten würden.
Python scheint mir etwas vorhersehbarer zu sein (möglicherweise korreliert mit 'sauberem' und 'gesundem' Punkt 2), aber ich weiß nicht wirklich, ob dies an der Sprache selbst liegt oder nur daran, dass es normalerweise von Menschen mit unterschiedlichen Werten verwendet wird . Ich habe noch nie tiefe Magie in Python versucht. Ich würde sicherlich sagen, dass beide Sprachen gut durchdacht sind.
Beide punkten gut in 1 und 4. [Bearbeiten: Eigentlich ist 1 ziemlich umstritten - es gibt "eval" in beiden, wie es in interpretierten Sprachen üblich ist, aber sie sind konzeptionell kaum rein. Sie können Abschlüsse definieren, Objekten Methoden zuweisen und so weiter. Ich bin mir nicht sicher, ob dies so weit geht, wie du willst.]
Persönlich finde ich Ruby lustiger, aber zum Teil liegt es daran, dass es einfacher ist, sich von coolen Methoden ablenken zu lassen. Ich habe tatsächlich mehr Python verwendet. Manchmal willst du nicht cool, du willst damit weitermachen, also ist es vor dem Schlafengehen erledigt ...
Keiner von beiden ist schwer zu erreichen, daher können Sie sich einfach dafür entscheiden, Ihre nächste kleinere Aufgabe in einer und die nachfolgende in der anderen zu erledigen. Oder holen Sie sich jeweils ein Einführungsbuch aus der Bibliothek, lesen Sie beide durch und sehen Sie, was Sie begeistert.
quelle
Haben Sie über Smalltalk nachgedacht? Es bietet eine sehr einfache, klare und erweiterbare Syntax mit Funktionen für Reflektivität und Selbstbeobachtung sowie eine vollständig integrierte Entwicklungsumgebung, die diese Funktionen nutzt. Schauen Sie sich zum Beispiel einige der Arbeiten an, die in Squeak Smalltalk ausgeführt werden. Viele Forscher, die Squeak verwenden, stehen auf der Squeak-Mailingliste und #squeak auf freenode ab, sodass Sie sehr einfach Hilfe bei komplexen Problemen erhalten können.
Weitere Indikatoren für die aktuelle Relevanz: Es läuft auf jeder Plattform, die Sie benennen möchten (einschließlich des iPhone ). Gilad Bracha stützt seine Newspeak-Arbeit auf Squeak; Das V8-Team hat sich bei Smalltalk-VMs die Zähne geschnitten . und Dan Ingalls und Randal Schwartz sind kürzlich nach Jahren in der Wildnis zu Smalltalk zurückgekehrt.
Viel Glück bei Ihrer Suche - lassen Sie uns wissen, was Sie am Ende entscheiden.
quelle
Lisp erfüllt alle Ihre Kriterien, einschließlich der Leistung, und ist die einzige Sprache, die keine (seltsame) Syntax hat. Wenn Sie es auf solch erstaunlich schlecht informierter / falscher Basis meiden und folglich die Erfahrung verpassen, z. B. Emacs + SLIME + CL zu verwenden, werden Sie sich selbst einen großen Nachteil erweisen.
quelle
Ihre 4 "wichtigen" Punkte führen genau zu Ruby, während die 2 "etwas wichtigen" Punkte von Python regiert werden. So sei es.
quelle
Sie beschreiben Ruby.
Es ist sehr einfach, vorhandene Grundelemente zur Laufzeit zu erweitern und zu ändern. In Ruby ist alles ein Objekt, Zeichenfolgen, Ganzzahlen, sogar Funktionen.
Sie können auch Verknüpfungen für syntaktischen Zucker erstellen , z. B. mit class_eval .
Ruby folgt dem Prinzip der weniger Überraschung , und wenn Ruby-Code mit dem Äquivalent in einer anderen Sprache verglichen wird, halten viele Leute ihn für "schöner".
Sie können imperativ, objektorientiert, funktional und reflektierend folgen.
Das ist sehr subjektiv, aber aus meiner Sicht ermöglicht die Fähigkeit, viele Paradigmen gleichzeitig zu verwenden, sehr interessante Ideen.
Ich habe Python ausprobiert und es passt nicht zu Ihren wichtigen Punkten.
quelle
lambda
/Proc.new
mess hier auf SO als "überraschendes Verhalten" und "sehr eingängig" bezeichnet. :-) Jede Sprache, die so groß und komplex wie Ruby ist, muss solche verwirrenden Bereiche haben.String
in Ruby für Metaprogrammierungszwecke: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Unterklassen würden nicht reichen; Eine einfache Funktion mit zwei Argumenten wäre jedoch.Vergleichen Sie Codebeispiele , die dasselbe tun (mit einer nicht leeren Newline-Beschreibung von Elementen aus einer
myList
Liste verbinden), in verschiedenen Sprachen (Sprachen sind in umgekehrter alphabetischer Reihenfolge angeordnet):Ruby :
Oder
Python :
Oder
Perl :
Oder
Javascript :
Io :
Hier ist eine Io-Anleitung .
quelle
Ruby wäre besser als Lisp, wenn es darum geht , "Mainstream" zu sein (was auch immer das wirklich bedeutet, aber ein realistisches Problem ist, wie einfach es wäre, Antworten auf Ihre Fragen zur Lisp-Programmierung zu finden, wenn Sie damit anfangen würden.) Auf jeden Fall Ich fand Ruby sehr leicht zu erlernen. In der gleichen Zeit, die ich zum ersten Mal mit Python (oder anderen Sprachen) verbracht hatte, schrieb ich bald besseren Code viel effizienter als jemals zuvor. Das ist jedoch nur die Meinung einer Person; Nimm es mit einem Körnchen Salz, denke ich. Ich weiß zu diesem Zeitpunkt viel mehr über Ruby als Python oder Lisp, aber Sie sollten wissen, dass ich eine ganze Weile eine Python-Person war, bevor ich wechselte.
Lisp ist definitiv ziemlich cool und einen Blick wert; Wie Sie sagten, kann sich die Größe der Community usw. sehr schnell ändern. Davon abgesehen ist die Größe selbst nicht so wichtig wie die Qualität der Community. Zum Beispiel ist der
#ruby-lang
Kanal immer noch mit unglaublich klugen Leuten gefüllt. Lisp scheint auch einige wirklich kluge Leute anzulocken. Ich kann nicht viel über die Python-Community sprechen, da ich nicht viel Erfahrung aus erster Hand habe, aber sie scheint manchmal "zu groß" zu sein. (Ich erinnere mich, dass die Leute auf ihrem IRC-Kanal ziemlich unhöflich waren, und was ich von Freunden gehört habe, die Python wirklich mögen, scheint eher die Regel als die Ausnahme zu sein.)Einige Ressourcen, die Sie möglicherweise nützlich finden, sind:
1) Die Ruby Metaprogramming-Reihe der Pragmatischen Programmierer ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - nicht kostenlos, aber die späteren Folgen sind ziemlich faszinierend. (Der Code ist kostenlos, wenn Sie ihn herunterladen und sehen möchten, was Sie lernen würden.)
2) Über Lisp von Paul Graham ( http://www.paulgraham.com/onlisp.html ). Es ist ein bisschen alt, aber es ist ein Klassiker (und kostenlos herunterladbar).
quelle
Ich verwende Python für viele Projekte und ich denke, Python bietet alle Funktionen, nach denen Sie gefragt haben.
wichtig:
Etwas wichtig:
Als Student möchten Sie vielleicht dieses Papier lesen, in dem behauptet wird, Python sei alles, was ein Wissenschaftler braucht . Leider kann ich Python nicht mit Ruby vergleichen, da ich diese Sprache nie verwendet habe.
Grüße, Dennis
quelle
@ Jason Ich bin nicht einverstanden. Es gibt Unterschiede, die Ruby Python für die Metaprogrammierung überlegen machen - sowohl philosophisch als auch pragmatisch. Für den Anfang erhält Ruby die Vererbung mit Single Inheritance und Mixins . Und wenn es um Metaprogrammierung geht, muss man einfach verstehen, dass es nur um das Selbst geht . Der kanonische Unterschied besteht darin, dass Sie in Ruby zur Laufzeit Zugriff auf das Selbstobjekt haben - in Python nicht!
Im Gegensatz zu Python gibt es in Ruby keine separate Kompilierungs- oder Laufzeitphase. In Ruby wird jede Codezeile für ein bestimmtes Selbstobjekt ausgeführt . In Ruby erbt jede Klasse sowohl von einem Objekt als auch von einer versteckten Metaklasse. Dies sorgt für eine interessante Dynamik:
Verwenden von self.name greift auf die Metaklasse Ninja Klassen Name Methode den Klassennamen von Ninja zurückzukehren. Blüht die Metaprogrammierung in Python so schön? Ich bezweifle es aufrichtig!
quelle
Wenn Ihnen die Lisp-Syntax nicht gefällt, ist Assembler vielleicht der richtige Weg. :-)
Es hat sicherlich nur eine minimale Unterscheidung zwischen Code und Daten, ist ein Multiparadigma (oder vielleicht ist das kein Paradigma) und es ist eine (erweiterte) Erfahrung, die den Verstand erweitert, sowohl in Bezug auf das Lernen als auch auf die Tricks, die Sie ausführen können.
quelle
Io erfüllt alle Ihre "wichtigen" Punkte. Ich glaube nicht, dass es eine bessere Sprache gibt, um verrückte Meta-Hacker zu betreiben.
quelle
Lisp kann kompiliert werden.
quelle
Hast du Rebol ausprobiert?
quelle
Meine Antwort wäre weder. Ich kenne beide Sprachen, habe einen Kurs über Ruby besucht und programmiere seit mehreren Jahren in Python. Lisp ist gut in der Metaprogrammierung, da sein einziger Zweck darin besteht, Listen zu transformieren. Sein eigener Quellcode ist nur eine Liste von Token, sodass die Metaprogrammierung natürlich ist. Die drei Sprachen, die mir für diese Art von Dingen am besten gefallen, sind Rebol, Forth und Factor. Rebol ist eine sehr starke Dialektsprache, die Code aus ihrem Eingabestream entnimmt, einen Ausdruck gegen ihn ausführt und ihn mithilfe von in der Sprache geschriebenen Regeln transformiert. Sehr ausdrucksstark und sehr gut im Dialektieren. Factor und Forth sind mehr oder weniger vollständig von der Syntax getrennt, und Sie programmieren sie, indem Sie Wörter definieren und aufrufen. Sie sind in der Regel meist in ihrer eigenen Sprache verfasst. Sie schreiben keine Bewerbungen im herkömmlichen Sinne. Sie erweitern die Sprache, indem Sie Ihre eigenen Wörter schreiben, um Ihre spezielle Anwendung zu definieren. Faktor kann besonders schön sein, da er viele Funktionen hat, die ich nur in Smalltalk zum Auswerten und Arbeiten mit Quellcode gesehen habe. Ein wirklich schöner Arbeitsbereich, interaktive Dokumente usw.
quelle
Es gibt nicht wirklich viel, um Python und Ruby zu trennen. Ich würde sagen, die Python-Community ist größer und reifer als die Ruby-Community, und das ist wirklich wichtig für mich. Ruby ist eine flexiblere Sprache, die positive und negative Auswirkungen hat. Ich bin mir jedoch sicher, dass es viele Leute geben wird, die sich mit diesen beiden Sprachen befassen, also werde ich eine dritte Option in den Ring werfen. Wie wäre es mit JavaScript?
JavaScript wurde ursprünglich als Schema für das Web entwickelt und basiert auf Prototypen. Dies ist ein Vorteil gegenüber Python und Ruby, wenn es um Multi-Paradigmen und Metaprogrammierung geht. Die Syntax ist nicht so gut wie die beiden anderen, aber es ist wahrscheinlich die am weitesten verbreitete Sprache, und die Leistung wird von Tag zu Tag besser.
quelle
Wenn Sie das Code-is-Data-Konzept im Lisp-Stil mögen, aber die Lispy-Syntax nicht mögen, ist Prolog vielleicht eine gute Wahl.
Ob dies als "unterhaltsame, moderne Sprache" qualifiziert ist, überlasse ich anderen. ;-);
quelle
Ruby ist meine Wahl, nachdem ich Python, Smalltalk und Ruby erkundet habe.
quelle
Was ist mit OCaml?
OCaml-Funktionen: ein statisches Typsystem, Typinferenz, parametrischer Polymorphismus, Schwanzrekursion, Mustervergleich, erstklassige lexikalische Verschlüsse, Funktoren (parametrische Module), Ausnahmebehandlung und inkrementelle automatische Speicherbereinigung für Generationen.
Ich denke, dass es Folgendes erfüllt:
quelle
Ich habe Python ein bisschen benutzt, aber viel mehr Ruby. Ich würde jedoch argumentieren, dass beide das liefern, wonach Sie gefragt haben.
Wenn ich alle Ihre vier Punkte sehe, können Sie zumindest Folgendes überprüfen: http://www.iolanguage.com/
Und Mozart / Oz könnte auch für Sie interessant sein: http://mozart.github.io/
Grüße Friedrich
quelle
Informationen zur Syntax im Python-Stil und zu lisp-ähnlichen Makros (Makros, bei denen es sich um echten Code handelt) sowie zu gutem DSL finden Sie unter Konvergenz .
quelle
Ich bin nicht sicher, ob Python alle gewünschten Dinge erfüllen würde (insbesondere den Punkt über die minimale Unterscheidung zwischen Code und Daten), aber es gibt ein Argument für Python. Es gibt ein Projekt, mit dem Sie problemlos Erweiterungen für Python in D programmieren können, damit Sie das Beste aus beiden Welten genießen können. http://pyd.dsource.org/celerid.html
quelle
Wenn du die Rose liebst, musst du lernen, mit den Dornen zu leben :)
quelle
Ich würde empfehlen, dass Sie mit Ruby gehen.
Als ich anfing, es zu lernen, fand ich es wirklich einfach, es zu lernen.
quelle
Mischen Sie Ruby-Programmiersprache nicht mit Ruby-Implementierungen, da POSIX-Threads in Ruby nicht möglich sind.
Sie können einfach mit pthread-Unterstützung kompilieren, und dies war bereits zum Zeitpunkt der Erstellung dieses Threads möglich , wenn Sie das Wortspiel entschuldigen.
Die Antwort auf diese Frage ist einfach. Wenn Sie Lisp mögen, werden Sie wahrscheinlich Rubin bevorzugen. Oder was auch immer du magst.
quelle
Ich schlage vor, dass Sie beide Sprachen ausprobieren und diejenige auswählen, die Sie anspricht. Sowohl Python als auch Ruby können tun, was Sie wollen.
Lesen Sie auch diesen Thread .
quelle
Gehen Sie mit JS und sehen Sie sich AJS (Alternative JavaScript Syntax) unter meinem Github http://github.com/visionmedia an. Dadurch erhalten Sie einige sauberer aussehende Verschlüsse usw .: D.
quelle
In Bezug auf Ihren Hauptpunkt (Metaprogrammierung): In Version 1.6 von Groovy ist die AST-Programmierung (Abstract Syntax Tree) als Standard- und integrierte Funktion integriert. Ruby hat RubyParser, aber es ist ein Add-On.
quelle