Итак, почему создатели Ruby должны были использовать концепцию symbols
в языке?
Ну, они строго не «должны», они решили. Также обратите внимание, что, строго говоря, Symbol
s не являются частью языка, они являются частью базовой библиотеки. Они действительно имеют буквальный синтаксис языка на уровне, но они будут работать так же хорошо , если вы должны были построить их по телефону Symbol::new
.
Я спрашиваю с точки зрения неруби программиста, пытающегося понять это. Я выучил много других языков и ни на одном из них не нашел необходимости указывать, имел ли я дело с тем, что называет Руби symbols
.
Вы не сказали, что это за «множество других языков», но вот лишь небольшая выдержка из языков с Symbol
типом данных, подобным Ruby:
- ECMAScript , также JavaScript
- Scala
- Scheme , Common Lisp , Clojure (также у Clojure есть ключевые слова ), в основном каждый язык в семействе Lisp, его наследниках и кузенах имеет их
- Smalltalk , Newspeak и многие другие языки в семействе Smalltalk (вероятно, откуда их взял Руби), включая Objective-C (хотя и в ограниченной форме)
- Эрланг (называемый атомами ) , также эликсир и LFE
- Юлия
- Пролог (называемый атомами ), который, вероятно, откуда Эрланг получил их
Есть и другие языки, которые предоставляют функции Symbol
s в другой форме. Например, в Java функции Ruby String
делятся на два (фактически три) типа: String
и StringBuilder
/ StringBuffer
. С другой стороны, функции типа Ruby Symbol
объединены в String
тип Java : Java String
могут быть интернированы , литеральные строки и String
s, которые являются результатом вычисляемых во время компиляции константных выражений, автоматически интернируются, динамически генерируемые String
s могут интернироваться с помощью вызова String.intern
метод. Интернированный String
в Java в точности такой же, как Symbol
в Ruby, но он не реализован как отдельный тип, это просто другое состояние, что JavaString
может быть в. (Примечание: в более ранних версиях Ruby String#to_sym
раньше вызывался, String#intern
и этот метод до сих пор существует как устаревший псевдоним.)
Главный вопрос может быть следующим: существует ли концепция symbols
в Ruby как стремление к производительности над собой и другими языками,
Symbol
Это прежде всего тип данных со специфической семантикой . Эта семантика также позволяет реализовать некоторые производительные операции (например, быстрое тестирование на равенство O (1)), но это не главная цель.
или просто то, что нужно для существования из-за того, как написан язык?
Symbol
В языке Ruby они вообще не нужны, без них Ruby прекрасно бы работал. Они являются чисто библиотечной функцией. В языке есть только одно место, которое связано с Symbol
s: def
выражение определения метода соответствует Symbol
обозначению имени определяемого метода. Однако это довольно недавнее изменение, до этого возвращаемое значение просто оставалось неуказанным. МРТ просто оценивали nil
, Рубиния оценивали до Rubinius::CompiledMethod
объекта и так далее. Также было бы возможно оценить к UnboundMethod
... или просто String
.
Будет ли программа на Ruby легче и / или быстрее, чем, скажем, аналог Python или Node? Если так, будет ли это из-за symbols
?
Я не уверен, что вы спрашиваете здесь. Производительность в основном зависит от качества реализации, а не от языка. Кроме того, Node - это даже не язык, а интегрированная среда ввода / вывода для ECMAScript. Запуск эквивалентного скрипта на IronPython и MRI, скорее всего, IronPython будет быстрее. Запуск эквивалентного скрипта на CPython и JRuby + Truffle, JRuby + Truffle, вероятно, будет быстрее. Это не имеет ничего общего с Symbol
s, но с качеством реализации: JRuby + Truffle имеет агрессивно оптимизирующий компилятор, а также весь механизм оптимизации высокопроизводительной JVM, CPython - простой интерпретатор.
Поскольку одним из намерений Ruby является простота чтения и записи для людей, разве его создатели не могли упростить процесс кодирования, внедрив эти улучшения в самом интерпретаторе (как это может быть в других языках)?
Нет, Symbol
это не оптимизация компилятора. Это отдельный тип данных со специфической семантикой. Они не похожи на флаоны YARV , которые являются частной внутренней оптимизацией для Float
s. Ситуация не такая, как для Integer
, Bignum
и Fixnum
, которая должна быть невидимой частной внутренней оптимизацией, но, к сожалению, не так. (Это , наконец , будет исправлена в Рубине 2.4, который удаляет Fixnum
и Bignum
и листья просто Integer
.)
Делать это так, как это делает Java, в качестве особого состояния нормальных String
s означает, что вам всегда нужно проявлять осторожность относительно того, String
находятся ли ваши s в этом специальном состоянии и при каких обстоятельствах они автоматически находятся в этом специальном состоянии, а когда нет. Это гораздо большая нагрузка, чем просто наличие отдельного типа данных.
Будет ли определение символов, не зависящее от языка, и причина их использования на других языках?
Symbol
это тип данных, который обозначает концепцию имени или метки . Symbol
Это ценностные объекты , неизменяемые, обычно немедленные (если язык различает такие вещи), не имеющие состояния и не имеющие идентичности. Два Symbol
s, которые равны, также гарантированно будут идентичны, другими словами, два Symbol
s, которые равны, фактически являются одним и тем же Symbol
. Это означает, что равенство значений и ссылочное равенство - это одно и то же, и, следовательно, равенство эффективно и O (1).
Причины, по которым они есть на языке, на самом деле одинаковы, независимо от языка. Некоторые языки полагаются на них больше, чем другие.
Например, в семействе Лисп нет понятия «переменная». Вместо этого вы Symbol
связались со значениями.
В языках с отражающими или самосозерцательными возможностями, Symbol
s часто используется для обозначения названия отраженных сущностей в API , отражения, например , в Ruby, Object#methods
, Object#singleton_methods
, Object#public_methods
, Object#protected_methods
, и Object#public_methods
возвращать Array
из Symbol
й (хотя они могли бы точно так же возвращать Array
из Method
с). Object#public_send
принимает Symbol
обозначение имени сообщения для отправки в качестве аргумента (хотя оно также принимает String
и, Symbol
более семантически правильно).
В ECMAScript Symbol
s являются фундаментальным строительным блоком обеспечения безопасности ECMAScript в будущем. Они также играют большую роль в отражении.