Posts de Abril, 2007

Entenda a importância da Memória cache

Abril 5, 2007

A memória cache surgiu quando percebeu-se que as memórias não eram mais capazes de acompanhar o processador em velocidade, fazendo com que muitas vezes ele tivesse que ficar “esperando” os dados serem liberados pela memória RAM para poder concluir suas tarefas, perdendo muito em desempenho.

Se na época do 386 a velocidade das memórias já era um fator limitante, imagine o quanto este problema não atrapalharia o desempenho dos processadores que temos atualmente. Para solucionar este problema, começou a ser usada a memória cache, um tipo ultra-rápido de memória que serve para armazenar os dados mais frequentemente usados pelo processador, evitando na maioria das vezes que ele tenha que recorrer à comparativamente lenta memória RAM. Sem ela, o desempenho do sistema ficará limitado à velocidade da memória, podendo cair em até 95%!. São usados dois tipos de cache, chamados de cache primário, ou cache L1 (level 1), e cache secundário, ou cache L2 (level 2).

O cache primário é embutido no próprio processador e é rápido o bastante para acompanhá-lo em velocidade. Sempre que um novo processador é desenvolvido, é preciso desenvolver também um tipo mais rápido de memória cache para acompanhá-lo. Como este tipo de memória é extremamente caro (chega a ser algumas centenas de vezes mais cara que a memória RAM convencional) usamos apenas uma pequena quantidade dela.

Para complementar, usamos também um tipo um pouco mais lento de memória cache na forma do cache secundário, que por ser muito mais barato, permite que seja usada uma quantidade muito maior.
Cache L1
A primeira camada de cache do sistema, encontrada sempre dentro do próprio processador (com excessão apenas para os micros 386). O cache L1 trabalha sempre na mesma freqüência do processador e com tempos de latência extremamente baixos.
Cache L2
Encontrado ou embutido no processador, ou na placa mãe, dependendo do sistema. Mesmo no caso dos processadores atuais, que trazem tanto cache L1 quanto cache L2 embutidos, operando à mesma freqüência do processador, os tempos de latência do cache L2 sempre serão mais altos, garantindo uma velocidade de acesso mais baixa que no L1.

Texto extraído do Clube do Hardware.


http://www.guiadohardware.net/termos/memoria-cache

Introdução a Orientação a Objetos – Segunda parte

Abril 4, 2007

Classes:

As classes são os verdadeiros elementos da orientação a objetos. Uma classe descreve um tipo contendo sub-rotinas (ou métodos) e dados. Como uma classe descreve um tipo, pode-se construir variáveis que contem tanto métodos quanto variáveis. Tais variáveis são os objetos. Os objetos diferem das variáveis das linguagens de programação procedimentais porque podem definir o modo como os dados podem ser alterados. As sub-rotinas nas linguagens orientadas a objetos diferem de seus equivalentes nas linguagens procedimentais pois elas têm um conjunto de dados (os membros de dados definidos na mesma classe), o qual elas podem alterar, mas os outros métodos não.

A classe é o ponto de partida da programação orientada a objetos. São elas que fornecem modelos para a especificação do estado e do comportamento de um objeto durante a execução. Um objeto é reconhecido como uma instância de uma classe.

Uma classe é constituída de atributos e métodos. Um atributo pode ser visto como uma qualidade ou característica da classe. Por exemplo, a classe Funcionário, terá os seguintes atributos: nome, idade, sexo, etc. Já os métodos são os serviços que uma classe pode oferecer. Para este caso, Funcionário, poderia-se ter: calcularSalario, calcularHorasExtras, etc.

Definição de classes em Java:

Em Java, classes são definidas através do uso da palavra-chave class. Para definir uma classe, utiliza-se a construção:

[modif] class NomeDaClasse {
// corpo da classe…
}

A primeira linha é um comando que inicia a declaração da classe. Após a palavra-chave class, segue-se o nome da classe, que deve ser um identificador válido para a linguagem. O modificador modif é opcional; se presente, pode ser uma combinação de public e abstract ou final.

A definição da classe propriamente dita está entre as chaves { e }, que delimitam blocos na linguagem Java. Este corpo da classe usualmente obedece à seguinte seqüência de definição:

1. As variáveis de classe, public, protected, e private.
2. Os atributos (ou variáveis de instância) dos objetos dessa classe, seguindo a mesma ordenação definida para as variáveis de classe.
3. Os construtores de objetos dessa classe.
4. Os métodos da classe, geralmente agrupados por funcionalidade.

Toda classe pode também ter um método main associado, que será utilizado pelo interpretador Java para dar início à execução de uma aplicação.

Java também oferece outra estrutura, denominada interface, com sintaxe similar à de classes mas contendo apenas a especificação da funcionalidade que uma classe deve conter, sem determinar como essa funcionalidade deve ser implementada.

Exemplos de código:

Método main:

O método main é onde o programa inicia. Pode estar presente em qualquer classe. Os parâmetros de linha de comando são enviados para a array args[], do tipo String.

public class OlaMundo {
public static void main(String args[]) {
System.out.println(“Olá, Mundo!”);
}
}

Criação de classes:

Exemplo:

public abstract class Animal {
public abstract void fazerBarulho();
}

public class Cachorro extends Animal {
public void fazerBarulho() {
System.out.println(“AuAu!”);
}
}

public class Gato extends Animal {
public void fazerBarulho() {
System.out.println(“Miau!”);
}
}

O exemplo acima cria a classe Animal e duas classes derivadas de Animal.

Java não suporta herança múltipla.

Herança Múltipla é o principio, implementado em algumas linguagens de programação orientadas a objetos, que possibilita o compartilhamento de atributos e operações de duas ou mais classes em uma subclasse.

Ela é implementada nas linguagens de programação C++ e em Python, por exemplo. A linguagem Java possui apenas herança simples (uma classe possui no máximo uma classe pai), mas permite que uma classe implemente várias interfaces.

O uso indiscriminado desta característica pode levar a uma codificação confusa que dificultaria a manutenção do código.

Todas as classes em Java derivam de Object.

Classes internas:

Java pode ter classes internas.

Exemplos:

public class Cavalo extends Animal {
public void fazerBarulho() {
System.out.println(“RIINCH!”);
}

//Classe interna e privada. Existe só no contexto do cavalo.
private class Parasita extends Animal {
public void fazerBarulho() {
System.out.println(“SQRRT”);
}
}
}

Objetos e classes anônimos:

Podemos ter também objetos e ou classes anônimas.

exemplo:

public class MostraBarulho {
public static void main(String args[]) {
new Cavalo().fazerBarulho(); //Objeto anônimo.

//Abaixo um objeto e classe anônimos!
new Animal() {
public void fazerBarulho() {
System.out.println(“QUAC!”);
}
}.fazerBarulho();
}
}

Interfaces:

Uma interface modela um comportamento esperado. Pode-se entendê-la como uma classe que contenha apenas métodos abstratos. Embora uma classe não possa conter mais de uma superclasse, a classe pode implementar mais de uma interface.

Exemplo:

public interface Pesado {
double obterPeso();
}

public interface Colorido {
Color obterCor();
}

public class Porco extends Animal
implements Pesado, Colorido {
public void fazerBarulho() {
System.out.println(“Óinc!”);
}

//Implementação da interface Pesado
public double obterPeso() {
return 50.00;
}

//Implementação da interface Colorido
public Color obterCor() {
return Color.BLACK;
}

//Um método só do porco
public boolean enlameado() {
return true;
}
}