Hola lenguaje de programación

A partir de este artículo, comenzamos a publicar el concepto de implementación del nuevo lenguaje de programación Hi.



La necesidad de desarrollar un nuevo lenguaje, y no copiar la sintaxis de ninguno de los lenguajes de programación comunes existentes, se debe a una especie de concepto original, del que hablaremos hoy. En nuestra opinión, el proceso de creación e implementación del concepto de un nuevo idioma es en sí mismo una historia fascinante e informativa para todos los interesados ​​en la pragmática de los idiomas.



Suponemos que para comprender el material presentado, el lector está familiarizado con la sintaxis y la semántica de varios lenguajes de programación de propósito general comunes.


No me muerda el dedo, mire hacia dónde estoy señalando

Warren S. McCulloch, 1960


Declaración inicial del problema



Inicialmente, nos planteamos la tarea de implementar la tecnología de generación autónoma de tareas interactivas para el desarrollo de la inteligencia humana, que se irá adaptando a sus aciertos y fracasos. Es decir, si una persona resuelve con éxito una secuencia de acertijos y es eficaz en juegos de pases, entonces esta tecnología reconstruye sus algoritmos para que una persona pueda resolver acertijos con nuevas condiciones más complejas y versiones impredecibles de juegos que nunca se repiten exactamente. En caso de falla, esta tecnología devuelve a una persona a posiciones ya familiares para reestructurar el programa de sus habilidades y disposición para llevar a cabo un nuevo ascenso intelectual. En esencia, el programa adaptativo hace aquí el mismo trabajo que un entrenador personal experimentado en deportes.



En general, con algunas restricciones, esta tarea se resolvió en 2018 con la aplicación Helius, llena de vida , que se puede encontrar en la App Store .



En el proceso de implementación del concepto de Helius, nos dimos cuenta de que para dar el siguiente paso e implementar una clase fundamentalmente nueva de aplicación adaptativa que podría transformar completamente su arquitectura, adaptándose a las habilidades humanas, necesitamos un lenguaje de scripting algorítmico incorporado, cuya lista puede ser se genera igualmente con éxito en forma de texto tanto por la propia aplicación como por una persona, o puede ser modificado por una persona u otro programa basándose en el código proporcionado como un prototipo inicial.



Formamos los requisitos principales y rápidamente concluimos que un concepto enfocado en expresar las necesidades creativas de un desarrollador no está muy bien modelado en ninguno de los lenguajes comunes, porque nuestro objetivo, con cierto grado de broma, es programar personas, no computadoras.



Dado que es igualmente "conveniente" para un sistema intelectual bien diseñado generar la sintaxis de cualquier lenguaje consistente en cualquier forma, para usar el lenguaje de comunicación entre la inteligencia "artificial" y la "natural", es lógico usar el código algorítmico tradicional, haciéndolo lo más conveniente posible para los patrones de pensamiento humano. familiarizado con los idiomas dominantes, cuyo antepasado fue Algol. Son descendientes de Pascal (Ada, Modula) y C (C ++, Java, Swift). Sin embargo, nuestro concepto de construcción de abstracciones y atención a los corchetes está cerca del espíritu de Scheme (Lisp), y la integración de los comandos del entorno de programación en los medios expresivos del lenguaje corresponde a las ideas de los lenguajes de scripting, BASIC clásico para las primeras microcomputadoras y el proyecto Oberon: el sistema Niklaus Wirth.



Nuestro objetivo original también incluye proporcionar un lenguaje algorítmico simple y conveniente para programar rápidamente juegos mentales y acertijos con una curva de aprendizaje para desarrolladores novatos de una a dos horas. Al mismo tiempo, dejamos de lado fundamentalmente el diseño visual de objetos de aplicación en el espíritu de Scratch o la creación de prototipos de juegos en el guión y los editores visuales. En nuestra opinión, esto distrae la creatividad y la expresión de las propias ideas, porque los esfuerzos creativos son reemplazados por el estudio y la transformación minuciosos de los objetos [gráficos]. Proponemos en el futuro proporcionar este trabajo como entrenamiento de algoritmos para agentes inteligentes.



Como resultado, formularemos el propósito del lenguaje comointercambio de algoritmos entre inteligencia artificial y natural, programación conjunta de tareas (juegos y rompecabezas) para uno mismo y los demás, libre intercambio de textos de programas.



Hola mundo



Antes de discutir los puntos principales para construir la sintaxis del lenguaje, presentamos tres fragmentos de código cortos. Comencemos con el programa tradicional de mensajes de bienvenida:



PRINT “Hello world!”


Vemos que nuestro lenguaje tiene un carácter de guion, asumiendo una interpretación rápida; el comando de impresión está en mayúsculas y el argumento de la función incorporada no va seguido de paréntesis aquí.



Presentamos dos ejemplos más interesantes: encontrar el máximo común divisor para dos enteros en el estilo imperativo y usar la recursividad:



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


Hola requisitos de idioma



Todo lenguaje exitoso está diseñado con un propósito específico, que determina sus características sintácticas y semánticas. Por ejemplo, ASSEMBLER fue diseñado para codificar directamente las instrucciones del procesador en una forma mnemotécnica amigable para los humanos; BASIC (el que tiene números de línea y una declaración GOTO) continuó con éxito la idea de traducir comandos directamente a un intérprete de alto nivel. El lenguaje de programación Hi está destinado a convertirse en el lenguaje de comandos y algoritmos para la comunicación entre el Humano y la inteligencia abstracta de algún sistema diseñado.



Como consecuencia lógica, el código del programa no es el código de máquina compilado ni el código de bytes de la máquina virtual, sino el código fuente.(listado) incluyendo comentarios. En consecuencia, la implementación interna del código no está estandarizada de ninguna manera y se deja a la discreción del intérprete o la implementación del compilador.



Entonces, nuestro principal objetivo es intercambiar pensamientos utilizando un lenguaje formal. Introduzcamos tres requisitos principales:



  1. El idioma debe ser fácil de aprender para una persona.
  2. El idioma debe ser confiable para usar
  3. El lenguaje debe ser capaz de organizar sistemas de software muy complejos.


Exploremos estos requisitos básicos con más detalle.



El idioma debe ser fácil de aprender.



1) Usaremos escritura sintáctica fácil de leer que sea familiar para cualquier persona educada moderna. Evitaremos experimentar con la brevedad en detrimento de la lectura, como se hace, por ejemplo, en el lenguaje APL.



Por lo tanto, usamos construcciones del tipo en LOOP…REPEATlugar de {…}. Como un buen bono, usaremos llaves como esta:

s = {1, 2, 3}denotaremos la asignación de la variable sa un conjunto de tres enteros.

a = [1, 2, 3]Denotaremos la asignación de la variable a a un arreglo de tres enteros.



El uso de construcciones de lenguaje concisas y bien pensadas también le permite hacer una conexión más lógica entre la semántica y la sintaxis del lenguaje sin usar el contexto del entorno. Discutiremos esta tesis con más detalle más adelante cuando consideremos construcciones específicas del lenguaje.



2) Para expresiones aritméticas, usamos una notación de la forma :, a + b + cy no (+ a b c), como en la familia LISP.



3) La naturaleza de nuestro lenguaje de scripting requiere una biblioteca incorporada de todas las funciones necesarias en el entorno del lenguaje sin la necesidad de marcos externos.



4) Utilizamos algoritmos nativos para patrones de pensamiento: un lenguaje imperativo con posibilidad de funciones recursivas y elementos de computación funcional. Como consideraremos más adelante el uso de uno de los ejemplos, el estilo imperativo es bastante conveniente para programar aplicaciones basadas en la arquitectura de manejo de eventos de una manera declarativa, como SwiftUI. En otras palabras, los términos "imperativo" y "declarativo" reflejan más la posición del observador que la realidad que se nos da en cierto sentido.



5) Monitoreamos la ausencia de redundancia de estructuras sintácticas y la ergonomía de ingresar caracteres de código. Usamos una nueva línea como separador. Sin embargo, como en el idioma Swift, puede usar ";" en una línea como delimitador de varias expresiones. Al mismo tiempo, nuestra educación en ingeniería protesta enérgicamente en contra de dar significado sintáctico a la sangría en el texto del programa, como se usaba anteriormente en Fortran y ahora en Python.



Lenguaje confiable



Una condición necesaria para la existencia de sistemas complejos en el tiempo es el requisito de la unicidad semántica completa y la viabilidad de cada programa correctamente escrito sin correcciones en caso de evolución inevitable y complicación del lenguaje en el futuro. ¿Cómo resolver este problema de confiabilidad del programa en caso de su inevitable desarrollo y expansión? Para evitar el conflicto de coincidencia de identificadores y palabras reservadas, utilizamos una forma sencilla y eficaz, como se hace, por ejemplo, en Oberon. El idioma HI se reserva todos los identificadores con letras mayúsculas sin números y con más de un carácter como servicio . Así, los siguientes ejemplos son identificadores válidos escritos a mano por un programador o generados por un sistema inteligente:



foo, Foo, f_001, F1, F, for


Ejemplos de identificadores que están reservados por el idioma:



FOO, FOR, HI, YES, EVERYRESTRICTIONMATTER


En aras de la confiabilidad del código, usamos tipado estático con la capacidad de deducir automáticamente tipos a partir de declaraciones del formulario:



LET x = 6  #  x   INT
VAR boolean = TRUE  #   boolean  BOOL


Distinguimos entre constantes y variables no para optimizar el tiempo de ejecución del código, sino para que el desarrollador tenga una buena comprensión del propósito de los objetos que controla.



Un lenguaje para construir sistemas de software muy complejos.



La arquitectura de cualquier lenguaje universal debería proporcionar una posibilidad reflexiva de construir programas complejos a partir de pequeñas piezas autónomas, digamos, hasta 250 LOC en una fuente, porque, perdónanos querido lector, solo un escáner y un analizador pueden trabajar fácilmente con textos fuente de cualquier complejidad, y una persona puede incluso multiplicar un par de tres dígitos. los números enteros son difíciles sin una calculadora.



Por el momento, dejaremos de lado la implementación de la arquitectura de sistemas complejos en el lenguaje Hi y analizaremos estos temas en detalle más adelante en la presentación del concepto de organización de clases: protocolos, comunicación entre ellos y métodos para construir su jerarquía. Solo notamos que la arquitectura de aplicaciones complejas se construirá a partir de pequeños fragmentos autónomos, fácilmente legibles y modificables, y nos inspiramos aquí no en el estudio de la informática, sino en la arquitectura de la interacción de células y órganos de organismos vivos. El cuerpo de una persona común está compuesto por alrededor de 50 billones de células viables que funcionan con éxito a pesar de las difíciles condiciones ambientales, la presencia de muchos parásitos y el daño constante a millones de microcomponentes. El creador de un sistema informático,que deja de funcionar por completo debido a una sola llamada a un índice de matriz inexistente, hay mucho que aprender aquí.



Aunque comenzamos con un lenguaje de scripting que es conveniente para la programación rápida y divertida de pequeños rompecabezas, debemos darles plena confianza a los desarrolladores de que en una plataforma que alguna vez desarrolló componentes de software simples sin el uso de soluciones de terceros en el futuro, pueden construir sistemas viables de complejidad ilimitada.



Limitaciones



En la práctica, siempre que aplicamos requisitos para el diseño de sistemas, tenemos que sacrificar algo o no prestar atención a algo. Para nosotros, en la construcción del lenguaje Hi, no es de fundamental importancia:



  • Compatibilidad de sintaxis exacta con otros lenguajes de programación
  • Capacidad para utilizar bibliotecas de códigos externos existentes o integrarse con otros sistemas de software
  • c n-
  • /
  • — ,


En conclusión, digamos sobre el origen del nombre descriptivo del lenguaje de programación HI, Hi o hola. Que sea H Elio i nteractive Lenguaje de programación o H uman que los Servicios de Inteligencia Lenguaje de Programación. A diferencia de todas las construcciones en nuestro idioma, este es el único metaidentificador que no tiene una semántica inequívoca.



En el próximo artículo, presentaremos la descripción del Lenguaje de Programación Básico Hi "en una" página y luego analizaremos la lógica de construcción de la sintaxis, siguiendo los requisitos de las tesis presentadas anteriormente.



All Articles