sexta-feira, 24 de abril de 2009

Linguagem Imperativa












Bom pessoal,
depois de conhecer sobre a linguagem funcional
vamos ter conhecimento de uma que a constrasta: A Linguagem Imperativa!
Mas antes de aprofundarmos nela,
vale ressaltar um fator que exerce um
efeito crucial nos projetos das linguagens de programação:




a arquitetura do computador.
Boa parte das linguagens de programação nos últimos anos foram projetadas em torno da arquitetura do computador, conhecidas por arquitetura de von Neumann.

Mas o quer dizer isso??

Nesta arquitetura( usada hoje nos microcomputadores comercializados), tanto os dados como os programas são armazenados na mesma memória, e a CPU que processa as instruções, é separada da memória. Dessa forma, os dados e instruções devem ser transportados da memória para a CPU e os resultados das operações realizadas na CPU devem ser devolvidos para a memória.
As linguagens imperativas estruturadas sofrem no entanto de uma falta de flexibilidade dadas o caráter sequencial das instruções. Contrariamente a programação declarativa, a programação imperativa introduz um paradigma de programação que descreve a computação em termos de um estado de um programa e acções que modificam esse estado, tal como o modo imperativo nas linguagens naturais (faladas e escritas) expressa comandos para perfazer acções, as linguagens imperativas expressam uma sequencia de comandos para um computador efetuar.

Conhecendo as características principais da linguagem imperativa....

* Variáveis: modelam as células de memória
* Comandos de atribuição: são baseados nas operações de transferências de dados e instruções.
* Execução sequencial de instruções
* Forma interativa de repetição

As linguagens imperativas também são chamadas de procedurais e se trata do modelo mais antigo de todos, a execução é baseada em comandos e armazenamento de dados. O paradigma imperativo foi predominante nas LP, pois são mais fáceis de traduzir para uma forma adequada para execução da máquina. Um programa imperativo é mantido em variáveis que são associadas com localizações de memória que correspondem a um endereço e um valor de armazenamento. O valor da variável pode ser acessado direta ou indiretamente, e pode ser alterado através de um comando de atribuição. O comando de atribuição introduz uma dependência de ordem no programa, ou seja, o valor da variável pode se modificar antes e depois do comando e isso garante a sequencia de instruções.
As funções de linguagem de programação imperativa são descritas como algoritmos que especificam como processar um intervalo de valores, a partir de um valor de domínio, com uma série de passos descritos. A repetição é usada para processar os valores e laços para varrer uma sequencia de localizações de memória ( vetores, por exemplo), ou para acumular valor nas variáveis.

Técnicas em programação Imperativa:

*Modularidade dos Algoritmos (Programação estruturada)
*Modularidade das Estruturas de dados (Tipos abstratos de dados)
*recorrência

Exemplos de programação imperativa...fortran, algol, pascal, c, ada , basic, cobol, python.

Analisando dois exemplos de Linguagem Imperativa:




FORTRAN e C!!!!!!!

FORTRAN.....

Valores, tipos e expressões....

- tipos: integer, real, double precision,
complex, logical; vetor: dimension
(dim1, dim2, dim3), real, integer
- constantes lógicas: true/false
- operadores: **,*,/,+,-,ge.,gt.,le.,eq., ne., and., or.

Comando e sequências....

- if () then
….
end if

if ()
….
else if ( ) then
….
else
….
end if
- comandos I/O: open, close, read, write, print, rewind, endfile
-goto, continue, pause, stop

Declaração, procedimentos e funções...

- declaração var:
- funções: function ()
- proc: procedure ()

Linguagem C....

Valores, tipos e expressões...

- tipos: char, int, float, double, struct, union
- operadores: -,+,*,/,%,++,>,>=,=,
!=,&&,,!,&
bit a bit: &,,^,~, <<,>>

Comandos e sequências....

if ()
else
for(inic; cond, incremento)

switch (){
case:....break;
case:....break;
default:...;
}
while () {…;}
do....

while ();
return , goto, break

Declarações, procedimentos e funções...

- declaração var: ...;
- cosntantes const = ;
- funções: ()

by Sara Mizraim Oliveia e Daniel Alex Rios









Referências.....
http://www.do.ufgd.edu.br
http://www.inf.unisinos.br

Orientação a Objetos




O conceito de programação orientada por objetos não é novo. No final da década de 60, a linguagem Simula67, desenvolvida na Noruega, introduzia conceitos hoje encontrados nas linguagens orientadas a objetos. Em meados de 1970, o Centro de Pesquisa da Xerox (PARC) desenvolveu a linguagem Smalltalk, a primeira totalmente orientada a objetos. No início da década de 80, a AT&T lançaria a Linguagem C++, uma evolução da linguagem C em direção à orientação a objetos.

Atualmente, a grande maioria das linguagens incorpora características de OO, como Java e Object Pascal. Além das linguagens de programação, é possível encontrar o conceito de OO em sistemas operacionais, como no caso do Windows 2000, e em banco de dados, como no Oracle8 e, principalmente, Jasmine da CA.

A programação orientada a objetos tem como principais objetivos reduzir a complexidade no desenvolvimento de software e aumentar sua produtividade. A análise, projeto e programação orientadas a objetos são as respostas para o aumento da complexidade dos ambientes computacionais que se caracterizam por sistemas heterogêneos, distribuídos em redes, em camadas e baseados em interfaces gráficas.

A programação orientada a objetos não tem a intenção de substituir a programação estruturada tradicional. Podemos considerar que a programação OO é uma evolução de práticas que são recomendadas na programação estruturada, mas não formalizadas, como o uso de variáveis locais, visibilidade e escope. O modelo de objetos permite a criação de bibliotecas que tornam efetivos o compartilhamento e a reutilização de código, reduzindo o tempo de desenvolvimento e, principalmente, simplificando o processo de manutenção das aplicações.

A grande dificuldade para compreender a programação OO é a diferença de abordagem do problema. Enquanto a programação estruturada tem como principal foco as ações (procedimentos e funções), a programação OO se preocupa com os objetos e seus relacionamentos. Além do conceito de objeto, a programação OO tem como alicerces os conceitos de encapsulamento, classe, herança e polimorfismo.

Conceitos Básicos

A abordagem de orientação a objetos favorece a aplicação de diversos conceitos considerados fundamentais para o desenvolvimento de bons programas, tais como abstração e encapsulação. Tais conceitos não são exclusivos desta abordagem, mas são suportados de forma melhor no desenvolvimento orientado a objetos do que em outras metodologias.


Abstração

Abstração consiste de focalizar nos aspectos essenciais inerentes a uma entidade e ignorar propriedades ``acidentais.'' Em termos de desenvolvimento de sistemas, isto significa concentrar-se no que um objeto é e faz antes de se decidir como ele será implementado. O uso de abstração preserva a liberdade para tomar decisões de desenvolvimento ou de implementação apenas quando há um melhor entendimento do problema a ser resolvido.
Muitas linguagens de programação modernas suportam o conceito de abstração de dados; porém, o uso de abstração juntamente com polimorfismo e herança, como suportado em orientação a objetos, é um mecanismo muito mais poderoso.
O uso apropriado de abstração permite que um mesmo modelo conceitual (orientação a objetos) seja utilizado para todas as fases de desenvolvimento de um sistema, desde sua análise até sua documentação.

Encapsulação

Encapsulação, também referido como esconder informação, consiste em separar os aspectos externos de um objeto, os quais são acessíveis a outros objetos, dos detalhes internos de implementação do objeto, os quais permanecem escondidos dos outros objetos. O uso de encapsulação evita que um programa torne-se tão interdependente que uma pequena mudança tenha grandes efeitos colaterais.
O uso de encapsulação permite que a implementação de um objeto possa ser modificada sem afetar as aplicações que usam este objeto. Motivos para modificar a implementação de um objeto podem ser por exemplo melhoria de desempenho, correção de erros e mudança de plataforma de execução.
Assim como abstração, o conceito de encapsulação não é exclusivo da abordagem de orientação a objetos. Entretanto, a habilidade de se combinar estrutura de dados e comportamento em uma única entidade torna a encapsulação mais elegante e mais poderosa do que em linguagens convencionais que separam estruturas de dados e comportamento.

Compartilhamento

Técnicas de orientação a objetos promovem compartilhamento em diversos níveis distintos. Herança de estrutura de dados e comportamento permite que estruturas comuns sejam compartilhadas entre diversas classes derivadas similares sem redundância. O compartilhamento de código usando herança é uma das grandes vantagens da orientação a objetos. Ainda mais importante que a economia de código é a clareza conceitual de reconhecer que operações diferentes são na verdade a mesma coisa, o que reduz o número de casos distintos que devem ser entendidos e analisados.
O desenvolvimento orientado a objetos não apenas permite que a informação dentro de um projeto seja compartilhada como também oferece a possibilidade de reaproveitar projetos e código em projetos futuros. As ferramentas para alcançar este compartilhamento, tais como abstração, encapsulação e herança, estão presentes na metodologia; uma estratégia de reuso entre projetos é a definição de bibliotecas de elementos reusáveis. Entretanto, orientação a objetos não é uma fórmula mágica para alcançar reusabilidade; para tanto, é preciso planejamento e disciplina para pensar em termos genéricos, não voltados simplesmente para a aplicação corrente.

O Modelo de Objetos


Um modelo de objetos busca capturar a estrutura estática de um sistema mostrando os objetos existentes, seus relacionamentos, e atributos e operações que caracterizam cada classe de objetos. É através do uso deste modelo que se enfatiza o desenvolvimento em termos de objetos ao invés de mecanismos tradicionais de desenvolvimento baseado em funcionalidades, permitindo uma representação mais próxima do mundo real.
Uma vez que as principais definições e conceitos da abordagem de orientação a objetos estão definidos, é possível introduzir o modelo de objetos que será adotado ao longo deste texto. O modelo apresentado é um subconjunto do modelo OMT (Object Modeling Technique), proposto por Rumbaugh e outros1.1. OMT também introduz uma representação diagramática para este modelo, a qual será também apresentada aqui.

Objetos e Classes

Objeto é definido neste modelo como um conceito, abstração ou coisa com limites e significados bem definidos para a aplicação em questão. Objetos têm dois propósitos: promover o entendimento do mundo real e suportar uma base prática para uma implementação computacional. Não existe uma maneira ``correta'' de decompor um problema em objetos; esta decomposição depende do julgamento do projetista e da natureza do problema. Todos objetos têm identidade própria e são distinguíveis.
Uma classe de objetos descreve um grupo de objetos com propriedades (atributos) similares, comportamento (operações) similares, relacionamentos comuns com outros objetos e uma semântica comum. Por exemplo, Pessoa e Companhia são classes de objetos. Cada pessoa tem um nome e uma idade; estes seriam os atributos comuns da classe. Companhias também podem ter os mesmos atributos nome e idade definidos. Entretanto, devido à distinção semântica elas provavelmente estariam agrupados em outra classe que não Pessoa. Como se pode observar, o agrupamento em classes não leva em conta apenas o compartilhamento de propriedades.
Todo objeto sabe a que classe ele pertence, ou seja, a classe de um objeto é um atributo implícito do objeto. Este conceito é suportado na maior parte das linguagens de programação orientada a objetos, tais como C ++.
OMT define dois tipos de diagramas de objetos, diagramas de classes e diagramas de instâncias. Um diagrama de classe é um esquema, ou seja, um padrão ou gabarito que descreve as muitas possíveis instâncias de dados. Um diagrama de instâncias descreve como um conjunto particular de objetos está relacionado. Diagramas de instâncias são úteis para apresentar exemplos e documentar casos de testes; diagramas de classes têm uso mais amplo. Conforme figura abaixo


Programação Orientada a Objetos
Figura: Representação diagramática de OMT para classes e objetos. Um diagrama de classe é apresentado à esquerda. Um possível diagrama de instâncias é apresentado à direita.

O agrupamento de objetos em classes é um poderoso mecanismo de abstração. Desta forma, é possível generalizar definições comuns para uma classe de objetos, ao invés de repetí-las para cada objeto em particular. Esta é uma das formas de reutilização e economia que a abordagem de orientação a objetos suporta.

Operações e Métodos

Uma operação é uma função ou transformação que pode ser aplicada a ou por objetos em uma classe. Por exemplo, abrir, salvar e imprimir são operações que podem ser aplicadas a objetos da classe Arquivo. Todos objetos em uma classe compartilham as mesmas operações.
Toda operação tem um objeto-alvo como um argumento implícito. O comportamento de uma operação depende da classe de seu alvo. Como um objeto ``sabe'' qual sua classe, é possível escolher a implementação correta da operação. Além disto, outros argumentos (parâmetros) podem ser necessários para uma operação.
Uma mesma operação pode se aplicar a diversas classes diferentes. Uma operação como esta é dita ser polimórfica, ou seja, ela pode assumir distintas formas em classes diferentes.
Um método é a implementação de uma operação para uma classe. Por exemplo, a operação imprimir pode ser implementada de forma distinta, dependendo se o arquivo a ser impresso contém apenas texto ASCII, é um arquivo de um processador de texto ou binário. Todos estes métodos executam a mesma operação -- imprimir o arquivo; porém, cada método será implementado por um diferente código.
A assinatura de um método é dada pelo número e tipos de argumentos do método, assim como por seu valor de retorno. Uma estratégia de desenvolvimento recomendável é manter assinaturas coerentes para métodos implementando uma dada operação, assim como um comportamento consistente entre as implementações.
Em termos de diagramas OMT, operações são listadas na terceira parte da caixa de uma classe. Cada nome de operação pode ser seguida por detalhes opcionais, tais como lista de argumentos e tipo de retorno. A lista de argumentos é apresentada entre parênteses após o nome da operação. Uma lista de argumentos vazia indica que a operação não tem argumentos; da ausência da lista de argumentos não se pode concluir nada. O tipo de resultado vem após a lista de argumentos, sendo precedido por dois pontos (:). Caso a operação retorne resultado, este não deve ser omitido -- esta é a forma de distinguí-la de operações que não retornam resultado. Exemplos de representação de operações em OMT são apresentados na Figura

Figura: Representação diagramática de OMT para classes com atributos e operações

Programação Orientada a Objetos Programação Estruturada
Métodos Procedimentos e funções
Instâncias de variáveis Variáveis
Mensagens Chamadas a procedimentos e funções
Classes Tipos de dados definidos pelo usuário
Herança -
Polimorfismo -

Um objeto é uma abstração de software que pode representar algo real ou virtual. Um objeto é formado por um conjunto de propriedades (variáveis) e procedimentos (métodos). As variáveis possuem um tipo, que define os possíveis valores que a variável pode representar, como um número inteiro, número real ou string. Os métodos são rotinas que, quando executadas, realizam alguma tarefa, como alterar o conteúdo de uma variável do objeto.

Um exemplo de objeto poderia ser um automóvel. O objeto automóvel possui propriedades, como velocidade, número de portas e limite de passageiros. O objeto automóvel também possui procedimentos, como ligar, desligar, acelerar e parar. Um exemplo menos real de um objeto poderia ser um processo em um sistema operacional. Um processo tem propriedades, como identificação, prioridade, privilégios e quotas. Um processo possui procedimentos associados, como criar, eliminar, alterar a prioridade e visualizar suas caracteríticas.

Os objetos se comunicam apenas através de mensagens. Quando um objeto deseja alguma tarefa de um outro objeto, ele envia uma mensagem contendo o nome do objeto-origem, nome do objeto-destino, nome do método a ser ativado no objeto-destino e, se necessário, parâmetros que permitem especificar alguma função especial a ser executada pelo método. Este conceito se assemelha a chamada de uma rotina em uma linguagem tradicional. O conjunto de mensagens que um objeto pode responder é definido como protocolo de comunicação.

As variáveis de um objeto só podem ser alteradas por métodos definidos na própria classe. A única maneira de um objeto alterar as variáveis de um outro objeto é a através da ativação de um de seus métodos por uma mensagem. Este conceito, onde variáveis e métodos são visíveis apenas através de mensagens, é conhecido como encapsulamento. O encapsulamento funciona como uma proteção para as variáveis e métodos, além de tornar explícito qualquer tipo de comunicação com o objeto.

Geralmente, objetos são criados e eliminados em função da execução do programa. Um objeto pode ser instanciado (criado) por um certo período de tempo e depois eliminado, liberando o espaço de memória ocupado, em um processo automático conhecido como "garbage collection" (coleta de lixo). É possível, porém, criar-se objetos persistentes, que continuam existindo mesmo depois do término do programa que os criou. Um exemplo de objetos persistentes seriam os armazenados em Banco de Dados Orientados a Objetos (OODBMS).

Uma classe consiste de variáveis e métodos que representam características de um conjunto de objetos semelhantes. O conceito de classe é dos pilares da programação orientada a objetos, por permitir a reutilização efetiva de código.

A declaração de uma classe é similar ao dos tipos definidos pelo usuário nas linguagens de programação de alto nível. Nestas linguagens é possível definir um novo tipo de dado e declarar uma variável deste tipo. No caso de objetos, primeiro definimos uma classe com suas variáveis e métodos e, depois, declaramos um objeto desta nova classe. Um objeto é definido como sendo uma instância de uma determinada classe. A classe é estática, enquanto o objeto é dinâmico. No exemplo a seguir, escrito em C++, estamos definindo uma classe T_Ponto, onde as variáveis x e y representam a posição de um ponto na tela. Posteriormente declaramos um objeto p da classe T_Ponto.

class T_Ponto /* Define a classe Ponto */
{
int x;
int y;
public
void altera_xy (int a, int b)
{
x=a;
y=b;
}
int obtem_x () { return x; }
int obtem_y () { return y; }
};

T_Ponto p; /* Declara o objeto p da classe Ponto */

No mesmo exemplo, para alterarmos o valor das variáveis x e y é necessário o envio de uma mensagem para o objeto p, especificando o método altera_xy e passando os novos valores como parâmetros. Da mesma forma, para se consultar os valores de x e y é preciso acionar os métodos obtem_x e obtem_y, respectivamente. Os métodos que permitem a comunicação do objeto com o mundo exterior são conhecidos como interfaces públicas (public).

O conceito de herança permite definir uma nova classe, com base em uma já existente. A classe criada (subclasse ou classe derivada) automaticamente herda todas as variáveis e métodos da classe já existente (superclasse). O mecanismo de herança permite ainda que a subclasse inclua ou sobreponha novas variáveis e métodos da superclasse.

O mecanismo de herança é recursivo, permitindo criar-se uma hierarquia de classes. Nos níveis mais altos da hierarquia estão características comuns a todos os objetos desta classe, enquanto nos níveis inferiores estão especializações das classes superiores. As subclasses herdam as características comuns, além de definirem suas propriedades específicas.

Existem dois tipos de mecanismos de implementação de herança: simples e múltipla. Na herança simples, a subclasse pode herdar variáveis e métodos apenas de uma classe, enquanto na herança múltipla, a subclasse pode herdar variáveis e métodos de mais de uma classe.

Uma das grandes vantagens da programação OO é a utilização de bibliotecas de classes. Estas bibliotecas lembram as bibliotecas de código (procedimentos e funções), utilizadas na programação modular. As bibliotecas de classes permitem uma capacidade muito maior de compartilhamento e reutilização de código, pois é possível criar-se subclasses para atender novas necessidades, em função das classes já existentes. Muitas bilbiotecas são oferecidas juntamente com as ferramentas de desenvolvimento para reduzir o tempo e a complexidade de projetos de software, como a Microsoft Foundation Class (MFC) e a Visual Component Library (VCL) do Delphi. Hoje existe uma crescente insdústria de componentes, isto é, empresas que dedicam a criar classes que servirão para que outros literalmente montem suas aplicações finais.

O termo polimorfismo é utilizado em biologia para definir variações em forma e função de membros de uma mesma espécie. Utilizando a mesma anologia, o mecanismo de polimorfismo permite tratar objetos semelhantes de uma maneira uniforme. Neste caso, é possível que se envie uma mesma mensagem para um conjunto de objetos e que cada objeto responda de maneira diferente em função da mensagem recebida.

O polimorfismo para ser implementado exige a utilização do conceito de herança e aplica-se apenas aos métodos da classe. O protocolo de comunicação é estabelecido na classe mais alta da hierarquia, que será herdada por todas as subclasses definidas posteriormente. Este mecanismo cria um protocolo padrão de comunicação com um conjunto de objetos, permitindo uma grande flexibilidade na agregação de objetos semelhantes, mas não idênticos.

Em programas que não utilizam orientação por objetos, sempre que uma nova funcionalidade deve ser acrescentada, a aplicação deve ser alterada e recompilada. Com o conceito de polimorfismo, é possível acrescentar novos métodos a classes já existentes sem a necessidade de recompilar a aplicação. Isto é possível através da técnica de "late binding" ou "dynamic binding", que permite que novos métodos sejam carregados e ligados (binding) à aplicação em tempo de execução.

Concluindo, baseado nos conceitos de objetos, classes, encapsulamento, herança e polimorfismoo, o paradigma da OO representa uma forma evolucionária de pensar e desenvolver software, trazendo inúmeros benefícios à criação de programas, dentre os quais o mais notável é a reutilização de código, que reduz drasticamente os tempos de desenvolvimento e manutenção de programas.

Referências:
http://www.dca.fee.unicamp.br/cursos/POOCPP/node3.html
http://www.oopucbetim.blogspot.com/

Object-Oriented Programming: An Introduction
Greg Voss, McGraw-Hill, 1991.


Object-Oriented Software
Ann L. Winblad, Samuel D. Edwards & David R. King
Addison-Wesley, 1990.


Postado por Daruich Darquian Campidelli e Rafael Cardoso de Araújo

quinta-feira, 23 de abril de 2009

Linguagem Programação Funcional

Linguagem de Programação funcional

Programação funcional é um paradigma de programação que trata a computação como uma avaliação de funções matemáticas e que evita estados ou dados mutáveis. Ela enfatiza a aplicação de funções, em contraste da programação imperativa, que enfatiza mudanças no estado do programa.Uma função, neste sentido, pode ter ou não ter parâmetros e um simples valor de retorno. Os parâmetros - ou argumentos, como às vezes são chamados - são os valores de entrada da função, e o valor de retorno é o resultado da função. A definição de uma função descreve como a função será avaliada em termos de outras funções. Por exemplo, a função f(x) = x2 + 2 é definida em termos de funções de exponenciação e adição. Do mesmo modo, a linguagem deve oferecer funções básicas que não requerem definições adicionais.Linguagens de programação funcionais, especialmente as puramente funcionais, tem sido mais usadas academicamente que no desenvolvimento comercial de software. Entretanto, algumas linguagens notáveis usadas na indústria e no comérico incluem Erlang (aplicações concorrentes), R (estatística), Mathematica (matemática simbólica) J e K (análise financeira) e XSLT. Importantes influências na programação funcional foram o cálculo lambda, as linguagens de programação APL e Lisp, e mais recentemente ML e Haskell.DesenvolvimentoAs funções podem ser manipuladas em uma grande variedade de formas em uma linguagem de programação funcional. As funções são tratadas como valores de primeira importância, o que é o mesmo que dizer que funções podem ser parâmetros ou valores de entrada para outras funções e podem ser os valores de retorno ou saída de uma função. Então podemos entender paradigma funcional como um mapeamento dos valores de entrada nos valores de retorno, através de funções. Isso permite que funções como mapcar em LISP e map em Haskell que tomam ambos uma função e uma lista como entrada e aplicam a função de entrada a cada elemento da lista. Funções podem ser nomeadas, como em outras linguagens, ou definidas anonimamente (algumas vezes durante a execução do programa) usando uma abstração lambda e usadas como valores em outras funções. Linguagens funcionais também permitem que funções sejam do tipo Curry. Currying é uma técnica para reescrita de funções com múltiplos parâmetros como a composição de funções de um parâmetro. A função do tipo Curry pode ser aplicada apenas a um subconjunto de seus parâmetros. O resultado é uma função onde os parâmetros neste subconjunto são agora fixados como constantes, e os valores do resto dos parâmetros ainda não são especificados. Esta nova função pode ser aplicada aos parâmetros restantes para obter o valor da função final. Por exemplo, uma função adiciona(x,y) = x + y pode ser do tipo Curry de forma que o valor de retorno adiciona(2) - note que que não há um parâmetro y - será uma função anônima, o que é equivalente à função adiciona2(y) = 2 + y. Esta nova função tem apenas um parâmetro e corresponde a adicionar 2 a um número. Novamente, isso é apenas possível porque as funções são tratadas como valores de primeira importância.O cálculo lambda pode ser considerado a primeira linguagem de programação funcional, embora nunca tenha sido projetada para ser realmente executada em um computador. É um modelo de computação projetado por Alonzo Church nos anos 1930 que oferece um modo muito formal de descrever um cálculo de uma função. A primeira linguagem de programação funcional criada para computadores foi o LISP, desenvolvida por John McCarthy no Instituto de Tecnologia de Massachusetts (MIT) no fim dos anos 1950. Mesmo não sendo uma linguagem de programação puramente funcional, o LISP introduziu a maioria das características hoje encontradas nas modernas linguagens de programação funcional. Scheme foi uma tentativa posterior de simplificar e melhorar o LISP. Nos anos 1970 a linguagem ML foi criada pela Universidade de Edimburgo, e David Turner desenvolveu a linguagem Miranda na Universidade de Kent. A linguagem Haskell foi lançada no fim dos anos 1980 em uma tentativa de juntar muitas idéias na pesquisa de programação funcional.Contraste com a programação imperativaA programação funcional pode ser contrastada com a programação imperativa. Na programação funcional parecem faltar diversas construções freqüentemente (embora incorretamente) consideradas essenciais em linguagens imperativas, como C ou Pascal. Por exemplo, em uma programação estritamente funcional, não há alocação explícita de memória, nem declaração explícita de variáveis. No entanto, essas operações podem ocorrer automaticamente quando a função é invocada; a alocação de memória ocorre para criar espaço para os parâmetros e para o valor de retorno, e a declaração ocorre para copiar os parâmetros dentro deste espaço recém-alocado e para copiar o valor de retorno de volta para dentro da função que a chama. Ambas as operações podem ocorrer nos pontos de entrada e na saída da função, então efeitos colaterais no cálculo da função são eliminados. Ao não permitir efeitos colaterais em funções, a linguagem oferece transparência referencial. Isso assegura que o resultado da função será o mesmo para um dado conjunto de parâmetros não importando onde, ou quando, seja avaliada. Transparência referencial facilita muito ambas as tarefas de comprovar a correção do programa e automaticamente identificar computações independentes para execução paralela.Laços, outra construção de programação imperativa, está presente através da construção funcional mais geral de recursividade. Funções recursivas invocam-se a si mesmas, permitindo que uma operação seja realizada várias vezes. Na verdade, isso prova que laços são equivalentes a um tipo especial de recursividade chamada recursividade reversa. Recursividade em programação funcional pode assumir várias formas e é em geral uma técnica mais poderosa que o uso de laços. Por essa razão, quase todas as linguagens imperativas também a suportam (sendo Fortran 77 e COBOL exceções notáveis).




BIBLIOGRÁFICAS REFERÊNCIAS:

www.inf.ufsc.br/~barreto/trabaluno/PFscheme.pdf
www.inf.ufrgs.br/aulas/mlp/slides/TopicosFuncional.pdf
www.cefet-rj.br/extensao/deac/semana_de_extensao/documentos/CICLO_PALESTRA
www.grupos.com.br/group/lisp

sexta-feira, 17 de abril de 2009

::: Arrays e Ponteiros :::

Ponteiros

Um ponteiro ou apontador é um tipo de dado usado em uma linguagem de programação onde o valor se refere diretamente a um endereço de memória.
Um endereço de memória, ou seja, o que em termos práticos transforma toda a memória em um grande vetor. Com isso é possível obter do sistema o valor armazenado na unidade de memória de tal endereço. O ponteiro é um tipo de dado que armazena um endereço de memória.
A figura abaixo mostra um mapa de um trecho de memória que contém duas variáveis (num, res) inteiras de tipo longo (4 bytes cada uma). Observar que os endereços estão pulando de quatro em quatro já que as variáveis são inteiras de tipo longo. Uma possível declaração destas variáveis dentro de um programa C poderia ser:

long int num=10, res=120;
Endereços Conteúdo Variável
996 --- ---
1000 10 num
1004 120 res



Mapa de Memória



Ponteiros são importantes por exemplo quando se deseja que uma função retorne mais de um valor.
Por exemplo, uma função pode receber não os valores dos parâmetros mas sim ponteiros que apontem para seus endereços. Assim esta função pode modificar diretamente os conteúdos destas variáveis.
Uma outra aplicação importante de ponteiros é apontar para áreas de memória que são administradas durante a execução do programa. Com ponteiros é possível alocar as posições de memória necessárias para armazenamento de vetores somente quando o programa estiver rodando. O programador pode reservar o número exato de posições que o programa requer.
Na maioria das arquiteturas, um ponteiro é grande o suficiente para indexar todas as unidades de memória presentes no sistema. Isso torna possível a um programa tentar acessar um endereço que corresponde a uma área inválida ou desautorizada da memória, o que é chamado de falha de segmentação. Por outro lado, alguns sistemas possuem mais unidades de memória que endereços. Nesse caso, é utilizado um esquema mais complexo para acessar diferentes regiões da memória, como o de segmentação ou paginação.
Na maioria das linguagem (C, C++, …) os ponteiros são diretamente suportados sem restrições. São utilizados para construir referências como listas encadeadas, grafos ou arvores.
Através da manipulação de ponteiros podemos lidar com arranjos, um cálculo do endereço para o elemento desejado no arranjo. Em outras estruturas de dados como as listas encadeadas, eles são usados como referencia para intercalar cada elemento da estrutura com seus vizinho.
Ponteiros também são utilizados para simular a passagem de parâmetros por referência em linguagens que não oferecem essa construção. Linguagens como C, C++ e D permitem que ponteiros possam ser utilizados para apontar para funções, os ponteiros são necessários para a alocação dinâmica de memória, sendo que temos uma melhora no desempenho, pois é muito mais rápido alocar um ponteiro para um objeto de memória já existente do que alocar o objeto inteiro novamente. Além do mais, alocando o objeto novamente não podemos alterar o original.
Em algumas linguagens e possível restringir o ponteiro para apenas um tipo de dados como por exemplo um inteiro. A linguagem tentara impedir que o programador erre durante a codificação apontando para outro tipo de dado. Outras já aceitam a conversão de dados com isso não restringem a um tipo de dados.
Para se usar o ponteiro deve se ter muito cuidado pois ele pode acessar áreas de memórias que não devem ser alteradas ou não pertencem aquela função do programa. Outro problema com os ponteiro que enquanto são manipulados como números, podem apontar para endereços não utilizados, ou para dados que estão sendo usados para outros propósitos.
Existem dois operadores especiais para ponteiros: * e &. Os dois operadores são unários, isto é requerem somente um operando. O operador & devolve o endereço de memória do seu operando. O operador * é o complemento de &. O operador * devolve o valor da variável localizada no endereço que o segue. O operador * para ponteiros não tem nada a ver com o operador multiplicação. O operador ponteiro * é unário e, como o operador &, tem precedência maior que do que todos os operadores aritméticos.
Ponteiros e Vetores estão fortemente relacionados na linguagem C. O nome de um vetor é um ponteiro que aponta para a primeira posição do vetor e todas as operações já mencionadas para ponteiros podem ser executadas com um nome de vetor.
Em uma matriz o ponteiro aponta para uma área de memória que é endereçada de maneira linear. Deste modo, é necessário mapear o endereço de cada elemento na matriz, que é dado por linha coluna, em um endereço linear.






Arrays

Arrays são dividos em dois tipos básicos, vetor e matriz. Um vetor consiste em um array de apenas uma dimensão.

exemplo de vetor: [10,20,30,...,99].

Com o exemplo anterior ao requisitar o item (3) obteriamos o valor 30.


Uma matriz, por sua vez apresenta mais de uma dimensão.

exemplo: |01, 02, 03, ...,09|
|10, 20, 30, ..., 99|

Para acessar um determinado item desta matriz é necessário informar dois argumentos. Com exemplo anterior, ao requisitarmos o item (2)(1) obteriamos o valor 10.

Acessa ai...

ai galera fiz um blogger acessam la.
abraços.

http://infoservicevirtual.blogspot.com/