<!-- 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
- Identifique quién es el propietario de la asignación, el manejo, la tarea o el recurso externo.
- Convierta los parámetros prestados en
str,[]T, omut []Tsólo cuando el El propietario de respaldo probablemente esté en vivo para la llamada. - Convierta cada copia implícita de un valor de propiedad en un movimiento o en una
explícito
.clone(). - Convierta códigos de error y ramas de limpieza en
Resultmás salidas estructuradas. - Mantenga el diseño extranjero en los registros
@repr("c")y mantenga las llamadas extranjeras dentrounsafeenvoltorios conINSTALL.mdrequisitos. - Ejecute
seed check --deep, luegoseed buildyseed 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
box fnno es un puntero de función C: posee un entorno Seed y no puede cruzar unextern "c"límite.- Un movimiento dinámico desde
values[index]no se convierte silenciosamente en un tiempo de ejecución conjunto de limpieza. Utilice un índice conocido, una operación de eliminación de colección explícita o borrow/clone el elemento. - Una región no es un escenario global. Devolver un propietario o una vista vinculados a una región es rechazado porque el asignador ya ha sido liberado.
- Un puntero sin formato no es una prueba de validez o de vida útil. Guarde la prueba en el adaptador inseguro y exponer una operación segura comprobada a las personas que llaman.