Normas de conversión a 64-bit en apps Xojo

Cada vez son menos las aplicaciones que continúan funcionando en 32 bits. Por un lado, las ventajas asociadas con las aplicaciones de 64 bits son muchas: mayor cantidad de memoria para el uso y también un incremento del rendimiento. Por otra parte, los sistemas operativos cada vez son más restrictivos en este sentido y exigen o fuerzan el uso de aplicaciones exclusivamente de 64 bits. Probablenente si afrontamos un proyecto desde cero esto no suponga un mayor problema; ahora bien, si de lo que se trata es de portar un proyecto ya existente… entonces la cosa cambia. A continuación encontrás la serie de recomendaciones o normas indicadas por Xojo y que están publicadas originalmente, en inglés, en este enlace del área de desarrolladores.

Dado que el soporte de 64 bits implica el uso de nuevos frameworks con un nuevo compilador de potimización, en el momento de escribir esta entrada podría considerarse que aun está en beta en algunas de sus capacidades. Para la mayoría de los proyectos, no obstante, la compilación de 64 bits funciona correctamente y, de hecho, Xojo recomienda que se pruebe la compilación de 64 bits sobre los proyectos existentes. En el caso de que encuentren problemas, estos se pueden reportar a través de la aplicación Feedback.

Se pueden crear apps de 64 bits para macOS, Windows y Linux desde la versión 2015 Release 3. En la mayoría de los casos podrás compilar una versión de 64 bits de tus actuales proyectos sin necesidad de que tengas que realizar cambio alguno. Desde la versión 2017 Release 3, el propio IDE de Xojo tmabién está ya en 64 bits.

Con 64 bits tus aplicaciones ganan acceso a una mayor cantidad de memoria que anteriormente (las apps de 32 bits tenían un límite de 3 a 4 GB), además de que el código que haga un uso intensivo de cálculo matemático verá unos incrementos de velocidad realmente significativos debido a la optimización del nuevo compilador. Además, los sistemas operativos de 64 bits pueden ejecutar las aplicaciones de 64 bits de forma más eficiente en comparación con las aplicaciones de 32 bits, dado que no tienen que cargar una capa de compatibilidad adicional.

Crear una app de 64 bits

El Inspector correspondiente a cada target (Windows, macOS y Linux) tiene una propiedad denominada Architecture donde puedes seleccionar el tipo de arquitectura para la cual quieres compilar. Por omisión está definida a x86 32-bit. Para crear una app de 64 bits, activa la caja de verificación asociada con el sistema operativo de destino, elige la opción x86 64-bit como Arquitectura y pulsa el botón Build.

Puedes Ejecutar el proyecto (en modo Debug) cuando la Arquitectura está definida a x86 64-bit en proyectos macOS y Linux, pero no aun así en los proyectos Windows. Para depurar los proyectos bajo Windows, has de cambiar la Arquitectura a x86 32-bit. No obstante, también puedes optar por Compilar (en vez de ejecutar/depurar) los proyectos de Windows usando el modo x86 64-bit.

Las compilaciones de 64 bits usan el compilador LLVM, capaz de proporcionar mejoras de rendimiento significativas para el código que haga un uso intensivo de operaciones matemáticas.

Puedes advertir que se requiere más tiempo para compilar una app de 64 bits en comparación de lo que llevaría realizar el mismo proceso en una app de 32 bits. Dado que el nuevo compilador está optimizando la compilación de tu app, la velociddad de compilación también es de algún modo inferior a la del compilador de 32 bits no optimizado. Para obtener los mejores resultados, elige la opción Default asociada al campo Optimization Level en los ajustes Shared Build. Con independencia del ajuste elegido, el compilador no estará en ningún momento colgado o frito, tan sólo has de esperar a que acabe. Es probable que con el paso del timpo veas que los tiempos de compilación de 64 bits se reduzcan a medida que también se afina el compilador.

Para hacer un mejor uso de los recursos hardware, el compilador LLVM utiliza múltiples núcleos de la CP cuando compila para 64 bits (no en el caso de ARM).

Anoaciones sobre el código

Constantes del Compilador

En una app de 32-bit, Target32Bit devuelve True y Target64Bit devuelve False.

En una app de 64-bit, Target64Bit devuelve True y Target32Bit devuelve False.

Usa estas dos constantes del compilador para determinar la arquitectura de la app.

Enteros

En una app de 64 bits, el tipo de dato Integer es un alias de Int64 y UInteger es un alias de UInt64. En una app de 32 bits, el tipo de dato Integer es un alias de Int32 y UInteger es un alias de UInt432.

Declares

En general, querrás revisar cualquier Declare que se esté tulizando en el proyecto. En particular si un Declare está usando un tipo de Integer concreto, como pueda ser Int32, puede ser posible que la librería rquiera que utilices Int64 en una app de 64 bits. Para simplificarlo, utiliza el tipo de dato Integer, que es un alias de Int32 en las aplicaciones de 32 bits, y de Int64 en las aplicaciones de 64 bits.

En Mac, algunos declares Cocoa de macOS requieren de un número indicado en coma flotante. Las librerías de 32 bits utilizan Single, pero las librerías de 64 bits utilizan Double. Para estas situaciones deberías de utilizasr el tipo de dato CGFloat.

Una app de 64 bits sólo puede usar librerías de 64 bits. En el caso de que se utilice un Declare a una librería de 32 bits desde una app de 64 bits, la app fallará. De ifual modo, una app de 32 bits no puede usar librerías de 64 bits.

Anotaciones sobre compilación

El tipo de app que has de compilar para tus usuarios varía en función de los sistemas operativos que debas de soportar.

Mac

Todas las versiones de macOS soportadas por Xojo (10.7 o posterior) ya son 64 bits. Si tu app ya está funcionando correctamente como app de 64 bits, entonces no hay motivo para continuar creando apps de 32 bits. Simplemente crea una app de 64 bits y ponla a disposición de tus usuarios.

Windows

Windows está disponible tanto en versiones de 32 bits como de 64 bits. La versión de 32 bits de Windows no puede ejecutar apps de 64 bits, pero la versión de 64 bits de Windows sí puede ejecutar tanto apps de 32 bits como apps de 64 bits.

Esto significa que probablemente necesites crear tanto versiones de 32 como de 64 bits para tus apps de Windows, de modo que tus usuarios puedan elegir la más apropiada en función de su versión de Windows.

Recuerda que la constante del compilador TargetWin32 devuelve True en Windows independientemente de que se trate de una app de 32 bits o 64 bits. Esta constante indica que se está usando el sistema Win32 y no es un indicador del tipo de sistema. Para verificar si la app es de 64 bits, utiliza la constante del compilador Target64Bit.

Archivos de compilación

Para las compilaciones de 64 bits, el compilador sitúa algunos DLL del framework junto con el ejecutable y no en la carpeta “MyApplication Libs” (o simplemente “Libs”), tal y como hacía con las compilaciones de 32 bits.

Un poco de historia: para las compilaciones de Windows de 32 bits, el compilador no genera en realidad un archivo nativo PE32. Lo que hace es escribir un stub ejecutable y adjunta todos los datos del programa a continuación. El stub es responsable de cargar esos datos en memoria y realizar todas las reubicaciones e importar los bindings que el loader del SO hubiese cargado normalmente. El stub no tiene por qué enlazar inicialmente contra cualquiera de las librerías referidas por el programa (incluido el framework), de modo que Xojo tiene la libertad de poner todos los DLL requeridos por el programa donde decida. Sin embargo, esta aproximación produce que de alguna que otra vez la app pueda ser tomada como malware por parte de los programas antivirus, y previene algunas características de Windows que los usuarios de Windows han querido desde hace años (como la habilidad de editar el manifiesto de la app).

Para los ejecutables de Windows de 64 bits, el compilador usa un linkador nativo para generar los archivos PE32+. Estos ejecutables enlazan directamente contra las DLL que necesita y están por tanto ligados a la ruta de búsqueda del sistema. Para que el cargador encuentre los DLL que el ejecutable requiere a la hora de lanzarlo, estos han de estar en la misma carpeta que el propio ejecutable. Actualmente, las DLL de runtime de Visual Studio aparecen próximas al ejecutable junto con las DLL del framework de Xojo (XojoGUIFramework64.dll). Si utilizas WebKit con el HTMLViewer, entonces también aparecerán los DLL y archivos relacionados con CEF3 junto con el ejecutable.

Es improbable que la estructura de compilación de Windows tenga un aspecto más aproximado a los bundles de macOS, principalmente debido al tema de las DLL, pero también porque en Windows el directorio es el bundle de la aplicación. Microsoft espera que los programas utilicen instaladores y no le preocupa realmente cuan descuidado pueda parecer la carpeta de tu programa.

Dicho esto, el cambio en la estructura del directorio no impone un requerimiento para los instaladores utilizados o a la hora de que deba de estar en el disco del sistema. El único cambio es que siempre habrá más archivos en la carpeta en la que se encuentre el ejecutable.

Archivo de Manifiesto

En las apps Windows de 64 bits se utiliza un manifiesto estándar. El manifiesto incluye información a partir de los ajustes de compilación (Build Settings) de Windows, como la información de la versión, los ajustes de OS y de RunAs.

Linux

Las distribuciones Linux también están disponibles tanto en versiones de 32 como de 64 bits, aunque las versiones de 64 bits son las más frecuentes. De hecho, algunas distribuciones Linux ya no disponen de versiones de 32 bits.

Las versiones de 32 bits de Linux no pueden ejecutar apps de 64 bits. Las versiones de 64 bits de Linux pueden ejecutar versiones de 32 bits, pero sólo si se han instalado las correspondientes librerías de compatibilidad de 32 bits. Estas librerías no se instalan generalmente por omisión y no siempre son sencillas de instalar.

Esto significa que probablemente querrás crear versiones de 32 y 64 bits de tus apps Linux, de modo que tus usuarios puedan elegir la apropiada para su versión de Linux.

Plugins

Una app de 64 bits precisa de plugins que soporten 64 bits, como es el caso de GuancheMOS. Si tu app utiliza plugins, entonces has de comprobar que el proveedor disponga de una versión compatible con 64 bits.

Script del IDE para Compilación

Para facilitar la compilación de las tres versiones diferentes de tu app en un paso, puedes utilizar el siguiente Script del IDE:

' Build all target platforms
  Const kOSX32 = 7
  Const kOSX64 = 16
  Const kWin32 = 3
  Const kWin64 = 19
  Const kLin32 = 4
  Const kLin64 = 17
  Const kLinARM = 18

  Dim path As String
  path = BuildApp(kOSX32)
  path = BuildApp(kOSX64)
  path = BuildApp(kWin32)
  path = BuildApp(kWin64)
  path = BuildApp(kLin32)
  path = BuildApp(kLin64)
  path = BuildApp(kLinARM)

  Dim result As String
  result = ShowDialog("Build All", "Finished building.",
    "OK", "", "", -1)

Este script crea compilaciones de Windows, macOS y Linux tanto en 32 como en 64 bits, así como para Raspberry Pi (ARM 32 bit); todo en un paso). Puedes eliminar los comentarios de las partes que no necesites compilar.

Problemas conocidos

Es bastante que algunos, si no todos, los mencionados a continuación ya estén resueltos en el momento en el que leas este artículo dada la evolución de Xojo. Ten en cuenta que estas limitaciones sólo afectan actualmente a las apps de 64 bits. No obstante, siempre es conveniente tener en cuenta lo siguiente.

  • Depuración Windows en 64-bit

Información en 64-bit

  • En algunos proyectos, la compilación de 64 bits puede requerir de una cantidad de tiempo superior para completarse. Asegúrate de dejar que Xojo finalice la compilación. Para mejorar la velocidad de compilación, ajusta Optimization Level a Default en el apartado Shared Build Settings.
  • Para reducir los tiempos de compilación, asegúrate de no tener métodos realmente largos que puedan refactorizarse y simplificarse. Los elementos de Proyecto (clases, ventanas, etc.) que tengan grandes cantidades de código también pueden incrementar los tiempos de compilación. Divídelos en clases independientes para reducir los tiempos de compilación.
  • No puedes compilar apps de 64 bits para macOS desde los IDE de Windows o Linux.
  • Los Array están limitados a un tamaño de 32 bits en las apps de 64 bits.

Resolución de problemas

Dado que por ahora no puedes depurar apps de 64 bits en Windows, tendrás que recurrir a algún tipo de impresión en consola (logs) u otros métodos para depurar tus apps compiladas. Utiliza el método DebugLog para escribir mensajes al log del sistema, y que puedes ver en Windows usando la app DebugView (que tendrás que descargar e instalar).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *