A inteligência artificial que escreve programas

Colaboração: Alessandro de Oliveira Faria

Data de Publicação: 19 de setembro de 2018

Neste século XXI a profissão mais solicitada é a programação, que agora parece receber uma excelente ferramenta, a inteligência artificial. Veremos neste documento como utilizar um projeto de software livre que recorre aos recursos de inteligência artificial para criar programas, mais especificamente sub-rotinas, métodos e/ou funções.

O projeto denominado BAYOU foi criado por cientistas da computação da Universidade de Rice com o financiamento da Google e militares. A técnica utilizada é deep learning, tomando como princípio computacional a pesquisa para codificação baseado em tags/palavras-chave para o sistema desenvolver o software solicitado. O resultado do processamento é um código java criado pelo sistema conforme requisitado pelo “operador”.

Linux: A Inteligência Artificial que escreve programas

A tecnologia foi construída por técnicos da Universidade de Rice com verbas disponibilizadas pelo exército americano e Google. Resumidamente o sistema analisa cerca de 1500 código fontes de aplicativos Android, com aproximadamente 100 milhões de linhas.

Com toda esta base de informação, alimentou-se a inteligência artificial e o resultado foi um software para elaborar outro software. O aprendizado da informação contextual é o diferencial do projeto que permite obter linhas de código baseado apenas em tags/palavras chaves. Acredito ser uma excelente notícia, para o mundo da tecnologia, para melhorar cada vez mais a qualidade de código, obter ganhos de produtividade e utilizar o talento dos programadores para resolver problemas realmente complexo e não tarefas que exige uma simples CRTL+C CRTL+V.

O projeto ainda é embrionário, mas promissor e não tem o propósito de substituir programadores, como um corretor de texto não substituiu um escritor. Pelo menos neste momento, o projeto gera rascunho /sugestões de linhas de código relevantes para o trabalho que um desenvolvedor precisa elaborar. Mesmos assim acredito ser um passo muito importante para a ciência da computação e o projeto pode servir como base para um conceito muito inovador.

MÃO NA MASSA

Aqui veremos o que será necessário para executar o projeto BAYOU, desde os seus requisitos até a instalação e execução.

Requisitos:

  • Linux (CLARO!)
  • Maven
  • Mavn-jansi
  • Tensorflow
  • Scikit-learn

Para o texto tornar extenso, assumirei que o ambiente Linux com Java, Python e Maven está devidamente instalado e configurado.

Instalando os pacotes Tensorflow e Scikit-learn

Com o ambiente python funcionando corretamente, utilize os comandos abaixo como super-usuário para resolver as dependências python do projeto Bayou:

# pip install tensorflow
# pip install scikit-learn

Para testar o funcionamento adequado do tensorflow, utilize as instruções a seguir. Se o resultado for similar, significa que o ambiente python está devidamente configurado.

$ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'

Agora efetue o download a partir do código fonte.

$ git clone https://github.com/capergroup/bayou.git

Após o download, siga o exemplo a seguir para resolver as dependências java:

$ cd bayou/tool_files/build_scripts
$ sudo ./install_dependencies.sh

A compilação é efetuada com o comando build:

./build.sh

Agora para executar o motor principal, entre na pasta out e execute o comando start_bayou.sh:

$ cd out/
$ ./start_bayou.sh 
2018-09-08 20:53:52.604:INFO::main: Logging initialized @2482ms to org.eclipse.jetty.util.log.StdErrLog
2018-09-08 20:53:52.896:INFO:oejs.Server:main: jetty-9.4.z-SNAPSHOT
2018-09-08 20:53:52.992:INFO:oejs.AbstractConnector:main: Started ServerConnector@2cbb3d47{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
2018-09-08 20:53:52.993:INFO:oejs.Server:main: Started @2871ms
2018-09-08 20:53:52.994:INFO:oejs.Server:main: jetty-9.4.z-SNAPSHOT
2018-09-08 20:53:52.995:INFO:oejs.AbstractConnector:main: Started ServerConnector@7ea37dbf{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2018-09-08 20:53:52.995:INFO:oejs.Server:main: Started @2873ms
===================================
   Loading Model. Please Wait.    
===================================
INFO:tensorflow:Restoring parameters from model49.ckpt
===================================
           Bayou Ready            
===================================
* Serving Flask app "ast_server" (lazy loading)
* Environment: production
  Use a production WSGI server instead.
* Debug mode: off

Agora crie um arquivo .java onde desejamos que a inteligência artificial atue, coloque a TAG FILEWRITE para escrita de arquivo utilizando BUFFER.

import java.io.*;
import java.util.*;
public class Test {
   void write(File file, String toWrite) {
       {
               /// call:write type:FileWriter type:BufferedWriter
       }
   }  
}

Agora utilize o comando synthesize para o sistema devolver o resultado do problema proposto:

./synthesize.sh exemplo/Test.java

Veja o resultado:

---------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite) {
   {
     FileWriter fw1;
     BufferedWriter bw1;
     try {
       fw1 = new FileWriter(file);
       bw1 = new BufferedWriter(fw1);
       bw1.write(toWrite);
       bw1.close();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite) {
   {
     FileWriter fw1;
     BufferedWriter bw1;
     try {
       fw1 = new FileWriter(toWrite);
       bw1 = new BufferedWriter(fw1);
       bw1.write(toWrite);
       bw1.close();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite) {
   {
     FileWriter fw1;
     BufferedWriter bw1;
     try {
       fw1 = new FileWriter(file);
       bw1 = new BufferedWriter(fw1);
       bw1.write(toWrite);
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite) {
   {
     FileWriter fw1;
     BufferedWriter bw1;
     try {
       fw1 = new FileWriter(file);
       bw1 = new BufferedWriter(fw1);
       bw1.write(toWrite);
       bw1.newLine();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.IOException;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite) {
   {
     FileWriter fw1;
     try {
       fw1 = new FileWriter(toWrite);
       fw1.write(toWrite);
       fw1.close();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite) {
   {
     FileWriter fw1;
     try {
       fw1 = new FileWriter(file);
       fw1.write(toWrite);
       fw1.close();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite, boolean _arg11) {
   {
     FileWriter fw1;
     BufferedWriter bw1;
     try {
       fw1 = new FileWriter(toWrite, _arg11);
       bw1 = new BufferedWriter(fw1);
       bw1.write(toWrite);
       bw1.newLine();
       bw1.flush();
       bw1.close();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite, boolean _arg11) {
   {
     FileWriter fw1;
     BufferedWriter bw1;
     try {
       fw1 = new FileWriter(file, _arg11);
       bw1 = new BufferedWriter(fw1);
       bw1.write(toWrite);
       bw1.close();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite, boolean _arg11) {
   {
     FileWriter fw1;
     BufferedWriter bw1;
     try {
       fw1 = new FileWriter(file, _arg11);
       bw1 = new BufferedWriter(fw1);
       bw1.write(toWrite);
       bw1.newLine();
       bw1.flush();
       bw1.close();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

—-------- BEGIN PROGRAM  ----------
import java.io.*;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Test {
 void write(File file, String toWrite, boolean _arg11) {
   {
     FileWriter fw1;
     BufferedWriter bw1;
     try {
       fw1 = new FileWriter(file, _arg11);
       bw1 = new BufferedWriter(fw1);
       bw1.write(toWrite);
       bw1.newLine();
     } catch (IOException _e) {
     }
     return;
   }
 }
}

Resumidamente, recebemos diversos exemplos de como escrever um método para escrever um arquivo! Genial…

A seguir um vídeo demonstrativo da implementação do Bayou no meu projeto Modoki de código aberto.