Olá, linguagem de programação

A partir deste artigo, começamos a publicar o conceito de implementação da nova linguagem de programação Hi.



A necessidade de desenvolver uma nova linguagem, e não de copiar a sintaxe de nenhuma das linguagens de programação comuns existentes, deve-se a uma espécie de conceito original, do qual falaremos hoje. Em nossa opinião, o processo de criação e implementação do conceito de uma nova linguagem é em si uma história fascinante e informativa para todos os que se interessam pela pragmática das línguas.



Assumimos que, para entender o material apresentado, o leitor está familiarizado com a sintaxe e a semântica de várias linguagens de programação de uso geral comuns.


Não morda meu dedo, olhe para onde estou apontando

Warren S. McCulloch, anos 1960


Declaração inicial do problema



Inicialmente, definimos a tarefa de implementar a tecnologia de geração autônoma de tarefas interativas para o desenvolvimento da inteligência humana, as quais serão adaptativas aos seus sucessos e fracassos. Ou seja, se uma pessoa resolve com sucesso uma sequência de quebra-cabeças e é eficaz em jogos de passagem, então esta tecnologia reconstrói seus algoritmos para que uma pessoa possa resolver quebra-cabeças com novas condições mais complexas e versões imprevisíveis de jogos que nunca são exatamente repetidos. Em caso de fracasso, esta tecnologia retorna a pessoa a posições já familiares para reestruturar o programa de suas habilidades e prontidão para realizar uma nova ascensão intelectual. Basicamente, o programa adaptativo faz aqui o mesmo trabalho que um treinador pessoal experiente em esportes.



Em geral, com algumas restrições, essa tarefa foi resolvida já em 2018 com o aplicativo Helius - cheio de vida , que pode ser encontrado na App Store .



No processo de implementação do conceito de Helius, percebemos que, a fim de dar o próximo passo e implementar uma classe fundamentalmente nova de aplicação adaptativa que seria capaz de transformar completamente sua arquitetura, adaptando-se às habilidades humanas, precisamos de uma linguagem de script algorítmica integrada, cuja listagem pode ser é igualmente gerado com sucesso na forma de texto pelo próprio aplicativo e por uma pessoa, ou pode ser modificado por uma pessoa ou outro programa com base no código fornecido como um protótipo inicial.



Formulamos os principais requisitos e rapidamente concluímos que um conceito focado em expressar as necessidades criativas de um desenvolvedor não é muito bem modelado em nenhuma das linguagens comuns, pois nosso objetivo, com algum grau de piada, é programar pessoas, não computadores.



Uma vez que é igualmente "conveniente" para um sistema intelectual bem projetado gerar a sintaxe de qualquer linguagem consistente em qualquer forma, a fim de usar a linguagem de comunicação entre inteligência "artificial" e "natural", é lógico usar o código algorítmico tradicional, tornando-o o mais conveniente possível para os padrões de pensamento humano familiarizado com as línguas tradicionais, cujo ancestral foi Algol. Eles são descendentes ao longo da linha de Pascal (Ada, Modula) e C (C ++, Java, Swift). No entanto, nosso conceito de construção de abstrações e atenção aos parênteses estão próximos ao espírito do Scheme (Lisp), e a integração dos comandos do ambiente de programação nos meios expressivos da linguagem corresponde às ideias das linguagens de script, BASIC vintage para os primeiros microcomputadores e o projeto Oberon - o sistema Niklaus Wirth.



Nosso objetivo original também inclui fornecer uma linguagem algorítmica simples e conveniente para a programação rápida de jogos mentais e quebra-cabeças com uma curva de aprendizagem do desenvolvedor novato de uma a duas horas. Ao mesmo tempo, deixamos fundamentalmente de lado o design visual de objetos de aplicação no espírito do Scratch ou a prototipagem de jogos no roteiro e editores visuais. Em nossa opinião, isso desvia da criatividade e da expressão das próprias idéias, porque os esforços criativos são substituídos pelo estudo meticuloso e pela transformação de objetos [gráficos]. Propomos no futuro fornecer este trabalho como treinamento de algoritmos para agentes inteligentes.



Como resultado, iremos formular o propósito da linguagem comotroca de algoritmos entre inteligência artificial e natural, programação conjunta de tarefas (jogos e quebra-cabeças) para si e para terceiros, troca gratuita de textos de programas.



Olá mundo



Antes de discutirmos os principais pontos para construir a sintaxe da linguagem, apresentamos três pequenos trechos de código. Vamos começar com o programa tradicional de mensagem de boas-vindas:



PRINT “Hello world!”


Vemos que nossa linguagem tem um caráter de script, assumindo uma interpretação rápida; o comando de impressão está em maiúsculas e o argumento da função embutida não é seguido por parênteses aqui.



Vamos apresentar mais dois exemplos interessantes: encontrar o maior divisor comum para dois inteiros no estilo imperativo e usar a recursão:



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


Olá, requisitos de idioma



Cada linguagem de sucesso é projetada com um propósito específico, que determina suas características sintáticas e semânticas. Por exemplo, ASSEMBLER foi projetado para codificar diretamente as instruções do processador em uma forma mnemônica amigável para humanos; BASIC (aquele com números de linha e uma instrução GOTO) continuou com sucesso a ideia de traduzir comandos diretamente para um intérprete de alto nível. Hi linguagem de programação pretende se tornar a linguagem de comandos e algoritmos para comunicação entre o Humano e a inteligência abstrata de algum sistema projetado.



Como consequência lógica, o código do programa não é o código de máquina compilado e nem o bytecode da máquina virtual, mas o código-fonte(lista) incluindo comentários. Consequentemente, a implementação interna do código não é padronizada de forma alguma e é deixada ao critério do interpretador ou implementação do compilador.



Portanto, nosso principal objetivo é trocar ideias usando uma linguagem formal. Vamos apresentar três requisitos principais:



  1. A língua deve ser fácil para uma pessoa aprender
  2. A linguagem deve ser confiável para usar
  3. A linguagem deve ser capaz de organizar sistemas de software muito complexos.


Vamos explorar esses requisitos básicos com mais detalhes.



O idioma deve ser fácil de aprender



1) Usaremos escrita sintática de fácil leitura, que é familiar a qualquer pessoa educada moderna. Evitaremos experimentar a brevidade em detrimento da leitura, como se faz, por exemplo, na linguagem APL.



Portanto, usamos construções do tipo em LOOP…REPEATvez de {…}. Como um bom bônus, usaremos colchetes como este:

s = {1, 2, 3}denotaremos a atribuição da variável s a um conjunto de três inteiros.

a = [1, 2, 3]vamos denotar a atribuição da variável a a um array de três inteiros.



O uso de construções de linguagem concisas e bem pensadas também permite que você faça uma conexão mais lógica entre a semântica e a sintaxe da linguagem sem usar o contexto do ambiente. Discutiremos esta tese com mais detalhes posteriormente, quando considerarmos construções de linguagem específicas.



2) Para expressões aritméticas, usamos uma notação da forma :, a + b + ce não (+ a b c), como na família LISP.



3) A natureza de nossa linguagem de script requer uma biblioteca integrada de todas as funções necessárias no ambiente de linguagem, sem a necessidade de estruturas externas.



4) Usamos algoritmos nativos para padrões de pensamento: uma linguagem imperativa com a possibilidade de funções recursivas e elementos de computação funcional. Como consideraremos mais adiante o uso de um dos exemplos, o estilo imperativo é bastante conveniente para aplicativos de programação baseados na arquitetura de manipulação de eventos de maneira declarativa, como SwiftUI. Em outras palavras, os termos "imperativo" e "declarativo" refletem mais a posição do observador do que a realidade que nos foi dada em certo sentido.



5) Monitoramos a ausência de redundância de estruturas sintáticas e a ergonomia de entrada de caracteres de código. Usamos uma nova linha como separador. No entanto, como no Swift, você pode usar ";" em uma linha como um delimitador para várias expressões. Ao mesmo tempo, nossa formação em engenharia protesta fortemente contra dar significado sintático ao recuo no texto do programa, como era usado anteriormente em Fortran, e agora em Python.



Linguagem confiável



Uma condição necessária para a existência de sistemas complexos no tempo é a exigência de exclusividade semântica completa e viabilidade de todo programa escrito corretamente sem correções no caso de evolução inevitável e complicação da linguagem no futuro. Como resolver esse problema de confiabilidade do programa em caso de seu inevitável desenvolvimento e expansão? Para evitar o conflito de coincidência de identificadores e palavras reservadas, utilizamos uma forma simples e eficaz, como é feito, por exemplo, em Oberon. A linguagem HI reserva todos os identificadores com letras maiúsculas, sem números e com mais de um caractere como serviços . Assim, os exemplos a seguir são identificadores válidos escritos à mão por um programador ou gerados por um sistema inteligente:



foo, Foo, f_001, F1, F, for


Exemplos de identificadores reservados pela linguagem:



FOO, FOR, HI, YES, EVERYRESTRICTIONMATTER


Para garantir a confiabilidade do código, usamos a tipagem estática com a capacidade de deduzir automaticamente os tipos de declarações do formulário:



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


Distinguimos entre constantes e variáveis ​​não para otimizar o tempo de execução do código, mas para que o desenvolvedor tenha um bom entendimento da finalidade dos objetos que ele controla.



Uma linguagem para construir sistemas de software muito complexos



A arquitetura de qualquer linguagem universal deve fornecer uma possibilidade ponderada de construir programas complexos a partir de pequenas peças autônomas, digamos, até 250 LOC em uma fonte, pois, perdoe-nos caro leitor, apenas um scanner e um analisador podem trabalhar facilmente com textos fonte de qualquer complexidade, e uma pessoa pode até mesmo multiplicar alguns três dígitos números inteiros são difíceis sem uma calculadora.



Por enquanto, deixaremos de lado a implementação da arquitetura de sistemas complexos na linguagem Hi e analisaremos essas questões em detalhe posteriormente na apresentação do conceito de organização de classes - protocolos, comunicação entre elas e métodos de construção de sua hierarquia. Observamos apenas que a arquitetura de aplicativos complexos será construída a partir de pequenos fragmentos autônomos, facilmente legíveis e modificáveis, e nos inspiramos aqui não no estudo da ciência da computação, mas na arquitetura da interação de células e órgãos de organismos vivos. O corpo de uma pessoa comum tem cerca de 50 trilhões de células viáveis ​​que funcionam com sucesso apesar das difíceis condições ambientais, a presença de muitos parasitas e danos constantes a milhões de microcomponentes. O criador de um sistema de computador,que para de funcionar completamente devido a uma única chamada a um índice de array inexistente, há muito o que aprender aqui.



Embora comecemos com uma linguagem de script que é conveniente para a programação rápida e agradável de pequenos quebra-cabeças, devemos dar total confiança aos desenvolvedores de que em uma plataforma desenvolvida componentes de software simples sem o uso de soluções de terceiros no futuro, eles podem construir sistemas viáveis ​​de complexidade ilimitada.



Limitações



Na prática, sempre que aplicamos quaisquer requisitos para o projeto de sistemas, temos que sacrificar algo ou não prestar atenção a algo. Para nós, na construção da linguagem Hi, não é de fundamental importância:



  • Compatibilidade de sintaxe exata com outras linguagens de programação
  • Capacidade de usar bibliotecas de código externo existentes ou integração com outros sistemas de software
  • c n-
  • /
  • — ,


Em conclusão, digamos sobre a origem do nome amigável da linguagem de programação HI, Hi ou hi. Que seja H Elius' i Nteractive Linguagem de programação ou H uman I ntelligence Programming Language. Ao contrário de todas as construções em nossa linguagem, este é o único meta-identificador que não possui semântica inequívoca.



No próximo artigo, apresentaremos a descrição da Hi Basic Programming Language "em uma" página e, em seguida, analisaremos a lógica de construção da sintaxe, seguindo os requisitos das teses apresentadas acima.



All Articles