<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Um pouco mais de ARQUITETURA...</title>
	<atom:link href="http://arqblog.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://arqblog.wordpress.com</link>
	<description>por ely e riczignal</description>
	<lastBuildDate>Wed, 13 Aug 2008 03:24:45 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='arqblog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Um pouco mais de ARQUITETURA...</title>
		<link>http://arqblog.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://arqblog.wordpress.com/osd.xml" title="Um pouco mais de ARQUITETURA..." />
	<atom:link rel='hub' href='http://arqblog.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Lembrete</title>
		<link>http://arqblog.wordpress.com/2008/08/13/lembrete/</link>
		<comments>http://arqblog.wordpress.com/2008/08/13/lembrete/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 03:19:00 +0000</pubDate>
		<dc:creator>elg003</dc:creator>
				<category><![CDATA[Extra]]></category>
		<category><![CDATA[Obrigações]]></category>
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://arqblog.wordpress.com/?p=47</guid>
		<description><![CDATA[Só pra lembrar que a categoria Extras contém assuntos variados que complementam a categoria Obrigações. A categoria Obrigações aborda os trabalhos passados em aula.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=47&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Só pra lembrar que a categoria </strong><em>Extras</em><strong> contém assuntos variados que complementam a categoria </strong><em>Obrigações</em><strong>.</strong></p>
<p><strong>A categoria </strong><em>Obrigações</em><strong> aborda os trabalhos passados em aula.</strong></p>
<p> <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/arqblog.wordpress.com/47/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/arqblog.wordpress.com/47/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/arqblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/arqblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/arqblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/arqblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/arqblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/arqblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/arqblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/arqblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/arqblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/arqblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/arqblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/arqblog.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/arqblog.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/arqblog.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=47&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://arqblog.wordpress.com/2008/08/13/lembrete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0718c18afc717fee22f891b38bab5dc6?s=96&#38;d=identicon" medium="image">
			<media:title type="html">elg003</media:title>
		</media:content>
	</item>
		<item>
		<title>Unidade III &#8211; Extras</title>
		<link>http://arqblog.wordpress.com/2008/08/13/unidade-iii-extras/</link>
		<comments>http://arqblog.wordpress.com/2008/08/13/unidade-iii-extras/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 02:52:03 +0000</pubDate>
		<dc:creator>elg003</dc:creator>
				<category><![CDATA[Extra]]></category>

		<guid isPermaLink="false">http://arqblog.wordpress.com/?p=39</guid>
		<description><![CDATA[MRAM: Um novo tipo de memória As tecnologias de memória RAM que existem atualmente no mercado, podem ser classificadas basicamente em memórias voláteis e memórias não voláteis. As memórias SDRAM, EDO e FPM que utilizamos nos micros domésticos são memórias voláteis, que permitem um acesso a dados relativamente rápido, são baratas, mas em compensação perdem [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=39&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>MRAM: Um novo tipo de memória</strong></p>
<p>As tecnologias de memória RAM que existem atualmente no mercado, podem ser classificadas basicamente em memórias voláteis e memórias não voláteis.</p>
<p>As memórias SDRAM, EDO e FPM que utilizamos nos micros domésticos são memórias voláteis, que permitem um acesso a dados relativamente rápido, são baratas, mas em compensação perdem todos os dados quando o micro é desligado. Outro problema é que este tipo de memória consome muita eletricidade, um módulo de 64 MB de memória PC-100 por exemplo, consome mais de 5 Watts. Estes dois fatores somados impedem que este tipo de memória seja usada um micros de mão, celulares, etc., apenas em micros de mesa e notebooks.</p>
<p>Em seguida, temos as memórias SRAM, ou Static RAM, as memórias que encontramos na forma de memória cache. A SRAM é um tipo de memória ultra-rápida, que traz a vantagem adicional de não consumir tanta energia, sendo muito utilizada em micros de mão (os Palms por exemplo), agendas eletrônicas, celulares, etc. O grande problema das SRAM é que elas são incrivelmente caras.</p>
<p>Como terceira opção, temos as memórias Flash. Elas não são tão rápidas quanto as SRAM, e também não são nem um pouco baratas, muito pelo contrário, também são caríssimas, mas em compensação trazem a vantagem de armazenar os dados por tempo indeterminado, sem a necessidade de serem alimentadas eletricamente. Isso explica o seu uso em cartões de memória por exemplo.</p>
<p>Porém, a IBM anunciou a criação de mais uma tecnologia de memória, a MRAM, ou Magnetc RAM. A idéia fundamental é ler e gravar dados de forma magnética e não usando eletricidade como nas tecnologias atuais. As vantagens, segundo a IBM, seriam um consumo elétrico muito menor, uma velocidade de acesso mais alta, e principalmente, o fato das memórias conservarem os dados gravados, assim como nas memórias Flash.</p>
<p>Até o momento, a IBM tem apenas protótipos, mas planeja lançar os novos módulos no mercado nos próximos 4 anos.</p>
<p>Caso a IBM consiga cumprir suas promessas, as memórias MRAM trarão uma verdadeira revolução no ramo de memórias, principalmente no ramo de portáteis, que poderão substituir as caríssimas memórias SRAM e Flash por um tipo de memória muito mais barato. Teremos então aparelhos com muito mais memória, com uma autonomia de baterias bem superior, e principalmente, bem mais baratos. São justamente os preços exorbitantes das memórias SRAM e Flash que fazem os Palms, celulares e agendas eletrônicas virem com tão pouca memória.</p>
<p>Nos desktops, as memórias MRAM também podem ser muito úteis, pois por não perderem os dados, permitem que tanto a inicialização quanto o desligamento dos micros seja instantâneo, já que não é preciso ler os salvar dados no disco rígido cada vez que o micro for ligado ou desligado, eles sempre estarão na memória. Isso fora o fato de economizarmos bastante na conta de luz.</p>
<p>Veja que iniciativas como a MRAM e o Crusoé, que comentei no artigo de ontem, estão pavimentando o caminho para micros portáteis e celulares cada vez mais poderosos. Ao invés de costurar baterias na roupa, criar mini reatores nucleares e outras loucuras que andam divulgando por aí, estes dispositivos seguem um caminho muito mais lógico, que é simplesmente gastar menos eletricidade, combinando poder de processamento com baixo consumo.</p>
<p><strong>RAID 10</strong></p>
<p>Um dos grandes atrativos do RAID é a possibilidade de escolher entre diferentes modos de operação, de acordo com a relação capacidade/desempenho/confiabilidade que você pretende atingir.</p>
<p>O RAID 10 (Mirror/Strip) é um modo que pode ser usado apenas caso você tenha a partir de 4 discos rígidos e o módulo total seja um número par (6, 8, etc.). Neste modo, metade dos HDs serão usados em modo striping (RAID 0), enquanto a segunda metade armazena uma cópia dos dados dos primeiros, assegurando a segurança.</p>
<p>Este modo é na verdade uma combinação do RAID 0 e RAID 1, daí o nome. O ponto fraco é que você sacrifica metade da capacidade total. Usando 4 HDs de 500 GB, por exemplo, você fica com apenas 1 TB de espaço disponível. No RAID 10 você obtém o dobro de desempenho que em um HD sozinho, mas sem abrir mão da segurança.</p>
<p><strong>Memória bolha</strong></p>
<p><strong>Memória Bolha</strong> é um tipo de memória de computador de aramazenamento não-volátil que usa um filme de material magnético de pequena espessura para prender pequenas áreas magnetizadas reconhecidas como <em>bolhas</em>, que armazenam um bit de dados. Memória bolha surgiu no início dos anos 1970<a title="1970" href="http://pt.wikipedia.org/wiki/1970"></a> como uma promessa de tecnologia, mas falhou comercialmente devido à rápida queda dos preços dos discos rígidos no início dos anos 1980<a title="1980" href="http://pt.wikipedia.org/wiki/1980"></a>.</p>
<p><strong>Mémoria GDDR</strong></p>
<p>Memórias RAM também são usadas em placas de vídeo, para formar o circuito de memória de vídeo. Até muito recentemente, a memória de vídeo usava exatamente a mesma tecnologia da memória RAMque é instalada na placa-mãe.<br />
Placas de vídeo de alto desempenho, no entanto, estavam precisando de memórias mais rápidas do que as usadas convencionalmente no PC.<br />
Com isso optou-se por usar memórias com as tecnologias DDR2 e DDR3<a class="new" title="DDR3 (ainda não escrito)" href="http://pt.wikipedia.org/w/index.php?title=DDR3&amp;action=edit&amp;redlink=1"></a>.<br />
Só que as memórias DDR2 e DDR3 usadas em placas de vídeo têm características diferentes das memórias DDR2 e DDR3 usadas no PC – especialmente a tensão de alimentação.<br />
Por este motivo é que elas são chamadas GDDR2 e GDDR3 (o “G” vem de “Gráfica”)</p>
<p>maiores detalhes: <a href="http://pt.wikipedia.org/wiki/GDDR">http://pt.wikipedia.org/wiki/GDDR</a></p>
<p><strong>Memórias Regulares</strong></p>
<p>As memórias regulares são o tipo mais primitivo de memória RAM. Nelas, o acesso é feito da forma tradicional, enviando o endereço RAS, depois o CAS e aguardando a leitura dos dados para cada ciclo de leitura.</p>
<p>Isto funcionava bem nos micros XT e 286, onde o clock do processador era muito baixo, de forma que a memória RAM era capaz de funcionar de forma sincronizada com ele. Em um 286 de 8 MHz, eram,usados chips com tempo de acesso de 125 ns (nanossegundos) e em um de 12 MHz eram usados chips de 83 ns.</p>
<p>O problema era que a partir daí as memórias da época atingiram seu limite e passou a ser necessário fazer com que a memória trabalhasse de forma assíncrona, onde o processador trabalha a uma freqüência mais alta que a memória RAM.</p>
<p>A partir do 386, a diferença passou a ser muito grande, de forma que as placas mãe passaram a trazer chips de memória cache, dando início à corrida que conhecemos.</p>
<p><strong>Intel Expande Oferta de Memória Flash</strong></p>
<p>Boa matéria que fala sobre o soluções que a Intel implementa nos telefones celulares, como o uso da memória PSRAM.</p>
<p>link: <a href="http://www.intel.com/portugues/technology/magazine/archive/2006/jan/revista0106_6.pdf">http://www.intel.com/portugues/technology/magazine/archive/2006/jan/revista0106_6.pdf</a></p>
<p><strong>Os próximos tópicos são complementos para o conhecimento da memória NVRAM.</strong></p>
<p><strong>Benefícios da NVRAM</strong></p>
<ul style="list-style-type:square;">
<li> NVRAM chips de memória RAM trabalho como estático</li>
<li> NVRAMs proporcionar um desempenho superior em relação aos outros produtos MNV</li>
<li> NVRAM&#8217;s servem aplicações que requerem alta velocidade leitura / escrita operações com memórias não voláteis tais como o processamento paralelo controladores para LANs e sistemas de travagem antibloqueio.</li>
<li> NVRAM chips não exigem muito poder e de backup pode ser garantida por até dez anos.</li>
</ul>
<p><strong>Bad NVRAM</strong></p>
<p>Quando NVRAM está a falhar, é geralmente significa que o seu computador hardware não está retendo os ajustes necessários especializados que deveria embora o padrão permanecer configurações de BIOS. Uma vez que o BIOS conta com as configurações armazenadas no NVRAM, a fim de lidar com o hardware que você tem particular, o desempenho pode faltar na estabilidade. O conteúdo da NVRAM chip pode tornar-se corrompido por uma variedade de razões:</p>
<ul style="list-style-type:square;">
<li> Um fracasso da bateria embutido. Se a bateria NVRAM chip incorporado ao falhar, então isso significa que o relógio do sistema irá parar de correr e importantes informações de configuração do sistema não poderá ser mantida.</li>
<li> Uma falha do CMOS (BIOS) chip em sua placa mãe. Se o chip CMOS vai mal ou não é bom fazer contato com os contactos da placa-mãe, então a NVRAM irá falhar.</li>
</ul>
<p><strong>Quando você receber uma mensagem de erro sobre o seu NVRAM</strong></p>
<ul style="list-style-type:square;">
<li> Pode ter necessidade de comprar uma bateria nova CMOS em seu computador loja para substituir a atual. É aconselhável ter um técnico para observar a primeira bateria e determinar se você realmente precisa de um novo.</li>
<li> Se o BIOS chip era o problema, será preciso entrar em contato com o fabricante hardware que pode dar-lhe um substituto chip dependendo da sua garantia. Se assim não for, então você terá que substituir sua placa mãe.</li>
<li> Você também pode tentar de reprogramar o chip NVRAM e hostid com um endereço Ethernet. Você só deve tentar fazer isto se você sabe exatamente o que você está fazendo, caso contrário você deve procurar a orientação de um técnico.</li>
</ul>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/arqblog.wordpress.com/39/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/arqblog.wordpress.com/39/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/arqblog.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/arqblog.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/arqblog.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/arqblog.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/arqblog.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/arqblog.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/arqblog.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/arqblog.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/arqblog.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/arqblog.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/arqblog.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/arqblog.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/arqblog.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/arqblog.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=39&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://arqblog.wordpress.com/2008/08/13/unidade-iii-extras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0718c18afc717fee22f891b38bab5dc6?s=96&#38;d=identicon" medium="image">
			<media:title type="html">elg003</media:title>
		</media:content>
	</item>
		<item>
		<title>Unidade III</title>
		<link>http://arqblog.wordpress.com/2008/08/13/unidade-iii/</link>
		<comments>http://arqblog.wordpress.com/2008/08/13/unidade-iii/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 02:32:20 +0000</pubDate>
		<dc:creator>elg003</dc:creator>
				<category><![CDATA[Obrigações]]></category>

		<guid isPermaLink="false">http://arqblog.wordpress.com/?p=34</guid>
		<description><![CDATA[A memória pode receber e armazenar informação, assim como fornecer a mesma. A memória tem diminutos condensadores que conseguem reter as informações recebidas e reenvia-las. A memória é capaz de conservar, acessar de forma rápida e aleatória, qualquer informação. Qualquer microcomputador contém um mínimo de memória para seu funcionamento, seja ela principal ou secundária. Em [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=34&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">A memória pode receber e armazenar informação, assim como fornecer a mesma. A memória tem diminutos condensadores que conseguem reter as informações recebidas e reenvia-las. A memória é capaz de conservar, acessar de forma rápida e aleatória, qualquer informação. Qualquer microcomputador contém um mínimo de memória para seu funcionamento, seja ela principal ou secundária.</p>
<p>Em um microcomputador existem vários tipos de memória principal. Há duas classes principais quanto ao poder de gravação dos dados:</p>
<p>Memória ROM &#8211;   ROM é a sigla para Read Only Memory (memória somente de leitura). Já pelo nome, é possível perceber que esse tipo de memória só permite leitura, ou seja, suas informações são gravadas pelo fabricante uma única vez e após isso não podem ser alteradas ou apagadas, somente acessadas. Em outras palavras, são memórias cujo conteúdo é gravado permanentemente.</p>
<p>Memória RAM &#8211;  RAM é a sigla para Random Access Memory (memória de acesso aleatório). Este tipo de memória permite tanto a leitura como a gravação e regravação de dados. No entanto, assim que elas deixam de ser alimentadas eletricamente, ou seja, quando o usuário desliga o computador, a memória RAM perde todos os seus dados.</p>
<p>A seguir, listaremos alguns tipos de memórias ROM e RAM com algumas definições e características inerentes a cada uma.</p>
<p><strong>EPROM</strong></p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>No processo de evolução das memórias, passaram a ser necessárias memórias que permitissem a regravação e continuassem sendo ROMs depois disto. Surgiram então as memórias EPROM (<em>Erasable programmable</em> <em>read only memory</em>). Significa que<span> </span>pode gravar dados, apagar dados e depois disto ela é utilizada como memória somente para leitura.</p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>As memórias EPROM utilizam a tecnologia opto &#8211; elétrica. Os dados são gravados por meio de tensão e corrente elétrica e apagados por meio de luz ultravioleta.</p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>As pastilhas de memórias EPROM vêm com uma janela de cristal que permite visualizar a matriz de elementos que compõem a memória. Aplicando radiação ultravioleta pela janela, ela atinge todas as locações de memória, apagando seus conteúdos.</p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>As memórias EPROM têm que ser apagadas totalmente, não sendo possível apagar apenas um bit ou endereço e deixar todo o resto como estava.</p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>Após a gravação de uma EPROM é aconselhável cobrir a janela de cristal com uma etiqueta adesiva metalizada, para evitar que radiação ultravioleta entre acidentalmente e danifique as informações nela contidas.</p>
<p class="MsoNormal" style="text-align:justify;"><strong>EEPROM</strong></p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>Com as memórias EEPROM (<em>Electrically erasable programmable </em>read only memory) é possível gravar e apagar dados com sinais elétricos, não sendo mais necessária a radiação ultravioleta. Podemos apagar somente 1 bit, se for o caso, e deixar o resto como estava.</p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>Também conhecida como E2PROM, E<sup>2</sup>PROM e E<sub>2</sub>PROM.</p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>Vantagens: É possível gravar, apagar e regravar utilizando apenas sinais elétricos.</p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>Desvantagens: Consome muita energia e tem poucos endereços de memória, comparado com a EPROM.</p>
<p class="MsoNormal" style="text-align:justify;"><span> </span>São aplicáveis em sistemas eletrônicos que precisam de setup, agendas eletrônicas, câmeras fotográficas, etc.</p>
<p class="MsoNormal"><span lang="EN-US"><strong>OTP-ROM (<em>One-time programmable read only memory)</em></strong></span></p>
<p class="MsoNormal" style="margin-left:36pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>•<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->As conexões são programadas pelo usuário</p>
<p class="MsoNormal" style="margin-left:72pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>–<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Usuário define o arquivo especificando o conteúdo da ROM</p>
<p class="MsoNormal" style="margin-left:72pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>–<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Arquivo é inserido na máquina denominada <em>ROM programmer </em></p>
<p class="MsoNormal" style="margin-left:72pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>–<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Cada conexão programável corresponde a um ponto fundido</p>
<p class="MsoNormal" style="margin-left:72pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>–<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><em>ROM programmer</em> rompe os pontos fundidos onde a conexão não deve existir</p>
<p class="MsoNormal" style="margin-left:36pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>•<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Habilidade de escrita muito baixa</p>
<p class="MsoNormal" style="margin-left:72pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>–<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Escrita uma única vez; necessita do dispositivo de programação da ROM</p>
<p class="MsoNormal" style="margin-left:36pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>•<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Retenção de informações muito alta</p>
<p class="MsoNormal" style="margin-left:72pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>–<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Os bits armazenados permanecem, a menos que o programador seja usado para romper mais conexões</p>
<p class="MsoNormal" style="margin-left:36pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>•<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Comumente utilizado em produtos finais</p>
<p class="MsoNormal" style="margin-left:72pt;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-family:&quot;"><span>–<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Barato, dificilmente é modificado acidentalmente</p>
<p><strong>SRAM = Static Random Access Memory</strong></p>
<p>É uma memória na qual as &#8220;células&#8221; que armazenam os bits são compostas de arranjos de 4 a 6 transistores, numa estrutura chamada &#8220;flip-flop&#8221;.<br />
Esse tipo de arranjo é extremamente rápido e mantém a informação armazenada enquanto houver energia alimentando a memória.</p>
<p>A desvantagem desse tipo de memória é que ela consome de 4 a 6 transistores, ou seja, demanda uma área de silício considerável; por isso, a capacidade de armazenamento é comparativamente menor em relação às memórias DRAM (Dynamic Random Access Memory).</p>
<p>As DRAMs usam apenas um transistor para armazenar os bits, permitindo um aproveitamento excelente do silício. No entanto, sua estrutura simples requer o uso de complicados procedimentos de &#8220;refresh&#8221;, destinados a não deixar que as células percam a informação, que de outra forma, em poucos milissegundos se perderia.</p>
<p>As memórias SRAM são geralmente usadas na função de memória cache, para armazenar as informações mais frequentemente utilizadas de forma a poderem ser &#8220;chamadas&#8221; mais rapidamente. Também por não precisarem de sistemas de refresh, as SRAMs consomem muito pouca energia, sendo especialmente viáveis em aparelhos portáteis alimentados a bateria.</p>
<p><strong>DRAM</strong></p>
<p>A Memória DRAM (Dinamic Ram, Ram dinâmica), é o tipo de memória mais empregada atualmente, pelo fato de guardar uma grande quantidade de bits, e serem relativamente baratas. A memória DRAM é a principal memória do Pc, ela retém a informação através diminutos condutores. Uma desvantagem das memórias DRAM é precisar que os diminutos sejam recarregados constantemente, para que não se perca seus dados, e com isso consome vários ciclos do processador.</p>
<p><strong>PSRAM</strong></p>
<p>A especificação PSRAM (pseudo static random access memory), que é similar a memória SRAM (static RAM) e tem um estrutura semelhante ao DRAM (dynamic RAM), trabalha mais rápida e consome menos energia que outros tipos de memória em aparelhos móveis.<br />
A PSRAM também permite velocidades mais altas para a transferência de dados e ajuda os desenvolvedores a incluir mais funcionalidades nos telefones 3G.<strong><br />
</strong></p>
<p><strong>NVRAM</strong></p>
<p>NVRAM é um acrônimo para a não-volátil Random Access Memory. NVRAM é um tipo de Random Access Memory (RAM) que mantém a sua informação quando o poder está desligado. A NVRAM é um pequeno 24 pinos DIP (Dual Inline Package) chip circuito integrado, sendo, portanto, capaz de obter o poder necessário para mantê-lo correr a partir do CMOS bateria instalada em sua placa mãe. Ela mantém controle de diversos parâmetros de sistema, tais como número de série, Ethernet MAC (Media Access Control) endereço, HOSTID, data de fabricação, etc NVRAM é, portanto, um tipo de memória não-volátil que oferece acesso aleatório.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/arqblog.wordpress.com/34/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/arqblog.wordpress.com/34/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/arqblog.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/arqblog.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/arqblog.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/arqblog.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/arqblog.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/arqblog.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/arqblog.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/arqblog.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/arqblog.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/arqblog.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/arqblog.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/arqblog.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/arqblog.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/arqblog.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=34&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://arqblog.wordpress.com/2008/08/13/unidade-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0718c18afc717fee22f891b38bab5dc6?s=96&#38;d=identicon" medium="image">
			<media:title type="html">elg003</media:title>
		</media:content>
	</item>
		<item>
		<title>Unidade II- extraido do site http://www.ccppbrasil.org/planet/</title>
		<link>http://arqblog.wordpress.com/2008/08/13/unidade-ii-extraido-do-site-httpwwwccppbrasilorgplanet/</link>
		<comments>http://arqblog.wordpress.com/2008/08/13/unidade-ii-extraido-do-site-httpwwwccppbrasilorgplanet/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 01:04:22 +0000</pubDate>
		<dc:creator>elg003</dc:creator>
				<category><![CDATA[Extra]]></category>

		<guid isPermaLink="false">http://arqblog.wordpress.com/?p=28</guid>
		<description><![CDATA[Entrevista ++ : Bjarne Stroustrup fala sobre a evolução das linguagens de programação De tempos em tempos, um salto evolucionário promove o rápido avanço e a reformulação de todo o campo da engenharia. Um movimento assim ocorreu no desenvolvimento de software com o lançamento da linguagem de programação C++. E não foi algo inerente à [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=28&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="ArticleNormalPara"><strong>Entrevista ++ : Bjarne Stroustrup fala sobre a evolução das linguagens de programação</strong></div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">De tempos em tempos, </span> um salto evolucionário promove o rápido avanço e a reformulação de todo o campo da engenharia. Um movimento assim ocorreu no desenvolvimento de software com o lançamento da linguagem de programação C++. E não foi algo inerente à linguagem propriamente dita: linguagens orientadas a objeto, como o Simula67 e o Smalltalk, já existiam antes do C++. Mas, como o C++ foi criado a partir da linguagem de programação C (sendo capaz de compilar os programas em C já existentes), conseguiu trazer as abstrações do pensamento orientado a objeto para um público muito mais amplo.</div>
<div class="ArticleNormalPara">O C++ inspirou muitas idéias associadas ao design e ao desenvolvimento de software, desde padrões de design até metaprogramação. E, devido à sua portabilidade entre plataformas de hardware e expressividade em nível inferior, o C++ terá certamente um papel fundamental em um mundo com dispositivos de hardware menores e mais rápidos.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara">Recentemente, tive o prazer de conversar com Bjarne Stroustrup, o criador do C++, sobre vários assuntos, desde suas idéias sobre linguagens até as tendências gerais do setor e sua lista pessoal de leitura. Muitas das perguntas foram sugeridas pelos leitores no meu blog, então agradeço a todos os que contribuíram. E, é claro, agradeço a Bjarne.</div>
<div id="S1" class="ArticleTypeTitle">Idéias sobre linguagens</div>
<div class="ArticleTypeTitle"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">Howard Dierking </span> Por que as pessoas têm uma ligação tão profunda com as linguagens de programação, a ponto de se formarem comunidades de fanáticos por linguagens?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">Bjarne Stroustrup </span> Você deveria perguntar isso a um psicólogo, um sociólogo, ou até mesmo a um economista, e não a um cientista da computação! Meu palpite é que as linguagens que usamos para expressar nossas idéias tornam-se parte de nós, tanto que, se você só conhece uma linguagem, os partidários de outras linguagens podem representar uma ameaça pessoal. Nesse caso, a solução parece ser conhecer também outras linguagens. Não acredito que seja possível atuar profissionalmente na área de software conhecendo apenas uma linguagem de programação. Também pode haver um motivo econômico: embora os conhecimentos básicos transcendam os limites das linguagens de programação, o mesmo não se aplica a várias habilidades práticas. Então, se eu conheço apenas a linguagem X e seus conjuntos de ferramentas, mas você quer discutir a linguagem Y e seus conjuntos de ferramentas, você está ameaçando o meu meio de vida. Mais uma vez, parece que a solução é conhecer várias linguagens e conjuntos de ferramentas (e ter uma base sólida nos fundamentos da área). Infelizmente, as soluções que sugiro não levam em conta o fato de que a maioria das pessoas tem muito pouco tempo livre, depois de dar conta de todos os afazeres. Mas isso não é desculpa para o fanatismo.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Qual deveria ser o papel do IDE no desenvolvimento de software? De que forma o IDE deveria dar suporte a uma linguagem?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Não sou um usuário intensivo de IDE. Gosto de um editor de IDE com boa capacidade de resposta e compreensão da minha linguagem, mas também quero ser capaz de trabalhar sem um IDE. Talvez eu tivesse outra opinião se houvesse um bom IDE disponível universalmente — que fosse, na verdade, uma parte da linguagem, ou vice-versa . O meu desejo de portabilidade interfere nessa questão. Com o C++, quero ser capaz de entender o meu sistema somente a partir do código-fonte nos arquivos de origem. Rejeito energicamente os mecanismos de IDE envolvendo transformações ou gerações que não podem ser representadas por código adequado ao consumo humano.</div>
<div class="ArticleImageSpacer">
<div class="ArticleImageCaptionText"></div>
</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você vê o ruído ou a legibilidade como um problema nas atuais linguagens de finalidade geral? Em caso positivo, qual é a solução?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Seria ótimo ter uma sintaxe mais simples, mas suspeito que a maioria das pessoas, quando reclama da legibilidade, não se refere ao texto em si, mas sim à complexidade do que é expresso. Muitas pessoas esperam explorar qualquer programa, escrito em qualquer linguagem, e — com alguma ajuda de uma estrutura de suporte online — entender todos os construtores usados para expressar o programa e toda a lógica do programa em si. Compare isso com a forma como entendemos e usamos os idiomas. Você esperaria entender um soneto de Shakespeare sem qualquer informação de referência? E quanto ao Beowulf no inglês arcaico original? Talvez esperemos demais das linguagens de programação. Qualquer linguagem capaz de expressar todos os elementos necessários a uma vastidão de áreas de aplicativos poderia ser considerada desnecessariamente complexa para um determinado aplicativo, mas na verdade precisa lidar com um conjunto de aplicativos praticamente ilimitado. As linguagens específicas de domínio podem ajudar em casos específicos, mas então precisamos lidar com as complexidades de muitas linguagens e de suas interações.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Como uma linguagem de finalidade geral deve dar suporte a idéias para o design de aplicativos, como a programação de componentes e serviços?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Uma linguagem de finalidade geral deveria dar suporte à escrita de bibliotecas capazes de expressar noções gerais e específicas de aplicativos, dar suporte à criação de ferramentas e fornecer o elemento de ligação necessário para conectar partes distintas de um aplicativo. Para fazer isso, a linguagem precisa de flexibilidade, um sistema de tipos expressivo, um bom desempenho básico e estabilidade de longo prazo.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> A expedição múltipla é positiva?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Sim. Uma linguagem de programação convencional de expedição única orientada a objeto (como Simula, C++, Smalltalk, Java e C#) não pode expressar com elegância operações simples, como multiplicar números ou encontrar a interseção entre duas formas, nas quais os tipos exatos não são conhecidos até o runtime. O código resultante (que depende da expedição dupla, do padrão do visitante e assim por diante) é lento e não tão fácil de manter como gostaríamos. As linguagens que oferecem suporte à expedição múltipla em runtime (como Dylan e CLOS) apresentam melhor desempenho e as linguagens (como o C++) que oferecem suporte em tempo de compilação podem ajudar um pouco. Ano passado, junto com alguns alunos meus, publiquei um artigo de pesquisa sobre como acrescentar corretamente a expedição múltipla ao C++. O código resultante para casos de uso com expedição múltipla é menor, mais simples, usa menos memória e é executado com mais rapidez do que todas as soluções alternativas que já vimos (veja a <strong>Figura 2</strong>). No entanto, esse trabalho chegou tarde demais para o C++0x. Você encontra um artigo sobre isso em <a href="http://research.att.com/%7Ebs/multimethods.pdf">research.att.com/~bs/multimethods.pdf</a>.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleImageSpacer">
<div class="ArticleImageCaptionText"></div>
</div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> O que você acha da atual covariância/contravariância no C++? Você espera uma mudança do comportamento atual nas futuras versões da linguagem?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Na verdade, não. Nessa área, acho que o C++ faz o que deveria fazer. Você está pensando em exemplos como converter um vector&lt;Apple&gt; em um vector&lt;Fruit&gt;? Isso é extremamente inseguro, a não ser que o vector&lt;Fruit&gt; seja imutável (ou você poderia adicionar Orange a ele). Não acho que a verificação implícita de tipos em runtime seja uma boa abordagem para esse tipo de problema.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> O que você acha de tornar a transmissão de mensagens um recurso fundamental das linguagens, em oposição à chamada de métodos?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Gosto da transmissão explícita de mensagens, mas só a utilizei há muito tempo atrás e no contexto de sistemas distribuídos. Em uma visão realista, para o trabalho em grande escala, precisaríamos aperfeiçoar muito o suporte de linguagens e ferramentas para a transmissão de mensagens. Não acredito que isso precise ser feito, mas posso estar errado. Muitos problemas associados ao compartilhamento e ao bloqueio desaparecem se você conta com mensagens e filas de mensagens. Seria ótimo se houvesse uma biblioteca padrão em C++ para isso, e talvez haja mesmo (daqui a alguns anos).</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Existe um conflito inerente ao uso de linguagens de finalidade geral para dar suporte a um público amplo e diversificado e, ao mesmo tempo, para incentivar melhorias na expressividade do código e na elegância do design? Qual o papel da linguagem no suporte a esses últimos elementos?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Acho que existe, no sentido de que você pode alcançar a elegância por meio da especialização. Além disso, se você tem um público restrito (uma comunidade de usuários), pode limitar-se somente às suas preferências. Também é possível afastar-se das notações e dos conceitos convencionais, caso você exerça algum tipo de controle sobre a comunidade de usuários (dizendo algo como &#8220;você precisa aprofundar-se na teoria de tipos para usar isto&#8221;). Uma linguagem de finalidade geral é restrita pela necessidade de dar suporte a uma ampla gama de usos, e também pela necessidade de ser ensinada a vastos grupos de pessoas, com uma grande variedade de pressuposições e formações educacionais (o básico precisa ser utilizável por um estudante de ensino médio com um professor ruim).</div>
<div class="ArticleNormalPara">Então, acho que uma linguagem de finalidade geral pode incentivar a elegância, na medida em que códigos elegantes possam ser expressos nela. No caso do C++, é possível escrever código muito elegante. Por fazer parte de uma linguagem de finalidade geral e amplamente disponível, seus exemplos podem chegar às mãos de milhões de pessoas, em artigos e livros que poderão ser lidos por milhões. Nenhuma linguagem especializada — por mais elegante que seja — conta com opções assim.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Será que demos ênfase demais à arquitetura?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Não, pelo menos da forma como eu definiria a arquitetura. Pelo contrário, há muito pouca ênfase na arquitetura e muito código ruim, com pouca compreensão dos princípios estruturais. Suspeito que um dos principais problemas da arquitetura é que muitos programadores têm apenas uma vaga idéia do que faz um código ser bom. Ser capaz de reconhecê-lo ao vê-lo não é suficiente. Ter regras determinando o que não fazer também não é suficiente. Precisamos de regras prescritivas articuladas.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> A comunidade do código aberto ajudou, atrapalhou ou não fez diferença na qualidade, no design e no profissionalismo da área de software?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> É uma pergunta muito difícil. Já vi casos em que ajudou (aumentou a qualidade do código e o nível de profissionalismo das pessoas envolvidas), casos em que atrapalhou (introduziu hábitos e atitudes inadequados) e muitos casos em que eu não seria capaz de julgar.</div>
<div class="ArticleNormalPara">Não tenho como saber quais foram os efeitos sobre a comunidade como um todo ou o que teria acontecido se o volume de trabalho com código aberto fosse maior ou menor. Simplesmente, a comunidade é grande demais para que eu possa avaliar isso.</div>
<div id="S2" class="ArticleTypeTitle">Tendências das linguagens</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você percebe uma tendência forte no sentido das linguagens dinâmicas para o futuro próximo?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Na verdade, não. Acho que as pessoas estão, com muita freqüência, comparando coisas muito parecidas. Não acredito que tenhamos escolha entre as linguagens estáticas e dinâmicas em geral e, além disso, não acho que as linguagens se encaixem claramente nessas duas categorias: a maioria, se não todas as linguagens dinâmicas, tem aspectos estaticamente determinados, e todas as principais linguagens estáticas podem realizar tarefas que exigem a determinação em runtime do significado dos valores. Claro que existem modismos, e eu não posso avaliar isso, mas acho que muitas escolhas reais de linguagens são feitas racionalmente, com base nos requisitos de um aplicativo e de uma área de aplicativos e/ou nas habilidades dos desenvolvedores disponíveis. Por exemplo, eu não tentaria implementar um runtime Java, digamos, em Ruby, nem expressar uma linguagem de simulação altamente interativa em C++ (já no caso da implementação, seria o contrário).</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você consideraria positivo remover definitivamente toda a existência de void*/variant/object/etc.? <strong></strong></div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Acho que, em tese, seria uma boa idéia livrar-se de todas as opções genéricas, mas na realidade só conseguiríamos fazer isso com uma classificação completa de tudo o que quiséssemos expressar, para que pudéssemos ser sempre mais específicos. Por exemplo, nunca vi uma função real capaz de fazer alguma coisa com todos os objetos. Se você faz alguma coisa, sempre faz alguma suposição sobre o que está manipulando (uma função pura de encaminhamento é o mais perto que consigo chegar de uma exceção a isso). O trabalho atual nos conceitos do mundo do C++ (restrições e requisitos de algoritmos genéricos) ajudará, mas não acredito que possamos ficar sem alguns mecanismos realmente gerais para expressar &#8220;alguma coisa, mas não sei exatamente o quê&#8221;. Isso é inevitável quando lidamos com necessidades imprevistas.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Com o retorno da tendência das linguagens com tipos flexíveis, será que devemos voltar a pensar em notações em húngaro?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Não tenho certeza da existência dessa tendência, embora provavelmente haja um aumento na fração do total de trabalho adequada às linguagens com tipos flexíveis. Em outras palavras, talvez o uso de linguagens com tipos estáticos ainda esteja aumentando (e acho que está) enquanto o uso de linguagens com tipos flexíveis aumenta mais rápido. E não, esqueça o húngaro. O húngaro é uma péssima idéia. O código-fonte deve refletir o significado de um programa, e não simular um sistema de tipos. Se você sente mesmo a necessidade de recorrer ao húngaro, provavelmente está usando uma linguagem inadequada ao seu aplicativo.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Em 2000, você fez uma apresentação chamada &#8220;C++: A New Language for a New Millennium&#8221; (C++: uma nova linguagem para um novo milênio) e lançou o conceito de um Wrap&lt;T&gt;. Isso é basicamente AOP (programação orientada a aspectos). O que você acha da AOP (de forma geral) e da sua formalização do padrão Wrap&lt;T&gt; (pointcuts, advice e assim por diante)?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Não dediquei tempo suficiente à AOP para dar uma resposta concreta. Gosto que a composição (especialmente a não-intrusiva) tenha suporte em uma linguagem (em oposição às opções &#8220;sem suporte&#8221; e &#8220;com suporte de uma ferramenta&#8221;). Ferramentas extralingüísticas e cadeias de ferramentas não-padrão me preocupam. Os modelos em C++ têm obtido um incrível sucesso na composição não-intrusiva — basta mencionar a STL (Standard Template Library) e alguns usos na programação de sistemas incorporados. A capacidade de combinar idéias sem precisar encaixá-las em uma hierarquia rígida ou pré-projetada é um ponto forte significativo. No entanto, também tem sido difícil de gerenciar para alguns desenvolvedores e mantenedores. Além de ser pesada em termos de notações. O C++0x inclui tentativas de lidar com isso sem impacto sobre a flexibilidade e o desempenho.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Determinadas características da linguagem C++ têm o potencial de criar algumas conseqüências indesejadas desagradáveis (como as macros). Que outras conseqüências indesejadas você gostaria que tivessem a ambigüidade removida no C++ ou nas linguagens modernas em geral?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Na verdade, eu já sabia que as macros eram desagradáveis quando comecei a usar C. Só que, assim como a maioria das pessoas, subestimei sua inconveniência e a abrangência das suas influências negativas. Provavelmente, o uso abrangente de macros no C é o principal motivo pelo qual não tínhamos excelentes ambientes de desenvolvimento em C++ há uma década. Também há formas muito confusas e em quantidade excessiva para inicializar objetos em C++. Espero solucionar isso com um mecanismo uniforme no C++0x. Já mencionei os modelos na minha resposta à pergunta anterior. Eles são o maior sucesso do C++ recente (posterior a 1985), mas seu sucesso distorceu a linguagem — mais uma vez, partes do C++0x se destinam a lidar com isso.</div>
<div class="ArticleNormalPara">Muitos problemas secundários e nem tão secundários que descobrimos ao longo dos anos não podem ser solucionados no C++ por motivos relacionados à compatibilidade. Por exemplo, a sintaxe declarativa é uma complicação desnecessária. Praticamente qualquer notação linear seria melhor. Muitos padrões também estão errados: os construtores não deveriam ser conversões por padrão, os nomes não deveriam ser acessíveis a partir de outros arquivos de origem por padrão e assim por diante. A ausência de controle sobre o vinculador tem sido uma fonte constante de problemas. Os implementadores, especificamente, parecem gostar de fornecer recursos semelhantes em formas incompatíveis.</div>
<div class="ArticleNormalPara">Mas também tivemos surpresas positivas. A mais espetacular foi o uso abrangente dos destruidores nas técnicas relacionadas ao gerenciamento de recursos e ao tratamento de erros (usando exceções). Eu sabia que os destruidores eram uma boa idéia — afinal, é preciso reverter o efeito dos construtores — mas não tinha percebido como eles teriam um papel central no bom uso do C++.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você fez no seu site o seguinte comentário: &#8220;Acho que deveríamos buscar a elegância nos aplicativos criados, e não nas linguagens propriamente ditas.&#8221; A tendência das DSLs (linguagens específicas de domínio) é uma convergência nesse sentido?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> É, tenho quase certeza. Geralmente é uma tentativa nessa direção. Às vezes, até funciona.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> O que você acha das DSLs em geral? Como você imagina o relacionamento entre as DSLs e as linguagens de finalidade geral?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Eu me preocupo com a grande quantidade de linguagens projetadas, implementadas, lançadas com grande estardalhaço e depois esquecidas, sem impacto significativo. Durante sua longa fase de desenvolvimento, que pode levar anos, uma nova linguagem consome muitos recursos sem gerar, essencialmente, nenhum retorno. Escrevi um artigo sobre esse fenômeno chamado &#8220;A Rationale for Semantically Enhanced Library Languages&#8221; (A lógica das linguagens com bibliotecas de semântica avançada, <a href="http://research.att.com/%7Ebs/SELLrationale.pdf">research.att.com/~bs/SELLrationale.pdf</a>). Defendo o uso de bibliotecas, possivelmente com o suporte de ferramentas, e de uma linguagem de finalidade geral.</div>
<div class="ArticleNormalPara">Acho que uma DSL deveria ser o último recurso, e não o primeiro. Se possível, a DSL deveria estar solidamente enraizada em uma linguagem de finalidade geral e em cadeias de ferramentas padrão. Uma DSL precisa de uma linguagem de finalidade geral (ou pelo menos de uma linguagem de programação de sistemas) para sua implementação e para a implementação de seus primitivos de runtime. Acho que seria melhor se uma DSL estivesse conscientemente e firmemente emparelhada com pelo menos uma linguagem de finalidade geral, facilitando o acréscimo de novos recursos com o uso de bibliotecas escritas nessa linguagem. Logicamente, um profissional deve dominar várias linguagens, mas imagino se a soma da complexidade de diversas DSLs não seria grande demais, a ponto de tornar-se um problema. Além disso, muitas DSLs, ou a maioria delas, parecem &#8220;querer&#8221; tornar-se linguagens de finalidade geral.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você mencionou que muitas construções em C++ foram intencionalmente tornadas ambíguas devido às várias definições em hardwares diferentes. Você percebe avanços na interoperabilidade capazes de remover a ambigüidade de algumas dessas construções?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> &#8220;Ambíguas&#8221; não é a palavra certa. Aspectos demais foram deixados indefinidos ou a serem definidos na implementação. Suspeito que, se pudesse redefinir o C++ a partir do zero, ele não teria comportamentos indefinidos e teria muito menos comportamentos definidos na implementação. Só que não tenho uma máquina do tempo e simplesmente não é possível interromper centenas de milhares de linhas de código por conta de algumas resoluções tomadas agora.</div>
<div id="S3" class="ArticleTypeTitle">Metodologia e práticas recomendadas</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Que metodologia processual você tende a usar e ensinar?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Identificar os principais conceitos do aplicativo, identificar bibliotecas úteis, criar novas bibliotecas para dar suporte ao conceito do aplicativo, experimentar idéias com antecedência, fazer a integração com antecedência, testar com antecedência e sempre, usar o material de documentação e os tutoriais como ferramentas de design e criar programas maiores a partir de outros menores (fazendo a iteração ao longo do processo). Deve ser óbvio que agora estou concentrado em projetos relativamente pequenos.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você percebe uma interseção ou uma afinidade entre uma linguagem e uma metodologia de desenvolvimento?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Acho que sim, na medida em que o design de bibliotecas é visto como uma técnica de design/desenvolvimento. O foco em recursos de nível cada vez mais elevado (mais próximo ao aplicativo) com a criação de bibliotecas transfere os requisitos para a linguagem. Não quero exagerar neste ponto, mas não acredito que seja possível ter uma única metodologia de desenvolvimento para (digamos) COBOL, C, Java, C++ e Python e esperar obter mais do que um suporte mínimo de cada linguagem.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Quais são suas regras básicas pessoais para a criação de software?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Foco nos conceitos principais; foco em suas interfaces; foco no gerenciamento dos recursos (memória, arquivos, bloqueios e assim por diante); foco no tratamento de erros. O design de boas constantes para classes e a RAII (aquisição de recurso é inicialização) são técnicas fundamentais.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Fala-se muito sobre o método Agile. O que o Agile significa para você? O C++ oferece suporte ao Agile?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Não uso esse termo, acho que é muito vago. É claro que o C++ oferece suporte ao Agile — seja qual for seu significado.</div>
<div id="S4" class="ArticleTypeTitle">Um olhar para o futuro</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Como uma linguagem pode evoluir para dar suporte a recursos avançados como modelos, eventos dinâmicos e escrita automática de código, e ao mesmo tempo permanecer acessível aos principiantes?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Não sei. Acho que não há uma resposta geral. Novos recursos podem ser importantes, desde que ofereçam suporte a técnicas mais eficazes no contexto da linguagem. No entanto, a estabilidade é essencial: um dos motivos da solidez contínua do C e do C++ é o cuidado dos comitês de padrões em assegurar que códigos antigos (muitas vezes, de décadas atrás) continuem válidos e em realizar uma integração suave dos novos recursos. Isso não é nada fácil, e a introdução de novos recursos nem sempre funciona. Muitas vezes, as dificuldades dos iniciantes são ignoradas pelos membros dos comitês de padrões. Alguns dos principais recursos planejados para o C++0x, como a inicialização uniforme, a palavra-chave automática (para deduzir um tipo de variável do seu inicializador) e conceitos como a verificação dos requisitos de argumentos de modelos devem servir para tornar a linguagem mais fácil de usar pelos não-especialistas.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você vê os metadados de linguagem como uma base essencial para as futuras linguagens de programação?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Não. Pessoalmente, sinto-me desconfortável com usos não-triviais de metadados.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você prevê para o futuro uma transição fundamental para a simultaneidade, caso as CPUs passem a ter um número cada vez maior de núcleos? Como o desafio da simultaneidade seria enfrentado pelo C++0x?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> O C++0x fornece o básico: um modelo de computador adequado ao multithreading, um conjunto de primitivos de nível inferior para a criação de bibliotecas e uma API de biblioteca de threads e bloqueios. Eu gostaria muito que houvesse ainda mais recursos (e provavelmente haverá, nos próximos anos), especialmente um modelo de simultaneidade mais simples e de nível mais elevado, baseado em pools de threads, futuros e filas de mensagens. Precisamos encontrar formas automáticas ou semi-automáticas de difundir uma computação por vários processadores e localizar atividades nesses processadores. Há muito trabalho a ser feito nessa área — e muito em C++ — mas ainda não há um modelo dominante. Entre os exemplos, estão o STAPL, da Universidade Texas A&amp;M, e o TBB, da Intel.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> O que você acha da GPGPU (computação de finalidade geral em unidades de processamento gráfico)?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Assustadora, mas não tenho a experiência prática necessária para comentar o assunto além do óbvio: que é preciso ter muita habilidade para utilizar um processador de finalidade especial.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você prevê que a HPC (computação de alto desempenho) se tornará, por fim, transparente para os programadores? E ainda, essa seria uma meta para uma linguagem ou para uma biblioteca ou estrutura?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Transparente, até certo ponto. Não acho que a simultaneidade possa ou deva ser completamente transparente. Antes de tudo, o tratamento de erros pode ser muito diferente, dependendo da disponibilidade de processadores, da memória compartilhada (ou não), da distribuição (ou não) e da latência. Aproximar-se da transparência, onde isso for adequado, é e continuará sendo uma meta das novas linguagens, dos novos recursos de linguagens e das novas bibliotecas (minhas favoritas). Essas últimas são viáveis somente se a linguagem subjacente fornecer as garantias básicas necessárias, como um modelo de computador e um conjunto de primitivos de nível muito baixo. O C++0x fará isso.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Como vai o design do C++0x?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Estamos quase terminando — finalmente! Pelo menos, espero que sim, pois nada está garantido até que a votação seja realizada e, daqui para o final, os ânimos ficam exaltados. O plano atual consiste em votarmos o novo padrão completo para comentário público em junho, para que tenhamos um novo padrão formal de 12 a 18 meses depois. É claro que eu poderia escrever um livro sobre o assunto: como se cria um padrão, o que deve estar contido nos princípios orientadores e o que exatamente o constitui. Praticamente já fiz isso. Veja o meu artigo para a HOPL, &#8220;Evolving a language in and for the real world: C++ 1991-2006&#8243; (A evolução de uma linguagem no mundo real e para ele: C++ 1991-2006, disponível em <a href="http://research.att.com/%7Ebs/hopl-almost-final.pdf">research.att.com/~bs/hopl-almost-final.pdf</a>) e qualquer publicação com C++0x no título nas minhas home pages. Se você gosta de sofrer, pode procurar &#8220;WG21&#8243; na Web e encontrará todos os artigos do comitê de padrões ISO do C++ (inclusive todas as propostas). Se isso não servir para mais nada, pelo menos o convencerá de que é muito trabalho. É difícil aperfeiçoar uma linguagem de programação amplamente utilizada, principalmente uma que está na camada de implementação de uma infinidade de ferramentas, linguagens e aplicativos. Você também pode encontrar alguns vídeos, comigo e com outras pessoas, online e na minha página sobre o C++.</div>
<div id="S5" class="ArticleTypeTitle">Livros e telefones</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> O que você está lendo no momento?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Na parte de material técnico, estou relendo Hennessy e Patterson para relembrar a área de arquitetura computacional. Também estou tentando coletar artigos que ajudem as pessoas a escrever código melhor (para um curso que estou ministrando). Encontrar esse tipo de artigo é muito mais difícil do que imaginei. Os artigos acadêmicos tendem a ser muito especializados. Já os não-acadêmicos prometem muito, mas trazem poucas evidências concretas (aceito sugestões). E, claro, há um fluxo constante de documentos relacionados à padronização do C++. Eu estava prestes a reler Knuth, mas alguém levou meu volume III, então isso terá que esperar. Por diversão, estou relendo um pouco da série de Aubrey e Maturin, de O&#8217;Brian. Estou tentando atualizar a minha compreensão científica, portanto acabo de sair de uma &#8220;overdose&#8221; de Richard Dawkins. Também terminei recentemente o livro de Rodger, Command of the Ocean: A Naval History of Britain, 1649-1815 (O comando do oceano: uma história naval da Grã-Bretanha, 1649-1815), daí a releitura de O&#8217;Brian.</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">HD </span> Você disse: &#8220;Sempre desejei que meu computador fosse tão fácil de usar quanto meu telefone. O meu desejo se tornou realidade, porque não consigo mais descobrir como usar meu telefone.&#8221; Você tem um smartphone? E isso já ficou um pouco mais fácil?</div>
<div class="ArticleNormalPara"></div>
<div class="ArticleNormalPara"><span class="ArticleInlineTitle">BS </span> Não sou um grande fã de telefones. Prefiro a comunicação pessoal e, se isso não for possível, a palavra escrita. Nem mesmo o telefone mais sofisticado se compara a um email bem escrito. Tenho um slim phone que cabe no meu bolso e estou longe de usar todos os seus recursos. Eu trocaria praticamente qualquer recurso por qualidade de som e confiabilidade. Para ser justo, as interfaces do usuário tendem a ser muito melhores hoje do que eram quando fiz esse comentário.</div>
<div class="AuthorBio"><strong>Howard Dierking</strong> é editor-chefe da <em>MSDN Magazine</em>.</div>
<div class="AuthorBio"></div>
<h4><a href="http://www.skhaz.com/blog/mutable-o-legado/"> </a></h4>
<p><strong>Mutable, O legado</strong></p>
<p>Continuando nosso artigo <a title="Mutable" href="http://skhaz.wordpress.com/2008/02/05/mutable-que-raios-e-isso/" target="_blank">mutable, que raios é isso?</a> agora irei demonstrar um segunda maneira de “burlar” o mesmo método const sem usar atributos mutáveis (mutable).</p>
<p>Temos a seguinte interface de exemplo, Entity (pure abstract)</p>
<pre class="cpp">class Entity
{
  public:
    virtual void logic() = 0;
    virtual void draw() const = 0;
};</pre>
<blockquote><p>Note que classes como a acima são muito comuns em vários projetos</p></blockquote>
<p>Agora a classe Player que implementa Entity</p>
<pre class="cpp">class Player : public Entity
{
  public:
    void logic()
    {
    }

    void draw() const
    {
       mDrawCount++;

      // Erro! pois é um método const
    }

  private:
     std::size_t mDrawCount;
};</pre>
<p>Mais skhaz porque não controlar isso no método logic que não é const? eu tenho bons motivos para isso, um deles é se você implementar um sistema de ticks como descrito no artigo <a href="http://vertexbuffer.wordpress.com/2008/01/29/controle-de-velocidade-de-jogo-com-ticks/" target="_blank">Controle de velocidade de jogo com ticks</a> onde quase sempre o método draw <strong>não</strong> será chamado no mesmo ciclo que logic.</p>
<p><strong>ponteiro e const_cast os “vilões”</strong><br />
Com o uso do cast const_cast podemos burlar o atributo declarado como mutable (assim como para const e volatile) para não constantes.</p>
<pre class="cpp">void Player::draw() const
{
  const_cast&lt;player *&gt;(this)-&gt;mDrawCount++;

  // work fine =D
}</pre>
<h4><a href="http://www.caloni.com.br/blog/archives/quando-o-ponteiro-nulo-nao-e-invalido" target="_blank">Quando o ponteiro nulo não é inválido</a></h4>
<div class="content">
<p><a title="Coding Horror Blog" href="http://www.codinghorror.com/blog/"><img src="http://www.caloni.com.br/blog/wp-content/uploads/coding-horror2.png" alt="Coding Horror" width="49" height="46" align="left" /></a>Existe coisa mais prazerosa do que admitir um erro que foi cometido na mesma semana? Existe: quando você sabia que estava certo, mas resolveu usar o senso comum por falta de provas.</p>
<p>Pois bem. O mesmo amigo que me recomendou que escrevesse sobre o assunto do ponteiro nulo achou um livro sobre <a title="C Traps and Pitfails - Andrew Koenig" href="http://www.literateprogramming.com/ctraps.pdf" target="_blank">armadilhas em C</a> com um exemplo que demonstra exatamente o contrário: dependendo da plataforma, <strong>ponteiros nulos são sim válidos</strong>.</p>
<p>Nesse caso, se tratava de um programa que iria rodar em um microprocessador, daqueles que o <a title="DQSoft" href="http://dqsoft.blospot.com/">DQ</a> costuma programar. Pois bem. Quando o dito cujo ligava era necessário chamar uma rotina que estava localizada exatamente no endereço 0. Para fazer isso, o código era o seguinte:</p>
<pre>( * (void(*)()) 0 ) ();</pre>
<p>Nada mais simples: <span style="color:#339966;">um <em>cast </em>do endereço</span> 0 (apesar de normalmente inválido, 0 pode ser convertido para endereço) para <span style="color:#339966;">ponteiro de função que não recebe parâmetros e não retorna nada</span>, seguido de <span style="color:#0000ff;">deferência (&#8220;o apontado de&#8221;) </span>e <span style="color:#ff0000;">chamada (a dupla final de parênteses)</span>.</p>
<pre><span style="color:#0000ff;">(* </span><span style="color:#008000;">(void(*)())</span> 0 <span style="color:#0000ff;">) </span><span style="color:#ff0000;">()</span>;</pre>
<p>É bem o que o autor diz depois de jogar esta expressão: &#8220;expressions like these strike terror into the hearts of C programmers&#8221;. É lógico que isso não é bem verdade para as pessoas que acompanham este blogue =)</p>
<h4><a href="http://www.caloni.com.br/blog/archives/codigos-de-entrevista-o-ponteiro-nulo">Códigos de entrevista &#8211; o ponteiro nulo</a></h4>
<div class="content">
<blockquote><p><em>Bom, parece que o &#8220;mother-fucker&#8221; wordpress ferrou com meu artigo sobre o Houaiss. Enquanto eu choro as pitangas aqui vai um outro artigo um pouco mais simples, mas igualmente interessante.</em></p></blockquote>
<blockquote><p><em>&#8220;Wanderley, tenho umas sugestões para teu blog.<br />
A primeira:<br />
Que tal analisar o código abaixo e dizer se compila ou não. Se não compilar, explicar porquê não compila. Se compilar, o que acontecerá e por quê.&#8221;</em></p></blockquote>
<p align="right">
<p align="left">O código é o que veremos abaixo:</p>
<p align="left">
<pre><span>#include &lt;stdio.h&gt;</span>
<span>#include &lt;stdlib.h&gt;</span>

<span>void</span> func<span>(</span><span>)</span>
<span>{</span>
	*<span>(</span><span>int</span> *<span>)</span><span>0</span> = <span>0</span>;
	<span>return</span> <span>0</span>;
<span>}</span>

<span>int</span> main<span>(</span><span>int</span> argc, <span>char</span> **argv<span>)</span>
<span>{</span>
	func<span>(</span><span>)</span>;
	<span>return</span> <span>0</span>;
<span>}</span></pre>
<p align="left">Bem, para testar a compilação basta compilar. Porém, se estivermos em uma entrevista, geralmente não existe nenhum compilador em um raio de uma sala de reunião senão seu próprio cérebro.</p>
<p align="left">E é nessas horas que os entrevistadores testam se você tem um bom cérebro ou um bom currículo.</p>
<p align="left">Por isso, vamos analisar passo a passo cada bloco de código e entender o que pode estar errado. Se não encontrarmos, iremos supor que está tudo certo.</p>
<pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;</pre>
<p>Dois includes padrões, ultranormal, nada de errado aqui.</p>
<pre><span style="color:#339966;">void</span> func()
{
	<span style="color:#ff0000;">*(int *)0 = 0;</span>
	<span style="color:#339966;">return 0;</span>
}</pre>
<p>Duas ressalvas aqui: a primeira quanto ao retorno da função é <strong>void</strong>, porém a função retorna um inteiro. Na linguagem C, isso funciona, no máximo um <em>warning</em> do compilador. Em C++, isso é erro brabo de tipagem.</p>
<p>A segunda ressalva diz respeito à linha obscura, sintaticamente correta, mas cuja semântica iremos guardar para o final, já que ainda falta o main para analisar.</p>
<pre>int main(int argc, char **argv)
{
	func();
	return 0;
}</pre>
<p>A clássica função inicial, nada de mais aqui. Retorna um int, e de fato retorn. Chama a função <strong>func</strong>, definida acima.</p>
<h4>A linha obscura</h4>
<p>A linha que guardamos para analisar contém uma operação de <em>casting</em>, atribuição e deferência, sendo o <em>casting </em>executado primeiro, operador unário que é, seguido pelo segundo operador unário, a deferência. Como sempre, a atribuição é uma das últimas. Descomprimida a expressão dessa linha, ficamos com algo parecido com as duas linhas abaixo:</p>
<pre>int* p = (int*) 0;
*p = 0;</pre>
<p>Não tem nada de errado em atribuir o valor 0 a um ponteiro, que é equivalente ao define NULL da biblioteca C (e C++). De acordo com a <a title="Null Pointer Constant" href="http://www.gnu.org/software/libc/manual/html_node/Null-Pointer-Constant.html#Null-Pointer-Constant">referência GNU</a>, é recomendado o uso do define, mas nada impede utilizar o 0 &#8220;hardcoded&#8221;.</p>
<p>Porém, estamos escrevendo em um ponteiro nulo, o que com certeza é um comportamento não-definido de conseqüências provavelmente funestas. O ponteiro nulo é um ponteiro inválido que serve apenas para marcar um ponteiro como inválido. Se escrevermos em um endereço inválido, bem, não é preciso ler o padrão para saber o que vai acontecer =)</p>
<h4>Atualização</h4>
<blockquote><p><em>Alguns amigos me avisaram sobre algo muito pertinente: dizer que acessar um ponteiro nulo, portanto <strong>inválido</strong>, é <strong>errado</strong> e <strong>nunca deve ser feito</strong>. Como um ponteiro nulo aponta para um <strong>endereço de memória inválido</strong>, acessá-lo irá <strong>gerar uma exceção no seu sistema operacional</strong> e <strong>fazer seu programa capotar</strong>. Um ponteiro nulo é uma maneira padrão e confiável de marcar o ponteiro como <strong>inválido</strong>, e testar isso facilmente através de um if. Mais uma vez: ponteiros nulos apontando para um endereço de memória <strong>inválido</strong> (o endereço 0) <strong>nunca devem ser acessados</strong>, apenas atribuído a ponteiros.</em></p>
<p>Em código. Isso pode:</p>
<pre>int* p = 0; // atribuindo nulo a um ponteiro
int* p2 = p; // isso também pode</pre>
<p>Isso <strong>não pode</strong>:</p>
<pre>*p = 15; // <strong>NUNCA</strong> acessar ponteiros nulos
int x = *p; // isso também <strong>não pode</strong>, ler de um ponteiro nulo</pre>
<p>Dito isso, me sinto melhor =)</p>
<h4><a href="http://www.caloni.com.br/blog/archives/os-diferentes-erros-na-linguagem-c">Os diferentes erros na linguagem C</a></h4>
<p>Uma coisa que me espanta de vez em quando é o total desconhecimento por programadores mais ou menos experientes dos níveis de erros que podem ocorrer em um fonte escrito em C ou C++. Desconheço o motivo, mas desconfio que o fato de outras linguagens não terem essa divisão de processos pode causar alguma nivelação entre as linguagens e fazer pensar que o processo de compilação em C é como em qualquer outra linguagem.</p>
<p>Porém, para começar, só de falarmos em compilação já estamos pegando apenas um pedaço do todo, que é a geração de um programa executável em C. Tradicionalmente, dividimos esse processo em três passos:</p>
<ol>
<li>Preprocessamento</li>
<li>Compilação</li>
<li>Linkedição</li>
</ol>
<p>Vamos dar uma olhada mais de perto em cada um deles e descobrir erros típicos de cada processo.</p>
<h4>Preprocessamento</h4>
<p>O preprocessamento é especificado pelos padrões C e C++, mas, tecnicamente, não faz parte da linguagem. Ou seja, antes que qualquer regra de sintaxe seja verificada no código-fonte, o preprocessamento já terá terminado.</p>
<p>Essa parte do processo lida com substituição de texto e diretivas baseadas em <strong>arquivos e símbolos</strong>. Por exemplo, a diretiva de preprocessamento mais conhecida</p>
<pre>#include &lt;stdio.h&gt;</pre>
<p>faz com que todo o conteúdo do arquivo especificado seja incluído exatamente no ponto onde for colocada essa diretiva. Isso quer dizer que, antes sequer do código-fonte ser compilado, todo o conteúdo desse <em>header</em> padrão estará no corpo do arquivo C.</p>
<p>Para evitar que o mesmo <em>header</em> seja incluído inúmeras vezes dentro da mesma unidade em C, causando assim erros de redefinição, existe outra diretiva muito usada para cercar esses arquivos públicos:</p>
<pre>#ifndef __MEUHEADER__ // se já estiver definido, caio fora até endif
#define __MEUHEADER__

// conteúdo do header

#endif // __MEUHEADER__</pre>
<p>Esse conjunto de duas diretivas, por si só, é capaz de gerar os mais criativos e bizarros erros de compilação em C. E estamos falando de erros que ocorrem antes que sequer seja iniciado o processo de compilação propriamente dito. Obviamente que os erros serão capturados durante a compilação, mas o motivo deles terem ocorrido foi um erro decorrente do processo de preprocessamento. Por exemplo, vamos supor que um determinado fonte necessita de uma declaração de função contida em meuheader.h:</p>
<pre>#include "header-do-mal.h"
#include "meuheader.h"

int func()
{
   meuheaderFunc();
}</pre>
<p>Porém, num daqueles acasos da natureza, o header-do-mal.h define justamente o que não poderia definir jamais (obs.: e isso pode muito bem acontecer na vida real, se usamos definições muito comuns):</p>
<pre>#ifndef __HEADERDOMAL__
#define __HEADERDOMAL__

 // tirei header da jogada, huahuahua (risos maléficos)
<span style="color:#ff0000;">#define __MEUHEADER__</span>

#endif // __HEADERDOMAL__</pre>
<p>Na hora do preprocessamento, o preprocessador não irá mais incluir o conteúdo dentro de header.h:</p>
<pre>#ifndef __MEUHEADER__ // se já estiver definido, caio fora até endif
#define __MEUHEADER__

int meuheaderFunc(); // talvez alguém precise disso

#endif // __MEUHEADER__</pre>
<p>Conseqüentemente, durante a compilação do código-fonte já preprocessado, sem a declaração da função meuheaderFunc, irá ocorrer o seguinte erro:</p>
<pre>error C3861: 'meuheaderFunc': identifier not found</pre>
<p>Isso em fontes pequenos é facilmente identificável. Em fontes maiores, é preciso ter um pouco mais de cuidado.</p>
<p>Após o processo de preprocessamento, de todos os arquivos indicados terem sido incluídos, de todas as macros terem sido substituídas, todas as constantes colocadas literalmente no código-fonte, temos o que é chamado <strong>unidade de compilação</strong>, que será entregue ao compilador, que, por sua vez, irá começar a análise sintática de fato, descobrindo novos erros que podem ou não (como vimos) ter a ver com a fase anterior. A figura abaixo ilustra esse processo, com algumas trocas conhecidas:</p>
<p><a title="Preprocessor" href="http://www.caloni.com.br/blog/wp-content/uploads/preprocessor.gif"><img src="http://www.caloni.com.br/blog/wp-content/uploads/preprocessor.gif" alt="Preprocessor" /></a></p>
<blockquote><p><em>Dica: quando o bicho estiver pegando, e tudo o que você sabe sobre linguagem C não estiver te ajudando a resolver um problema, tente gerar uma unidade de compilação em C e analisar sua saída. Às vezes o que é claro no código pode se tornar obscuro após o preprocessamento. Para fazer isso no VC++ em linha de comando, use o parâmetro /E.</em></p></blockquote>
<h4>Compilação</h4>
<p>Se você conseguir passar ileso para a fase de compilação, pode se considerar um mestre do preprocessamento. Por experiência própria, posso afirmar que a maior parte do tempo gasto corrigindo erros de compilação, por ironia do destino, não terá origem na compilação em si, mas no preprocessamento e linkedição. Isso porque o preprocessamento confunde muito o que vimos no nosso editor preferido, e a linkedição ocorre em uma fase onde não importa mais o que está dentro das funções, mas sim o escopo de nomes, um assunto um pouco mais vago do que a linguagem C.</p>
<p>Aqui você irá encontrar geralmente erros bem comportados, como conversão entre tipos, else sem if e esquecimento de pontuação ou parênteses.</p>
<pre>int cannotConvertError(const char* message)
{
	int ret = message[0];
	return ret;
}

int ret = cannotConvertError(3);

error C2664: 'cannotConvertError' : cannot convert parameter 1 from 'int' to 'const char *'</pre>
<pre>if( test() )
	something;
	something-else;
else
	else-something;</pre>
<pre>error C2181: illegal else without matching if</pre>
<pre>while( (x &lt; z) &amp;&amp; func(x, func2(y) != 2 )
{
	something;
}</pre>
<pre>error C2143: syntax error : missing ')' before '{'</pre>
<p>Claro, não estamos falando de erros relacionados a templates, que são um pesadelo à parte.</p>
<blockquote><p><em>Dica: nunca subestime o poder de informação do compilador e da sua documentação. Se o erro tem um código (geralmente tem), procure a documentação sobre o código de erro específico, para ter uma idéia de por que esse erro costuma ocorrer, exemplos de código com esse erro e possíveis soluções. Ficar batendo a cabeça não vai ajudar em nada, e com o tempo, você irá ficar sabendo rapidamente o que aconteceu.</em></p></blockquote>
<h4>Linkedição</h4>
<p>Chegando aqui, onde a esperança reside, tudo pode vir por água abaixo. Isso porque você já espera confiante que tudo dê certo, quando, na verdade, um erro bem colocado pode fazer você desistir pra sempre desse negócio de programar em C.</p>
<p>As características mais desejadas para corrigir erros nessa fase são:</p>
<ol>
<li>Total conhecimento da fase do preprocessamento</li>
<li>Total conhecimento da fase da compilação</li>
<li>Total conhecimento de <strong>níveis de escopo e assinatura de funções</strong></li>
</ol>
<p>Os dois primeiros itens são uma maldição previsível que deve-se carregar para todo o sempre. Se você não consegue entender o que aconteceu nas duas primeiras fases, dificilmente irá conseguir seguir adiante com essa empreitada. O terceiro item significa que deve-se levar em conta as bibliotecas que estamos usando, <em>headers</em> externos (com dependências externas), conflitos entre nomes, etc.</p>
<p>Alguns erros mais encontrados aqui são as funções não encontradas por falta da LIB certa ou por LIBs desatualizadas que não se encaixam mais com o projeto, fruto de muitas dores de cabeça de manutenção de código. Essa é a parte em que mais vale a pena saber organizar e definir uma <strong>interface clara entre os componentes de um projeto</strong>.</p>
<p>Do ponto de vista técnico, é a fase onde o <em>linker</em> junta todos os arquivos-objeto especificados, encontra as funções, métodos e classes necessárias e monta uma <strong>unidade executável</strong>, como ilustrado pela figura abaixo.</p>
<p><a title="Linker" href="http://www.caloni.com.br/blog/wp-content/uploads/linker.gif"><img src="http://www.caloni.com.br/blog/wp-content/uploads/linker.gif" alt="Linker" /></a></p>
<blockquote><p><em>Dica: uma LIB, ou biblioteca, nada mais é que uma coleção de arquivos-objeto que já foram compilados, ou seja, já passaram pelas duas primeiras fases, mas ainda não foram linkeditados. Muitas vezes é importante manter compatibilidade entre LIBs e os projetos que as usam, de forma que o processo de linkedição ocorra da maneira menos dolorosa possível.</em></p></blockquote>
<h4>Erros além da imaginação</h4>
<p>É óbvio que, por ter passado pelas três fases de transformação de um código-fonte em um programa executável, não quer dizer que este programa está livre de erros. Os famigerados erros de lógica podem se disfarçar até o último momento da compilação e só se mostrarem quando o código estiver rodando (de preferência, no cliente).</p>
<p>Entre esses erros, os mais comuns costumam se aproveitar de macros, como max, que usa mais de uma vez o parâmetro, que pode ser uma chamada com uma função. A função será chamada duas vezes, mesmo que aparentemente no código a chamada seja feita uma única vez:</p>
<pre>#define max(a, b) ( a &gt; b ? a : b )

int z = max( func(10), 30 );</pre>
<p>Um outro erro que já encontrei algumas vezes é quando a definição de uma classe tem um sizeof diferente do compilado em sua LIB, pela exclusão ou adição de novos membros. Isso pode (vai) fazer com que, durante a execução, a pilha seja corrompida, membros diferentes sejam acessados, entre outras traquinagens. Esses erros costumam acusar a falta de sincronismo entre os <em>header</em>s usados e suas reais implementações.</p>
<p>Enfim, na vida real, é impossível catalogar todos os erros que podem ocorrer em um fonte em C. Se isso fosse possível, ou não existiriam bugs, ou pelo menos existiria uma <a title="lint" href="http://en.wikipedia.org/wiki/Lint_programming_tool">ferramenta</a> para automaticamente procurar por esses erros e corrigi-los.</p>
<h4>Um projeto cheio de erros</h4>
</blockquote>
</div>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/arqblog.wordpress.com/28/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/arqblog.wordpress.com/28/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/arqblog.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/arqblog.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/arqblog.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/arqblog.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/arqblog.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/arqblog.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/arqblog.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/arqblog.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/arqblog.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/arqblog.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/arqblog.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/arqblog.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/arqblog.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/arqblog.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=28&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://arqblog.wordpress.com/2008/08/13/unidade-ii-extraido-do-site-httpwwwccppbrasilorgplanet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0718c18afc717fee22f891b38bab5dc6?s=96&#38;d=identicon" medium="image">
			<media:title type="html">elg003</media:title>
		</media:content>

		<media:content url="http://www.caloni.com.br/blog/wp-content/uploads/coding-horror2.png" medium="image">
			<media:title type="html">Coding Horror</media:title>
		</media:content>

		<media:content url="http://www.caloni.com.br/blog/wp-content/uploads/preprocessor.gif" medium="image">
			<media:title type="html">Preprocessor</media:title>
		</media:content>

		<media:content url="http://www.caloni.com.br/blog/wp-content/uploads/linker.gif" medium="image">
			<media:title type="html">Linker</media:title>
		</media:content>
	</item>
		<item>
		<title>Unidade II</title>
		<link>http://arqblog.wordpress.com/2008/08/13/unidade-ii/</link>
		<comments>http://arqblog.wordpress.com/2008/08/13/unidade-ii/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 00:37:25 +0000</pubDate>
		<dc:creator>elg003</dc:creator>
				<category><![CDATA[Obrigações]]></category>

		<guid isPermaLink="false">http://arqblog.wordpress.com/?p=20</guid>
		<description><![CDATA[Como burlar orientação a objetos em C++. Em uma entrevista, foi perguntado ao criador da linguagem C++, Bjarne Stroustrup, por que as pessoas têm uma ligação tão profunda com as linguagens de programação, a ponto de se formarem comunidades de fanáticos por linguagens. A resposta foi típica de um profissional experiente da área de computação: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=20&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p class="SBCtitle"><strong>Como burlar orientação a objetos em C++.</strong></p>
<p class="MsoNormal" style="text-align:justify;"><span>Em uma entrevista, foi perguntado ao criador da linguagem C++, Bjarne Stroustrup, por que as pessoas têm uma ligação tão profunda com as linguagens de programação, a ponto de se formarem comunidades de fanáticos por linguagens. A resposta foi típica de um profissional experiente da área de computação: “Meu palpite é que as linguagens que usamos para expressar nossas idéias tornam-se parte de nós, tanto que, se você só conhece uma linguagem, os partidários de outras linguagens podem representar uma ameaça pessoal. Nesse caso, a solução parece ser conhecer também outras linguagens. Não acredito que seja possível atuar profissionalmente na área de software conhecendo apenas uma linguagem de programação. Também pode haver um motivo econômico: embora os conhecimentos básicos transcendam os limites das linguagens de programação, o mesmo não se aplica a várias habilidades práticas. Então, se eu conheço apenas a linguagem X e seus conjuntos de ferramentas, mas você quer discutir a linguagem Y e seus conjuntos de ferramentas, você está ameaçando o meu meio de vida. Mais uma vez, parece que a solução é conhecer várias linguagens e conjuntos de ferramentas (e ter uma base sólida nos fundamentos da área). Infelizmente, as soluções que sugiro não levam em conta o fato de que a maioria das pessoas tem muito pouco tempo livre, depois de dar conta de todos os afazeres. Mas isso não é desculpa para o fanatismo.” </span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Esse famigerado fanatismo a respeito de uma ou outra linguagem de programação pode ser decorrente de diversos fatores como: aceitação da linguagem no mercado de trabalho (se o mercado carece e aprova uma linguagem, é natural que exista muitos profissionais trabalhando com essa linguagem), utilização da mesma em trabalhos acadêmicos ou, simplesmente, pelo destaque temporário que a linguagem<span> </span>se encontra – “moda” de uma linguagem de programação.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Entre diversas linguagens aceitas pelo mercado, as mais populares são C,C++ e Java. No decorrer deste artigo, será apresentado uma comparação entre elas, usando a linguagem C++ como referência.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Ao visualizar as três linguagens descritas anteriormente, a linguagem C++ pode ser considerada como a linguagem mediana, e as outras duas, como formadoras da extremidade, onde C está no início e Java no fim. A linguagem C foi criada com o seguinte objetivo principal: facilitar a criação de programas extensos com menos erros, recorrendo ao paradigma da programação algorítmica ou procedimental, mas sobrecarregando menos o autor do compilador, cujo trabalho complica-se ao ter de realizar as características complexas da linguagem. Já a linguagem Java, partiu das seguintes premissas: orientação a objeto, portabilidade (independência de plataforma), recursos de rede e segurança (aplicações em rede mais seguras). </span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Dessa forma, C++ representa o elo entre C e Java, ou seja, ela é uma linguagem de programação de alto nível com facilidades para o uso em baixo nível. Por conta disso, alguns fanáticos ou estudiosos afirmam que C++ apresenta o lado inseguro de C, principalmente ao trabalhar com ponteiros e memória; em contrapartida, apresenta o lado seguro de Java, por automatizar todo o processo de alocação de memória e impossibilitar a utilização de ponteiros.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Assim, C++ assemelha-se a uma faca de dois gumes, pois, se de um lado há liberdade demais, a ponto de se tornar inseguro a utilização de alguns recursos oferecidos por uma linguagem, por outro, há liberdade de menos, ao ponto de perder desempenho por falta deles.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Um recurso utilizado em linguagens de programação discutido neste artigo é o uso de ponteiros na linguagem C++. Ponteiros caracterizam, basicamente, em endereçar um valor na memória. Por trabalhar diretamente com a memória, seu uso inescrupuloso pode ser perigoso. Com outras palavras, o uso indiscriminado de ponteiros pode corromper o conceito de orientação a objetos em C++.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span> </span></p>
<p class="SBCtitle1" style="text-align:justify;"><!--[if !supportLists]--><span style="font-size:12pt;"><span>1.<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span style="font-size:12pt;">Comparação de linguagens: C, C++ e Java</span></p>
<p class="SBCparagraphfirst"><span>A seguir, são detalhadas a principais características positivas de cada linguagem para efeito de comparação.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>C:</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Eficiência</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Portabilidade de Código</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Habilidade para acessar endereços específicos de hardware.</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Demanda poucos recursos do sistema. </span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>C++:<span> </span></span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Trata-se de uma linguagem ao mesmo tempo de alto e baixo nível. Tem-se todo o poder de uma linguagem de baixo nível, e pode-se usar a orientação a objetos para aumentar indefinidamente o nível de programação.</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Há uma quantidade gigantesca de bibliotecas e componentes aproveitáveis para aplicações em C++.</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>É uma linguagem de sólida tradição. Destaca-se o fato de que o Unix foi feito em C. Portanto trata-se de uma linguagem que pode ser aplicada em projetos de alta responsabilidade.</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Quem tem interesse em eventualmente mudar de área dentro de TI, aproveita muito a bagagem de uso de C++. Por exemplo: Seja o caso de quem programou para web por algum tempo usando C++, e depois se interessou por outra área, digamos: reconhecimento de voz. Esse profissional aproveita bem a bagagem anterior. Quem programou para web com uma tecnologia específica para web (por exemplo asp, php) não terá aplicação da bagagem quanto estiver atuando para a nova área. O profissional retornará a condição de principiante.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span></span><span>Java:</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Java implementa orientação a objetos muito bem, sendo mais fácil de se aprender que C++ e mais segura (não possui comandos tão poderosos).</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Java é multiplataforma a nível de </span><em><span>bytecode</span></em><span>. Portanto, vale o slogan da linguagem amplamente repetido: “escreva uma vez e execute em qualquer lugar”.</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>O mercado já comprou a idéia de usar Java. Isso é um fato muito importante. A massa crítica de empresas e profissionais que adotam essa tecnologia é substancioso.</span></p>
<p class="MsoNormal" style="margin-left:71.45pt;text-align:justify;text-indent:-18pt;"><!--[if !supportLists]--><span style="font-size:11pt;font-family:Wingdings;"><span>l<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Supostamente, quem adota Java está protegido contra variações que afetam o mercado de tecnologia ao longo do tempo. Isso porque é sempre possível (teoricamente) fazer uma máquina virtual Java que torna os </span><em><span>bytecodes </span></em><span>executáveis num computador que ainda nem se inventou ainda.</span></p>
<p class="SBCtitle1" style="text-align:justify;"><!--[if !supportLists]--><span><span>2.<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]-->Ponteiros</p>
<p class="SBCparagraphfirst"><span>No campo da </span>programação<span>, um ponteiro ou apontador é um </span>tipo de dado<span> de uma </span>linguagem de programação<span> cujo valor se refere diretamente a um outro valor alocado em outra </span>área da memória<span>, através de seu </span>endereço<span>. Um ponteiro é uma simples implementação do tipo </span>referência <span>da </span>Ciência da Computação<span>.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Ponteiros também são utilizados para simular a passagem de parâmetros por referência em linguagens que não oferecem essa construção (em C, por exemplo). Isso é útil se desejamos que uma modificação em um valor feito pela função chamada seja visível pela função que a chamou, ou também para que uma função possa retornar múltiplos valores.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Linguagens como C e C++ permitem que ponteiros possam ser utilizados para apontar para funções, de forma que possam ser invocados como uma função qualquer. Essa abordagem é essencial para a implementação de modelos de re-chamada (<em>callback</em>), muito utilizados atualmente em </span>bibliotecas de rotinas<span> para manipulação de </span>interfaces gráficas<span>. Tais ponteiros devem ser tipados de acordo com o tipo de retorno da função o qual apontam.[7]</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>No ambiente C++, existe um tipo de ponteiro mais complexo denominado de ponteiro inteligente. Basicamente, ele simula um ponteiro comum. A diferença está nas funcionalidades disponíveis: coletor de lixo ou verificação de limites do tipo de dado, para adicionar segurança e reduzir erros de </span>programação<span>, ainda que maximizando a eficiência; e, evitar vazamento de memória, desalocando espaços não mais utilizados e destruindo os ponteiros defasados.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Além dos ponteiros inteligentes, tem também os ponteiros nulos e salvagens. Ponteiros nulos, possuem um valor reservado, geralmente zero, indicando que ele não se refere a um objeto. São usados freqüentemente para representar condições especiais como a falta de um sucessor no último elemento de uma lista ligada, mantendo uma estrutura consistente para os nós da lista. Ponteiros Selvagens não possuem endereço associado. Qualquer tentativa em usá-los causa </span>comportamento indefinido<span>, ou porque seu valor não é um endereço válido ou porque sua utilização pode danificar partes diferentes do sistema.</span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Ao observar as características dos ponteiros e também da linguagem C++, percebe-se uma ligação poderosa e bastante perigosa, capaz de “burlar” o paradigma de orientação a objetos proposto na linguagem.</span></p>
<p class="SBCtitle1" style="text-align:justify;"><!--[if !supportLists]--><span><span>3.<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Como burlar orientação a objetos em C++ com ponteiros</span></p>
<p class="MsoNormal" style="text-align:justify;"><span style="font-family:&quot;">#</span><span>include &lt;iostream&gt;</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>#include &lt;stdio.h&gt; </span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>#include &lt;stdlib.h&gt;</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>using namespace std;</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span> </span></p>
<p class="MsoNormal" style="text-align:justify;"><span> </span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>class P_exemplo{</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>private: int num;</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>public:</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>void fixa_num(int val) {num=val;}</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>int* retornaEnd(){return &amp;(this -&gt; num);};</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>void mostra_num();</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>};</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span> </span></p>
<p class="MsoNormal" style="text-align:justify;"><span> </span></p>
<p class="MsoNormal" style="text-align:justify;"><span>void P_exemplo::mostra_num()</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>{</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>cout &lt;&lt; num<span> </span>&lt;&lt;<span> </span>&#8220;\n&#8221;;</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>}</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span> </span></p>
<p class="MsoNormal" style="text-align:justify;"><span> </span></p>
<p class="MsoNormal" style="text-align:justify;"><span>int main()</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>{</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>P_exemplo ob;<span> </span>// declara um objeto </span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>ob.fixa_num(1);<span> </span>// acessa ob diretamente</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>ob.mostra_num();</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span></span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>int* p = ob.retornaEnd();<span> </span><span> </span><span> </span>// atribui a p o endereco de ob</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>*p = *p + 1;</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>printf(&#8220;%u\n&#8221;, *p);</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>ob.mostra_num();</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>return 0;</span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="MsoNormal" style="text-align:justify;"><span>}</span></p>
<p class="MsoNormal" style="text-align:justify;"><span style="font-family:&quot;"><span> </span></span><span>O código acima mostra o uso de ponteiros para ter acesso a um atributo privado de uma classe. Em outras palavras, “quebrando” a orientação a objetos.</span></p>
<p class="MsoNormal" style="text-align:justify;"><!--[if gte vml 1]&gt;                      &lt;![endif]--><!--[if !vml]--></p>
<table style="height:54px;" border="0" cellspacing="0" cellpadding="0" width="271">
<tbody>
<tr></tr>
<tr></tr>
</tbody>
</table>
<p><!--[if gte vml 1]&gt;&lt;![endif]--><span><span> </span>A classe P_exemplo possui um atributo privado, denominado &#8216;num&#8217;. Ademais, foram criadas três funções: &#8216;fixa_num&#8217;, &#8216;retornaEnd&#8217; e &#8216;mostra_num&#8217;. A primeira função atribui um valor ao atributo. A segunda retorna o endereço do atributo já fixado. E a última função simplesmente exibe o valor do atributo fixado com algum valor.<span> </span>No método principal do programa, criou-se um objeto por definição e uso do paradigma orientação a objetos. Depois atribuimos o valor 1 ao atributo &#8216;num&#8217; e mostramos o seu valor. Como resultado, será exibido em tela o valor 1. Logo em seguida, criamos um ponteiro &#8216;p&#8217; e atribuímos a ele, o retorno da função &#8216;retornaEnd&#8217; (o retorno será o endereço do atributo &#8216;num&#8217; fixado com valor 1). A partir daí, trabalhamos com o ponteiro, efetuando uma operação aritmética.</span></p>
<p><span style="font-size:12pt;font-family:&quot;"><span> </span>Por fim, imprimimos o resultado contido no ponteiro e o valor contido no atributo &#8216;num&#8217;. O que se observa é que ambos impressões apresentará o resultado igual a 2. Concluindo assim, que a orientação a objetos foi burlada, pois não é possível trabalhar diretamente com um atributo privado fora da sua classe geradora.</span></p>
<p><strong>Projeto de Multiplicador para ponto flutuante </strong></p>
<p class="SBCparagraphfirst"><span style="color:#000000;">A multiplicação em ponto flutuante, para fim prático, é realizada pelo processador através de cinco etapas.<span> </span>Estas etapas estão dispostas conforme o fluxograma abaixo.</span></p>
<p class="SBCparagraph"><span style="color:#000000;"> </span></p>
<div id="attachment_21" class="wp-caption alignleft" style="width: 460px"><a href="http://arqblog.files.wordpress.com/2008/08/imagem3.jpg"><img class="size-full wp-image-21" src="http://arqblog.files.wordpress.com/2008/08/imagem3.jpg?w=450&#038;h=579" alt="Fluxograma da Multiplicação em Ponto Flutuante" width="450" height="579" /></a><p class="wp-caption-text">Fluxograma da Multiplicação em Ponto Flutuante</p></div>
<p class="SBCparagraph"><span style="color:#000000;"><span> </span></span></p>
<p class="Legenda1" style="margin-bottom:0.0001pt;text-align:center;" align="center"><strong></strong><strong></strong></p>
<p class="MsoNormal"><span><span> </span></span></p>
<p class="MsoNormal" style="text-align:justify;"><span><span> </span>Geralmente, os processadores dedicam hardware para realizar operação em ponto flutuante. Neste artigo, foi implementada uma solução em hardware para realizar a operação descrita acima. </span></p>
<p class="MsoNormal" style="text-align:justify;">
<p class="SBCtitle1"><!--[if !supportLists]--><span><span>1.<span style="font-family:&quot;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;"> </span></span></span><!--[endif]--><span>Esquema em hardware para multiplicação em Ponto Flutuante</span></p>
<p class="MsoNormal" style="margin-top:6pt;text-align:justify;"><span>O esquema em hardware assume como entrada dois registradores, e retorna um registro com o resultado da multiplicação. Em alto nível, esse esquema pode ser representado pela figura.</span></p>
<p class="MsoNormal" style="margin-top:6pt;text-align:justify;text-indent:35.4pt;"><span>O sinal do resultado da multiplicação é dado através da porta lógica XOR da figura. No esquema, o considera-se 1 como valor negativo e 0 valor positivo. A porta lógica XOR retorna valor 0 (positivo) quando as entradas são iguais, por exemplo 1 XOR 1(sinais iguais), e retorna valor 1 (negativo) para entradas diferentes, por exemplo<span> </span>XOR 0(sinais contrários).</span></p>
<p class="MsoNormal" style="margin-top:6pt;text-indent:35.4pt;"><span>Resolução das etapas: </span></p>
<p class="MsoNormal" style="margin-top:6pt;text-align:justify;text-indent:35.4pt;"><span>Etapa 1 &#8211; Os expoentes são somados. Esse operação é realizada pela ALU 1(Unidade Lógica Aritmética), que tem em como entrada os expoentes. A soma pode ser sem bias[3] ou através dos números deslocados. O resultado é passado para a unidade de controle</span></p>
<p class="MsoNormal" style="margin-top:6pt;text-align:justify;text-indent:35.4pt;"><span>Etapa 2 &#8211; Os significando são multiplicados. Essa operação é realizada pela ALU 2. O resultado dessa multiplicação é passado para a unidade de controle.</span></p>
<p class="SBCparagraph" style="text-indent:0;"><span>Com os resultados das etapas 1 e 2, a unidade de controle decide quais sinais de controle serão ativados (CMux1, CMux2, CInc &#8230;). Para os sinais de controle foi adotado 0 como desativado e 1 como ativado.</span></p>
<p class="SBCparagraph" style="text-indent:0;"><span><span> </span>Etapa 3 &#8211; A unidade de controle avalia se o produto está normalizado. No caso afirmativo, os sinais de controle ficam: CMux1=1, recebe o resultado da soma dos expoentes. CInc=0, e o valor dessa soma não tem valor incrementado. CMux2=0, recebe o valor do produto da ALU 2. CDesl=0, e não é necessário deslocar o produto para direita. Caso negativo, os sinais CMux1 e CMux2 permanecem inalterados, porém os sinais CInc e CDesl têm seus valores modificados, sinalizando que o produto precisa ser normalizado. Assim, a unidade de incremento e a unidade de deslocamento são ativadas.</span></p>
<p class="MsoNormal" style="margin-top:6pt;text-align:justify;text-indent:35.4pt;"><span>Etapa 4 – A unidade de controle ativa o sinal CArred se o produto precisar ser arredondado. Caso, após o arredondamento, o produto não permaneça normalizado, a unidade de controle será “informada” para tomar novas decisões. Para isso os sinais de controle ficam: CMux1=0, CMux2=1, recebendo os valores após o arredondamento e CInc=1 e CDesl=1, sinalizando que o produto precisa ser normalizado.</span></p>
<p class="MsoNormal" style="margin-top:6pt;text-align:justify;text-indent:35.4pt;"><span style="font-size:12pt;font-family:&quot;">Etapa 5 &#8211; Após o arredondamento, os valores do produto, expoente e sinal, são armazenados em um registrador.</span><span style="font-size:12pt;font-family:&quot;"> </span></p>
<div id="attachment_22" class="wp-caption alignleft" style="width: 460px"><a href="http://arqblog.files.wordpress.com/2008/08/imagem4.jpg"><img class="size-full wp-image-22" src="http://arqblog.files.wordpress.com/2008/08/imagem4.jpg?w=450&#038;h=635" alt="Hardware da multiplicação em Ponto Flutuante" width="450" height="635" /></a><p class="wp-caption-text">Hardware da multiplicação em Ponto Flutuante</p></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/arqblog.wordpress.com/20/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/arqblog.wordpress.com/20/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/arqblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/arqblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/arqblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/arqblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/arqblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/arqblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/arqblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/arqblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/arqblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/arqblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/arqblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/arqblog.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/arqblog.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/arqblog.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=20&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://arqblog.wordpress.com/2008/08/13/unidade-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0718c18afc717fee22f891b38bab5dc6?s=96&#38;d=identicon" medium="image">
			<media:title type="html">elg003</media:title>
		</media:content>

		<media:content url="http://arqblog.files.wordpress.com/2008/08/imagem3.jpg" medium="image">
			<media:title type="html">Fluxograma da Multiplicação em Ponto Flutuante</media:title>
		</media:content>

		<media:content url="http://arqblog.files.wordpress.com/2008/08/imagem4.jpg" medium="image">
			<media:title type="html">Hardware da multiplicação em Ponto Flutuante</media:title>
		</media:content>
	</item>
		<item>
		<title>Nova cara do Blog</title>
		<link>http://arqblog.wordpress.com/2008/08/13/nova-cara-do-blog/</link>
		<comments>http://arqblog.wordpress.com/2008/08/13/nova-cara-do-blog/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 00:23:38 +0000</pubDate>
		<dc:creator>elg003</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://arqblog.wordpress.com/?p=3</guid>
		<description><![CDATA[Nova parceria: RicZignal Mesmo conteúdo do blog antigo.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=3&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nova parceria: RicZignal</p>
<p>Mesmo conteúdo do blog antigo.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/arqblog.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/arqblog.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/arqblog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/arqblog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/arqblog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/arqblog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/arqblog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/arqblog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/arqblog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/arqblog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/arqblog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/arqblog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/arqblog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/arqblog.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/arqblog.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/arqblog.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=3&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://arqblog.wordpress.com/2008/08/13/nova-cara-do-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0718c18afc717fee22f891b38bab5dc6?s=96&#38;d=identicon" medium="image">
			<media:title type="html">elg003</media:title>
		</media:content>
	</item>
		<item>
		<title>Unidade I</title>
		<link>http://arqblog.wordpress.com/2008/08/13/5/</link>
		<comments>http://arqblog.wordpress.com/2008/08/13/5/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 00:00:52 +0000</pubDate>
		<dc:creator>elg003</dc:creator>
				<category><![CDATA[Obrigações]]></category>

		<guid isPermaLink="false">http://arqblog.wordpress.com/?p=5</guid>
		<description><![CDATA[Compiladores O compilador é visto como um facilitador, ou ainda, como um programa de sistema que traduz um programa descrito em uma linguagem de alto nível para um programa equivalente em código de máquina para um processador. Em geral, um compilador não produz diretamente o código de máquina mas sim um programa em linguagem simbólica [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=5&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p class="SBCparagraphfirst"><strong>Compiladores</strong></p>
<p class="SBCparagraphfirst">O compilador é visto como um facilitador, ou ainda, como um programa de sistema que traduz um programa descrito em uma linguagem de alto nível para um programa equivalente em código de máquina para um processador. Em geral, um compilador não produz diretamente o código de máquina mas sim um programa em linguagem simbólica <em>(assembly)</em> semanticamente equivalente ao programa em linguagem de alto nível. O programa em linguagem simbólica é então traduzido para o programa em linguagem de máquina através de montadores.</p>
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<div id="attachment_12" class="wp-caption alignleft" style="width: 460px"><a href="http://arqblog.files.wordpress.com/2008/08/imagem1.jpg"><img class="size-full wp-image-12" src="http://arqblog.files.wordpress.com/2008/08/imagem1.jpg?w=450&#038;h=337" alt="Funcionamento do compilador" width="450" height="337" /></a><p class="wp-caption-text">Funcionamento do compilador</p></div>
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst"><strong>Assembly</strong></p>
<p class="SBCparagraphfirst"><span style="font-size:12pt;font-family:&quot;">A linguagem simbólica ou assembly, ou ainda, 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. É de longe, a ma</span><span style="font-size:12pt;font-family:&quot;">is poderosa, mais rápida, mais flexível e que permite tirar partido de todas as características de um microprocessador. No entanto, todo este poder de controle sobre o processador tem um preço: para a maioria das aplicações, programar em assembly seria uma tarefa árdua, razão pela qual foram criadas linguagens designadas de alto nível (porque estão mais próximas do raciocínio do programador), que </span><span style="font-size:12pt;font-family:&quot;">facilitam muito a tarefa ao programador para a maioria das tarefas. De qualquer forma, existem sempre casos em que não podemos prescindir da linguagem de montagem, como por exemplo, o software que controla diretamente o hardware </span><span style="font-size:12pt;font-family:&quot;">e o software para automação e controle.</span></p>
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst"><strong>Linkers</strong></p>
<p class="SBCparagraphfirst">
<p class="SBCparagraphfirst"><span style="color:#000000;">Quando um programa é criado, ele é constituído por métodos e instruções. Ademais, ele pode referenciar bibliotecas externas que complementam o funcionamento do programa. A função do linker é justamente evitar uma “r</span><span style="color:#000000;">edundância de compilação” , já que o novo programa, ao fazer uso de bibliotecas externas, repetiria o processo de compilação para cada biblioteca. Esse processo levaria um desperdício para os recursos computacionais.</span></p>
<p class="SBCparagraph"><span style="color:#000000;">Basicamente, o linker aglutina todas as bibliotecas referenciadas por um programa com os procedimentos </span><span style="color:#000000;">deste e transforma tudo em um arquivo executável.</span></p>
<div id="attachment_14" class="wp-caption alignleft" style="width: 460px"><a href="http://arqblog.files.wordpress.com/2008/08/imagem2.jpg"><img class="size-full wp-image-14" src="http://arqblog.files.wordpress.com/2008/08/imagem2.jpg?w=450&#038;h=389" alt="Funcionamento do Linker" width="450" height="389" /></a><p class="wp-caption-text">Funcionamento do Linker</p></div>
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph">
<p class="SBCparagraph"><strong>Loaders</strong></p>
<p class="SBCparagraph">
<p class="SBCparagraphfirst"><span style="color:#000000;">Normalmente é de responsabilidade do sistema operacional carregar e executar arquivos. A parte do sistema operacional que executa essa função é chamada de Loader. </span></p>
<p class="SBCparagraph"><span style="color:#000000;">O loader pode ser definido como o inverso dos linkers. Ele consiste em um programa de sistema que coloca o programa-objeto na memória principal, para que esteja pronto para ser executado.</span></p>
<p class="SBCparagraph"><span style="color:#000000;">O carregamento na memória principal varia de acordo com o código gerado pelo linker. Em função disto, o loader pode ser denominado de absoluto ou relocável. </span></p>
<p><strong>Vantagens e desvantagens em utilizar Big-Endian e Little-En</strong><strong>dian</strong></p>
<p class="SBCparagraph">Endianness é a forma de ordenar dados pela sua ordem de magnitude ou ordem de grandeza, ou ainda, é o jeito que uma CPU lê/escreve palavras da/na memória principal. As principais formas de endianness são <em>big-endian </em>e<em> little-endian. </em>Na forma little-endian, os bytes são guardados por ordem crescente do seu “peso numérico” em endereços sucessivos da memória<em>. </em>Na notação big-endian, os bytes são guardados por ordem decrescente do seu “peso numérico” em endereços sucessivos da memória.<em> </em></p>
<p class="SBCparagraph">Nós estamos acostumados com os números representados na ordem big-endian(Extremidade-maior primeiro), em que os primeiros dígitos a serem representados são os de maior peso. Por exemplo, o número 1234 significa 1 milhar (10<span style="font-size:9.5pt;position:relative;top:-4pt;">3</span>), 2 centenas (10<span style="font-size:9.5pt;position:relative;top:-4pt;">2</span>) 3 dezenas (10<span style="font-size:9.5pt;position:relative;top:-4pt;">1</span>) e 4 unidade (10<span style="font-size:9.5pt;position:relative;top:-4pt;">0</span>). Datas escritas no formato big-endian devem ser escritas como AAAA-MM-DD. O formato DD-MM-AAAA é a representação da data em little-endian, e finalmente o formato MM-DD-AAAA é a representação em middle-endian, porque o campo com a ordem de grandeza média, está escrito primeiro. No entanto, os números que representam os dias, meses e anos estão todos no formato big-endian.</p>
<p class="SBCparagraph">Como a notação big-endian trabalha com números exatamente como lemos, poderíamos pensar que essa notação seria altamente vantajosa. No entanto, a forma little-endian tem a propriedade de que, na falta de alinhamento restrições, o mesmo valor pode ser lido em vários comprimentos de memória sem utilizar diferentes endereços. Ademais, a notação little-endian é muito mais barata.</p>
<p class="SBCparagraph">De certa forma, as vantagens e desvantagens são relativas. Ao escolhermos uma notação, precisamos levar em conta como iremos trabalhar e qual o resultado esperado.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/arqblog.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/arqblog.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/arqblog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/arqblog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/arqblog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/arqblog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/arqblog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/arqblog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/arqblog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/arqblog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/arqblog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/arqblog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/arqblog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/arqblog.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/arqblog.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/arqblog.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=5&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://arqblog.wordpress.com/2008/08/13/5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0718c18afc717fee22f891b38bab5dc6?s=96&#38;d=identicon" medium="image">
			<media:title type="html">elg003</media:title>
		</media:content>

		<media:content url="http://arqblog.files.wordpress.com/2008/08/imagem1.jpg" medium="image">
			<media:title type="html">Funcionamento do compilador</media:title>
		</media:content>

		<media:content url="http://arqblog.files.wordpress.com/2008/08/imagem2.jpg" medium="image">
			<media:title type="html">Funcionamento do Linker</media:title>
		</media:content>
	</item>
		<item>
		<title>Hello world!</title>
		<link>http://arqblog.wordpress.com/2008/08/04/hello-world/</link>
		<comments>http://arqblog.wordpress.com/2008/08/04/hello-world/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 21:25:59 +0000</pubDate>
		<dc:creator>elg003</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Início das pesquisas para o conteúdo do blog de Arquitetura de Computadores da Universidade Federal de Sergipe. 2008/1<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=1&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Início das pesquisas para o conteúdo do blog de Arquitetura de Computadores da Universidade Federal de Sergipe. 2008/1</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/arqblog.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/arqblog.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/arqblog.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/arqblog.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/arqblog.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/arqblog.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/arqblog.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/arqblog.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/arqblog.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/arqblog.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/arqblog.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/arqblog.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/arqblog.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/arqblog.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/arqblog.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/arqblog.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=arqblog.wordpress.com&amp;blog=4416069&amp;post=1&amp;subd=arqblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://arqblog.wordpress.com/2008/08/04/hello-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0718c18afc717fee22f891b38bab5dc6?s=96&#38;d=identicon" medium="image">
			<media:title type="html">elg003</media:title>
		</media:content>
	</item>
	</channel>
</rss>
