Y también observe que mientras el módulo Turbo implementa una especificación generada por código, su implementación interna y la forma en que llama al puente C, es seguro en cuanto a tipos, pero podría estar usando y llamando incorrectamente, lo cual es también otro problema potencial. Y esto se debe a que llamar desde bibliotecas de Rust a C++ y con estos y al revés, rápidamente se vuelve muy complicado y propenso a errores, especialmente para tipos de datos complejos, como structs y cosas con objetos con tiempos de vida, referencias a objetos con tiempos de vida. Y a menudo es repetitivo, verboso. Hay muchas buenas razones por las que nos gusta escribir código en un lenguaje de nivel superior. Y a menudo conduce a fugas de memoria y fallos en tiempo de ejecución porque la gestión de memoria como hacerlo manualmente y también el código consciente del tiempo de vida de los objetos, es muy difícil de escribir de una buena manera. Creo que básicamente, es como un punto interminable de frustración y dolor y potencialmente será ilegal en el futuro también. Así que no es muy divertido depurar estas cosas, escribirlas o depurarlas. Y aquí está mi dolor de corazón, si C es alguna vez parte de tu proyecto, debería ser generado y considerado efímero, una especie de representación intermedia. Y no debería haber necesidad de comprometer esto en tu repositorio si se puede evitar.
Entonces, ¿cuáles son las alternativas a esto? Así que la primera alternativa que quiero mencionar es UniFFI de Mozilla. Puedes usar esto para aliviar el dolor o al menos parte del dolor. Presenta múltiples lenguajes de destino. Así que React Native siendo uno de ellos. Y está optimizado para un amplio soporte de plataformas de destino y utiliza mucho de marshalling y copia de datos para lograr eso. Favorece la facilidad de implementación y comprensión sobre el rendimiento como escriben en su propia documentación. Y este podría ser el compromiso adecuado para ti. Mientras estaba construyendo una prueba de concepto para un binding UniFFI para el auto-merge trade en diciembre, noté el código rush que necesitaba escribir allí para básicamente prepararlo para ser expuesto de esta manera era considerablemente, era el más, había mucho código que necesitaba escribir para exponerlo de una manera confiable.
Otra alternativa es SaferFFI de Dido, y está mejorando la experiencia del desarrollador de mantener una interfaz de función extranjera o ZBridge. Es usado y mantenido por Dido, como dije, en esta solución de sincronización peer-to-peer local first. Y ayuda a deducir bloques seguros, lo siento, ayuda a reducir los bloques inseguros en tu código rush y genera un encabezado C para el consumidor, pero el lado consumidor del puente aún necesitas implementarlo y mantenerlo manualmente. Y en el contexto de la estabilidad ABI y React Native, también podrías haber oído hablar del Hermes ABI. Es un ABI estable experimental basado en C para Hermes. Así que en la superficie, exactamente lo que necesitamos, pero no es realmente para consumo general. Y en sus propias palabras, no resuelve inmediatamente la estabilidad ABI para bibliotecas nativas dirigidas a React Native. Así que no React Native en sí, sino las bibliotecas que se construyen sobre él. Y esto se debe a que las bibliotecas aún consumirán un puntero de tiempo de ejecución C++ JSI proporcionado por React Native y no Hermes. Y el equipo de Hermes es consciente de esto, y está dentro del alcance de sus esfuerzos para resolver esto eventualmente. Hasta que esté listo, creo que tenemos otras y más, en mi opinión, mejores alternativas disponibles. Así que esto sucedió en el React Summit US el año pasado. Al final del año, estaba presentando una charla sobre la construcción de módulos nativos C++ JSI para React Native.
Comments