>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicurezza
HTML

L'arte di scrivere codice impossibile da leggere

Immagina di aprire un file di codice sorgente e invece dei soliti cicli e condizioni, vedi ASCII art a forma di treno o di una mappa mondiale. Esegui la compilazione, e questo "disegno" si trasforma improvvisamente in una calcolatrice funzionante o in un motore di scacchi. Non è magia — è IOCCC, il concorso più vecchio su internet per scrivere il codice C più offuscato.

Il repository dei vincitori è un enorme archivio di tutti i lavori che hanno vinto l'International Obfuscated C Code Contest dal 1984. Non è solo un ammasso di file strani, ma una vera enciclopedia degli angoli più oscuri dello standard C e dell'ingegno umano.

Da dove è venuta l'idea di tormentare il codice

Tutto è iniziato nel marzo 1984. Landon Curt Noll e Larry Bassel lavoravano alla National Semiconductor e cercavano di correggere bug nel vecchio codice della Bourne shell e nell'utility finger. Il codice era così orribile, sovraccarico di macro e non strutturato, che Landon si chiese: e se le persone iniziassero a scrivere codice cattivo apposta?

È così che è nato il concorso, con due obiettivi. Primo, mostrare per contrasto perché la pulizia del codice è importante. Secondo, testare i limiti dei compilatori e la conoscenza delle sfumature del linguaggio. Gli autori lo chiamano "programmazione satirica".

Cosa puoi trovare in questo archivio

All'interno del repository, le cartelle sono organizzate per anno. Ogni cartella contiene file sorgente dei programmi, un Makefile per la compilazione, e file con le spiegazioni dei giudici.

Programmi rompicapo

Molti lavori sembrano un insieme casuale di caratteri. Guardi il codice e non capisci cosa fa finché non lo compili. Ad esempio, un programma potrebbe calcolare Pi, mentre il testo sorgente stesso è visivamente formattato come un cerchio.

Usare le macro all'estremo

I partecipanti spesso usano il preprocessore C in modo tale che riscriva completamente la logica del programma prima della compilazione. Questo è un ottimo modo per imparare come funzionano davvero le #define e come possono essere abusate.

Sfruttare le regole non ovvie del C

L'archivio è pieno di esempi che usano la precedenza degli operatori che la maggior parte degli sviluppatori nemmeno conosce. Questo ti costringe a scavare nello standard del linguaggio e a capire perché a[i] è uguale a i[a], e come questa conoscenza aiuta a nascondere la logica.

Come studiare questi capolavori

Aprire semplicemente un file in VS Code e cercare di leggerlo è una pessima idea. Molto probabilmente, vedrai un caos di variabili con una sola lettera e costanti strane. I giudici del concorso suggeriscono un loro algoritmo per l'indagine.

Prima di tutto, dovresti far passare il codice attraverso il preprocessore. Un comando come gcc -E prog.c rimuoverà tutti i commenti ed espanderà le macro. Diventa leggermente più chiaro, ma non molto.

Il passo successivo è usare utility di formattazione (beautifier). Ma attenzione: alcuni programmi sono scritti così intelligentemente che i formatter si bloccano o rompono la logica se questa è legata a macro che definiscono la struttura dei blocchi.

Il metodo più affidabile è eseguire il codice. Ogni cartella ha istruzioni su quali argomenti passare e quale output aspettarsi. A volte il programma richiede flag specifici del compilatore che sono indicati nel Makefile.

Qual è il beneficio pratico per uno sviluppatore normale

Potresti chiederti perché guardare codice che viola tutte le regole della decenza? In realtà, è un ottimo terreno di allenamento.

  1. Comprensione profonda del linguaggio. Analizzando i vincitori dell'IOCCC, impari gli effetti collaterali, le regole di promozione dei tipi e la gestione della memoria più che da qualsiasi libro di testo.
  2. Debug e refactoring. Se riesci a capire come funziona un programma di 512 byte formattato come il logo di Linux, allora il normale codice "legacy" al lavoro ti sembrerà una fiaba per bambini.
  3. Comprensione di come funzionano i compilatori. Vedrai quali ottimizzazioni eseguono i compilatori moderni e su quali costrutti inciampano.

Vale la pena guardare in questo repository

Se ami i rompicapo e vuoi mettere alla prova la tua conoscenza del C al massimo — sicuramente sì. È come un museo d'arte digitale dove le opere possono (e dovrebbero) essere eseguite.

Basta non cercare di copiare questo stile nei tuoi progetti di lavoro. Gli stessi autori del progetto avvertono: "Per favore non scrivere codice in questo stile!". Questo repository esiste per mostrare un estremo e non avvicinarsi mai ad esso nella vita reale.

È meglio iniziare a studiare dai primi anni, ad esempio il 1984 o il 1985. I programmi lì sono ancora relativamente brevi e più facili da decompilare nella testa. Più ci si avvicina ai tempi moderni, più le tecniche di offuscamento diventano sofisticate.

Progetti correlati