O Projeto RADiola foi uma ideia que tive em 2001, enquanto apanhava de livros e tutoriais de programação para Linux. Criar programas é divertido e útil, mas por que tem que ser tão complicado? Essa obsessão me persegue há décadas…
Daí surgiu a ideia de criar um sistema, livre e gratuito, dividido em módulos, em que qualquer pessoa possa desenhar a interface de um programa (as janelas, os botões, as tabelas, etc); definir, de forma BEM simples, as ações e cálculos que o programa deverá fazer, e então deixar que o próprio computador cuide de transformar isso tudo em um novo software. As fontes óbvias de inspiração: o Apple HyperCard, o Visual Basic e o RapidQ.
Cheguei a fazer algumas janelas e poucas funcionalidades do programa, usando Glade e GTK. Por falta de tempo, e também por ter me envolvido com outras atividades, já faz muito tempo que o desenvolvimento do RADiola está parado. Mas acho interessante compartilhar o que já desenvolvi aqui. Vai que alguém gosta desse sonho.
Programação visual e os módulos do RADiola
Criar um programa usando o RADiola deverá ser tão fácil quanto criar uma apresentação de Impress ou Powerpoint (bem, não sei usar nenhum dos dois, mas enfim : ) ). Por isso, o RADiola pode se tornar uma ótima introdução à programação, ou mesmo uma ferramenta útil para amadores e profissionais. A criação de um programa pode ser feita de forma totalmente visual. Para isso, o RADiola é dividido em três módulos, que podem vir a ser integrados em um só programa ou podem ser executados separadamente.
App Designer
É o módulo que tem a cara tradicional de um ambiente RAD como o Visual Basic e o Kylix. Aqui o usuário cria as janelas (forms) que compõem o aplicativo, insere os botões, campos e outros comandos, define as ações correspondentes a cada evento (por exemplo, o que acontece quando o usuário clica no botão OK), cria os menus da janela principal e os menus popups.
Neste módulo também deverão ser definidas as teclas de atalho da aplicação, bem como as variáveis e os tipos estruturados (structs em C) globais do programa.
Aqui também são definidas algumas características do aplicativo, como o toolkit de objetos gráficos que será utilizado, quais as variáveis globais existentes no programa, o uso de timers e interrupções do sistema, e suas teclas de atalho.
Este módulo também é responsável por salvar todas essas informações em um arquivo de script, e depois deve ser capaz de ler esse arquivo e reconstruir na IDE as janelas que o usuário havia desenhado. Também deverá permitir o salvamento e a carga de janelas (forms) individuais, ou seja, não necessariamente integradas a um aplicativo em desenvolvimento.
Ao contrário da maior parte das IDEs visuais, planejo o App Designer sem aquela famosa tabela de propriedades usada para definir as características de cada objeto. Talvez eu mude de idéia algum dia, mas por enquanto acho que é melhor cada widget ter uma janela própria de definições, que aparece quando ele é colocado no form ou quando o usuário clica o mouse duas vezes sobre o widget. Nessa janela estarão propriedades como o texto (caption) que vai sobre o widget, o tamanho do widget, e também quais ações serão tomadas com a ocorrência de algum determinado evento. Essas ações poderão ser criadas no módulo Logical Editor ou selecionadas da Biblioteca RADiola.
Logical Editor
No RADiola não será preciso escrever funções ou subrotinas em linguagem de programação. O módulo Logical Editor é um editor visual de funções e subrotinas.
Para criar uma função, o usuário só precisa desenhar um fluxograma, onde cada bloco do fluxo é uma das instruções básicas de qualquer linguagem de programação. Estão representadas:
- instruções de atribuição (a = b+c);
- avaliação if-then (se A é maior que B, siga esse caminho do fluxo, senão, siga este outro);
- loop condicional (enquanto A for menor que B, executar esse trecho repetidamente);
- chamada de outra função;
- retorno.
Todas essas estruturas convencionais de programação podem ser representadas em um arquivo XML de maneira independente da linguagem de programação em que o código será gerado.
O usuário também pode criar variáveis locais e estruturas (structs em C, records em Pascal). A função criada pode então ser salva na biblioteca do RADiola. Para usar uma função, o usuário do RADiola só precisará selecioná-la em uma lista de ações que é apresentada no App Designer na hora de atribuir uma ação para um objeto gráfico do programa.
Code Generator
As definições gerais do aplicativo, suas janelas e cada objeto visual criado no App Designer são salvas em um só arquivo de texto, em uma linguagem de script. A tradução para linguagem de programação é feita pelo módulo Code Generator. É o único módulo essencialmente não-visual do RADiola, e também é o módulo tecnicamente mais simples. Ele é responsável basicamente por traduzir os scripts, gerados pelos outros módulos, para código-fonte em alguma linguagem de programação. Essa abordagem é muito mais simples, a meu ver, do que gerar diretamente um executável. Além do mais, permite que o usuário mais avançado possa ler, modificar, distribuir e otimizar o código-fonte antes de gerar o programa final.
O Code Generator “oficial” do RADiola, a princípio, vai gerar código em linguagem C para o compilador GCC, da GNU. Tal escolha explica-se por dois fatores: C é uma linguagem relativamente simples e altamente portável, e existem versões do GCC para tudo que é computador que existe.
Mas pela organização modular do RADiola, é possível ter vários Code Generators, um para cada linguagem de programação desejada. Quem quiser poderá criar um Code Generator para a linguagem que achar melhor, como Rapid-Q Basic, Visual Basic, Pascal, C++, Java, TCL/Tk, etc. Isso poderá tornar o RADiola uma das mais interessantes ferramentas de programação existentes — o que, nesse caso, tornará o RADiola um ambiente de programação visual multilinguagem.
O fato de não ser visual não quer dizer que o Code Generator será simplesmente um programa de linha de comando, ou que não oferecerá opções. Em uma simples janela ele pode oferecer ao usuário informações sobre a geração de código e algumas opções — por exemplo, convocar o GCC automaticamente após o processo, ou permitir o uso de bibliotecas dinâmicas, ou definir o diretório onde o código-fonte será gravado, ou definir ainda quais bibliotecas e arquivos de inclusão utilizar, etc.