La nécessité de développer un nouveau langage, et de ne copier la syntaxe d'aucun des langages de programmation communs existants, est due à une sorte de concept original, dont nous parlerons aujourd'hui. À notre avis, le processus de création et de mise en œuvre du concept d'une nouvelle langue est en soi une histoire fascinante et informative pour tous ceux qui s'intéressent à la pragmatique des langues.
Nous supposons qu'afin de comprendre le matériel présenté, le lecteur est familiarisé avec la syntaxe et la sémantique de plusieurs langages de programmation courants à usage général.
Ne me mords pas le doigt, regarde oĂą je pointe
Warren S. McCulloch, 1960
Énoncé initial du problème
Dans un premier temps, nous nous sommes fixé la tâche de mettre en œuvre la technologie de génération autonome de tâches interactives pour le développement de l'intelligence humaine, qui s'adaptera à ses succès et à ses échecs. Autrement dit, si une personne résout avec succès une séquence d'énigmes et est efficace pour passer des jeux, cette technologie reconstruit ses algorithmes afin qu'une personne puisse résoudre des énigmes avec de nouvelles conditions plus complexes et des versions imprévisibles de jeux qui ne sont jamais exactement répétées. En cas d'échec, cette technologie ramène une personne à des positions déjà familières afin de restructurer le programme de ses capacités et de sa volonté de réaliser une nouvelle ascension intellectuelle. À la base, le programme adaptatif fait ici le même travail qu'un entraîneur personnel expérimenté dans le domaine du sport.
En général, avec certaines restrictions, cette tâche a été résolue en 2018 par l'application Helius - pleine de vie , qui se trouve dans l' App Store .
Dans le processus de mise en œuvre du concept Helius, nous avons réalisé que pour passer à l'étape suivante et implémenter une classe fondamentalement nouvelle d'application adaptative qui serait capable de transformer complètement son architecture, en s'adaptant aux capacités humaines, nous avons besoin d'un langage de script algorithmique intégré, dont la liste peut être est également généré avec succès sous forme de texte à la fois par l'application elle-même et par une personne, ou peut être modifié par une personne ou un autre programme basé sur le code fourni en tant que prototype initial.
Nous avons défini les principales exigences et conclu rapidement qu'un concept axé sur l'expression des besoins créatifs d'un développeur n'est pas très bien modélisé dans aucun des langages courants, car notre objectif, avec un certain degré de blague, est de programmer des personnes, pas des ordinateurs.
Puisqu'il est tout aussi «pratique» pour un système intellectuel bien conçu de générer la syntaxe de n'importe quel langage cohérent sous n'importe quelle forme, afin d'utiliser le langage de communication entre l'intelligence «artificielle» et «naturelle», il est logique d'utiliser le code algorithmique traditionnel, ce qui le rend aussi pratique que possible pour les schémas de pensée humains familier avec les langues dominantes, dont l'ancêtre était Algol. Ce sont des descendants de Pascal (Ada, Modula) et C (C ++, Java, Swift). Cependant, notre concept de construction d'abstractions et d'attention aux parenthèses est proche de l'esprit de Scheme (Lisp), et l'intégration des commandes de l'environnement de programmation dans les moyens expressifs du langage correspond aux idées des langages de script, du BASIC vintage pour les premiers micro-ordinateurs et du projet Oberon - le système Niklaus Wirth.
Notre objectif initial consiste également à fournir un langage algorithmique simple et pratique pour programmer rapidement des jeux d'esprit et des puzzles avec une courbe d'apprentissage de développeur novice d'une à deux heures. Dans le même temps, nous avons fondamentalement laissé de côté la conception visuelle des objets applicatifs dans l'esprit Scratch ou le prototypage de jeux dans le scénario et les éditeurs visuels. À notre avis, cela détourne de la créativité et de l'expression de ses propres idées, car les efforts créatifs sont plutôt remplacés par une étude et une transformation minutieuses d'objets [graphiques]. Nous proposons à l'avenir de fournir ce travail comme formation d'algorithmes pour agents intelligents.
En conséquence, nous formulons le but du langage commeéchange d'algorithmes entre intelligence artificielle et intelligence naturelle, programmation conjointe de tâches (jeux et puzzles) pour soi et pour autrui, libre échange de textes de programmes.
Bonjour le monde
Avant de discuter des principaux points de construction de la syntaxe du langage, nous présentons trois courts extraits de code. Commençons par le programme traditionnel de message de bienvenue:
PRINT “Hello world!”
Nous voyons que notre langage a un caractère de script, supposant une interprétation rapide; la commande d'impression est en majuscules et l'argument de la fonction intégrée n'est pas suivi de parenthèses ici.
Présentons deux exemples plus intéressants: trouver le plus grand diviseur commun pour deux entiers dans le style impératif et utiliser la récursivité:
FUN gcd
INPUT a: INT
INPUT b: INT
WHILE a ~= b LOOP
IF a > b THEN a -= b ELSE b -= a ENDIF
REPEAT
PRINT “gcd = “, a
RETURN
FUN gcd _ a: INT, _ b: INT -> INT
IF b == 0 THEN RETURN a ENDIF
RETURN gcd b, (a % b)
PRINT gcd 6, 9
# 3
Salut les exigences linguistiques
Chaque langage réussi est conçu avec un objectif spécifique, qui détermine ses caractéristiques syntaxiques et sa sémantique. Par exemple, ASSEMBLER a été conçu pour encoder directement les instructions du processeur sous une forme mnémotechnique conviviale; BASIC (celui avec les numéros de ligne et une instruction GOTO) a poursuivi avec succès l'idée de traduire les commandes directement vers un interpréteur de haut niveau. Le langage de programmation Hi est destiné à devenir le langage des commandes et des algorithmes pour la communication entre l'humain et l'intelligence abstraite d'un système conçu.
Par conséquent, le code du programme n'est pas le code machine compilé ni le bytecode de la machine virtuelle, mais le code source(liste) y compris les commentaires. En conséquence, l'implémentation interne du code n'est en aucun cas standardisée et est laissée à la discrétion de l'implémentation de l'interprète ou du compilateur.
Notre objectif principal est donc d'échanger des pensées en utilisant un langage formel. Introduisons trois exigences principales:
- La langue doit ĂŞtre facile Ă apprendre pour une personne
- La langue doit ĂŞtre fiable Ă utiliser
- Le langage doit être capable d'organiser des systèmes logiciels très complexes.
Explorons ces exigences de base plus en détail.
La langue doit ĂŞtre facile Ă apprendre
1) Nous utiliserons une écriture syntaxique facile à lire et familière à toute personne éduquée moderne. Nous éviterons d'expérimenter la brièveté au détriment de la lecture, comme cela se fait par exemple en langage APL.
Par conséquent, nous utilisons des constructions du genre
LOOP…REPEAT
plutôt que {…}
. En prime, nous utiliserons des accolades comme celle-ci:
s = {1, 2, 3}
nous désignerons l'affectation de la variable s à un ensemble de trois entiers.
a = [1, 2, 3]
nous noterons l'affectation de la variable a Ă un tableau de trois entiers.
L'utilisation de constructions de langage concises bien pensées vous permet également d'établir une connexion plus logique entre la sémantique et la syntaxe du langage sans utiliser le contexte de l'environnement. Nous discuterons cette thèse plus en détail plus tard lorsque nous considérerons des constructions de langage spécifiques.
2) Pour les expressions arithmétiques, nous utilisons une notation de la forme :,
a + b + c
et non (+ a b c)
, comme dans la famille LISP.
3) La nature de notre langage de script nécessite une bibliothèque intégrée de toutes les fonctions nécessaires dans l'environnement du langage sans avoir besoin de cadres externes.
4) Nous utilisons des algorithmes natifs pour les schémas de pensée: un langage impératif avec la possibilité de fonctions récursives et d'éléments de calculs fonctionnels. Comme nous envisagerons plus loin d'utiliser l'un des exemples, le style impératif est assez pratique pour la programmation d'applications basées sur l'architecture de la gestion des événements dans une clé déclarative, comme SwiftUI. En d'autres termes, les termes «impératif» et «déclaratif» reflètent plutôt la position de l'observateur que la réalité qui nous est donnée en un sens.
5) Nous surveillons l'absence de redondance des structures syntaxiques et l'ergonomie de la saisie des caractères de code. Nous utilisons une nouvelle ligne comme séparateur. Cependant, comme dans Swift, vous pouvez utiliser ";" sur une ligne comme délimiteur pour plusieurs expressions. Dans le même temps, notre formation en ingénierie proteste fermement contre le fait de donner une signification syntaxique à l'indentation dans le texte du programme, telle qu'elle était auparavant utilisée dans Fortran, et maintenant en Python.
Un langage fiable
Une condition nécessaire à l'existence de systèmes complexes dans le temps est l'exigence d'une unicité sémantique complète et de la faisabilité de tout programme correctement écrit sans corrections en cas d'évolution et de complication inévitables du langage dans le futur. Comment résoudre ce problème de fiabilité des programmes en cas de développement et d'expansion inévitables? Afin d'éviter le conflit de coïncidence entre identifiants et mots réservés, nous utilisons un moyen simple et efficace, comme cela se fait, par exemple, dans Oberon. La langue HI réserve tous les identifiants avec des lettres majuscules sans chiffres et plus d'un caractère en tant que caractères de service . Ainsi, les exemples suivants sont des identifiants valides écrits à la main par un programmeur ou générés par un système intelligent:
foo, Foo, f_001, F1, F, for
Exemples d'identifiants réservés par la langue:
FOO, FOR, HI, YES, EVERYRESTRICTIONMATTER
Dans un souci de fiabilité du code, nous utilisons le typage statique avec la possibilité de déduire automatiquement des types à partir des déclarations du formulaire:
LET x = 6 # x INT
VAR boolean = TRUE # boolean BOOL
Nous distinguons les constantes et les variables non pas pour optimiser le temps d'exécution du code, mais pour que le développeur ait une bonne compréhension de la finalité des objets qu'il contrôle.
Un langage pour construire des systèmes logiciels très complexes
L'architecture de tout langage universel devrait offrir une possibilité réfléchie de créer des programmes complexes à partir de petites pièces autonomes, par exemple, jusqu'à 250 LOC dans une seule source, car, pardonnez-nous cher lecteur, seuls un scanner et un analyseur peuvent facilement travailler avec des textes sources de toute complexité, et une personne peut même multiplier deux ou trois chiffres. les nombres entiers est difficile sans calculatrice.
Pour le moment, nous laisserons de côté l'implémentation de l'architecture des systèmes complexes en langage Hi et analyserons ces problématiques en détail plus tard dans la présentation du concept d'organisation des classes - protocoles, communication entre eux et méthodes de construction de leur hiérarchie. On note seulement que l'architecture des applications complexes sera construite à partir de petits fragments autonomes, facilement lisibles et modifiables, et nous nous sommes inspirés ici non pas de l'étude de l'informatique, mais de l'architecture de l'interaction des cellules et des organes du vivant. Le corps d'une personne ordinaire est d'environ 50 trillions de cellules viables qui fonctionnent avec succès malgré des conditions environnementales difficiles, la présence de nombreux parasites et des dommages constants à des millions de microcomposants. Le créateur d'un système informatique,qui cesse complètement de fonctionner en raison d'un seul appel à un index de tableau inexistant, il y a beaucoup à apprendre ici.
Bien que nous commencions avec un langage de script qui soit pratique pour une programmation rapide et agréable de petits puzzles, nous devons donner toute confiance aux développeurs sur le fait que sur une plate-forme une fois développée des composants logiciels simples sans utiliser de solutions tierces à l'avenir, ils peuvent construire des systèmes viables d'une complexité illimitée.
Limites
En pratique, chaque fois que nous appliquons des exigences pour la conception de systèmes, nous devons soit sacrifier quelque chose, soit ne pas prêter attention à quelque chose. Pour nous, dans la construction du langage Hi, cela n'a pas de sens fondamental:
- Compatibilité exacte de la syntaxe avec d'autres langages de programmation
- Capacité à utiliser des bibliothèques de codes externes existantes ou à s'intégrer à d'autres systèmes logiciels
- c n-
- /
- — ,
En conclusion, disons l'origine du nom convivial du langage de programmation HI, Hi ou hi. Que ce soit H Elius' i nteractive Langage de programmation ou de la H Uman I de renseignements sur le langage de programmation. Contrairement à toutes les constructions de notre langage, c'est le seul méta-identifiant qui n'a pas de sémantique sans ambiguïté.
Dans le prochain article, nous présenterons la description de Hi Basic Programming Language "sur une" page, puis analyserons la logique de construction de la syntaxe, en suivant les exigences des thèses présentées ci-dessus.