Referència
Ridgun — Especificació de la capa d'abstracció de plataforma (PAL) i de les llibreries del sistema (posix.rglib, io.rglib)
Aquesta especificació defineix el contracte entre el compilador de Ridgun (ridgunc v0.9.5) i les llibreries del sistema de Ridgun (posix.rglib, io.rglib, unix-tools) per a tots els sistemes operatius de destinació, admesos i previstos (Linux, MacOS, Windows), i totes les arquitectures de CPU (X86_64, Arm64).
1. Visió general de l'arquitectura: PAL de 2 capes + ADT suma de destinació
Ridgun evita exposar números de crida al sistema exclusius de Linux o màscares de bits específiques d'un sistema operatiu a les llibreries portables. Per fer-ho, divideix la interacció amb el sistema en dues capes del compilador més uns ADT de destinació fortament tipats:
- ADT suma de plataforma de destinació predeclarats (
sys os => SysOs,sys arch => SysArch):
- En lloc de retornar valors
Stringsense tipar (propensos a errors tipogràfics i que el comprovador de tipus no pot verificar),ridguncpredeclara dos ADT suma extensibles:
type SysOs = Linux | MacOS | Windows
type SysArch = X86_64 | Arm64
- El backend resol
sys os => SysOsisys arch => SysArchen temps de compilació en constantsNLoadAdt0sense cap sobrecost (Linux/X86_64ax86_64-linux,Linux/Arm64aarm64-linux). - Les llibreries poden triar el cas amb netedat mitjançant pattern matching tabular sobre
SysOs/SysArch, comparar amb==((sys os) == Linux) o estendre'ls per a destinacions BSD o sense sistema operatiu pròpies ambexpand type SysOs = FreeBSD | BareMetal(FR-COMP-005).
- Capa 1 — Primitives PAL multiplataforma (
sys open mode,sys open,sys close,sys read fd,sys write fd,sys poll,sys terminate,sys kill,sys call):
- Totes les màscares d'indicadors i d'esdeveniments de sondeig que es passen a les primitives de la capa 1 fan servir constants normalitzades de la PAL de Ridgun.
- Cada backend (
x86_64.rgELF64,arm64.rgELF64 i els futurs backendsMach-Oper a macOS iPE64per a Windows) tradueix aquestes constants normalitzades a l'ABI nativa del nucli del sistema operatiu (openat/poll/killa Linux,open/poll/killa macOS,CreateFileW/WaitForSingleObject/WSAPoll/TerminateProcessa Windows). - S'accepten de manera idèntica la sintaxi de llenguatge natural separada per espais (
sys open mode path "r") i la sintaxi separada per guions baixos (sys_open_mode path "r").
- Capa 2 — Quotes d'execució declaratives (
with timeout <duration> do):
- Els literals enters admeten sufixos de durada:
_ms(* 1),_s(* 1000) i_min(* 60000). with timeout 500_ms do <body>(i la forma combinadawith region 64_KB, timeout 500_ms do <body>) afegeix un termini lèxic (sys time ms + duration_ms) a la pila de terminis de la PAL local del fil, el limita a qualsevol termini exterior més estricte (min(outer, new)) i restaura el termini exterior en sortir.- Dins d'un bloc
with timeout,sys deadline ms => Intretorna el termini actiu en temps absolut (0si no n'hi ha),sys remaining ms => Intretorna els mil·lisegons restants (-1si no hi ha termini,0si ha vençut), isys poll fd events -1limita automàticament el temps d'espera asys remaining ms.
2. Referència de la PAL integrada al compilador (FR-COMP-007)
2.1 Introspecció de la plataforma de destinació
| Primitiva | Signatura | Descripció |
|---|---|---|
sys os | => SysOs | Sistema operatiu de destinació en temps de compilació (Linux | MacOS | Windows). |
sys arch | => SysArch | Arquitectura de CPU de destinació en temps de compilació (X86_64 | Arm64). |
Exemple idiomàtic de selecció per sistema operatiu en una llibreria .rglib sense cadenes if/else:
fn :: path separator SysOs => String
path separator Linux = "/"
path separator MacOS = "/"
path separator Windows = "\\"
fn :: null device => String
null device = null device for (sys os)
fn :: null device for SysOs => String
null device for Windows = "NUL"
null device for _ = "/dev/null"
2.2 E/S amb descriptors o identificadors i sondeig de disponibilitat
| Primitiva | Signatura | Contracte PAL normalitzat |
|---|---|---|
sys open mode | String String => Int | Obre path amb la cadena de mode portable "r", "w", "a", "rw", "w+" o "a+" (permís per defecte 0644 / 420 en crear). Retorna un descriptor/identificador >= 0 o un codi d'error negatiu (-errno). |
sys open | String Int Int => Int | Obre path amb els flags normalitzats de la PAL de Ridgun (0 = només lectura, 1 = només escriptura, 2 = lectura i escriptura, 64 = crear, 512 = truncar, 1024 = afegir al final, 2048 = no bloquejant) i el permís mode (p. ex. 420 per a 0644). |
sys close | Int => Int | Tanca fd o l'identificador. Retorna 0 si té èxit o un -errno negatiu. |
sys read fd | Int Int => String | Llegeix fins a max_bytes de fd o de l'identificador (0 = stdin, 1 = stdout, 2 = stderr, o un fitxer, pipe o FIFO obert). Retorna "" en cas d'EOF (0 bytes) o d'error. |
sys write fd | Int String => Int | Escriu data a fd o a l'identificador. Retorna els bytes escrits (>= 0) o un -errno negatiu. |
sys poll | Int Int Int => Int | Sondeja fd per als events normalitzats (1 = POLLIN llegible, 4 = POLLOUT escrivible, 8 = POLLERR, 16 = POLLHUP) amb timeout_ms (-1 = infinit o limitat a sys remaining ms dins de with timeout, 0 = sondeig no bloquejant, > 0 = espera màxima en ms). Retorna una màscara de bits > 0 amb els esdeveniments a punt, 0 si s'esgota el temps o < 0 amb -errno. |
2.3 Rellotges, terminis, senyals i via d'escapament de baix nivell
| Primitiva | Signatura | Contracte PAL normalitzat |
|---|---|---|
sys time ms | => Int | Rellotge monòton en mil·lisegons (CLOCK_MONOTONIC). |
sys sleep ms | Int => () | Dorm durant ms mil·lisegons (nanosleep / Sleep). |
sys deadline ms | => Int | Termini lèxic actiu en ms monòtons (0 fora de with timeout). |
sys remaining ms | => Int | Mil·lisegons que falten per al termini lèxic actiu (-1 fora de with timeout, 0 si ha vençut). |
sys getpid | => Int | Identificador del procés actual (> 0). |
sys terminate | Int Bool => Int | Finalització de processos multiplataforma: force = False envia una finalització ordenada (SIGTERM a POSIX), force = True força la finalització immediata (SIGKILL a POSIX, TerminateProcess a Windows). Retorna 0 o -errno. |
sys kill | Int Int => Int | Envia un senyal normalitzat (0 = comprovació d'existència, 2 = SIGINT, 9 = SIGKILL, 15 = SIGTERM) a pid (o al grup de processos quan pid < 0). Retorna 0 o -errno. |
sys pipe | => Int Int | Crea un pipe del sistema operatiu (__NR_pipe = 22) i retorna (read_fd, write_fd) (o (-1, -1) en cas d'error). |
sys waitpid | Int Int => Int Int | Espera el procés fill pid amb options (0 = bloquejant, 1 = WNOHANG) mitjançant __NR_wait4 = 61 i retorna (ret_pid, exit_status), descodificat amb WIFEXITED/WEXITSTATUS (0..255) i WIFSIGNALED (128 + WTERMSIG). |
sys call | Int Int Int Int Int Int Int => Int | Crida al sistema directa de baix nivell segons l'ABI de destinació (nr, a1..a6) per a controladors específics d'un sistema operatiu. Quan la facis servir, protegeix-la amb sys os / sys arch. |
3. Superfície recomanada de les llibreries .rglib (io.rglib i posix.rglib)
3.1 io.rglib — Embolcalls d'E/S d'alt nivell que tenen en compte el temps d'espera
type IoResult = IoOk String | IoTimeout | IoEof | IoError Int
fn :: io read with timeout String Int => IoResult
io read with timeout path wait_ms =
with timeout wait_ms do
-- Open non-blocking (0 + 2048 = O_RDONLY | O_NONBLOCK) so FIFO/device open never hangs
fd = sys open path 2048 0
io read poll step fd
fn :: io read poll step Int => IoResult
io read poll step fd
| fd < 0 = IoError fd
| otherwise =
-- timeout_ms = -1 automatically uses `sys remaining ms` from the active `with timeout` block
ev = sys poll fd 1 (0 - 1)
io read after poll fd ev
fn :: io read after poll Int Int => IoResult
io read after poll fd ev
| ev == 0 =
_ = sys close fd
IoTimeout
| ev < 0 =
_ = sys close fd
IoError ev
| otherwise =
chunk = sys read fd fd 65536
_ = sys close fd
io wrap chunk chunk
fn :: io wrap chunk String => IoResult
io wrap chunk "" = IoEof
io wrap chunk s = IoOk s
3.2 posix.rglib — Constants simbòliques i funcions auxiliars de processos
-- Normalized PAL Open Flags
fn :: o rdonly => Int
o rdonly = 0
fn :: o wronly => Int
o wronly = 1
fn :: o rdwr => Int
o rdwr = 2
fn :: o creat => Int
o creat = 64
fn :: o trunc => Int
o trunc = 512
fn :: o append => Int
o append = 1024
fn :: o nonblock => Int
o nonblock = 2048
-- Normalized PAL Poll Events
fn :: poll in => Int
poll in = 1
fn :: poll out => Int
poll out = 4
fn :: poll err => Int
poll err = 8
fn :: poll hup => Int
poll hup = 16
-- Normalized Signals
fn :: sig int => Int
sig int = 2
fn :: sig kill => Int
sig kill = 9
fn :: sig term => Int
sig term = 15
fn :: process exists Int => Bool
process exists pid = (sys kill pid 0) == 0
4. Compilar i distribuir llibreries .rglib i .so
Compila qualsevol mòdul de llibreria sense necessitat de main:
# Emit portable Ridgun library bundle (.rglib)
./bin/ridgunc build --lib src/main/ridgun/lib/io.rg -o target/io.rglib
# Emit native ELF64 shared object (.so)
./bin/ridgunc build --so src/main/ridgun/lib/io.rg -o target/libio.so
# Or via stable in a library project (`stable new --lib io`):
./bin/stable built lib