¿Por qué átomos / símbolos?

7

¿Por qué los lenguajes de programación como Ruby usan símbolos? Entiendo que la manipulación de la cadena es mucho más lenta que usar una tabla de búsqueda, así como la idea de que las cadenas se reasignan en la memoria, no importa si es la misma o diferente a la utilizada anteriormente, pero ¿los intérpretes no pueden compensar esto? Parecería que un intérprete aún tiene que analizar la palabra que usted escribió para hacerla coincidir con un símbolo, así que ¿por qué no hacer lo mismo con un objeto de cadena?

Por ejemplo, ¿por qué no toma el compilador:

myHash["myKey"] = ...

y tratarlo como

myHash[:myKey] = ...

detrás de las escenas, de todos modos? Incluso si la clave es dinámica, es un intérprete, ¿no debería saber cuál será la clave antes de encontrar el valor y seguir tratando la clave de cadena como un símbolo? ej .:

concatMe = "Key"
myHash["my" + concatMe] = ...

¿Por qué un intérprete todavía no puede tratar esto como

myHash[:myKey]

Si sabe que

"my" + concatMe

es antes , ¿encuentra el valor por clave?

    
pregunta AndrewKS 26.04.2011 - 18:22

1 respuesta

7

TD; DR : las cadenas son mutables. Los símbolos no lo son. Las cadenas y los símbolos tienen diferentes propósitos.

  

un intérprete aún tiene que analizar la palabra que escribió para asociarla con un símbolo

:foo == "foo" podría determinarse internando la cadena o convirtiendo el símbolo en una cadena. En cualquier caso, si el intérprete internara cada cadena que veía, tendría que hacer un montón de trabajo adicional cuando esas cadenas se mutaran, una compensación pobre. También sería incapaz de recolectar esas cadenas de basura, lo que sería totalmente improductivo. De hecho, internar todas las cadenas a símbolos sería mucho menos eficaz que el comportamiento actual.

Ruby no usa agrupación de cadenas. Puede saberlo fácilmente creando una gran cantidad de la misma cadena y perfilando el uso de memoria del intérprete. Sin embargo, tales detalles de implementación son muy bajos en la lista de tensiones que debe tener en cuenta al decidir utilizar una cadena o un símbolo.

  

Entiendo que la manipulación de cadenas es mucho más lenta que usar una tabla de búsqueda

¿Qué significa "mucho más lento" para ti? ¿Son los tiempos de microsegundos "mucho más lentos"? Porque de eso estamos hablando. Use cadenas y símbolos cuando sea apropiado, no en base a algún problema de rendimiento imaginado sin impacto en el mundo real, excepto en casos patológicos.

  

así como la idea de que las cadenas se reasignan en la memoria, no importa si es la misma o diferente a una utilizada anteriormente, pero ¿los intérpretes no pueden compensar esto?

Sí, y también se recolectan como basura cuando ya no se hace referencia. Los símbolos nunca se recogen basura. Es un intercambio.

En muchos idiomas (como Erlang, que usa 'átomos'), las cadenas son en realidad solo listas de caracteres (o enteros). En estos idiomas, internar todas las cadenas en símbolos internamente sería aún más prohibitivo en cuanto a costos.

    
respondido por el Rein Henrichs 26.04.2011 - 18:48

Lea otras preguntas en las etiquetas