Perchè atomi / simboli?

7

Perché i linguaggi di programmazione come Ruby usano i simboli? Capisco che la manipolazione delle stringhe sia molto più lenta dell'utilizzo di una tabella di ricerca e l'idea che le stringhe vengano riallocate nella memoria, indipendentemente dal fatto che siano uguali o diverse da quelle utilizzate in precedenza, ma gli interpreti non possono compensarle? Sembrerebbe che un interprete debba ancora analizzare la parola che hai digitato per abbinarlo a un simbolo, quindi perché non fare lo stesso con un oggetto stringa?

Ad esempio, perché il compilatore non accetta:

myHash["myKey"] = ...

e trattalo come

myHash[:myKey] = ...

dietro le quinte, comunque? Anche se la chiave è dinamica - è un interprete, quindi non dovrebbe sapere quale sarà la chiave prima di trovare il valore e trattare la chiave di stringa come un simbolo? ad esempio:.

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

Come mai un interprete non può ancora trattarlo come

myHash[:myKey]

Se sa cosa

"my" + concatMe

è prima trova il valore per chiave?

    
posta AndrewKS 26.04.2011 - 18:22
fonte

1 risposta

7

TD; DR : le stringhe sono modificabili. I simboli non lo sono. Le stringhe e i simboli hanno scopi diversi.

an interpreter still has to parse the word that you typed in order to match it to a symbol

:foo == "foo" potrebbe essere determinato internando la stringa o trasformando il simbolo in una stringa. In ogni caso, se l'interprete internasse ogni stringa che vedeva, avrebbe dovuto fare un sacco di lavoro extra quando quelle stringhe sono state mutate, un compromesso insoddisfacente. Inoltre, non sarebbe in grado di raccogliere le stringhe, il che sarebbe totalmente non performante. In effetti, internare tutte le stringhe in simboli sarebbe molto meno performante del comportamento attuale.

Ruby non usa il pooling delle stringhe. Puoi dirlo abbastanza facilmente creando un gran numero della stessa stringa e profilando l'utilizzo della memoria dell'interprete. Tuttavia, tali dettagli di implementazione sono molto bassi nell'elenco delle tensioni da prendere in considerazione quando si decide di utilizzare una stringa o un simbolo.

I understand that String manipulation is much slower than using a lookup table

Che cosa significa "molto più lento" per te? I tempi inferiori al microsecondo sono "molto più lenti"? Perché è di questo che stiamo parlando. Utilizza le stringhe e i simboli, se del caso, non basati su alcuni problemi prestazionali immaginati senza alcun impatto sul mondo reale tranne che in casi patologici.

as well as the idea that Strings are reallocated in memory no matter if it is the same or different as one used previously, but can't interpreters compensate for this?

Sì, e sono anche garbage collection quando non sono più referenziati. I simboli non vengono mai raccolti dalla spazzatura. È un compromesso.

In molte lingue (come Erlang, che usa gli "atomi"), le stringhe sono in realtà solo elenchi di caratteri (o interi). In queste lingue, internare tutte le stringhe in simboli internamente sarebbe ancora più proibitivo.

    
risposta data 26.04.2011 - 18:48
fonte

Leggi altre domande sui tag