Warum mussten Ruby-Schöpfer das Konzept von symbolsin der Sprache verwenden?
Nun, sie mussten es nicht unbedingt, sie entschieden sich dafür. Beachten Sie auch, dass Symbols streng genommen nicht Teil der Sprache sind, sondern Teil der Kernbibliothek. Sie haben eine Literal-Syntax auf Sprachebene, aber sie funktionieren genauso gut, wenn Sie sie durch Aufrufen erstellen müssten Symbol::new.
Ich frage aus der Perspektive eines Nicht-Rubin-Programmierers, der versucht, es zu verstehen. Ich habe viele andere Sprachen gelernt und in keiner festgestellt, dass ich angeben muss, ob ich mit Ruby zu tun habe oder nicht symbols.
Sie haben nicht gesagt, was diese "vielen anderen Sprachen" sind, aber hier ist nur ein kleiner Auszug von Sprachen, die einen SymbolDatentyp wie Ruby's haben:
Es gibt auch andere Sprachen, die die Funktionen von Symbols in einer anderen Form bereitstellen . In Java sind die Funktionen von Ruby's Stringbeispielsweise in zwei (tatsächlich drei) Typen unterteilt: Stringund StringBuilder/ StringBuffer. Andererseits werden die Merkmale des Ruby- SymbolTyps in den Java- StringTyp zusammengefasst: Java Stringkann interniert werden , Literalzeichenfolgen und Strings, die das Ergebnis von zur Kompilierungszeit bewerteten konstanten Ausdrücken sind, werden automatisch interniert, dynamisch erzeugte Strings können durch Aufrufen interniert werden die String.internMethode. Ein Internierter Stringin Java ist genau wie ein Internierter in SymbolRuby, wird jedoch nicht als separater Typ implementiert, sondern ist nur ein anderer Status als ein JavaStringkann in sein. (Hinweis: In früheren Ruby-Versionen wurde diese Methode String#to_symfrüher aufgerufen String#internund ist heute noch als Legacy-Alias vorhanden.)
Die Hauptfrage könnte lauten: Existiert das Konzept von symbolsin Ruby als Leistungsabsicht über sich selbst und andere Sprachen,
Symbols sind in erster Linie ein Datentyp mit spezifischer Semantik . Diese Semantik ermöglicht es auch, einige performante Operationen (z. B. schnelle O (1) -Gleichheitstests) zu implementieren, aber das ist nicht der Hauptzweck.
oder nur etwas, das aufgrund der Art und Weise, wie die Sprache geschrieben ist, existieren muss?
Symbols werden in der Ruby-Sprache überhaupt nicht benötigt, ohne sie würde Ruby problemlos funktionieren. Sie sind eine reine Bibliotheksfunktion. Es gibt genau eine Stelle in der Sprache, die mit Symbols verknüpft ist : Ein defMethodendefinitionsausdruck ergibt einen SymbolWert, der den Namen der Methode angibt, die definiert wird. Dies ist jedoch eine relativ neue Änderung. Zuvor wurde der Rückgabewert einfach nicht angegeben. Die MRT- nilUntersuchung ergab lediglich eine Bewertung , Rubinius eine Bewertung für ein Rubinius::CompiledMethodObjekt und so weiter. Es wäre auch möglich, zu einem UnboundMethod... oder nur zu einem ... zu bewerten String.
Wäre ein Programm in Ruby leichter und / oder schneller als das Gegenstück in Python oder Node? Wenn ja, würde es daran liegen symbols?
Ich bin nicht sicher, was Sie hier fragen. Leistung ist meist eine Frage der Implementierungsqualität, nicht der Sprache. Außerdem ist Node nicht einmal eine Sprache, sondern ein ereignisgesteuertes E / A-Framework für ECMAScript. Durch Ausführen eines entsprechenden Skripts in IronPython und MRI ist IronPython wahrscheinlich schneller. Das Ausführen eines entsprechenden Skripts auf CPython und JRuby + Truffle, JRuby + Truffle ist wahrscheinlich schneller. Dies hat nichts mit Symbols zu tun, sondern mit der Qualität der Implementierung: JRuby + Truffle verfügt über einen aggressiv optimierenden Compiler sowie die gesamte Optimierungsmaschinerie einer leistungsstarken JVM. CPython ist ein einfacher Interpreter.
Da es Rubys Absicht ist, für Menschen leicht zu lesen und zu schreiben, könnten die Entwickler den Codierungsprozess nicht dadurch vereinfachen, dass sie diese Verbesserungen im Interpreter selbst implementieren (wie es in anderen Sprachen der Fall sein könnte)?
Nr. SymbolS sind keine Compiler-Optimierung. Sie sind ein separater Datentyp mit spezifischer Semantik. Sie sind nicht wie die Flonums von YARV , die eine private interne Optimierung für Floats darstellen. Die Situation ist nicht die gleiche wie für Integer, Bignumund Fixnum, was sein soll , eine unsichtbare private interne Optimierung Detail, aber leider ist es nicht. (Dies wird endlich in Ruby 2.4 behoben, das nur entfernt Fixnumund Bignumund verlässt Integer.)
Wenn Sie dies wie in Java tun, bedeutet dies, Stringdass Sie als normaler Zustand immer vorsichtig sein müssen, ob sich Ihre Strings in diesem speziellen Zustand befinden und unter welchen Umständen sie sich automatisch in diesem speziellen Zustand befinden und wann nicht. Das ist eine viel höhere Belastung als ein separater Datentyp.
Gibt es eine sprachunabhängige Definition von Symbolen und einen Grund, sie in anderen Sprachen zu haben?
Symbolist ein Datentyp, der das Konzept bezeichnet Namen oder Etikett . Symbols sind Wertobjekte , unveränderlich, normalerweise unmittelbar (wenn die Sprache so etwas unterscheidet), staatenlos und haben keine Identität. Zwei Symbolgleiche sind garantiert auch identisch, dh zwei Symbolgleiche sind eigentlich dasselbe Symbol. Dies bedeutet, dass Wertgleichheit und Referenzgleichheit dasselbe sind, und somit ist Gleichheit effizient und O (1).
Die Gründe, sie in einer Sprache zu haben, sind wirklich die gleichen, unabhängig von der Sprache. Einige Sprachen stützen sich mehr auf sie als andere.
In der Lisp-Familie gibt es zum Beispiel kein Konzept von "Variable". Stattdessen haben Sie Symbols mit Werten verknüpft.
In Sprachen mit reflektierenden oder introspektiven Fähigkeiten, Symbolwerden s häufig verwendet , um die Namen von reflektiertem Einheiten in dem Reflexions APIs zu bezeichnen, zum Beispiel in Ruby, Object#methods, Object#singleton_methods, Object#public_methods, Object#protected_methods, und Object#public_methodseine Rückkehr Arrayvon Symbols (obwohl sie genauso gut könnten eine Rückkehr Arrayvon Methods). Object#public_sendNimmt eine SymbolBezeichnung für den Namen der zu sendenden Nachricht als Argument (obwohl auch eine akzeptiert wird String, Symbolist dies semantisch korrekter).
In ECMAScript sind Symbols ein grundlegender Baustein, um ECMAScript in Zukunft funktionssicher zu machen. Sie spielen auch eine große Rolle bei der Reflexion.