Langues basées sur des blocs et langues textuelles

Les langages basés sur des blocs diffèrent des langages basés sur du texte de plusieurs manières, principalement parce qu'ils sont conçus pour les utilisateurs novices. Voici une liste d'éléments à prendre en compte lors de la conception de votre propre langage basé sur des blocs.

Utiliser des listes basées sur un

Bloc qui sélectionne la lettre à un certain indice dans une chaîne et qui utilise 1 pour désigner la première lettre.

Les programmeurs novices réagissent mal lorsqu'ils rencontrent des listes basées sur zéro pour la première fois. Par conséquent, Blockly suit l'exemple de Lua et de Lambda Moo en faisant de l'indexation de liste et de chaîne une base de un.

Pour des utilisations plus avancées de Blockly, les listes basées sur zéro sont prises en charge pour faciliter la transition vers le texte. Pour les audiences plus jeunes ou plus novices, l'indexation à base 1 est toujours recommandée.

Recommandation: Le chiffre 1 est le premier.

Accepter des règles de dénomination plus souples

Blocs avec les noms de variables location_x (x minuscule) et location_X (X majuscule), qui ne sont pas sensibles à la casse.

Les programmeurs novices ne s'attendent pas à ce que location_X et location_x soient des variables différentes. Par conséquent, Blockly suit l'exemple de BASIC et HTML en rendant les variables et les fonctions insensibles à la casse. Scratch utilise une approche plus subtile (comme illustré à droite) et fait la distinction entre les majuscules et les minuscules pour les noms de variables, mais pas pour les vérifications d'égalité.

De plus, Blockly ne nécessite pas que les variables et les fonctions respectent le schéma [_A-Za-z][_A-Za-z0-9]* standard. Si vous souhaitez nommer une variable List of zip codes ou רשימת מיקודים, c'est tout à fait acceptable.

Recommandation: Ignorer la casse, autoriser tous les noms.

Rendre toutes les variables globales

Les programmeurs novices ont également du mal à comprendre la portée. Par conséquent, Blockly suit l'exemple de Scratch en rendant toutes les variables globales. Le seul inconvénient des variables globales est que la récursion est plus délicate (il faut insérer et supprimer des variables dans une liste), mais il s'agit d'une technique de programmation qui dépasse le champ d'application des utilisateurs cibles de Blockly.

Recommandation: Le champ d'application n'est pas pertinent. Laissez-le de côté.

Envisager comment gérer les valeurs de retour facultatives

De nombreuses fonctions de la programmation textuelle effectuent une action, puis renvoient une valeur. Cette valeur de retour peut être utilisée ou non. Par exemple, la fonction pop() d'une pile. Pop peut être appelé pour obtenir et supprimer le dernier élément, ou simplement pour supprimer le dernier élément, la valeur renvoyée étant ignorée.

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

Les langages basés sur des blocs ne sont généralement pas efficaces pour ignorer une valeur renvoyée. Un bloc de valeur doit être connecté à un élément qui accepte la valeur. Plusieurs stratégies permettent de résoudre ce problème.

a) Contourner le problème. La plupart des langages basés sur des blocs sont conçus pour éviter ces cas. Par exemple, Scratch ne comporte aucun bloc présentant à la fois des effets secondaires et une valeur renvoyée.

b) Fournir deux blocs. Si l'espace dans la boîte à outils n'est pas un problème, une solution simple consiste à fournir deux blocs de ce type, l'un avec et l'autre sans valeur renvoyée. L'inconvénient est que cela peut entraîner une boîte à outils confuse avec de nombreux blocs presque identiques.

Un bloc de valeur qui supprime et renvoie le dernier élément d'une liste et un bloc d'instruction qui ne supprime que le dernier élément d'une liste.

c) Muter un bloc. Utilisez une liste déroulante, une case à cocher ou une autre commande permettant à l'utilisateur de choisir s'il y a une valeur renvoyée ou non. Le bloc change ensuite de forme en fonction de ses options. Vous trouverez un exemple de ce type dans le bloc d'accès à la liste de Blockly.

Bloc qui passe d'un bloc de valeur à un bloc d'instruction lors de la suppression du dernier élément d'une liste, selon qu'il renvoie également cet élément.

d) Consommer la valeur. La première version d'App Inventor créait un bloc de canal spécial qui consommait toute valeur connectée. Les utilisateurs ne comprenaient pas ce concept. La deuxième version d'App Inventor a donc supprimé le bloc de pipe et recommandé aux utilisateurs d'attribuer simplement la valeur à une variable jetable.

Blocs montrant deux méthodes différentes pour ignorer la sortie d'un bloc. Le premier utilise un bloc de pipe pour "manger" la valeur, et le second définit la valeur d'une variable appelée "junk".

Recommandation: Chaque stratégie présente des avantages et des inconvénients. Choisissez celle qui convient le mieux à vos utilisateurs.

Générer du code lisible

Les utilisateurs avancés de Blockly doivent pouvoir examiner le code généré (JavaScript, Python, PHP, Lua, Dart, etc.) et reconnaître immédiatement le programme qu'ils ont écrit. Par conséquent, des efforts supplémentaires doivent être faits pour que ce code généré par machine reste lisible. Les parenthèses superflues, les variables numériques, les espaces vides compressés et les modèles de code verbeux empêchent de produire un code élégant. Le code généré doit inclure des commentaires et respecter les guides de style de Google.

Recommandation: Soyez fier de votre code généré. Montrez-le à l'utilisateur.

Accepter les différences entre les langues

Un effet secondaire du désir d'un code propre est que le comportement de Blockly est largement défini en termes de comportement du langage compilé croisé. Le langage de sortie le plus courant est JavaScript, mais si Blockly devait compiler de manière croisée vers une autre langue, aucune tentative déraisonnable ne devrait être faite pour préserver le comportement exact dans les deux langues. Par exemple, en JavaScript, une chaîne vide est fausse, alors qu'en Lua, elle est vraie. Définir un seul modèle de comportement pour l'exécution du code de Blockly, quelle que soit la langue cible, donnerait un code impossible à gérer qui semble sortir du compilateur GWT.

Recommandation: Blockly n'est pas une langue. Autorisez la langue existante à affecter le comportement.