Programação intencional
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, criar e manter programas de computador se torna mais fácil. Ao separar as preocupações com 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 conter 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. Ele fundou a empresa Intentional Software para 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 conforme desenvolvida na Microsoft Research é fornecida no Capítulo 11 do livro Programação Generativa: Métodos, Ferramentas e Aplicações . [2]
Ciclo de desenvolvimento
Conforme previsto por Simonyi, o desenvolvimento de um novo aplicativo por meio do paradigma de Programação Intencional ocorre da seguinte forma. Um programador cria um ambiente do tipo WYSIWYG que dá suporte ao esquema e à notação do conhecimento empresarial 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, semelhantes 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 software de apresentação, um ambiente intencional tem mais suporte para estrutura e semântica das intenções a serem expressas e pode criar documentos interativos que capturam mais ricamente 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 o armazenamento e a apresentação do 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 integração estreita do ambiente com o formato de armazenamento traz alguns dos recursos mais interessantes da normalização de banco de dados para o código-fonte . A redundância é eliminada ao dar a cada definição uma identidade única e armazenar o nome de 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.
Espaços em branco em um programa também não são armazenados como parte do código-fonte , e cada programador trabalhando em um projeto pode escolher uma exibição de recuo do código-fonte. Visualizações mais radicais incluem mostrar listas de instruções como caixas aninhadas, editar expressões condicionais como portas lógicas ou re-renderizar 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 essas com ideias de Eiffel e outras linguagens. Frequentemente mencionado no mesmo contexto que programação orientada a linguagem via 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 da linguagem para capturar construções específicas de domínio sem investir na escrita de um compilador e editor completos para quaisquer novas linguagens.
Exemplo de programação
Um programa Java que escreve os números de 1 a 10, usando uma sintaxe de chaves , pode ter esta aparência:
para ( int i = 1 ; i <= 10 ; i ++ ) { Sistema . out . println ( "o número é " + i ); }
O código acima contém uma construção comum da maioria das linguagens de programação , o bounded loop, neste caso representado pela for
construção. O código, quando compilado, vinculado e executado, fará um loop de 10 vezes, incrementando o valor de i a cada vez após imprimi-lo.
Mas esse código não captura as intenções do programador, ou seja, "imprimir os números de 1 a 10". Nesse caso simples, um programador solicitado a manter o código provavelmente poderia 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 ao código-fonte , mas frequentemente os comentários não são adicionados, ou são pouco claros, ou saem de sincronia com o código-fonte que descreveram originalmente.
Em sistemas de programação intencional, o loop acima poderia 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 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 o código-fonte não tem, e que pode facilitar drasticamente a legibilidade em programas maiores.
Embora a maioria das linguagens contenha mecanismos para capturar certos tipos de abstraçã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 aqueles em C++ sem esperar que os desenvolvedores do compilador os adicionassem. Por analogia, muitos mecanismos de expressão mais poderosos poderiam ser usados por programadores do que meras classes e procedimentos .
Identidade
O IP foca 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 tem que ser inferida pelo compilador . Por exemplo, o mesmo nome simbólico pode ser usado para nomear diferentes variáveis, procedimentos ou até mesmo tipos. Em código que abrange várias páginas – ou, para nomes globalmente visíveis, 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 onde ele é usado deve ser cuidadosamente examinado.
Em contraste, 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 únicas em diferentes namespaces (como " .to_string()
"), referências com o mesmo nome, mas identidade diferente, não serão renomeadas, como às vezes acontece com a busca/substituição em editores atuais. Esse recurso também facilita ter versões multilíngues do programa; ele pode ter um conjunto de nomes em inglês para todas as definições, bem como um conjunto de nomes em japonês que podem ser trocados à vontade.
Ter uma identidade única para cada objeto definido no programa também facilita a execução de tarefas de refatoração automatizadas , bem como simplifica o check-in de código em sistemas de versionamento . 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 (por exemplo, se um programador renomeia uma função enquanto outro altera uma das linhas dessa função), o sistema de versionamento pensará que um programador criou uma nova função enquanto outro modificou uma função antiga. Em um sistema de versionamento de 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 "reduza". No exemplo acima, o programador poderia ampliar para obter um nível que diria algo como:
<<imprima os números de 1 a 10>>
Dessa forma, os sistemas IP são autodocumentados em grande parte, permitindo que o programador mantenha uma boa imagem geral 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:
- Programação conceitual
- Programação orientada a linguagem (LOP)
- Transformação do programa
- Programação orientada à semântica (POS)
- Programação alfabetizada
- Arquitetura orientada a modelos (MDA)
- Fábrica de software
- Metaprogramação
- Lisp (linguagem de programação)
Veja também
- Programação automática
- Banco de dados de objetos
- Programação por demonstração
- Artefatura
- Árvore de resolução semântica
- Editor de estrutura
Referências
- ^ "Simonyi explica: 'Não era prático, quando a Microsoft estava fazendo grandes avanços com o .Net no curto prazo, enviar alguém da mesma organização que dissesse: "Não é assim que você deve fazer as coisas. E se você fizesse as coisas de outra forma, 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 )
- ^ Programação Generativa: Métodos, Ferramentas e Aplicações , por Krzysztof Czarnecki e Ulrich Eisenecker, Addison-Wesley , Reading, MA , EUA, junho de 2000.
- ^ Scott Rosenberg: "Anything You Can Do, I Can Do Meta." Technology Review , 8 de janeiro de 2007. Arquivado em 20 de setembro de 2020 em archive.today
Links externos
- Software Intencional - empresa de Charles Simonyi
- A Morte das Linguagens Computacionais, O Nascimento da Programação Intencional, um relatório técnico de Charles Simonyi (1995)
- Programação intencional - Inovação na era do legado, uma palestra de Charles Simonyi (1996)
- Entrevista do Edge.org com Charles Simonyi (entrevistador: John Brockman)
- Bancadas de trabalho de linguagem: o aplicativo matador para linguagens de domínio específico? - Artigo de Martin Fowler sobre a classe geral de ferramentas da qual a Programação Intencional é um exemplo.
- "Anything You Can Do, I Can Do Meta" Arquivado em 2012-02-11 no Wayback Machine Terça-feira, 9 de janeiro de 2007, Scott Rosenberg, Technology Review
- Aguardando o dia em que todos escreverão software, The New York Times , 28 de janeiro de 2007
- A programação é uma forma de criptografia?, por Charles Simonyi (2005)
- Níveis apropriados de abstração, por Charles Simonyi (2005)
- O conteúdo informativo dos programas, por Charles Simonyi (2005)
- Artigo X Considerado Nocivo, de Charles Simonyi (2005)
- Notações e Linguagens de Programação, por Charles Simonyi (2005)
- Observações pessoais de um desenvolvedor, por Mark Edel (2005)
- Vídeo educacional da Microsoft Research apresentando seu sistema de Programação Intencional (formato ASF, por volta de 1998, 20 megabytes)