Hijack C library functions in D

I like playing with the D programming language and I wrote this little post to show how it’s easy to create a dynamic library (shared object, .so) that can be invoked in other programs; to have a little fun we will write a D replacement for the rand() C standard library function call. For your convenience, all the code is also on github Let’s start with the demo implementation, a C program that calls 10 times the stdlib function rand() to get a random number. ...

March 10, 2020 · Andrea Manzini

a very simple NTP client in D

I am quite a fan of the D programming language and I think it deserves more attention, even if since a few months it’s becoming more and more popular, as it gained top20 in the TIOBE Index for February 2020. As an experiment in network programming, I took this simple NTP client written in C and translated to D ; in my opinion while it’s keeping the low-level nature, it’s shorter, clearer and more effective. It’s only a dozen lines of code, but full program is available on my github; stars and contributions are welcome! ...

February 20, 2020 · Andrea Manzini

il linguaggio Lua: parte 14

segue dalla parte 13 Coroutine Come approccio alla programmazione concorrente, il linguaggio Lua non ha meccanismi interni per gestire nativamente i thread, ma si può appoggiare a ciò che offre il sistema operativo sottostante. Lua invece internamente offre il supporto alle coroutine: un programma Lua può avere diversi percorsi di esecuzione ‘parallela’ ognuno col proprio stack e variabili locali ma che condividono risorse e variabili globali con le altre coroutine. La prima differenza sostanziale col modello classico dei thread è che in un determinato istante ‘gira’ una e una sola coroutine, mentre in un sistema multiprocessore ci possono essere più thread in esecuzione in contemporanea. ...

February 15, 2019 · Andrea Manzini

il linguaggio Lua: parte 13

segue dalla parte 12 Upvalue e Closure Per chi non ha familiarità con i concetti di programmazione funzionale questi termini possono sembrare un po’ oscuri; vediamo di chiarirli con un semplice esempio: -- definisco una funzione che parte da un numero N e conta alla rovescia function CreaContatore(N) local v=N local function conta(x) if v>=x then v=v-x end return v end return conta end -- creo qualche istanza: contaDaDieci=CreaContatore(10) contaDaCento=CreaContatore(100) print(contaDaDieci(1)) 9 print(contaDaCento(1)) 99 print(contaDaCento(1)) 98 print(contaDaDieci(1)) 8 print(contaDaDieci(2)) 6 print(contaDaCento(10)) 88 osserviamo le variabili N,v che usate dalla funzione interna: non sono locali, ma nemmeno globali… Sono upvalue, ovvero riferimenti che provengono da uno stackframe esterno. Quando una funzione usa variabili definite in uno scope lessicale a livello superiore, Lua provvede a memorizzare lo stato, tecnicamente spostando la gestione degli upvalue dallo stack in una zona di memoria dedicata, perché altrimenti al ritorno della funzione lo stack verrebbe perso. Ogni funzione che usa uno o più upvalue è chiamata closure. Si tratta di una caratteristica molto potente perché ci permette ad esempio di implementare callback e sandbox. Un esempio a puro scopo didattico: ...

January 19, 2019 · Andrea Manzini