Introduzione
Ciao a tutti! Spero che stiate tutti bene.
Abbiamo avuto un agosto intenso su Exercism. Abbiamo unito Premium e Insiders, aggiunto feedback automatico direttamente nell'editor, lanciato Track Trophies e fatto tantissimi piccoli miglioramenti anche al sito! Se non hai ancora controllato i tuoi track per vedere quali trofei ottieni, fallo assolutamente. Abbiamo inviato un'email a tutti quelli che hanno uno o più trofei, quindi tieni d'occhio anche quella. Ad agosto ci siamo anche divertiti tantissimo con #12in23, esplorando linguaggi che normalmente si usano per creare app.
Questo mese è Slimline September, in cui esploreremo linguaggi che tendono a essere molto concisi e sintetici nella loro sintassi. Nello specifico, vedremo 8th (un discendente di Forth), AWK, Bash, jq, Perl e Raku (che in passato era noto come Perl 6).
I badge
Per ottenere il badge Slimline September devi completare cinque esercizi qualsiasi in uno di quei linguaggi durante settembre.
C'è anche il badge 12in23, che dura tutto l'anno. Per ottenerlo devi risolvere cinque dei nostri esercizi in evidenza nel linguaggio.
- Gigosecondo: lavora con le date
- Cifrario Atbash: lavora con le stringhe
- Freccette: lavora con numeri e condizionali
- Luhn: lavora con stringhe, condizionali e numeri
- Serie: lavora con stringhe e sequenze
Questi esercizi e quelli dei mesi precedenti si trovano tutti sulla pagina #12in23.
Panoramiche
Addentriamoci ed esploriamo i linguaggi con una panoramica di ciascuno.
8th
- È stato sviluppato da Ron Aaron.
- Il nome è un gioco di parole sul linguaggio Forth, che è la sua principale ispirazione. Tuttavia, ci sono molte differenze rispetto a Forth:
- Fortemente tipizzato
- Multipiattaforma
- Sicurezza migliorata (nessun accesso diretto alla memoria o assembler integrato)
- Offre sia una versione gratuita che una commerciale, con quest'ultima che offre più funzionalità.
- A codice chiuso, ma il codice sorgente può essere visualizzato una volta acquistata una licenza enterprise
AWK
- AWK è stato creato ai Bell Labs negli anni '70 da Alfred Aho, Peter Weinberger e Brian Kernighan. Il nome è un acronimo dei cognomi dei suoi autori.
- È un linguaggio specifico del dominio, progettato per l'elaborazione di testo, ma può essere usato anche per altri scopi
- AWK è un filtro Unix, come sed e grep, pensato per essere usato in una pipeline
- La Single UNIX Specification e la Linux Standard Base richiedono entrambe che sia incluso in qualsiasi implementazione, ed è per questo che è disponibile sulla maggior parte delle macchine *nix
- Diverse implementazioni del linguaggio AWK:
- awk (o oawk per l'AWK originale): l'implementazione originale
- GNU AWK (gawk), rilasciato nel 1988, ha rivisto e ampliato significativamente il linguaggio
- BWK AWK (noto anche come nawk), rilasciato alla fine degli anni '90
- mawk: implementazione interpretata con bytecode veloce
- Su molti sistemi *nix, il comando
awkè un symlink agawkonawk
Bash
- Bash è una shell Unix sviluppata da Brian Fox e rilasciata nel 1989.
- Progettata come sostituto libero della Bourne shell, è diventata la shell di login predefinita per la maggior parte delle distribuzioni Linux. È un superset della sintassi dei comandi della Bourne shell, il che rende più facile la transizione
- Estende la Bourne shell in numerosi modi: espansione delle parentesi graffe, completamento da riga di comando, gestione dei segnali e altro ancora
jq
- Sviluppato da Stephen Dolan e rilasciato nel 2012
- Progettato per consentire di interrogare, trasformare e manipolare facilmente documenti JSON («sed per JSON»)
- Lo strumento
jq(che implementa il linguaggio) è stato originariamente implementato in Haskell, ma successivamente portato in C. Esistono anche port basati su Go e Rust
Perl
- Perl è stato sviluppato da Larry Wall alla fine degli anni '80 e rilasciato per la prima volta nel 1987.
- Progettato come linguaggio di scripting di uso generale per rendere più semplice l'elaborazione dei report
- Molto influente, in particolare per il supporto alle espressioni regolari (ci torneremo più avanti)
Raku
- Progettato da Larry Wall (creatore di Perl) e rilasciato nel 2015
- Originariamente noto come Perl 6, doveva ripulire il linguaggio e rimuovere alcune funzionalità considerate di scarsa utilità o confuse (citazione divertente: «In Perl 6, abbiamo deciso che era meglio correggere il linguaggio che correggere l'utente», Larry Wall). Alla fine Perl 6 non era compatibile a livello di codice sorgente con Perl 5, quindi è stato rinominato Raku
- La filosofia di progettazione ruota attorno al rendere la programmazione piacevole e produttiva, fornendo allo stesso tempo un'ampia gamma di strumenti per affrontare sfide di programmazione diverse (di uso generale)
- Poiché Raku è una specifica, possono esistere (ed esistono) più implementazioni. L'unica implementazione attivamente sviluppata al momento è Rakudo, ma esistono implementazioni più vecchie come Pugs (scritta in Haskell), v6-KindaPerl6 e Niecza (che punta al CLR)
Dove vengono usati questi linguaggi?
8th
- Purtroppo non siamo riusciti a trovare dove viene usato
AWK
- Usato per l'estrazione e la reportistica dei dati, e per lo scripting in generale
Bash
- Usato principalmente per l'amministrazione di sistema, ma anche per fornire utilità a riga di comando o wrapper attorno ad altri strumenti. Lo abbiamo usato tantissimo per lavorare in blocco con i repository di Exercism
jq
- Usato per interrogare, trasformare e manipolare documenti JSON, spesso sotto forma di script di shell.
Perl
- Usato per la manipolazione dei dati, il parsing dei file, la programmazione web e attività di amministrazione di sistema. Ha guadagnato popolarità nei primi giorni del web grazie alle sue capacità di manipolazione delle stringhe e al suo ampio ecosistema di moduli.
Raku
- Usato per l'elaborazione di testo, l'amministrazione di sistema e altro ancora
Cosa rende questi linguaggi interessanti dal punto di vista della programmazione?
La maggior parte dei linguaggi è dinamicamente tipizzata e interpretata, il che si adatta bene alla loro natura di scripting. Detto questo, ci sono alcune eccezioni, soprattutto nei paradigmi supportati.
8th
- Fortemente tipizzato
- Multi-paradigma: procedurale, ma ancora più interessante basato sullo stack (modello di esecuzione basato sullo stack), riflessivo (capacità di esaminare e modificare la propria struttura e il proprio comportamento) e concatenativo (tutte le espressioni sono funzioni e la giustapposizione di funzioni denota la composizione di funzioni)
- Compilato in codice nativo, ma può anche essere interpretato in un REPL
AWK
- Dinamicamente tipizzato e spesso interpretato (dipende dall'implementazione usata)
- Il paradigma principale è guidato dai dati, in cui descrivi un programma come istruzioni che descrivono i dati da far corrispondere e l'elaborazione richiesta, invece di definire esplicitamente una sequenza di passi da eseguire. AWK supporta anche la programmazione procedurale
Bash
- Linguaggio dinamico e interpretato
- Supporta la programmazione imperativa e procedurale
jq
- Linguaggio dinamico e interpretato
- Linguaggio puramente funzionale (tutti i valori sono immutabili), con particolare attenzione alle «pipeline». Ha un sapore molto Unix
Perl
- Dinamicamente tipizzato e interpretato
- Multi-paradigma, supporta la programmazione funzionale, orientata agli oggetti e imperativa
Raku
- Dinamicamente tipizzato, ma supporta la tipizzazione graduale, dove la tipizzazione statica può essere aggiunta dove serve (Perl è dinamico)
- Linguaggio multi-paradigma: imperativo, procedurale, orientato agli oggetti e funzionale
Cosa li rende ottimi linguaggi?
8th
- Una sintassi molto ridotta rende il linguaggio più facile da imparare e capire. Usa JSON per descrivere i dati (come oggetti e array). Supporta anche altri contenitori come stack, code e heap
- Nessuna parola chiave riservata. Le subroutine sono chiamate «words» e nuove words possono essere definite facilmente. Tutte le words possono essere ridefinite durante l'esecuzione, sia quelle integrate che quelle definite dall'utente
- Multipiattaforma. Genera facilmente un eseguibile per qualsiasi piattaforma supportata
- Sicuro. Funzionalità di sicurezza integrate per prevenire un'ampia gamma di bug (nessun accesso diretto alla memoria, il runtime non si collega a librerie dinamiche)
AWK
- Sintassi semplice con una struttura molto coerente del codice AWK, che rende facile imparare e leggere il codice AWK. Anche le sue strutture dati sono semplici e flessibili
- Molto espressivo: puoi fare tantissimo con pochissimo codice. Perfetto per gli one-liner
- Installato sulla maggior parte delle macchine *nix, il che significa che puoi usare le tue competenze AWK in molti posti (insieme a /bin/sh, è l'unico linguaggio di scripting nello standard Unix)
- Funziona molto bene nelle pipeline e negli script di shell, dove AWK elabora l'output di altri strumenti o viceversa
Bash
- Può essere usato sulla maggior parte delle piattaforme. È installato su quasi tutte le macchine *nix, incluso macOS. Con Windows Subsystem for Linux (WSL), bash ora è disponibile anche per i sistemi Windows.
- Usalo come RE(P)L, dove esegui comandi singoli oppure leggi ed esegui codice da file (noti come script di shell). Se hai usato un terminale Linux, probabilmente hai già scritto codice bash, dato che il terminale di solito è un RE(P)L bash
- Bash e gli script di shell sono ampiamente usati per l'amministrazione di sistema, il devops e la gestione dei computer.
- Estremamente versatile e flessibile
- Potenti capacità di manipolazione delle stringhe, inclusa un'interpolazione di stringhe molto semplice
jq
- Sintassi semplice e breve per lavorare con JSON, che lo rende facile da imparare
- Consente di definire funzioni personalizzate per operazioni più complesse.
- Supporta l'ottimizzazione della ricorsione in coda, ottima per elaborare dati in modo ricorsivo
- Lo strumento jq è distribuito come un singolo binario di appena 30 KB circa
- Lo strumento
yqavvolgejqper consentire di usare la stessa sintassi per manipolare file XML, TOML e YAML (converte internamente quei tipi di dati in JSON) - Sia l'implementazione in C che quella in Go supportano l'incorporamento in altre applicazioni
Perl
- Funziona sulla maggior parte delle piattaforme. Ottimo per scrivere script multipiattaforma
- La flessibilità è una pietra angolare della filosofia di progettazione di Perl. Il suo famoso motto è: «C'è più di un modo per farlo» (TMTOWTDI). Si possono usare approcci diversi a seconda del compito da svolgere
- Una comunità forte e un'eredità di progetti influenti. Molti script, strumenti e applicazioni sono stati sviluppati con Perl. Una volta era descritto come «il nastro adesivo che tiene insieme Internet»
- Ricco ecosistema di moduli e librerie, disponibile tramite il Comprehensive Perl Archive Network (CPAN)
Raku
- Grande, complesso e potente, ma progettato anche per essere un linguaggio che non devi imparare tutto in una volta. Facile da iniziare, e ci si può addentrare nelle funzionalità più potenti più avanti
- Sistema di tipi potente ed estensibile che include la tipizzazione graduale. Ciò significa che puoi specificare il livello di controllo dei tipi che desideri, consentendo un equilibrio tra tipizzazione dinamica e statica
- Supporta il multiple dispatch, che consente di usare il polimorfismo senza ereditarietà
- Unicode è un cittadino di prima classe in Raku. Fornisce supporto nativo per gestire diverse codifiche di caratteri
- Fornisce funzionalità avanzate di concorrenza e parallelismo. Include supporto integrato per la programmazione asincrona, la programmazione reattiva e l'esecuzione parallela
Quali sono le loro caratteristiche più notevoli?
8th
- Richiede un modo di pensare diverso. La sua combinazione unica di paradigmi è molto diversa dagli altri linguaggi e ti sfida a trovare modi diversi di affrontare le cose
- La sintassi basata sullo stack e sulla notazione polacca inversa (RPN) rende molto semplice il modello mentale di esecuzione del programma. I valori vengono inseriti nello stack e la maggior parte delle words è definita in termini di effetto sullo stack
AWK
- Il paradigma guidato dai dati è molto potente. Richiede un modo di pensare diverso, in cui i programmi sono definiti come un insieme di coppie condizione/azione e il testo è suddiviso in record (tipicamente una riga per record) e ogni record è suddiviso in campi (ad esempio campi CSV o una parola per campo). Una volta che ci si è abituati, apprezzerai l'eleganza e l'espressività di questo approccio, e inizierai a vederne usi ovunque
- Perfetto per lavorare con il testo. Che si tratti di analizzare testo, trasformarlo o generare report, AWK fa al caso tuo. Per compiti come stampare la shell per ogni utente sul sistema o sommare una colonna CSV, rimarrai stupito da quanto poco codice serva
Bash
- Perfetto per l'automazione. Gli script di shell sono eccellenti per automatizzare attività ripetitive.
- Gli script bash usano le pipeline e ti permettono di incollare insieme altri programmi con facilità. È banale creare uno script che passa l'output di un comando a un altro comando, o far fallire uno script non appena uno dei comandi eseguiti fallisce.
- Potente. La facilità con cui si possono usare altri strumenti rende bash uno strumento incredibilmente potente
jq
- Ottimo per estrarre e manipolare dati JSON in modo facile e pulito (e oggigiorno ne abbiamo tantissimi). È diventato lo strumento de facto per trasformare dati JSON. Puoi anche creare dati JSON con jq
- Supporta dati in streaming, il che significa che puoi lavorare con dati «infiniti» senza problemi di memoria
- L'enfasi sulle pipeline sarà facile da assimilare per chiunque abbia familiarità con gli stream, ad esempio gli strumenti Unix. Rende anche il codice jq abbastanza facile da comprendere
Perl
- Famoso per la sua concisione ed espressività. Basta pochissimo codice per fare molto
- Particolarmente adatto a lavorare con il testo, in gran parte grazie al suo potente supporto per le espressioni regolari. Perl 5 in particolare ha introdotto molte nuove funzionalità (come backreference, gruppi di cattura con nome e quantificatori lazy). Philip Hazel ha creato PCRE (Perl Compatible Regular Expressions), una libreria C che implementa un motore di espressioni regolari compatibile con Perl 5. Anche i linguaggi che non si basano su PCRE spesso progettano il proprio supporto alle espressioni regolari per essere compatibile con PCRE (e quindi usano la sintassi di Perl 5)
Raku
- Supporta le junction con auto-threading, che aiutano a rendere il parallelismo molto più facile da gestire
- Supporta la valutazione lazy, che consente di lavorare con liste e sequenze infinite senza incorrere in problemi di memoria. È particolarmente utile quando si gestiscono grandi set di dati o quando si lavora con algoritmi che prevedono flussi infiniti di dati
- Ottimo per l'elaborazione di testo, con una sintassi regex più semplice, leggibile e potente
- Supporto integrato per definire linguaggi specifici del dominio (DSL) personalizzati usando le grammatiche. Questo ti permette di creare parser per formati di dati o linguaggi specifici, rendendo più facile lavorare con dati testuali complessi
Quale provare?
- Se usi principalmente un sistema Unix o ti occupi di devops, Bash è un linguaggio inestimabile da imparare. Imparare AWK, Perl o Raku può essere davvero utile, e i primi due sono anche preinstallati su molti sistemi
- Se lavori con JSON (o XML/YAML/TOML), jq è una scelta ovvia
- Se vuoi elaborare testo, AWK, Perl e Raku sono le scelte ovvie.
- Se vuoi provare qualcosa di un po' diverso, 8th è un'ottima opzione