Translate

sábado, 22 de março de 2014

Melhor jeito de ganhar dinheiro na internet

                                       TASKS
à algum tempo venho ganhando dinheiro com um site que encontrei em minhas persuisas pela
internet, o sistema de reconpensas do site ofereçe: pesquisas remuneradas 1,00 à 20,00 e PTC
* pago para clickar/pay to click
que paga 1.00 por click em geral são 20 pesquisas por semana e 10~30 PTCs por dia
o nome desse site é: tasks

- você poderá acessa-lo através desse link: http://CashTasks.com/?ref=43162

-ou por esse link aqui:

quinta-feira, 20 de março de 2014

Naruto Full burst

Naruto Shippuden: Ultimate Ninja Storm 3 Origem: Wikipédia, a enciclopédia livre. Naruto Shippuden : Ultimate Ninja Storm 3 Produtora CyberConnect2 Editora(s) Namco Bandai Games Designer Yusuke Sasaki,Chikayo Fukuda Plataforma(s) PlayStation 3, Xbox 360, Microsoft Windows Série Naruto: Ultimate Ninja (série) Data(s) de lançamento 8 de Março de 2013[Expandir] Gênero(s) Luta Modos de jogo Single-Player, Multiplayer Número de jogadores 1-2 Classificação Inadequado para menores de 12 anos i CERO (Japão) Inadequado para menores de 13 anos i ESRB (América do Norte) Inadequado para menores de 12 anos i PEGI (Europa) Inadequado para menores de 12 anos i USK (Alemanha) Média Disco Blu-ray(PS3), DVD-DL(Xbox 360) Controles DualShock 3(PS3), Gamepad (Xbox 360) Idioma Inglês, Japonês Último Último Naruto Shippuden: Ultimate Ninja Storm Generations Naruto Shippuden: Ultimate Ninja Storm Revolution Próximo Próximo Naruto Shippuden: Ultimate Ninja Storm 3, conhecido no Japão como Naruto Shippuden: Narutimate Storm 3 (ナルト- 疾風伝ナルティメットストーム3?), é um jogo eletrônico de luta desenvolvido pela CyberConnect2 como parte da série Ultimate Ninja, que é baseada no mangá Naruto. O jogo é a continuação de Naruto Shippuden: Ultimate Ninja Storm 2 e foi lançado pela Namco Bandai Games dia 5 de Março de 2013 na América do Norte, e dia 8 de Março de 2013 na Europa. No Japão o lançamento ocorreu dia 18 de Abril de 2013.1 Índice 1 Jogabilidade 2 Personagens Jogáveis 2.1 Personagens Suporte 3 Trajes para Download 3.1 Pré-Ordem 3.2 Europa/América do Norte 3.3 Pacote uniformes de escola 3.4 Pacote chapéus da Akatsuki 3.5 Roupas especiais 3.6 Pacote ROAD TO NINJA 3.7 Pacote Maiôs 3.8 Pacote chapéus de Kage 3.9 Sakura Hello Kitty 4 Desenvolvimento 5 Full Burst 6 Referências Jogabilidade O jogo conta com 80 personagens jogáveis e inclui alguns novos, fazendo este o jogo com a maior quantidade de personagens na série Ultimate Ninja.3 Foi anunciado que o sistema de luta seria modificado,4 com a possibilidade de se usar o modo Awakening, um estado que dá a cada personagem habilidades aprimoradas quando sua vida está baixa, a qualquer momento da luta para alguns personagens.5 Assim como nos jogos anteriores, o jogador pode escolher dois personagens para ajudá-lo durante a batalha. Agora, os personagens de suporte também pode ajudar o personagem jogável através da utilização de dois diferentes tipos de combinações. Diversos cenários tornaram-se interativos, fazendo com que o jogador perca automaticamente a luta se deixar uma área específica.6 O Modo História é similiar ao de Naruto: Ultimate Ninja Storm e Naruto Shippuden: Ultimate Ninja Storm 2, porém diferente do jogo anterior Naruto Shippuden: Ultimate Ninja Storm Generations, pois têm batalhas contra chefes que incluem quick time events e requer o uso de estratégias para derrotar o adversário.7 O enredo começa a partir do fim de Ultimate Ninja Storm 2, mas inicialmente é focado no ataque da Raposa de Nove Caudas a Vila da Folha com o jogador controlando os personagens que estão defendendo a vila. O jogo mostra os acontecimentos da guerra mundial adaptando a maioria dos episódios que já forão exibidos quando o jogo foi lançado.8 Também foi incluso o modo "Ultimate Decision", que dá a opção de alterar o resultado das batalhas, resultando em histórias alternativas.5 Adicionalmente, o jogo oferece um modo hack and slash no qual o jogador controla um personagem que tem que lutar com diversos inimigos. Sasuke Uchiha é personagem jogável neste modo.9 Personagens Jogáveis Uzumaki Naruto Nine-Tailed Rasengan/Wind Style: RasenShuriken/Modo Sennin/Rasengan Massivo/Bijuu Dama (Kyuubi 4 caudas) (Kyuubi 6 caudas) (Chakra das nove Caudas) Haruno Sakura Sai Hyuuga Neji (Byakugan) Rock Lee (Oito Portões) Tenten (Bashōsen) Nara Shikamaru Akimichi Choji Expansion Jutsu/Butterfly Mode Yamanaka Ino Nagato/Edo Tensei Uchiha Madara/Edo Tensei (Rinnegan) Tobi Rinnegan Homem Mascarado Juugo (Selo amaldiçoado nível 2) Karin Hozuki Suigetsu (Suika no Jutsu) Uchiha Sasuke Chidori True Spear/Kirin/Akatsuki/Reunião dos Cinco Kages/Mangekyou Sharingan Eterno (Selo amaldiçoado nível 2) (Mangekyou Sharingan) (Susanoo) Inuzuka Kiba Aburame Shino Hyuuga Hinata (Punho dos Leões Gêmeos) Hatake Kakashi (Sharingan) Yamato Maito Gai (Oito Portões) Sarutobi Asuma/Edo Tensei (Hien) Gaara (Modo Kazekage) Kankurou (Marionete Gigante) Temari Chiyo (10 Marionetes de Monzeamon) Tobi (Sharingan) Kakuzu (Jiongu) Hidan (Jashin) Sasori Sandaime Kazekage (Self-Puppet) Deidara/Edo Tensei (C2 Dragon) Hoshigaki Kisame Uchiha Itachi/Edo Tensei (Susanoo) Konan (Anjo de Papel) Pain O Primeiro Hokage: Hashirama Senju O Segundo Hokage: Tobirama Senju O Terceiro Hokage: Hiruzen Sarutobi Namikaze Minato Tsunade Jiraiya Hatake Kakashi Jovem Uchiha Obito Jovem Mifune Hanzo/Edo Tensei Fuu/Edo Tensei (Sete-Caudas) Utakata/Edo Tensei (Seis-Caudas) Han/Edo Tensei (Cinco-Caudas) Roshi/Edo Tensei (Quatro-Caudas) Yagura/Edo Tensei (Três-Caudas) Yugito/Edo Tensei (Duas-caudas) Haku/Edo Tensei Momochi Zabuza/Edo Tensei Yakushi Kabuto Clássico/Mestre das cobras/Modo Sennin (Exclusivo para Full Burst) Orochimaru Raikage Darui Tsuchikage Mizukage Killer Bee/Samehada (Oito-Caudas) Uzumaki Naruto Parte 1 (Kyuubi Uma-Cauda) Uchiha Sasuke Parte 1/Prova Chunin (Sharingan/Selo amaldiçoado nível 2) Haruno Sakura Parte 1 Hyuuga Neji Parte 1 (Byakugan) Rock Lee Parte 1 (Oito-Portões) Hyuuga Hinata Parte 1 (Byakugan) Gaara Parte 1 Kimimaro Personagens Suporte Kurotsuchi Akatsuchi Foo Torune Cee Ao Chōjūrō Trajes para Download Pré-Ordem Uzumaki Naruto Rasengan Massivo (traje de Goku) Europa/América do Norte Na América do Norte, os códigos necessários para o download são entregues à aqueles que se inscreverem na Weekly Shõnen Jump ou Neon Alley. Enquanto na Europa, receberam o código todos que fizeram a pré-ordem. Uzumaki Naruto Rasengan Massivo (Roupa de Samurai) Uchiha Sasuke Reunião dos Cinco Kages (Roupa de Kimono) Haruno Sakura (Uniforme de escola) Tsunade (Maiô) Itachi (ANBU) Pacote uniformes de escola Uzumaki Naruto Yamanaka Ino Hyuuga Hinata Hatake Kakashi Uchiha Sasuke Pacote chapéus da Akatsuki Deidara Uchiha Itachi Hoshigaki Kisame Pain Roupas especiais Uzumaki Naruto Bijuu Dama (Cowboy, Pirata, Toureiro, Gondoleiro, Kimono e Lederhosen) Uchiha Sasuke Mangekyou Sharingan Eterno (Roupa de Napoleão) Pacote ROAD TO NINJA Hatake Kakashi (ANBU) Yamato (ANBU) Jiraiya (Sannin) Tsunade (Sannin) Orochimaru (Sannin) Uchiha Madara (Décadas antes de morrer) Hyuuga Hinata (Road to Ninja) Uchiha Sasuke (Road to Ninja) Pacote Maiôs Haruno Sakura Yamanaka Ino Hyuuga Hinata Temari Tsunade Pacote chapéus de Kage Gaara Shimura Danzou Raikage Tsuchikage Mizukage Sakura Hello Kitty Haruno Sakura (Tema Hello Kitty) Desenvolvimento Anúncios de um novo jogo de Naruto foi mostrado pela primeira vez online através da revista Weekly Shōnen Jump, em junho de 2012 com a Namco Bandai Games confirmando que era Ultimate Ninja Storm 3.10 Juntamente com o anúncio oficial, Yusuke Sasaki da Namco Bandai prometeu melhorias em relação ao sistema de combate e o modo de história.11 A fim de tornar as áreas mais interativas, bem como adicionar mais estratégias para as lutas, a equipe de produção adicionou a opção "ring out", onde os personagens podem ser jogados para fora do campo de batalha.12 O modo história foi desenvolvido para ser acessível a pessoas que não estão familiarizados com a série.13 Hiroshi Matsuyama da CEO CyberConnect2 também prometeu o retorno de "batalhas épicas", que estavam ausentes em Naruto Shippuden: Ultimate Ninja Storm Generations.14 A Bandai promoveu grandes melhorias nos gráficos do jogo que foi mostrado no primeiro trailer que foi lançado em julho de 2012.15 Animações do jogo também foram inspirados no jogo Asura's Wrath, outro jogo desenvolvido pela empresa. Duas das roupas alternativas disponíveis para Naruto Uzumaki, uma roupa de samurai e a roupa de Goku foram baseados em ilustrações por Masashi Kishimoto publicadas em uma edição da Shonen Jump e em um artbook. As duas roupas atraíram o produtor Yuki Nishikawa que consultou outros membros da empresa, a fim de incluí-las no jogo.12 Em agosto de 2012, a CyberConnect2 abriu uma página de sugestões em seu site oficial, pedindo para jogadores de todo o mundo as suas opiniões sobre o que eles gostariam de ver no Ultimate Ninja Storm 3 e nos próximos jogos de Naruto.16 O feedback foi usado como referência na criação do jogo.12 No Comic-Con International de julho de 2012, representantes da Namco Bandai Games America confirmaram os planos para lançar o jogo em março de 2013 na América do Norte.17 As primeiras cópias do jogo irão incluir um código para baixar seis roupas exclusivas; roupa de Goku de Dragon Ball e uma roupa de samurai para Naruto Uzumaki, roupas do filme Road to Ninja para Hinata Hyuga e Sasuke Uchiha, um traje Kimono para Sasuke, roupa de banho para Sakura Haruno e Tsunade, um uniforme escolar japonês para Sakura, e a roupa de ANBU para Kakashi Hatake e Itachi Uchiha.18 19 A Namco Bandai confirmou em 15 de janeiro de 2013 que uma demo do jogo será lançado no Japão no início de fevereiro.1 A demo também foi lançada na América do Norte, Europa e Austrália, em 19 de fevereiro. A Namco Bandai Games confirmou que o jogo irá apresentar legendas em português brasileiro, a demo do jogo lançado na PlayStation Network e Xbox Live brasileira já apresenta legendas em português, isso só foi possível graças a uma campanha promovida pela produtora do jogo, a CyberConnect2, que pedia sugestões a jogadores do mundo inteiro para melhorar o título. A tradução para outros idiomas foi uma das mais pedidas.20 Full Burst Em comemoração ao grande número de vendas, a Namco Bandai anunciou em Julho que estavam desenvolvendo um novo conteúdo DLC para o jogo, e que o mesmo seria lançado em Outubro de 2013, para PS3 e Xbox 360, e pela primeira vez, para Microsoft Windows, cuja a mesma versão seria disponibilizada para download pago via Steam O complemento foi lançado dia 22 de Outubro de 2013 para os consoles, e dia 24 para o PC, para os consoles, o jogo está disponível em formato físico para quem não possui o Storm 3 Original, porém para quem já adquiriu o Storm 3, pode baixar o Full Burst como conteúdo adicional. A versão completa (Em mídia física para PS3/Xbox 360 e download para PC) contém todas as fantasias adicionais para os personagens, como a roupa de Goku para o Naruto Uzumaki e a roupa de Hello Kitty para a Sakura Haruno, enquanto na versão DLC vem somente o Kabuto no seu Modo Sennin de Dragão, além é claro, de sua Boss Battle contra os Irmãos Uchiha.

sexta-feira, 14 de março de 2014

Final Fantasy

Final Fantasy (ファイナルファンタジー, Fainaru Fantajī?) é uma franquia criada por Hironobu Sakaguchi, desenvolvida e melhorada pela Square Enix (antiga Square). A franquia possui como elementos principais a série de jogos electrónico de interpretação de papéis, incluí também filmes, animes, livros e outros elementos. A série começou em 1987 com o videojogo Final Fantasy, produzido numa altura que a Square atravessava grandes dificuldades financeiras, pelo que pensava tratar-se do seu último jogo. Contudo, o jogo foi um sucesso, pelo que salvou a empresa da falência e deu início a uma série. Desde então, a série de videojogos estendeu-se para outros géneros como role-playing game táctico, role-playing game de acção, massively multiplayer online role-playing game, corrida e tiro em terceira pessoa. Apesar da maioria dos títulos Final Fantasy terem enredos, lugares e elencos independentes, eles possuem elementos em comum que definem a franquia. Alguns desses elementos passam pela semelhança entre enredos, nomes das personagens e jogabilidade. Os enredos centram-se num grupo de heróis que enfrentam um grande inimigo, enquanto as personagens aprendem a lidar com os seus próprios conflitos internos e relações interpessoais. Os nomes das personagens normalmente derivam da história, línguas e mitologias de culturas de todo o mundo. A série tem sido comercialmente bem-sucedida, vendendo mais de 97 milhões de exemplares, bem-recebida pela crítica e detém sete recordes do Guinness. A série é reconhecida pela sua inovação, os gráficos, o uso de full motion videos, personagens foto-realistas, e a música orquestrada da autoria de Nobuo Uematsu e outros compositores. Final Fantasy tem sido uma força de inovação no mercado dos videojogos, influenciado a gestão da Square e a sua relação com outras produtoras de jogos electrónicos. Também foi responsável pela introdução de vários aspecto comuns em RPGs e é acreditada pela disseminação de RPGs nos mercados ocidentais. A maior competição da série provém do Dragon Quest, outra franquia da Square Enix. O primeiro jogo da série foi lançado no Japão a 18 de Dezembro de 1987. Os títulos subsequentes foram numerados e possuem uma história independente dos jogos anteriores; assim, os números referem-se mais a volumes do que a sequências. Muitos jogos do Final Fantasy foram adaptados para os mercados da América do Norte, Europa e Austrália para várias consolas, PC, e smartphones. A série conta com 28 jogos,1 incluindo os jogos da série principal, assim como as sequências directas e as spin-offs. A maioria dos títulos antigos foram refeitos ou relançados para múltiplas plataformas.

quarta-feira, 12 de março de 2014

Assembler

Assembly ou linguagem de montagem é uma notação legível por humanos para o código de máquina que uma arquitetura de computador específica usa, utilizada para programar dispositivos computacionais, como microprocessadores e microcontroladores. A linguagem de máquina, que é um mero padrão de bits, torna-se legível pela substituição dos valores em bruto por símbolos chamados mnemónicos1 2 . Por exemplo, enquanto um computador sabe o que a instrução-máquina IA-21 (10110000 01100001) faz, para os programadores é mais fácil recordar a representação equivalente em instruções mnemónicas MOV AL, 61h. Tal instrução ordena que o valor hexadecimal 61 (97, em decimal) seja movido para o registrador 'AL'. A conversão da linguagem de montagem para o código de máquina é feita pelo montador ou assembler, que é basicamente um tradutor de comandos, sendo mais simples que um compilador. o contrário do que acontece nas linguagens de alto nível, existe (até certo ponto) uma correspondência de 1 para 1 entre a linguagem de montagem simples e a linguagem de máquina. Por isso a tradução do código de montagem em código de máquina não é chamada compilação, mas montagem. Consegue-se transformar a linguagem de montagem em linguagem de máquina recorrendo a um montador (também chamado assembler, originado do termo assemblé em francês)[carece de fontes], e a transformação inversa faz-se recorrendo a um desmontador (também chamado disassembler). Cada arquitetura de computador tem a sua própria linguagem de máquina e, portanto, a sua própria linguagem de montagem. Essas linguagens de montagem diferem no número e tipo de operações que suportam. Também têm diferentes tamanhos e números de registradores, e diferentes representações dos tipos de dados armazenados. Enquanto todos os computadores de utilização genérica são capazes de desempenhar essencialmente as mesmas funções, o modo como o fazem é diferente. Além disso, podem existir conjuntos múltiplos de mnemónicas, ou sintaxes de linguagem de montagem, para um único conjunto de instruções. Nestes casos, o conjunto mais popular é aquele que é utilizado pelo fabricante na sua documentação. No mercado de PCs, dominado por processadores Intel e AMD, atualmente existem duas arquiteturas. Primeiro a IA32 (genericamente chamada de i386, x86 ou x86-32), criada pela Intel em 1985 e primeiramente utilizada pelo processadores i386 e segundo a IA32-EM64T (ou IA32-AMD64 ) criada em 2002 pela AMD (Mas também utilizada pela Intel hoje). O IA32 utiliza o grupo de instruções chamado x86, e o IA32-EM64T utiliza o grupo chamado x86-64. As duas arquiteturas usam números diferentes de registradores gerais e tamanho. Enquanto os registradores do x86 são 32 bits os da x86-64 são 64 bits.[carece de fontes] Os registradores de uso geral da arquitetura x86 são: %EAX - registrador acumulador %EBX - registrador base %ECX - registrador contador %EDX - registrador de dados %ESI - registrador de índice da fonte dos dados %EDI - registrador de índice do destino dos dados %EBP - registrador ponteiro para a moldura de chamada de função %ESP - registrador ponteiro para a pilha de execução Os registradores de uso geral da arquitetura x86-64 são: %RAX - registrador valor de retorno %RBX - registrador base %RCX - registrador contador %RDX - registrador de dados %RSI - registrador de índice da fonte dos dados %RDI - registrador de índice do destino dos dados %RBP - registrador ponteiro para a moldura de chamada de função %RSP - registrador ponteiro para a pilha de execução %R8 - registrador de dados %R9 - registrador de dados %R10 - registrador ponteiro para a moldura de chamada de função %R11 - registrador de linking %R12 - registrador de base %R13 - registrador de base %R14 - registrador de base %R15 - registrador de base Esses nomes derivam da forma como eram utilizados nas arquiteturas anteriores a IA32 (8086, 80286…), em que cada registrador desempenhava um papel específico. Na arquitetura i386, todos eles são de uso geral, embora eles continuem a poder ser utilizados em seus papéis tradicionais. A arquitetura IA32 ainda apresenta os registradores de segmento CS, DS, ES, SS, FS e GS, um contador de programa EIP, um registro de sinalizadores EFLAGS, 8 registradores de vírgula flutuante e seus sinalizadores associados. Existem também registradores utilizados pelo sistema operacional para controle da execução em modo protegido, bem como outros registradores de uso específico (depuração, controle de desempenho, etc.). Instruções aritméticas Adição: ADD, ADC, INC, XADD, AAA e DAA; Subtracção: SUB, SBB, DEC, AAS e DAS; Multiplicação: MUL, IMUL e AAM; Divisão: DIV, IDIV e AAD. Montador O montador ou assembler (não confundir com assembly) é um programa que cria o código objeto traduzindo as instruções da linguagem de montagem (assembly) para código de máquina. Além dos comandos básicos, que são traduzidos diretamente para a linguagem de máquina, alguns montadores também aceitam diretivas, que são comandos específicos para o montador. Por exemplo, é possível definir constantes na memória utilizando diretivas.3 O montador possui tabelas, onde armazena informações importantes sobre o programa que está sendo montado. Tabelas de rótulos, de constantes e de comandos são as mais comuns.3 :p.18 Exemplos de código de montagem Arquitetura Intel Código em assembly que usa a sintaxe intel. Decimal Endereço OPcode Operandos 2089872304 7C90EBB0 sub esp, 2D0h 2089872310 7C90EBB6 mov dword ptr [ebp+FFFFFDDCh], eax 2089872316 7C90EBBC mov dword ptr [ebp+FFFFFDD8h], ecx 2089872322 7C90EBC2 mov eax, dword ptr [ebp+8] 2089872325 7C90EBC5 mov ecx, dword ptr [ebp+4] 2089872328 7C90EBC8 mov dword ptr [eax+0Ch], ecx 2089872331 7C90EBCB lea eax, [ebp+FFFFFD2Ch] 2089872337 7C90EBD1 mov dword ptr [eax+000000B8h], ecx 2089872343 7C90EBD7 mov dword ptr [eax+000000A4h], ebx 2089872349 7C90EBDD mov dword ptr [eax+000000A8h], edx 2089872355 7C90EBE3 mov dword ptr [eax+000000A0h], esi 2089872361 7C90EBE9 mov dword ptr [eax+0000009Ch], edi 2089872367 7C90EBEF lea ecx, [ebp+0Ch] 2089872370 7C90EBF2 mov dword ptr [eax+000000C4h], ecx 2089872376 7C90EBF8 mov ecx, dword ptr [ebp] 2089872379 7C90EBFB mov dword ptr [eax+000000B4h], ecx 2089872385 7C90EC01 mov ecx, dword ptr [ebp-4] 2089872388 7C90EC04 mov dword ptr [eax+000000C0h], ecx 2089872394 7C90EC0A mov word ptr [eax+000000BCh], cs 2089872400 7C90EC10 mov word ptr [eax+00000098h], ds 2089872406 7C90EC16 mov word ptr [eax+00000094h], es 2089872412 7C90EC1C mov word ptr [eax+00000090h], fs 2089872418 7C90EC22 mov word ptr [eax+0000008Ch], gs 2089872424 7C90EC28 mov word ptr [eax+000000C8h], ss 2089872430 7C90EC2E mov dword ptr [eax], 10007h 2089872436 7C90EC34 push 1 2089872438 7C90EC36 push eax 2089872439 7C90EC37 push dword ptr [ebp+8] 2089872442 7C90EC3A call 7C90E252 2089872447 7C90EC3F sub esp, 20h 2089872450 7C90EC42 mov dword ptr [esp], eax 2089872453 7C90EC45 mov dword ptr [esp+4], 1 2089872461 7C90EC4D mov dword ptr [esp+10h], 0 2089872469 7C90EC55 mov eax, dword ptr [ebp+8] 2089872472 7C90EC58 mov dword ptr [esp+8], eax 2089872476 7C90EC5C mov eax, esp 2089872478 7C90EC5E push eax 2089872479 7C90EC5F call 7C90EBAC Microprocessador Texas Instruments TMS320C2x LOOP: LARP AR1 LRLK AR1, apontador ADRK TAMANHO_CONSTANTE ADRK fimcon_rx LAC * BZ NAOPASSARAM10MS ZAC SACL * LARP AR1 LRLK AR1,apontador+CONSTANTE_A ADRK controle LAC * BZ LOOP ;Não decorrido tempo: fica no loop NAOPASSARAM10MS: SACL * LARP AR1 B LOOP Microprocessador Texas Instruments TMS320C5x LOOP: mvmm ar1, ar3 ;move conteúdo de ar1 para ar3 rpt #10 ;repete mvdd *ar3+, *ar5+ ;move word endereçada por ar1 para pos. end. por ar6 ;Instruçoes com acumulador: STM #1000h, AR1 ;carrega ar1 com a constante 1000h LD #0, A ;zera o acumulador STL A, *AR1 ;armazena no acumulador mínimo LD #1, A ;carrega o acumulador com a constante mínima "1" STL A, *AR1 ;armazena o acumulador mínimo no endereço de ar1 LD #65535, A ;carrega acumulador com a constante "65535" STL A, 10 ;armazena o acumulador mínimo no endereço 10 STH A, 10 ;armazena o acumulador máximo no endereço 10 STL A, *AR1 ;armazena o acumulador mínimo no endereço de ar1 STH A, *AR1 ;armazena o acumulador máximo no endereço de ar1 ;Instruções com registradores auxiliares: STM #1, AR1 ;carrega ar1 com a constante "1" STM #2, AR0 ;carrega ar0 com a constante "2" MAR *AR1+0 ;adiciona o conteúdo de ar0 to ar appointed by arp (1) MVDK 256, *(AR2) ;carrega ar2 with content of address 256 MAR *AR1+ ;incrementa ar apontado por arp (1) MVKD *(AR2), 256 ;aloja conteúdo de ar2 no endereço 256 MAR *AR1- ;decrementa ar appointed by arp (1) ;Instruções de teste de bit: BITF *AR1, #128 ;TESTA BIT D7 BC ptr, NTC ;vai para ptr se bit for igual a 0 MAR *AR1+ ;incrementa ar apontado por arp (1) ptr: MAR *+AR4(-128) ;sbrk 80h ;Instruções de uso de ponteiros: mvdm *(VETORAL), ar1 ;move conteúdo da memória apontada para o ar (transforma arn em ponteiro) mvmd ar1, *(VETORAL) ;mvmd restaura ponteiro(VETORAL) de acordo com arn b LOOP O microprocessador, popularmente chamado de processador, é um circuito integrado que realiza as funções de cálculo e tomada de decisão de um computador. Todos os computadores e equipamentos eletrônicos baseiam-se nele para executar suas funções, podemos dizer que o processador é o cérebro do computador por realizar todas estas funções, é tornar o computador inteligente. Um microprocessador incorpora as funções de uma unidade central de computador (CPU) em um único circuito integrado, ou no máximo alguns circuitos integrados. É um dispositivo multifuncional programável que aceita dados digitais como entrada, processa de acordo com as instruções armazenadas em sua memória, e fornece resultados como saída. Microprocessadores operam com números e símbolos representados no sistema binário. Arquitetura interna de um microprocessador dedicado para processamento de imagens de ressonância magnética, a fotografia foi aumentada 600 vezes, sob luz ultravioleta para se enxergar os detalhes Vista inferior de um Athlon XP 1800+ núcleo Palomino, um microprocessador moderno. O microprocessador moderno é um circuito integrado formado por uma camada chamada de mesa epitaxial de silício, trabalhada de modo a formar um cristal de extrema pureza, laminada até uma espessura mínima com grande precisão, depois cuidadosamente mascarada por um processo fotográfico e dopada pela exposição a altas temperaturas em fornos que contêm misturas gasosas de impurezas. Este processo é repetido tantas vezes quanto necessário à formação da microarquitetura do componente. Responsável pela execução das instruções num sistema, o microprocessador, escolhido entre os disponíveis no mercado, determina, em certa medida a capacidade de processamento do computador e também o conjunto primário de instruções que ele compreende. O sistema operativo é construído sobre este conjunto. O próprio microprocessador subdivide-se em várias unidades, trabalhando em altas freqüências. A ULA(Unidade Lógica Aritmética), unidade responsável pelos cálculos aritméticos e lógicos e os registradores são parte integrante do microprocessador na família x86, por exemplo. Embora seja a essência do computador, o microprocessador diferente do microcontrolador, está longe de ser um computador completo. Para que possa interagir com o utilizador precisa de: memória, dispositivos de entrada/saída, um clock, controladores e conversores de sinais, entre outros. Cada um desses circuitos de apoio interage de modo peculiar com os programas e, dessa forma, ajuda a moldar o funcionamento do computador. História Intel 8008, um dos primeiros microprocessadores comerciais. O primeiro microprocessador comercial foi inventado pela Intel em 1971 para atender uma empresa japonesa que precisava de um circuito integrado especial para as suas atividades.1 A Intel projectou o 4004, que era um circuito integrado programável que trabalhava com registradores de 4 bits, 46 instruções, clock de 740Khz e possuía cerca de 2300 transistores. Percebendo a utilidade desse invento a Intel prosseguiu com o desenvolvimento de novos microprocessadores: 8008 (o primeiro de 8 bits) e a seguir o 8080 e o microprocessador 8085. O 8080 foi um grande sucesso e tornou-se a base para os primeiros microcomputadores pessoais na década de 1970 graças ao sistema operacional CP/M. Da Intel saíram alguns funcionários que fundaram a Zilog, que viria a lançar o microprocessador Z80, com instruções compatíveis com o 8080 (embora muito mais poderoso que este) e também de grande sucesso. A Motorola possuía o 68000 e a MOS Technology o 6502. A Motorola ganhou destaque quando implantou o MC68000P12, de 12 MHz com arquitetura de 32 bits (embora seu Barramento fosse de 24 bits e seu Barramento de endereços de 16 bits), no Neo-Geo, um poderoso Arcade da SNK que posteriormente ganharia a versão AES (console casero) e CD (versão CD), todos eles com o mesmo hardware inicial. Todos os microprocessadores de 8 bits foram usados em muitos computadores pessoais (Sinclair, Apple Inc., TRS, Commodore, etc). Em 1981 a IBM decidiu lançar-se no mercado de computadores pessoais e no seu IBM-PC utilizou um dos primeiros microprocessadores de 16 bits, o 8088 (derivado do seu irmão 8086 lançado em 1978) que viria a ser o avô dos computadores atuais. A Apple nos seus computadores Macintosh utilizava os processadores da Motorola, a família 68000 (de 32 bits). Outros fabricantes também tinham os seus microprocessadores de 16 bits, a Zilog tinha o Z8000, a Texas Instruments o TMS9900, a National Semiconductor tinha o 16032,mas nenhum fabricante teve tanto sucesso como a Intel, que sucessivamente foi lançando melhoramentos na sua linha 80X86, tendo surgido assim (por ordem cronológica) o 8086, 8088, 80186, 80188, 80286, 80386, 80486, Pentium, Pentium Pro, Pentium MMX, Pentium II, Pentium III, Pentium IV, Pentium M, Pentium D, Pentium Dual Core, Core 2 Duo, Core 2 Quad, Core i3, Core i5 e Core i7. Para o IBM-AT foi utilizado o 80286, depois um grande salto com o 80386 que podia trabalhar com memória virtual e multitarefa, o 80486 com coprocessador matemático embutido e finalmente a linha Pentium, com pipeline de processamento. Como grande concorrente da Intel, a AMD aparece inicialmente como fabricante de microprocessadores da linha x86 alternativa mas a partir de um certo momento deixou de correr atrás da Intel e partiu para o desenvolvimento de sua própria linha de microprocessadores: K6, Athlon, Duron, Turion, Sempron, Phenom. Paralelamente à disputa entre Intel e AMD, a IBM possuía a linha PowerPC utilizada principalmente pelos microcomputadores da Apple. A evolução tecnológica envolvida é surpreendentemente grande, de microprocessadores que trabalhavam com clock de dezenas de kHz e que podiam processar alguns milhares de instruções por segundo, atingiu-se clocks na casa dos 7 GHz e poder de processamento de dezenas de bilhões de instruções por segundo. A complexidade também cresceu: de alguns milhares de transístores para centenas de milhões de transístores numa mesma pastilha. O CPU tem como função principal unificar todo o sistema, controlar as funções realizadas por cada unidade funcional, e é também responsável pela execução de todos os programas do sistema, que deverão estar armazenados na memória principal. Componentes O processador é composto por alguns componentes, cada um tendo uma função específica no processamento dos programas. Unidade lógica e aritmética Ver artigo principal: Unidade lógica e aritmética A Unidade lógica e aritmética (ULA) é a responsável por executar efetivamente as instruções dos programas, como instruções lógicas, matemáticas, desvio, etc. Unidade de controle Ver artigo principal: Unidade de controle A Unidade de controle (UC) é responsável pela tarefa de controle das ações a serem realizadas pelo computador, comandando todos os outros componentes. Registradores Ver artigo principal: Registrador (informática) Os registradores são pequenas memórias velozes que armazenam comandos ou valores que são utilizados no controle e processamento de cada instrução. Os registradores mais importantes são: Contador de Programa (PC) – Sinaliza para a próxima instrução a ser executada; Registrador de Instrução (IR) – Registra a execução da instrução; Unidade de Gerenciamento de Memória Ver artigo principal: Unidade de Gerenciamento de Memória A MMU (em inglês: Memory Management Unit) é um dispositivo de hardware que transforma endereços virtuais em endereços físicos e administra a memória principal do computador. Unidade de ponto flutuante Nos processadores atuais são implementadas unidades de cálculo de números reais. Tais unidades são mais complexas que ULAs e trabalham com operandos maiores, com tamanhos típicos variando entre 64 e 128 bits. Frequência de operação O relógio do sistema (Clock) é um circuito oscilador a cristal (efeito piezoelétrico) que tem a função de sincronizar e ditar a medida de tempo de transferência de dados no computador. Esta freqüência é medida em ciclos por segundo, ou Hertz. A capacidade de processamento do processador não está relacionada exclusivamente à frequência do relógio, mas também a outros fatores como: largura dos barramentos, quantidade de memória cache, arquitetura do processador, tecnologia de co-processamento, tecnologia de previsão de saltos (branch prediction), tecnologia de pipeline, conjunto de instruções, etc. O aumento da frequência de operação nominal do processador é denominado overclocking. Arquitetura Existem duas principais arquiteturas usadas em processadores: A arquitetura de Von Neumann. Esta arquitetura caracteriza-se por apresentar um barramento externo compartilhado entre dados e endereços. Embora apresente baixo custo, esta arquitetura apresenta desempenho limitado pelo gargalo do barramento. A arquitetura de Harvard. Nesta arquitetura existem dois barramentos externos independentes (e normalmente também memórias independentes) para dados e endereços. Isto reduz de forma sensível o gargalo de barramento, que é uma das principais barreiras de desempenho, em detrimento do encarecimento do sistema como um todo. Modelos de computação Existem dois modelos de computação usados em processadores: CISC (em inglês: Complex Instruction Set Computing, Computador com um Conjunto Complexo de Instruções), usada em processadores Intel e AMD; possui um grande conjunto de instruções (tipicamente centenas) que são armazenadas em uma pequena memória não-volátil interna ao processador. Cada posição desta memória contém as microinstruções, ou seja, os passos a serem realizados para a execução de cada instrução. Quanto mais complexa a instrução, mais microinstruções ela possuirá e mais tempo levará para ser executada. Ao conjunto de todas as microinstruções contidas no processador denominamos microcódigo. Esta técnica de computação baseada em microcódigo é denominada microprogramação. RISC (em inglês: Reduced Instruction Set Computing, Computador com um Conjunto Reduzido de Instruções) usada em processadores PowerPC (da Apple, Motorola e IBM) e SPARC (SUN); possui um conjunto pequeno de instruções (tipicamente algumas dezenas) implementadas diretamente em hardware. Nesta técnica não é necessário realizar a leitura em uma memória e, por isso, a execução das instruções é muito rápida (normalmente um ciclo de clock por instrução). Por outro lado, as instruções são muito simples e para a realização de certas tarefas são necessárias mais instruções que no modelo RISC. Exemplos de microprocessadores Uma microcontroladora, um exemplo de microprocessador. Uma GPU. Microprocessadores — São utilizados nos computadores pessoais, onde são chamadas de Unidade Central de Processamento (CPU), workstations e mainframes. Podem ser programados para executar as mais variadas tarefas. Processadores Digitais de Sinal (DSP do inglês Digital Signal Processor) — são microprocessadores especializados em processamento digital de sinal usados para processar sinais de áudio, vídeo, etc., quer em tempo real quer em off-line. Estão presentes, por exemplo, em aparelhos de CD, DVD e televisores digitais. Em geral, realizam sempre uma mesma tarefas simples. Microcontroladores — Processadores relativamente flexíveis, de relativo baixo custo, que podem ser utilizados em projetos de pequeno tamanho. Podem trazer facilidades como conversores A/D embutidos, ou um conjunto de instruções próprias para comunicação digital através de algum protocolo específico. GPU — (ou Unidade de Processamento Gráfico), é um microprocessador especializado em processar gráficos. São utilizadas em placas de vídeo para fazer computação gráfica. Propósito geral e dedicado Durante o processo de desenvolvimento do design de um processador, uma das características que se leva em conta é o uso que ele se destina. Processadores gráficos e controladoras por exemplo não tem o mesmo fim que um processador central. Processadores de propósito geral podem executar qualquer tipo de software, embora sua execução seja mais lenta que o mesmo sendo executado em um processador especializado. Processadores dedicados são fabricados para executarem tarefas específicas, como criptografia, processamento vetorial e gráfico, sendo nesse caso bem mais rápidos do que processadores de propósito geral em tarefas equivalentes. No caso do processamento gráfico, existem as GPUs, que são microprocessadores geralmente com memória dedicada e especialmente desenvolvidos para cálculos gráficos. Nem sempre os processadores seguem definidamente esses dois modelos, sendo o motivo disso que muitos processadores modernos incorporam processadores especializados (co-processador), para cálculos de criptografia, processamento de vetores, etc. Processadores multinucleares Ver artigo principal: multinúcleo Até poucos anos atrás usou-se microprocessadores para atividades domésticas ou de negócios com simples núcleo. Atualmente estão sendo utilizados microprocessadores de múltiplos núcleos para melhorar a capacidade de processamento. Espera-se que no futuro os Sistemas Operacionais domésticos sejam compilados para trabalhar com processadores de múltiplos núcleos corretamente, realizando assim inúmeras tarefas ao mesmo tempo (como já acontece com os supercomputadores). Sistemas multiprocessados Ver artigo principal: Multiprocessamento Em muitos sistemas o uso de um só processador é insuficiente. A solução nesses casos é usar dois ou mais processadores em multi processamento, aumentando assim a quantidade de processadores disponíveis ao sistema operacional. Sistemas multiprocessados podem ser de basicamente dois tipos: Multiprocessamento simétrico (SMP): os processadores compartilham a mesma memória, embora possam ter caches separadas. O sistema operacional deve estar preparado para trabalhar com coerência de caches e, principalmente, evitar condições de corrida na memória principal. Acesso não uniforme à memória (NUMA): a cada processador é associado um banco de memória. Nesse caso, o sistema operacional trata cada banco separadamente, pois cada banco tem um custo de acesso diferente, dependendo de qual o processador a que está associado e onde está sendo executado o processo que tenta acessar a memória. Capacidade de processamento A capacidade de processamento de um microprocessador é de certa forma difícil de medir, uma vez que esse desempenho pode se referir a quantidade máxima teória de instruções que podem ser executadas por segundo, que tipos de instruções são essas, em Flops (instruções de ponto flutuante), podendo essa ser de precisão simples, dupla, quádrupla, dependendo do contexto, e em MIPS (milhões de instruções por segundo), sendo essas operações com números inteiros. Somente a capacidade máxima teórica de um microprocessador não define seu desempenho, somente dá uma noção da sua capacidade, uma vez que sua arquitetura, barramento com a memória entre outros também influenciam no seu desempenho final, sendo assim, sua capacidade de processamento é medida comparando a velocidade de execução de aplicativos reais, podendo assim, testar seu desempenho em atividades comuns. História Intel 8008, um dos primeiros microprocessadores comerciais. O primeiro microprocessador comercial foi inventado pela Intel em 1971 para atender uma empresa japonesa que precisava de um circuito integrado especial para as suas atividades.1 A Intel projectou o 4004, que era um circuito integrado programável que trabalhava com registradores de 4 bits, 46 instruções, clock de 740Khz e possuía cerca de 2300 transistores. Percebendo a utilidade desse invento a Intel prosseguiu com o desenvolvimento de novos microprocessadores: 8008 (o primeiro de 8 bits) e a seguir o 8080 e o microprocessador 8085. O 8080 foi um grande sucesso e tornou-se a base para os primeiros microcomputadores pessoais na década de 1970 graças ao sistema operacional CP/M. Da Intel saíram alguns funcionários que fundaram a Zilog, que viria a lançar o microprocessador Z80, com instruções compatíveis com o 8080 (embora muito mais poderoso que este) e também de grande sucesso. A Motorola possuía o 68000 e a MOS Technology o 6502. A Motorola ganhou destaque quando implantou o MC68000P12, de 12 MHz com arquitetura de 32 bits (embora seu Barramento fosse de 24 bits e seu Barramento de endereços de 16 bits), no Neo-Geo, um poderoso Arcade da SNK que posteriormente ganharia a versão AES (console casero) e CD (versão CD), todos eles com o mesmo hardware inicial. Todos os microprocessadores de 8 bits foram usados em muitos computadores pessoais (Sinclair, Apple Inc., TRS, Commodore, etc). Em 1981 a IBM decidiu lançar-se no mercado de computadores pessoais e no seu IBM-PC utilizou um dos primeiros microprocessadores de 16 bits, o 8088 (derivado do seu irmão 8086 lançado em 1978) que viria a ser o avô dos computadores atuais. A Apple nos seus computadores Macintosh utilizava os processadores da Motorola, a família 68000 (de 32 bits). Outros fabricantes também tinham os seus microprocessadores de 16 bits, a Zilog tinha o Z8000, a Texas Instruments o TMS9900, a National Semiconductor tinha o 16032,mas nenhum fabricante teve tanto sucesso como a Intel, que sucessivamente foi lançando melhoramentos na sua linha 80X86, tendo surgido assim (por ordem cronológica) o 8086, 8088, 80186, 80188, 80286, 80386, 80486, Pentium, Pentium Pro, Pentium MMX, Pentium II, Pentium III, Pentium IV, Pentium M, Pentium D, Pentium Dual Core, Core 2 Duo, Core 2 Quad, Core i3, Core i5 e Core i7. Para o IBM-AT foi utilizado o 80286, depois um grande salto com o 80386 que podia trabalhar com memória virtual e multitarefa, o 80486 com coprocessador matemático embutido e finalmente a linha Pentium, com pipeline de processamento. Como grande concorrente da Intel, a AMD aparece inicialmente como fabricante de microprocessadores da linha x86 alternativa mas a partir de um certo momento deixou de correr atrás da Intel e partiu para o desenvolvimento de sua própria linha de microprocessadores: K6, Athlon, Duron, Turion, Sempron, Phenom. Paralelamente à disputa entre Intel e AMD, a IBM possuía a linha PowerPC utilizada principalmente pelos microcomputadores da Apple. A evolução tecnológica envolvida é surpreendentemente grande, de microprocessadores que trabalhavam com clock de dezenas de kHz e que podiam processar alguns milhares de instruções por segundo, atingiu-se clocks na casa dos 7 GHz e poder de processamento de dezenas de bilhões de instruções por segundo. A complexidade também cresceu: de alguns milhares de transístores para centenas de milhões de transístores numa mesma pastilha. O CPU tem como função principal unificar todo o sistema, controlar as funções realizadas por cada unidade funcional, e é também responsável pela execução de todos os programas do sistema, que deverão estar armazenados na memória principal. Componentes O processador é composto por alguns componentes, cada um tendo uma função específica no processamento dos programas. Unidade lógica e aritmética Ver artigo principal: Unidade lógica e aritmética A Unidade lógica e aritmética (ULA) é a responsável por executar efetivamente as instruções dos programas, como instruções lógicas, matemáticas, desvio, etc. Unidade de controle Ver artigo principal: Unidade de controle A Unidade de controle (UC) é responsável pela tarefa de controle das ações a serem realizadas pelo computador, comandando todos os outros componentes. Registradores Ver artigo principal: Registrador (informática) Os registradores são pequenas memórias velozes que armazenam comandos ou valores que são utilizados no controle e processamento de cada instrução. Os registradores mais importantes são: Contador de Programa (PC) – Sinaliza para a próxima instrução a ser executada; Registrador de Instrução (IR) – Registra a execução da instrução; Unidade de Gerenciamento de Memória Ver artigo principal: Unidade de Gerenciamento de Memória A MMU (em inglês: Memory Management Unit) é um dispositivo de hardware que transforma endereços virtuais em endereços físicos e administra a memória principal do computador. Unidade de ponto flutuante Nos processadores atuais são implementadas unidades de cálculo de números reais. Tais unidades são mais complexas que ULAs e trabalham com operandos maiores, com tamanhos típicos variando entre 64 e 128 bits. Frequência de operação O relógio do sistema (Clock) é um circuito oscilador a cristal (efeito piezoelétrico) que tem a função de sincronizar e ditar a medida de tempo de transferência de dados no computador. Esta freqüência é medida em ciclos por segundo, ou Hertz. A capacidade de processamento do processador não está relacionada exclusivamente à frequência do relógio, mas também a outros fatores como: largura dos barramentos, quantidade de memória cache, arquitetura do processador, tecnologia de co-processamento, tecnologia de previsão de saltos (branch prediction), tecnologia de pipeline, conjunto de instruções, etc. O aumento da frequência de operação nominal do processador é denominado overclocking. Arquitetura Existem duas principais arquiteturas usadas em processadores: A arquitetura de Von Neumann. Esta arquitetura caracteriza-se por apresentar um barramento externo compartilhado entre dados e endereços. Embora apresente baixo custo, esta arquitetura apresenta desempenho limitado pelo gargalo do barramento. A arquitetura de Harvard. Nesta arquitetura existem dois barramentos externos independentes (e normalmente também memórias independentes) para dados e endereços. Isto reduz de forma sensível o gargalo de barramento, que é uma das principais barreiras de desempenho, em detrimento do encarecimento do sistema como um todo. Modelos de computação Existem dois modelos de computação usados em processadores: CISC (em inglês: Complex Instruction Set Computing, Computador com um Conjunto Complexo de Instruções), usada em processadores Intel e AMD; possui um grande conjunto de instruções (tipicamente centenas) que são armazenadas em uma pequena memória não-volátil interna ao processador. Cada posição desta memória contém as microinstruções, ou seja, os passos a serem realizados para a execução de cada instrução. Quanto mais complexa a instrução, mais microinstruções ela possuirá e mais tempo levará para ser executada. Ao conjunto de todas as microinstruções contidas no processador denominamos microcódigo. Esta técnica de computação baseada em microcódigo é denominada microprogramação. RISC (em inglês: Reduced Instruction Set Computing, Computador com um Conjunto Reduzido de Instruções) usada em processadores PowerPC (da Apple, Motorola e IBM) e SPARC (SUN); possui um conjunto pequeno de instruções (tipicamente algumas dezenas) implementadas diretamente em hardware. Nesta técnica não é necessário realizar a leitura em uma memória e, por isso, a execução das instruções é muito rápida (normalmente um ciclo de clock por instrução). Por outro lado, as instruções são muito simples e para a realização de certas tarefas são necessárias mais instruções que no modelo RISC. Exemplos de microprocessadores Uma microcontroladora, um exemplo de microprocessador. Uma GPU. Microprocessadores — São utilizados nos computadores pessoais, onde são chamadas de Unidade Central de Processamento (CPU), workstations e mainframes. Podem ser programados para executar as mais variadas tarefas. Processadores Digitais de Sinal (DSP do inglês Digital Signal Processor) — são microprocessadores especializados em processamento digital de sinal usados para processar sinais de áudio, vídeo, etc., quer em tempo real quer em off-line. Estão presentes, por exemplo, em aparelhos de CD, DVD e televisores digitais. Em geral, realizam sempre uma mesma tarefas simples. Microcontroladores — Processadores relativamente flexíveis, de relativo baixo custo, que podem ser utilizados em projetos de pequeno tamanho. Podem trazer facilidades como conversores A/D embutidos, ou um conjunto de instruções próprias para comunicação digital através de algum protocolo específico. GPU — (ou Unidade de Processamento Gráfico), é um microprocessador especializado em processar gráficos. São utilizadas em placas de vídeo para fazer computação gráfica. Propósito geral e dedicado Durante o processo de desenvolvimento do design de um processador, uma das características que se leva em conta é o uso que ele se destina. Processadores gráficos e controladoras por exemplo não tem o mesmo fim que um processador central. Processadores de propósito geral podem executar qualquer tipo de software, embora sua execução seja mais lenta que o mesmo sendo executado em um processador especializado. Processadores dedicados são fabricados para executarem tarefas específicas, como criptografia, processamento vetorial e gráfico, sendo nesse caso bem mais rápidos do que processadores de propósito geral em tarefas equivalentes. No caso do processamento gráfico, existem as GPUs, que são microprocessadores geralmente com memória dedicada e especialmente desenvolvidos para cálculos gráficos. Nem sempre os processadores seguem definidamente esses dois modelos, sendo o motivo disso que muitos processadores modernos incorporam processadores especializados (co-processador), para cálculos de criptografia, processamento de vetores, etc. Processadores multinucleares Ver artigo principal: multinúcleo Até poucos anos atrás usou-se microprocessadores para atividades domésticas ou de negócios com simples núcleo. Atualmente estão sendo utilizados microprocessadores de múltiplos núcleos para melhorar a capacidade de processamento. Espera-se que no futuro os Sistemas Operacionais domésticos sejam compilados para trabalhar com processadores de múltiplos núcleos corretamente, realizando assim inúmeras tarefas ao mesmo tempo (como já acontece com os supercomputadores). Sistemas multiprocessados Ver artigo principal: Multiprocessamento Em muitos sistemas o uso de um só processador é insuficiente. A solução nesses casos é usar dois ou mais processadores em multi processamento, aumentando assim a quantidade de processadores disponíveis ao sistema operacional. Sistemas multiprocessados podem ser de basicamente dois tipos: Multiprocessamento simétrico (SMP): os processadores compartilham a mesma memória, embora possam ter caches separadas. O sistema operacional deve estar preparado para trabalhar com coerência de caches e, principalmente, evitar condições de corrida na memória principal. Acesso não uniforme à memória (NUMA): a cada processador é associado um banco de memória. Nesse caso, o sistema operacional trata cada banco separadamente, pois cada banco tem um custo de acesso diferente, dependendo de qual o processador a que está associado e onde está sendo executado o processo que tenta acessar a memória. Capacidade de processamento A capacidade de processamento de um microprocessador é de certa forma difícil de medir, uma vez que esse desempenho pode se referir a quantidade máxima teória de instruções que podem ser executadas por segundo, que tipos de instruções são essas, em Flops (instruções de ponto flutuante), podendo essa ser de precisão simples, dupla, quádrupla, dependendo do contexto, e em MIPS (milhões de instruções por segundo), sendo essas operações com números inteiros. Somente a capacidade máxima teórica de um microprocessador não define seu desempenho, somente dá uma noção da sua capacidade, uma vez que sua arquitetura, barramento com a memória entre outros também influenciam no seu desempenho final, sendo assim, sua capacidade de processamento é medida comparando a velocidade de execução de aplicativos reais, podendo assim, testar seu desempenho em atividades comuns. História Intel 8008, um dos primeiros microprocessadores comerciais. O primeiro microprocessador comercial foi inventado pela Intel em 1971 para atender uma empresa japonesa que precisava de um circuito integrado especial para as suas atividades.1 A Intel projectou o 4004, que era um circuito integrado programável que trabalhava com registradores de 4 bits, 46 instruções, clock de 740Khz e possuía cerca de 2300 transistores. Percebendo a utilidade desse invento a Intel prosseguiu com o desenvolvimento de novos microprocessadores: 8008 (o primeiro de 8 bits) e a seguir o 8080 e o microprocessador 8085. O 8080 foi um grande sucesso e tornou-se a base para os primeiros microcomputadores pessoais na década de 1970 graças ao sistema operacional CP/M. Da Intel saíram alguns funcionários que fundaram a Zilog, que viria a lançar o microprocessador Z80, com instruções compatíveis com o 8080 (embora muito mais poderoso que este) e também de grande sucesso. A Motorola possuía o 68000 e a MOS Technology o 6502. A Motorola ganhou destaque quando implantou o MC68000P12, de 12 MHz com arquitetura de 32 bits (embora seu Barramento fosse de 24 bits e seu Barramento de endereços de 16 bits), no Neo-Geo, um poderoso Arcade da SNK que posteriormente ganharia a versão AES (console casero) e CD (versão CD), todos eles com o mesmo hardware inicial. Todos os microprocessadores de 8 bits foram usados em muitos computadores pessoais (Sinclair, Apple Inc., TRS, Commodore, etc). Em 1981 a IBM decidiu lançar-se no mercado de computadores pessoais e no seu IBM-PC utilizou um dos primeiros microprocessadores de 16 bits, o 8088 (derivado do seu irmão 8086 lançado em 1978) que viria a ser o avô dos computadores atuais. A Apple nos seus computadores Macintosh utilizava os processadores da Motorola, a família 68000 (de 32 bits). Outros fabricantes também tinham os seus microprocessadores de 16 bits, a Zilog tinha o Z8000, a Texas Instruments o TMS9900, a National Semiconductor tinha o 16032,mas nenhum fabricante teve tanto sucesso como a Intel, que sucessivamente foi lançando melhoramentos na sua linha 80X86, tendo surgido assim (por ordem cronológica) o 8086, 8088, 80186, 80188, 80286, 80386, 80486, Pentium, Pentium Pro, Pentium MMX, Pentium II, Pentium III, Pentium IV, Pentium M, Pentium D, Pentium Dual Core, Core 2 Duo, Core 2 Quad, Core i3, Core i5 e Core i7. Para o IBM-AT foi utilizado o 80286, depois um grande salto com o 80386 que podia trabalhar com memória virtual e multitarefa, o 80486 com coprocessador matemático embutido e finalmente a linha Pentium, com pipeline de processamento. Como grande concorrente da Intel, a AMD aparece inicialmente como fabricante de microprocessadores da linha x86 alternativa mas a partir de um certo momento deixou de correr atrás da Intel e partiu para o desenvolvimento de sua própria linha de microprocessadores: K6, Athlon, Duron, Turion, Sempron, Phenom. Paralelamente à disputa entre Intel e AMD, a IBM possuía a linha PowerPC utilizada principalmente pelos microcomputadores da Apple. A evolução tecnológica envolvida é surpreendentemente grande, de microprocessadores que trabalhavam com clock de dezenas de kHz e que podiam processar alguns milhares de instruções por segundo, atingiu-se clocks na casa dos 7 GHz e poder de processamento de dezenas de bilhões de instruções por segundo. A complexidade também cresceu: de alguns milhares de transístores para centenas de milhões de transístores numa mesma pastilha. O CPU tem como função principal unificar todo o sistema, controlar as funções realizadas por cada unidade funcional, e é também responsável pela execução de todos os programas do sistema, que deverão estar armazenados na memória principal. Componentes O processador é composto por alguns componentes, cada um tendo uma função específica no processamento dos programas. Unidade lógica e aritmética Ver artigo principal: Unidade lógica e aritmética A Unidade lógica e aritmética (ULA) é a responsável por executar efetivamente as instruções dos programas, como instruções lógicas, matemáticas, desvio, etc. Unidade de controle Ver artigo principal: Unidade de controle A Unidade de controle (UC) é responsável pela tarefa de controle das ações a serem realizadas pelo computador, comandando todos os outros componentes. Registradores Ver artigo principal: Registrador (informática) Os registradores são pequenas memórias velozes que armazenam comandos ou valores que são utilizados no controle e processamento de cada instrução. Os registradores mais importantes são: Contador de Programa (PC) – Sinaliza para a próxima instrução a ser executada; Registrador de Instrução (IR) – Registra a execução da instrução; Unidade de Gerenciamento de Memória Ver artigo principal: Unidade de Gerenciamento de Memória A MMU (em inglês: Memory Management Unit) é um dispositivo de hardware que transforma endereços virtuais em endereços físicos e administra a memória principal do computador. Unidade de ponto flutuante Nos processadores atuais são implementadas unidades de cálculo de números reais. Tais unidades são mais complexas que ULAs e trabalham com operandos maiores, com tamanhos típicos variando entre 64 e 128 bits. Frequência de operação O relógio do sistema (Clock) é um circuito oscilador a cristal (efeito piezoelétrico) que tem a função de sincronizar e ditar a medida de tempo de transferência de dados no computador. Esta freqüência é medida em ciclos por segundo, ou Hertz. A capacidade de processamento do processador não está relacionada exclusivamente à frequência do relógio, mas também a outros fatores como: largura dos barramentos, quantidade de memória cache, arquitetura do processador, tecnologia de co-processamento, tecnologia de previsão de saltos (branch prediction), tecnologia de pipeline, conjunto de instruções, etc. O aumento da frequência de operação nominal do processador é denominado overclocking. Arquitetura Existem duas principais arquiteturas usadas em processadores: A arquitetura de Von Neumann. Esta arquitetura caracteriza-se por apresentar um barramento externo compartilhado entre dados e endereços. Embora apresente baixo custo, esta arquitetura apresenta desempenho limitado pelo gargalo do barramento. A arquitetura de Harvard. Nesta arquitetura existem dois barramentos externos independentes (e normalmente também memórias independentes) para dados e endereços. Isto reduz de forma sensível o gargalo de barramento, que é uma das principais barreiras de desempenho, em detrimento do encarecimento do sistema como um todo. Modelos de computação Existem dois modelos de computação usados em processadores: CISC (em inglês: Complex Instruction Set Computing, Computador com um Conjunto Complexo de Instruções), usada em processadores Intel e AMD; possui um grande conjunto de instruções (tipicamente centenas) que são armazenadas em uma pequena memória não-volátil interna ao processador. Cada posição desta memória contém as microinstruções, ou seja, os passos a serem realizados para a execução de cada instrução. Quanto mais complexa a instrução, mais microinstruções ela possuirá e mais tempo levará para ser executada. Ao conjunto de todas as microinstruções contidas no processador denominamos microcódigo. Esta técnica de computação baseada em microcódigo é denominada microprogramação. RISC (em inglês: Reduced Instruction Set Computing, Computador com um Conjunto Reduzido de Instruções) usada em processadores PowerPC (da Apple, Motorola e IBM) e SPARC (SUN); possui um conjunto pequeno de instruções (tipicamente algumas dezenas) implementadas diretamente em hardware. Nesta técnica não é necessário realizar a leitura em uma memória e, por isso, a execução das instruções é muito rápida (normalmente um ciclo de clock por instrução). Por outro lado, as instruções são muito simples e para a realização de certas tarefas são necessárias mais instruções que no modelo RISC. Exemplos de microprocessadores Uma microcontroladora, um exemplo de microprocessador. Uma GPU. Microprocessadores — São utilizados nos computadores pessoais, onde são chamadas de Unidade Central de Processamento (CPU), workstations e mainframes. Podem ser programados para executar as mais variadas tarefas. Processadores Digitais de Sinal (DSP do inglês Digital Signal Processor) — são microprocessadores especializados em processamento digital de sinal usados para processar sinais de áudio, vídeo, etc., quer em tempo real quer em off-line. Estão presentes, por exemplo, em aparelhos de CD, DVD e televisores digitais. Em geral, realizam sempre uma mesma tarefas simples. Microcontroladores — Processadores relativamente flexíveis, de relativo baixo custo, que podem ser utilizados em projetos de pequeno tamanho. Podem trazer facilidades como conversores A/D embutidos, ou um conjunto de instruções próprias para comunicação digital através de algum protocolo específico. GPU — (ou Unidade de Processamento Gráfico), é um microprocessador especializado em processar gráficos. São utilizadas em placas de vídeo para fazer computação gráfica. Propósito geral e dedicado Durante o processo de desenvolvimento do design de um processador, uma das características que se leva em conta é o uso que ele se destina. Processadores gráficos e controladoras por exemplo não tem o mesmo fim que um processador central. Processadores de propósito geral podem executar qualquer tipo de software, embora sua execução seja mais lenta que o mesmo sendo executado em um processador especializado. Processadores dedicados são fabricados para executarem tarefas específicas, como criptografia, processamento vetorial e gráfico, sendo nesse caso bem mais rápidos do que processadores de propósito geral em tarefas equivalentes. No caso do processamento gráfico, existem as GPUs, que são microprocessadores geralmente com memória dedicada e especialmente desenvolvidos para cálculos gráficos. Nem sempre os processadores seguem definidamente esses dois modelos, sendo o motivo disso que muitos processadores modernos incorporam processadores especializados (co-processador), para cálculos de criptografia, processamento de vetores, etc. Processadores multinucleares Ver artigo principal: multinúcleo Até poucos anos atrás usou-se microprocessadores para atividades domésticas ou de negócios com simples núcleo. Atualmente estão sendo utilizados microprocessadores de múltiplos núcleos para melhorar a capacidade de processamento. Espera-se que no futuro os Sistemas Operacionais domésticos sejam compilados para trabalhar com processadores de múltiplos núcleos corretamente, realizando assim inúmeras tarefas ao mesmo tempo (como já acontece com os supercomputadores). Sistemas multiprocessados Ver artigo principal: Multiprocessamento Em muitos sistemas o uso de um só processador é insuficiente. A solução nesses casos é usar dois ou mais processadores em multi processamento, aumentando assim a quantidade de processadores disponíveis ao sistema operacional. Sistemas multiprocessados podem ser de basicamente dois tipos: Multiprocessamento simétrico (SMP): os processadores compartilham a mesma memória, embora possam ter caches separadas. O sistema operacional deve estar preparado para trabalhar com coerência de caches e, principalmente, evitar condições de corrida na memória principal. Acesso não uniforme à memória (NUMA): a cada processador é associado um banco de memória. Nesse caso, o sistema operacional trata cada banco separadamente, pois cada banco tem um custo de acesso diferente, dependendo de qual o processador a que está associado e onde está sendo executado o processo que tenta acessar a memória. Capacidade de processamento A capacidade de processamento de um microprocessador é de certa forma difícil de medir, uma vez que esse desempenho pode se referir a quantidade máxima teória de instruções que podem ser executadas por segundo, que tipos de instruções são essas, em Flops (instruções de ponto flutuante), podendo essa ser de precisão simples, dupla, quádrupla, dependendo do contexto, e em MIPS (milhões de instruções por segundo), sendo essas operações com números inteiros. Somente a capacidade máxima teórica de um microprocessador não define seu desempenho, somente dá uma noção da sua capacidade, uma vez que sua arquitetura, barramento com a memória entre outros também influenciam no seu desempenho final, sendo assim, sua capacidade de processamento é medida comparando a velocidade de execução de aplicativos reais, podendo assim, testar seu desempenho em atividades comuns. História Intel 8008, um dos primeiros microprocessadores comerciais. O primeiro microprocessador comercial foi inventado pela Intel em 1971 para atender uma empresa japonesa que precisava de um circuito integrado especial para as suas atividades.1 A Intel projectou o 4004, que era um circuito integrado programável que trabalhava com registradores de 4 bits, 46 instruções, clock de 740Khz e possuía cerca de 2300 transistores. Percebendo a utilidade desse invento a Intel prosseguiu com o desenvolvimento de novos microprocessadores: 8008 (o primeiro de 8 bits) e a seguir o 8080 e o microprocessador 8085. O 8080 foi um grande sucesso e tornou-se a base para os primeiros microcomputadores pessoais na década de 1970 graças ao sistema operacional CP/M. Da Intel saíram alguns funcionários que fundaram a Zilog, que viria a lançar o microprocessador Z80, com instruções compatíveis com o 8080 (embora muito mais poderoso que este) e também de grande sucesso. A Motorola possuía o 68000 e a MOS Technology o 6502. A Motorola ganhou destaque quando implantou o MC68000P12, de 12 MHz com arquitetura de 32 bits (embora seu Barramento fosse de 24 bits e seu Barramento de endereços de 16 bits), no Neo-Geo, um poderoso Arcade da SNK que posteriormente ganharia a versão AES (console casero) e CD (versão CD), todos eles com o mesmo hardware inicial. Todos os microprocessadores de 8 bits foram usados em muitos computadores pessoais (Sinclair, Apple Inc., TRS, Commodore, etc). Em 1981 a IBM decidiu lançar-se no mercado de computadores pessoais e no seu IBM-PC utilizou um dos primeiros microprocessadores de 16 bits, o 8088 (derivado do seu irmão 8086 lançado em 1978) que viria a ser o avô dos computadores atuais. A Apple nos seus computadores Macintosh utilizava os processadores da Motorola, a família 68000 (de 32 bits). Outros fabricantes também tinham os seus microprocessadores de 16 bits, a Zilog tinha o Z8000, a Texas Instruments o TMS9900, a National Semiconductor tinha o 16032,mas nenhum fabricante teve tanto sucesso como a Intel, que sucessivamente foi lançando melhoramentos na sua linha 80X86, tendo surgido assim (por ordem cronológica) o 8086, 8088, 80186, 80188, 80286, 80386, 80486, Pentium, Pentium Pro, Pentium MMX, Pentium II, Pentium III, Pentium IV, Pentium M, Pentium D, Pentium Dual Core, Core 2 Duo, Core 2 Quad, Core i3, Core i5 e Core i7. Para o IBM-AT foi utilizado o 80286, depois um grande salto com o 80386 que podia trabalhar com memória virtual e multitarefa, o 80486 com coprocessador matemático embutido e finalmente a linha Pentium, com pipeline de processamento. Como grande concorrente da Intel, a AMD aparece inicialmente como fabricante de microprocessadores da linha x86 alternativa mas a partir de um certo momento deixou de correr atrás da Intel e partiu para o desenvolvimento de sua própria linha de microprocessadores: K6, Athlon, Duron, Turion, Sempron, Phenom. Paralelamente à disputa entre Intel e AMD, a IBM possuía a linha PowerPC utilizada principalmente pelos microcomputadores da Apple. A evolução tecnológica envolvida é surpreendentemente grande, de microprocessadores que trabalhavam com clock de dezenas de kHz e que podiam processar alguns milhares de instruções por segundo, atingiu-se clocks na casa dos 7 GHz e poder de processamento de dezenas de bilhões de instruções por segundo. A complexidade também cresceu: de alguns milhares de transístores para centenas de milhões de transístores numa mesma pastilha. O CPU tem como função principal unificar todo o sistema, controlar as funções realizadas por cada unidade funcional, e é também responsável pela execução de todos os programas do sistema, que deverão estar armazenados na memória principal. Componentes O processador é composto por alguns componentes, cada um tendo uma função específica no processamento dos programas. Unidade lógica e aritmética Ver artigo principal: Unidade lógica e aritmética A Unidade lógica e aritmética (ULA) é a responsável por executar efetivamente as instruções dos programas, como instruções lógicas, matemáticas, desvio, etc. Unidade de controle Ver artigo principal: Unidade de controle A Unidade de controle (UC) é responsável pela tarefa de controle das ações a serem realizadas pelo computador, comandando todos os outros componentes. Registradores Ver artigo principal: Registrador (informática) Os registradores são pequenas memórias velozes que armazenam comandos ou valores que são utilizados no controle e processamento de cada instrução. Os registradores mais importantes são: Contador de Programa (PC) – Sinaliza para a próxima instrução a ser executada; Registrador de Instrução (IR) – Registra a execução da instrução; Unidade de Gerenciamento de Memória Ver artigo principal: Unidade de Gerenciamento de Memória A MMU (em inglês: Memory Management Unit) é um dispositivo de hardware que transforma endereços virtuais em endereços físicos e administra a memória principal do computador. Unidade de ponto flutuante Nos processadores atuais são implementadas unidades de cálculo de números reais. Tais unidades são mais complexas que ULAs e trabalham com operandos maiores, com tamanhos típicos variando entre 64 e 128 bits. Frequência de operação O relógio do sistema (Clock) é um circuito oscilador a cristal (efeito piezoelétrico) que tem a função de sincronizar e ditar a medida de tempo de transferência de dados no computador. Esta freqüência é medida em ciclos por segundo, ou Hertz. A capacidade de processamento do processador não está relacionada exclusivamente à frequência do relógio, mas também a outros fatores como: largura dos barramentos, quantidade de memória cache, arquitetura do processador, tecnologia de co-processamento, tecnologia de previsão de saltos (branch prediction), tecnologia de pipeline, conjunto de instruções, etc. O aumento da frequência de operação nominal do processador é denominado overclocking. Arquitetura Existem duas principais arquiteturas usadas em processadores: A arquitetura de Von Neumann. Esta arquitetura caracteriza-se por apresentar um barramento externo compartilhado entre dados e endereços. Embora apresente baixo custo, esta arquitetura apresenta desempenho limitado pelo gargalo do barramento. A arquitetura de Harvard. Nesta arquitetura existem dois barramentos externos independentes (e normalmente também memórias independentes) para dados e endereços. Isto reduz de forma sensível o gargalo de barramento, que é uma das principais barreiras de desempenho, em detrimento do encarecimento do sistema como um todo. Modelos de computação Existem dois modelos de computação usados em processadores: CISC (em inglês: Complex Instruction Set Computing, Computador com um Conjunto Complexo de Instruções), usada em processadores Intel e AMD; possui um grande conjunto de instruções (tipicamente centenas) que são armazenadas em uma pequena memória não-volátil interna ao processador. Cada posição desta memória contém as microinstruções, ou seja, os passos a serem realizados para a execução de cada instrução. Quanto mais complexa a instrução, mais microinstruções ela possuirá e mais tempo levará para ser executada. Ao conjunto de todas as microinstruções contidas no processador denominamos microcódigo. Esta técnica de computação baseada em microcódigo é denominada microprogramação. RISC (em inglês: Reduced Instruction Set Computing, Computador com um Conjunto Reduzido de Instruções) usada em processadores PowerPC (da Apple, Motorola e IBM) e SPARC (SUN); possui um conjunto pequeno de instruções (tipicamente algumas dezenas) implementadas diretamente em hardware. Nesta técnica não é necessário realizar a leitura em uma memória e, por isso, a execução das instruções é muito rápida (normalmente um ciclo de clock por instrução). Por outro lado, as instruções são muito simples e para a realização de certas tarefas são necessárias mais instruções que no modelo RISC. Exemplos de microprocessadores Uma microcontroladora, um exemplo de microprocessador. Uma GPU. Microprocessadores — São utilizados nos computadores pessoais, onde são chamadas de Unidade Central de Processamento (CPU), workstations e mainframes. Podem ser programados para executar as mais variadas tarefas. Processadores Digitais de Sinal (DSP do inglês Digital Signal Processor) — são microprocessadores especializados em processamento digital de sinal usados para processar sinais de áudio, vídeo, etc., quer em tempo real quer em off-line. Estão presentes, por exemplo, em aparelhos de CD, DVD e televisores digitais. Em geral, realizam sempre uma mesma tarefas simples. Microcontroladores — Processadores relativamente flexíveis, de relativo baixo custo, que podem ser utilizados em projetos de pequeno tamanho. Podem trazer facilidades como conversores A/D embutidos, ou um conjunto de instruções próprias para comunicação digital através de algum protocolo específico. GPU — (ou Unidade de Processamento Gráfico), é um microprocessador especializado em processar gráficos. São utilizadas em placas de vídeo para fazer computação gráfica. Propósito geral e dedicado Durante o processo de desenvolvimento do design de um processador, uma das características que se leva em conta é o uso que ele se destina. Processadores gráficos e controladoras por exemplo não tem o mesmo fim que um processador central. Processadores de propósito geral podem executar qualquer tipo de software, embora sua execução seja mais lenta que o mesmo sendo executado em um processador especializado. Processadores dedicados são fabricados para executarem tarefas específicas, como criptografia, processamento vetorial e gráfico, sendo nesse caso bem mais rápidos do que processadores de propósito geral em tarefas equivalentes. No caso do processamento gráfico, existem as GPUs, que são microprocessadores geralmente com memória dedicada e especialmente desenvolvidos para cálculos gráficos. Nem sempre os processadores seguem definidamente esses dois modelos, sendo o motivo disso que muitos processadores modernos incorporam processadores especializados (co-processador), para cálculos de criptografia, processamento de vetores, etc. Processadores multinucleares Ver artigo principal: multinúcleo Até poucos anos atrás usou-se microprocessadores para atividades domésticas ou de negócios com simples núcleo. Atualmente estão sendo utilizados microprocessadores de múltiplos núcleos para melhorar a capacidade de processamento. Espera-se que no futuro os Sistemas Operacionais domésticos sejam compilados para trabalhar com processadores de múltiplos núcleos corretamente, realizando assim inúmeras tarefas ao mesmo tempo (como já acontece com os supercomputadores). Sistemas multiprocessados Ver artigo principal: Multiprocessamento Em muitos sistemas o uso de um só processador é insuficiente. A solução nesses casos é usar dois ou mais processadores em multi processamento, aumentando assim a quantidade de processadores disponíveis ao sistema operacional. Sistemas multiprocessados podem ser de basicamente dois tipos: Multiprocessamento simétrico (SMP): os processadores compartilham a mesma memória, embora possam ter caches separadas. O sistema operacional deve estar preparado para trabalhar com coerência de caches e, principalmente, evitar condições de corrida na memória principal. Acesso não uniforme à memória (NUMA): a cada processador é associado um banco de memória. Nesse caso, o sistema operacional trata cada banco separadamente, pois cada banco tem um custo de acesso diferente, dependendo de qual o processador a que está associado e onde está sendo executado o processo que tenta acessar a memória. Capacidade de processamento A capacidade de processamento de um microprocessador é de certa forma difícil de medir, uma vez que esse desempenho pode se referir a quantidade máxima teória de instruções que podem ser executadas por segundo, que tipos de instruções são essas, em Flops (instruções de ponto flutuante), podendo essa ser de precisão simples, dupla, quádrupla, dependendo do contexto, e em MIPS (milhões de instruções por segundo), sendo essas operações com números inteiros. Somente a capacidade máxima teórica de um microprocessador não define seu desempenho, somente dá uma noção da sua capacidade, uma vez que sua arquitetura, barramento com a memória entre outros também influenciam no seu desempenho final, sendo assim, sua capacidade de processamento é medida comparando a velocidade de execução de aplicativos reais, podendo assim, testar seu desempenho em atividades comuns. História Intel 8008, um dos primeiros microprocessadores comerciais. O primeiro microprocessador comercial foi inventado pela Intel em 1971 para atender uma empresa japonesa que precisava de um circuito integrado especial para as suas atividades.1 A Intel projectou o 4004, que era um circuito integrado programável que trabalhava com registradores de 4 bits, 46 instruções, clock de 740Khz e possuía cerca de 2300 transistores. Percebendo a utilidade desse invento a Intel prosseguiu com o desenvolvimento de novos microprocessadores: 8008 (o primeiro de 8 bits) e a seguir o 8080 e o microprocessador 8085. O 8080 foi um grande sucesso e tornou-se a base para os primeiros microcomputadores pessoais na década de 1970 graças ao sistema operacional CP/M. Da Intel saíram alguns funcionários que fundaram a Zilog, que viria a lançar o microprocessador Z80, com instruções compatíveis com o 8080 (embora muito mais poderoso que este) e também de grande sucesso. A Motorola possuía o 68000 e a MOS Technology o 6502. A Motorola ganhou destaque quando implantou o MC68000P12, de 12 MHz com arquitetura de 32 bits (embora seu Barramento fosse de 24 bits e seu Barramento de endereços de 16 bits), no Neo-Geo, um poderoso Arcade da SNK que posteriormente ganharia a versão AES (console casero) e CD (versão CD), todos eles com o mesmo hardware inicial. Todos os microprocessadores de 8 bits foram usados em muitos computadores pessoais (Sinclair, Apple Inc., TRS, Commodore, etc). Em 1981 a IBM decidiu lançar-se no mercado de computadores pessoais e no seu IBM-PC utilizou um dos primeiros microprocessadores de 16 bits, o 8088 (derivado do seu irmão 8086 lançado em 1978) que viria a ser o avô dos computadores atuais. A Apple nos seus computadores Macintosh utilizava os processadores da Motorola, a família 68000 (de 32 bits). Outros fabricantes também tinham os seus microprocessadores de 16 bits, a Zilog tinha o Z8000, a Texas Instruments o TMS9900, a National Semiconductor tinha o 16032,mas nenhum fabricante teve tanto sucesso como a Intel, que sucessivamente foi lançando melhoramentos na sua linha 80X86, tendo surgido assim (por ordem cronológica) o 8086, 8088, 80186, 80188, 80286, 80386, 80486, Pentium, Pentium Pro, Pentium MMX, Pentium II, Pentium III, Pentium IV, Pentium M, Pentium D, Pentium Dual Core, Core 2 Duo, Core 2 Quad, Core i3, Core i5 e Core i7. Para o IBM-AT foi utilizado o 80286, depois um grande salto com o 80386 que podia trabalhar com memória virtual e multitarefa, o 80486 com coprocessador matemático embutido e finalmente a linha Pentium, com pipeline de processamento. Como grande concorrente da Intel, a AMD aparece inicialmente como fabricante de microprocessadores da linha x86 alternativa mas a partir de um certo momento deixou de correr atrás da Intel e partiu para o desenvolvimento de sua própria linha de microprocessadores: K6, Athlon, Duron, Turion, Sempron, Phenom. Paralelamente à disputa entre Intel e AMD, a IBM possuía a linha PowerPC utilizada principalmente pelos microcomputadores da Apple. A evolução tecnológica envolvida é surpreendentemente grande, de microprocessadores que trabalhavam com clock de dezenas de kHz e que podiam processar alguns milhares de instruções por segundo, atingiu-se clocks na casa dos 7 GHz e poder de processamento de dezenas de bilhões de instruções por segundo. A complexidade também cresceu: de alguns milhares de transístores para centenas de milhões de transístores numa mesma pastilha. O CPU tem como função principal unificar todo o sistema, controlar as funções realizadas por cada unidade funcional, e é também responsável pela execução de todos os programas do sistema, que deverão estar armazenados na memória principal. Componentes O processador é composto por alguns componentes, cada um tendo uma função específica no processamento dos programas. Unidade lógica e aritmética Ver artigo principal: Unidade lógica e aritmética A Unidade lógica e aritmética (ULA) é a responsável por executar efetivamente as instruções dos programas, como instruções lógicas, matemáticas, desvio, etc. Unidade de controle Ver artigo principal: Unidade de controle A Unidade de controle (UC) é responsável pela tarefa de controle das ações a serem realizadas pelo computador, comandando todos os outros componentes. Registradores Ver artigo principal: Registrador (informática) Os registradores são pequenas memórias velozes que armazenam comandos ou valores que são utilizados no controle e processamento de cada instrução. Os registradores mais importantes são: Contador de Programa (PC) – Sinaliza para a próxima instrução a ser executada; Registrador de Instrução (IR) – Registra a execução da instrução; Unidade de Gerenciamento de Memória Ver artigo principal: Unidade de Gerenciamento de Memória A MMU (em inglês: Memory Management Unit) é um dispositivo de hardware que transforma endereços virtuais em endereços físicos e administra a memória principal do computador. Unidade de ponto flutuante Nos processadores atuais são implementadas unidades de cálculo de números reais. Tais unidades são mais complexas que ULAs e trabalham com operandos maiores, com tamanhos típicos variando entre 64 e 128 bits. Frequência de operação O relógio do sistema (Clock) é um circuito oscilador a cristal (efeito piezoelétrico) que tem a função de sincronizar e ditar a medida de tempo de transferência de dados no computador. Esta freqüência é medida em ciclos por segundo, ou Hertz. A capacidade de processamento do processador não está relacionada exclusivamente à frequência do relógio, mas também a outros fatores como: largura dos barramentos, quantidade de memória cache, arquitetura do processador, tecnologia de co-processamento, tecnologia de previsão de saltos (branch prediction), tecnologia de pipeline, conjunto de instruções, etc. O aumento da frequência de operação nominal do processador é denominado overclocking. Arquitetura Existem duas principais arquiteturas usadas em processadores: A arquitetura de Von Neumann. Esta arquitetura caracteriza-se por apresentar um barramento externo compartilhado entre dados e endereços. Embora apresente baixo custo, esta arquitetura apresenta desempenho limitado pelo gargalo do barramento. A arquitetura de Harvard. Nesta arquitetura existem dois barramentos externos independentes (e normalmente também memórias independentes) para dados e endereços. Isto reduz de forma sensível o gargalo de barramento, que é uma das principais barreiras de desempenho, em detrimento do encarecimento do sistema como um todo. Modelos de computação Existem dois modelos de computação usados em processadores: CISC (em inglês: Complex Instruction Set Computing, Computador com um Conjunto Complexo de Instruções), usada em processadores Intel e AMD; possui um grande conjunto de instruções (tipicamente centenas) que são armazenadas em uma pequena memória não-volátil interna ao processador. Cada posição desta memória contém as microinstruções, ou seja, os passos a serem realizados para a execução de cada instrução. Quanto mais complexa a instrução, mais microinstruções ela possuirá e mais tempo levará para ser executada. Ao conjunto de todas as microinstruções contidas no processador denominamos microcódigo. Esta técnica de computação baseada em microcódigo é denominada microprogramação. RISC (em inglês: Reduced Instruction Set Computing, Computador com um Conjunto Reduzido de Instruções) usada em processadores PowerPC (da Apple, Motorola e IBM) e SPARC (SUN); possui um conjunto pequeno de instruções (tipicamente algumas dezenas) implementadas diretamente em hardware. Nesta técnica não é necessário realizar a leitura em uma memória e, por isso, a execução das instruções é muito rápida (normalmente um ciclo de clock por instrução). Por outro lado, as instruções são muito simples e para a realização de certas tarefas são necessárias mais instruções que no modelo RISC. Exemplos de microprocessadores Uma microcontroladora, um exemplo de microprocessador. Uma GPU. Microprocessadores — São utilizados nos computadores pessoais, onde são chamadas de Unidade Central de Processamento (CPU), workstations e mainframes. Podem ser programados para executar as mais variadas tarefas. Processadores Digitais de Sinal (DSP do inglês Digital Signal Processor) — são microprocessadores especializados em processamento digital de sinal usados para processar sinais de áudio, vídeo, etc., quer em tempo real quer em off-line. Estão presentes, por exemplo, em aparelhos de CD, DVD e televisores digitais. Em geral, realizam sempre uma mesma tarefas simples. Microcontroladores — Processadores relativamente flexíveis, de relativo baixo custo, que podem ser utilizados em projetos de pequeno tamanho. Podem trazer facilidades como conversores A/D embutidos, ou um conjunto de instruções próprias para comunicação digital através de algum protocolo específico. GPU — (ou Unidade de Processamento Gráfico), é um microprocessador especializado em processar gráficos. São utilizadas em placas de vídeo para fazer computação gráfica. Propósito geral e dedicado Durante o processo de desenvolvimento do design de um processador, uma das características que se leva em conta é o uso que ele se destina. Processadores gráficos e controladoras por exemplo não tem o mesmo fim que um processador central. Processadores de propósito geral podem executar qualquer tipo de software, embora sua execução seja mais lenta que o mesmo sendo executado em um processador especializado. Processadores dedicados são fabricados para executarem tarefas específicas, como criptografia, processamento vetorial e gráfico, sendo nesse caso bem mais rápidos do que processadores de propósito geral em tarefas equivalentes. No caso do processamento gráfico, existem as GPUs, que são microprocessadores geralmente com memória dedicada e especialmente desenvolvidos para cálculos gráficos. Nem sempre os processadores seguem definidamente esses dois modelos, sendo o motivo disso que muitos processadores modernos incorporam processadores especializados (co-processador), para cálculos de criptografia, processamento de vetores, etc. Processadores multinucleares Ver artigo principal: multinúcleo Até poucos anos atrás usou-se microprocessadores para atividades domésticas ou de negócios com simples núcleo. Atualmente estão sendo utilizados microprocessadores de múltiplos núcleos para melhorar a capacidade de processamento. Espera-se que no futuro os Sistemas Operacionais domésticos sejam compilados para trabalhar com processadores de múltiplos núcleos corretamente, realizando assim inúmeras tarefas ao mesmo tempo (como já acontece com os supercomputadores). Sistemas multiprocessados Ver artigo principal: Multiprocessamento Em muitos sistemas o uso de um só processador é insuficiente. A solução nesses casos é usar dois ou mais processadores em multi processamento, aumentando assim a quantidade de processadores disponíveis ao sistema operacional. Sistemas multiprocessados podem ser de basicamente dois tipos: Multiprocessamento simétrico (SMP): os processadores compartilham a mesma memória, embora possam ter caches separadas. O sistema operacional deve estar preparado para trabalhar com coerência de caches e, principalmente, evitar condições de corrida na memória principal. Acesso não uniforme à memória (NUMA): a cada processador é associado um banco de memória. Nesse caso, o sistema operacional trata cada banco separadamente, pois cada banco tem um custo de acesso diferente, dependendo de qual o processador a que está associado e onde está sendo executado o processo que tenta acessar a memória. Capacidade de processamento A capacidade de processamento de um microprocessador é de certa forma difícil de medir, uma vez que esse desempenho pode se referir a quantidade máxima teória de instruções que podem ser executadas por segundo, que tipos de instruções são essas, em Flops (instruções de ponto flutuante), podendo essa ser de precisão simples, dupla, quádrupla, dependendo do contexto, e em MIPS (milhões de instruções por segundo), sendo essas operações com números inteiros. Somente a capacidade máxima teórica de um microprocessador não define seu desempenho, somente dá uma noção da sua capacidade, uma vez que sua arquitetura, barramento com a memória entre outros também influenciam no seu desempenho final, sendo assim, sua capacidade de processamento é medida comparando a velocidade de execução de aplicativos reais, podendo assim, testar seu desempenho em atividades comuns.

Python

                                       Historia


Python foi concebido no final de 19895 6 por Guido van Rossum no Instituto de Pesquisa Nacional para Matemática e Ciência da Computação (CWI), nos Países Baixos, como um sucessor da ABC capaz de tratar exceções e prover interface com o sistema operacional Amoeba7 através de scripts. Também da CWI, a linguagem ABC era mais produtiva que C, ainda que com o custo do desempenho em tempo de execução. Mas ela não possuía funcionalidades importantes para a interação com o sistema operacional, uma necessidade do grupo. Um dos focos primordiais de Python era aumentar a produtividade do programador.6
Em 1991, Guido publicou o código (nomeado versão 0.9.0) no grupo de discussão alt.sources.1 Nessa versão já estavam presentes classes com herança, tratamento de exceções, funções e os tipos de dado nativos list, dict, str, e assim por diante. Também estava presente nessa versão um sistema de módulos emprestado do Modula-3. O modelo de exceções também lembrava muito o do Modula-3, com a adição da opção else clause.7 Em 1994 foi formado o principal fórum de discussão do Python, comp.lang.python, um marco para o crescimento da base de usuários da linguagem.
A versão 1.0 foi lançada em janeiro de 1994. Novas funcionalidades incluíam ferramentas para programação funcional como lambda, map, filter e reduce. A última versão enquanto Guido estava na CWI foi o Python 1.2. Em 1995, ele continuou o trabalho no CNRI em Reston, Estados Unidos, de onde lançou diversas versões. Na versão 1.4 a linguagem ganhou parâmetros nomeados (a capacidade de passar parâmetro pelo nome e não pela posição na lista de parâmetros) e suporte nativo a números complexos, assim como uma forma de encapsulamento.8
Ainda na CNRI, Guido lançou a iniciativa Computer Programming for Everybody (CP4E; literalmente, "Programação de Computadores para Todos"), que visava tornar a programação mais acessível, um projeto financiado pela DARPA.9 Atualmente o CP4E encontra-se inativo.
Em 2000, o time de desenvolvimento da linguagem se mudou para a BeOpen a fim de formar o time PythonLabs. A CNRI pediu que a versão 1.6 fosse lançada, para marcar o fim de desenvolvimento da linguagem naquele local. O único lançamento na BeOpen foi o Python 2.0, e após o lançamento o grupo de desenvolvedores da PythonLabs agrupou-se na Digital Creations.
Python 2.0 implementou list comprehension, uma relevante funcionalidade de linguagens funcionais como SETL e Haskell. A sintaxe da linguagem para essa construção é bastante similar a de Haskell, exceto pela preferência do Haskell por caracteres de pontuação e da preferência do python por palavras reservadas alfabéticas. Essa versão 2.0 também introduziu um sistema coletor de lixo capaz de identificar e tratar ciclos de referências.10
Já o 1.6 incluiu uma licença CNRI substancialmente mais longa que a licença CWI que estavam usando nas versões anteriores. Entre outras mudanças, essa licença incluía uma cláusula atestando que a licença era governada pelas leis da Virgínia. A Free Software Foundation alegou que isso era incompatível com a GNU GPL. Tanto BeOpen quanto CNRI e FSF negociaram uma mudança na licença livre do Python que o tornaria compatível com a GPL. Python 1.6.1 é idêntico ao 1.6.0, exceto por pequenas correções de falhas e uma licença nova, compatível com a GPL.11
Python 2.1 era parecido com as versões 1.6.1 e 2.0. Sua licença foi renomeada para Python Software Foundation License. Todo código, documentação e especificação desde o lançamento da versão alfa da 2.1 é propriedade da Python Software Foundation (PSF), uma organização sem fins lucrativos fundada em 2001, um modelo tal qual da Apache Software Foundation.11 O lançamento incluiu a mudança na especificação para suportar escopo aninhado, assim como outras linguagens com escopo estático.12 Esta funcionalidade estava desativada por padrão, e somente foi requerida na versão 2.2.
Uma grande inovação da versão 2.2 foi a unificação dos tipos Python (escritos em C) e classes (escritas em Python) em somente uma hierarquia. Isto tornou o modelo de objetos do Python consistentemente orientado a objeto.13 Também foi adicionado generator, inspirado em Icon.14
O incremento da biblioteca padrão e as escolhas sintáticas foram fortemente influenciadas por Java em alguns casos: o pacote logging15 introduzido na versão 2.3,16 o analisador sintático SAX, introduzido na versão 2.0 e a sintaxe de decoradores que usa @,17 adicionadas na versão 2.4.18
Em 1 de outubro de 2008 foi lançada a versão 2.6, já visando a transição para a versão 3.0 da linguagem. Entre outras modificações, foram incluídas bibliotecas para multiprocessamento, JSON e E/S, além de uma nova forma de formatação de cadeias de caracteres.19
Atualmente a linguagem é usada em diversas áreas, como servidores de aplicação e computação gráfica. Está disponível como linguagem de script em aplicações como OpenOffice (Python UNO Bridge), Blender e pode ser utilizada em procedimentos armazenados no sistema gerenciador de banco de dados PostgreSQL (PL/Python).
A terceira versão da linguagem foi lançada em dezembro de 2008,20 chamada Python 3.0 ou Python 3000. Com noticiado desde antes de seu lançamento,21 houve quebra de compatibilidade com a família 2.x para corrigir falhas que foram descobertas neste padrão, e para limpar os excessos das versões anteriores.6 A primeira versão alfa foi lançada em 31 de agosto de 2007, a segunda em 7 de dezembro do mesmo ano.
Mudanças da versão incluem a alteração da palavra reservada print, que passa a ser uma função, tornando mais fácil a utilização de uma versão alternativa da rotina. Em Python 2.6, isso já está disponível ao adicionar o código from __future__ import print_function.22 Também, a mudança para Unicode de todas as cadeias de caracteres.

Filosofia

Parte da cultura da linguagem gira ao redor de The Zen of Python, um poema que faz parte do documento "PEP 20 (The Zen of Python)",23 escrito pelo programador em Python de longa data Tim Peters, descrevendo sumariamente a filosofia do Python. Pode-se vê-lo através de um easter egg do Python pelo comando:
>>> import this

Características

Construções

Construções de Python incluem: estrutura de seleção (if, else, elif); estrutura de repetição (for, while), que itera por um container, capturando cada elemento em uma variável local dada; construção de classes (class); construção de subrotinas (def); construção de escopo (with), como por exemplo para adquirir um recurso.

Tipos de dado

A tipagem de Python é forte, pois os valores e objetos têm tipos bem definidos e não sofrem coerções como em C ou Perl. São disponibilizados diversos tipos de dados nativos:
Tipo de dado Descrição Exemplo da sintaxe
str, unicode Uma cadeia de caracteres imutável 'Wikipedia', u'Wikipedia'
list Lista heterogênea mutável [4.0, 'string', True]
tuple Tupla imutável (4.0, 'string', True)
set, frozenset Conjunto não ordenado, não contém elementos duplicados set([4.0, 'string', True])
frozenset([4.0, 'string', True])
dict conjunto associativo {'key1': 1.0, 'key2': False}
int Número de precisão fixa, é transparentemente convertido para long caso não caiba em um int. 42
2147483648L
float Ponto flutuante 3.1415927
complex Número complexo 3+2j
bool Booleano True ou False
Python também permite a definição dos tipos de dados próprios, através de classes. Instâncias são construídas invocando a classe (FooClass()), e as classes são instância da classe type, o que permite metaprogramação e reflexão. Métodos são definidos como funções anexadas à classe, e a sintaxe instância.método(argumento) é um atalho para Classe.método(instância, argumento). Os métodos devem referenciar explicitamente a referência para o objeto incluindo o parâmetro self como o primeiro argumento do método.24
Antes da versão 3.0, Python possuía dois tipos de classes: "old-style" e "new-style". Classes old-style foram eliminadas no Python 3.0, e todas são new-style. Em versões entre 2.2 e 3.0, ambos tipos de classes podiam ser usadas. A sintaxe de ambos estilos é a mesma, a diferença acaba sendo de onde objeto da classe é herdado, direta ou indiretamente (todas classes new-style herdam de object e são instancias de type). As classes new-styles nada mais são que tipos definidos pelo usuário.

Palavras reservadas

O Python 2.5.2 define as seguintes 31 palavras reservadas:25
and        del        from        not        while
as         elif       global      or         with
assert     else       if          pass       yield
break      except     import      print
class      exec       in          raise
continue   finally    is          return
def        for        lambda      try

Operadores

Os operadores básicos de comparação como ==, <, >=, entre outros são usados em todos os tipos de dados, como números, cadeias de texto, listas e mapeamentos. Comparações em cadeia como a < b < c possuem o mesmo significado básico que na matemática: os termos são comparadas na ordem. É garantido que o processamento da expressão lógica irá terminar tão cedo o veredito é claro, o princípio da avaliação mínima. Usando a expressão anterior, se a < b é falso, c não é avaliado.
Quanto aos operadores lógicos, até Python 2.2 não havia o tipo de dado booleano. Em todas as versões da linguagem os operadores lógicos tratam "", 0, None, 0.0, [] e {} como falso, enquanto o restante é tratado como verdadeiro de modo geral. Na versão 2.2.1 as constantes True e False foram adicionadas (subclasses de 1 e 0 respectivamente). A comparação binária retorna uma das duas constantes acima.
Os operadores booleanos and e or também seguem a avaliação mínima. Por exemplo, y == 0 or x/y > 100 nunca lançará a exceção de divisão por zero.

Interpretador interativo

O interpretador interativo é uma característica diferencial da linguagem, porque há a possibilidade de testar o código de um programa e receber o resultado em tempo real, antes de iniciar a compilação ou incluí-las nos programas. Por exemplo:
>>> 1+1
2
>>>
>>> a = 1+1
>>> print a
2
>>> print(a)
2
>>>

Análise léxica

Exemplo de script
No segundo capítulo do Manual de Referência da Linguagem Python é citado que a análise léxica é uma análise do interpretador em si, os programas são lidos por um analisador sintático que divide o código em tokens.
Todo programa é dividido em linhas lógicas que são separadas pelo token NEWLINE ou NOVA LINHA, as linhas físicas são trechos de código divididos pelo caractere ENTER. Linhas lógicas não podem ultrapassar linhas físicas com exceção de junção de linhas, por exemplo:
if resultado > 2 and \
    1 <= 5  and \
    2 < 5:
        print ('Resultado: %f' % d)
ou
MESES_DO_ANO = ['janeiro', 'fevereiro', 'março',
                'abril',   'maio',      'junho',
                'julho',   'agosto',    'setembro',
                'outubro', 'novembro',  'dezembro']
Para a delimitação de blocos de códigos os delimitadores são colocados em uma pilha e diferenciados por sua indentação. Iniciando a pilha com valor 0 (zero) e colocando valores maiores que os anteriores na pilha. Para cada começo de linha, o nível de indentação é comparado com o valor do topo da pilha. Se o número da linha for igual ao topo da pilha, a pilha não é alterada. Se o valor for maior a pilha recebe o nível de indentação da linha e o nome INDENT (empilhamento) se o nível de indentação for menor, então é desempilhado até chegar a um nível de indentação recebendo o nome DEDENT (desempilhamento) e se não encontrar nenhum valor é gerado um erro de indentação.
Abaixo um exemplo de permutação, retirado do capítulo 2.1 sobre Estrutura de linhas na Análise léxica do Manual de Referência da linguagem (Language Reference Manual):
         def perm(l):                   NOVA LINHA
INDENT        if len(l) <= 1:           NOVA LINHA
INDENT           return[1]              NOVA LINHA
DEDENT        r = [ ]                   NOVA LINHA
              for i in range(len(l)):   NOVA LINHA
INDENT            s = l[:i] + l[i+1:]   NOVA LINHA
                  p = perm(s)           NOVA LINHA
DEDENT        for x in p:               NOVA LINHA
INDENT            r.append(l[i:i+1]+x)  NOVA LINHA
DEDENT        return r

Indentação

Python foi desenvolvido para ser uma linguagem de fácil leitura, com um visual agradável, frequentemente usando palavras e não pontuações como em outras linguagens. Para a separação de blocos de código, a linguagem usa espaços em branco e indentação ao invés de delimitadores visuais como chaves (C, Java) ou palavras (BASIC, Fortran, Pascal). Diferente de linguagens com delimitadores visuais de blocos, em Python a indentação é obrigatória. O aumento da indentação indica o início de um novo bloco, que termina da diminuição da indentação.
Usando um editor de texto comum é muito fácil existir erros de indentação, o recomendado é configurar o editor conforme a análise léxica do Python ou utilizar uma IDE. Todas as IDE que suportam a linguagem fazem indentação automaticamente.
Exemplo:
Indentação correta
def valor1():
    while True:
        try:
            c = int(raw_input('Primeiro Valor: '))
            return c
        except ValueError:
            print 'Inválido!'
Indentação incorreta
def valor1():
while True:
try:
c = int(raw_input('Primeiro Valor: '))
return c
except ValueError:
print 'Inválido!'
O código está correto para os dois exemplos, mas o analisador léxico verificará se a indentação está coerente. O analisador reconhecerá as palavras reservadas while, def, try, except, return, print e as cadeias de caracteres entre aspas simples e a indentação, e se não houver problemas o programa executará normalmente, senão apresentará a exceção: "Seu programa está com erro no bloco de indentação".

Compilador de bytecode

A linguagem é de altíssimo nível, como já dito, mas ela também pode compilar seus programas para que a próxima vez que o executar não precise compilar novamente o programa, reduzindo o tempo de carga na execução.
Utilizando o interpretador interativo não é necessário a criação do arquivo de Python compilado, os comandos são executados interativamente. Porém quando um programa ou um módulo é evocado, o interpretador realiza a análise léxica e sintática, compila o código de alto nível se necessário e o executa na máquina virtual da linguagem.
O bytecode é armazenado em arquivos com extensão .pyc ou .pyo, este último no caso de bytecode otimizado. Interessante notar que o bytecode da linguagem também é de alto nível, ou seja, é mais legível aos seres humanos que o código de byte do C, por exemplo. Para descompilar um código de byte é utilizado o módulo dis da biblioteca padrão da linguagem e existem módulos de terceiros que tornam o bytecode mais confuso, tornando a descompilação ineficaz.
Normalmente, o Python trabalha com dois grupos de arquivos:
  1. Os módulos do núcleo da linguagem, sua biblioteca padrão e os módulos independentes, criados pelo usuário.
  2. No núcleo do interpretador existe o analisador léxico, o analisador sintático que utiliza Estruturas de Objetos (tempo de execução), o Compilador que aloca memória (tempo de execução) e depois do Avaliador de código que modifica o estado atual do programa (tempo de execução), mostrando resultado para o usuário.

Polimorfismo

O conceito de polimorfismo descreve como objetos podem ser manipulados e acessados usando atributos e comportamentos em comum sem considerar sua classe específica e indica a presença de late binding, permitindo sobrecarga e determinação de tipos em tempo de execução e verificação.
Muitas linguagens orientadas a objeto utilizam assinaturas de função para determinar qual versão de um método sobrecarregado chamar. No entanto, as chamadas de função em Python são universais ou genéricas sem determinação de tipo. Por isso, sobrecarga não é suportada na linguagem.

Orientação a objetos

Python suporta a maioria das técnicas da programação orientada a objeto. Qualquer objeto pode ser usado para qualquer tipo, e o código funcionará enquanto haja métodos e atributos adequados. O conceito de objeto na linguagem é bastante abrangente: classes, funções, números e módulos são todos considerados objetos. Também há suporte para metaclasses, polimorfismo, e herança (inclusive herança múltipla). Há um suporte limitado para variáveis privadas.
Na versão 2.2 de Python foi introduzido um novo estilo de classes em que objetos e tipos foram unificados, permitindo a especialização de tipos. Já a partir da versão 2.3 foi introduzido um novo método de resolução de ambiguidades para heranças múltiplas.27
Uma classe é definida com class nome:, e o código seguinte é a composição dos atributos. Todos os métodos da classe recebem uma referência a uma instância da própria classe como seu primeiro argumento, e a convenção é que se chame este argumento self. Assim os métodos são chamados objeto.método(argumento1, argumento2, ...) e são definidos iguais a uma função, como método(self, argumento1, argumento2, ...). Veja que o parâmetro self conterá uma referência para a instância da classe definida em objeto quando for efetuada esta chamada. Os atributos da classe podem ser acessados em qualquer lugar da classe, e os atributos de instância (ou variável de instância) devem ser declarados dentro dos métodos utilizando a referência à instância atual (self) (ver código contextualizado em anexo).
Em Python não existe proteção dos membros duma classe ou instância pelo interpretador, o chamado encapsulamento. Convenciona-se que atributos com o nome começando com um _ são de uso privado da classe, mas não há um policiamento do interpretador contra acesso a estes atributos. Uma exceção são nomes começando com __, no caso em que o interpretador modifica o nome do atributo (ver código contextualizado em anexo).
Python permite polimorfismo, que condiz com a reutilização de código. É fato que funções semelhantes em várias partes do software sejam utilizadas várias vezes, então definimos esta função como uma biblioteca e todas as outras funções que precisarem desta a chamam sem a necessidade de reescrevê-la (ver código contextualizado em anexo).

Programação funcional

Uma das construções funcionais de Python é compreensão de listas, uma forma de construir listas. Por exemplo, pode-se usar a técnica para calcular as cinco primeiras potências de dois. O algoritmo quicksort também pode ser expressado usando a mesma técnica (ver códigos contextualizados para ambos os casos em anexo).
Em Python, funções são objetos de primeira classe que podem ser criados e armazenados dinamicamente. O suporte à funções anônimas está na construção lambda (cálculo Lambda). Não há disponibilidade de funções anônimas de fato, pois os lambdas contêm somente expressões e não blocos de código.
Python também suporta clausuras léxicas desde a versão 2.2 (ver códigos contextualizados para ambos os casos em anexo). Já geradores foram introduzidos na versão 2.2 e finalizados na versão 2.3, e representam o mecanismo de Python para a avaliação preguiçosa de funções (ver códigos contextualizados para ambos os casos em anexo).

Tratamento de exceções

Python suporta e faz uso constante de tratamento de exceções como uma forma de testar condições de erro e outros eventos inesperados no programa. É inclusive possível capturar uma exceção causada por um erro de sintaxe. O estilo da linguagem apóia o uso de exceções sempre que uma condição de erro pode aparecer. Por exemplo, ao invés de testar a disponibilidade de acesso a um recurso, a convenção é simplesmente tentar usar o recurso e capturar a exceção caso o acesso seja rejeitado (recurso inexistente, permissão de acesso insuficiente, recurso já em uso, ...).
Exceções são usadas frequentemente como uma estrutura de seleção, substituindo blocos if-else, especialmente em situações que envolvem threads. Uma convenção de codificação é o EAFP, do inglês, "é mais fácil pedir perdão que permissão". Isso significa que em termos de desempenho é preferível capturar exceções do que testar atributos antes de os usar. Segue abaixo exemplos de código que testam atributos ("pedem permissão") e que capturam exceções ("pedem perdão"):
Teste de atributo
if hasattr(spam, 'eggs'):
    ham = spam.eggs
else:
    handle_error()
Captura de exceção
try:
    ham = spam.eggs
except AttributeError:
    handle_error()
Ambos os códigos produzem o mesmo efeito, mas há diferenças de desempenho. Quando spam possui o atributo eggs, o código que captura exceções é mais rápido. Caso contrário, a captura da exceção representa uma perda considerável de desempenho, e o código que testa o atributo é mais rápido. Na maioria dos casos o paradigma da captura de exceções é mais rápido, e também pode evitar problemas de concorrência.28 Por exemplo, num ambiente multitarefa, o espaço de tempo entre o teste do atributo e seu uso de fato pode invalidar o atributo, problema que não acontece no caso da captura de exceções.

Biblioteca padrão

Python possui uma grande biblioteca padrão, geralmente citada como um dos maiores triunfos da linguagem,29 fornecendo ferramentas para diversas tarefas. Recentemente, a biblioteca Boost do C++ incluiu uma biblioteca para permitir a interoperabilidade entre as duas linguagens. Por conta da grande variedade de ferramentas fornecida pela biblioteca padrão, combinada com a a habilidade de usar linguagens de nível mais baixo como C e C++, Python pode ser poderosa para conectar componentes diversos de software.
A biblioteca padrão conta com facilidades para escrever aplicações para a Internet, contando com diversos formatos e protocolos como MIME e HTTP. Também há módulos para criar interfaces gráficas, conectar em bancos de dados relacionais e manipular expressões regulares.
Algumas partes da biblioteca são cobertas por especificações (por exemplo, a implementação WSGI da wsgiref segue o PEP 33330 ), mas a maioria dos módulos não segue.

Comentários

Python fornece duas alternativas para documentar o código. A primeira é o uso de comentários para indicar o que certo código faz. Comentários começam com # e são terminados pela quebra da linha. Não há suporte para comentários que se estendem por mais de uma linha; cada linha consecutiva de comentário deve indicar #. A segunda alternativa é o uso de cadeias de caractere, literais de texto inseridos no código sem atribuição. Cadeias de caracteres em Python são delimitadas por " ou ' para única linha e por """ ou ''' para múltiplas linhas. Entretanto, é convenção usar o métodos de múltiplas linhas em ambos os casos.
Diferente de comentários, a cadeias de caracteres usadas como documentação são objetos Python e fazem parte do código interpretado. Isso significa que um programa pode acessar sua própria documentação e manipular a informação. Há ferramentas que extraem automaticamente essa documentação para a geração da documentação de API a partir do código. Documentação através de cadeias de caracteres também pode ser acessada a partir do interpretador através da função help().

Plataformas disponíveis

A linguagem e seu interpretador estão disponíveis para as mais diversas plataformas, desde Unix (Linux, FreeBSD, Solaris, MacOS X, etc.), Windows, .NET, versões antigas de MacOS até consoles de jogos eletrônicos ou mesmo alguns celulares, como a série 60, N8xx(PyMaemo) da Nokia e palmtops.
Para algum sistema operacional não suportado, basta que exista um compilador C disponível e gerar o Python a partir do fonte. O código fonte é traduzido pelo interpretador para o formato bytecode, que é multiplataforma e pode ser executado e distribuído sem fonte original.

Implementações

A implementação original e mais conhecida do Python é o CPython, escrita em C e compatível com o padrão C89,31 sendo distribuída com uma grande biblioteca padrão escrita em um misto de Python e C. Esta implementação é suportada em diversas plataformas, incluindo Microsoft Windows e sistemas Unix-like modernos.
Stackless Python é uma variação do CPython que implementa microthreads (permitindo multitarefa sem o uso de threads), sendo suportada em quase todas as plataformas que a implementação original.
Existem também implementações para plataformas já existentes: Jython para a Plataforma Java e IronPython para .NET.
Em 2005 a Nokia lançou um interpretador Python para os telefones celulares S60, chamado PyS60. Essa versão inclui vários módulos das implementações tradicionais, mas também alguns módulos adicionais para a integração com o sistema operacional Symbian. Uma implementação para Palm pode ser encontrada no Pippy. Já o PyPy, é a linguagem Python totalmente escrita em Python.
Diversas implementações, como CPython, pode funcionar como um interpretador de comandos em que o usuário executa as instruções sequencialmente, recebendo o resultado automaticamente. A execução compilada do código oferece um ganho substancial em velocidade, com o custo da perda da interatividade.

Desenvolvimento

O desenvolvimento de Python é conduzido amplamente através do processo Python Enhancement Proposal ("PEP"), em português Proposta de Melhoria do Python. Os PEPs são documentos de projeto padronizados que fornecem informações gerais relacionadas ao Python, incluindo propostas, descrições, justificativas de projeto (design rationales) e explicações para características da linguagem. PEPs pendentes são revisados e comentados por Van Rossum, o Benevolent Dictator For Life (líder arquiteto da linguagem) do projeto Python. Desenvolvedores do CPython também se comunicam através de uma lista de discussão, python-dev, que é o fórum principal para discussão sobre o desenvolvimento da linguagem. Questões específicas são discutidas no gerenciador de erros Roundup mantido em python.org. O desenvolvimento acontece no auto-hospedado svn.python.org

Licença

Python possui uma licença livre aprovada pela OSI e compatível com a GPL, porém menos restritiva. Ela prevê (entre outras coisas) que binários da linguagem sejam distribuídos sem a necessidade de fornecer o código fonte junto.32

Módulos e frameworks

Ao longo do tempo têm sido desenvolvidos pela comunidade de programadores muitas bibliotecas de funções especializadas (módulos) que permitem expandir as capacidades base da linguagem. Entre estes módulos especializados destacam-se:

Descrição Campos de atuação
Django Framework para desenvolvimento ágil de aplicações web; desenvolvimento web
Pylons Framework para desenvolvimento de aplicações web; desenvolvimento web
TurboGears Framework baseado em várias outras tecnologias existentes no mundo que gira em torno da linguagem Python; desenvolvimento web
Matplotlib - Matplotlib / Pylab biblioteca para manipulação de gráficos 2D; processamento de imagem
Python Imaging Library biblioteca para manipulação de imagens digitais; processamento de imagem
PyOpenGL - Python OpenGL Binding suporte multiplataforma ao OpenGL; computação gráfica
Pygame Conjunto de módulos para o desenvolvimento de jogos eletrônicos, incluindo gráficos SDL; desenvolvimento de jogos eletrônicos; computação gráfica
Twisted Framework para o desenvolvimento de aplicações de rede. Inclui módulos para servidor web, de aplicação, SSH e diversos outros protocolos; desenvolvimento de software; desenvolvimento web
PYRO - Python Remote Objects Framework para o desenvolvimento de sistemas distribuídos; computação distribuída
ZODB Sistema de persistência e banco de dados orientado a objetos; banco de dados
Plone SGC - Sistema de gerenciamento de conteúdo; desenvolvimento web
CherryPy Framework para aplicações web; desenvolvimento web
Web2py Framework para aplicações web; desenvolvimento web
Visual Python Framework 3D de alto nível; computação gráfica
SQLObject Mapeador objeto-relacional: traduz estruturas relacionais para objetos Python e manipula o banco de dados de forma transparente; banco de dados
Numarray Módulo para manipulação de vetores e computação científica. computação científica

Interfaces gráficas

Exemplos de bibliotecas de GUI disponíveis para Python incluem:

Descrição
Etk interface para a biblioteca EFL
PyGTK interface para a biblioteca GTK
PyQT interface para a biblioteca QT
Tkinter Módulo padrão para GUI no Python
wxPython interface para a biblioteca wxWidgets
Wax Construído para simplificar o uso do wxPython

Ambientes de desenvolvimento integrado

Existem vários ambientes de desenvolvimento integrado (IDE) disponíveis para Python:

Desenvolvedor Última versão Platforma Toolkit Licença
Boa Constructor Team 0.6.1 Independente wxPython GPL
Eric Python IDE Detlev Offenbach 4.1.2 Independente Qt GPL
Geany Team 1.23 Independente GTK2 GPL
IDLE Guido van Rossum et al. 3.0 / 2008 Independente Tkinter PSFL
IronPython Studio Clarius Labs 1.0 / 10 de dezembro de 2007 Windows VS2008 Shell Runtime Microsoft Public License
Komodo ActiveState 4.1.1 / junho de 2007 multiplataforma Plataforma Mozilla Propretário
PyDev (Eclipse) Fabio Zadrozny 1.3.13 multiplataforma SWT EPL
PythonCard Alex Tweedly 0.8.2 multiplataforma wxPython Licença BSD
PyScripter mmm-experts 1.7.2 / outubro de 2006 Windows
MIT
Stani's Python Editor Stani 0.8.4c / 14 de fevereiro de 2008 Independente wxPython GPL
Wing IDE Wingware 3.0.2-1 / 27 de novembro de 2007 Windows, Linux, OS X PyGTK Propretário

Aplicações

Alguns dos maiores projetos que utilizam Python são o servidor de aplicação Zope, o compartilhador de arquivos Mnet, o sítio YouTube e o cliente original do BitTorrent. Grandes organizações que usam a linguagem incluem Google33 (parte dos crawlers), Yahoo! (para o sítio de grupos de usuários) e NASA.34 O sistema de gerenciamento de reservas da Air Canada também usa Python em alguns de seus componentes.35 A linguagem também tem bastante uso na indústria da segurança da informação.
A linguagem tem sido embarcada como linguagem de script em diversos softwares, como em programas de edição tridimensional como Maya,36 Autodesk Softimage, TrueSpace e Blender.37 Programas de edição de imagem também a usam para scripts, como o GIMP.38 Para diversos sistema operacionais a linguagem já é um componente padrão, estando disponível em diversas distribuições Linux. O Red Hat Linux usa Python para instalação, configuração e gerenciamento de pacotes.
Outros exemplos incluem o Plone, sistema de gerenciamento de conteúdo desenvolvido em Python e Zope e a Industrial Light & Magic,39 que produz filmes da série Star Wars usando extensivamente Python para a computação gráfica nos processos de produção dos filmes.

MODULOS

Ciência da computação é a ciência que estuda as técnicas, metodologias e instrumentos computacionais, que automatiza processos e desenvolve soluções baseadas no uso do processamento digital. Não se restringe apenas ao estudo dos algoritmos, suas aplicações e implementação na forma de software, extrapolando para todo e qualquer conhecimento pautado no computador, que envolve também a telecomunicação, o banco de dados e as aplicações tecnológicas que possibilitam atingir o tratamento de dados de entrada e saída, de forma que se transforme em informação. Assim, a Ciência da Computação também abrange as técnicas de modelagem de dados e os protocolos de comunicação, além de princípios que abrangem outras especializações da área.
Enquanto ciência, classifica-se como ciência exata, apesar de herdar elementos da lógica filosófica aristotélica, tendo por isto um papel importante na formalização matemática de algoritmos, como forma de representar problemas decidíveis, i.e., os que são susceptíveis de redução a operações elementares básicas, capazes de serem reproduzidas através de um qualquer dispositivo mecânico/eletrônico capaz de armazenar e manipular dados. Um destes dispositivos é o computador digital, de uso generalizado, nos dias de hoje. Também de fundamental importância para a área de ciência da computação são as metodologias e técnicas ligadas à implementação de software que abordam a especificação, modelagem, codificação, teste e avaliação de sistemas de software.
Os estudos oriundos da ciência da computação podem ser aplicados em qualquer área do conhecimento humano em que seja possível definir métodos de resolução de problemas baseados em repetições previamente observadas. Avanços recentes na ciência da computação tem impactado fortemente a sociedade contemporânea, em particular as aplicações relacionadas às áreas de redes de computadores, Internet, Web e computação móvel que têm sido utilizadas por bilhões de pessoas ao

História da computação

O ábaco, primeira ferramenta de computação, em sua forma moderna.
A primeira ferramenta conhecida para a computação foi o ábaco1 , cuja invenção é atribuída a habitantes da Mesopotâmia, em torno de 27002300 a.C.. Seu uso original era desenhar linhas na areia com rochas. Versões mais modernas do ábaco ainda são usadas como instrumento de cálculo.
No século VII a.C., na antiga Índia, o gramático Pānini formulou a gramática de Sânscrito usando 3959 regras conhecidas como Ashtadhyāyi, de forma bastante sistemática e técnica. Pānini usou transformações e recursividade com tamanha sofisticação que sua gramática possuía o poder computacional teórico tal qual a Máquina de Turing.
Entre 200 a.C. e 400, os indianos também inventaram o logaritmo, e partir do século XIII tabelas logarítmicas eram produzidas por matemáticos islâmicos. Quando John Napier descobriu os logaritmos para uso computacional no século XVI1 , seguiu-se um período de considerável progresso na construção de ferramentas de cálculo.

Algoritmos

No século VII, o matemático indiano Brahmagupta explicou pela primeira vez o sistema de numeração hindu-arábico e o uso do 0. Aproximadamente em 825, o matemático persa al-Khwarizmi escreveu o livro Calculando com numerais hindus, responsável pela difusão do sistema de numeração hindu-arábico no Oriente Médio, e posteriormente na Europa. Por volta do século XII houve uma tradução do mesmo livro para o latim: Algoritmi de numero Indorum. Tais livros apresentaram novos conceitos para definir sequências de passos para completar tarefas, como aplicações de aritmética e álgebra. Por derivação do nome do matemático, atualmente usa-se o termo algoritmo.

Lógica binária

Por volta do século III a.C., o matemático indiano Pingala inventou o sistema de numeração binário. Ainda usado atualmente no processamento de todos computadores modernos, o sistema estabelece que sequências específicas de uns e zeros podem representar qualquer informação.
Em 1703 Gottfried Leibniz desenvolveu a lógica em um sentido formal e matemático, utilizando o sistema binário. Em seu sistema, uns e zeros também representam conceitos como verdadeiro e falso, ligado e desligado, válido e inválido. Mais de um século depois, George Boole publicou a álgebra booleana (em 1854), com um sistema completo que permitia a construção de modelos matemáticos para o processamento computacional. Em 1801, apareceu o tear controlado por cartão perfurado, invenção de Joseph Marie Jacquard, no qual buracos indicavam os uns e, áreas não furadas, indicavam os zeros. O sistema está longe de ser um computador, mas ilustrou que as máquinas poderiam ser controladas pelo sistema binário.

Engenho analítico

Foi com Charles Babbage que o computador moderno começou a ganhar forma, através de seu trabalho no engenho analítico. O equipamento descrito originalmente em 1837, mais de um século antes de seu sucessor, nunca foi construído com sucesso, mas possuía todas as funções de um computador moderno. O dispositivo de Babbage se diferenciava por ser programável, algo imprescindível para qualquer computador moderno.
Durante sua colaboração, a matemática Ada Lovelace publicou os primeiros programas de computador em uma série de notas para o engenho analítico2 . Por isso, Lovelace é popularmente considerada como a primeira programadora.

Nascimento da ciência da computação

Antes da década de 1920, computador era um termo associado a pessoas que realizavam cálculos, geralmente liderados por físicos. Milhares de computadores eram empregados em projetos no comércio, governo e sítios de pesquisa. Após a década de 1920, a expressão máquina computacional começou a ser usada para referir-se a qualquer máquina que realize o trabalho de um profissional, especialmente aquelas de acordo com os métodos da Tese de Church-Turing.
O termo máquina computacional acabou perdendo espaço para o termo reduzido computador no final da década de 1940, com as máquinas digitais cada vez mais difundidas. Alan Turing, conhecido como pai da ciência da computação, inventou a Máquina de Turing, que posteriormente evoluiu para o computador moderno.

Trabalho teórico

Os fundamentos matemáticos da ciência da computação moderna começaram a ser definidos por Kurt Gödel com seu teorema da incompletude (1931). Essa teoria mostra que existem limites no que pode ser provado ou desaprovado em um sistema formal; isso levou a trabalhos posteriores por Gödel e outros teóricos para definir e descrever tais sistemas formais, incluindo conceitos como recursividade e cálculo lambda.
Em 1936 Alan Turing e Alonzo Church independentemente, e também juntos, introduziram a formalização de um algoritmo, definindo os limites do que pode ser computador e um modelo puramente mecânico para a computação. Tais tópicos são abordados no que atualmente chama-se Tese de Church-Turing, uma hipótese sobre a natureza de dispositivos mecânicos de cálculo. Essa tese define que qualquer cálculo possível pode ser realizado por um algoritmo sendo executado em um computador, desde que haja tempo e armazenamento suficiente para tal.
Representação visual da Máquina de Turing
Turing também incluiu na tese uma descrição da Máquina de Turing, que possui uma fita de tamanho infinito e um cabeçote para leitura e escrita que move-se pela fita. Devido ao seu caráter infinito, tal máquina não pode ser construída, mas tal modelo pode simular a computação de qualquer algoritmo executado em um computador moderno. Turing é bastante importante para a ciência da computação, tanto que seu nome é usado para o Prêmio Turing e o teste de Turing. Ele contribuiu para as quebras de código da Grã-Bretanha3 na Segunda Guerra Mundial, e continuou a projetar computadores e programas de computador pela década de 1940; cometeu suicídio em 1954.4 5 .

Shannon e a teoria da informação

Até a década de 1930, engenheiros eletricistas podiam construir circuitos eletrônicos para resolver problemas lógicos e matemáticos, mas a maioria o fazia sem qualquer processo, de forma particular, sem rigor teórico para tal. Isso mudou com a tese de mestrado de Claude Shannon de 1937, A Symbolic Analysis of Relay and Switching Circuits. Enquanto tomava aulas de Filosofia, Shannon foi exposto ao trabalho de George Boole, e percebeu que poderia aplicar esse aprendizado em conjuntos eletro-mecânicos para resolver problemas. Shannon desenvolveu a teoria da informação no artigo de 1948: A Mathematical Theory of Communication6 , cujo conteúdo serve como fundamento para áreas de estudo como compressão de dados e criptografia.7

Realizações para a sociedade

Apesar de sua pequena história enquanto uma disciplina acadêmica, a ciência da computação deu origem a diversas contribuições fundamentais para a ciência e para a sociedade. Esta ciência foi responsável pela definição formal de computação e computabilidade, e pela prova da existência de problemas insolúveis ou intratáveis computacionalmente.
8 Também foi possível a construção e formalização do conceito de linguagem de computador, sobretudo linguagem de programação, uma ferramenta para a expressão precisa de informação metodológica flexível o suficiente para ser representada em diversos níveis de abstração.9
Para outros campos científicos e para a sociedade de forma geral, a ciência da computação forneceu suporte para a Revolução Digital, dando origem a Era da Informação.8 A computação científica é uma área da computação que permite o avanço de estudos como o mapeamento do genoma humano (ver Projeto Genoma Humano).