Programação de linguagem natural internacional

Recentemente, artigos sobre novas linguagens de programação, bem como várias avaliações e previsões relacionadas à popularidade das linguagens de computador, têm sido frequentemente publicados. Também



se estão a dar a conhecer novas ferramentas que, no seu trabalho, utilizam formatos próprios para descrever ficheiros de configuração ou uma sequência de comandos executáveis, o que também os aproxima muito do conceito de "linguagem de programação".



O objetivo deste artigo é formular expectativas e possível implementação de uma linguagem de programação abstrata que pode se tornar uma ferramenta universal para a comunicação entre um computador e uma pessoa.



Sobre programadores.



Se você começar do início, então uma vez ouvi uma declaração parafraseada, "cada programador deve escrever seu próprio banco de dados, editor de texto e linguagem de programação." E se eu escrevi as duas primeiras coisas há muito tempo, a linguagem de programação ainda não funcionou.



Afinal, como as linguagens de programação geralmente são criadas?



Todo programador sempre tem algum tipo de experiência anterior:



  • conhecimento de uma ou mais linguagens de programação (como poderia ser sem isso)
  • experiência negativa de usá-los (caso contrário, se tudo lhe convier, então por que inventar algo novo?)
  • desejo de obter novas oportunidades (quando algo está faltando nos idiomas existentes).


E antes de descrever a sintaxe, escolher palavras-chave e iniciar o trabalho principal: lexer, analisador, bibliotecas de base, você precisa responder às questões básicas:



  • Compilador / intérprete / transpilador?
  • Digitação estática ou dinâmica?
  • Gerenciamento de memória manual ou automático com coletor de lixo?
  • Modelo de programação: OOP, funcional, estrutural ou algo novo?
  • São permitidas inserções de outras linguagens de programação, etc.?


Eu, provavelmente, como a maioria dos leitores, tenho experiência no uso de várias linguagens de programação. Portanto, há muito tempo é uma prática que para resolver um problema é melhor pegar um idioma conhecido ou mesmo aprender um novo, ao invés de começar a escrever o seu próprio.



Além disso, não quero inventar outra linguagem apenas por causa de um carrapato ou por causa da própria linguagem. Acredito que o propósito de criá-lo deve estar fora das necessidades do próprio desenvolvedor.



E me parece que conseguimos determinar a área em que o desenvolvimento de uma linguagem de programação pode ser demandado, e os esforços despendidos nisso podem trazer benefícios reais.



Sobre não programadores.



Esta área é a programação em linguagem natural para não programadores. Eu deliberadamente coloquei as palavras "não programadores" e "natural" entre aspas, uma vez que esses termos são muito condicionais.



Afinal, se não é um programador que começa a programar, sem perceber ele se torna automaticamente um programador ;-). Uma linguagem de programação não pode ser "natural" por definição. Mais precisamente, para computadores, a linguagem Assembler ou um conjunto de instruções de máquina provavelmente será "natural".



Portanto, o objetivo é máximo - aproximar a linguagem de programação da linguagem humana natural.



Isso não apenas tornará a leitura do texto do programa mais compreensível para não profissionais, mas também permitirá que você comece a compor programas simplesmente dominando a fala escrita, usando o mínimo de regras básicas.



Mas há um grande problema nessa formulação!



Qualquer linguagem de programação é internacional, porque sua sintaxe é independente da linguagem natural na qual o programador se comunica.



E se o texto do programa estiver em uma linguagem "natural", ele se tornará compreensível apenas para quem conhece essa linguagem, ao mesmo tempo que se tornará incompreensível para todos os demais.



A título de ilustração: uma ou duas vezes .


Se você fantasiar sobre os desejos de tal linguagem, verá os seguintes requisitos e restrições:



  • ( ), , , , .
  • / , «» , «» .
  • Eu realmente quero ver tolerância na nova linguagem, tolerância para confusão. Esse "recurso" está presente na escrita em linguagem natural e, apesar da presença de erros de digitação, o significado quase sempre é preservado. Naturalmente, neste caso, não se deve chegar ao fanatismo. O compilador não lê mentes e não pode realmente "entender" o que o usuário quis dizer e, ainda assim, é bastante comum ignorar erros de digitação no texto do programa com base no contexto (embora com mensagens de aviso).


No entanto, tal linguagem deve permanecer apenas uma linguagem de programação com todas as possibilidades de criação de programas de qualquer nível de complexidade, incluindo programação funcional e orientada a objetos e uma compreensão inequívoca do que foi escrito.



Sobre uma linguagem hipotética



Com base nas regras de escrita, as convenções básicas e pontuação para um novo idioma podem ser mais ou menos assim:



  • Qualquer texto consiste em frases e comentários. As sugestões são processadas e os comentários são ignorados.
  • Uma frase consiste em uma sequência de termos, literais e símbolos, separados por espaços e sinais de pontuação, e termina com um caractere de fim de frase.
  • Um termo é uma sequência fundida de letras, números e símbolos ":" e "_".
  • Literal - constantes incluídas diretamente no texto do programa, cujo tipo é determinado exclusivamente. Estas são cadeias de caracteres entre aspas, inteiros e números reais e alguns formatos especiais (hora, data).
  • Símbolos - todos os outros símbolos que não pertencem a sinais de pontuação, espaços em branco, números e letras.
  • — , :



    • «.»,«;»,«!»,«?»,«…» — .
    • «=» — .
    • "" () — .
    • «()» — / .
    • «[]» — .
    • «{}» — .
    • «$» — .
    • «@» — .
    • «,» () — .
    • «:» () — .


Se tudo deve ser mais ou menos claro com o símbolo de atribuição, aspas, parênteses e colchetes, porque sua finalidade corresponde àquela na maioria esmagadora das linguagens de programação, então a finalidade dos caracteres restantes (chaves, dois pontos, vírgula e funções / variáveis ​​do sistema) deve ser explicada um pouco.



Visto que o objetivo de uma linguagem de programação hipotética ainda é escrever programas, então é necessário prever a possibilidade de inserir código de programa comum sem levar em conta todas as possibilidades e ambigüidades que são inerentes a qualquer linguagem natural.



Essa capacidade também é necessária para implementar funções de baixo nível e interagir com bibliotecas externas.



Ao criar tais inserções, podem ser usados ​​colchetes, todo o texto entre os quais será inserido no arquivo final com pouco ou nenhum processamento.



Os símbolos "$" - uma variável do sistema e "@" - uma função do sistema também servem a propósitos semelhantes. Se esse símbolo for colocado no início de uma palavra, ele denotará um objeto com um propósito correspondente. Por exemplo, "@exit" significará uma função e "$ var" significará uma variável com nomes apropriados, e os próprios objetos se tornarão disponíveis em código normal e em inserções programáticas entre chaves.



O acesso a campos / métodos individuais de objetos é organizado de maneira semelhante:

"objeto @ método" ou "objeto $ campo".



O caractere vírgula "," é usado para indicar uma seqüência de blocos lógicos iguais em uma frase ou para criar listas.



O caractere de dois pontos ":" é usado para criar listas e indicar uma relação lógica entre duas partes de uma palavra / texto, incluindo o caminho completo do módulo.



Por exemplo, criando uma lista: Consequência / indicação de um relacionamento: Como você pode ver, o uso de sinais de pontuação é tirado de sua finalidade direta, adotada na escrita, que deve fornecer um certo compromisso entre a sintaxe em linguagens de programação padrão e a escrita em linguagem natural.



_: 1, 2, .





_:

- 1;

- 2;

- .












module:calc // «calc», «module»

super:module:example$var // «$var» .











Sobre computadores



Já que estamos falando de uma linguagem de programação, não podemos prescindir de construções algorítmicas padrão: sucessão, ramificação e loops.



O que se segue é facilmente descrito pelas regras usuais de escrita em linguagem natural. No caso de execução sequencial em uma instrução, as operações e chamadas de função são gravadas sequencialmente, separadas por vírgulas. Se eles estiverem localizados em sentenças diferentes, eles serão escritos da mesma maneira, um após o outro. Além disso, a formatação do parágrafo serve apenas para uma melhor percepção do texto e separação lógica dos fragmentos individuais.



Ao criar construções de controle condicionais e de loop, você já precisará de palavras-chave. Mas, uma vez que, de acordo com os desejos originais para a linguagem, é impossível reservar os termos usuais para escrever construções algorítmicas, basta indicar o símbolo da função do sistema na frente das palavras-chave, o que permitirá distinguir um termo comum de uma palavra-chave (controle).



Naturalmente, durante a programação, esses termos podem ser usados, mas isso não é necessário. Uma vez que ao configurar para uma linguagem natural específica, as funções do sistema e palavras-chave devem receber termos específicos e já usá-los, por exemplo:



= @goto,

= @label,

= @continue,

=@break ..








E o último por sua vez, mas provavelmente o mais importante em essência, a construção: passar parâmetros ao chamar funções. Se nos empenharmos por uma sintaxe completamente natural, obteremos a mesma linguagem natural que é muito difícil de analisar.



No entanto, parece-me que é possível combinar as duas abordagens, eliminando o uso obrigatório de parênteses, onde é permitido pela sintaxe. Mas: Em outras palavras, para a ordem natural de argumentos, parênteses para funções e vírgulas entre parâmetros podem ser omitidos. Embora seu uso deva ser determinado principalmente pela linguagem natural de destino, e não pela sintaxe.



: (1, 2(), 3=).

: 1 2 3=.












: ( 2() ).

: 2().

: (2 ).












Sobre objeções



Prevejo objeções bem fundamentadas ao uso de tal linguagem por parte dos programadores. Qualquer programa nele será muito mais prolixo do que usar a sintaxe formal estrita das linguagens de computador comuns.



Portanto, deixe-me lembrá-lo de sua propriedade obrigatória - a capacidade de converter o texto de um programa de um idioma para outro. Isso permite que você escreva programas usando uma sintaxe estritamente formal sem usar termos de linguagem natural redefinidos e converta o texto de origem em uma linguagem "natural" para um "não programador".



All Articles