Jadi, mengapa pembuat Ruby harus menggunakan konsep symbols
dalam bahasa?
Yah, mereka tidak benar-benar "harus", mereka memilih untuk. Juga, perhatikan bahwa secara tegas Symbol
s 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 Symbol
tipe 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 Symbol
s dalam bentuk yang berbeda. Di Jawa, misalnya, fitur Ruby String
dibagi menjadi dua (sebenarnya tiga) jenis: String
dan StringBuilder
/ StringBuffer
. Di sisi lain, fitur Symbol
tipe Ruby dilipat ke dalam String
tipe Java : Java String
s dapat diinternir , string literal dan String
s yang merupakan hasil kompilasi waktu ekspresi konstan dievaluasi secara otomatis diinternir, yang dihasilkan secara dinamis String
dapat diinternir dengan memanggil yang String.intern
metode. Diinternir String
di Jawa persis seperti Symbol
di Ruby, tapi itu tidak diimplementasikan sebagai tipe terpisah, itu hanya keadaan berbeda bahwa JavaString
bisa masuk. (Catatan: di versi Ruby yang lebih lama, String#to_sym
dulu dipanggil String#intern
dan metode itu masih ada sampai sekarang sebagai alias warisan.)
Pertanyaan utamanya adalah: Apakah konsep symbols
dalam Ruby ada sebagai maksud kinerja atas dirinya sendiri dan bahasa lain
Symbol
s 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?
Symbol
Karena 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 Symbol
s: def
ekspresi definisi metode mengevaluasi ke yang Symbol
menunjukkan 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::CompiledMethod
objek, 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 Symbol
s 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. Symbol
S bukan optimasi kompiler. Mereka adalah tipe data terpisah dengan semantik tertentu. Mereka tidak seperti flonum YARV , yang merupakan optimasi internal pribadi untuk Float
s. Situasinya tidak sama dengan untuk Integer
, Bignum
dan Fixnum
, yang seharusnya merupakan detail optimasi internal pribadi yang tidak terlihat, tetapi sayangnya tidak. (Ini akhirnya akan diperbaiki di Ruby 2.4, yang menghapus Fixnum
dan Bignum
dan meninggalkan hanya Integer
.)
Melakukannya dengan cara Jawa melakukannya, sebagai keadaan khusus dari String
s normal berarti bahwa Anda selalu perlu waspada tentang apakah Anda String
berada 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?
Symbol
adalah tipe data yang menunjukkan konsep nama atau label . Symbol
s adalah objek bernilai , tidak berubah, biasanya langsung (jika bahasa membedakan hal semacam itu), tanpa kewarganegaraan, dan tidak memiliki identitas. Two Symbol
s yang sama juga dijamin identik, dengan kata lain, dua Symbol
s 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 Symbol
dikaitkan dengan nilai-nilai.
Dalam bahasa dengan kemampuan reflektif atau introspektif, Symbol
s 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_methods
mengembalikan Array
dari Symbol
s (meskipun mereka bisa juga mengembalikan Array
dari Method
s). Object#public_send
mengambil Symbol
denoting nama pesan untuk dikirim sebagai argumen (meskipun ia juga menerima String
, Symbol
lebih tepat secara semantik).
Dalam ECMAScript, Symbol
s adalah blok bangunan mendasar untuk membuat kapabilitas ECMAScript aman di masa depan. Mereka juga memainkan peran besar dalam refleksi.