Article de reference

Icône (langage de programmation)

{{cite web |last=Townsend |first=Gregg |date=September 7, 2025 |url=https://github.com/gtownsend/icon/tree/v9.5.25a |title=Release v9.5.25a |website=[[GitHub]]}} "},"implementat...

langage de programmation de très haut niveau basé sur le concept d'« exécution orientée vers un but ». Dans ce langage, une expression renvoie un « succès » accompagné d'un résultat, ou un « échec » indiquant l'absence de résultat valide. Le succès ou l'échec d'une expression donnée oriente le traitement ultérieur, contrairement aux langages conventionnels qui utilisent généralement une logique booléenne écrite par le programmeur pour parvenir aux mêmes objectifs. La logique des structures de contrôle de base étant souvent implicite en Icon, les tâches courantes peuvent être réalisées avec moins de code explicite.

Icon a été conçu par Ralph Griswold après son départ des Bell Labs , où il avait largement contribué au développement du langage SNOBOL . SNOBOL était un langage de traitement de chaînes de caractères dont la syntaxe était considérée comme obsolète au début des années 1970. Après son arrivée à l' Université d'Arizona , il a approfondi les concepts fondamentaux de SNOBOL dans SL5, mais a jugé le résultat insatisfaisant. Cela a conduit à la création d'Icon, une version considérablement modernisée qui combine la concision et la richesse conceptuelle du code des langages de type SNOBOL avec la syntaxe plus familière des langages inspirés d'ALGOL , tels que C ou Pascal .

À l'instar des langages qui l'ont inspiré, Icon est principalement utilisé pour la gestion des chaînes de caractères et des motifs textuels. Les opérations sur les chaînes échouent souvent, par exemple lorsqu'on recherche « le » dans « monde ». Dans la plupart des langages, cela nécessite des tests et des branchements pour éviter d'utiliser un résultat invalide. En Icon, la plupart de ces tests sont tout simplement superflus, ce qui réduit considérablement la quantité de code à écrire. La gestion de motifs complexes peut être réalisée en quelques lignes de code concis, comme dans des langages plus spécialisés tels que Perl , tout en conservant une syntaxe plus fonctionnelle, familière aux utilisateurs d'autres langages de type ALGOL.

Icon n'est pas orienté objet , mais une extension orientée objet nommée Idol a été développée en 1996 et est finalement devenue Unicon . Elle a également inspiré d'autres langages, notamment grâce à ses générateurs simples ; les générateurs d'Icon ont été une source d'inspiration majeure pour le langage Python .

SNOBOL , connu rétrospectivement sous le nom de SNOBOL1, a été lancé à l'automne 1962 au sein du département de recherche en programmation des laboratoires Bell . Ce projet répondait aux difficultés rencontrées lors de l'utilisation du langage SCL pour la manipulation de formules polynomiales, l'intégration symbolique et l'étude des chaînes de Markov . SCL, écrit par le directeur du département, Chester Lee, était à la fois lent et possédait une syntaxe de bas niveau qui générait des volumes de code considérables, même pour des projets simples. Après avoir brièvement envisagé le langage COMIT, Ivan Polonsky, Ralph Griswold et David Farber, tous trois membres du département (composé de six personnes), ont décidé de développer leur propre langage afin de résoudre ces problèmes.

Les premières versions fonctionnaient sur IBM 7090 début 1963 et, dès l'été, le système était déployé et utilisé dans tout Bell. Cela a conduit presque immédiatement à SNOBOL2, qui ajoutait plusieurs fonctions intégrées et la possibilité de se lier à du code assembleur externe . Publié en avril 1964, il était principalement utilisé chez Bell, mais aussi, dans une moindre mesure, dans le cadre du projet MAC . L'introduction des fonctions système a surtout mis en évidence le besoin de fonctions définies par l'utilisateur, qui constituaient la principale nouveauté de SNOBOL3, publié en juillet 1964.

L'introduction de SNOBOL3 a coïncidé avec des changements majeurs au sein du département informatique des Bell Labs, notamment l'acquisition du nouvel ordinateur central GE 645 qui aurait nécessité une réécriture de SNOBOL. L'équipe a alors proposé de développer une nouvelle version fonctionnant sur une machine virtuelle , nommée SIL (SNOBOL Intermediate Language), permettant ainsi un portage aisé sur toute plateforme suffisamment puissante. Cette proposition a été acceptée sous le nom de SNOBOL4 en septembre 1965. À cette date, les plans d'une version considérablement améliorée du langage ont émergé en août 1966. Les travaux sur le langage se sont poursuivis tout au long des années 1960, avec notamment l'ajout du type tableau associatif dans les versions ultérieures, qu'ils appelaient alors « table ».

SL5 mène à Icon

Griswold quitta Bell Labs pour devenir professeur à l' Université d'Arizona en août 1971. Il y présenta SNOBOL4 comme outil de recherche. Il reçut des subventions de la National Science Foundation pour poursuivre le développement et l'évolution de SNOBOL.

Développé initialement au début des années 1960, le langage SNOBOL présente des similitudes syntaxiques avec d'autres langages de programmation anciens tels que FORTRAN et COBOL . En particulier, il est dépendant de l'organisation en colonnes, car nombre de ces langages étaient saisis sur des cartes perforées , où cette disposition est naturelle. De plus, les structures de contrôle reposaient presque exclusivement sur l'utilisation de branches plutôt que sur celle de blocs , pourtant devenus indispensables après l'introduction d' ALGOL 60. Lorsqu'il s'installa en Arizona, la syntaxe de SNOBOL4 était déjà irrémédiablement obsolète.

Griswold entreprit d'implémenter le concept de succès/échec sous-jacent à SNOBOL à l'aide de structures de contrôle de flux traditionnelles telles que if/then. Ceci donna naissance à SL5, abréviation de « SNOBOL Language 5 », mais le résultat fut insatisfaisant. En 1977, il reprit le langage afin d'envisager une nouvelle version. Il abandonna le système de fonctions très puissant introduit dans SL5 au profit d'un concept plus simple de suspension/reprise et développa un nouveau concept pour le successeur naturel de SNOBOL4, selon les principes suivants ;

  • Fondements philosophiques et sémantiques de SNOBOL4
  • Base syntaxique de SL5
  • Caractéristiques SL5, à l'exclusion du mécanisme de procédure généralisée

Le nouveau langage fut initialement connu sous le nom de SNOBOL5, mais comme il différait considérablement de SNOBOL, hormis son concept sous-jacent, un nouveau nom s'imposa. Après avoir envisagé « s » en hommage à « C », cette option fut finalement abandonnée en raison des problèmes de composition rencontrés avec ce nom. Plusieurs autres noms furent proposés puis écartés : Irving, Bard et « TL » pour « The Language ». C'est à cette époque que Xerox PARC commença à publier ses travaux sur les interfaces graphiques et que le terme « icône » fit son apparition dans le vocabulaire informatique. Il fut décidé de le renommer d'abord « icon », avant d'opter finalement pour « Icon ».

Langue

Syntaxe de base

Le langage Icon est dérivé de la classe ALGOL des langages de programmation structurés et possède donc une syntaxe similaire à celle du C ou du Pascal . Icon est très proche du Pascal, notamment par l'utilisation des langages de script (ainsi qu'avec SNOBOL et SL5, dont il est issu) : les variables n'ont pas besoin d'être déclarées, les types sont convertis automatiquement et les nombres peuvent être convertis en chaînes de caractères et inversement. Une autre caractéristique commune à de nombreux langages de script, mais pas à tous, est l'absence de caractère de fin de ligne ; en Icon, les lignes qui ne se terminent pas par un point-virgule sont complétées par un point-virgule implicite si cela est pertinent.

Les procédures sont les éléments de base des programmes Icon. Bien qu'elles utilisent la nomenclature Pascal, elles fonctionnent davantage comme des fonctions C et peuvent renvoyer des valeurs ; il n'existe pas des nombres magiques ou d'autres techniques.

Par exemple, une fonction qui renvoie la position d'une sous-chaîne dans une autre chaîne est une routine courante présente dans la plupart des environnements d'exécution . En JavaScript , trouver la position du mot « World » dans le programme « Hello, World! » se ferait avec ` is_position()` , qui renverrait 7 dans la variable ` is_position( )`. Si l'on demande plutôt ` is_position()`, le code « échouera », car le terme recherché n'apparaît pas dans la chaîne. En JavaScript, comme dans la plupart des langages, cela sera indiqué par le renvoi d'un nombre magique, ici -1. .indexOf("World").indexOf("Goodbye")

En SNOBOL, un échec de ce type renvoie une valeur spéciale I = I + 1 LE ( I , 5 ) : S ( BOUCLE ) END

Pour effectuer la boucle, l'opérateur inférieur ou égal, de programmation structurée qui a envahi l'industrie informatique à la fin des années 1960. Le second changement a été de permettre la propagation des « échecs » le long de la chaîne d'appels, de sorte que des blocs entiers réussissent ou échouent dans leur intégralité. Il s'agit d'un concept clé du langage Icon. Alors que dans les langages traditionnels, il faudrait inclure du code pour tester le succès ou l'échec selon la logique booléenne , puis effectuer un branchement en fonction du résultat, ces tests et branchements sont inhérents au code Icon et n'ont pas besoin d'être écrits explicitement.

Par exemple, considérons ce fragment de code écrit en Java . Il appelle la fonction ` exception de pointeur nul . Pour éviter cela, `read() de fonction imbriqué échoue. Par exemple, le code ci-dessus peut être réduit à :

exception ; les exceptions sont des situations inhabituelles, et non des résultats attendus. Dans Icon, les échecs sont des résultats attendus ; atteindre la fin d'un fichier est une situation normale et non une exception. Icon ne gère pas les exceptions au sens traditionnel du terme, bien que le mot-clé `fail` soit souvent utilisé dans des situations similaires. Par exemple, si le fichier en cours de lecture n'existe pas, ` coût distribué qu'Icon évite généralement.

Icon utilise ce même mécanisme orienté vers un but pour effectuer des tests booléens classiques, avec toutefois de subtiles différences. Une simple comparaison comme `if` ne signifie pas « si l'évaluation de l'expression conditionnelle aboutit à ou renvoie une valeur vraie », comme ce serait le cas dans la plupart des langages ; elle signifie plutôt « si l'expression conditionnelle réussit et ne se termine pas ». Dans ce cas, l' opérateur `if` réussit si la comparaison est vraie. La clause ` if` est appelée si l'expression réussit, et soit la clause `if` (si elle est présente), soit la ligne suivante si elle échoue. Le résultat est similaire à la structure `if/then` classique rencontrée dans d'autres langages : `if` exécute ` if` si `if` est inférieur à `if` . La subtilité réside dans le fait que cette même expression de comparaison peut être placée n'importe où, par exemple :)effetatomicité de l'exécution.

Générateurs

En Icon, les expressions peuvent renvoyer une seule valeur. Par exemple, l'expression ` x"},"parts":[{"template":{"target":{"wt":"code","href":"./Template:Code"},"params":{"1":{"wt":"5 > x"}},"i":0}}] 5 > xx` sera évaluée et renverra `x` si sa valeur est inférieure à 5 ; sinon, elle échouera et ne renverra aucune valeur. Icon inclut également le concept de procédures qui ne renvoient pas immédiatement de succès ou d'échec, mais de nouvelles valeurs à chaque appel. Ces procédures sont appelées générateurs et constituent un élément clé du langage Icon. En Icon, l'évaluation d'une expression ou d'une fonction produit une séquence de résultats . Cette séquence contient toutes les valeurs possibles que l'expression ou la fonction peut générer. Lorsque la séquence de résultats est épuisée, l'expression ou la fonction échoue.

Icon permet à toute procédure de renvoyer une ou plusieurs valeurs, contrôlées par les mots clés `return` des itérateurs .

Un autre type de générateur est l' alternateur , qui ressemble à l' | x < 5 ) faire écrire ( i )

Cela écrit 1, "bonjour" et peut-être 5 en fonction de la valeur de x.

De même, l' opérateur de conjonction , ; i = indexOf ( "le" , s ); write ( i );

Cette fonction analysera la chaîne , s , i + 1 ); écrire ( j );

Cela lui indique de commencer la recherche à l'emplacement 5, de sorte qu'elle ne correspondra pas à la première occurrence trouvée précédemment. Cependant, il se peut qu'il n'y ait pas de deuxième occurrence de « the » (ni de première d'ailleurs), la valeur de retour ; i = indexOf ( " le" , s ); while i != -1 { write ( i ); i = indexOf ( "le" , s , i + 1 ); }

En Icon, l'équivalent chaque écrire ( trouver ( "le" , s ))

Bien sûr, il arrive qu'on souhaite trouver une chaîne de caractères après un certain point dans les données d'entrée, par exemple lors de l'analyse d'un fichier texte contenant un numéro de ligne dans les quatre premières colonnes, un espace, puis une ligne de texte. L'exécution dirigée par un objectif permet d'ignorer les numéros de ligne :

, s ))

La position ne sera renvoyée que si « the » apparaît après la position 5 ; sinon, la comparaison échouera, l’écriture sera ignorée et l’écriture n’aura pas lieu.

L' Smalltalk . Par exemple, la boucle ci-dessus peut être réécrite ainsi :

types de collections, notamment des listes (pouvant également servir de piles et de files d'attente ) , des tables (aussi appelées dictionnaires ou maps dans d'autres langages), des ensembles , etc. Icon les désigne comme des structures . Les collections sont des générateurs natifs et peuvent être facilement appelées à l'aide de la syntaxe bang. Par exemple :

l'entrée standard , et , "tabby" , 2002 , 8 ]

Les éléments peuvent inclure d'autres structures. Pour créer des listes plus longues, Icon inclut le Le découpage de tableaux est également inclus, permettant de créer de nouvelles listes à partir des éléments d'autres listes ; par exemple, il produit une nouvelle liste appelée aCat qui contient « tabby » et 2002.] := 1 symboles [ "ici" ] := 2

Ce code crée une table qui utilise zéro comme valeur par défaut pour toute clé inconnue. Il ajoute ensuite deux éléments à la table, avec les clés « there » et « here », et les valeurs 1 et 2.

Les ensembles sont similaires aux listes, mais ne contiennent qu'un seul élément par valeur. Icon inclut les fonctions )

Chaque caractère de la chaîne sera affiché sur une ligne distincte.

On peut extraire des sous-chaînes d'une chaîne en spécifiant une plage entre crochets. Une plage peut pointer vers un caractère unique ou vers une portion de la chaîne. L'indexation des chaînes peut se faire à partir de la droite ou de la gauche. Les positions dans une chaîne sont définies comme étant comprises entre les caractères 1 A 2 B 3 C 4 et peuvent être spécifiées à partir de la droite : -3 A -2 B -1 C 0

Par exemple,

\"W\" \"Wikipedia\"[3] ==> \"k\" \"Wikipedia\"[0] ==> \"a\" \"Wikipedia\"[1:3] ==> \"Wi\" \"Wikipedia\"[-2:0] ==> \"ia\" \"Wikipedia\"[2+:3] ==> \"iki\" "
"Wikipédia" [ 1 ] ==> "W" "Wikipédia" [ 3 ] ==> "k" "Wikipédia" [ 0 ] ==> "a" "Wikipédia" [ 1 : 3 ] ==> "Wi" "Wikipédia" [ - 2 : 0 ] ==> "ia" "Wikipédia" [ 2 + : 3 ] ==> "iki"

Le dernier exemple montre l'utilisation d'une longueur au lieu d'une position finale

La spécification d'indexation peut être utilisée comme une lvalue dans une expression. Cela permet d'insérer des chaînes de caractères dans une autre ou de supprimer des parties d'une chaîne. Par exemple :

s [ 2 ] := "123" # s a maintenant la valeur "a123c" s := "abcdefg" s [ 3 : 5 ] := "ABCD" # s a maintenant la valeur "abABCDefg" s := "abcdefg" s [ 3 : 5 ] := # s a maintenant la valeur "abefg"

Analyse de chaînes

Une autre simplification pour la gestion des chaînes de caractères est le système de balayage))

Icon désigne le membre gauche de la chaîne remonter de cette manière.

Il simplification syntaxique ; cela configure également un « environnement de lecture de chaînes » pour toute opération sur les chaînes ultérieure. Cet environnement repose sur deux variables internes : `or` s ? écrire ( "sujet=[" , &sujet , "], pos=[" , &pos , "]" )

produirait :

s ? { # Établir l'environnement de lecture de chaînes tant que non pos ( 0 ) faire { # Tester la fin de la chaîne tab ( many ( ' ' )) # Ignorer les espaces mot := tab ( upto ( ' ' ) | 0 ) # le mot suivant se trouve jusqu'au prochain espace -ou- la fin de la ligne write ( mot ) # écrire le mot } }

Plusieurs nouvelles fonctions sont introduites dans cet exemple. s ? écrire ( Mdate () | "date non valide" ) fin# Définir une fonction de correspondance qui renvoie # une chaîne correspondant à un jour, un mois ou un mois. Procédure jourdemois Mdate () # Définir des valeurs initiales. Dates statiques. Jours statiques initialisés { jours := [ "Lun" , "Mar" , " Mer" , "Jeu" , "Ven" , "Sam" , "Dim" ] mois := [ "Jan" , "Fév" , " Mar" , " Avr " , "Mai" , "Juin" , "Juil" , "Août" , "Sept" , "Oct" , "Nov" , "Déc" ] }chaque suspension ( retval <- tab ( match ( ! jours )) || # Correspond à un jour = || # Suivi d'un espace tab ( match ( ! mois )) || # Suivi du mois = || # Suivi d'un espace matchdigits ( 2 ) # Suivi d'au maximum 2 chiffres ) & ( = | pos ( 0 ) ) & # Soit un espace, soit la fin de la chaîne retval # Et enfin, retourne la chaîne end# Fonction de correspondance qui renvoie une chaîne de n chiffres procedure matchdigits ( n ) suspend ( v := tab ( many ( &digits )) & * v <= n ) & v end

Critiques

Laurence Tratt a rédigé un article sur Icon, examinant ses applications concrètes et soulignant plusieurs points problématiques. Parmi ceux-ci figuraient des choix pratiques, hérités du traitement de chaînes de caractères, mais moins pertinents dans d'autres domaines. En voici quelques exemples :

La décision d'échouer par défaut à la fin des procédures est logique dans le contexte des générateurs, mais moins pertinente dans le cas des procédures générales. Reprenons l'exemple mentionné précédemment : débogueur interactif , tout le code est exécuté sans ) } fin

Ce programme affichera « pris ». En effet, le test clarté du code , ayant cru à tort qu’il testait « c vaut-il zéro ? » ou « c existe-t-il ? ».

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index