Lingue basate su blocchi e su testo

Le lingue basate su blocchi sono diverse da quelle basate su testo in diversi modi, principalmente perché sono progettate per gli utenti principianti. Di seguito è riportato un elenco di aspetti da considerare quando progetti il tuo linguaggio basato su blocchi.

Utilizzare elenchi basati su 1

Blocco che seleziona la lettera in un determinato indice di una stringa e che utilizza 1 per indicare la prima lettera.

I programmatori alle prime armi reagiscono male quando si imbattono per la prima volta negli elenchi a partire da zero. Di conseguenza, Blockly segue l'esempio di Lua e Lambda Moo impostando l'indice di elenchi e stringhe su 1.

Per utilizzi più avanzati di Blockly, sono supportati gli elenchi a partire da zero per semplificare la transizione al testo. Per i segmenti di pubblico più giovani o meno esperti, è comunque consigliata l'indicizzazione basata su un solo livello.

Consiglio: 1 è il primo numero.

Supporta regole di denominazione liberali

Blocchi con i nomi delle variabili senza distinzione tra maiuscole e minuscole location_x (x minuscolo) e
location_X (X maiuscolo).

I programmatori principianti non si aspettano che location_X e location_x siano variabili diverse. Di conseguenza, Blockly segue l'esempio di BASIC e HTML rendendo le variabili e le funzioni insensibili alle maiuscole. Scratch utilizza un approccio più raffinato (come mostrato a destra) ed è sensibile alle maiuscole per i nomi delle variabili, ma non per i controlli di uguaglianza.

Inoltre, Blockly non richiede che le variabili e le funzioni siano conformi allo schema [_A-Za-z][_A-Za-z0-9]* tipico. Se si vuole assegnare il nome List of zip codes o רשימת מיקודים a una variabile, è perfettamente consentito.

Consiglio: ignora le maiuscole e consenti qualsiasi nome.

Rendi tutte le variabili globali

Anche i programmatori principianti hanno difficoltà a comprendere l'ambito. Di conseguenza, Blockly segue l'esempio di Scratch rendendo tutte le variabili globali. L'unico svantaggio delle variabili globali è che la ricorsione è più complicata (è necessario spingere e pop le variabili in un elenco), ma si tratta di una tecnica di programmazione che va oltre lo scopo degli utenti di destinazione di Blockly.

Consiglio: l'ambito non rientra nell'ambito, lascialo per dopo.

Valuta come gestire i valori restituiti facoltativi

Molte funzioni nella programmazione basata su testo eseguono un'azione e poi restituiscono un valore. Questo valore restituito può essere utilizzato o meno. Un esempio è la funzione pop() di una pila. Pop può essere chiamato per ottenere e rimuovere l'ultimo elemento oppure può essere chiamato solo per rimuovere l'ultimo elemento ignorando il valore restituito.

var last = stack.pop();  // Get and remove last element.
stack.pop();  // Just remove last element.

I linguaggi basati su blocchi in genere non sono bravi a ignorare un valore restituito. Un blocco di valore deve essere collegato a qualcosa che accetta il valore. Esistono diverse strategie per gestire questo problema.

a) Evita il problema. La maggior parte dei linguaggi basati su blocchi è progettata per evitare questi casi. Ad esempio, Scratch non ha blocchi con effetti collaterali e valore restituito.

b) Fornisci due blocchi. Se lo spazio nella cassetta degli attrezzi non è un problema, una soluzione semplice è fornire due di ogni tipo di blocco, uno con e uno senza un valore restituito. Lo svantaggio è che questo può portare a una cassetta degli attrezzi confusa con molti blocchi quasi identici.

Un blocco di valori che rimuove e restituisce l'ultimo elemento di un elenco e un blocco di istruzioni
che rimuove solo l'ultimo elemento di un ultimo.

c) Muta un blocco. Utilizza un menu a discesa, una casella di controllo o un altro controllo che consenta all'utente di scegliere se è presente o meno un valore restituito. Il blocco cambia forma in base alle opzioni. Un esempio di questo è il blocco di accesso all'elenco di Blockly.

Blocco che cambia forma da un blocco di valore a un blocco di istruzioni quando viene rimosso

l'ultimo elemento di un elenco, a seconda che restituisca anche questo

elemento.

d) Mangia il valore. La prima versione di App Inventor creava un blocco speciale di pipe che otteneva qualsiasi valore collegato. Gli utenti non hanno compreso il concetto e la seconda versione di App Inventor ha rimosso il blocco di pipe e consigliato agli utenti di assegnare semplicemente il valore a una variabile usa e getta.

Blocchi che mostrano due modi diversi per ignorare l'output di un blocco. Il primo
utilizza un blocco di pipe per "consumare" il valore e il secondo imposta il valore di una variabile
chiamata "junk".

Consiglio: ogni strategia ha pro e contro, scegli quella più adatta ai tuoi utenti.

Genera codice leggibile

Gli utenti di Blockly Advanced dovrebbero essere in grado di esaminare il codice generato (JavaScript, Python, PHP, Lua, Dart e così via) e riconoscere immediatamente il programma che hanno scritto. Ciò significa che è necessario fare uno sforzo in più per mantenere leggibile questo codice generato automaticamente. Parentesi superflue, variabili numeriche, spazi vuoti compressi e modelli di codice verbosi ostacolano la produzione di codice elegante. Il codice generato deve includere commenti e deve essere conforme alle linee guida di stile di Google.

Consiglio: sii orgoglioso del codice generato. Mostralo all'utente.

Accetta le differenze tra le lingue

Un effetto collaterale del desiderio di avere un codice pulito è che il comportamento di Blockly è in gran parte definito in termini di comportamento del linguaggio cross-compiled. Il linguaggio di output più comune è JavaScript, ma se Blockly dovesse essere sottoposto a compilazione incrociata in un linguaggio diverso, non devono essere fatti tentativi irragionevoli per preservare il comportamento esatto in entrambi i linguaggi. Ad esempio, in JavaScript una stringa vuota è falsa, mentre in Lua è vera. Definire un singolo schema di comportamento per l'esecuzione del codice di Blockly indipendentemente dalla lingua di destinazione produrrebbe un codice non manutenibile che sembra provenire dal compilatore GWT.

Consiglio: Blockly non è una lingua, lascia che sia la lingua esistente a influenzare il comportamento.