delphi delphi-xe4

Delphi XE4 cuerdas inmutables



delphi-xe4 (1)

Según el documento técnico de Marco Cantù , el tipo de datos de string en el objetivo XE4 iOS no es de hecho inmutable, aunque parece contradecirse a sí mismo.

Él dice:

En el nuevo compilador basado en Delphi LLVM, hay un tipo de cadena, que representa cadenas Unicode (UTF16) y se asigna al tipo de cadena actual en Delphi XE3 (un alias para el tipo UnicodeString en el compilador de Windows). Sin embargo, este nuevo tipo de cadena utiliza un modelo de administración de memoria diferente. El tipo de cadena sigue siendo referencia contada, pero es inmutable, lo que significa que no puede modificar el contenido de la cadena una vez que se construye.

Pero luego continúa diciendo:

En otras palabras, las cadenas ahora están basadas en Unicode, pronto se convertirán en inmutables y se contarán como referencia .

Y también:

Sin embargo, cuando las cosas comienzan a cambiar, es cuando modifica una cadena existente, no reemplazándola con un nuevo valor (en cuyo caso obtiene una cadena nueva), sino cuando modifica uno de sus elementos, como se muestra en esta línea de Código (y también en la sección anterior, donde presenté el tema):

Str1 [3] := ''x'';

Todos los compiladores de Delphi utilizan una semántica de copia en escritura: si la cadena que modifica tiene más de una referencia, primero se copia (ajustando los recuentos de referencia de las distintas cadenas involucradas según sea necesario) y luego se modifica.

El nuevo compilador hace algo muy similar al clásico. Implementa un mecanismo de copia en escritura, a menos que haya una sola referencia a la cadena, en cuyo caso la cadena se modifica en su lugar. Como ejemplo, considere el siguiente código, que genera la ubicación en memoria de la cadena real.

Y luego muestra una imagen de un dispositivo iOS con cadenas mutantes.

Y en la documentación oficial tenemos:

Las cadenas son inmutables (constantes), por lo que no puede indexar en una cadena como una matriz y manipular los caracteres en una cadena. Si intenta modificar una cadena, los compiladores móviles de Delphi podrían emitir el mensaje. Las cadenas de modificación W1068 en su lugar podrían no ser compatibles en el futuro (Delphi). Puede especificar si el mensaje x1068 se emite como una advertencia o un error. En la página de Consejos y advertencias, configure la advertencia "Modificación de cadenas in situ ...." en "verdadero" o "error".

Así que interpreto que todo eso significa que la versión XE4 del compilador de iOS todavía tiene cadenas mutables. Los desarrolladores realmente no quieren que mates más tus cadenas y te están diciendo que las cadenas son inmutables en los compiladores móviles. Pero parece que todavía son mutables. ¡Imagínate!

Sin embargo, se le notificó que en una versión futura, la cadena puede volverse inmutable.

Puedes prepararte para ese futuro lanzamiento ahora configurando

{$WARN IMMUTABLE_STRINGS WARN}

Lo que te dará una idea del impacto del cambio. Si desea abrocharse el cinturón y dejar de mutar las cadenas, puede hacer esto:

{$WARN IMMUTABLE_STRINGS ERROR}

Una vez que lo haga, deberá convertir el código que accede a elementos de cadena individuales. Sospecho que te sorprenderá lo poco que existe ese código. Acabo de compilar 600,000 líneas de código y solo vi 120 instancias de la advertencia. Y la mayoría de ellos estaban en unidades de terceros. He visto un gran revuelo acerca de este cambio, pero honestamente no creo que mucho código mute cadenas. En la gran mayoría de los casos, las cadenas se crean por concatenación, o por llamadas a funciones como Format . Ese código no se ve afectado por esto.

No creo que haya grandes trampas. Puede usar {$WARN IMMUTABLE_STRINGS ...} para permitir que el compilador lo guíe a través del proceso. Cualquier código que mute las cadenas debe convertirse para usar TStringBuilder .

En cuanto a los beneficios de la inmutabilidad, le remito a ¿Por qué .NET String es inmutable?

Si está utilizando los compiladores tradicionales de Windows u OSX, no veo ninguna razón convincente para cambiar. El compilador de iOS es nuevo. El cambio a cadenas inmutables ha sido flotante, pero puede que nunca suceda. Puede ocurrir solo en los compiladores móviles y nunca en los compiladores tradicionales. En este momento, me sentaría bien y esperaría a ver cómo se desarrolla todo.

Con Delphi XE4 para la plataforma iOS, se introdujo un nuevo tipo de cadena: cadenas inmutables basadas en cero. Hasta ahora Delphi tenía copia en escritura de cuerdas mutables. Entonces la pregunta es, ¿qué significa eso para mi futura programación? ¿Hay alguna ventaja de un tipo de cadena sobre la otra? ¿Cuáles son los escollos que debo tener en cuenta al cambiar al nuevo tipo de cadena (aparte del obvio 0 contra 1 base)?