BC & T Universidade Federal do ABC Hardware está associado à parte física do sistema (os circuitos e dispositivos) que suporta o processamento da informação Software corresponde ao conjunto de programas responsáveis pelo controle do sistema para a execução das tarefas consideradas •Tipos de software: • Software de sistema, ou sistema operacional • Software aplicativo •Editores de texto: Word, WordPerfect, etc •Planilhas eletrônicas: Excel, Lotus 123, QuatroPro, etc •Apresentação: PowerPoint, etc •Desenho: CorelDraw, etc Um Sistema Operacional (SO) é uma camada de software colocada entre o hardware e os programas aplicativos e o usuário. Sua função principal é controlar o funcionamento do computador, como um gerente dos diversos recursos disponíveis no sistema Editor de Texto Planilha Eletrônica Jogos Compiladores Sistema Operacional Hardware • Funções Básicas de um Sistema Operacional: • Comunicação usuário x computador • Gerenciamento do hardware • Manutenção e gerenciamento dos sistemas de arquivos • Exemplos de SOs: • Windows • Linux • MS-DOS • Unix • Macintosh, Solaris, OS/2 • Software aplicativo: programas desenvolvidos ou adquiridos pelos usuários para algum fim específico. Podem ser de natureza: • profissional, • educacional ou • mesmo de lazer; E como são construídos/desenvolvidos softwares? Software corresponde ao conjunto de programas responsáveis pelo controle do sistema para a execução das tarefas consideradas No dia-a-dia os termos software e programa são usados como sinônimos Linguagens de programação são utilizadas para a construção de programas em computadores • Linguagem de Programação pode ser definida como: • conjunto limitado de símbolos e comandos, utilizados para criar programas, • por meio dela se estabelece uma comunicação com o computador, fazendo com que ele compreenda e execute o que o programador determinar; Uma linguagem (natural ou de programação) é formada por: • • Sintaxe • Semântica Sintaxe determina regras de como se escreve de forma correta em uma linguagem (regras de escrita) Os seguintes países fazem parte do Mercosul: Brasil, Argentina, Paraguai, Uruguai e Venezuela Frase sintaticamente correta O Brasil está localizado na América Central Frase sintaticamente correta Os serguintes países faz parte do Mercosul: Brasil, Argentina, Paraguai, Uruguai e Venezuela Frase sintaticamente incorreta Se você escrever a palavra “seguintes" com a letra "r" (serguintes), este é um erro sintático Se você não conjugar o verbo com o sujeito em uma frase, terá um outro erro sintático Em linguagem natural a sintaxe é conhecida como Gramática • Considere o comando para a criação e declaração de uma variável, em Java int idade; • Considere o comando para a atribuição de valor à uma variável, em Java • idade = 10; Estes comandos estão sintaticamente corretos, na linguagem de programação Java idade idade 10 Considere o comando para a criação e declaração de uma variável, em Java Int idade; Erro: Int int idade Erro: Falta ; • Considere o comando para a atribuição de valor à uma variável, em Java •idade := 10; Erro: := •idade = 10 Erro: Falta ; Estes comandos estão sintaticamente incorretos, na linguagem de programação Java Durante o início do aprendizado de uma linguagem de programação, é natural demorar muito tempo procurando erros de sintaxe, • Conforme o programador ganhar experiência, entretanto, cometerá menos erros e os encontrará mais rapidamente; • Semântica estuda o significado das palavras ou frases Semanticamente corretas Considere as frases: - O Sol é uma estrela - Na Física Quântica há o conceito de superposição - Aquela manga é azul - Vi uma pessoa no parque com binóculo - Tem dia que de noite é assim mesmo - Pá daqui, pá dali Depende... Semanticamente incorretas • Considere os comandos, em Java •int idade; •idade = 10; Comandos sintática e semanticamente corretos • Considere os comandos, em Java •int idade; •idade = 10.7; Comando de atribuição semanticamente incorreto • Há erros de semântica relacionados ao raciocínio/lógica do programa, • Para este tipo de erro, o programa vai executar com sucesso, no sentido de que o computador não irá gerar quaisquer mensagens de erro, • Mas ele não fará a coisa certa. Fará exatamente o que o programador mandar • A proximidade que a linguagem de programação tem com a humana determina sua classe (o nível): • Linguagem de máquina (primeira geração) • Linguagem assembly - de montagem (segunda geração) • Linguagem de alto nível (terceira geração) • Linguagem de muito alto nível (quarta geração) • Linguagem de máquina é o código que o computador executa diretamente, • É composta de 0´s e 1´s, e neste caso é conhecida como linguagem binária, • A linguagem de máquina é escrita de acordo com as características de um determinado processador, • Por isto é totalmente dependente do hardware, e do fabricante do processador; • Instruções de linguagem de máquina são representadas por códigos na forma de palavras binárias. Por exemplo: •0100010100011101010101000010010 101... LINGUAGEM DE MÁQUINA – HEXADECIMAL Exemplo de programa em hexadecimal Execução direta pela máquina, sem tradução • Linguagem Hexadecimal: seqüência de bits pode ser representada por números hexadecimais •Notação em hexadecimal • 1011000000000001b = B001h Programação impraticável para escrita e leitura (mesmo com hexadecimal)... O que fazer?? • A linguagem assembly (linguagem de montagem) permite que o programador utilize nomes (chamados mnemônicos) e símbolos em lugar dos números, • Utiliza palavras abreviadas (mnemônicos) indicando operações •MOV R1, R2 • mnemônico MOV (abreviação de MOVE) • dois registradores como parâmetros: R1 e R2 • processador comanda o movimento do conteúdo de R2 para R1 • equivalente à instrução Java R1 = R2; ADD R1, R2 • mnemônico ADD (abreviação de ADDITION) • dois registradores como parâmetros: R1 e R2 • processador comanda a adição do conteúdo de R1 ao conteúdo de R2 e o resultado é armazenado em R1 • equivalente à instrução em Java R1=R1+R2; •Simplificações da linguagem assembly: • escolhe nomes descritivos para as posições de memória, • usa mnemônicos para representar códigos de operação; • A conversão da linguagem assembly para a linguagem de máquina se chama montagem • E é feita por um programa chamado montador (ou assembler) Linguagem de Montagem (Assembly) Programa Montador (Assembler) Linguagem de Máquina • A linguagem assembly é também única para cada tipo de CPU (processador), • Utiliza instruções de baixo nível que operam com registros e memórias diretamente, • Não pode ser reutilizada em famílias de processadores diferentes, • Famílias geralmente mantém um certo nível de interoperabilidade •Família x86 processador Pentium suporta o assembly do 80486, que suporta o do 80386...; • Aplicações para a linguagem assembly: • Controle de processos com resposta em tempo real • devido à possibilidade de gerar programas mais eficientes • Comunicação/transferência de dados: • devido à possibilidade de acessar diretamente o hardware • Otimização de sub-tarefas da programação de alto nível • um programa não precisa somente ser escrito em linguagem assembly ou linguagem de alto nível • Linguagens de alto nível apresentam uma sintaxe mais próxima da linguagem natural , • Usam palavras reservadas extraídas do vocabulário corrente (int, public, if, ...) class HelloWorld { public static void main (String[] args) { System.out.println (“HelloWorld”); } } Permitem a manipulação dos dados nas mais diversas formas: • números inteiros, •reais, •matrizes, etc... • A linguagem assembly trabalha com bits e bytes, armazenados em memória; • • Algumas linguagens de programação, e o ano em que foram desenvolvidas: • Os programas escritos nessas linguagens são convertidos para a linguagem de máquina através de um programa compilador, ou de um interpretador Linguagem de Alto Nível Compilador ou interpretador Linguagem de Máquina • As linguagens de quarta geração têm uma estrutura mais próxima da linguagem humana do que as linguagens de programação de alto nível • Definem “o que” deve ser feito, e não “como” deve ser feito • Como exemplo de linguagens de quarta geração tem-se: • linguagens de consulta a banco de dados, • linguagens de prototipação (ferramentas case); Linguagens de Consulta As linguagens de consulta foram desenvolvidas para manipular bases de dados. Exemplo: linguagem SQL Apresenta os dados dos campos nome e telefone da tabela Funcionario: select nome, telefone FROM Funcionario; Computadores atuais são capazes de executar somente programas em uma linguagem de nível baixo, a linguagem de máquina Linguagem de Alto Nível (Código Fonte) Análise sintática e semântica class HelloWorld { public static void main (String[]args) { System.out.println(“HelloWorld”); } } Linguagem de Máquina (Código Executável) Execução Como fazer esta tradução? Do código fonte para o código executável? Linguagem de Alto Nível (Código Fonte) Análise sintática e semântica class HelloWorld { public static void main (String[]args) { System.out.println(“HelloWorld”); } } Linguagem de Máquina (Código Executável) Execução Compilação e interpretação são os processos pelos quais o código fonte é traduzido em código de máquina Há ainda a possibilidade de uma mescla das duas (em um sistema híbrido), como é o caso da linguagem Java; Código Fonte Análise sintática e semântica Código Executável Zeros e uns... Estas análises são feitas em cada linha por vez 1. class HelloWorld{ 2. public static void main(String[] args) { Execução linha 1 Execução linha 2 1. class HelloWorld{ Execução linha 1 2. public static void main(String[] args) { Execução linha 2 • As ações indicadas pelos comandos da linguagem são diretamente executadas • Existe, para executar cada ação possível, um subprograma (escrito na linguagem de máquina do computador hospedeiro) • Um interpretador é um programa que executa repetidamente a seguinte seqüência: • Obter o próximo comando do programa • Determinar que ações devem ser executadas • Executar estas ações • Características do processo de interpretação: • Não gera um arquivo de código executável • Toda a vez que for executar o programa, terá que ler o código fonte • É necessário ter o interpretador na máquina onde o código fonte foi desenvolvido, bem como onde o código fonte será executado • É independente de plataforma Código Fonte Análise sintática e semântica Estas análises são feitas em todo o código fonte, para depois gerar o código executável class HelloWorld { public static void main (String[]args) { System.out.println(“HelloWorld”); } } Código Executável Zeros e uns... Código Fonte Análise sintática e semântica Código Executável Zeros e uns... Programas escritos em linguagem de alto nível são compilados para versões equivalentes em linguagem de máquina, antes de serem executados INTERPRETAÇÃO Vantagens Desvantagens Não gera um arquivo de código executável; é comum que gere bytecode Toda vez que for executar o programa, terá que ler o código fonte. É independente de plataforma (desde que o próprio interpretador tenha sido portado) Quando comparada com a compilação, a primeira vez da execução de uma interpretação é mais rápida. Mas as demais execuções serão mais lentas É necessário ter o interpretador na máquina onde o código fonte foi desenvolvido, bem como onde o código fonte será executado • Características do processo de compilação: • A primeira vez que for executar um programa será relativamente demorado, pois será necessário compilá-lo, • Mas nas próximas execuções, será mais rápido • Gera código executável, • Como gera o executável, não é necessário recompilar novamente para executar o programa; • Características do processo de compilação (cont): • É preciso ter um compilador na máquina onde se desenvolve o programa, mas não onde ele é executado • É dependente de plataforma, pois o código fonte gerado é preparado para rodar em uma plataforma específica (Windows, Linux, Apple, etc) COMPILAÇÃO Vantagens Desvantagens Gera código executável Como gera o executável, não é necessário recompilar novamente para executar o programa A primeira vez que for executar um programa será relativamente demorado, pois será necessário compilá-lo. Mas nas próximas execuções, será mais rápido É dependente de plataforma, pois o código de máquina gerado é preparado para rodar em uma plataforma específica COMPILAÇÃO Vantagens É preciso ter um compilador na máquina onde se desenvolve o programa, mas não onde ele é executado Desvantagens A linguagem HTML(HyperText Markup Language) é compilada ou interpretada? EXECUÇÃO Java é uma linguagem compilada e interpretada Código Fonte HelloWorld.java Compilador javac.exe Arquivo em bytecode HelloWorld.class Windows Java Virtual Machine (java.exe) Interpretador Linux Unix ..... BYTECODE (*.CLASS) Bytecode existe para garantir a portabilidade na linguagem Java Código Fonte HelloWorld.java Compilador javac.exe O Bytecode gerado pode ser transportado entre plataformas distintas que suportam Java Arquivo em (Solaris, Linux, Windows, etc) bytecode Esta portabilidade é importante, HelloWorld.class por exemplo, para a criação de aplicações para a Internet BYTECODE (*.CLASS) A compilação ocorre apenas uma vez Java Bytecode Java Bytecode Java Bytecode Java Bytecode Plataforma Java para Unix Java platform for Unix Unix Workstation Plataforma Java para Macintosh Java platform for Unix Plataforma Java para Windows Java platform for Unix PC Rodando Windows Plataforma Java para OS/2 Java platform for Unix PC Rodando OS/2 Macintosh Código Fonte HelloWorld.java Compilador javac.exe . . . Arquivo em bytecode HelloWorld.class JAVA – INTERPRETAÇÃO JAVA – COMPILAÇÃO E INTERPRETAÇÃO JAVA – COMPILADORES JIT As primeiras JVM apenas interpretavam. E por isto eram lentas Um programa Java típico era 10 vezes mais lento do que um programa compilado em código nativo Foram criados compiladores que rodam em tempo de execução (em conjunto com a JVM), denominados Just-In-Time (JIT) Os JITs traduzem/compilam partes de Bytecodes em código de máquina JAVA – COMPILADORES JIT As JVMs atuais analisam os Bytecodes à medida que são interpretados Procuram trechos que são executados com maior freqüência (hot spots) Um compilador JIT traduz os hot spots para linguagem de máquina nativa Quando a JVM encontra estas partes compiladas (hot spots), a execução é mais rápida PARADIGMAS DE PROGRAMAÇÃO Paradigmas de programação são maneiras de pensar utilizados pelos programadores para conceber um programa. Um paradigma é um padrão conceitual que orienta soluções de projeto e implementação, direcionando a resposta a questões tais como: O que é um programa? Como são modelados e escritos? • Um paradigma determina a visão que o programador tem da execução de um programa • Os paradigmas mais conhecidos são: • Paradigma estruturado, ou imperativo • Paradigma funcional • Paradigma declarativo, ou lógico • Paradigma orientado a objetos PARADIGMA ESTRUTURADO, IMPERATIVO Primeiro paradigma a surgir, e ainda é o dominante Implementado com base na máquina de Von Neumann Unidades de Entrada Entrada Dados - Memória -Processamento de Dados Programa Estado Unidades de Saída Resultados Saída PARADIGMA ESTRUTURADO, IMPERATIVO Entrada Programa Saída Estado (3) Executa a ação inicialmente solicitada (1) Busca próxima instrução (2) Decodifica a instrução PARADIGMA ESTRUTURADO, IMPERATIVO O programador descreve a resolução de um problema através de uma série de tarefas elementares (comandos), que o computador pode compreender e executar leia (num1) leia (num2) se (num1 > num2) então imprima (num1) senão imprima (num2 é igual ou maior a num1) PARADIGMA ESTRUTURADO, IMPERATIVO Ao final, a seqüência de comandos define a resolução do problema A programação é dada por uma seqüência de comandos que manipula um volume de dados leia (num1) leia (num2) se (num1 > num2) então imprima (num1) senão imprima (num2 é igual ou maior a num1) PARADIGMA ESTRUTURADO, IMPERATIVO Vantagens do paradigma imperativo: • Modelagem “natural” de aplicações do mundo real • Paradigma dominante e bem estabelecido Desvantagens do paradigma imperativo: • o gap semântico é maior; • Freqüentemente gera sistemas difíceis de serem mantidos: • As funções têm que conhecer a estrutura dos dados; • Mudanças na estrutura dos dados acarreta alteração em todas as funções relacionadas. PARADIGMA ESTRUTURADO, IMPERATIVO Exemplos de linguagens que suportam o paradigma imperativo: Fortran C Perl (*) Python (*) Pascal Lisp (*) (*) Também suportam outros paradigmas PARADIGMA FUNCIONAL Qualquer computação é formulada em termos de funções n1 + n2 (+ n1 n2) Funções são aplicadas aos parâmetros, e retornam um valor As variáveis são os parâmetros formais das funções PARADIGMA FUNCIONAL Exemplo da média de uma sequência de números: Divide( Soma(Numeros), Conta(Numeros) ) PARADIGMA FUNCIONAL Exemplos de linguagens que suportam o paradigma funcional: LISP (*) Haskell Miranda ML – Meta Language Ocaml Erlang (*) Lisp suporta vários paradigmas • No paradigma declarativo são declarados os resultados desejados, e não os procedimentos para se chegar ao resultado, • A partir disto o sistema deve encontrar o caminho para chegar até o resultado esperado, • Programar é fornecer dados da seguinte natureza: • axiomas (fatos incondicionais) • regras para derivação de outros fatos, para fazer perguntas ao computador PARADIGMA LÓGICO Cenário: Um computador que responda perguntas como se fosse um ser inteligente Perspectiva de um paradigma baseado no raciocínio: o que se quer, em vez de como atingi-lo No paradigma lógico, programar é fornecer dados da seguinte natureza: axiomas, que indicam alguns fatos sobre o mundo regras para derivação de outros fatos (inferência) PARADIGMA LÓGICO No modo de programação homem(socrates). %Socrates é um homem mortal(X):-homem(X). % Todos os homens são % mortais No modo de pergunta (execução) ?- mortal(socrates). Yes O programa deve ter um grande volume de informações, denominados de fatos, para que o sistema chegue à solução PARADIGMA LÓGICO Exemplos de linguagens que suportam o paradigma lógico: Prolog GPSS Mercury (*) (*) Mercury também suporta programação funcional • O programa é organizado em função de objetos, • Objeto é uma entidade independente com uma identidade e certas características próprias, • Um objeto contém não só as estruturas de dados, mas também as funções que sobre eles agem; nome nome idade lingua idade lingua andar() respirar() alimentar() falar() andar() respirar() alimentar() falar() A comunicação entre objetos é feita através de troca de mensagens Ola João!! Como você nome=Ita está? idade=39 lingua=Tupi/Port. Nome=Joao andar() respirar() alimentar() falar() idade=37 lingua=Port. andar() respirar() alimentar() falar() Linguagem de Máquina FORTRAN BASIC COBOL ALGOL APL LISP ML C ADA PASCAL Scheme GPSS Prolog SIMULA C++ Smaltalk IMPERATIVAS FUNCIONAIS DECLARATIVAS OU LÓGICAS Ada 95 Java ORIENTADAS A OBJETOS