Fundamentos de Programação para Visual Basic

Com certeza, você deve estar familiarizado com a terminologia usada na indústria de computadores: bits, bytes, RAM, ROM, CPU e assim por diante. No entanto, se você tem apenas uma idéia geral do significado desses termos, não deixe de ler as próximas seções. Compreender o que está acontecendo dentro do computador é uma parte importante do aprendizado de programação. Naturalmente, você pode apenas aprender as regras e fazer um trabalho razoável, porém alguns conhecimentos adicionais poderão levá-lo a se sentir mais produtivo e confortável com relação aos computadores.

Computadores e Dados

Computadores são ferramentas para tratamento de informações, da mesma forma que martelos e serrotes servem ao tratamento de madeira. Enquanto madeira é medida em polegadas ou centímetros, uma informação é medida em bits. Um bit é a unidade fundamental que mede a quantidade de informação que pode ser transferida de um lugar para outro. É o bloco atômico de construção do universo de informações. A resposta a uma questão, por exemplo, requer pelo menos um bit de informação - quando não há bit não há resposta. No papel, um bit é convencionalmente representado pelo número 0 ou 1. Em um computador digital, um bit é representado pelo existência ou não de uma corrente elétrica.

Quando você tem 20 centímetros de madeira, sabe que está lidando com

uma quantidade de material palpável. Porém, o que significa ter 3 bits de informação? Como Humpty Dumpty disse em "Alice no País do Maravilhas", significa "o que eu desejar que signifique". Como será mostrado pela Figura 2.1, três bits de informação poderiam representar respostas para três perguntas: "É maior do que a caixa de pão? É uma cor brilhante? Pode cantar?" (não, sim, não); uma série de voltas para a esquerda ou para a direita (direita, esquerda, direita); ou outros exemplos.

O significado da informação representada por bits depende do contexto. Para entender isso, imagine que um amigo se aproxime de você na rua e diga: "Quarenta e dois". A sua primeira reação provavelmente seria de espanto. Entretanto, se após a saudação você tivesse feito uma pergunta do tipo "Qual a sua idade?" ou "Quantas vezes?", a resposta teria um significado mais ou menos evidente. A sua pergunta fornece um contexto para entendimento da resposta. Outras vezes, apesar de não haver uma pergunta, há algum fato ocorrido num passado bem recente que permite a inferência do contexto. Por exemplo, se você se encontrasse com um amigo que no dia anterior foi com você ao cinema ver um filme de terror, uma frase do tipo "Belas bruxas" teria o contexto "filme" facilmente inferido.

Figura 2.1 Bits representando informações.

Em um computador, alguns contextos são inferidos com mais freqüência do que outros. Um contexto muito comum é o numérico. Uma vez que bits são escritos como 0s e 1s, um grupo deles quase sempre representa um número binário (um valor do sistema binário, isto é, base 2).

Representando Valores Numéricos

O sistema numérico decimal (base 10) usa dez símbolos diferentes: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9 para representar os números. (Tenha em mente que esses dígitos são apenas símbolos; os romanos, por exemplo, usavam o símbolo V para representar o número 5 e X para representar o número 10) Para se representar um número maior do que 9 (digamos 14) no sistema numérico decimal, há uma combinação de dois símbolos, sendo que a posição de cada um tem um significado especial. A progressão de valores representada pelas posições, como mostrado na Figura 2.2, corresponde a potências crescentes de 10. Um número decimal que contenha vários algarismos é uma soma de potências de 10. O número 14, por exemplo, representa a soma de 1 dezena (10 1) e 4 unidades (10 0); o número 243, por usa vez, é a soma de 2 centenas (10 2), 4 dezenas (10 1) e 3 unidades (10 0), e assim por diante.

Figura 2.2 Valores posicionais no sistema de numeração decimal.

Esse método geral de representação numérica também pode ser usado com outras bases além da decimal. Por exemplo, o sistema numérico na base 7 usa sete dígitos, 0, 1, 2, 3, 4, 5 e 6, sendo que o valor de cada posição aumenta em potências de 7, como é mostrado na Figura 2.3. (Quando um número é seguido por um subscrito, isto significa que o número indica a base; números sem subscritos, a menos que haja indicação em contrário, são subentendidos como sendo de base 10.)

Figura 2.3 Valores posicionais no sistema numérico de base 7.

Certamente, agora, você conhece as regras do jogo. O sistema binário usa dois dígitos (0 e 1), e cada posição representa um incremento de valor posicional de potências de 2. (Veja a Figura 2.4.) O sistema binário é apenas um dos mecanismos que serão adotados para permitir a representação de números em computadores. Naturalmente, você consegue realizar operações aritméticas em qualquer sistema numérico com a mesma facilidade que no sistema de base 10; ao utilizar números binários, os computadores apenas podem fazer somas, subtrações, multiplicações e divisões.

Figura 2.4 Valores posicionais no sistema numérico de base 2 (binário).

Representando Caracteres

Na maioria dos casos, não é suficiente representar apenas informações numéricas.

Como é que você pode ultrapassar o contexto de simples números? Uma das formas seria aplicar uma codificação padronizada. No código Morse Internacional, usado para envio de sinais telegráficos, determinadas seqüências de sons representam letras do alfabeto; três pontos em sucessão rápida representam a letra S; três pontos seguidos por um traço, a letra V; e assim por diante. De forma muito semelhante, os dígitos 0 e 1 são combinados para criar um código para computadores.

O padrão ASCII (American Standard Code for Information Interchange - Código Padrão Americano para Troca de Informações) especifica as regras de combinação de 0s e 1s para formar um código para computadores. O ASCII usa valores numéricos para definir o conjunto de caracteres da língua inglesa, incluindo letras maiúsculas e minúsculas, algarismos, sinais de pontuação e outros símbolos. A versão estendida do ASCII adotada pela grande maioria dos sistemas de computadores usa 8 bits para representar cada letra, número, sinal de pontuação e outros símbolos comuns à linguagem escrita. A Figura 2.5, mostra alguns exemplos do código ASCII.

Figura 2.5 Padrão ASCII para a representação de alguns caracteres

Entretanto, é importante lembrar que a simples visualização de um conjunto de bits não revelará qual o contexto associado. Por exemplo, a seqüência 01000001 representa a letra A em código ASCII, mas também pode ser interpretada como a representação binária do número decimal 65. Como se vê, a interpretação da informação contida num conjunto de bits depende do contexto. Algumas vezes, você pode tirar vantagem do fato de um valor poder ser usado tanto para a representação de números inteiros quanto para letras. Por exemplo, o fato de cada caractere possuir um valor numérico significa que você pode testar quando um caractere é maiúsculo, verificando se o seu valor numérico é maior ou igual a 65 (ASCII "A") e menor ou igual a 90 (ASCII "Z").

Usando Bits, Bytes e Palavras

O uso de bits para representar informações permite ao sistema de computação armazenar ou "memorizar" as informações. Entretanto, organizar a memória dos computadores tomando-se como base o bit é inconveniente, pois apenas um bit não representa muita informação. Por exemplo, com o código estendido do ASCII são necessários 8 bits para representar um simples caractere.

De fato, o comprimento de um caracter é usado como unidade padrão de medida. Essa unidade padrão de medida contendo 8 bits é chamada de byte. Para fazer referência a grandes quantidades de dados, os prefixos do sistema métrico kilo, mega e giga são adicionados ao termo byte. Em virtude da preferência dos cientistas de computação pelas potências de 2, um kilobyte (Kbyte) representa 1.024 (2 ^ 10) bytes, enquanto um Megabyte representa 1.048.576 (2 ^ 20) bytes. Após isso vem o gigabyte (2 ^ 30), o terabyte (2 ^ 40) e o pentabyte (2 ^ 50). Você não precisa ficar extremamente preocupado com o que vem depois.

Porém, um byte. não é apropriado para a representação da maioria dos valores numéricos. O padrão de 8 bits pode apenas representar os números decimais de 0 a 255. Portanto, para tornar mais eficientes as operações aritméticas, a maioria dos computadores trabalha com dados em blocos maiores do que um byte. O número de bits que um computador "prefere" usar é chamado de tamanho de palavra do computador e não é padronizado. Muitos computadores de grande porte e micros modernos têm um comprimento de palavra de 32 bits, o que permite a acomodação de números da ordem de bilhões. (Ainda que o hardware seja otimizado para usar esse comprimento de palavra, os computadores não se limitam ao tratamento de valores que possam ser representados em 32 bits.)

Armazenando Informação no Computador

A Figura 2.6 mostra um diagrama de blocos simplificado de um computador. No que se refere ao diagrama, você pode pensar em memória como a caixa onde os bits são armazenados quando o computador está processando. No momento, restringiremos nossa discussão à memória eletrônica chamada RAM (Random Access Memory - Memória de Acesso Aleatório).

Figura 2.6 Um diagrama de blocos de um sistema de computação.

Você pode imaginar a RAM como sendo uma longa fila de caixas, cada qual grande o suficiente para conter 1 byte de dados e ser identificada por um número. Por exemplo, alguém poderia dizer, "Dê-me o byte de dados da caixa 27441" ou "Coloque a letra g na caixa 13". Esse número identificador da localização da memória é chamado de endereço da memória.

O Visual Basic, como os demais compiladores, permite o uso de nomes em lugar de números para referências a locais de memória. (O computador está habilitado a usar endereços numéricos, porém é mais confortável para os usuários trabalhar com nomes simbólicos de variáveis.) Ainda que o Visual Basic possa associar um nome a uma seqüência de bytes, cada variável do Visual Basic corresponde a uma localização de memória. Mais adiante você aprenderá mais sobre como o Visual Basic armazena e representa os diferentes tipos de dados.

Instruções de Computador

Vejamos, agora, o que o computador faz com os dados que ele contém. Dentro do computador, um ou dois chips atuam como unidade central de processamento. A CPU trata os dados na memória de acordo com um conjunto de instruções chamado de programa. Para que o computador possa executar as instruções, o programa precisa estar na RAM. Instruções, da mesma forma que os dados, precisam ser representadas por seqüências de bits.

As instruções orientam o computador para executar ações específicas simples, tais como adicionar, subtrair, comparar ou copiar bits de um endereço de memória para outro. Outras instruções enviam informações para dispositivos externos à CPU, tais como impressora, disco ou vídeo. Por exemplo, uma certa seqüência de bits poderia representar a instrução "Some 1 ao número na memória 732" ou "Envie a letra M para o dispositivo de saída 3". As seqüências de bits que controlam o processador variam de CPU para CPU. (E por isso que programas escritos para um IBM PC não rodarão em um Macintosh da Apple e vice-versa.) A lista completa de instruções de controle de um certo processador é chamada de conjunto de instruções.

É possível escrever programas, submetendo diretamente as seqüências de bits que constituem cada instrução. Esse método, conhecido como programação em linguagem de máquina, raramente é usado. Algo mais comum é encontrar pessoas programando em linguagem Assembly, na qual cada seqüência especial de caracteres, tais como ADD ou TEST, corresponde a uma instrução em linguagem de máquina. Um programa chamado assemblador transforma as seqüências de caracteres escritas pelo programador em linguagem de máquina, conforme mostrado pela Figura 2.7. Muito embora a programação em linguagem Assembly, seja menos dolorosa (e menos sujeita a erros) do que a programação em linguagem de máquina, o programa continuará tendo de especificar a instrução que o processador terá de executar. Comandar o processador para efetuar uma simples captura de uma tecla pode demandar quase uma centena de instruções. Em conseqüência disso, até mesmo os programas mais simples podem requerer algumas milhares de instruções, podendo chegar a milhões de instruções no caso de programas mais complexos.

Figura 2.7 Um assemblador trabalhando.

Compiladores e Interpretadores

Programas especiais chamados de compiladores podem ajudá-lo a evitar o nível excessivo de detalhes da programação em linguagem Assembly. Um compilador permite ao programador escrever comandos mais produtivos que em Assembly ou em linguagem de máquina; um comando Visual Basic, por exemplo, geralmente é transformado em muitas instruções de linguagem de máquina. O programador escreve comandos na linguagem-fonte do compilador, que, por sua vez, transforma-a em linguagem de máquina. Linguagens-fonte comuns atualmente incluem C, Pascal e Visual Basic. A Figura 2.8 ilustra como trabalha um compilador.

Para simplificar, um compilador ou um assemblador lê um arquivo de instruções escritas pelo programador e produz como saída um arquivo em código de máquina. O programa em código de máquina é então executado para produzir o resultado que se esperava ao escrever o programa. Nos sistemas operacionais MS-DOS e Windows, um arquivo com extensão EXE ou COM contém código de máquina e pode ser carregado diretamente na memória para ser executado.

Figura 2.8 - Compilando linguagem-fonte em linguagem de máquina.

Interpretadores, de forma similar aos compiladores, também transformam instruções escritas em código-fonte. Entretanto, um interpretador transforma cada linha de código-fonte e então executa imediatamente o código de máquina resultante. O interpretador então volta ao código-fonte e transforma a próxima linha. A Figura 2.9 apresenta as principais diferenças entre compiladores e interpretadores. Outro meio de compreender a diferença entre compiladores e interpretadores é imaginar como a tradução de um livro difere da tradução simultânea fornecida pelos intérpretes da ONU. O trabalho de tradução de um livro assemelha-se ao processo de um compilador. Um tradutor recebe uma edição do livro russo Guerra e Paz, e após alguns anos de árduo trabalho, produz um novo livro com o mesmo texto em javanês. O intérprete russo-javanês na ONU, entretanto, trabalha com cada palavra falada imediatamente, da mesma forma que o interpretador do computador.

Figura 2.9 Compilando e interpretando.

Compilador ou interpretador, cada qual tem suas vantagens. Os compiladores fazem o seu trabalho uma única vez e o resultado é um arquivo executável que pode ser processado quantas vezes for preciso. Interpretadores lhe dão retorno mais rápido, podendo ajudá-lo na detecção de erros. O Visual Basic contém tanto um interpretador quanto um compilador.

Você logo estará em contato com o interpretador do Visual Basic. Quando você escolher a opção Start do menu Run, o Visual Basic interpretará o código escrito e começará a executá-lo. Você aprenderá como suspender a execução de seu programa enquanto ele está sendo processado e então submeter comandos diretamente para o interpretador, para identificar e localizar possíveis erros de sua codificação. Quando o interpretador está fazendo o seu trabalho, tanto o programa Visual Basic quanto o seu aplicativo devem estar na memória ao mesmo tempo.

Você também pode optar por compilar os seus aplicativos. Um aplicativo compilado pode ser processado em qualquer sistema de computação que esteja rodando o Windows; ele não dependerá do programa Visual Basic para poder ser processado.

Compilando o Programa Cronômetro

Vamos tentar compilar o programa escrito por você no Capitulo 1. Caso não esteja trabalhando com o Visual Basic no momento, inicie a sua execução. Carregue o projeto Cronom, selecionando a opção Open Project do menu File. Abra o arquivo Cronom.vbp, que é o arquivo de projeto para o programa Cronômetro. Para compilar o aplicativo, selecione a opção Make EXE a partir do menu File. Na caixa de diálogo Make EXE File, mostrada na Figura 2.10, altere o título do aplicativo para Cronom. Informe o diretório de sua escolha, digite Cronom.exe como nome do arquivo e dê um clique no botão OK, para fechar a caixa de diálogo. Após isso, o Visual Basic transformará o código-fonte de seu programa em linguagem de máquina, gravando-o no arquivo Cronom.exe.

Agora, tente executar a versão compilada do programa Cronom sem o Visual Basic. Saia do Visual Basic, selecionando a opção Exit do menu File. No menu Iniciar do Windows, selecione a opção Executar. Na caixa de texto linha de comando da caixa de diálogo Executar, digite o caminho de acesso do programa Cronom - por exemplo, \VB\Cronômetro\Cronom.exe - e dê um clique em OK. O aplicativo será carregado na memória e executado.

Figura 2.10 A caixa de diálogo Make EXE File usada para compilar programas.

Você pode dar cópias da versão EXE de seu programa para seus amigos ou companheiros de trabalho, os quais poderão processá-lo, mesmo que o Visual Basic não esteja instalado em seus computadores. Entretanto, eles precisarão de um arquivo adicional chamado MSVBVM60.DLL (que foi gravado no diretório System do Windows quando você instalou o Visual Basic.) Qualquer um que for processar um aplicativo compilado pelo Visual Basic precisa de uma cópia desse arquivo. (Uma vez que a Microsoft garante explicitamente que esse arquivo pode ser distribuído, você não estará violando sua licença de uso do Visual Basic se der uma cópia do MSVBVM60.DLL juntamente com o programa compilado.)

MSVBVM60.DLL contém um conjunto de rotinas que o seu programa necessita. O Visual Basic não transforma cada comando diretamente em linguagem de máquina. Alguns conjuntos de instruções, tal como a rotina para controlar a data e a hora atual do sistema, são necessários com tanta freqüência que o Visual Basic mantém disponível apenas uma única cópia no arquivo MSVBVM60.DLL. Quando o seu programa requisita a hora atual, a rotina contida no arquivo MSVBVM60.DLL é executada. Uma vez que esse arquivo ainda contém rotinas para tratamento de elementos básicos, tais como janelas e menus, até mesmo os programas mais simples necessitarão dos recursos contidos em MSVBVM60.DLL.

À medida que você desenvolver aplicativos mais sofisticados, terá de incluir arquivos adicionais do tipo DLL que fazem parte do Visual Basic. O Visual Basic pode ajudá-lo a criar um disco de instalação ou setup (semelhante aos que acompanham os aplicativos profissionais) que inclui todos os componentes necessários.

Utilize as macros do Rabjump para colar automaticamente seus tratamentos de erros