Paradigmas

13
Segurança da Informação Senac Projeto elaborado por Thiago Morais Agosto/2012 Paradigmas de Programação

Transcript of Paradigmas

Page 1: Paradigmas

Segurança da InformaçãoSenac

Projeto elaborado por Thiago Morais

Agosto/2012

Paradigmas de

Programação

Page 2: Paradigmas

Computadores são operados por sequências de instruções chamadas “código de máquina”.

Esse código é endereçado ao hardware e é escrito em notação binária, usando apenas 0’s e 1’s.

Gottfried Leibniz (1646-1716), matemático alemão que aperfeiçoou o sistema binário

moderno.

... E no começo,...

50nm Transistor

2000x menor que o

diâmetro de um !o de

cabelo. O processador de 10 cores Xeon Westmere-EX da Intel possui 2.6 bilhões de

transistores como os da

foto ao lado.

Page 3: Paradigmas

Linguagens de primeira geração requerem longas sequências de números binários para representar operações como “adicionar”, “subtrair” e “comparar.” Melhoramentos posteriores permitiram as representações octais, decimais e hexadecimais de sequências binárias.

Primeira Geração

8B542408 83FA0077 06B80000 0000C383FA027706 B8010000 00C353BB 01000000B9010000 008D0419 83FA0376 078BD98B

C84AEBF1 5BC3

ENIAC - 1946 - Primeiro “computador” eletrônico. Ocupava 167 m2 e pesava 27

toneladas. O processo de programação do ENIAC envolvia manipular cabos e switches.

Números Fibonacci: Sequência de números, iniciada pelos números 0 e 1, onde cada número subsequente é a soma dos dois

últimos números. (0,1,1,2,3,5,8,13,21,34,55,89,144,...)

Exemplo: Função em código de máquina x86 32-bits para calcular o “enésimo”

número Fibonacci

Page 4: Paradigmas

AssemblyLinguagem de baixo nível, diferente em cada arquitetura (x86, SPARC, ARM, etc.).

Menos complicada de compreender do que “código de máquina”.

Mais utilizada em situações especí!cas:- Software para BIOS;- Sistema !y-by-wire para aviões;- Firmware para smartphones;- Engenharia reversa;- Gerenciador de boot GRUB (2,8% do código desenvolvido em Assembly).

EDSAC - 1949 - Primeiro “computador” capaz de rodar

um assembler primitivo.

Segunda GeraçãoExemplo: Código em Linguagem

Assembly para calcular o “enésimo” número Fibonacci

fib: mov edx, [esp+8] cmp edx, 0 ja @f mov eax, 0 ret @@: cmp edx, 2 ja @f mov eax, 1 ret @@: push ebx mov ebx, 1 mov ecx, 1 @@: lea eax, [ebx+ecx] cmp edx, 3 jbe @f mov ebx, ecx mov ecx, eax dec edx jmp @b @@: pop ebx ret

Page 5: Paradigmas

- Linguagens de Terceira Geração ou de Alto Nível foram inicialmente criadas no !nal da década de 50;- Possuem uma estrutura mais fácil de ler, programar e manter. São mais próximas à linguagem humana e mais distantes à linguagem de máquina;- Propiciam ao programador a desenvolver programas que são um pouco mais independentes de plataforma;- Um programa em Java pode rodar em várias arquiteturas (X86-64, IA-32, SPARC e ARM) e em vários sistemas operacionais (Windows, Linux, Mac OSX, Solaris).

A versão do Unix para o PDP-11 (acima) foi desenvolvido em Assembly. Em 1973, a

linguagem C se tornou madura o su!ciente e uma grande parte do kernel do Unix foi

reescrito em C.

Terceira GeraçãoExemplo: Código em Linguagem

C para calcular o “enésimo” número Fibonacci

unsigned int fib(unsigned int n){ if (n <= 0) return 0; else if (n <= 2) return 1; else { int a,b,c; a = 1; b = 1; while (1) { c = a + b; if (n <= 3) return c; a = b; b = c; n--; } }}

Sobre a fotoDireita: Dennis Ritchie, criador da linguagem C.

Esquerda: Ken Thompson. Ele e Dennis Ritchie criaram o sistema operacional Unix.

Page 6: Paradigmas

Qual é a mais fácil de entender?Código em Linguagem C para calcular

o “enésimo” número Fibonacci Código em Linguagem Assembly

(MASM) para calcular o “enésimo” número Fibonacci

fib: mov edx, [esp+8] cmp edx, 0 ja @f mov eax, 0 ret @@: cmp edx, 2 ja @f mov eax, 1 ret @@: push ebx mov ebx, 1 mov ecx, 1 @@: lea eax, [ebx+ecx] cmp edx, 3 jbe @f mov ebx, ecx mov ecx, eax dec edx jmp @b @@: pop ebx ret

Função em código de máquina x86 32-bits para calcular o “enésimo” número

Fibonacci

8B542408 83FA0077 06B80000 0000C383FA027706 B8010000 00C353BB 01000000B9010000 008D0419 83FA0376 078BD98B

C84AEBF1 5BC3

unsigned int fib(unsigned int n){ if (n <= 0) return 0; else if (n <= 2) return 1; else { int a,b,c; a = 1; b = 1; while (1) { c = a + b; if (n <= 3) return c; a = b; b = c; n--; } }}

Page 7: Paradigmas

Linux Kernel - Linguagens

Linhas de programação no Kernel 3.6-rc1,separadas por linguagem.

Ferramenta de Estatística usada:SLOCCount 2.26

Page 8: Paradigmas

Paradigmas de programação são estilos fundamentais de programação em computadores.

As principais categorias são:

- Estruturada;- Orientada a Objetos;- Funcional;- Lógica.

De"nição

Page 9: Paradigmas

- Estruturada: Paradigma designado a melhorar a “claridade”, qualidade e tempo de desenvolvimento de um programa de computador, através do uso extensivo de subrotinas, estruturas de bloco e loops while e for.

- Orientada a objetos: Um programa baseado neste paradigma pode ser visto como uma coleção de objetos que se interagem. Cada objeto é capaz de enviar mensagens, processar dados e enviar mensagens a outros objetos. Utiliza técnicas como encapsulamento, polimor!smo e herança.

Categorias (1)

Popularidade das principais linguagens de programação nos últimos 10 anos, de acordo com o índice TIOBE

Page 10: Paradigmas

- Funcional: Paradigma que usa avaliação de expressões, resultando em um código com menos linhas, mais “limpo” e mais fácil de entender. Tem as origens de uma disciplina puramente matemática: A teoria das funções.

- Lógica: Drasticamente diferente dos outros três paradigmas. Encaixa perfeitamente bem ao ser aplicado em problemas que lidam com a extração de conhecimento baseado em fatos e relações básicas. Em seu amplo senso, é aplicado o uso de matemática lógica. Geralmente associada com inteligência arti!cial e linguística computacional.

Categorias (2)Código em Linguagem C++ para calcular números Fibonacci

Código em Linguagem Haskell para calcular números Fibonacci

int fibonacci(int iterations) { int first = 0, second = 1; // seed values for (int i = 0; i < iterations - 1; ++i) { int sum = first + second; first = second; second = sum; } return first;} int main() { std::cout << fibonacci(10) << "\n"; return 0;}

fibRecurrence first second = first : fibRecurrence second (first + second)fibonacci = fibRecurrence 0 1main = print (fibonacci !! 10)

Page 11: Paradigmas

EstruturadaC, COBOL, FORTRAN, BASIC

Orientada a ObjetosC++, Delphi, Java, VB.NET, C#

FuncionalISLISP, Erlang, Haskell, Scala

LógicaProlog, Oz, Mercury

11

Exemplos

Page 12: Paradigmas

Uma linguagem de programação pode ter suporte a múltiplos paradigmas.

Por exemplo, programas criados em C++ ou Object Pascal podem ser:

- Puramente estruturados OU- Puramente orientados a objeto OU- Conter elementos de ambos.

A livre decisão de usar um ou outro paradigma é por conta do programador(Contanto que a linguagem tenha suporte).

Múltiplos Paradigmas

Page 13: Paradigmas

http://en.wikipedia.org/wiki/Programming_paradigmhttp://en.wikipedia.org/wiki/Object-oriented_programminghttp://people.cs.aau.dk/~normark/prog3-03/html/notes/paradigms_themes-paradigm-overview-section.htmlhttp://en.wikipedia.org/wiki/Functional_programminghttp://en.wikipedia.org/wiki/Category:Logic_programming_languageshttp://en.wikipedia.org/wiki/Imperative_programminghttp://en.wikipedia.org/wiki/Binary_numeral_systemhttp://en.wikipedia.org/wiki/Gottfried_Wilhelm_Leibnizhttp://www.infoplease.com/ce6/sci/A0860535.htmlhttp://en.wikipedia.org/wiki/Fibonacci_numberhttp://www.davidsalomon.name/assem.advertis/asl.pdf (Página 7)http://en.wikipedia.org/wiki/Electronic_Delay_Storage_Automatic_Calculatorhttp://en.wikipedia.org/wiki/ENIAChttp://nookkin.com/content/why-computers-use-binary.phphttp://www.dabeaz.com/consulting.htmlhttp://en.wikipedia.org/wiki/Second-generation_programming_languagehttp://en.wikipedia.org/wiki/Third_generation_languagehttp://en.wikipedia.org/wiki/C_(programming_language)http://en.wikipedia.org/wiki/Transistor_counthttp://www.intel.com/about/companyinfo/museum/exhibits/sandtocircuits/index.htmhttp://www.arm.com/products/tools/software-tools/rvds/arm-compiler.phphttp://en.wikipedia.org/wiki/Java_(software_platform)http://en.wikipedia.org/wiki/Machine_codehttp://en.wikipedia.org/wiki/List_of_assemblershttp://en.wikipedia.org/wiki/Assembly_languagehttp://en.wikipedia.org/wiki/Structured_programminghttp://en.wikipedia.org/wiki/Object-oriented_programminghttp://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Fontes