Roteiro de linguagens
Aprenda a escolher a ferramenta adequada para construir suas aplicações
Esse artigo não quer convencê-lo a "comprar" uma linguagem de programação, ou tentar definir qual delas é a melhor. Simplesmente situarei onde elas podem ser usadas de diferentes maneiras, para resolver os mesmos problemas. Escolhendo cuidadosamente a linguagem, é possível resolver um problema mais rapidamente.
No último ano, por exemplo, tentei desenvolver uma aplicação para cliente/servidor de chat e achei bastante difícil fazer isto funcionar com o conhecimento que eu tinha de C e com o suporte e documentação disponível na Web. Isso ocorreu quando decidi tentar utilizar Java para desenvolver essa aplicação. Eu nunca tinha usado Java antes, mas estava familiarizado com as sintaxes para orientação de objetos do C++. Depois de algumas horas de pesquisa, encontrei-me desenvolvendo um servidor de chat com um cliente para rodar com ele. Isso me tomou uma semana, mas após terminado, tinha em mãos uma excelente aplicação rodando em modo texto.
A razão para eu estar apto a em iniciar em Java tão rápido foi graças às classes predefinidas, que gerenciam solicitações de rede como: listen (ouvir), accept (aceitar), socket (ligar/conectar), etc. A partir de então eu me senti suficientemente preparado para ir até o site da Sun e ler a documentação sobre cada classe específica. Até o dia de hoje, não estou certo se alguma vez tive a aplicação concluída sem ajuda externa, mas com Java tive a certeza de que estava preparado para fazê-lo.
Agora sei que poderia ter feito uma aplicação como essa com, virtualmente, qualquer linguagem de programação disponível na WEB, mas será que realmente era isso que eu queria? Provavelmente não, por muitas razões:
1. As linguagens de programação, em sua maioria, foram criadas para resolver problemas de domínio específico. Provavelmente você estará mais seguro se utilizar uma linguagem que foi criada para trabalhos em rede para desenvolver uma aplicação em Chat do que usando uma linguagem feita para lidar com problemas de Inteligência Artificial.
2. Se a sua aplicação precisa ser eficiente (com isso, quero dizer rápida e suficientemente pequena), então talvez Java não seja a melhor linguagem para sua aplicação.
3. É necessário que a aplicação seja portável ? (Com isso, quero dizer: será que eu quero que outros usuários peguem meu código e tornem minha aplicação executável sob Linux, Solaris, Windows, FreeBSD, etc.?). Lembre-se de que algumas linguagens são mais fáceis do que outras para portar aplicações de uma plataforma para outra.
Então, você se pergunta: onde o Linux se encaixa nessa história? Bem, deixe-me dizer que, graças aos sistemas open source, você e eu temos livre acesso a, virtualmente, cada uma das linguagens de programação que existem e não somos obrigados a pagar centenas e centenas de dólares para comprar um compilador/interpretador.
Com o Linux você pode descobrir qual linguagem preenche melhor suas necessidades em seu próprio tempo e com seus próprios recursos.
E eu quero encorajá-lo a fazer isso.
Outro exemplo que posso dar é o de um projeto que fiz na faculdade, especificamente para mostrar que linguagens diferentes trabalham melhor para certos problemas específicos. Eu nomeei o projeto de "The Polyglot Project" (O Projeto Poliglota), com a intenção de mostrar que, no mundo em que vivemos hoje, é necessário falar mais do que uma língua.*
*Nota: isso funciona para linguagens de programação e em nossa linguagem natural. Não é possível construir computadores sem um conhecimento básico de inglês, assim como não se pode programar bem sem um conhecimento básico de duas ou três linguagens de programação.
A razão principal pela qual decidi me envolver nesse projeto é para mostrar que linguagens diferentes têm uma melhor aplicação para certas áreas onde possam ocorrer problemas. Cada linguagem foi desenvolvida para preencher
uma necessidade e estas não
se relacionam entre si.
O Projeto
O projeto consiste no uso de diferentes linguagens que resolverão problemas individuais, mas trabalhando com um objetivo em comum: a formatação de um banco de dados em texto. Eu usarei a linguagem Prolog para criar minha "base de conhecimento" (nome técnico AI para banco de dados). A partir desse banco de dados extrairei todos os dados que não são necessários, usando AWK, e salvarei os dados úteis para diferentes arquivos.
Usarei a linguagem Perl para então pegar o último arquivo contendo apenas as informações importantes e formatar nele os dados para um arquivo final. Criarei um pequeno programa em C, que será equivalente ao comando "chmod" no Unix, com o qual o usuário estará apto a designar permissões para o banco de dados. Tudo também deverá estar documentado em um arquivo HTML, que será disponibilizado no final do projeto. Finalmente, eu ainda estou debatendo sobre isso, irei pegar uma linguagem final que integrará todos os scripts AWK e Perl em um grande e bem feito script. Penso criá-lo em um simples script para
um shell Unix.
O banco de dados consiste nos primeiros e últimos nomes dos estudantes (separados por um underscore "_") e três diferentes notas (separadas por colunas). Veja tabela 1.
O que foi consumido
Para iniciar o projeto eu tinha que, primeiramente, definir as linguagens que iria utilizar e porquê iria utilizá-las. Prolog, AWK e Perl são linguagens que eu já havia usado antes. Então, tive apenas que conseguir alguma documentação em cada uma delas para aprender o básico sobre elas.
Felizmente, estou tendo um curso de Inteligência Artificial que requer livros em Prolog; então, ao menos nessa linguagem tive auxílio. Agora, para AWK foi uma história diferente. Nunca tinha ouvido falar de AWK antes, por isso tive que fazer algumas pesquisas na Internet e encontrei um manual de 300 páginas, que foi a base de minha pesquisa para
a parte do projeto que utiliza essa linguagem.
Tive alguma coisa sobre Perl anteriormente, e tinha alguns livros para iniciantes que me ajudaram um pouco, mas, novamente, a Internet foi o maior recurso para minha ajuda e direcionamento. A seguir, comentarei em uma breve história/introdução cada linguagem que usei para iniciar esse projeto.
Prolog
Prolog foi inventada por Alain Colmerauer, na Universidade de Aix-Marseille, França, em 1972. Prolog é usada como uma ferramenta para inteligência artificial, principalmente porque ela é bastante versátil e baseada em pura lógica. Neste caso, Cálculo Predicado 1.
Projetei um banco de dados em Prolog que armazena dois campos em um arquivo texto: nome do estudante (primeiro-nome_último-nome) e três grades (grade1, grade2 e grade3).
Dentro do programa Prolog você pode fazer entradas para ver uma grade de um estudante. Se esse estudante não é encontrado no banco de
dados, o programa "inteligentemente" pergunta ao usuário se ele gostaria de adicioná-lo
e então salva todas as novas informações no banco de
dados.
A parte mais intrigante sobre o Prolog, e provavelmente seu maior potencial, é a recursividade. Eu nunca tinha visto uma linguagem tão dependente de recursividade como o Prolog. Interações regulares são consideradas má prática de programação (como o "goto" do C/C++). Esse dispositivo torna a linguagem muito poderosa, mas do ponto de vista do programador (nesse caso, eu), é muito mais difícil lidar com os algoritmos, se você não está acostumado a algoritmos recursivos. Veja tabela 2.
AWK
AWK foi inventada por
Alfred V. Aho, Peter J. Weinberger e Brian W. Kernighan. Dizem que AWK é a primeira letra do último nome de cada autor. A função básica da AWK é procurar por linhas ou outras unidades de texto que contenham certas entradas. Diferente de C ou C++, AWK não é uma linguagem de procedimentos, mas uma linguagem data-driven, o que significa que o programador descreve os dados com os quais deseja trabalhar e informa o que fazer quando os dados são encontrados.
Uma vez que a função da AWK é encontrar entradas, é esse o porquê de eu tê-la escolhido para iniciar a formatação do meu banco de dados em modo texto. AWK é uma linguagem muito interessante. É o tipo de linguagem fácil de usar, mas muito difícil de entender, se você não tiver um manual descritivo em mãos. Escrevi três scripts AWK. Todos eles com o propósito de extrair os dados desnecessários que são usados pelo Prolog - não me refiro aos campos de Primeiro nome, Último nome, Grade1, Grade2 ou Grade3.
Perl
Perl é uma linguagem feita sob medida para "Extração Prática e Linguagem de Reportação", sendo Larry Wall seu criador. Larry Wall criou Perl porque tinha que produzir alguns relatórios de uma hierarquia de arquivos Usenet-news para um sistema de bug-report, da qual AWK não poderia dar conta. Então, criou uma extensão para AWK, que viria a ser
a primeira versão do Perl.
O principal propósito do Perl
é prover ao programador facilidade para lidar com expressões regulares que são grandes demais para o shell Unix, mas ainda muito pequenas ou não complexas o bastante para gastar tempo resolvendo-as em C ou em alguma outra linguagem. O Perl vem obtendo crescente sucesso na World Wide Web, onde é muito usado em scripts CGI.
Com Perl eu desenvolvi
dois scripts: o primeiro pega meu último arquivo gerado pelo meu último script AWK
e formata os dados "crus" em uma tabela, dando a cada estudante uma média final para cada uma das três notas dadas. Esse primeiro script joga a saída para a tela e para um arquivo, algo como a tabela 3.
C
Sua origem pode ser rastreada através da BCPL, linguagem que foi desenvolvida na metade dos anos 60, a então linguagem B. Dennis Ritchie é o criador da linguagem C e seu principal propósito é que ela seja uma linguagem de programação de sistema, porque é pequena, compactamente descrita e adaptável para tradução por compiladores simples.
Para elaborar o projeto poliglota completo tive que usar uma linguagem para fazer uma espécie de programação do sistema, e uma vez que estou rodando esse projeto em Unix, não há melhor linguagem que C. Meu programa é um clone do comando Unix "chmod", usado para configurar a permissão de acesso em arquivos Unix. A diferença principal da minha versão de chmod (que eu chamo de chrights) é que ele retorna informações a respeito do arquivo que você está modificando.
De acordo com a tabela 5, você pode ver que, selecionados os direitos para o arquivo chamado names.1, o programa mostrará o nome do arquivo que você está modificando, o tamanho em bytes, a permissão antes da mudança (em base octal) e também a nova permissão que você designou. Fiz esse programa para ser uma ferramenta de configuração para permissões de leitura/escrita nos arquivos em texto do banco de dados. Ela será bastante útil em uma situação real, caso você queira restringir o uso de suas grades de banco de dados em uma rede.
Conclusão
Agora que terminei esse projeto, estou apto a ver e compreender por quê existem tantas linguagens de programação neste mundo. Cada uma é melhor em fazer alguma coisa onde qualquer outra poderia falhar. Também aprendi a importância de saber como usar a lógica resolvendo problemas e adaptando-a a uma linguagem específica (claro, ajuda se você tiver a documentação para fazer consultas).
Para finalizar esse artigo, eu coloquei uma pequena lista de linguagens que você deve querer aprender/lidar. Elas irão lhe dar uma base de conhecimento muito boa em programação e deixá-lo confortável para resolver problemas com diferentes linguagens. Tentei mostrar onde cada linguagem é melhor para ser usada, a classificação das linguagens, onde você pode fazer o download dos compiladores/interpretadores, e se é um compilador open source ou comercial.
COMPARATIVO DAS LINGUAGENS
- Linguagem
- Eficiência em
- Classificação
- Onde Pegar
- Suporte Linux
Prolog
Sistemas Inteligentes
Não-Procedural, Interpretada
ftp://swi.psy.uva.nl/pub/SWI-Prolog/
Sim - versão grátis
Cold Fusion
Aplicações pelo Browser com acesso
a banco de dados
Não-Procedural, Interpretada
Http://www.allaire.com
Sim - versão comercial
Php
Aplicações pelo Browser com acesso
a banco de dados
Procedural, também suporta Object
Oriented, Interpretada
Http://www.php.net
Sim - versão grátis
Unix Shell Script
Permite a automatização de qualquer Unix tasks
Procedural, Interpretada
Padrão com Linux: bash, ksh, csh, etc.
Sim - versão grátis
Perl
Aplicações para parse e formatação
de arquivos. Também é usado para
CGI - Aplicações pelo Browser com
acesso a banco de dados
Procedural, Interpretada
Padrão com Linux.
http://www.perl.com
Sim - versão grátis
C
Programação de Sistema.
Procedural, Compilada
Padrão com Linux: gcc
Sim - versão grátis
Java
Programas com suporte de rede e
servidor-client. Aplicações com
interface gráfica.
Object Oriented, Interpretada/Compilada
http://java.sun.com
Sim - versão grátis
Pascal
Para ensinar pessoas a programar.
Procedural, Compilada
http://agnes.dida.physik.uni-essen.de/~gnu-pascal/
Sim
C++
Programação de Sistema em classes.
Object Oriented, Compilada
Padrão com Linux: g++
Sim
#####################################
Appendix:
Source Files for the POLYGLOT Project:
PROLOG
Prolog Expert System that creates the database.This Prolog program is responsible for maintaining the students database.With this program you can query students on the database and also add a new student to the database.
%File Grades.pl
%Program that modifies its own knowlodge base
% This program requires file kb.pl, which should be a copy of capitals.pl
start :- consult(db.pl),
nl,
write(Type names in lower case, followed by period.), nl,
write(Type "stop." to quit), nl,
nl,
process_a_query.
process_a_query :- write(What is the name of the student? FORMAT:
firstname_lastname. ), nl,
read(Name),
answer(Name).
% If user typed stop. the save the knowlodge base and quit
answer(stop) :- write(Saving the knowledge base...), nl,
tell(db.pl),
listing(grades_of),
told,
write(Done.).
% If the Name is in the knowledge base display, then loopback to process_a_query
answer(Name) :- grades_of(Name, Grades),
write(The grades of ),
write(Name),
write( is ),
write(Grades),nl,
nl,
process_a_query.
% If the state is not in the kb, ask the user for info,
% add it to the knowledge base, and loopback to process_a_query
answer(Name) :- \+ grades_of(Name,_),
write(I do not know this student.),nl,
write(Please enter the grades.),nl,
write(Grades? FORMAT: grade1:grade2:grade3. ),nl,
read(Grades),
write(Thanks), nl, nl,
assertz(grades_of(Name, Grades)),
process_a_query.
AWK
Script #1 - get rid off the grades_of(This script takes the prolog database and divides one line of the database in to parts. It searches the string for a ( and when it finds it it splits the line in two on that point. Notice that on my for loop I only use the even rows of the text files, because the odd ones will be grades_of( and I dont have any use for it (except on the Prolog part). The script also sorts the output in alphabetical order by first name.
#!/bin/awk -f
################################
# Polyglot Project #
################################
# Author: Anderson Silva #
# For: CSCI 434 #
################################
# parse1_db
BEGIN { FS ="(" }
{
for (i=2; i<= NF; i=i+2)
{
command = "sort > names.1"
print $i | command
}
}
Script #2 - get rid off the ).on the end of each line.
The second script extracts the ). off of each line.
#!/bin/awk -f
################################
# Polyglot Project #
################################
# Author: Anderson Silva #
# For: CSCI 434 #
################################
# parse2_db
BEGIN { FS =")" }
{
for(i=1; i<= NF; i = i+2)
print $i > "names.2"
}
Script #3 - set firstname_name and last_name on even rows and grade1:grade2:grade3 on odd.After running the first and the second AWK scripts, the script separates the first and last name in one line and the grades on the following line.
#!/bin/awk -f
################################
# Polyglot Project #
################################
# Author: Anderson Silva #
# For: CSCI 434 #
################################
# parse3_db
BEGIN { FS ="," }
{
for(i=1; i<= NF; i=i+1)
{
if (i == 1)
print $i > "names.3"
else
print $i > "names.3"
}
}
Perl
Final Script that formarts AWK Script #3 ouput.After running the third AWK script your final output put should look like this:
firstname_lastname
grade1:grade2:grade3
Now, I use, Perl to get to the final format that is shown on Table #2. This perl program as soon as I am done outputting on the screen I save that same line to a file. It is also worth noticing, that now, names will always be on even rows and grades will be on odd rows, which makes it easier to create an algorithm that will extract the data needed.For formatting purposes, I had to add the chomp() function on the last two arguments that were carrying the file return caracter, in this case lastname and grade3.
#!/usr/bin/perl
##########################################
# Polyglot Project #
##########################################
# Perl Program that will take 1 file as #
#input. The file has students names and #
#the other contains the students grades #
#separeated by : #
##########################################
#Author: Anderson Silva #
#Date: Spring 1999 #
#For: CSCI 434 #
##########################################
$namefile=names.3';
$finalfile=final.4';
# Open files, if dont exist print error
# messages
open (NAMES, "<$namefile") || die "Cant open $namefile $!";
open (FINAL, ">$finalfile") || die "Cant open $final $!";
$i = 0;
while (<NAMES>) {
# Even lines are names
if ($i%2==0)
{
($first, $last) = split("_",$_);
}
else
{
# Odd lines are grades
($g1, $g2, $g3) = split(":",$_);
}
# Print Header First Time Only
if ($i==0)
{
printf "%10s %10s",First,Last;
printf " g1 g2 g3 Mean\n";
printf "============================================\n";
printf FINAL "%10s %10s",First,Last;
printf FINAL " g1 g2 g3 Mean\n";
printf FINAL "============================================\n";
}
# Print lines only after grades are calculated for each student
if ($i%2==1)
{
# Chomp takes "\n" from the last element
chomp($last);
chomp($g3);
# Calculate Average
$mean = ($g1 + $g2 + $g3)/3;
printf "%10s %10s %4s %4s %5s %3.2f\n", $first, $last, $g1,
$g2, $g3, $mean;
printf FINAL "%10s %10s %4s %4s %5s %3.2f\n", $first, $last,
$g1, $g2, $g3, $mean;
}
$i++;
}
close FINAL;
close NAMES;
exit(0);
C Program that is responsible for setting permission on UNIX systems. This program uses a very powerful function in C called strtoul() which can convert a string to any base the programmer wants to. This program also makes a system call to the Linux Operating System: chmod(), which is the function that actually changes the file permissions.
/***************************************************************************
main.cpp - description
begin : Thu Mar 25 21:50:50 EST 1999
copyright : (C) 1999 by Anderson Silva
email :afsilva@liberty.edu
***************************************************************************/
/***************************************************************************
*
*This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <errno.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char ** argv){
char *filename = argv[2];
int mode;
struct stat statbuf; // Struct that holds the file inode info
// Associates the file you are getting the info from
lstat(filename, &statbuf);
printf("\n\n");
printf("Current File Permission\n");
printf("\n");
printf("Filename : %s\t", filename);
printf("\nSize : %6ld"
"\nPermissions: %05o\n", statbuf.st_size, statbuf.st_mode & ~(S_IFMT));
/* make sure the flags to set were specified, along with the filename */
if (argc < 3)
{
printf("chrights usage: XXX <filename>\n");
exit(1);
}
// struol converts a string to whatever base is necessary. In this case
// for chmod we need octal.
mode = strtoul(argv[1], \0, 8);
chmod(filename, mode);
lstat(filename, &statbuf);
printf("\n");
printf("New File Permission\n");
printf("\n");
printf("Permissions: %05o\n", statbuf.st_mode & ~(S_IFMT));
return 0;
}
Tabela 1 - O banco de dados inicial db.pl
grades_of(anderson_silva, 85:89:100).
grades_of(jon_bob, 35:20:10).
grades_of(joanna_silva, 100:100:100).
grades_of(heverson_silva, 85:90:93).
grades_of(roberto_farias, 98:99:70).
grades_of(aaron_mathes, 90:95:100).
O arquivo de saída final deve se parecer como esse (Utilizado Perl):
First Last g1 g2 g3 Mean
================================================
aaron mathes 90 95 100 95.00
anderson silva 85 89 100 91.33
heverson silva 85 90 93 89.33
joanna silva 100 100 100 100.00
jon bob 35 20 10 21.67
roberto farias 98 99 70 89.00
Tabela 2
grades_of(anderson_silva, 85:89:100).
grades_of(jon_bob, 35:20:10).
grades_of(joanna_silva, 100:100:100).
grades_of(heverson_silva, 85:90:93).
grades_of(roberto_farias, 98:99:70).
grades_of(aaron_mathes, 90:95:100).
grades_of(raimundo_donato, 0:0:0).
grades_of(etiene_miranda, 100:89:91).
Tabela 3
First Last g1 g2 g3 Mean
===============================================================
aaron mathes 90 95 100 95.00
anderson silva 85 89 100 91.33
etiene miranda 100 89 91 93.33
heverson silva 85 90 93 89.33
joanna silva 100 100 100 100.00
jon bob 35 20 10 21.67
raimundo donato 0 0 0 0.00
roberto farias 98 99 70 89.00
<afsilva@cariocaX csci434> chrights 766 names.1
Tabela 4
-
Current File Permission
-
Filename : names.1
Size : 181
Permissions : 00777
-
New File Permission
-
Permissions : 00766