Programação intencional

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

Na programação de computadores , a Programação Intencional é um paradigma de programação desenvolvido por Charles Simonyi que codifica no código-fonte do software a intenção precisa que os programadores (ou usuários) têm em mente ao conceber seu trabalho. Ao usar o nível apropriado de abstração no qual o programador está pensando, a criação e a manutenção de programas de computador se tornam mais fáceis. Ao separar as preocupações por intenções e como elas estão sendo operadas, o software se torna mais modular e permite um código de software mais reutilizável.

A Programação Intencional foi desenvolvida pelo ex -arquiteto-chefe da Microsoft Charles Simonyi , que liderou uma equipe na Microsoft Research , que desenvolveu o paradigma e construiu um ambiente de desenvolvimento integrado (IDE) chamado IP (para Programação Intencional) que demonstrou o paradigma. A Microsoft decidiu não produzir o paradigma da Programação Intencional, pois no início dos anos 2000 a Microsoft estava lançando C# e .NET para combater a adoção do Java. [1] Charles Simonyi decidiu, com a aprovação da Microsoft, tirar sua ideia da Microsoft e comercializá-la ele mesmo. Fundou a empresa Intentional Softwarepara perseguir isso. A Microsoft licenciou as patentes de Programação Intencional que Simonyi havia adquirido enquanto estava na Microsoft, mas nenhum código-fonte, para a Intentional Software.

Uma visão geral da Programação Intencional como foi desenvolvida na Microsoft Research é fornecida no Capítulo 11 do livro Programação Generativa: Métodos, Ferramentas e Aplicativos . [2]

Ciclo de desenvolvimento

Conforme previsto por Simonyi, o desenvolvimento de uma nova aplicação através do paradigma de Programação Intencional procede da seguinte forma. Um programador constrói um ambiente do tipo WYSIWYG que suporta o esquema e a notação de conhecimento de negócios para um determinado domínio de problema (como aplicativos de produtividade ou seguro de vida). Os usuários então usam esse ambiente para capturar suas intenções, que são registradas em alto nível de abstração. O ambiente pode operar nessas intenções e auxiliar o usuário a criar documentos semanticamente mais ricos que podem ser processados ​​e executados, semelhante a uma planilha. O conhecimento registrado é executado por um avaliador ou compilado para gerar o programa final. Mudanças sucessivas são feitas apenas no nível WYSIWYG. Ao contrário de processadores de texto, planilhas ou softwares de apresentação, um ambiente Intencional tem mais suporte para estrutura e semântica das intenções a serem expressas, podendo criar documentos interativos que capturam de forma mais rica o que o usuário está tentando realizar. Um caso especial é quando o conteúdo é código de programa e o ambiente se torna um IDE inteligente. [3]

Separando armazenamento e apresentação de código fonte

A chave para os benefícios da Programação Intencional é que o código de domínio que captura as intenções não é armazenado em arquivos de texto de código-fonte , mas em um armazenamento baseado em árvore (pode ser binário ou XML). A forte integração do ambiente com o formato de armazenamento traz alguns dos melhores recursos de normalização de banco de dados para o código-fonte . A redundância é eliminada dando a cada definição uma identidade única e armazenando o nome das variáveis ​​e operadores em exatamente um lugar. Isso torna mais fácil distinguir intrinsecamente declarações de referências , e o ambiente pode mostrá-las de forma diferente.

O espaço em branco em um programa também não é armazenado como parte do código-fonte , e cada programador trabalhando em um projeto pode escolher uma exibição de recuo da fonte. Visualizações mais radicais incluem mostrar listas de instruções como caixas aninhadas, editar expressões condicionais como portas lógicas ou renderizar novamente nomes em chinês.

O sistema usa uma linguagem normalizada para linguagens populares como C++ e Java , enquanto permite que os usuários do ambiente misturem e combinem com ideias de Eiffel e outras linguagens. Frequentemente mencionado no mesmo contexto como programação orientada a linguagem por meio de linguagens específicas de domínio e programação orientada a aspectos , o IP pretende fornecer alguns avanços na programação generativa . Essas técnicas permitem que os desenvolvedores estendam o ambiente de linguagem para capturar construções específicas de domínio sem investir na escrita de um compilador e editor completo para quaisquer novas linguagens.

Exemplo de programação

Um programa Java que escreve os números de 1 a 10, usando uma sintaxe de colchetes , pode ter esta aparência:

 for  ( int  i  =  1 ;  i  <=  10 ;  i ++ )  { 
    System . fora . println ( "o numero e "  +  i ); 
 }

O código acima contém uma construção comum da maioria das linguagens de programação , o loop limitado, neste caso representado pela forconstrução. O código, quando compilado, vinculado e executado, fará um loop 10 vezes, incrementando o valor de i cada vez depois de imprimi-lo.

Mas este código não capta as intenções do programador, nomeadamente "imprimir os números de 1 a 10". Nesse caso simples, um programador solicitado a manter o código provavelmente descobrirá o que ele pretende fazer, mas nem sempre é tão fácil. Loops que se estendem por muitas linhas ou páginas podem se tornar muito difíceis de entender, principalmente se o programador original usar rótulos pouco claros. Tradicionalmente, a única maneira de indicar a intenção do código era adicionar comentários de código-fonte , mas geralmente os comentários não são adicionados, ou não são claros, ou ficam fora de sincronia com o código-fonte que eles descreveram originalmente.

Em sistemas de programação intencional, o loop acima pode ser representado, em algum nível, como algo tão óbvio quanto " print the numbers 1 to 10". O sistema então usaria as intenções para gerar o código-fonte, provavelmente algo muito semelhante ao código acima. A principal diferença é que os sistemas de programação intencional mantêm o nível semântico, que falta no código-fonte, e que pode facilitar drasticamente a legibilidade em programas maiores.

Embora a maioria das linguagens contenha mecanismos para capturar certos tipos de abstração , o IP, como a família de linguagens Lisp , permite a adição de mecanismos inteiramente novos. Assim, se um desenvolvedor começasse com uma linguagem como C , ele seria capaz de estender a linguagem com recursos como os de C++ sem esperar que os desenvolvedores do compilador os adicionassem. Por analogia, muitos mecanismos de expressão mais poderosos podem ser usados ​​por programadores do que meras classes e procedimentos .

Identidade

IP se concentra no conceito de identidade . Como a maioria das linguagens de programação representa o código-fonte como texto simples , os objetos são definidos por nomes e sua exclusividade deve ser inferida pelo compilador . Por exemplo, o mesmo nome simbólico pode ser usado para nomear diferentes variáveis, procedimentos ou até mesmo tipos. No código que abrange várias páginas – ou, para nomes visíveis globalmente, vários arquivos – pode se tornar muito difícil dizer qual símbolo se refere a qual objeto real. Se um nome for alterado, o código em que é usado deve ser cuidadosamente examinado.

Por outro lado, em um sistema IP, todas as definições não apenas atribuem nomes simbólicos, mas também identificadores privados exclusivos aos objetos. Isso significa que no ambiente de desenvolvimento IP, cada referência a uma variável ou procedimento não é apenas um nome – é um link para a entidade original.

A principal vantagem disso é que, se uma entidade for renomeada, todas as referências a ela no programa permanecerão válidas (conhecido como integridade referencial ). Isso também significa que, se o mesmo nome for usado para definições exclusivas em namespaces diferentes (como " .to_string()"), as referências com o mesmo nome, mas com identidade diferente, não serão renomeadas, como às vezes acontece com a pesquisa/substituição nos editores atuais. Esse recurso também facilita a obtenção de versões em vários idiomas do programa; ele pode ter um conjunto de nomes no idioma inglês para todas as definições, bem como um conjunto de nomes no idioma japonês que podem ser trocados à vontade.

Ter uma identidade exclusiva para cada objeto definido no programa também facilita a execução de tarefas de refatoração automatizadas , além de simplificar as verificações de código em sistemas de controle de versão . Por exemplo, em muitos sistemas de colaboração de código atuais (por exemplo , Git ), quando dois programadores confirmam alterações que entram em conflito (ou seja, se um programador renomeia uma função enquanto outro altera uma das linhas dessa função), o sistema de versão pensará que um programador criou uma nova função enquanto outra modificou uma função antiga. Em um sistema de controle de versão IP, ele saberá que um programador apenas alterou um nome enquanto outro alterou o código.

Níveis de detalhe

Os sistemas IP também oferecem vários níveis de detalhes, permitindo que o programador "amplie" ou diminua o zoom. No exemplo acima, o programador poderia diminuir o zoom para obter um nível que diria algo como:

<<imprima os números de 1 a 10>>

Assim, os sistemas IP são autodocumentados em grande medida, permitindo que o programador mantenha uma boa imagem de alto nível do programa como um todo.

Trabalhos semelhantes

Existem projetos que exploram ideias semelhantes para criar código com maior nível de abstração. Entre eles estão:

Veja também

Referências

  1. ^ "Simonyi explica, 'Era impraticável, quando a Microsoft estava fazendo grandes avanços com .Net no curto prazo, de alguma forma enviar alguém da mesma organização que diz: "Não é assim que você deve fazer as coisas - e se você fez as coisas dessa outra maneira mais disruptiva?'" (Citação de "Anything You Can Do, I Can Do Meta" , terça-feira, 9 de janeiro de 2007, Scott Rosenberg , Technology Review . Arquivado em 20 de setembro de 2020 em archive.today )
  2. ^ Programação Generativa: Métodos, Ferramentas e Aplicações , por Krzysztof Czarnecki e Ulrich Eisenecker, Addison-Wesley , Reading, MA , EUA, junho de 2000.
  3. ^ Scott Rosenberg: " Qualquer coisa que você pode fazer, eu posso fazer Meta ." Technology Review , 8 de janeiro de 2007. Arquivado em 20 de setembro de 2020 em archive.today

Links externos