Engenharia da Computação
Short Description
Download Engenharia da Computação...
Description
A ENGENHARIA DA COMPUTAÇÃO Trabalho avaliativo que tem como objetivo principal avaliar os conhecimentos dos alunos do curso de hardware sobre a engenharia principal que constitui a computação, sob orientação do professor Gustavo.
SÃO PAULO 2011
2
RESUMO
A engenharia da computação foi a abordada de forma bem simples nesse trabalho, pois sobre esse assunto existe muito o que se falar. Os principais temas dentro da engenharia foram apresentados de forma forma simpl simplifi ificad cadaa e resumi resumida, da, infat infatiza izando ndo apenas apenas os compon component entes es funda fundame menta ntais, is, tanto tanto fisicamente, quanto logicamente. Esse trabalho abordou, em hardware: resistores, capacitores e transistores, transistores, que em circuitos circuitos elétricos elétricos de computadores, esses três componentes são fundamentais, exercendo funções de resistir correntes extras, estabilizar tensão, amplificar sinal, entre outras. Tambem foi abordado, em software: as linguagens C, C++, C# e Java e os bancos de dados Oracle, MySQL e SQL Server que são linguagem de programação que a maioria dos programadores utiliza na criação de seus software e os principais sistemas gerenciadores de bancos de dados.
3
SUMÁRIO
Introdução 1. A engenharia da computação 2. Resistor 2. 1. Resistência e resistividade 2. 2. Resistor variável 2. 1. 1. Termistores 2. 3. Código de cores 2. 2. Resistor variável 2. 4. Estrutura 2. 5. Transdutores
07 08 08 08 09 10 10 11 12 12
3. Capacitor 3. 1. História 3. 2. Funcionamento 3. 3 Capacitância 3. 4. Aplicações 3. 5. Identificação de valor 3. 5. 1. Capacitor cerâmico 3. 6. Capacitores variáveis
13 13 15 15 16 17 17 17
4. Transistor 4. 1. História 4. 2. Funcionamento 4. 2. 1. Características de um transistor 4. 3. Fabricação 4. 4. Importância
18 19 19 21 21 23
5. Engenharia de Software
24
6. Linguagem C 6. 1. História 6. 2. Características do C 6. 3. Tipos de dados 6. 4. Matemática 6. 5. Estruturas de dados 6. 6. Ferramentas de programação
24 25 25 25 26 28 28
7. Linguagem C++ 7. 1. História 7. 1. 1. Etimologia 7. 1. 2. Trabalhos futuros 7. 2. Características 7. 2. 1. Filosofia
29 30 30 31 32 32
4
7. 2. 2. Biblioteca padrão 7. 2. 3. Operadores 7. 2. 4. Objetos 7. 2. 5. Encapsulamento 7. 2. 6. Polimorfismo 7. 2. 6. 1. Estático 7. 2. 6. 2. Dinâmico 7. 2. 7. Tratamento de exceções 7. 2. 8. Espaço de nomes 7. 2. 9. Incompatibilidade com C 7. 3. Ferramentas 7. 3. 1. Ambientes de desenvolvimento 7. 3. 2. Aplicativos desenvolvidos em C++
32 33 33 34 34 34 35 35 36 37 37 38 38
8. Linguagem C# 8. 1. História 8. 1. 1. Etimologia 8. 2. Características 8. 3. Bibliotecas de códigos
40 41 41 41 41
9. Linguagem Java 9. 1. História 9. 2. Características 9. 2. 1. Simplicidade 9. 2. 2. Orientação a objetos 9. 2. 3. Processamento distribuído 9. 2. 4. Multithreading 9. 2. 5. Exceções 9. 2. 6. Garbage collector 9. 2. 7. Machine independent 9. 2. 8. Polimorfismo 9. 2. 8. 1. Polimorfismo Universal 9. 2. 8. 2. Paramétrico ou parametrização 9. 2. 8. 3. Inclusão 9. 2. 8. 4. Polimorfismo Ad-Hoc 9. 3. Arquitetura e Ferramentas 9. 3. 1. Ferramentas para desenvolvimento em Java 9. 3. 2. Java e a Internet
43 43 43 45 45 45 45 46 46 46 46 47 47 47 48 48 49 50
10. Banco de Dados Oracle 10. 1. Edições
51 51
11. Banco de Dados MySQL 11. 1. História 11. 2. Características
52 52 53
12. Banco de Dados SQL Server 12. 1. Produtivo
53 53
5
12. 2. Inteligente Considerações Finais
55 56
6
INTRODUÇÃO
O tema abordado nesse trabalho é um tema de interesse e de necessidade a todos os estudantes e profissionais na área de informática, pois sem conhecimento da ferramenta em que se trabalha, é impossível ter total certeza do resultado final do projeto a ser realizado dentro da computação. Antes de escolher a profissão na área de informática, é fundamental para o futuro profissional conhecer como funciona a futura ferramenta de trabalho, qual componente faz o que, qual falta de componente causa determinado problema, como deve ser estruturado um software e entre outros tópicos. O principal foco dessa pesquisa é oferecer informações e conhecimentos sobre a estrutura que envolve a computação, tanto a parte física (circuitos) quando a parte lógica (softwares), quais os componentes principais para a arquitetura da computação, ou como diz o titulo desse trabalho, os componentes da engenharia da computação. Nesse trabalho são apresentadas as principais e fundamentais partes dentro da computação, onde mostra como cada componentes falado tem um papel fundamental para a estrutura de computadores.
7
1. A engenharia da computação A engenharia da computação é a ciência que estrutura as partes da computação. Essa engenharia é responsável por criar e definir o melhor caminho para a organização e estrutura de um computador, nessa engenharia se estuda como um computador é montado, desde os seus circuitos até os sistemas operacionais, e ela também é responsável pela criação de futuras e melhoradas tecnologias. A engenharia da computação é composta por diversas etapas, onde se projeta e, posteriormente, se cria hardware (partes físicas), que a parti desses hardwares, se projeta e cria softwares equivalentes.
2. Resistor
Resistores são componentes que têm por finalidade oferecer uma oposição à passagem de corrente elétrica, através de seu material. A essa oposição damos o nome de resistência elétrica, que possui como unidade ohm. Causam uma queda de tensão em alguma parte de um circuito elétrico, porém jamais causam quedas de corrente elétrica. Isso significa que a corrente elétrica que entra em um terminal do resistor será exatamente a mesma que sai pelo outro terminal, porém há uma queda de tensão. Utilizando-se disso, é possível usar os resistores para controlar a corrente elétrica sobre os componentes desejados. Alguns resistores são longos e finos, com o material resistivo colocado ao centro, e um terminal de metal ligado em cada extremidade. Este tipo de encapsulamento é chamado de encapsulamento axial. A fotografia a direita mostra os resistores em uma tira geralmente usados para a pré-formatação dos terminais. Resistores usados em computadores e outros dispositivos são tipicamente muito menores, freqüentemente são utilizadas tecnologia de montagem superficial (Surface-mount technology), ou SMT, esse tipo de resistor não tem "perna" de metal (terminal). Resistores de maiores potências são produzidos mais robustos para dissipar calor de maneira mais eficiente, mas eles seguem basicamente a mesma estrutura.
2. 1. Resistência e resistividade Os resistores são utilizados como parte de um circuito eléctrico e incorporados dentro de dispositivos microelectrónicos ou semicondutores. A medição crítica de um resistor é a resistência, que serve como relação de Tensão para corrente é medida em ohms, uma unidade SI. Um componente tem uma resistência de 1 ohm se uma tensão de 1 volt no componente fizer com que percorra, pelo mesmo, uma corrente com a intensidade de 1 ampère, o que é equivalente à circulação de 1 coulomb de carga elétrica, aproximadamente 6.241506 x 1018 elétrons por segundo. Qualquer objeto físico, de qualquer material é um tipo de resistor. A maioria dos metais são materiais condutores, e opõe baixa resistência ao fluxo de corrente elétrica. O corpo humano, um pedaço de plástico, ou mesmo o vácuo têm uma resistência que pode ser mensurada. Materiais que possuem resistência muito alta são chamados isolantes ou dielétricos. A relação entre tensão, corrente e resistência, através de um objeto é dada por uma simples equação, Lei de Ohm:
Onde V (ou U ) é a diferença de potencial em volts, I é a corrente que circula através de um objeto em ampères, e R é a resistência em ohms. Se V e I tiverem uma relação linear—isto é, R é
8
constante—ao longo de uma gama de valores, o material do objeto é chamado de ôhmico. Um resistor ideal tem uma resistência fixa ao longo de todas as frequências e amplitudes de tensão e corrente. Materiais supercondutores em temperaturas muito baixas têm resistência zero. Isolantes (tais como ar, diamante, ou outros materiais não-condutores) podem ter resistência extremamente alta (mas não infinita), mas falham e admitem que ocorra um grande fluxo de corrente sob tensões suficientemente altas. A resistência de um componente pode ser calculada pelas suas características físicas. A resistência é proporcional ao comprimento do resistor e à resistividade do material (uma propriedade do material), e inversamente proporcional à área da secção transversal. A equação para determinar a resistência de uma seção do material é:
Onde é a resistividade do material, é o comprimento, e é a área da secção transversal. Isso pode ser estendido a uma integral para áreas mais complexas, mas essa fórmula simples é aplicável a fios cilíndricos e à maioria dos condutores comuns. Esse valor está sujeito a mudanças em altas freqüências devido ao efeito skin, que diminui a superfície disponível da área. Resistores padrões são vendidos com capacidades variando desde uns poucos miliohms até cerca de um gigaohm; apenas uma série limitada de valores, chamados valores preferenciais, estão disponíveis. Na prática, o componente discreto vendido como "resistor" não é um resistor perfeito como definido acima. Resistores são freqüentemente marcados com sua tolerância (a variação máxima esperada da resistência marcada). Em resistores codificados com cores, uma faixa mais cinza à direita demonstra uma tolerância de 10%, uma faixa dourada significa 5% de tolerância, uma faixa vermelha marca 2% e uma faixa marrom significa 1% de tolerância. Resistores com tolerância menores, também chamados de resistores de precisão, também estão disponíveis. Um resistor tem uma d.d.p. e corrente máximas de trabalho, acima das quais a resistência pode mudar (drasticamente, em alguns casos) ou o resistor pode se danificar fisicamente (queimar, por exemplo). Embora alguns resistores tenham as taxas de d.d.p. e corrente especificadas, a maioria deles são taxados em função de sua potência máxima, que é determinada pelo tamanho físico. As taxas mais comuns para resistores de composição de carvão e filme de metal são 1/8 watt, 1/4 watt e 1/2 watt. Resistores de filme de metal são mais estáveis que os de carvão quanto a mudanças de temperatura e a idade. Resistores maiores são capazes de dissipar mais calor por causa de sua área de superfície maior. Resistores dos tipos wire-wound e sand-filled são usados quando se necessita de taxas grandes de potência, como 20 Watts. Além disso, todos os resistores reais também introduzem alguma indutância e capacitância, que mudam o comportamento dinâmico do resistor da equação ideal.
2. 2. Resistor variável O resistor variável é um resistor cujos valores podem ser ajustados por um movimento mecânico, por exemplo, rodando manualmente. Os resistores variáveis podem ser de volta simples ou de múltiplas voltas com um elemento helicoidal. Alguns têm um display mecânico para contar as voltas. Reostato é um resistor variável com dois terminais, sendo um fixo e o outro deslizante. Geralmente são utilizados com altas correntes. Potenciômetro É um tipo de resistor variável comum, sendo comumente utilizado para controlar o volume em amplificadores de áudio.
9
Metal Óxido Varistor ou M.O.V. / Varistores É um tipo especial de resistor que tem dois valores de resistência muito diferentes, um valor muito alto em baixas voltagens (abaixo de uma voltagem específica), e outro valor baixo de resistência se submetido a altas voltagens (acima da voltagem específica do varistor). Ele é usado geralmente para proteção contra curtos-circuitos em extensões ou pára-raios usados nos postes de ruas, ou como "trava" em circuitos eletromotores.
2. 2. 1. Termistores Dão resistências que variam o seu valor de acordo com a temperatura a que estão submetidas. A relação geralmente é directa, porque os metais usados têm uma coeficiente de temperatura positivo, ou seja se a temperatura sobe, a resistência também sobe. Os metais mais usado são a platina, daí as desisgnação Pt100 e Pt1000(100 porque à temperatura 0 °C, têm uma resistência de 100ohm, 1000 porque à temperatura 0 °C, têm uma resistência de 1000ohm) e o Níquel (Ni100). Os termistores PTC e NTC, são um caso particular, visto que em vez de metais usam semicondutores, por isso alguns autores não os consideram resistores. • PTC (Positive Temperature Coefficient) É um resistor dependente de temperatura com coeficiente de temperatura positivo. Quando a temperatura se eleva, a resistência do PTC aumenta. PTCs são freqüentemente encontrados em televisores, em série com a bobina desmagnetizadora, onde são usados para prover uma curta rajada de corrente na bobina quando o aparelho é ligado. Uma versão especializada de PTC é o polyswitch que age como um fusível auto-rearmável. • NTC (Negative Temperature Coefficient) Também é um resistor dependente da temperatura, mas com coeficiente negativo. Quando a temperatura sobe, sua resistência cai. NTC são freqüentemente usados em detectores simples de temperaturas, e instrumentos de medidas. LDR (Light Dependent Resistor) É uma resistência que varia, de acordo com a intensidade luminosa incidida. A relação geralmente é inversa, ou seja a resistência diminui com o aumento da intensidade luminosa. Muito usado em sensores de luminosidade ou crespusculares.
2. 3. Código de cores PRETO
MARROM
VERMELHO
LARANJA
AMARELO
VERDE
AZUL
VIOLETA
CINZA
BRANCO
0
1
2
3
4
5
6
7
8
9
A primeira faixa em um resistor é interpretada como o primeiro digito do valor ôhmico da resistência do resistor. Para o resistor mostrado abaixo, a primeira faixa é amarela, assim o primeiro dígito é 4: A segunda faixa dá o segundo dígito. Essa é uma faixa violeta, então o segundo dígito é 7. A terceira faixa é chamada de multiplicador e não é interpretada do mesmo modo. O número associado à cor do multiplicador nos informa quantos "zeros" devem ser colocados após os dígitos que já temos. Aqui, uma faixa vermelha nos diz que devemos acrescentar 2 zeros. O valor ôhmico desse resistor é então 4 7 00 ohms, quer dizer, 4 700Ω ou 4,7 kΩ. Verifique novamente, nosso exemplo, para confirmar que você entendeu realmente o código de cores dados pelas três primeiras faixas coloridas no corpo do resistor. A quarta faixa (se existir), um pouco mais afastada das outras três, é a faixa de tolerância. Ela nos informa a precisão do valor real da resistência em relação ao valor lido pelo código de
10
cores. Isso é expresso em termos de porcentagem. A maioria dos resistores obtidos nas lojas apresentam uma faixa de cor prata, indicando que o valor real da resistência está dentro da tolerância dos 10% do valor nominal. A codificação em cores, para a tolerância é a seguinte: COR
MARROM
VERMELHO
OURO
PRATA
TOLERÂNCIA
+ ou – 1%
+ ou – 2%
+ ou – 5%
+ ou – 10%
Nosso resistor apresenta uma quarta faixa de cor OURO. Isso significa que o valor nominal que encontramos 4 700Ω t em uma tolerância de 5% para mais ou para menos. Ora, 5% de 4 700Ω são 235Ω e ntão, o valor real de nosso resistor pode ser qualquer um dentro da seguinte faixa de valores: 4 700Ω - 235Ω= 4 465Ω e 4 700Ω+ 235Ω= 4 935Ω. A ausência da quarta faixa indica uma tolerância de 20%.
2. 4. Estrutura A ilustração mostra detalhes construtivos de um resistor de filme de carbono (carvão):
Durante a construção, uma película fina de carbono (filme) é depositada sobre um pequeno tubo de cerâmica. O filme resistivo é enrolado em hélice por fora do tubinho até que a resistência entre os dois extremos fique tão próxima quanto possível do valor que se deseja. São acrescentados terminais (um em forma de tampa e outro em forma de fio) em cada extremo e, a seguir, o resistor é recoberto com uma camada isolante. A etapa final é pintar faixas coloridas transversais para indicar o valor da resistência.
O "retângulo" com terminais é uma representação simbólica para os resistores de valores fixos tanto na Europa como no Reino Unido; a representação em "linha quebrada" (zig-zag) é usada nas Américas e Japão
2. 5. Transdutores
11
Resistores especiais também são usados como transdutores em circuitos sensores. Transdutores são componentes eletrônicos que efetuam conversão de energia de uma modalidade para outra onde, uma delas, é necessariamente energia elétrica. Microfones, interruptores e Resistores Dependentes da Luz ou LRDs, são exemplos de transdutores de entrada. Alto-falantes, lâmpadas de filamento, relés, "buzzers" e também os LEDs, são exemplos de transdutores de saída. No caso dos LRDs a quantidade de luz em suas superfícies resultam na alteração dos valores ôhmicos de suas resistências. Como se verá (Teoria III), um transdutor de entrada é freqüentemente associado a um resistor para fazer um circuito denominado divisor de tensão. Nesse caso, a tensão recolhida sobre esse divisor de tensão será um "sinal de tensão" que reflete as mudanças de iluminação sobre o LDR. Em outros circuitos, os resistores podem ser usados para dirigir frações da corrente elétrica para partes particulares do circuito, assim como podem ser usados para controlar o "ganho de tensão" em amplificadores. Resistores também são usados em associações com capacitores no intuito de alterar sua "constante de tempo" (ajuste do tempo de carga ou descarga). A maioria dos circuitos requerem a presença de resistores para seus corretos funcionamento. Assim sendo, é preciso saber alguns detalhes sobre diferentes tipos de resistores e como fazer uma boa escolha dos resistores disponíveis (valores adequados, seja em , ko u M) para uma particular aplicação.
3. Capacitor Capacitor (ou condensador) é um componente eletrônico que armazena energia elétrica em um campo elétrico existente em seu interior. Apesar de não conduzir corrente elétrica, a corrente que ele armazena será descarregada assim que não houver mais resistência entre seus terminais, podendo assim, manter uma corrente alternada estabilizada, como em um sinal de áudio ou filtro de baixa.
3. 1. História A Jarra de Leyden foi a primeira forma de capacitor. Fora inventada na Universidade de Leyden, na Holanda por Pieter van Musschenbroek. Ela era uma jarra de vidro coberta interna e externamente, mas sem se tocarem, com metal. A cobertura interna era conectada a uma vareta que saia pelo gargalo da jarra e terminava numa bola de metal, desta forma o vidro da jarra comportava-se como o dielétrico armazenador das cargas elétricas e os metais das paredes interna e externa como as armaduras deste capacitor primitivo.
3. 2. Funcionamento
12
Os capacitores são formados por dois condutores, denominados “armaduras”, as armaduras estão sempre separadas por substâncias dielétricas ou isolantes (ar, água pura, óleo). Um capacitor funciona da seguinte forma: em um circuito elétrico, sempre existirá a fonte de energia (uma pilha por exemplo) e o objeto que receberá a corrente elétrica (uma lâmpada por exemplo), e dentro de circuitos elétricos, por existe os capacitores que funcionam como “ajudantes” no enviou da corrente elétrica, ou seja, quando a carga elétrica liberada é excessiva, o capacitor tem a função de armazenar a energia extra impedindo que o objeto queime ou estoure. Para explicar melhor, uma maneira de visualizar a ação do capacitor é imaginá-lo como uma torre de água conectada a uma tubulação. Uma torre de água "armazena" pressão de água - quando as bombas do sistema de água enviam mais água do que a cidade necessita, o excesso é armazenado na torre de água, então, nos momentos de maior demanda, o excesso de água flui para fora da torre para manter a pressão alta. Um capacitor armazena elétrons da mesma forma, e pode liberá-los mais tarde. Em um circuito eletrônico, um capacitor é indicado da seguinte forma:
Quando você conecta um capacitor a uma pilha, é isto que acontece:
•
•
a placa do capacitor conectada ao terminal negativo da pilha aceita os elétrons que a pilha produz a placa do capacitor conectada ao terminal positivo da pilha perde os elétrons para a pilha
Depois de carregado, o capacitor possui a mesma tensão que a pilha (1,5 volts na pilha significa 1,5 volts no capacitor). Em um capacitor pequeno, a capacidade é pequena. Porém capacitores grandes podem armazenar uma carga considerável. Você poderá encontrar capacitores do tamanho de latas de refrigerante, por exemplo, que armazenam carga suficiente para acender o bulbo de uma lâmpada de flash por um minuto ou mais. Quando você vê relâmpagos no céu, o que você está vendo é um imenso capacitor onde uma placa é a nuvem e a outra placa é o solo, e o relâmpago é a liberação da carga entre essas duas "placas". Digamos que você conecte um capacitor desta maneira:
13
Você tem uma pilha, uma lâmpada e um capacitor. Se o capacitor for grande, você notará que, quando conecta a pilha, a lâmpada se acenderá à medida que a corrente flui da pilha para o capacitor e o carrega. A lâmpada diminuirá sua luminosidade progressivamente até finalmente apagar, assim que o capacitor atingir sua capacidade. Então você poderá remover a pilha e substituí-la por um fio elétrico. A corrente fluirá de uma placa do capacitor para a outra. A lâmpada acenderá e então começará a diminuir cada vez mais sua luminosidade, até apagar assim que o capacitor estiver totalmente descarregado (o mesmo número de elétrons nas duas placas).
3. 3 Capacitância Capacitância é capacidade que um capacitor tem de armazenar corrente elétrica em um campo eletrostático. A capacitância é medida pelo quociente de cargas (Q) armazenadas pela diferença de potencial ou tensão (V) que existe entre as placas:
A unidade que é medida a capacitância é o farad. Pelo Sistema Internacional de Unidades (SI), um capacitor tem a capacitância de um farad (F) quando um coulomb de carga causa uma diferença de potencial de um volt (V) entre as placas. O farad é considerado muito grande para circuitos práticos, sendo assim, é necessário usar os valores de microfarads (μF), nanofarads (nF) ou picofarads (pF). A capacitância de um capacitor de placas paralelas constituído de dois eletrodos planos idênticos de área A separados à distância constante d é aproximadamente igual a:
Onde: • C é a capacitância em faraday
14
• ε0 é a permissividade eletrostática do vácuo ou espaço livre • εr é a constante dielétrica ou permissividade relativa do isolante utilizado.
3. 3. 1. Circuitos elétricos Os elétrons não podem passar diretamente através do dielétrico de uma placa do capacitor para a outra. Quando uma tensão é aplicada a um capacitor através de um circuito externo, a corrente flui para uma das placas, carregando-a, enquanto flui da outra placa, carregando-a, inversamente. Em outras palavras, quando a Tensão que flui por um capacitor muda, o capacitor será carregado ou descarregado. A fórmula corrente é dada por:
Onde I é a corrente fluindo na direção convencional, e dV/dt é a derivada da tensão, em relação ao tempo. No caso de uma tensão contínua (DC ou também designada CC) logo um equilíbrio é encontrado, onde a carga das placas correspondem à tensão aplicada pela relação Q=CV, e nenhuma corrente mais poderá fluir pelo circuito. Logo a corrente contínua (DC) não pode passar. Entretanto, correntes alternadas (AC) podem: cada mudança de tensão ocasiona carga ou descarga do capacitor, permitindo desta forma que a corrente flua. Propriedades importantes dos capacitores, além de sua capacitância, são a máxima tensão de trabalho e a quantidade de energia perdida no dielétrico. Para capacitores de alta potência a corrente máxima e a Resistência em Série Equivalente (ESR) são considerações posteriores. Um ESR típico para a maioria dos capacitores está entre 0,0001 ohm e 0,01 ohm, valores baixos preferidos para aplicações de correntes altas. Já que capacitores têm ESRs tão baixos, eles têm a capacidade de entregar correntes enormes em circuitos curtos, o que pode ser perigoso. Por segurança, todos os capacitores grandes deveriam ser descarregados antes do manuseio. Isso é feito colocando-se um resistor pequeno de 1 ohm a 10 ohm nos terminais, isso é, criando um circuito entre os terminais, passando pelo resistor. Capacitores também podem ser fabricados em aparelhos de circuitos integrados de semicondutores, usando linhas metálicas e isolantes num substrato. Tais capacitores são usados para armazenar sinais analógicos em filtros chaveados por capacitores, e para armazenar dados digitais em memória dinâmica de acesso aleatória (DRAM). Diferentemente de capacitores discretos, porém, na maior parte do processo de fabricação, tolerâncias precisas não são possíveis (15 % a 20 % é considerado bom).
3. 4. Aplicações Os capacitores são usados nas fontes de alimentação, nas placas mãe e em inúmeros outros componentes. A função mais comum é retificar e estabilizar a corrente elétrica, evitando que variações possam danificar qualquer dispositivo. Capacitores também são usados na correção de fator de potência. É justamente por causa dos capacitores que nunca devemos tocar nos
15
componentes internos da fonte de alimentação sem os cuidados adequados. Você pode levar um choque considerável mesmo que a fonte esteja desligada da tomada. Os capacitores são também a base da memória RAM, onde para cada bit de dados temos um capacitor e um transístor. O transístor se encarrega de ler e gravar o bit, enquanto o capacitor armazena-o. Quando o capacitor está descarregado temos um bit 0 e quando está carregado temos um bit 1. Como no caso da memória o capacitor mantém sua carga por apenas alguns milésimos de segundo, os dados precisam ser reescritos continuamente. É por isso que a memória RAM é volátil. A diferença entre um capacitor e uma pilha é que o capacitor pode descarregar toda sua carga em uma pequena fração de segundo, já uma pilha demoraria alguns minutos para descarregarse. É por isso que o flash eletrônico em uma câmera utiliza um capacitor, a pilha carrega o capacitor do flash durante vários segundos, e então o capacitor descarrega toda a carga no bulbo do flash quase que instantaneamente. Isto pode tornar um capacitor grande e carregado extremamente perigoso, os flashes e as TVs possuem advertências sobre abri-los por este motivo. Eles possuem grandes capacitores que poderiam matá-lo com a carga que contêm. Os capacitores são utilizados de várias maneiras em circuitos eletrônicos: • Algumas vezes, os capacitores são utilizados para armazenar carga para utilização rápida. É isso que o flash faz. Os grandes lasers também utilizam esta técnica para produzir flashes muito brilhantes e instantâneos; • Os capacitores também podem eliminar ondulações. Se uma linha que conduz corrente contínua (CC) possui ondulações e picos, um grande capacitor pode uniformizar a tensão absorvendo os picos e preenchendo os vales; • Um capacitor pode bloquear a CC. Se você conectar um pequeno capacitor a uma pilha, então não fluirá corrente entre os pólos da pilha assim que o capacitor estiver carregado (o que é instantâneo se o capacitor é pequeno). Entretanto, o sinal de corrente alternada (CA) flui através do capacitor sem qualquer impedimento. Isto ocorre porque o capacitor irá carregar e descarregar à medida que a corrente alternada flutua, fazendo parecer que a corrente alternada está fluindo; Uma das utilizações mais comuns dos capacitores é combiná-los com indutores para criar osciladores.
3. 5. Identificação de valor 3. 5. 1. Capacitor cerâmico Os capacitores cerâmicos apresentam impressos no próprio corpo um conjunto de três algarismos e uma letra. Para se obter o valor do capacitor os dois primeiros algarismos representam os dois primeiros dígitos do valor do capacitor, e o terceiro algarismo (algarismo multiplicador) representa o número de zeros à direita. A letra representa a tolerância do capacitor (a qual pode ser omitida), que é a faixa de valores em que a capacitância variará. Para os capacitores cerâmicos até 10pF esta é expressa em pF. Para os acima de 10pF é expressa em porcentagem. Por exemplo um capacitor com 224F impresso no próprio corpo, possuirá uma capacitância de 220000pF com uma tolerância de +/- 1% (seu valor pode ser um ponto percentual à mais ou à menos desse valor).
16
3. 5. 2. Capacitor de poliéster Para a identificação dos valores do capacitor de poliéster é usado um conjunto de 7 faixas coloridas (conforme tabela), embora seja um método em desuso pelos fabricantes, no qual cada faixa representará respectivamente:primeiro algarismo,segundo algarismo, algarismo multiplicador, tolerância e tensão.O valor é obtido em pF.
Tabela para identificação dos valores do capacitor de poliéster
3. 6. Capacitores variáveis Há dois tipos distintos de capacitores variáveis, cujas capacitâncias podem ser mudadas intencionalmente e repetidamente ao longo da vida do dispositivo: • Aqueles que usam uma construção mecânica para mudar a distância entre as placas, ou a superfície da área das placas superpostas. Esses dispositivos são chamados capacitores de sintonia, ou simplesmente "capacitores variáveis", e são usados em equipamentos de telecomunicação para sintonia e controle de frequências.Neste tipo de capacitor o elemento dielétrico é o próprio ar. • Aqueles que usam o fato de que a espessura da camada de depleção de um diodo varia com a tensão da corrente contínua atravessando o diodo. Esses diodos são chamados de diodos de capacitância variável, varactores ou varicaps. Qualquer diodo exibe esse efeito, mas dispositivos vendidos especificamente como varactores têm uma área de junção grande e um perfil de dopagem especificamente dimensionado para maximizar a capacitância.
17
• Em um capacitor microfone (comumente conhecido como um microfone condensador), o diafragma age como uma placa do capacitor, e as vibrações produzem alterações na distância entre o diafragma e uma placa fixa, alterando a tensão entre as placas.
Capacitor variável de sintonia de rádio
4. Transistor O transistor é um componente eletrônico que começou a popularizar-se na década de 1950, tendo sido o principal responsável pela revolução da eletrônica na década de 1960. O termo vem de transfer resistor (resistor/resistência de transferência), como era conhecido pelos seus inventores. Os transistores são principalmente usados como amplificadores e interruptores de sinais elétricos. A corrente elétrica que passa entre coletor e emissor do transistor varia dentro de determinados parâmetros pré-estabelecidos pelo projetista do circuito eletrônico. Esta variação é feita através da variação de corrente num dos terminais chamados base, o que, conseqüentemente, ocasiona o processo de amplificação de sinal. Entende-se por "amplificar" o procedimento de tornar um sinal elétrico mais fraco num mais forte. Um sinal elétrico de baixa intensidade, como os sinais gerados por um microfone, é injetado num circuito eletrônico (transistorizado por exemplo), cuja função principal é transformar este sinal fraco gerado pelo microfone em sinais elétricos com as mesmas características, mas com potência suficiente para excitar os alto-falantes. A este processo todo dá-se o nome de ganho de sinal.
4. 1. História Durante a década de 1940 e início da de 1950, a maior parte da indústria continuou trabalhando no aperfeiçoamento das válvulas, obtendo modelos menores e mais confiáveis. Porém, vários pesquisadores, começaram a procurar alternativas menos problemáticas. Várias dessas pesquisas tinham como objetivo o estudo de novos materiais, tanto condutores quanto isolantes. Os pesquisadores começaram então a descobrir que alguns materiais não se enquadravam nem em um grupo nem em outro, pois, de acordo com a circunstância, podiam atuar tanto como isolantes quanto como condutores, formando uma espécie de grupo intermediário que foi logo apelidado de grupo dos semicondutores.
18
Haviam encontrado a chave para desenvolver o transístor. O primeiro protótipo surgiu nos Laboratórios da Bell Telephone por Bardeen e Brattain em 16 de dezembro de 1947 (Era consistindo em um pequeno bloco de germânio (que na época era junto com o silício o semicondutor mais pesquisado) e três filamentos de ouro. Um filamento era o pólo positivo, o outro, o pólo negativo, enquanto o terceiro tinha a função de controle.) e foi inicialmente
demonstrado em 23 de Dezembro de 1948, por John Bardeen, Walter Houser Brattain e William Bradford Shockley, que foram laureados com o Nobel de Física em 1956. Ironicamente, eles pretendiam fabricar um transistor de efeito de campo (FET) idealizado por Julius Edgar Lilienfeld antes de 1925, mas acabaram por descobrir uma amplificação da corrente no ponto de contato do transistor. Isto evoluiu posteriormente para converter-se no transistor de junção bipolar (BJT). O objetivo do projeto era criar um dispositivo compacto e barato para substituir as válvulas termoiônicas usadas nos sistemas telefônicos da época. Os transistores bipolares passaram, então, a ser incorporados a diversas aplicações, tais como aparelhos auditivos, seguidos rapidamente por rádios transistorizados. Mas a indústria norteamericana não adotou imediatamente o transistor nos equipamentos eletrônicos de consumo, preferindo continuar a usar as válvulas termoiônicas, cuja tecnologia era amplamente dominada. Foi por meio de produtos japoneses, notadamente os rádios portáteis fabricados pela Sony, que o transistor passou a ser adotado em escala mundial. Não houve muitas mudanças até então. A grande vantagem dos transistores em relação às válvulas foi demonstrada em 1958, quando Jack Kilby, da Texas Instruments, desenvolveu o primeiro circuito integrado, consistindo de um transistor, três resistores e um capacitor, implementando um oscilador simples. A partir daí, via-se a possibilidade de criação de circuitos mais complexos, utilizando integração de componentes. Isto marcou uma transição na história dos transistores, que deixaram de ser vistos como substitutos das válvulas e passaram a ser encarados como dispositivos que possibilitam a criação de circuitos complexos, integrados. O primeiro transístor era muito grande, mas não demorou muito para que esse modelo inicial fosse aperfeiçoado. Durante a década de 1950, o transístor foi aperfeiçoado e passou a gradualmente dominar a indústria, substituindo rapidamente as problemáticas válvulas. Os modelos foram diminuindo de tamanho, caindo de preço e tornando-se mais rápidos. Alguns transístores da época podiam operar a até 100 MHz. Claro que essa era a freqüência que podia ser alcançada por um transístor sozinho, nos computadores da época, a freqüência de operação era muito menor, já que em cada ciclo de processamento o sinal precisa passar por vários transístores. Mas, o grande salto foi a substituição do germânio pelo silício. Isso permitiu miniaturizar ainda mais os transístores e baixar seu custo de produção. Os primeiros transístores de junção comerciais (já similares aos atuais) foram produzidos a partir de 1960 pela Crystalonics, decretando o final da era das válvulas.
19
O primeiro transistor
4. 2. Funcionamento No transistor de junção bipolar ou TJB (BJT – Bipolar Junction Transistor na terminologia inglesa), o controle da corrente coletor-emissor é feito injetando corrente na base. O efeito transistor ocorre quando a junção coletor-base é polarizada reversamente e a junção base-emissor é polarizada diretamente. Uma pequena corrente de base é suficiente para estabelecer uma corrente entre os terminais de coletor-emissor. Esta corrente será tão maior quanto maior for a corrente de base, de acordo com o ganho.
4. 2. 1. Características de um transistor O fator de multiplicação da corrente na base (iB), mais conhecido por Beta do transistor ou por hfe, que é dado pela expressão iC = iB x ß • iC: corrente de coletor • iB: corrente de base • B: beta (ganho de corrente de emissor)
Configurações básicas de um transistor:
20
Existem três configurações básicas (BC, CC e EC), cada uma com suas vantagens e desvantagens. Base comum (BC)
• Baixa impedância(Z) de entrada. • Alta impedância(Z) de saída. • Não há defasagem entre o sinal de saída e o de entrada. • Amplificação de corrente igual a um. Coletor comum (CC)
• Alta impedância(Z) de entrada. • Baixa impedância(Z) de saída. • Não há defasagem entre o sinal de saída e o de entrada. • Amplificação de tensão igual a um. Emissor comum (EC)
• Média impedância(Z) de entrada. • Alta impedância(Z) de saída. • Defasagem entre o sinal de saída e o de entrada de 180°. • Pode amplificar tensão e corrente, até centenas de vezes. Os transistores possuem diversas características. Seguem alguns exemplos dos parâmetros mais comuns que poderão ser consultadas nos datasheets dos fabricantes: • Tipo: é o nome do transistor. • Pol: polarização; negativa quer dizer NPN e positiva significa PNP. • VCEO: tensão entre coletor e emissor com a base aberta. • VCER: tensão entre coletor e emissor com resistor no emissor. • IC: corrente máxima do coletor. • PTOT: é a máxima potência que o transistor pode dissipar
21
• Hfe: ganho (beta). • Ft: freqüência máxima. • Encapsulamento: a maneira como o fabricante encapsulou o transistor nos fornece a identificação dos terminais. Existem também outros tipos de transistores, notadamente os de efeito de campo (transistores FET, de Field Effect Transistor); neste caso, o controle da corrente é feito por tensão aplicada à porta.
4. 3. Fabricação
Símbolos dos transistores bipolares Os materiais utilizados na fabricação do transistor são principalmente o Silício (Si), o Germânio (Ge), o Gálio (Ga) e alguns óxidos. Na natureza, o silício é um material isolante elétrico, devido à conformação das ligações eletrônicas de seus átomos, gerando uma rede eletrônica altamente estável. Atualmente, o transistor de germânio não é mais usado, tendo sido substituído pelo de silício, que possui características muito melhores. O silício é purificado e passa por um processo que forma uma estrutura cristalina em seus átomos. O material é cortado em finos discos, que a seguir vão para um processo chamado de dopagem, onde são introduzidas quantidades rigorosamente controladas de materiais selecionados (conhecidos como impurezas) que transformam a estrutura eletrônica, introduzindo-se entre as ligações dos átomos de silício. O Silício realiza ligações covalentes de quatro elétrons. Quando adicionamos uma impureza com 3 elétrons na última camada, faltará um elétron na ligação covalente, formando os buracos e caracterizando a pastilha como pastilha P. Quando adicionamos uma impureza com 5 elétrons na última camada, vai sobrar um elétron na ligação covalente com o silício. Esses elétrons livres têm pouca interação com seu átomo, então qualquer energia fornecida o faz sair, sendo assim um elétron livre (assim se forma a pastilha N, que tem esse nome por ter maior número de elétrons livres). A pastilha P tem menos elétrons livres e mais "buracos" e a Pastilha N tem mais elétrons livres que buracos. Não podemos dizer que a pastilha P é positiva nem que a pastilha N é negativa, porque a soma total de elétrons é igual à soma total de prótons. Quando unimos a pastilha P e a pastilha N, os elétrons livres em excesso na pastilha N migram para a pastilha P e os buracos da pastilha P migram para a pastilha N. Deste modo a pastilha P fica negativa e a pastilha N fica positiva. Isto é o diodo.
22
O transistor é montado justapondo-se uma camada P, uma N e outra P (unindo-se dois diodos), criando-se um transistor do tipo PNP. O transistor do tipo NPN é obtido de modo similar. A camada do centro é denominada base, e as outras duas são o emissor e o coletor. No símbolo do componente, o emissor é indicado por uma seta, que aponta para dentro do transistor se o componente for PNP, ou para fora, se for NPN.
4. 4. Importância O transistor é considerado por muitos uma das maiores descobertas ou invenções da história moderna, tendo tornado possível a revolução dos computadores e equipamentos eletrônicos. A chave da importância do transistor na sociedade moderna é sua possibilidade de ser produzido em enormes quantidades usando técnicas simples, resultando preços irrisórios. É conveniente salientar que é praticamente impossível serem encontrados circuitos integrados que não possuam, internamente, centenas, milhares ou mesmo milhões de transistores, juntamente com outros componentes como resistências e condensadores. Por exemplo, o microprocessador Cell do console Playstation 3 tem aproximadamente 234 milhões de transistores, usando uma arquitetura de fabricação de 45 nanômetros, ou seja, a porta de controle de cada transistor tem apenas 45 milionésimos de um milímetro. Seu baixo custo permitiu que se transformasse num componente quase universal para tarefas não-mecânicas. Visto que um dispositivo comum, como um refrigerador, usaria um dispositivo mecânico para o controle, hoje é frequente e muito mais barato usar um microprocessador contendo alguns milhões de transistores e um programa de computador apropriado para realizar a mesma tarefa. Os transistores, hoje em dia, têm substituído quase todos os dispositivos eletromecânicos, a maioria dos sistemas de controle, e aparecem em grandes quantidades em tudo que envolva eletrônica, desde os computadores aos carros. Seu custo tem sido crucial no crescente movimento para digitalizar toda a informação. Com os computadores transistorizados a oferecer a habilidade de encontrar e ordenar rapidamente informações digitais, mais e mais esforços foram postos em tornar toda a informação digital. Hoje, quase todos os meios na sociedade moderna são fornecidos em formato digital, convertidos e apresentados por computadores. Formas analógicas comuns de informação, tais como a televisão ou os jornais, gastam a maioria do seu tempo com informação digital, sendo convertida no formato tradicional apenas numa pequena fração de tempo.
5. Engenharia de Software Engenharia de software denomina o planejamento, a estruturação, a criação e o aperfeiçoamento e manutenção de software com custo e prazo estimados, essa disciplina que aborda a construção de software complexo - com muitas partes interconectadas e diferentes versões - por uma equipe de analistas, projetistas, programadores, gerentes, "testadores", etc. A engenharia de software tem por objetivos a aplicação de teoria, modelos, formalismos e técnicas e ferramentas da ciência da computação e áreas afins para a produção (ou desenvolvimento) sistemática de software.
23
Associado ao desenvolvimento é preciso também aplicar métodos, técnicas e ferramentas para o gerenciamento do processo de produção. Isto envolve planejamento de custos e prazos, montagem da equipe e garantia de qualidade do produto e do processo. Finalmente, a engenharia de software visa a produção da documentação formal do produto, do processo, dos critérios qualidade e dos manuais de usuários finais.
6. Linguagem C A linguagem C é uma linguagem de alto nível, genérica. Foi desenvolvida por programadores para programadores tendo como meta características de flexibilidade e portabilidade. C é uma linguagem de programação compilada1 de propósito geral, estruturada2 , imperativa3, procedural3, de alto nível, padronizada pela ISO, criada em 1972, por Dennis Ritchie, no AT&T Bell Labs, essa linguagem nasceu juntamente com o advento da teoria de linguagem estruturada e do computador pessoal. Assim tornou-se rapidamente uma linguagem “popular” entre os programadores. O C foi usado para desenvolver o sistema operacional UNIX, e hoje esta sendo usada para desenvolver novas linguagens, entre elas a linguagem C++ e Java.
6. 1. História O desenvolvimento inicial de C ocorreu no AT&T Bell Labs entre 1969 e 1973. Não se sabe se o nome "C" foi dado à linguagem porque muitas de suas características derivaram da linguagem B e C é a letra conseguinte no alfabeto, ou porque "C" é a segunda letra do nome da linguagem BCPL, da qual derivou-se a linguagem B. C foi originalmente desenvolvido para a implementação do sistema Unix (originalmente escrito em PDP-7 Assembly, por Dennis Ritchie e Ken Thompson). Em 1973, com a adição do tipo struct, C tornou-se poderoso o bastante para a maioria das partes do núcleo do Unix, serem reescritas em C. Este foi um dos primeiros sistemas que foram implementados em uma linguagem que não o Assembly, sendo exemplos anteriores os sistemas: Multics (escrito em PL/I) e TRIPOS (escrito em BCPL). Segundo Ritchie, o período mais criativo ocorreu em 1972.
6. 2. Características do C C é uma linguagem para implementação de sistemas, que tem acesso de baixo nível à memória e baixos requerimentos do hardware. Também foi desenvolvido para ser uma linguagem de alto nível, para maior reaproveitamento do código. C foi útil para muitas aplicações que foram codificadas originalmente em Assembly. A linguagem C foi criada com o objectivo principal em mente: facilitar a criação de programas extensos com menos erros, recorrendo ao paradigma da programação procedural, mas sobrecarregando menos o autor do compilador, cujo trabalho complica-se ao ter de realizar as características complexas da linguagem. Entre as principais características do C, podemos citar: • O C é uma linguagem de alto nível com uma sintaxe bastante estruturada e flexível tornando sua programação bastante simplificada.
24
• Programas em C são compilados, gerando programas executáveis. • O C compartilha recursos tanto de alto quanto de baixo nível, pois permite acesso e programação direta do microprocessador. Com isto, rotinas cuja dependência do tempo é crítica, podem ser facilmente implementadas usando instruções em Assembly. Por esta razão o C é a linguagem preferida dos programadores de aplicativos. • O C é uma linguagem estruturalmente simples e de grande portabilidade. O compilador C gera códigos mais enxutos e velozes do que muitas outras linguagens. • Embora estruturalmente simples (poucas funções intrínsecas) o C não perde funcionalidade pois permite a inclusão de uma farta quantidade de rotinas do usuário. Os fabricantes de compiladores fornecem uma ampla variedade de rotinas pré-compiladas em bibliotecas. C tem como ponto forte, a sua eficiência, e é a linguagem de programação preferida para o desenvolvimento de sistemas e softwares de base, apesar de também ser usada para desenvolver programas de computador . É também muito usada no ensino de ciência da computação, mesmo não tendo sido projetada para estudantes e apresentando algumas dificuldades no seu uso. Outra característica importante de C, é sua proximidade do código de máquina, que permite que um projetista seja capaz de fazer algumas previsões de como o software irá se comportar, ao ser executado.
6. 3. TIPOS DE DADOS C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem ALGOL, tais como Pascal. Possui tipos para números inteiros de vários tamanhos com e sem sinal, números de ponto flutuante, caracteres e estruturas (structs). C usa extensivamente ponteiros, um tipo muito simples de referência que guarda o endereço de memória da variável. O ponteiro pode ser desreferenciado, uma operação que busca o objecto que se encontra na morada da memória que o ponteiro possui, morada essa que pode ser manipulada através de aritmética de ponteiros. Durante o tempo de execução, o ponteiro é simplesmente uma morada de máquina tais como aquelas manipuladas em Assembly, mas em tempo de compilação possui um tipo complexo que indica o tipo do objecto para onde ele aponta, permitindo que se verifique o tipo de expressões, incluindo ponteiros. Os ponteiros são usados extensivamente em C. O tipo linha de texto de C é simplesmente um ponteiro para um vetor de caracteres e alocação dinâmica de memória, descrita abaixo, é efectuada através de ponteiros. Os ponteiros em C possuem um valor reservado especial, NULL, que indica que não estão a apontar para uma morada. O uso desse valor como morada é muito útil na construção de várias estruturas de dados, mas causa comportamento não-definido (possivelmente uma falha de sistema) ao ser desreferenciado. Um ponteiro que possui o valor NULL é chamado ponteiro nulo. Os ponteiros são declarados (e desreferenciados) com um * (asterisco), portanto o tipo int* denota um ponteiro para número(s) inteiro(s). A linguagem C também fornece um tipo especial de ponteiros, o void*, que se traduz num ponteiro que aponta para um objecto de tipo desconhecido.
25
A linguagem C também tem apoio a nível de linguagem para vetores estáticas (de dimensão fixa) de tipos. As disposições de tipos podem parecer ter mais que uma dimensão apesar de serem tecnicamente disposições de disposições de tipos. Em memória, tais estruturas são posicionadas com as linhas uma depois da outra (a alternativa seria armazenar os dados em colunas, usado em outras linguagens). O acesso a disposições de tipos é feito através de ponteiros e aritmética de ponteiros; o nome da disposição é tratado como se fosse um ponteiro que aponta para o início da disposição. Em certas aplicações não é razoável usarem-se disposições de tipos de dimensão fixa e por isso a alocação dinâmica de memória pode ser usada para criar disposições de tipos de dimensão variável. Como a linguagem C é regularmente usada em programação de baixo-nível de sistemas, há casos em que é necessário tratar um número inteiro como sendo um ponteiro, um número de ponto flutuante como sendo um número inteiro ou um tipo de ponteiro como sendo outro. Para estes casos, a linguagem C fornece a capacidade de "moldagem" (também denominado "conversão de tipo" ou casting), uma operação que, caso seja possível, força a conversão de um objecto de um tipo para outro. Apesar de ser por vezes necessário, o uso de conversões de tipo sacrifica alguma segurança oferecida pelo sistema de tipos. int
O tipo de dado int (inteiro) serve para armazenar valores numéricos inteiros. Existem vários tipos de inteiros, cada um de um tamanho diferente (dependendo do sistema operacional e/ou arquitetura do processador): • •
• •
int,
pode possuir 16 bits, 32 bits ou 64 bits short int, deve possuir tamanho de no mínimo 16 bits e não pode ser maior que int long int, deve possuir tamanho mínimo de 32 bits long long int, deve possuir tamanho mínimo de 64 bits
Todos estes tipos de inteiros podem ainda ser declarados precedidos da cláusula unsigned , o que faz com que só suporte números positivos. Isto faz com que, com o mesmo tamanho, uma variável suporte mais números positivos do que um signed (todos os inteiros são signed por omissão). char
O tipo char ocupa 1 byte, e serve para armazenar caracteres ou inteiros. Isso significa que o programa reserva um espaço de 8 bits na memória RAM ou em registradores do processador para armazenar um valor (char de tamanho maior que 8 bits é permitido pela linguagem, mas os casos são raros). Com vetores do tipo char é possível criar cadeias de caracteres (strings). float
O tipo de dado float serve para armazenar números de ponto flutuante, ou seja, com casas decimais. O padrão mais utilizado nos últimos 10 anos é o IEEE 754-1985. double
26
O tipo de dado double serve para armazenar números de ponto flutuante de dupla precisão, normalmente tem o dobro do tamanho do float e portanto o dobro da capacidade. O padrão mais adotado também é o IEEE 754-1985. struct
Em C podem ser usadas estruturas (chamados de registos em outras linguagens de programação). As estruturas são grupos de variáveis organizadas arbitráriamente pelo programador. Uma estrutura pode criar um novo tipo de variável caso typedef seja usado em sua declaração.
6. 4. MATEMÁTICA O seguinte código realiza seis operações matemáticas, adição, subtração, multiplicação, divisão, exponenciação e radiciação, e em seguida envia os seus respectivos resultados para a saída padrão (normalmente o console). #include // necessária para pow() e sqrt() #include // necessária para printf() e getchar() int main() { int a = 2, b = 3; printf("%d + printf("%d printf("%d x printf("%d / printf("%d expoente) printf("raiz
%d = %d\n", a, %d = %d\n", a, %d = %d\n", a, %d = %0.1f\n", elevado a %d
b, b, b, a, =
a + b); a - b); a * b); b, (float) a / b); // resultado fracionário %0.1f\n", a, b, pow(a, b)); // pow(base,
quadrada de %d = %0.1f\n", a, sqrt(a));
getchar(); return 0; }
6. 5. ESTRUTURAS DE DADOS No exemplo seguinte, é criada uma estrutura composta por 3 elementos de tipos diferentes. Após ser declarada uma variável "x" do tipo struct "y", onde "y" é o nome da estrutura, para se acessar os elementos usa-se a seguinte sintaxe: x.elemento. #include struct Pessoa { char nome[64]; // vetor de 64 chars para o nome unsigned short int idade; char rg[13]; }; int main() {
27 struct Pessoa exemplo = {"Fulano", 16, "00.000.000-00"}; // declaração da variável "exemplo" printf("Nome: %s\n", exemplo.nome); printf("Idade: %hu\n", exemplo.idade); printf("RG: %s\n", exemplo.rg); getchar(); return 0; }
Ou, equivalente: #include typedef struct Pessoa { char nome[64]; // vetor de 64 chars para o nome unsigned short int idade; char rg[13]; } Pessoa; int main() { Pessoa exemplo = {"Fulano", 16, "00.000.000-00"}; // declaração da variável "exemplo" printf("Nome: %s\n", exemplo.nome); printf("Idade: %hu\n", exemplo.idade); printf("RG: %s\n", exemplo.rg); getchar(); return 0; }
6. 6. Ferramentas de programação • • • •
Bloodshed Dev-C++ Code::Blocks GNU Compiler Collection Make Significados: 1 - Linguagem compilada é uma linguagem de programação, onde o código fonte nessa linguagem é executado diretamente pelo sistema operacional ou pelo processador, após ser traduzido, através de um processo chamado compilação, usando um programa de computador chamado compilador, para uma linguagem de baixo nível, como linguagem de montagem ou código de máquina. 2 - Programação estruturada é uma forma de programação de computadores que preconiza que todos os programas possíveis podem ser reduzidos a apenas três estruturas: sequência, decisão e interação,a Programação estruturada orienta os programadores para a criação de estruturas simples em seus programas, usando as subrotinas e as funções.
28 3 - Programação imperativa (ou programação procedural ) é um paradigma de programação que descreve a computação como ações (comandos) que mudam o estado (variáveis) de um programa. Muito parecido com o comportamento imperativo das linguagens naturais que expressam ordens, programas imperativos são uma sequência de comandos para o computador executar.
7. Linguagem C++ O C++ é uma linguagem de programação multi-paradigma e de uso geral. A linguagem é considerada de médio nível, pois combina características de linguagens de alto e baixo níveis. Desde os anos 1990 é uma das linguagens comerciais mais populares, sendo bastante usada também na academia por seu grande desempenho e base de utilizadores. Bjarne Stroustrup desenvolveu o C++ (originalmente com o nome C with Classes, C com classes, em português) em 1983 no Bell Labs como um adicional à linguagem C. Novas características foram adicionadas com o tempo, como funções virtuais, sobrecarga de operadores, herança múltipla, gabaritos e tratamento de exceções. Após a padronização ISO realizada em 1998 e a posterior revisão realizada em 2003, uma nova versão do padrão da linguagem está em desenvolvimento. Conhecida informalmente como C++0x, seu lançamento está previsto para 2011.
7. 1. História O C++ foi inicialmente desenvolvido por Bjarne Stroustrup dos Bell Labs, durante a década de 1980 com o objetivo de implementar uma versão distribuída do núcleo Unix. Como o Unix era escrito em C, teve que ser mantido a compatibilidade, ainda que adicionando novos recursos. Alguns dos desafios incluíam simular a infraestrutura da comunicação entre processos num sistema distribuído ou de memória compartilhada e escrever drivers para tal sistema. Stroustrup percebeu que a linguagem Simula possuía características bastante úteis para o desenvolvimento de software, mas que era muito lenta para uso prático. Por outro lado, a linguagem BCPL era rápida, mas possuía demasiado baixo nível, dificultando sua utilização no desenvolvimento de aplicações. A partir de sua experiência de doutorado, começou a acrescentar elementos do Simula no C. O C foi escolhido como base de desenvolvimento da nova linguagem pois possuía uma proposta de uso genérico, era rápido e também portável para diversas plataformas. Algumas outras linguagens que também serviram de inspiração para o cientista da computação foram ALGOL 68, Ada, CLU e ML. Ainda em 1983 o nome da linguagem foi alterado de C with Classes para C++. Antes implementada usando um pré-processador, a linguagem passou a exigir um compilador próprio, escrito pelo próprio Stroustrup.[1] Novas características foram adicionadas, como funções virtuais,[1] sobrecarga de operadores e funções,[1] referências, constantes, gerenciamento manual de memória, melhorias na verificação de tipo de dado e estilo de comentário de código de uma linha (//). Em 1985 foi lançada a primeira edição do livro The C++ Programming Language, contendo referências para a utilização da linguagem, já que ainda não era uma norma oficial. A primeira versão comercial foi lançada em outubro do mesmo ano.[4] Em 1989 a segunda versão foi lançada, contendo novas características como herança múltipla, classes abstratas, métodos estáticos, métodos constantes e membros protegidos, incrementando o suporte a orientação a objeto. Em 1990 foi lançado o livro The Annotated C++ Reference Manual , que tornou-se base para o futuro
29
padrão. Outras adições na linguagem incluem gabaritos, tratamento de exceções,espaço de nomes, conversão segura de tipo de dado e o tipo booleano. Assim como a linguagem, sua biblioteca padrão também sofreu melhorias ao longo do tempo. Sua primeira adição foi a biblioteca de E/S, e posteriormente a Standard Template Library (STL); ambas tornaram-se algumas das principais funcionalidades que distanciaram a linguagem em relação a C. Criada primordialmente na HP por Alexander Stepanov[5] no início da década de 1990 para explorar os potenciais da programação genérica, a STL foi apresentada a um comitê unificado ANSI e ISO em 1993 à convite de Andrew Koenig. Após uma proposta formal na reunião do ano seguinte, a biblioteca recebe o aval do comitê. Depois de anos de trabalho, o mesmo comitê ANSI/ISO padronizou o C++ em 1998 ( ISO/IEC 14882:1998). Após alguns anos foram reportados defeitos e imprecisões no documento, e uma correção foi lançada em 2003.[6] Por muito tempo, o C++ foi encarado como um superconjunto do C.[nota 1] Entretanto, em 1999 o novo padrão ISO para a linguagem C tornou as duas linguagens ainda mais diferentes entre si. Devido a essas incompatibilidades, muitas empresas que desenvolvem compiladores não oferecem suporte à versão mais recente da linguagem C. Pode-se dizer que C++ foi a única linguagem entre tantas outras que obteve sucesso como uma sucessora à linguagem C, inclusive servindo de inspiração para outras linguagens comoJava, a IDL de CORBA e C♯.
7. 1. 1. ETIMOLOGIA Durante sua fase inicial de desenvolvimento, a linguagem era chamada "novo C", "C84" ou ainda "C com classes".[1] O termo "C++" é creditado a Rick Mascitti,[7] e foi utilizado pela primeira vez em dezembro de 1983. Ele é uma referência ao operador de incremento ++, significando um acréscimo (uma evolução) à linguagem C. Em tom humorado, desenvolvedores software e especialistas em informática no início da década de 1990 costumavam relacionar o ++ do nome à grande insistência dos programadores em utilizar o C++ da mesma forma que a linguagem C, não usufruindo das novas facilidades que a linguagem poderia fornecer. Assim como o ++ estava sendo aplicado de maneira pós-fixa à letra C , a linguagem C++ era uma evolução do C pós-fixada, que só tornar-se-ia realidade em algum futuro remoto, não naquele momento.
7. 1. 2. TRABALHOS FUTUROS A linguagem continua evoluindo de forma a fornecer novas funcionalidades. O grupo de desenvolvimento Boost.org trabalha para evoluir a biblioteca padrão, informando o comitê oficial da linguagem quais facilidades possuem maior retorno positivo dos usuários, seja por qualidade ou por utilidade, e quais ainda devem ser desenvolvidas. Tudo indica que o C++ continuará com sua natureza multiparadigma. Por exemplo, o trabalho da Boost.org dedica-se a acrescentar as qualidades da programação funcional e genérica. O padrão C++ não define a implementação para a definição de nomes e tratamento de exceções, entre outras facilidades específicas, o que frequentemente torna incompatíveis códigos objeto produzidos por diferentes compiladores. Apesar
30
disso, existem padrões periféricos específicos para certas plataformas ou sistemas operacionais para padronizar compiladores dessas plataformas, como por exemplo o C++ ABI. Atualmente o comitê de padronização do C++ está trabalhando para estender a linguagem em uma nova especificação, conhecida informalmente por C++0x.
7. 2. Características 7. 2. 1. Filosofia No livro In The Design and Evolution of C++ (1994), Bjarne Stroustrup descreve algumas regras que ele utiliza para desenvolver a linguagem, como exemplificado abaixo: • C++ é desenvolvido para ser uma linguagem tipada estaticamente e de propósito geral que é tão eficiente e portátil quanto o C. • C++ é desenvolvido para suportar múltiplos paradigmas. • C++ é desenvolvido para fornecer ao programador escolhas, mesmo que seja possível ao programador escolher a opção errada. • C++ é desenvolvido para ser o mais compatível com C possível, fornecendo transições simples para código C. • C++ evita fornecer facilidades que são específicas a certas plataformas ou a certos grupos de desenvolvedores. • C++ não exige overhead para facilidades que não são utilizadas. • C++ é desenvolvido para ser utilizado mesmo sem um ambiente de desenvolvimento sofisticado. Stanley B. Lippman documenta em seu livro Inside the C++ Object Model (1996)[10] como compiladores convertem código de programas C++ em mapeamentos de memória. Lippman trabalhou implementando e mantendo o C-front, a implementação original do C++ nos Bell Labs. Stroustrup sempre desejou que o C++ fosse mantido como uma linguagem de especificação pequena, apesar de pressões externas para adições de novas funcionalidades na especificação da própria linguagem ao invés da codificação de novas bibliotecas para a biblioteca padrão. Brian Kernighan notou que enquanto em C existe geralmente uma maneira de resolver problemas, em C+ + existem várias. Na maioria das linguagens de programação, um padrão ou um conjunto bastante restrito de padrões de projeto de software é escolhido para o desenvolvimento. Entretanto, isso não acontece em C++, pois a escolha é delegada ao desenvolvedor. É um conceito que prega que não existe paradigma de programação ou padrão de desenvolvimento que resolva todos os problemas, por isso a pluralidade e generalidade de aplicações para a linguagem. Tal filosofia assusta iniciantes e professores, que sentem que a linguagem deveria ser de fácil aprendizado, algo que o C++ não é.
7. 2. 2. Biblioteca padrão
31
A biblioteca padrão do C++ incorpora a biblioteca padrão do C com algumas pequenas modificações para trabalhar melhor com as novas funcionalidades criadas pela linguagem. Outra grande parte da biblioteca é composta pela biblioteca padrão de gabaritos (STL). Ela fornece ferramentas úteis como containers (vetores, listas, entre outros), algoritmos (filtragem de elementos de container, busca, ordenação, entre outros) e iteradores (ponteiros inteligentes genéricos para acessar tais containers e interligá-los aos algoritmos). Usando gabaritos é possível escrever algoritmos genéricos que funcionam para qualquer container ou sequência definida por iteradores. Tendo em vista que um iterador nada mais é que um ponteiro encapsulado, é possível também utilizar os algoritmos genéricos em vetores C, utilizando-se ponteiros comuns para tal. Como em C, os módulos da biblioteca são acessadas utilizando a diretiva #include; ao todo são fornecidos 69 cabeçalhos-padrão, dos quais 19 estão em depreciação. Devido ao fato da biblioteca padrão ter sido desenvolvida por especialistas e de já ter sido amplamente utilizada comercialmente e academicamente, é recomendado utilizar seus componentes ao invés de componentes próprios. Por exemplo, utilizar std::vector e std::string ao invés de declarar vetores herdados do C não somente torna o desenvolvimento mais simples, como também traz mais segurança e escalabilidade para o sistema.
7. 2. 3. Operadores Os operadores em C++ são um conjunto de todos os operadores do C mais novas adições à linguagem. Um grupo de novos operadores do C++ são os relativos à conversão de tipo de dado, e consistem em const_cast, static_cast, dynamic_cast e reinterpret_cast. Eles são uma evolução a conversão de dados utilizada em C, que limitava-se a oferecer um método para conversão tal qual static_cast. dynamic_cast refere-se diretamente ao suporte de herança e polimorfismo oferecido pela linguagem, e está relacionado a outro novo operador, typeid, que retorna informações sobre o tipo de dado derivado pelo operando. Ambos os operadores requerem a habilitação de RTTI para funcionar. Outro grupo de novos operadores são os relativos à alocação de memória, e consistem em new e delete. Assemelham-se às funções malloc e free respectivamente, que estão presentes na biblioteca padrão do C. Outro novo operador é o de resolução de âmbito, ::, e que refere-se diretamente ao suporte de espaço de nomes e orientação a objeto oferecido pela linguagem. Com ele é possível declarar e acessar espaços de nomes, e também declarar classes e acessar objetos. O C++ define que alguns dos operadores podem ser sobrecarregados, o que permite, assim como na sobrecarga de funções, que diferentes tipos de dados sejam passados para um operador de forma a produzir diferentes resultados.
7. 2. 4. Objetos O C++ introduziu alguns conceitos de orientação a objetos ao C, como exemplificado pelas classes, que apresentam quatro características comumente presentes em linguagens de programação orientadas a objeto: abstração, encapsulamento, herança e polimorfismo. Cada vez que uma classe é instanciada é criado um objeto na memória, que é basicamente um conjunto de atributos e operações reunidos.
7. 2. 5. Encapsulamento
32
O encapsulamento permite que os atributos de classes possam ser declarados como públicos, privados ou protegidos. Um atributo público (o menos restrito) pode ser acessado a partir de qualquer método que tenha acesso ao objeto. Um atributo privado (o mais restrito) só pode ser acessado por métodos da própria classe e por métodos explicitamente declarados como permitidos para tal (utilizando a palavra reservada friend). Atributos protegidos só podem ser acessados por métodos da mesma classe, por métodos de classes herdadas e por métodos explicitamente declarados (utilizando a palavra reservada friend). É considerado como uma boa prática de programação restringir ao máximo o acesso aos atributos, de forma a isolar detalhes de implementação de uma classe, tornando públicas somente as funções membro que realizam uma interface mínima da classe com outros componentes. O isolamento dos dados proposto pelo encapsulamento não é infalível, podendo ser contornado ao realizar operações de baixo nível em objetos. Dessa maneira, um atributo privado pode ser acessado e modificado a partir de um ponteiro para seu endereço de memória sem problemas, ainda que isso seja considerado uma má prática de programação.
7. 2. 6. Polimorfismo Polimorfismo é a capacidade de usar um operador ou uma função de diferentes maneiras, permitir fornecer diferentes significados de acordo com o contexto. Uma vez que um aplicativo é escrito utilizando o conceito de polimorfismo, pode ser facilmente estendido, oferecendo novos objetos que estejam em conformidade com a interface original. Não é necessário recompilar programas originais, adicionando novos tipos. Apenas a re-vinculação é necessária para expor as novas mudanças juntamente com a antiga aplicação. Ele auxilia na reutilização de código e contribui para a criação de aplicações robustas. C++ suporta diversos tipos de polimorfismos, sejam estáticos (resolvidos em tempo de compilação de código) ou dinâmicos (resolvidos em tempo de execução de código).
7. 2. 6. 1. Estático A sobrecarga de funções é um polimorfismo estático que permite que um programa possa declarar várias funções com o mesmo nome, diferenciando entre si pela quantidade de parâmetros apresentados e por seus respectivos tipos de dado. Assim, o mesmo nome de função pode referir-se a diferentes funções dependendo do contexto em que ela é usada. O tipo retornado pela função não é utilizado para distinguir funções sobrecarregadas. A sobrecarga de operadores também é um polimorfismo estático que permite que a definição de certos operadores resultem em uma chamada de função que depende dos tipos de dado dos operadores sendo utilizados. O C++ também suporta argumentos padrão para os parametros das funções, o que permite omitir tal parâmetro na invocação da função. Quando uma função é chamada com menos argumentos que o esperado e os argumentos explícitos são compatíveis com os parâmetros da esquerda à direita, os últimos parâmetros são atribuídos de acordo com o argumento padrão. Semanticamente parecida com a sobrecarga de funções, essa técnica permite simplificar situações em que uma função é declarada somente para invocar uma sobrecarga dela própria com algum parâmetro especificado. O C++ implementa polimorfismo paramétrico através de gabaritos, que fazem o compilador gere uma instância separada da classe ou função usada como gabarito para cada permutação de
33
parâmetros de tipo usado com ele, o que pode levar a dificultar a depuração de código. Um benefício que os gabaritos C++ têm sobre Java e C♯ é permitir a metaprogramação por gabaritos, uma forma de pré-avaliação de parte do código em tempo de compilação ao invés de tempo de execução. Os gabaritos em C++ fornecem um mecanismo sofisticado para a criação de código genérico polimórfico. Em particular, por meio da técnica Curiously Recurring Template Pattern é possível implementar uma forma de polimorfismo estático que imita a sintaxe para substituir as funções virtuais. Uma vez que gabaritos são sensíveis aos tipos de dados e também são Turing completos, também podem ser usados para permitir que o compilador resolva condicionais recursivas e gerar programas substanciais através de metaprogramação por gabaritos.
7. 2. 6. 2. Dinâmico O polimorfismo por herança é um exemplo de polimorfismo dinâmico no qual ponteiros de uma classe base podem referenciar objetos de classes derivadas, o que permite que uma chamada de função virtual seja resolvida em tempo de execução de código. Ponteiros e referências de uma classe base podem referenciar objetos de qualquer classe derivada de si, o que permite que arranjos e outros containers de um dado tipo possam armazenar ponteiros de diversos tipos de dados, o que não poderia ser feito de outra maneira em C++. Como não é possível descobrir se a conversão do tipo base para o tipo derivado é segura em tempo de compilação, a verificação deve ser feita durante a execução do código. Para isso é fornecido o operador dynamic_cast, que permite tentar a conversão segura de uma classe mais abstrata (classe base) para outra mais específica (classe derivada). Para sua utilização a linguagem dispõe do RTTI, uma técnica para manter em memória informações sobre o tipo de dado de objetos. Caso a conversão não seja possível uma exceção específica é lançada. Normalmente, quando uma função em uma classe derivada substitui uma função em uma classe base, a função chamada é determinada pelo tipo do objeto. Uma dada função é sobrescrita quando não existe nenhuma diferença no número ou tipo de parâmetros, entre duas ou mais definições para aquela função. Assim, em tempo de compilação pode não ser possível determinar o tipo do objeto e, portanto, a função a ser chamada, tendo apenas um ponteiro de classe base, a decisão é adiada até o tempo de execução. Isso é chamado de despache dinâmico. Funções ou métodos virtuais permitem a implementação mais específica da função a ser chamada, de acordo com o tipo do objeto em tempo real. Em C++, isto é geralmente feito usando tabelas de funções virtuais. Se o tipo de objeto é conhecido, isso pode ser contornado, antecipando o nome da classe antes da chamada de função, mas, em geral chamadas de funções virtuais são resolvidas em tempo de execução. Além das funções de membro padrão, sobrecargas do operador e destrutores podem ser virtuais. A regra geral é que, se todas as funções da classe são virtuais, o destrutor também deve ser assim. Como o tipo de criação de um objeto é conhecido em tempo de compilação, construtores de cópia e de extensão, não pode ser virtuais. No entanto pode acontecer de uma cópia de um objeto ser criado quando um ponteiro para um objeto derivado é passado como um ponteiro para um objeto base. Nesse caso, uma solução comum é criar um clone() (ou similar) e declarar que a função como virtual. O método clone() cria e retorna uma cópia da classe quando chamado.
34
Um membro da função também pode ser declarado puramente virtual, acrescentando = 0 após o parêntese de fechamento e antes do ponto e vírgula. Os objetos não podem ser criados de uma classe com uma função virtual pura e são chamados de tipos de dados abstratos. Esses tipos de dados abstratos só podem ser derivados. Qualquer classe derivada herda a função virtual pura deve apresentar uma definição não-pura (e todas as outras funções virtuais puras), antes de objetos da classe derivada poderem ser criados.
7. 2. 7. Tratamento de exceções O tratamento de exceção é um mecanismo desenvolvido para lidar com a ocorrência de algumas condições (chamadas exceções) que alteram o funcionamento normal do fluxo de um programa de computador. O C++ suporta tal tratamento, de forma que o estado atual de um programa após uma exceção é alterado automaticamente para outro estado pré-definido para a recuperação do sistema. Para isso foram adicionadas à linguagem as palavras reservadas try e catch. A primeira especifica um bloco de código que será vigiado em relação à exceções, de forma que se uma for identificada, o fluxo de programa será desviado para um bloco especificado pela segunda palavra reservada. Para um dado bloco try podem existir diversos blocos catch, capturando exceções de diferentes tipos de dado. Alternativamente, a sintaxe catch(…) foi introduzida para especificar um bloco de tratamento de exceção independente do tipo da exceção, genérico. O conceito puro da ciência da computação para tratamento de exceções ainda inclui o bloco de instruções finally, que indica um bloco de código executado após um bloco try caso nenhuma exceção tenha sido lançada, indicando sucesso na operação. Tal abordagem não foi adicionada ao C++, sendo substituível por outras técnicas como RAII[14][16]. De qualquer forma, é possível que essa funcionalidade seja adicionada na próxima especificação da linguagem.
7. 2. 8. Espaço de nomes O C++ introduziu os espaços de nomes para a organização das bibliotecas, e sua função é agrupar um contexto para identificadores (variáveis, funções, classes, estruturas, entre outros). No contexto de sistemas operativos, o espaço de nomes poderia ser representado por diretórios. Toda a biblioteca padrão está contida no espaço de nomes std (abreviação de standard, que em inglês significa padrão). Para utilizar um espaço de nomes pode ser feita tanto uma declaração global dos espaços quanto local. Uma declaração global é normalmente inserida no início dos módulos, após a importação dos módulos externos, utilizando a palavra reservada using (como em using namespace std;, ver exemplo contextualizado em anexo). Ela também pode ser usada em um âmbito prédeterminado por um bloco de código. Uma declaração local é inserida antes de invocar o identificador envolvido, utilizando o operador de resolução de âmbito :: (como em std::cout, ver exemplo contextualizado em anexo). A declaração global é útil para reduzir a quantidade de código produzido, sub entendendo a origem dos identificadores utilizados em todo um âmbito. Apesar disso, ela deixa margem à ambiguidades, pois é possível que um mesmo identificador esteja presente em mais de um espaço de nome importado no módulo. Para eliminar esse problema devese, além de utilizar a declaração global, declarar o identificador ambíguo localmente cada vez que ele for utilizado.
7. 2. 9. Incompatibilidade com C
35
É incorreto considerar o C++ como um super conjunto de C, isto é, uma linguagem que implementa o C completamente e que adiciona novas funcionalidades. Grande parte de código C pode ser perfeitamente compilado em C++, mas existem algumas pequenas diferenças sintáticas e semânticas entre as linguagens que tornam alguns trechos de código C válidos em código C++ inválido, ou códigos que exibem comportamentos diferentes em cada linguagem. Talvez a diferença mais comum é que C permite a conversão implícita entre o tipo de dado void* para ponteiros para outros tipos, algo que o C++ não permite. Logo, o seguinte código em C é válido: int *i = malloc(sizeof(int) * 5);
/* conversão implícita de void* para int* */
Para assegurar-se que o código funcione tanto em C quanto C++ é necessário explicitar a conversão: int *i = (int *) malloc(sizeof(int) * 5); /* conversão explícita de void* para int* */ Outra questão de portabilidade entre as linguagens é o fato do C++ adicionar várias novas palavras reservadas, como new e class, que podem ser utilizadas como identificadores (por exemplo nomes de variáveis) em C, gerando incompatibilidade. Algumas outras incompatibilidades foram removidas no padrão C99, que agora suporta facilidades como comentários por //.[18] Tanto C99 quanto C++ definem o tipo de dado bool e suas respectivas constantes true e false. Apesar disso, enquanto a definição no C++ é embarcada na própria linguagem, tornando tais elementos palavras reservadas, em C tais identificadores são declarados através da biblioteca padrão stdbool.h. Algumas construções sintáticas são válidas tanto em C quanto C++, mas produzem resultado diferente. Por exemplo, o valor literal 'a' possui tipo de dado int em C e char em C++, o que significa que uma chamada sizeof('a'), que retorna a quantidade de bytes ocupada pelo identificador, pode resultar em resultados diferentes entre as duas linguagens. Na prática, esse exemplo específico não é realmente um problema já que caracteres literais são convertidos para o tipo int implicitamente pelo compilador tanto em C quanto em C++.
7. 3. Ferramentas 7. 3. 1. AMBIENTES DE DESENVOLVIMENTO Abaixo é mostrada uma lista dos principais ambientes de desenvolvimento C++, sejam eles compiladores ou ambientes de desenvolvimento integrado (IDE). Nome
Comentário
É É É Plataforma Tipo de licença compilador IDE depurador s ? ? ?
36
G++
Um componente do GCC, compilador padrão do Projecto GNU
Dev-C++
IDE livre famosa entre iniciantes. Seu compilador é o MinGW, uma versão do G++ para Windows.
U++ é um framework C++ multiplataforma, para desemvolvimento Ultimate++ rápido de aplicações, focado na produtividade de programadores. Intel C++
Produz código otimizado para processadores Intel
É o mais conhecido para a plataforma Windows, com ferramentas e tecnologias auxiliares para Microsoft desenvolvimento Visual C++ nessa plataforma (como MFC, ATL, COM, entre outras). Oferece ainda uma versão gratuita com restrições de uso[27] C++ Builder Ferramenta da Borland que oferece versões antigas gratuitas sem presença de IDE. Possui integração
Livre
Livre
Unix, Linux, Mac OS X, Windows e AmigaOS
Windows[nota 6]
Livre
Unix, Linux, Mac OS X e Windows
Proprietária
Windows e Linux
Proprietária
Windows
Proprietária
Windows e Linux
37 com Delphi IDE especializada em (mas não restrita a) desenvolvimento na plataforma Qt. Utiliza o g++ como Livre/Proprietári Qt Creator compilador e o gdb a como depurador (ou seus equivalentes para MinGW em Windows). Suporta plataformas antigas, até então sem suporte completo à biblioteca padrão
Linux, Windows e Mac OS X
Livre
DOS, Windows, OS/2 e Netware
Pode ser Comeau C++ experimentado pela Internet[28]
Proprietária
Windows, Linux e Solaris
Possui versão gratuita[no sítio oficial e também uma Turbo C++ versão paga.] É similar ao C++ Builder.
Proprietária
Windows
Livre
Windows, Linux, JVM
Livre
Linux
Open Watcom
Eclipse
Anjuta
Disponível para C++ através da extensão CDT. Suporta muitas capacidades avançadas como gerenciamento de projetos e um poderoso editor de código fonte. Uma nova versão do Anjuta (Anjuta 2.*) que integra o Glade está em desenvolvimento ativo.
38 Ambiente aberto e multi-plataforma, em sua versão para Windows utiliza o compilador MinGW, apesar de também Code::Blocks suportar outros compiladores como o Visual C++, Digital Mars, Borland C++ 5.5 e Open Watcom.
Livre
Windows, Linux, Mac OS X
Proprietária
Windows, DOS
Codelite
Livre
Windows, Linux, Mac OS X
Geany
Livre
Windows, Linux
GNAT Utiliza o compilador Programming GCC Studio
Livre
Windows, Linux, Solaris
Utiliza o compilador GCC
Livre
Windows, Linux
[32]
Digital Mars
KDevelop
7. 3. 2. APLICATIVOS DESENVOLVIDOS EM C++ Abaixo segue uma lista de exemplos de aplicativos parcial ou totalmente escritos em C++, de acordo com Bjarne Stroustrup, que não garante sua precisão e veracidade, ainda que seja responsável por sua publicação. • • • • • • • • • •
Adobe Acrobat Adobe Illustrator Adobe Photoshop Amazon BeOS Blender Common Desktop Environment Doom III (motor de jogo) eMule Motores de busca Google, em especial Googlebot[34]
• •
• •
•
• • •
Maya Mars Pathfinder, Opportunity e outras sondas da NASA Microsoft Office Microsoft Visual Studio (Visual Basic, Visual FoxPro, Visual C++) Microsoft Windows (diversas versões) Mozilla Firefox Mozilla Thunderbird MySQL
39 • • • • •
Série Half-Life Internet Explorer iPod (GUI) KDE (Qt) Lunar Magic
• • • • • •
•
Mac OS X
•
•
Máquina virtual Java OpenOffice.org e BrOffice.org Outlook Express PCSX2 (Emulador de Playstation 2) SETI@home Symbian OS Winamp Tibia
8. Linguagem C# C# (CSharp) é uma linguagem de programação orientada a objetos criada pela Microsoft, faz parte da sua plataforma .Net. A sua sintaxe orientada a objetos foi baseada no C++ mas inclui muitas influências de outras linguagens de programação, como Object Pascal e Java.
8. 1. História A linguagem C# foi criada junto com a arquitetura .NET. Embora existam várias outras linguagens que suportam essa tecnologia (como VB.NET, C++, J#), C# é considerada a linguagem símbolo do .NET pelas seguintes razões: • Foi criada praticamente do zero para funcionar na nova plataforma, sem preocupações de compatibilidade com código de legado. • O compilador C# foi o primeiro a ser desenvolvido. •A maior parte das classes do .NET Framework foram desenvolvidas em C#. A criação da linguagem, embora tenha sido feita por vários desenvolvedores, é atribuída principalmente a Anders_Hejlsberg, hoje um Distinguished Engineer na Microsoft. Anders Hejlsberg era desenvolvedor de compiladores na Borland, e entre suas criações mais conhecidas estão o Turbo Pascal e o Delphi.
8. 1. 1. Etimologia Muitos pensam que o nome C# viria de uma sobreposição de 4 símbolos "+" dando a impressão de "++++". Na verdade o "#" de C# refere-se ao sinal musical (sustenido), que aumenta em 1/2 tom uma nota musical. O símbolo real seria o ♯ e não o #, porém, devido a limitação de telas, fontes e alguns browsers, no momento da normalização junto a ECMA, fora especificado apenas que o nome da linguagem seria uma letra C maiúscula (U+0043) e o sinal "#" (U+0023), facilitando assim, publicações e artigos com um caracter encontrado facilmente dos layouts de teclado padrões. Desta forma, caso o nome fosse usado em português, seria "C-Sustenido" (ou "DóSustenido"), e não "C-cerquilha".
8. 2. Características
40
C# (C Sharp) é, de certa forma, a linguagem de programação que mais diretamente reflete a plataforma .NET sobre a qual todos os programas .NET executam. C# está de tal forma ligado a esta plataforma que não existe o conceito de código não-gerenciado (unmanaged code) em C#. Suas estruturas de dados primitivas são objetos que correspondem a tipos em .NET. A desalocação automática de memória por garbage colletor além de várias de suas abstrações tais como classes, interfaces, delegados e exceções são nada mais que a exposição explicita recursos do ambiente .NET. Quando comparada com C e C++, a linguagem é restrita e melhorada de várias formas incluindo: • Ponteiros e aritmética sem checagem só podem ser utilizados em uma modalidade especial chamada modo inseguro (unsafe mode). Normalmente os acessos a objetos são realizados através de referências seguras, as quais não podem ser invalidadas e normalmente as operações aritméticas são checadas contra sobrecarga (overflow). • Objetos não são liberados explicitamente, mas através de um processo de coleta de lixo (garbage collector) quando não há referências aos mesmos, previnindo assim referências inválidas. • Destrutores não existem. O equivalente mais próximo é a interface Disposable, que juntamente com a construção using block permitem que recursos alocados por um objeto sejam liberados prontamente. Também existem finalizadores, mas como em Java sua execução não é imediata. • Como no Java, não é permitida herança múltipla, mas uma classe pode implementar várias interfaces abstratas. O objetivo principal é simplificar a implementação do ambiente de execução. • C# é mais seguro com tipos que C++. As únicas conversões implícitas por default são conversões seguras, tais como ampliação de inteiros e conversões de um tipo derivado para um tipo base. Não existem conversões implícitas entre inteiros e variáveis lógicas ou enumerações. Não existem ponteiros nulos (void pointers) (apesar de referências para Object serem parecidas). E qualquer conversão implícita definida pelo usuário deve ser marcada explicitamente, diferentemente dos construtores de cópia de C++. • A sintaxe para a declaração de vetores é diferente ("int[] a = new int[5]" ao invés de "int a"). • Membros de enumeração são colocados em seu próprio espaço de nomes (namespace) • C# não possui modelos (templates), mas C# 2.0 possui genéricos (generics). • Propriedades estão disponíveis, as quais permitem que métodos sejam chamados com a mesma sintaxe de acesso a membros de dados. • Recursos de reflexão completos estão disponíveis Apesar de C# ser freqüentemente tido como similar a Java, existem uma série de diferenças importantes, tais como:
41
• Java não implementa propriedades nem sobrecarga de operadores. • Java não implementa um modo inseguro que permita a manipulação de ponteiros e aritmética sem checagem. • Java possui exceções checadas, enquanto exceções em C# são não checadas como em C++. • Java não implementa o goto como estrutura de controle, mas C# sim. • Java utiliza-se de comentários Javadoc para gerar documentação automática a partir de arquivos fonte. C# utiliza comentários baseados em XML para este propósito. • C# suporta indexadores e delegados.
8.3. Bibliotecas de códigos Ao contrário das outras linguagens de programação, nenhuma implementação de C# atualmente inclui qualquer conjunto de bibliotecas de classes ou funções. Ao invés disso, C# está muito vinculada ao framework .Net, do qual C# obtém suas classes ou funções de execução. O código é organizado em um conjunto de namespaces que agrupam as classes com funções similares. Por exemplo: System.Drawing para gráficos, System.Collections para estrutura de dados e System.Windows.Forms para o sistema Windows Form. Um nível de organização superior é fornecido pelo conceito de montador (assembly). Um montador pode ser um simples arquivo ou multiplos arquivos ligados juntos (como em al.exe) que podem conter muitos namespaces ou objetos. Programas que precisam de classes para realizar uma função em particular podem se referenciar a montadores como System.Drawing.dll e System.Windows.Forms.dll assim como a biblioteca core (conhecida como mscorlib.dll na implementação da Microsoft).
9. Linguagem Java Java é uma linguagem de programação orientada a objeto desenvolvida na década de 90 por uma equipe de programadores chefiada por James Gosling, na empresa Sun Microsystems, Inicialmente elaborada para ser a linguagem-base de projetos de software para produtos eletrônicos, Java teve seu grande boom em 1995, devido ao sucesso mundial da World Wide Web.. Diferentemente das linguagens convencionais, que são compiladas para código nativo, a linguagem Java é compilada para um bytecode que é executado por uma máquina virtual. A linguagem de programação Java é a linguagem convencional daPlataforma Java, mas não sua única linguagem.
9. 1. História O propósito inicial do desenvolvimento de Java foi para funcionar em processadores de eletrodomésticos. Os projetistas de sistemas de controle desses processadores, descontentes com linguagens convencionais de programação, como C, propuseram a criação de uma linguagem específica para uso em processadores de aparelhos domésticos, como geladeiras e torradeiras. Todo o descontentamento dos projetistas residia no fato de que programas escritos e compilados em C
42
são fortemente dependentes da plataforma para a qual foram desenvolvidos. Como o ramo de eletro-eletrônicos está em constante evolução, a cada novo liquidificador lançado no mercado com um novo processador embutido, um novo programa deveria ser escrito e compilado para funcionar no novo compilador, ou então, na melhor das hipóteses, para reaproveitar o antigo programa, no mínimo ele teria de ser re-compilado para o novo processador. No início de 1990, Naughton, Gosling e Sheridan começaram a definir as bases para o projeto de uma nova linguagem de programação, apropriada para eletrodomésticos, sem os problemas já tão conhecidos de linguagens tradicionais como C e C++. O consumidor era o centro do projeto, e o objetivo era construir um ambiente de pequeno porte e integrar esse ambiente em uma nova geração de máquinas para "pessoas comuns". A especificação da linguagem terminou em agosto de 1991, e a ela deu-se o nome de "Oak" (Carvalho). Por problemas de copyrigth (já existia uma linguagem chamada Oak) o nome foi mudado em 1995 para Java, em homenagem à ilha de Java, de onde vinha o café consumido pela equipe da Sun. Em 1992, Oak foi utilizada pela primeira vez em um projeto chamado Projeto Green, que tinha por propósito desenvolver uma nova interface de usuário para controlar os aparelhos de uma casa. Tal interface consistia em uma representação animada da casa, que era exibida em um computador manual (chamado star seven, bisavô dos palmtops de hoje), e que tinha uma tela sensível ao toque que permitia a manipulação dos eletrodomésticos. Essa interface era totalmente escrita em Oak, e evoluiu para um projeto de interface para redes de televisão pay-per-view. Contudo, o padrão proposto por esses dois projetos não vingou, e outros padrões, pelo menos em sistemas de TV pay per-view vêm tomando conta do mercado. Um personagem animado desses projetos, Duke, tornouse um dos símbolos de Java. Em meados de 1993, pode-se dizer que Oak ia "mal das pernas". Os projetos propostos não eram economicamente viáveis, e não se via um grande futuro no desenvolvimento de aparelhos que suportassem essa nova linguagem. Justamente nessa época, a World Wide Web estava em seu nascimento, trazendo um novo horizonte para a Internet. (É importante lembrar que a Internet já existia muito antes do surgimento da WWW. A WWW nada mais é que um conjunto de protocolos que permite um acesso mais amigável aos recursos disponíveis na Internet. Dentre esses protocolos, por exemplo, o mais conhecido em geral é o de transferência de hipertexto [http]). Com o lançamento do primeiro browser do mercado, o Mosaic, ocorreu à equipe de desenvolvimento da Sun que uma linguagem independente de plataforma, segura e robusta como a que estava sendo desenvolvida para eletrodomésticos caberia como uma luva para uso na Internet, uma vez que um aplicativo gerado nessa linguagem poderia rodar nos diversos tipos de computadores ligados na Internet, rodando qualquer sistema operacional, de PCs rodando OS/2 a estações RISC rodando AIX Unix, ou SparcStations rodando Solaris, os programas escritos nessa linguagem que viria a ser conhecida por Java seriam o modelo para qualquer aplicativo Web. Com o novo ânimo trazido pelo advento da WWW, a equipe da Sun desenvolveu um browser totalmente escrito em Java, tendo-o terminado no início de 1995 e denominado-o HotJava. O grande diferencial de HotJava para outros browsers da época (como o Mosaic, o Netscape Navigator e o Lynx) é que ele permitia a inserção de programas escritos em Java dentro de páginas HTML comuns. HotJava como browser foi um fiasco comercial, mas abriu os olhos dos desenvolvedores para um fato muito importante: as páginas HTML estariam fadadas a serem estáticas e sem ações embutidas em si, não houvesse uma linguagem padrão na qual fossem escritos programas que pudessem ser embutidos nas páginas Web. HotJava demonstrou que isso
43
era possível (ou seja, incluir um programa, no caso escrito em Java, em uma página HTML rodando em um browser preparado para dar suporte à execução do programa, no caso o próprio HotJava). O grande "pulo do gato" de Java veio logo a seguir, quando a Netscape anunciou que sua próxima versão do browser Navigator, iria dar suporte a aplicativos Java embutidos em documentos HTML. Em seguida, a Microsoft anunciou o mesmo para o seu Internet Explorer. E Java estourou no mundo, a Sun contabilizava inúmeros downloads de seu JDK, diversas empresas desenvolveram IDEs para a programação em Java, e vieram JavaScript, JavaBeans e ActiveX.
9. 2. Características Java é uma linguagem de alto nível, com sintaxe extremamente similar à do C++, e com diversas características herdadas de outras linguagens, como Smalltalk e Modula-3. É antes de tudo uma linguagem simples (é mesmo!), fortemente tipada, independente de arquitetura, robusta, segura, extensível, bem estruturada, distribuída, multithreaded e com garbage collection.
9. 2. 1. Simplicidade: Java, é muito parecida com C++, mas muito mais simples. Java não possui sobrecarga de operadores, structs, unions, aritmética de ponteiros, herança múltipla, arquivos .h, diretivas de pré processamento e a memória alocada dinamicamente é gerenciada pela própria linguagem, que usa algoritmos de garbage collection para desalocar regiões de memória que não estão mais em uso.
9. 2. 2. Orientação a objetos Ao contrário de C++, que é uma linguagem híbrida, Java é uma linguagem orientada a objetos que segue a linha purista iniciada por Smalltalk. Com a exceção dos tipos básicos da linguagem (int, float, etc.), a maior parte dos elementos de um programa Java são objetos. (A título de curiosidade, Smalltalk já é considerada puramente O.O. [orientada a objeto], pois absolutamente tudo em Smalltalk são objetos, não há tipos básicos em Smalltalk.) O código é organizado em classes, que podem estabelecer relacionamentos de herança simples entre si. Somente a herança simples é permitida em Java. (Há uma forma de "simular" herança múltipla em Java com o uso interfaces, que veremos em outros passos do curso).
9. 2. 3. Processamento distribuído Chamadas a funções de acesso remoto (sockets) e os protocolos Internet mais comuns (HTTP, FTP, Telnet, etc.) são suportadas em Java, de forma que a elaboração de aplicativos baseados em arquiteturas cliente-servidor é facilmente obtida.
9. 2. 4. Multithreading A maior parte dos sistemas operacionais hoje no mercado dão suporte à multitarefa, como o Windows, OS/2 e Unix, ou seja, o computador é capaz e executar diversas tarefas ao mesmo tempo. Cada um desses sistemas tem o seu tipo de multitarefa, preemptiva ou não, com ou sem multiprocessamento. Java tem o suporte a multitarefa embutido na linguagem: um programa Java
44
pode possuir mais de uma linha de execução (thread). Por exemplo, cálculos extensos, que em geral demandam muito tempo do processador, podem ser escritos em uma thread, e a parte de interface com o usuário, que depende mais dos periféricos de I/O que do processador, pode ser executada em outra thread. Programação concorrente em geral é uma tarefa difícil, mas Java fornece diversos recursos de sincronização de processos que tornam a programação mais simples.
9. 2. 5. Exceções Todo programador em geral está bastante acostumado com o computador "travando" por causa de um erro em um programa. Em C++, por exemplo, a simples tentativa de abertura de um arquivo inexistente pode obrigar ao programador a reiniciar o computador. Programas Java, contudo, não "dão pau" no computador, já que a máquina virtual Java faz uma verificação em tempo de execução quanto aos acessos de memória, abertura de arquivos e uma série de eventos que podem gerar uma "travada" em outras linguagens, mas que geram exceções em programas Java. Em geral, ao escrever programas Java utilizando-se de herança de classes predefinidas, forçase em geral ao programador escrever algumas rotinas de tratamento de exceção, um trabalho que, se de início pode parecer forçado, irá poupar o programador de bastante dor de cabeça no futuro.
9. 2. 6. Garbage collector Em Java, os programadores não necessitam preocupar-se com o gerenciamento de memória como em C++. Em C++, todo bloco de memória alocado dinamicamente (com new, malloc ou função similar) deveria ser liberado quando não fosse mais usado (com free, delete e parentes próximos). Isso acarretava diversos problemas mesmo ao programador mais experiente, que tinha que manter sempre um controle das áreas de memória alocadas para poder liberá-las em seguida. Java, ao contrário, utiliza-se de um conceito já explorado por Smalltalk, que é o de garbage collection (coleta de lixo). Sua função é a de varrer a memória de tempos em tempos, liberando automaticamente os blocos que não estão sendo utilizados. Se por um lado isso pode deixar o aplicativo um pouco mais lento, por manter uma thread paralela que dura todo o tempo de execução do programa, evita problemas como referências perdidas e avisos de falta de memória quando sabese que há megas e megas disponíveis na máquina.
9. 2. 7. Machine independent Uma das características de Java que tornou-a ideal para seu uso na elaboração de aplicativos distribuídos foi a sua independência de plataforma. Afinal, a Internet é uma grande "salada" de computadores de todos os tipos, dotados dos mais diversos sistemas operacionais e ambientes gráficos que se possa imaginar. Java consegue essa independência devido ao fato de que o compilador Java não gera instruções específicas a uma plataforma, mas sim um programa em um código intermediário, denominado bytecode, que pode ser descrito como uma linguagem de máquina destinada a um processador virtual que não existe fisicamente. Na realidade, existe. A Sun está desenvolvendo, já com alguns resultados práticos, microprocessadores cuja linguagem nativa é o Java: o picojava, microjava e ultrajava. O código Java compilado pode então ser executado por um interpretador de bytecodes, a JVM - Java Virtual Machine, que é um emulador de processador.
9. 2. 8. Polimorfismo
45
O Polimorfismo é uma característica muito importante em sistemas orientados a objetos. Termo proveniente do grego que significa "muitas formas". Através dele conseguimos realizar várias tarefas. Existem 4 tipos de polimorfismo divididos em 2 categorias (todos eles são implementados em Java), são descritos a seguir:
9. 2. 8. 1. Polimorfismo Universal Como o próprio nome diz, ele é universal, ou seja, ele pode ser aplicado em vários casos, logo não consegue saber quantas vezes será aplicado o polimorfismo. Trabalha potencialmente num conjunto infinito de tipos, de modo disciplinado. Este polimorfismo possui duas formas:
9. 2. 8. 2. Paramétrico ou parametrização A ideia do polimorfismo universal paramétrico é ao definir um elemento(que pode ser uma classe, um método ou alguma outra estrutura da linguagem), a definição do tipo sozinha ela é incompleta, ela precisa parametrizar este tipo, ou seja, teoricamente não existiria o tipo sozinho, o que sim existe e o tipo de alguma coisa de alguma coisa, por exemplo, uma list não seria só do tipo list, e sim do tipo list de elefantes. Vale lembrar que este polimorfismo só foi implementado em Java a partir da versão 1.5. Exemplo de polimorfismo paramétrico em Java: // Aqui no exemplo é criado um ArrayList do tipo ArrayList de Aluno, e não ArrayList, isso é o polimorfismo universal paramétrico
ArrayList alunos = new ArrayList(); // aqui há o como aluno Aluno a = new Aluno("Rafael"); alunos.add(a);
Aluno x = alunos.get(0); System.out.println("Nome: " + x.getNome());
9. 2. 8. 3. Inclusão É quando você tem um ponteiro para mãe e ele consegue apontar para um objeto da filha, já que esse polimorfismo é muito básico, é difícil você conseguir outras coisas sem ele, por isso boa parte das linguagens orientadas a objetos conhecidas implementam esse polimorfismo. Exemplo em Código: class Porca { int faces; void acopleETorca();
46 } class Porca8mm extends Porca { void acopleETorca(){ if (...) ... } } class Porca10mm extends Porca { void acopleETorca(){ for (...) ... } }
9. 2. 8. 4. Polimorfismo Ad-Hoc É implementado quando queremos definir uma coisa específica, ou seja, este polimorfismo, diferente do universal, não pode ser usado em todo lugar, logo sabemos quantas vezes ele será aplicado.
9. 3. Arquitetura e Ferramentas O processo de compilação de um programa Java é feito de acordo com os seguintes passos: o código fonte (extensão .java) é compilado e armazenado em um arquivo de extensão .class. De cara, percebe-se a impossibilidade de utilizar-se de DOS como sistema operacional para a elaboração de aplicativos Java, uma vez que o mesmo tem um suporte limitado a nomes de arquivos. Mas essa limitação quanto ao nome dos arquivos é somente a razão aparente da não portabilidade de Java para DOS. A grande razão reside no fato de que Java foi projetada para sistemas de 32 bits, e só foram escritas Máquinas Virtuais Java para ambientes de 32 bits. A portabilidade de Java depende fortemente da existência de JVMs que rodem em diversas plataformas. Um programa Java rodará em um computador se existir uma JVM que nele rode. Ao contrário de programas Java, as JVMs devem ser programas feitos e compilados para máquinas específicas, de forma que serão as JVMs as responsáveis pela tradução de bytecodes Java para as linguagens nativas das máquinas. O conjunto de instruções da Máquina Virtual Java é otimizado para ser pequeno e compacto, tendo sido elaborado para ser uma espécie de processador RISC virtual: a rapidez da interpretação às vezes é sacrificada para garantir esse reduzido conjunto de instruções. O compilador mais utilizado para a transformação de arquivos-fonte java (.java) em arquivos de bytecodes é o javac da Sun (há diversos outros compiladores no mercado, mas o javac foi o primeiro e é o mais popular ainda hoje).
47
Uma vez gerado o arquivo .class, ele deve ser passado à JVM instalada no computador. No caso mais comum, a JVM utilizada é a distribuída pela Sun em seu JDK (Java Developers Kit), denominada java. Isso no caso de aplicativos. No caso de Applets, os browsers que suportam Java já contêm em si uma JVM que interpreta os bytecodes das Applets.
9. 3. 1. Ferramentas para desenvolvimento em Java A Sun, ao lançar a linguagem Java, pôs à disposição gratuitamente o pacote JDK - Java Developer's Kit, que inclui, entre outros: Javac - o compilador de arquivos .java para bytecodes .class; Java - a JVM específica para a plataforma; Appletviewer - visualizador de applets, sem a necessidade de execução das mesmas num
browser. Diversas empresas desenvolveram ambientes para programação em Java, mas por enquanto nenhum deles firmou-se no mercado. Alguns IDEs (Integrated Development Environments) disponíveis para shareware ou para compra são mostrados a seguir: Microsoft Visual J++ - A Microsoft, que de início menosprezou todo o potencial da
Internet, e que subestimou Java como uma linguagem promissora, agora "retomou o bonde" e tenta, com o seu VJ++, estabelecer um padrão para IDEs Java. Contudo, o VJ++ tem mecanismos intrincados de instalação, consome muito espaço em disco e exige a presença do Internet Explorer no computador. Symantec Visual Café - A Symantec foi uma das poucas a acertarem em ambientes para
Java. O seu Symantec Café fez grande sucesso em 1996, e o Visual Café parece ser bastante promissor. O ambiente de programação lembra o de Visual Basic. Asymetrix SuperCede - Na tentativa de desenvolver um compilador para Java, a
Asymetrix desenvolveu o SuperCede, que peca por ferir um dos principais conceitos de Java: a portabilidade. SuperCede possui um compilador próprio que não gera bytecodes, mas sim código executável, na tentativa de ganho de performance.
48
9. 3. 2. Java e a Internet Como sabemos, a Internet é uma gigantesca "rede" (conceitualmente falando) que liga "zilhares" de computadores entre si. É uma rede heterogênea, já que diversos tipos de computadores estão ligados a ela. Todos esses computadores utilizam-se do protocolo TCP/IP para comunicarem-se. Como eles são distintos, eles precisam de uma linguagem que não esteja necessariamente amarrada a uma plataforma de hardware/software específica. Como já vimos, Java mostra-se ideal quanto a esse fator. Uma vez que os programa Java são transmitidos como bytecodes, eles podem rodar em qualquer computador sem necessitar uma nova recompilação, independente da plataforma na qual ele será executado. Programas Java sempre são carregados no computador cliente e nele executado. Há dois tipos básicos de programas Java: Aplicativos, que são programas como outros quaisquer, e Applets, programas especialmente confeccionados para executarem dentro de uma página HTML. Ao abrir uma página HTML que tenha inserida em si uma applet Java, esta é automaticamente descarregada para seu computador e executada. Daí vem a pergunta: há riscos de um vírus infectar o seu computador cliente??? Isso não ocorre, devido a uma série de limitações que os projetistas de Java impuseram às applets, por razões de segurança puramente, de forma que nenhuma applet Java seja capaz de "roubar" informações ou danificar dados do computador. A razão de toda essa segurança reside no fato de que programas Java são compilados em bytecodes que são verificados. Instruções bytecode são muito similares a outros conjuntos de instruções projetados para plataformas específicas, com a diferença de que bytecodes são conferidos através de informações adicionais que eles carregam em si informando a legitimidade ou não do arquivo. Programas C++ em geral chamam funções por endereço. Como o endereço é um número simples que pode ser construído de qualquer forma, o programa pode utilizar-se de qualquer número para executar uma função. Java, ao contrário, tem uma abordagem muito diferente. Métodos e variáveis não são acessados por endereço, mas sim por nomes. É a esse processo de verificar quais métodos e variáveis que serão realmente usados e que chamamos verificação, que é necessário para garantir que os bytecodes não sofram qualquer adulteração e que continuem obedecendo às restrições de Java. Uma vez verificado o bytecode, a JVM irá traduzir enfim os nomes de funções para endereços.
10. Banco de Dados Oracle O Oracle é um SGBD (sistema gerenciador de banco de dados) que surgiu no fim dos anos 70, quando Larry Ellison vislumbrou uma oportunidade que outras companhias não haviam percebido, quando encontrou uma descrição de um protótipo funcional de um banco de dados relacional e descobriu que nenhuma empresa tinha se empenhado em comercializar essa tecnologia. A Oracle Corporation foi fundada em 1977 e tem escritórios em mais de 145 países. Em 2004, empregava mais de 43000 pessoas no mundo inteiro. Ellison e os co-fundadores da Oracle Corporation, Bob Miner e Ed Oates, perceberam que havia um tremendo potencial de negócios no modelo de banco de dados relacional tornando assim a maior empresa de software empresarial do mundo. Lawrence J. Ellison (Larry Ellison) foi o presidente (CEO - Chief Executive Officer) da
49
empresa por vários anos. Depois de ser diretor geral da empresa até 2003, foi sucedido por Jeff Henley em 2004. Ellison mantém seu posto de CEO. Além da base de dados, a Oracle desenvolve uma suíte de desenvolvimento chamada de Oracle Developer Suite, utilizada na construção de programas de computador que interagem com a sua base de dados. A Oracle também criou a linguagem de programação PL/SQL, utilizada no processamento de transações.
10. 1. Edições Além das diferentes versões do software de gerenciamento de banco de dados Oracle, a Oracle Corporation subdivide seu produto em "edições" variáveis - aparentemente por razões de marketing e controle de licenças. • Enterprise Edition (EE) inclui mais funcionalidades que a 'Standard Edition', especialmente nas áreas de performance e segurança. A Oracle Corporation licencia este produto na base de usuários ou de núcleos de processamento, normalmente para servidores com 4 ou mais UCPs. EE não tem limite de memória e pode utilizar clusterização usando o software Oracle RAC. • Standard Edition (SE) contem a a funcionalidade básica de banco de dados. A Oracle Corporation licencia este produto na base de usuários ou de sockets, normalmente para servidores com um à quatro UCPs. Se o número de UCPs exceder 4, o usuário deve migrar para a licensa Enterprise. SE não possui limite de memória e pode utilizar clusterização com o Oracle RAC sem custo adicional. • Standard Edition One, introduzido com o Oracle 10g, possui algumas restrições de funcionalidades adicionais. A Oracle Corporation comercializa-o para uso em sistemas com uma ou duas UCPs. Ela não possui limitações de memória. • Express Edition ('Oracle Database XE'), introduzido em 2005, oferece o Oracle 10g livre para distribuição nas plataformas Windows e Linux (com uma limitação de apenas 150 MB e restrita ao uso de apenas uma UCP, um máximo de 4 GB de dados de usuário e 1 GB de memória). O suporte para esta versão é feito exclusivamente através de fóruns on-line, sem o suporte da Oracle. • Oracle Personal Edition fornece a funcionalidade de "alto fim" da Enterprise Edition mas é comercializada (e licenciada) para desenvolvedores específicos que trabalham em estações de trabalho pessoais. • Oracle Database Lite, destinada para rodar em dispositivos móveis. O banco de dados, localizado parcialmente no dispositivo móvel, pode sincronizar com uma instalação baseada em servidor.
11. Banco de Dados MySQL O MySQL é um sistema de gerenciamento de banco de dados (SGBD), que utiliza a linguagem SQL (Linguagem de Consulta Estruturada, do inglês Structured Query Language) como
50
interface. É atualmente um dos bancos de dados mais populares, com mais de 10 milhões de instalações pelo mundo. Entre os usuários do banco de dados MySQL estão: NASA, Friendster, Banco Bradesco, Dataprev, HP, Nokia, Sony, Lufthansa, U.S. Army, U.S. Federal Reserve Bank, Associated Press, Alcatel, Slashdot, Cisco Systems, Google e outros.
11. 1. História O MySQL foi criado na Suécia por dois suecos e um finlandês: David Axmark, Allan Larsson e Michael "Monty" Widenius, que têm trabalhado juntos desde a década de 1980. Hoje seu desenvolvimento e manutenção empregam aproximadamente 400 profissionais no mundo inteiro, e mais de mil contribuem testando o software, integrando-o a outros produtos, e escrevendo a respeito dele. No dia 16 de Janeiro de 2008, a MySQL AB, desenvolvedora do MySQL foi adquirida pela Sun Microsystems, por US$ 1 bilhão, um preço jamais visto no setor de licenças livres. No dia 20 de Abril de 2009 a Oracle compra a Sun Microsystems e todos o seu produtos, incluindo o MySQL. Após investigações da Comissão Europeia sobre a aquisição para evitar formação de monopólios no mercado a compra foi autorizada e hoje a Sun faz parte da Oracle. O sucesso do MySQL deve-se em grande medida à fácil integração com o PHP incluído, quase que obrigatoriamente, nos pacotes de hospedagem de sites da Internet oferecidos atualmente. Empresas como Yahoo! Finance, MP3.com, Motorola, NASA, Silicon Graphics e Texas Instruments usam o MySQL em aplicações de missão crítica. A Wikipédia é um exemplo de utilização do MySQL em sites de grande audiência. O MySQL hoje suporta Unicode, Full Text Indexes, replicação, Hot Backup, GIS, OLAP e muitos outros recursos de banco de dados.
11. 2. Características • Portabilidade (suporta praticamente qualquer plataforma atual); • Compatibilidade (existem drivers ODBC, JDBC e .NET e módulos de interface para diversas linguagens de programação, como Delphi, Java, C/C++, C#, Visual Basic, Python, Perl, PHP, ASP e Ruby) • Excelente desempenho e estabilidade; • Pouco exigente quanto a recursos de hardware; • Facilidade de uso; • É um Software Livre com base na GPL; • Contempla a utilização de vários Storage Engines como MyISAM, InnoDB, Falcon, BDB, Archive, Federated, CSV, Solid… • Suporta controle transacional; • Suporta Triggers;
51
• Suporta Cursors (Non-Scrollable e Non-Updatable); • Suporta Stored Procedures e Functions; • Replicação facilmente configurável; • Interfaces gráficas (MySQL Toolkit) de fácil utilização cedidos pela MySQL Inc.
12. Banco de Dados SQL Server O MS SQL Server é um SGBD - sistema gerenciador de Banco de dados relacional criado pela Microsoft em parceria com a Sybase em 1988 e inserido como produto complementar do Windows NT. Ao final da parceria, em 1994, a Microsoft continuou aperfeiçoando o produto. Com a nova versão o Microsoft SQL Server 2008 é fornecida uma plataforma de dados confiável, produtiva e inteligente que permite que você execute suas aplicações de missão crítica mais exigentes, reduza o tempo e o custo com o desenvolvimento e o gerenciamento de aplicações e entregue percepção que se traduz em ações estratégicas em toda sua organização.O SQL É um Banco de dados robusto e usado por sistemas corporativos dos mais diversos portes.
12. 1. Produtivo Para obter as vantagens das novas oportunidades no dinâmico mundo corporativo, as empresas precisam de capacidades para rapidamente criar e implantar soluções baseadas em dados. O Microsoft SQL Server 2008 reduz o tempo e o custo de gerenciamento e de desenvolvimento de aplicações. Gerenciamento Baseado em Diretivas
• Gerenciamento Baseado em Diretivas: O Gerenciamento Baseado em Diretivas é uma estrutura para o gerenciamento de umas ou mais instâncias de SQL Server 2008. Use essa estrutura com o \MS-SQL Server Management Studio para criar diretivas que gerenciem entidades no servidor, tais como a instância de MS-SQL Server, bancos de dados e outros objetos do SQL Server. • Instalação Dinâmica: O SQL Server 2008 introduz melhorias significantes ao ciclo de vida de serviço para o MS-SQL Server, através da re-engenharia da instalação, configuração e arquitetura. Essas melhorias separam a instalação dos bits físicos do hardware, a partir de uma configuração do MS-SQL Server, permitindo que as empresas e os parceiros de software forneçam as configurações de instalação recomendadas. • Coleção de Dados de Desempenho: A resolução de problemas e o ajuste de desempenho são tarefas demoradas para o administrador. Para fornecer percepção de desempenho aos administradores, o MS-SQL Server 2008 inclui uma coleção de dados de desempenho mais ampla, um novo repositório de dados centralizado para armazenar os dados de desempenho e novas ferramentas para relatório de monitoramento. Simplifique o Desenvolvimento de Aplicações
• LINQ (Language Integrated Query): Permite que os desenvolvedores utilizem objeto para endereçar as consultas em relação aos dados usando uma linguagem de programação gerenciada,
52
como C# ou VB.NET, ao invés das declarações SQL. Permite consultas transparentes, intuitivas e orientadas ao conjunto, escritas em linguagens.NET para serem executas em ADO.Net (LINQ para SQL), ADO.Net DataSets (LINQ para DataSets), ADO.NET Entity Framework (LINQ para Entidades) e provedor de mapeamento de serviços de dados de entidade. Use o novo provedor LINQ para SQL, que permite que os desenvolvedores usem a LINQ diretamente nas tabelas e colunas do SQL Server 2008. • Serviços de Objeto ADO.NET: A camada de serviços de objeto do ADO.NET permite a materialização, o acompanhamento de mudanças e a persistência dos dados como objetos CLR. Os desenvolvedores que usam o ADO.NET Framework podem programar em um banco de dados usando os objetos CLR que são gerenciados pelo ADO.NET. O SQL Server 2008 introduz um suporte mais eficiente e otimizado, que melhora o desempenho e simplifica o desenvolvimento. Armazene Qualquer Informação
• DATA/HORA: O MS-SQL Server 2008 introduz novos tipos de dados de data e hora, conforme as especificações do padrão SQL: • DATA – somente um tipo de data • HORA – somente um tipo de hora • DATETIMEOFFSET – um tipo datetime com suporte a fusos horários • DATETIME2 – um tipo datetime c/ maior fração de segundos e quantidade de anos que o tipo DATETIME existente Os novos tipos de dados permitem que as aplicações tenham tipos de dados e de hora separados, ao mesmo em que fornecem grande variedade de dados ou precisão definida pelo usuário para os valores de hora. • HIERARCHY ID: Permite que as aplicações de banco de dados modelem as estruturas de árvores de uma maneira mais eficiente do que a atualmente possível. O novo tipo de sistema, HierarchyId, pode armazenar os valores que representam os nós em uma árvore hierárquica. Este novo tipo será implementado como um CLR UDTe expõe vários métodos nativos úteis e eficientes para criar e operar nos nós hierárquicos com um flexível modelo de programação. • Dados FILESTREAM: Permite que grandes dados binários seja armazenados diretamente no sistema de arquivos NTFS, ao mesmo tempo em que preserva uma parte integrante do banco de dados e mantém a consistência transacional. Permite o escalonamento de grandes dados binários tradicionalmente gerenciados pelo banco de dados para serem armazenados fora do banco de dados, em um armazenamento mais viável financeiramente. Pesquisa de Texto Completamente Integrada: A pesquisa de Texto Completamente Integrada torna transparente a transição entre a pesquisa de texto e os dados relacionais e permite que os usuários utilizem os índices de texto para desenvolverem pesquisas de texto com alta velocidade e em grandes colunas de texto.
53
• Colunas Dispersas: Os dados NULL não consomem nenhum espaço físico, o que fornece uma maneira altamente eficiente de gerenciar os dados null (vazios) em um banco de dados. Por exemplo, as Colunas Dispersas permitem que os objetos de modelos, que tipicamente têm números com valores nulos, sejam armazenados em um banco de dados do MS-SQL Server 2005 sem ter custos grandes com o espaço. Tipos Amplos Definidos pelo Usuário: O MS-SQL Server 2008 elimina o limite de 8KB para os Tipos Definidos pelo Usuário (UDTs), permitindo que os usuários ampliem bastante o tamanho de seus UDTs. • Tipos de Dados Espaciais: Cria capacidades espaciais em suas aplicações, usando o suporte para dados espaciais. • Implemente soluções Round Earth com o tipo de dado geography. Use as coordenadas de latitude e longitude para definir as áreas de superfície da Terra. • Implemente soluções Flat Earth com o tipo de dado geometry. Armazene polígonos, pontos e linhas que estão associados com as superfícies planas e dados naturalmente planos, tal como espaços interiores.
12. 2. Inteligente O MS-SQL Server 2008 fornece uma plataforma abrangente, entregando inteligência onde seus usuários precisam dela. Integre Qualquer Tipo de Dados
• Compressão de Backup: Manter online os backups baseados em disco é caro e demorado. Com a compressão de backup do SQL Server 2008 exige-se menos armazenamento para manter os backups online e os backups são executados de forma muito mais rápida porque exige-se menos I/O (entrada/saída) de disco. • Paralelismo de Tabela Particionada: As partições permitem que as empresas gerenciem grandes tabelas de maneira mais efetiva, quebrando-as de forma transparente em blocos gerenciáveis de dados. O SQL Server 2008 foi construído sobre os avanços de particionamento no SQL Server 2005, melhorando o desempenho nas grandes tabelas particionadas. • Otimizações de Consulta Star Join: O MS-SQL Server 2008 fornece um aprimorado desempenho de consulta para os cenários comuns de data warehouse. As Otimizações de Consulta Star Join reduzem o tempo de resposta à consulta, reconhecendo os padrões de união de data warehouse. • Grouping Sets: Os Grouping Sets são uma extensão da cláusula GROUP BY, que permitem que os usuários definam múltiplos agrupamentos na mesma consulta. Os Grouping Sets produzem um único conjunto de resultados que é equivalente a uma UNION ALL de linhas agrupadas de forma diferente, tornando a consulta de agregação e relatórios mais fáceis e rápidos.
54
• Captura de Alterações de Dados: Com o recurso Captura de Alterações de Dados, as mudanças são capturadas e colocadas em tabelas de alterações. Ele captura o conteúdo completo das alterações e mantém a consistência na tabela cruzada e, até mesmo, trabalha nas alterações de esquemas. Isto permite que as organizações integrem as informações mais recentes no data warehouse. • Declaração MERGE SQL: Com a introdução da Declaração MERGE SQL, os desenvolvedores podem controlar os cenários comuns de data warehousing de maneira mais efetiva, por exemplo, verificando se uma linha existe e, depois, fazendo uma inserção ou atualização. • Melhorias de Pipeline do MS-SQL Server Integration Services (SSIS): Os pacotes de Integração de Dados agora podem escalonar de maneira mais efetiva, fazendo uso dos recursos disponíveis e gerenciando as maiores cargas de trabalho da empresa. O novo design melhora a escalabilidade do tempo de execução em múltiplos processadores. • Pesquisas Persistentes do MS-SQL Server Integration Services (SSIS): A necessidade de realizar pesquisas é uma das operações de ETL mais comuns. Isto prevalece especialmente no data warehousing, onde os registros de dados precisam usar as pesquisas para transformarem as chaves corporativas em seus substitutos correspondentes. O SSIS aumenta o desempenho das pesquisas para dar suporte às tabelas maiores. Entrega de Informações Relevantes
• Desempenho e Escalonamento das Análises: O MS-SQL Server 2008 conduz as análises mais amplas com capacidades analíticas avançadas e com agregações e computações mais complexas. As novas ferramentas de design de cubo ajudam os usuários a agilizarem o desenvolvimento da infra-estrutura de análise, permitindo que eles construam soluções para a otimização de desempenho. • Computações de Bloqueio: As Computações de Bloqueio fornecem melhorias significantes ao desempenho, permitindo que os usuários aumentem a profundidade de suas hierarquias e a complexidade das computações. • Writeback: O novo recurso de writeback habilitado a MOLAP do MS-SQL Server 2008 Analysis Services remove a necessidade de consultar as partições ROLAP. Este recurso fornece aos usuários cenários avançados de writeback dentro das aplicações analíticas sem sacrificar o tradicional desempenho do OLAP. Permite Uma Maior Percepção
• Mecanismo de Relatório Corporativo: Os relatórios podem facilmente serem entregues a organização inteira, tanto interna como externamente, com a implantação e a configuração simplificadas. Isto permite que os usuários facilmente criem e compartilhem relatórios de qualquer tamanho e complexidade. • Implantação de Relatórios na Internet: Os clientes e fornecedores podem ser alcançados com menos esforços implantando-se relatórios na Internet.
55
• Gerencie a Infra-Estrutura de Relatórios: Aumente o suporte e a capacidade de controlar o comportamento do servidor com o gerenciamento de memória, consolidação de infra-estrutura e configuração mais fácil através de uma API e armazenamento centralizado para todos os ajustes de configuração. • Melhorias no Report Builder: Construa facilmente relatórios ad-hoc e de autor com qualquer estrutura através do Report Designer. • Autenticação Nativa de Formulários: A autenticação nativa de formulários permite que os usuários facilmente alternem entre Janelas e Formulários. • Report Server Application Embedding: O recurso Report Server Application Embedding permite que as URLs em relatórios e assinaturas apontem para o front-end das aplicações. • Integração com o Microsoft Office: O MS-SQL Server 2008 fornece nova renderização do Word, que permite que os usuários utilizem os relatórios diretamente de dentro do Microsoft Office Word. Além disso, a renderização existente do Excel foi muito aprimorada para acomodar o suporte aos recursos, como regiões de dados aninhados, sub-relatórios, bem como melhorias de células mescladas. Isto permite que os usuários mantenham a fidelidade do layout e melhora a utilização geral dos relatórios a partir de aplicações do Microsoft Office.
56
CONSIDERAÇÕES FINAIS Pode se concluir que baseado nesse trabalho e nas pesquisas realizadas para criar o mesmo, que a engenharia da computação é a ciência que estuda a estrutura de computadores, porém a estrutura que essa engenharia estuda, não é apenas estrutura fisica (hardwares) mas também estrutura logica (softwares), que dentro da engenharia, falando de hardware, é estruturada desde os menos componentes, que no trabalho foi citado os resistores, capacitores e transistores, que são a base dos circuitos dos hardwares, desde a placa-mãe até o núcleo do HD. E falando de sofware, a estrutura apresentada é a base dos software, as linguagens de programação, que foi citada as linguagens C, C++, C# e Java, que de modo geral, são as liguagens predominantes e de uso mais facil na criação de sofwares, desde programas editores de imagens até sistemas operacionais. E, sem deixar de fora, os bancos de dados (SGBD – Sistemas gerenciadores de bancos de dados) que tem a função principal, de auxiliar os softwares, a armazenar as informações primordiais de forma organizada e de facil entendimento, e de modo que o computador possa ler e enterpretar as informações.
View more...
Comments