<!-- verified-against: seed-llvm; examples: docs-examples-test -->

Traduciendo C, Rust, y construcciones en Zig para seed

Esta es una guía de construcción, no un cuadro de mando del idioma. Primero traduzca la invariante de propiedad y luego elija el tipo de semilla más pequeño que la exprese. El compilador LLVM es la autoridad para la sintaxis y el diagnóstico.

Traducciones principales

Intención c Rust Zig seed construcción e invariante
texto propio char * + manual free String porción asignada string; muévalo, clónelo explícitamente y devuelva alloc_error en caso de error en la asignación.
texto prestado const char * &str []const u8 str; Se comprueba la procedencia y no se requiere libreto.
bytes propios malloc/free buffer Vec<u8> ArrayList(u8) bytes; inicializar a través de API seguras y confirmar solo bytes inicializados
bytes compartidos puntero contado por convención Arc<[u8]> propietario compartido por convención shared_bytes; clonar el identificador explícitamente y nunca mutar la carga útil
registro fijo struct struct struct struct; agregue @repr("c") solo cuando el C ABI sea el contrato
puntero opcional puntero anulable Option<NonNull<T>> puntero opcional ?*mut T en código no seguro, o Option para un valor escrito
resultado falible código de retorno + parámetro de salida Result<T,E> !T unión de errores Result<T,E>; utilizar ?, match, o una operación de límite explícita
guardia de limpieza goto cleanup Drop guardia defer destructor más limpieza estructurada; las salidas normales son exactas una vez
rasguño con alcance stack/manual arena arena o propietario temporal asignador de arena region(capacity) { ... }; Los valores y las opiniones no pueden escapar.
índice comprobado verificación de límites del lado de la persona que llama slice[index] slice[index] values[index]; el compilador baja un acceso marcado
división inconexa aritmética de punteros + prueba split_at_mut dos rebanadas por convención split_at_mut(index); el compilador registra vistas exclusivas y disjuntas
transferencia de hilo mutex/channel convención Send/Sync convención API segura para subprocesos spawn; Se requiere send y los datos compartidos también requieren sync
resultado de unión de tarea espacio de resultado compartido JoinHandle<Result<...>> mango de hilo + resultado resultado de la tarea escrita o falible spawn; unirse antes de la limpieza
devolución de llamada C puntero de función + void * extern "C" fn callconv(.C) fn llamado delgado fn(...) -> ...; El estado viaja en un identificador opaco explícito.
devolución de llamada retenida puntero de función + contexto + destruir Box<dyn FnOnce>/FnMut propiedad closure/context box fn o cierre en caja solo dentro de las API de semillas; nunca lo pases como un puntero C
campo atómico _Atomic T Atomic* std.atomic elementos atómicos sin procesar dentro de unsafe, envueltos por una estrecha caja fuerte API
MMIO volátil volatile acceso al puntero volátil inseguro API @volatile acceso al puntero operaciones volátiles sin procesar en un adaptador de controlador unsafe explícito
elenco sin control elenco C unsafe transmute @ptrCast operación explícita insegura address-space/pointer con una invariante documentada

Procedimiento de traducción

  1. Identifique quién es el propietario de la asignación, el manejo, la tarea o el recurso externo.
  2. Convierta los parámetros prestados en str, []T, o mut []T sólo cuando el El propietario de respaldo probablemente esté en vivo para la llamada.
  3. Convierta cada copia implícita de un valor de propiedad en un movimiento o en una explícito .clone().
  4. Convierta códigos de error y ramas de limpieza en Result más salidas estructuradas.
  5. Mantenga el diseño extranjero en los registros @repr("c") y mantenga las llamadas extranjeras dentro unsafe envoltorios con INSTALL.md requisitos.
  6. Ejecute seed check --deep, luego seed build y seed test; los diagnósticos son evidencia de que el invariante traducido está incompleto, no es una razón para deshabilitar la propiedad.

No traducciones comunes