El libro

Apéndice E · Glosario

Términos que el libro usa con un significado específico, con su equivalencia en inglés cuando corresponde. Los términos en inglés están así a propósito: son los nombres que usan la documentación del lenguaje y la comunidad de los lenguajes funcionales, y traducirlos confunde más que ayuda. El glosario los nombra para que el lector que entra desde otro lenguaje encuentre rápido a qué se refieren.

A

Actor. Una fibra con un mailbox tipado encima. Procesa mensajes que recibe en orden, mantiene estado interno entre mensajes. En kaikai, los actores son una biblioteca construida sobre el efecto Actor[Msg].

Algebraic effect (efecto algebraico). Un efecto en el sentido del cap. 12: una construcción del lenguaje que declara operaciones (con su firma) sin decidir cómo se implementan, y permite que un handle decida en cada punto del programa qué significa cada operación.

Array (arreglo). Estructura de datos con acceso por índice en tiempo constante. En kaikai, Array[T] es mutable; la mutación está bajo el efecto Mutable.

Assert (aserción). Construcción dentro de bloques test, check, contratos. Si la condición es false, el bloque o el programa abortan.

B

Backpressure (retropresión). Mecanismo para que un consumidor lento haga frenar a un productor rápido. En kaikai, la policy Bounded(N, BlockSender) de un mailbox bloquea el emisor cuando el mailbox está lleno.

Bottom type (tipo bottom). Tipo sin habitantes, escrito Nothing. Una función que devuelve Nothing no puede regresar normalmente: o no termina, o aborta, o llama a un efecto que no devuelve. Por eso Fail.fail(...) : Nothing es la firma natural de una operación que no resume.

Bounded (acotado). Una policy de mailbox con capacidad fija. Cuando se llena, el comportamiento depende de la regla de overflow: DropOldest, DropNewest o BlockSender.

Branded type (tipo con marca). Un tipo numérico o string marcado con una unidad simbólica (Int<UserId>) para que el sistema de tipos lo distinga de otros tipos con la misma representación. Caso particular del sistema de unidades de medida.

C

Cancellation (cancelación). El acto de pedirle a una fibra que termine antes de tiempo. En kaikai es un efecto: Cancel.raise(). La fibra puede instalar un handler para hacer limpieza antes de desenrollarse.

Capability (capacidad). El binding que un handle ... with Effect le da al body para invocar las operaciones del efecto. Por defecto, el nombre de la capacidad es el del efecto: dentro de un handler de Log, se llama Log.log(...). La sintaxis with X as nombre liga la instancia como un capability value: un valor cuyo tipo es el efecto mismo, que puede pasarse hacia abajo como argumento (fn f(c: X)) pero no escapar de su handle. Cap. 12 §12.9.

Capability value (valor de capacidad). Ver Capability e Instancia nombrada.

Closure (clausura). Un valor de función que captura variables del scope donde se creó.

Continuation (continuación). El “resto de lo que falta hacer” en un punto del programa. En kaikai aparece como el argumento resume que reciben los handlers de efectos: llamar a resume(v) continúa el cómputo del body con v.

Contracts (contratos). requires (precondición) y ensures (postcondición) en la firma de una función, verificados estáticamente cuando es posible y dinámicamente cuando no. Cap. 11.

D

Default handler (handler por defecto). El handler que el runtime instala automáticamente alrededor de main para ciertos efectos (Console, File, Spawn, etc.). Los handlers del usuario instalados con handle ... with X se imponen sobre el handler por defecto mientras están en scope.

Doble entrada (double-entry, en contabilidad). Sistema contable donde cada transacción tiene débitos que igualan los créditos. Aparece en el caso de estudio del cap. 18.

Drop (liberar). La operación que Perceus inserta en el último uso de cada valor para decrementar su contador de referencia. Si llega a cero, la memoria se libera.

E

Effect (efecto). Ver Algebraic effect.

Effect row (fila de efectos). La lista de efectos en una firma: Int / Log + Fail + State[Int]. Se construye con + y se trata como un conjunto, no como una secuencia.

Event sourcing. Patrón arquitectónico donde el estado del sistema es la suma de los eventos ocurridos; el log de eventos es la fuente de verdad y el estado en memoria se reconstruye replicándolo. Aparece en el cap. 18.

Exhaustiveness (exhaustividad). Propiedad que el compilador verifica en match: que todos los habitantes del tipo del escrutinio estén cubiertos. Cap. 5.

F

Fixed-width integers (enteros de ancho fijo). Los tipos Int32, UInt32, UInt64 e Int128, escritos con sufijo de literal (42i32, 42u64). Son distintos de Int: no se mezclan sin conversión explícita, y su aritmética envuelve en complemento a dos en el ancho del tipo. En una firma extern "C" cruzan con el ancho exacto que declaran. Cap. 3 §3.4.

Fiber (fibra). Unidad de ejecución cooperativa. En kaikai una fibra es liviana (cientos de bytes), tiene su propio heap, no comparte memoria con otras fibras, y solo cede el control en puntos de yield explícitos. Cap. 13.

Function coloring problem. El problema donde una característica del lenguaje (típicamente async/await) parte las funciones en dos colores incompatibles, y cambiar una función contagia a todas las que la llaman. Aparece en el ensayo “What Color is Your Function?” de Bob Nystrom (2015), y kaikai lo resuelve metiendo todo en filas de efectos.

H

Handler. El bloque with Effect { ... } que decide qué hacer con las invocaciones a un efecto. Para cada operación recibe los argumentos y un resume, y decide si continuar el body o no.

Hole (agujero, hueco). Una expresión ? o ?nombre que compila pero aborta en runtime si la ejecución llega a ella. Sirve para diseño top-down (humano) y como interfaz para agentes IA. Cap. 15.

I

Inmutabilidad por defecto. Los valores en kaikai son inmutables por construcción: let x = ... declara un binding que no cambia. Las construcciones mutables (var, Ref[T], Array[T]) son la excepción explícita.

Instancia nombrada (named instance). Un handler ligado a un nombre con with Eff(init) as x. Permite que varios handlers del mismo efecto convivan, cada uno direccionable por su capability value, que puede pasarse como argumento. Cap. 12 §12.9.

L

Last-use analysis (análisis de último uso). La fase del compilador donde se identifica, para cada variable, el punto exacto en el que se usa por última vez. Perceus usa este análisis para insertar drops en el lugar correcto.

Linked (enlazado, en actores). Dos actores enlazados con Link.link(pid) se enteran mutuamente cuando uno termina: si uno cae, el otro recibe Cancel.raise(). Cap. 14.

Lint. El comando kai lint: un linter estilo Clippy que señala código válido pero sospechoso. Opt-in, solo warnings, consciente de tipos y filas de efectos. Cap. 16 §16.4.

M

Mailbox (buzón). La cola de mensajes asociada a un actor. El actor procesa los mensajes en orden FIFO. La policy del mailbox decide qué hacer cuando se llena (unbounded, drop-oldest, drop-newest, block-sender).

Match. Expresión de pattern matching. Cubre todos los constructores de un sum type (exhaustivo) y permite extraer componentes de records y listas. Cap. 5.

Monitor (monitor, en actores). Un actor que monitorea a otro recibe un mensaje MonitorDown cuando el monitoreado termina, sin acoplar su propia vida a la del observado. Cap. 14.

MVS (minimum-version selection). Algoritmo de resolución de dependencias del gestor de paquetes. Cuando un proyecto declara manutara@v0.1.0 y otro manutara@v0.2.0, MVS elige la máxima de las versiones declaradas. Cap. 8.

N

Nothing. Ver Bottom type.

Nursery (guardería).* Un scope léxico que contiene fibras hijas y garantiza que ninguna sobreviva al bloque. Se construye con nursery { n -> ... }, que es azúcar sobre handle ... with Spawn as n { ... }. Cap. 13.

O

Operation (operación). La declaración nombrada dentro de un effect: un nombre, parámetros, tipo de retorno. Las operaciones se invocan con Effect.op(args).

P

Pattern matching. La construcción match y los patrones en let. Permite descomponer valores estructurados (sum types, records, listas) en componentes. Cap. 5.

Perceus. El sistema de reference counting estático que kaikai usa para liberar memoria sin GC ni borrow checker. Inventado por Reinking, Xie, de Moura y Leijen (PLDI 2021). Apéndice B y cap. 13 §13.2.

Pid (process id, identificador de proceso). Handle tipado de un actor: Pid[Msg]. Identifica un mailbox y también garantiza que solo se pueden enviar mensajes de tipo Msg a ese mailbox.

Pipe (pipe, tubería). Operadores |>, |, ||, |?. Encadenan transformaciones. Cap. 6.

Polymorphism (polimorfismo). La capacidad de una función de operar sobre múltiples tipos. En kaikai aparece como generics (fn map[a, b](xs: [a], f: (a) -> b) : [b]) y como filas polimórficas (/ e donde e es una variable de fila).

Protocol (protocolo). Una interfaz declarada con protocol, implementada por tipos vía impl Protocol for T. Es single-dispatch (resuelve por un solo tipo). Cap. 9.

Pure (puro). Una función es pura si no produce efectos (su fila está vacía). Las funciones puras son fáciles de testear, paralelizar y razonar.

R

Ref (referencia). Una celda mutable con sobrevida arbitraria, accesible vía Mutable.ref_make / Mutable.ref_get / Mutable.ref_set. Cap. 12 §12.7.

Refinement type (tipo refinado). Un tipo con un predicado restrictivo: Int where self >= 0. Cap. 11.

Resume. Ver Continuation.

Reuse in place (reutilización en sitio). Optimización de Perceus: cuando un valor único se va a liberar y se va a crear otro del mismo shape inmediatamente después, se reusa la misma memoria sin tocar contadores. Apéndice B.

Row variable (variable de fila). Una variable polimórfica que representa “el resto de los efectos” en una firma: fn map[A, B, e](xs: [A], f: (A) -> B / e) : [B] / e.

S

Self-hosting. Estado en el que un compilador está escrito en el mismo lenguaje que compila. El compilador kaic2 de kaikai está escrito en kaikai. Apéndice A.

Span. El rango de bytes en el archivo fuente donde vive una construcción. Los mensajes del compilador usan spans para señalar dónde ocurrió un error.

Spawn. Crear una fibra o un actor nuevo. Operación del efecto Spawn.

Stage 0/1/2. Los tres compiladores que forman el bootstrap de kaikai. Stage 0 en C, stage 1 en kaikai-minimal, stage 2 en kaikai completo. Apéndice A.

State[T]. Efecto del stdlib para llevar estado mutable encapsulado. La forma azucarada var nombre = init desazucara a handle ... with State[T](init) (cap. 12 §12.7).

Stdout, Stderr, Stdin. Salida estándar, salida de error estándar, entrada estándar. En kaikai estos están bajo el efecto Console (para los dos primeros) y Stdin (para el último).

Sum type (tipo suma, tipo algebraico de datos). Un tipo con varios constructores, cada uno cargando datos distintos. La construcción type Forma = Circulo(Real) | Cuadrado(Real). Cap. 5.

T

Tail call (llamada de cola). Una llamada a función que está en la posición de “lo último que hace la función actual”. El compilador la compila a un salto, no a una llamada con push de stack, así que la recursión por cola corre sin consumir memoria de pila. Cap. 6.

Top-down design (diseño descendente). Estilo de diseño en el que se empieza por la firma de las funciones de nivel superior, dejando holes en los cuerpos, y se completan las piezas internas después. Cap. 15.

Trap exit. Capacidad de un actor de no propagarse automáticamente cuando una fibra hermana cae. Se activa con fiber_set_trap_exit(true); el actor recibe un mensaje informativo en vez de un Cancel.raise(). Cap. 14.

U

Unidad de medida. Una unidad simbólica declarada con unit que anota a un valor numérico (Real<USD>, Int<Seconds>). El sistema de tipos rechaza operaciones que mezclan unidades incompatibles. Cap. 10.

V

Var. Construcción de declaración de celda mutable local. Es azúcar sobre State[T]. Cap. 12 §12.7.

Y

Yield (ceder). El acto en que una fibra le pasa el control al scheduler para que otra fibra pueda correr. fiber_yield() lo hace explícitamente; las operaciones de IO y Spawn.await lo hacen implícitamente.

← Volver al índice