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 à :
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 );