Uploaded avatar of iHiD

È il Mindshifting May!

@iHiD
Oltre 3 anni fa
Video

Introduzione

Ciao a tutti! Spero stiate tutti bene.

L'anno sta passando veloce e siamo arrivati a Mindshifting May, probabilmente il mese che mi entusiasma di più, soprattutto perché include Prolog!

Spero che Analytical April vi sia piaciuto. Avete partecipato in tantissimi e credo sia stato uno dei mesi di maggior successo finora. Ad aprile ho anche chiacchierato con Simon Peyton Jones, in una intervista arrivata in ritardo per Functional February. È stato davvero bello e consiglio decisamente di riguardarla, se non altro per la splendida frase: «Quando il calcare della programmazione imperativa si sarà consumato, il granito della programmazione funzionale si rivelerà al di sotto».

Comunque, passiamo a Mindshifting May! Come al solito, Erik e io vi daremo una rapida panoramica su cosa riguardano questi mesi e sui diversi linguaggi che esploreremo.

Questo mese abbiamo ben sei linguaggi: Ballerina, Pharo, Prolog, Red, Tcl (Tickle) e Unison. Ognuno di questi linguaggi è piuttosto diverso da quelli più «mainstream», quindi ti consigliamo di provarne più di uno per capire quanto siano diversi. Consiglio decisamente Prolog, perché è uno dei linguaggi in cui mi sono divertito di più a programmare nella mia vita. Anche Erik è molto entusiasta di Unison, quindi è un altro buon candidato da provare.

I badge

Per ottenere il badge di Mindshifting May devi completare cinque esercizi qualsiasi in uno di questi linguaggi durante maggio.

C'è anche il badge 12in23, che dura tutto l'anno. Per ottenerlo devi risolvere cinque dei nostri esercizi in evidenza in quel linguaggio. Se stai guardando questo video dopo maggio, puoi fare questa parte in qualsiasi momento dell'anno, quindi non hai perso nulla. Scegliere questi esercizi è stato difficile, dato che i linguaggi sono tutti così diversi, quindi abbiamo optato per esercizi più generici, divertenti da risolvere e interessanti per esplorare approcci diversi.

  • Acronym: converti una frase nel suo acronimo
  • Isogram: controlla se una frase contiene lettere ripetute
  • Roman Numerals: traduci un numero decimale in numeri romani
  • Raindrops: converti un numero in suoni di gocce di pioggia
  • Space Age: calcola quanti anni avrebbe qualcuno sui pianeti del nostro sistema solare

Questi esercizi e quelli dei mesi precedenti si trovano tutti nella pagina #12in23.

Le panoramiche

Entriamo nel vivo ed esploriamo i linguaggi con una panoramica di ciascuno.

Prolog:

  • Un modo diverso di pensare. Un programma è definito come un insieme di relazioni. Poi si «interroga» il database delle relazioni per trovare risposte usando l'unificazione (il pattern matching). Perfetto per i sistemi basati su regole
  • Poca sintassi: un solo tipo di dato (i termini) e un solo elemento strutturale del linguaggio (le clausole). Le clausole sono costruite interamente da termini e possono definire fatti o regole.
  • Molto dichiarativo. Ci si preoccupa meno di come le cose vengono calcolate e più di cosa deve essere calcolato. In molti casi questo significa meno codice
  • Progettato per funzionare bene nell'interrogazione di grandi spazi di ricerca. Diverse strategie di ricerca (in profondità, in ampiezza), supporta la potatura automatica

Unison

  • Nel codice Unison non ci sono conflitti di versione! Una funzione Unison conosce gli hash delle sue dipendenze, quindi riesce a trovare la versione giusta del codice di cui ha bisogno.
  • Unison supporta la navigazione del codice in tempo reale nell'interfaccia di sviluppo locale e nei repository ospitati, così puoi sempre fare clic e vedere il codice sorgente delle librerie da cui dipendi.
  • Le Abilities sono un modo per gestire gli «effetti» (ad esempio l'IO) in modo puramente funzionale

Pharo

  • Pochissima sintassi: l'intera sintassi sta su una cartolina (solo 6 parole riservate!). La sintassi dei messaggi imita le lingue naturali, con un soggetto, un verbo e dei complementi (between: 1 and: 2 +). Anche la semantica è semplice (ad esempio regole di precedenza semplicissime). Tutto questo lo rende più facile da imparare e da leggere.
  • La produttività è ottima, una volta superata la curva di apprendimento iniziale. I motivi sono diversi: la semantica semplice e la poca sintassi, ma anche alcune delle funzionalità di spicco di Pharo che vedremo più avanti
  • Funziona sulla maggior parte delle piattaforme (Windows, macOS, Linux, con supporto ARM) su una macchina virtuale veloce (OpenSmalltalk)
  • Non è solo un'implementazione di Smalltalk, ed è ancora in sviluppo attivo (l'ultima versione di Smalltalk è Smalltalk 80, del 1980)
  • Una community amichevole

Tcl (si pronuncia «tickle»)

  • Pochissima sintassi: appena 12 regole, e sta su un foglio di carta. Anche la semantica è relativamente semplice. Rende i programmi facili da leggere e da imparare
  • Concorrenza semplice tramite coroutine, che permette di scrivere codice asincrono come se fosse sincrono
  • Event loop integrato per la programmazione di rete e l'I/O asincrono sui file
  • Maturo, ma in continua evoluzione

Ballerina

  • Supporto di prima classe per l'elaborazione dichiarativa e type-safe di JSON, XML e dati tabellari, con query integrate nel linguaggio
  • Tipi flessibili, con il typing strutturale (duck typing) ampiamente diffuso. I tipi chiusi sono un modo per fare subtyping, mentre i tipi aperti gestiscono con eleganza l'invio di troppi dati. Data binding e validazione integrati quando si usano nelle risorse HTTP
  • Supporto integrato per i pattern di integrazione e i connettori più comuni, tra cui transazioni distribuite, compensazione e circuit breaker
  • Ogni programma Ballerina è automaticamente osservabile da qualsiasi strumento Open Telemetry, offrendoti pieno controllo e visibilità sul comportamento e sulle prestazioni del codice.
  • Ottima concorrenza tramite gli strand, che sono thread leggeri. Le chiamate di I/O non bloccanti sono semplici. Il compilatore può aiutare a verificare le chiamate di invio e ricezione tra i worker, evitando i deadlock. Anche l'immutabilità è ottima per il networking
  • Gestione esplicita degli errori tramite i tipi union e lo zucchero sintattico check che aiuta in questo

Red

  • Leggero. L'intera toolchain è un download di circa 1,5 MB, un singolo eseguibile.
  • Portabile. Cross-compilazione semplice. Produce binari piccoli e senza dipendenze. Basso consumo di memoria.
  • Red è un meta-linguaggio e un formato di dati a sé (come i LISP). I programmi possono trasformare e leggere il codice.
  • Reattivo: gli oggetti possono essere collegati tra loro per ridurre dimensioni e complessità del programma (pensa ai fogli Excel)

Dove si usano questi linguaggi?

Prolog:

  • Intelligenza artificiale (Watson di IBM)
  • Elaborazione del linguaggio (naturale)
  • Database distribuito per basi di conoscenza (TerminusDB)
  • Usato persino per specificare le regole di tipo della Java Virtual Machine

Unison

  • Usato per scrivere sistemi distribuiti
  • Servizi web generici
  • Job di calcolo batch

Pharo

  • Usato per strumenti interattivi
  • Usato in ambiti molto diversi: piattaforme di trading online e strumenti cloud per la gestione degli investimenti
  • Prototipazione di interfacce utente e interazioni nell'industria della difesa
  • Applicazioni web per la pianificazione di eventi
  • Ambiente di sviluppo moldable per esplorare API, dati e sistemi

Tcl

  • Usato come glue code o incorporato
  • Usato nelle interfacce grafiche dei router CISCO
  • Vari sistemi di produzione industriale
  • La NASA lo ha usato in molte occasioni
  • Altre grandi aziende includono Pixar, Boeing, Intel, NBC e molte altre.
  • Tk, il toolkit per le finestre, è stato adottato da altri linguaggi di «scripting» come perl/python/ruby.
  • Expect, uno strumento per automatizzare applicazioni CLI interattive

Ballerina

  • Usato per applicazioni cloud native
  • Usato da MOSIP, una piattaforma di identità fondazionale che aiuta governi e altre organizzazioni a implementare sistemi di identità digitale e fondazionale in modo conveniente.

Cosa rende questi linguaggi interessanti dalla prospettiva della programmazione?

Prolog:

  • Linguaggio di programmazione logica (uno dei primi), che è un paradigma a sé (come la programmazione a oggetti e quella funzionale)
  • Tipizzazione dinamica

Unison

  • Linguaggio puramente funzionale
  • Tipizzazione statica

Pharo

  • Linguaggio orientato agli oggetti, ma nel senso di Smalltalk. Diverso dai linguaggi orientati agli oggetti «regolari»: niente costruttori, niente dichiarazioni di tipo, niente interfacce, niente tipi primitivi.
  • Tipizzazione dinamica

Tcl

  • Multi-paradigma: supporta gli stili orientato agli oggetti, imperativo e funzionale
  • Tipizzazione dinamica

Ballerina

  • Multi-paradigma: orientato agli oggetti, funzionale e dichiarativo
  • Tipizzazione statica

Red

  • Multi-paradigma: imperativo, funzionale, orientato agli oggetti, simbolico, reattivo
  • Tipizzazione statica

Quali sono le loro caratteristiche più interessanti?

Prolog:

  • Flessibile. Molti predicati integrati funzionano in più direzioni. Permette di interrogare e creare dati con la stessa sintassi. Alcuni problemi difficili in altri linguaggi diventano banali
  • Le DCG sono come un parser combinator integrato, ottimo per analizzare, generare, completare e verificare sequenze
  • La CLP è un modo efficiente per definire un programma in termini di vincoli

Unison

  • Il codice non è testo, ma dati (immutabili). Il codice è memorizzato in un database, a cui si accede e che si aggiorna tramite l'Unison Codebase Manager. I file di testo sono solo uno dei modi per portare il codice dentro il database. I dati immutabili significano anche che i risultati dei test possono essere messi in cache e che il controllo dei tipi va fatto una sola volta
  • Le definizioni sono referenziate tramite hash, non tramite nome. Questo si chiama codice «content-addressed». L'albero sintattico di una definizione ne determina l'hash. Nessun conflitto di versioning, le rinomine sono banali.
  • La documentazione di Unison è un'entità di prima classe nel linguaggio ed è sempre sincronizzata con le funzioni che descrive. Puoi incorporarvi esempi live e assicurarti che il codice di esempio compili.
  • Ideale per il calcolo nel cloud: non ci sono build, le funzioni possono essere distribuite al volo e si perde meno tempo a scrivere encoder e decoder per la comunicazione tra servizi Unison.

Pharo

  • Modello di esecuzione lineare: tutto è un oggetto e l'esecuzione avviene esclusivamente tramite messaggi (che sono anch'essi oggetti). Persino il flusso di controllo avviene tramite messaggi. Il modello è semplice, ma molto potente. Molto diverso dagli altri linguaggi orientati agli oggetti.
  • Il codice risiede in un'immagine Pharo, non in file di testo. Un'immagine Pharo contiene l'intero stato della tua applicazione e può essere eseguita in una macchina virtuale Pharo. Quando salvi il tuo lavoro, Pharo salva l'intero stato dell'ambiente come file immagine. Questo file contiene tutti gli oggetti, le loro relazioni e il contesto di esecuzione. I file immagine possono essere condivisi con altri e caricati su macchine o piattaforme diverse. Questo permette agli sviluppatori di collaborare facilmente a un progetto o di distribuire applicazioni create con Pharo
  • Vivo e immersivo, con feedback immediato durante l'esecuzione grazie a un IDE specifico di Pharo. Esegui e modifica il programma al volo, persino mentre è in esecuzione! Un debugger potente che supporta il riavvio dei metodi e la correzione dei bug al volo

Tcl

  • Sistema di tipi semplice: tutto è una stringa. «Tutto è una stringa» era il modo in cui Tcl veniva implementato un tempo. Ora, sotto il cofano, c'è un sistema di tipi robusto, in cui l'entità Tcl (che sia una stringa, un float, una lista, un dizionario) ha sia una rappresentazione specifica per tipo sia una rappresentazione come stringa. Questo migliora molto le prestazioni del codice Tcl, che non ha più bisogno di convertire avanti e indietro dalle stringhe.
  • «Tutto gira come comandi». Non ci sono comandi integrati. Tcl include una «libreria standard» di comandi, tra cui if e while, eccetera. Aggiungere nuovi comandi di flusso di controllo è molto semplice: per esempio un ciclo until. È anche facile sovrascrivere un comando Tcl.
  • Essendo compatto, con una semantica semplice e implementato come libreria C, è facile da incorporare

Ballerina

  • Cloud native. Conversioni integrate da JSON a tipi definiti dall'utente. Sintassi super leggera per creare (micro)servizi. Esecuzione concorrente dei servizi integrata. Supporto per HTTP (1 e 2), GraphQL e gRPC fin da subito
  • Genera automaticamente artefatti per distribuire il tuo codice su cloud diversi. Questi artefatti possono essere Dockerfile, immagini Docker, file YAML Kubernetes o funzioni serverless.
  • Visualizzazione del codice come diagrammi di sequenza integrata. Ottima per visualizzare il flusso del codice. Può persino visualizzare le chiamate HTTP

Red

  • Ottimo per costruire e analizzare linguaggi specifici di dominio, i «dialetti» (terminologia di Rebol). Diversi dialetti integrati:
  • Red/System: un linguaggio di programmazione di sistema a livello C, compilato in codice nativo
  • Parse: un potente parser PEG
  • VID: un semplice dialetto per creare layout di interfacce grafiche
  • Draw: un dialetto per il disegno vettoriale 2D
  • Rich-text: un dialetto per descrivere testo formattato
  • Interfacce grafiche semplici. Completamente cross-platform e native. Supporta il data binding bidirezionale, l'aggiornamento live, gli eventi e dà accesso alle funzionalità del sistema operativo

Quali conviene provare durante maggio?

Sono tutti linguaggi interessanti di per sé, quindi si potrebbe sostenere la scelta di qualsiasi di essi.

  • Se ti interessa il cloud computing, Ballerina e Unison sono ottime opzioni. Anche Tcl ha ottime funzionalità di concorrenza
  • Se conosci la programmazione orientata agli oggetti ma vuoi vederne una versione diversa, prova Pharo
  • Se vuoi provare cosa significa programmare in un linguaggio che non si basa su file di testo, prova Pharo con il suo IDE unico e potente, oppure Unison con l'Unison Codebase Manager.
  • Se ti piace il minimalismo, Tcl, Prolog, Pharo e Red hanno tutti una sintassi piuttosto ridotta e una semantica relativamente semplice
  • Se vuoi vedere un mix interessante di paradigmi, Ballerina, Tcl e Red supportano tutti paradigmi diversi
  • Se vuoi provare paradigmi più insoliti, prova Prolog per la programmazione logica, Red per la programmazione reattiva e Ballerina per la programmazione dichiarativa
  • Se ti piace la programmazione funzionale, dai un'occhiata a Unison, e in particolare alle sue Abilities.
  • Se ti interessa la metaprogrammazione, Tcl, Prolog, Pharo e Red hanno tutti un ottimo supporto

Certo, se hai tempo ti consiglio di provarne un paio! Sono tutti piuttosto unici. Risolvi lo stesso esercizio in un paio dei linguaggi in evidenza e guarda quanto è diversa l'implementazione.

01 maggio 2023 · Ti è stato utile?