Jadi, mengapa pembuat Ruby harus menggunakan konsep symbolsdalam bahasa?
Yah, mereka tidak benar-benar "harus", mereka memilih untuk. Juga, perhatikan bahwa secara tegas Symbols bukan bagian dari bahasa, mereka adalah bagian dari perpustakaan inti. Mereka memang memiliki sintaksis tingkat bahasa, tetapi mereka akan bekerja dengan baik jika Anda harus membangunnya dengan menelepon Symbol::new.
Saya bertanya dari sudut pandang programmer non-ruby yang mencoba memahaminya. Saya telah belajar banyak bahasa lain dan tidak menemukan satu pun di antara mereka perlu menentukan apakah saya berurusan atau tidak dengan apa yang disebut Ruby symbols.
Anda tidak mengatakan apa itu "banyak bahasa lain", tapi ini hanya kutipan kecil dari bahasa yang memiliki Symboltipe data seperti Ruby:
- ECMAScript , juga JavaScript
- Scala
- Skema , Common Lisp , Clojure (juga, Clojure memiliki kata kunci ), pada dasarnya setiap bahasa dalam keluarga Lisp, penerus dan sepupunya memilikinya
- Smalltalk , Newspeak , dan banyak bahasa lain dalam keluarga Smalltalk (yang kemungkinan berasal dari Ruby), termasuk Objective-C (walaupun dalam bentuk terbatas)
- Erlang (disebut atom ) , juga Elixir dan LFE
- Julia
- Prolog (disebut atom ), yang kemungkinan berasal dari mana Erlang mendapatkannya
Ada juga bahasa lain yang menyediakan fitur Symbols dalam bentuk yang berbeda. Di Jawa, misalnya, fitur Ruby Stringdibagi menjadi dua (sebenarnya tiga) jenis: Stringdan StringBuilder/ StringBuffer. Di sisi lain, fitur Symboltipe Ruby dilipat ke dalam Stringtipe Java : Java Strings dapat diinternir , string literal dan Strings yang merupakan hasil kompilasi waktu ekspresi konstan dievaluasi secara otomatis diinternir, yang dihasilkan secara dinamis Stringdapat diinternir dengan memanggil yang String.internmetode. Diinternir Stringdi Jawa persis seperti Symboldi Ruby, tapi itu tidak diimplementasikan sebagai tipe terpisah, itu hanya keadaan berbeda bahwa JavaStringbisa masuk. (Catatan: di versi Ruby yang lebih lama, String#to_symdulu dipanggil String#interndan metode itu masih ada sampai sekarang sebagai alias warisan.)
Pertanyaan utamanya adalah: Apakah konsep symbolsdalam Ruby ada sebagai maksud kinerja atas dirinya sendiri dan bahasa lain
Symbols adalah datatype pertama dan terpenting dengan semantik tertentu . Semantik ini juga memungkinkan untuk mengimplementasikan beberapa operasi performan (mis. Pengujian cepat O (1)), tetapi itu bukan tujuan utama.
atau hanya sesuatu yang perlu ada karena cara bahasa ditulis?
SymbolKarena tidak diperlukan dalam bahasa Ruby sama sekali, Ruby akan bekerja dengan baik tanpa mereka. Mereka murni fitur perpustakaan. Tepat ada satu tempat dalam bahasa yang terkait dengan Symbols: defekspresi definisi metode mengevaluasi ke yang Symbolmenunjukkan nama metode yang sedang didefinisikan. Namun, itu adalah perubahan yang agak baru, sebelum itu, nilai kembali hanya dibiarkan tidak ditentukan. MRI hanya dievaluasi nil, Rubinius dievaluasi ke Rubinius::CompiledMethodobjek, dan sebagainya. Juga mungkin untuk mengevaluasi ke UnboundMethod... atau hanya a String.
Apakah program di Ruby akan lebih ringan dan / atau lebih cepat daripada, katakanlah, Python atau Node counterpart? Jika demikian, apakah karena symbols?
Saya tidak yakin apa yang Anda tanyakan di sini. Kinerja sebagian besar adalah masalah kualitas implementasi, bukan bahasa. Plus, Node bahkan bukan bahasa, ini adalah kerangka kerja I / O untuk ECMAScript. Menjalankan skrip yang setara pada IronPython dan MRI, IronPython kemungkinan akan lebih cepat. Menjalankan skrip yang setara pada CPython dan JRuby + Truffle, JRuby + Truffle cenderung lebih cepat. Ini tidak ada hubungannya dengan Symbols tetapi dengan kualitas implementasinya: JRuby + Truffle memiliki kompiler yang mengoptimalkan secara agresif, ditambah seluruh mesin optimisasi JVM berkinerja tinggi, CPython adalah penerjemah sederhana.
Karena salah satu maksud Ruby adalah agar mudah dibaca dan ditulis untuk manusia, tidak bisakah penciptanya mempermudah proses pengkodean dengan mengimplementasikan peningkatan itu dalam juru bahasa itu sendiri (seperti dalam bahasa lain)?
Tidak. SymbolS bukan optimasi kompiler. Mereka adalah tipe data terpisah dengan semantik tertentu. Mereka tidak seperti flonum YARV , yang merupakan optimasi internal pribadi untuk Floats. Situasinya tidak sama dengan untuk Integer, Bignumdan Fixnum, yang seharusnya merupakan detail optimasi internal pribadi yang tidak terlihat, tetapi sayangnya tidak. (Ini akhirnya akan diperbaiki di Ruby 2.4, yang menghapus Fixnumdan Bignumdan meninggalkan hanya Integer.)
Melakukannya dengan cara Jawa melakukannya, sebagai keadaan khusus dari Strings normal berarti bahwa Anda selalu perlu waspada tentang apakah Anda Stringberada dalam keadaan khusus dan di bawah keadaan apa mereka secara otomatis dalam keadaan khusus itu dan kapan tidak. Itu beban yang jauh lebih tinggi daripada hanya memiliki tipe data terpisah.
Apakah akan ada definisi bahasa-agnostik dari Simbol dan alasan untuk memilikinya dalam bahasa lain?
Symboladalah tipe data yang menunjukkan konsep nama atau label . Symbols adalah objek bernilai , tidak berubah, biasanya langsung (jika bahasa membedakan hal semacam itu), tanpa kewarganegaraan, dan tidak memiliki identitas. Two Symbols yang sama juga dijamin identik, dengan kata lain, dua Symbols yang sama sebenarnya sama Symbol. Ini berarti bahwa persamaan nilai dan persamaan referensi adalah hal yang sama, dan dengan demikian persamaan tersebut efisien dan O (1).
Alasan untuk memilikinya dalam suatu bahasa benar-benar sama, terlepas dari bahasa tersebut. Beberapa bahasa lebih mengandalkan mereka daripada yang lain.
Dalam keluarga Lisp, misalnya, tidak ada konsep "variabel". Sebaliknya, Anda telah Symboldikaitkan dengan nilai-nilai.
Dalam bahasa dengan kemampuan reflektif atau introspektif, Symbols sering digunakan untuk menunjukkan nama-nama entitas tercermin dalam API refleksi, misalnya di Ruby, Object#methods, Object#singleton_methods, Object#public_methods, Object#protected_methods, dan Object#public_methodsmengembalikan Arraydari Symbols (meskipun mereka bisa juga mengembalikan Arraydari Methods). Object#public_sendmengambil Symboldenoting nama pesan untuk dikirim sebagai argumen (meskipun ia juga menerima String, Symbollebih tepat secara semantik).
Dalam ECMAScript, Symbols adalah blok bangunan mendasar untuk membuat kapabilitas ECMAScript aman di masa depan. Mereka juga memainkan peran besar dalam refleksi.