Peki, Ruby içerik oluşturucuları neden symbolsdilde kavramını kullanmak zorunda kaldı ?
Tamamen “yapmak zorunda değiller”, seçtiler. Ayrıca, kesinlikle konuşmanın Symboldilin bir parçası olmadığını, çekirdek kütüphanenin bir parçası olduğunu unutmayın . Onlar do dil düzeyinde değişmez sözdizimini var, ancak arayarak bunları inşa etmek olsaydı onlar sadece de çalışmak Symbol::new.
Bunu anlamaya çalışan yakut olmayan bir programcının bakış açısından soruyorum. Başka birçok dil öğrendim ve hiçbirinde Ruby'nin dediği şeyle ilgilenip ilgilenmediğimi belirtmem gerekmedi symbols.
Bu "diğer birçok dillerin" ne olduğunu söylemediniz, ama işte SymbolRuby'nin veri tipine sahip küçük bir dil alıntısı :
- ECMAScript , ayrıca JavaScript
- Scala
- Şema , Ortak Lisp , Clojure (ayrıca, Clojure'un anahtar kelimeleri vardır ), temelde Lisp ailesindeki her dil, halefleri ve kuzenleri bunlara sahiptir
- Smalltalk , Newspeak ve Smalltalk ailesindeki (Ruby'nin onları nereden aldığı büyük olasılıkla), Objective-C (sınırlı da olsa)
- Erlang ( atom adı verilir ) , ayrıca İksir ve LFE
- Julia
- Prolog ( atom adı verilir ), bu da Erlang'ın onları aldığı yer
Ayrıca Symbols'nin özelliklerini farklı bir biçimde sağlayan başka diller de vardır . Örneğin Java'da Ruby'nin özelliklerinin özellikleri Stringiki (aslında üç) türe ayrılır: Stringve StringBuilder/ StringBuffer. Öte yandan, Ruby'nin özellikleri Symboltürü Java içine katlanır Stringtip: Java Stringler edilebilir enterne , edebi dizeleri ve Stringdeğerlendirilir sabit ifadeler otomatik olarak enterne edilmiştir derleme zamanında sonucudur ler, dinamik olarak oluşturulmuş Stringler arayarak staj edilebilir String.internyöntemi. StringJava'da bir stajyer , SymbolRuby'de olduğu gibi , ancak ayrı bir tür olarak uygulanmaz, bir Java'nınString(Not: Ruby'nin önceki sürümlerinde, önceden String#to_symçağrılmıştı String#internve bu yöntem bugün eski bir takma ad olarak varlığını sürdürüyor.)
Ana soru şu olabilir: symbolsRuby'deki kavram, kendisi ve diğer diller üzerinde bir performans niyeti olarak var mı ,
Symbols her şeyden önce belirli semantiğe sahip bir veri tipidir . Bu semantik ayrıca bazı performans işlemlerinin (örneğin hızlı O (1) eşitlik testi) uygulanmasını mümkün kılar, ancak bu temel amaç değildir.
ya da sadece dilin yazılma şekli nedeniyle var olması gereken bir şey mi?
SymbolRuby dilinde hiç gerekli değildir, Ruby onlarsız iyi çalışır. Bunlar tamamen bir kütüphane özelliğidir. D'de Symbols'ye bağlı tam olarak bir yer vardır : bir defyöntem tanımı ifadesi Symbol, tanımlanmakta olan yöntemin adını göstererek değerlendirilir . Ancak, bu oldukça yeni bir değişikliktir, bundan önce dönüş değeri basitçe belirtilmemiş olarak bırakılmıştır. MRG basitçe değerlendirdi nil, Rubinius bir Rubinius::CompiledMethodnesneyi değerlendirdi, vs. Ayrıca bir UnboundMethod… ya da sadece a'yı değerlendirmek de mümkün olacaktır String.
Ruby'deki bir program, Python veya Node muadili olandan daha hafif ve / veya daha hızlı olur mu? Eğer öyleyse, bunun nedeni olabilir symbolsmi?
Burada ne istediğini bilmiyorum. Performans, dil değil, çoğunlukla uygulama kalitesi meselesidir. Ayrıca, Düğüm bir dil bile değil, ECMAScript için olaylı bir G / Ç çerçevesi. IronPython ve MRI'da eşdeğer bir komut dosyası çalıştıran IronPython'un daha hızlı olması muhtemeldir. CPython ve JRuby + Truffle'da eşdeğer bir komut dosyası çalıştıran JRuby + Truffle muhtemelen daha hızlı olacaktır. Bunun Symbols ile ilgisi yok ama uygulamanın kalitesi ile: JRuby + Truffle agresif bir şekilde optimize eden bir derleyiciye ve yüksek performanslı bir JVM'nin tüm optimizasyon makinelerine sahiptir, CPython basit bir yorumlayıcıdır.
Ruby'nin amacından biri insanlar için okunması ve yazılması kolay olduğundan, yaratıcıları bu geliştirmeleri yorumlayıcının kendisinde (diğer dillerde olduğu gibi) uygulayarak kodlama sürecini kolaylaştıramaz mı?
Hayır Symbol. Derleyici optimizasyonu değildir. Belirli semantiğe sahip ayrı bir veri türüdür. YARV'nin s için özel bir iç optimizasyon olan flonumları gibi değiller Float. Durum için aynı değildir Integer, Bignumve Fixnum, hangi olmalıdır görünmez bir özel iç optimizasyon detay, ama ne yazık ki değil. (Bu nihayet hangi kaldırır, Ruby 2.4 sabit olacak Fixnumve Bignumsadece ve yapraklar Integer.)
Java'nın bunu yaptığı gibi, normalin özel bir durumu olarak, bu özel durumda olup olmamaları ve hangi koşullarda otomatik olarak bu özel durumda Stringolup olmadıkları konusunda her zaman dikkatli olmanız gerektiği anlamına gelir String. Bu, ayrı bir veri tipine sahip olmaktan çok daha yüksek bir yüktür.
Sembollerin dile özgü olmayan bir tanımı ve diğer dillerde bulunması için bir neden var mı?
Symbolad veya etiket kavramını gösteren bir veri türüdür . Symbols değer nesneleridir , değişmezdir, genellikle derhal (dil böyle bir şeyi ayırt ederse), vatansızdır ve kimliği yoktur. SymbolEşit olan iki kişinin özdeş olduğu garanti edilir, diğer bir deyişle, Symboleşit olan iki s aslında aynıdır Symbol. Bu, değer eşitliği ve referans eşitliğinin aynı şey olduğu ve dolayısıyla eşitliğin etkili olduğu ve O (1) anlamına gelir.
Onları bir dilde bulundurma nedenleri, dilden bağımsız olarak gerçekten aynıdır. Bazı diller onlara diğerlerinden daha fazla güvenir.
Örneğin Lisp ailesinde "değişken" kavramı yoktur. Bunun yerine, Symboldeğerlerle ilişkilendirilmişsinizdir.
Yansıtıcı veya özeleştirisel yeteneklere sahip dillerde, Symbols genellikle Ruby, yansıma API'leri örn yansıyan kişilerin isimlerini belirtmek için kullanılır Object#methods, Object#singleton_methods, Object#public_methods, Object#protected_methods, ve Object#public_methodsbir dönüş Arrayiçinde Symbol(onlar sadece yanı bir geri dönebilirler rağmen s Arrayarasında Methods). Object#public_sendBir sürer Symbol(aynı zamanda kabul etse bir argüman olarak göndermek için mesajın adını gösteren String, hem de Symboldaha anlam doğrudur).
ECMAScript'e olarak, Symbols olan temel gelecekte ECMAScript yeteneği-kasa yapma yapı taşı. Ayrıca yansımada büyük rol oynarlar.