<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7928488</id><updated>2011-04-21T17:09:08.522-07:00</updated><category term='meta'/><category term='squiggol'/><category term='tools'/><category term='theorem provers'/><category term='coq'/><category term='books'/><category term='functional'/><category term='papers'/><category term='lists'/><title type='text'>Realidades Paralelas</title><subtitle type='html'>Diário de pesquisa e planos. Revisões bibliográficas, elucubrações e outras viagens, em português, inglês ou qualquer outra língua. </subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default?start-index=101&amp;max-results=100'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>102</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7928488.post-6780518353250177769</id><published>2007-12-07T20:11:00.000-08:00</published><updated>2007-12-07T20:23:55.899-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='theorem provers'/><category scheme='http://www.blogger.com/atom/ns#' term='coq'/><title type='text'>First contact with Coq</title><content type='html'>I've started to look a bit into &lt;a href="http://coq.inria.fr/"&gt;Coq&lt;/a&gt;, beginning with &lt;a href="http://arxiv.org/abs/cs/0603118"&gt;Coq in a Hurry&lt;/a&gt;. It begins nice enough, but then in section 3 there's a proof that for all propositions a and b, a and b implies b and a. I didn't understand a thing. Well, one bit or another, judging by previous contacts with systems for first order logic, but the tactics, and the organization of the proof, it all flew over my head. Just by reading the material it was hard to discern what was I supposed to input to get the same result. Then there are two paragraphs about the tactics, and a table. I can't imagine how I would use it right now.&lt;br /&gt;&lt;br /&gt;But that's ok, I'm sure I'll understand it better later. There's the &lt;a href="http://coq.inria.fr/V8.1/tutorial.html"&gt;Coq Tutorial&lt;/a&gt; and a bit more of material to get into. Then I'll post about it later, if I don't get lazy. It's bound to be truly exciting stuff about the Calculus of Inductive Constructions and dependent type theory. Great subject to draw upon for chitchat at cocktail parties.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-6780518353250177769?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/6780518353250177769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=6780518353250177769&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/6780518353250177769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/6780518353250177769'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2007/12/first-contact-with-coq.html' title='First contact with Coq'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-1415024631296998446</id><published>2007-07-06T15:27:00.000-07:00</published><updated>2007-07-06T15:39:30.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>In search of good mind-mapping software</title><content type='html'>So I recently started to create &lt;a href="http://en.wikipedia.org/wiki/Mind_map"&gt;mind maps&lt;/a&gt; to summarize studies and come up with new ideas. It's better to start a map on paper than to use a computer program, granted. But then, after the initial session is over, it would be good to make a digital version of it to be consulted and edited later. A mind-mapping tool is thus a good idea.&lt;br /&gt;&lt;br /&gt;I tried some programs on &lt;a href="http://en.wikipedia.org/wiki/List_of_Mind_Mapping_software"&gt;this list&lt;/a&gt;. FreeMind is one of the best free software tools for mind mapping, but it still has lots of usability problems, and it runs on the JVM, which means slow startup and eats-lots-of-memory. &lt;a href="http://www.mind42.com"&gt;Mind42.com&lt;/a&gt; is interesting exactly because it is a web application, no need to install anything, available anywhere, etc. But I couldn't try it; after signing up for a free account more than 24 hours ago, I still haven't received the confirmation email, so I can't login. I guess I won't bother trying to register again.&lt;br /&gt;&lt;br /&gt;But it gets worse: both of them doesn't seem to support links between nodes in different parts of the tree (cross-links). Does everyone that does mind maps manage to categorize everything hierarchically? To me, in any non-trivial map there'll be lots of relations which are not hierarchical in nature, and I think that not allowing these cross links is a serious limitation. Maybe I should consider creating &lt;a href="http://en.wikipedia.org/wiki/Semantic_network"&gt;semantic networks&lt;/a&gt;, but there doesn't seem to be tools for that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-1415024631296998446?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/1415024631296998446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=1415024631296998446&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/1415024631296998446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/1415024631296998446'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2007/07/in-search-of-good-mind-mapping-software.html' title='In search of good mind-mapping software'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-7859648511333244599</id><published>2007-04-19T21:00:00.000-07:00</published><updated>2007-04-19T21:15:40.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='papers'/><category scheme='http://www.blogger.com/atom/ns#' term='lists'/><title type='text'>Great Works in Programming Languages</title><content type='html'>I guess I never linked to &lt;a href="http://www.cis.upenn.edu/%7Ebcpierce/courses/670Fall04/GreatWorksInPL.shtml"&gt;this&lt;/a&gt; before, even though I was certain I had. It's a list of papers selected by a community of programming language researchers as the most important and representative of the field. The collection is called &lt;a href="http://www.cis.upenn.edu/%7Ebcpierce/courses/670Fall04/GreatWorksInPL.shtml"&gt;Great Works in Programming Languages&lt;/a&gt;. Worth taking a look.&lt;br /&gt;&lt;br /&gt;I have read and reviewed "An axiomatic basis for computer programming" by C.A.R. Hoare, &lt;a href="http://realpar.blogspot.com/2004/09/axiomatic-basis-for-computer.html"&gt;here&lt;/a&gt; (in portuguese). I've read "A theory of type polymorphism in programming" by Milner more than once, and never finished "Towards a theory of type structure" by Reynolds. I also read the one by Landin ("The next 700 programming languages") and Plotkin's "Call-by-name, call-by-value, and the λ-calculus" is on my queue. Maybe someday I'll get back to them and post reviews.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-7859648511333244599?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/7859648511333244599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=7859648511333244599&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/7859648511333244599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/7859648511333244599'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2007/04/great-works-in-programming-languages.html' title='Great Works in Programming Languages'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-8933394300311518878</id><published>2007-04-19T20:36:00.000-07:00</published><updated>2007-04-19T20:55:39.960-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Another new acquisition</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_U5LtVmLrkJ8/Rig5pRT-9FI/AAAAAAAAABI/PdyDzfjxt_Y/s1600-h/373326.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_U5LtVmLrkJ8/Rig5pRT-9FI/AAAAAAAAABI/PdyDzfjxt_Y/s320/373326.jpg" alt="" id="BLOGGER_PHOTO_ID_5055353962908021842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just got the book Proof, Language and Interaction: Essays in Honour of Robin Milner by mail. It's a hefty tome that's over 700 pages long, containing essays in various topics related to the work of Robin Milner. The best part is that while it costs around 80 dollars, I got it for 9 dollars plus shipping. This should be a rule: if you're a starving student in a third-world university and no institutional budget for buying expensive technical books, you can buy them for 10 dollars or so. There's always hope.&lt;br /&gt;&lt;br /&gt;Anyway, my main interest in the book lies in the essays related to the π-calculus, especially the one on &lt;a href="http://citeseer.ist.psu.edu/pierce97pict.html"&gt;Pict&lt;/a&gt;, but the Harper-Stone paper on the semantics of Standard ML is also on my list, as is the essay by Mike Gordon "From LCF to HOL: A Short History". I'll probably look at many others, but I doubt I'll be able to understand much of some of them, like "From Banach to Milner: Metric Semantics for Second Order Communication and Concurrency".&lt;br /&gt;&lt;br /&gt;All in all, a good acquisition, at a very good price.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-8933394300311518878?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/8933394300311518878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=8933394300311518878&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/8933394300311518878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/8933394300311518878'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2007/04/another-new-acquisition.html' title='Another new acquisition'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_U5LtVmLrkJ8/Rig5pRT-9FI/AAAAAAAAABI/PdyDzfjxt_Y/s72-c/373326.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-8039882354790016270</id><published>2007-02-24T21:59:00.000-08:00</published><updated>2007-04-19T21:10:20.655-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='papers'/><category scheme='http://www.blogger.com/atom/ns#' term='lists'/><title type='text'>Classic Texts in Computer Science</title><content type='html'>A &lt;a href="http://www.zafar.se/bkz/Articles/ClassicCompScienceTexts"&gt;selection&lt;/a&gt; of classic texts in the discipline, by Babar K. Zafar, with links to electronic versions of each one.&lt;br /&gt;&lt;br /&gt;Choosing which texts are classic can certainly be controversial, although in this case I think only texts with electronic versions available were considered. Even so, there are many good things in there, some of which I have already read, some I plan to read soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-8039882354790016270?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/8039882354790016270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=8039882354790016270&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/8039882354790016270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/8039882354790016270'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2007/02/classic-texts-in-computer-science.html' title='Classic Texts in Computer Science'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-5754570356409572904</id><published>2007-02-22T10:53:00.000-08:00</published><updated>2007-02-22T11:00:51.591-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='squiggol'/><title type='text'>An Introduction to the Bird-Meertens Formalism</title><content type='html'>by Jeremy Gibbons (&lt;a href="http://web.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/nzfpdc-squiggol.ps.gz"&gt;link to paper&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Introduces the BMF, also called Squiggol, by using an example: a derivation of a linear algorithm to compute the Maximum Segment Sum of a list of numbers. The problem is presented in the book Programming Pearls by Bentley, and the derivation of the linear solution using Horner's rule apparently was first suggested by Bird. The paper first presents some motivation to using the formalism, then takes care of notation, proving some theorems by the way, then presents Horner's rule for polynomials and a generalization of the rule for arbitrary operations (that satisfy certain conditions). When the groundwork is completed, it presents a clear specification of the MSS problem that would take cubic time to compute; from this specification, using the theorems presented earlier and the generalized Horner's rule, it is derived an efficient linear algorithm based on list scans.&lt;br /&gt;&lt;br /&gt;The paper is also interesting for showing the properties of catamorphisms and folds. Folds are more general than catamorphisms, but if the fold operation is associative, it can be expressed as catamorphism as well.&lt;br /&gt;&lt;br /&gt;The paper makes the claim that "creativity is not needed" when deriving an efficient program from a simple specification. This doesn't seem to hold up well. Sure there is creativity somewhere in it, and although the derivation itself seems simple, it depends on the available theorems. So the choice of which theorems to state and prove, a priori (that is, when you don't know the answer beforehand) seems to involve a lot of creativity. Of course, the paper does not claim that you don't need creativity there, only in the derivation itself. Even so, the example presented is quite small. It uses only a handful of theorems, all of them stated earlier. So how does one go about choosing which theorems to use in a derivation? Is it trial and error? Isn't there some creativity involved? In a realistic formalism to derive programs from specifications, you'd probably end with lots of theorems. It seems to me that it is far from trivial to decide which one to use in each step. Maybe a experienced practitioner can decide where to go based on previous sessions of trial and error, by considering the "look" of the current expression.&lt;br /&gt;&lt;br /&gt;Another problem is where to stop. How do you know you got an interesting, efficient implementation of your specifications? You must be able to recognize good implementations somehow. This isn't different from how you can express mathematical expressions in many ways, some more useful than others depending on circumstance. But the properties of good implementations are not clear.&lt;br /&gt;&lt;br /&gt;All in all, claiming that "creativity is not needed" in the derivation process mostly makes me think it can be automated without resorting to AI techniques. But if you think about how to do it -- trial and error amounts to exponential search, lack of clear goals or evaluation criteria for results makes termination difficult to specify -- it becomes clear that implementing an automatic tool for derivating programs from specifications would be quite difficult. My doubts are mostly concerned with how a formalism like this would scale to the derivation of realistic programs, instead of small toys.&lt;br /&gt;&lt;br /&gt;I've found the &lt;a href="http://www.amazon.com/Algebra-Programming-Richard-Bird/dp/013507245X/sr=1-2/qid=1172168646/ref=sr_1_2/102-4017246-1384932?ie=UTF8&amp;amp;s=books"&gt;book by Bird and de Moor&lt;/a&gt; at a very good price in an online bookstore and ordered it. If it ever gets to me, we'll see how the formalism scales.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-5754570356409572904?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/5754570356409572904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=5754570356409572904&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/5754570356409572904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/5754570356409572904'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2007/02/introduction-to-bird-meertens-formalism.html' title='An Introduction to the Bird-Meertens Formalism'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-7198051398040260019</id><published>2007-02-17T09:38:00.000-08:00</published><updated>2007-02-17T09:50:46.915-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>Código funcional</title><content type='html'>Enquanto eu não volto a postar neste blog, aproveito para linkar aqui um outro que criei: &lt;a href="http://codemiscellany.blogspot.com/"&gt;Code Miscellany&lt;/a&gt;, dedicado principalmente a postagem de código-fonte em linguagens funcionais. Na verdade está servindo mais, atualmente, para postar minha tradução do código e exercícios do livro &lt;a href="http://www.cs.indiana.edu/eopl/"&gt;Essentials of Programming Languages&lt;/a&gt; para &lt;a href="http://research.microsoft.com/fsharp/fsharp.aspx"&gt;F#&lt;/a&gt;, a linguagem funcional parecida com &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt; da Microsoft. Mas sempre pode ter alguma coisa diferente por lá. E depois outros livros podem ser traduzidos para outras linguagens.&lt;br /&gt;&lt;br /&gt;Quanto a este blog aqui, sugiro que alguém que porventura tenha interesse nele assine o feed em algum agregador, por exemplo o &lt;a href="http://www.bloglines.com/"&gt;Bloglines&lt;/a&gt; ou o &lt;a href="http://reader.google.com/"&gt;Google Reader&lt;/a&gt;. Mais fácil de saber quando tem post novo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-7198051398040260019?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/7198051398040260019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=7198051398040260019&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/7198051398040260019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/7198051398040260019'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2007/02/cdigo-funcional.html' title='Código funcional'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-116449951635548094</id><published>2006-11-25T15:33:00.000-08:00</published><updated>2006-11-25T16:05:16.403-08:00</updated><title type='text'>Teias de aranha</title><content type='html'>Mais um post apenas para comentar que o alto nível de atividade e estresse me impediram de postar por um tempo. Também faltou ter o que comentar aqui, em termos. Mas agora que o que tinha de ser defendido foi defendido, posso voltar a escrever mais. Tenho pensado em algumas direções de pesquisa, e depois posso comentar sobre isso. Por enquanto fiquem com esse link bem legal:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.defmacro.org/ramblings/lisp-in-haskell.html"&gt;Writing a Lisp Interpreter in Haskell&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-116449951635548094?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/116449951635548094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=116449951635548094&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/116449951635548094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/116449951635548094'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/11/teias-de-aranha.html' title='Teias de aranha'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-115463190964777122</id><published>2006-08-03T11:58:00.000-07:00</published><updated>2006-08-03T14:27:45.943-07:00</updated><title type='text'>Mais um bug da Microsoft</title><content type='html'>Mas calma, nao é a deste blog malhar a Microsoft, um esporte popular por aí mas bastante irracional. O bug é em um sistema de reconhecimento de voz, &lt;a href="http://www.youtube.com/watch?v=IkeC7HpsHxo&amp;eurl="&gt;veja o vídeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Aí tem a &lt;a href="http://blogs.msdn.com/larryosterman/archive/2006/07/31/684327.aspx"&gt;explicação&lt;/a&gt; de um desenvolvedor da Microsoft, Larry Osterman. E aqui uma passagem do post:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If you've worked with analog audio, it's pretty clear what's happening here - there's a timing issue that is causing a positive feedback loop that resulted from a signal being fed back into an amplifier.&lt;br /&gt;&lt;br /&gt;It turns out that one of the common causes of feedback loops in software is a concurrency issue with notifications - a notification is received with new data, which updates a value, updating the value causes a new notification to be generated, which updates a value, updating the value causes a new notification, and so-on...&lt;br /&gt;&lt;br /&gt;The code actually handled most of the feedback cases involving notifications, but there were two lower level bugs that complicated things. The first bug was that there was an incorrect calculation that occurred when handling one of the values in the notification, and the second was that there was a concurrency issue - a member variable that should have been protected wasn't (I'm simplifying what actually happened, but this suffices).&lt;br /&gt;&lt;br /&gt;As a consequence of these two very subtle low level bugs, the speech recognition engine wasn't able to correctly control the gain on the microphone, when it did, it hit the notification feedback loop, which caused the microphone to clip, which meant that the samples being received by the speech recognition engine weren't accurate.&lt;br /&gt;&lt;/blockquote&gt;Vejamos: um bug de concorrência. O problema não é a Microsoft, porque bugs como esse ocorrem por todo lugar. Será que realmente devemos ficar contentes com o atual estado da programação concorrente?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-115463190964777122?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/115463190964777122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=115463190964777122&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/115463190964777122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/115463190964777122'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/08/mais-um-bug-da-microsoft.html' title='Mais um bug da Microsoft'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-115448114159053200</id><published>2006-08-01T18:10:00.000-07:00</published><updated>2006-08-01T18:12:21.600-07:00</updated><title type='text'>Sua linguagem pode fazer isso?</title><content type='html'>Mais um &lt;a href="http://www.joelonsoftware.com/items/2006/08/01.html"&gt;texto&lt;/a&gt; de Joel Spolsky sobre as limitações de um programador que só aprende Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-115448114159053200?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/115448114159053200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=115448114159053200&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/115448114159053200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/115448114159053200'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/08/sua-linguagem-pode-fazer-isso.html' title='Sua linguagem pode fazer isso?'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-114919544146791237</id><published>2006-06-01T13:41:00.000-07:00</published><updated>2006-06-01T13:57:21.530-07:00</updated><title type='text'>Cyclone: primeiras impressões</title><content type='html'>Long time no see, dear blog. Depois de vários desvios estou me concentrando de novo no tema da dissertação, até porque falta pouco. E depois de muito suspense o tema é gerenciamento de memória concorrente/paralelo, o que foi bom porque integrou bem dois temas que eu vinha pesquisando em paralelo, com o perdão do trocadilho. Depois, quem sabe, eu escrevo mais sobre o que estou fazendo.&lt;br /&gt;&lt;br /&gt;Mas o assunto agora é &lt;a href="http://cyclone.thelanguage.org/"&gt;Cyclone&lt;/a&gt;, a linguagem derivada de C mas mais segura (&lt;span style="font-style: italic;"&gt;safe&lt;/span&gt;). Além das adições necessárias para tornar a linguagem segura, outras coisas interessantes também acabaram entrando na linguagem: polimorfismo paramétrico, &lt;span style="font-style: italic;"&gt;pattern matching&lt;/span&gt;, tipos-soma mais interessantes (as unions em C são muito ruins), etc.&lt;br /&gt;&lt;br /&gt;O gerenciamento de memória é feito principalmente usando regiões, mas de forma mais manual e com menos inferência do que no caso do MLKit. Além das regiões, os ponteiros possuem vários qualificadores para separar os ponteiros que podem ser nulos ou não, os que apontam para um array terminado com um byte 0 (caso das strings) e etc.&lt;br /&gt;&lt;br /&gt;Onde entra Cyclone no meu projeto? A plataforma de testes será um compilador para uma linguagem funcional &lt;span style="font-style: italic;"&gt;lazy&lt;/span&gt; simples, que inclui obviamente um coletor de lixo. Dessa forma será possível observar o comportamento do coletor em situações reais, ao invés de simplesmente gerar grafos de memória aleatórios. E nesse caso o runtime seria feito em Cyclone, como alternativa a usar C para a mesma tarefa. Não existem muitas escolhas aqui: as linguagens funcionais que eu gosto não servem para esse tipo de &lt;span style="font-style: italic;"&gt;system programming. &lt;/span&gt;Never mind that, o compilador está sendo escrito em Haskell.&lt;br /&gt;&lt;br /&gt;Por enquanto só escrevendo alguns programas para me acostumar com a linguagem (Cyclone), mas a maior dificuldade são os ponteiros. Tanto os qualificadores quanto as regiões me fazem parar para pensar em várias decisões que não me ocorreriam se eu estivesse programando em C, pelo menos não inicialmente. Isso é interessante, mas me faz consultar o manual o tempo todo. Os próprios criadores da linguagem já revelaram na lista a possibilidade de simplificar o sistema, que realmente é bem complexo. De certa forma isso reflete a complexidade inerente do gerenciamento de memória, mas a coisa não precisa ser necessariamente assim para o programador. A visão que o programador tem pode ser outra, caindo para o nível mais baixo quando necessário. Esse é um tema interessante que acontece em outros contextos, mas a discussão sobre isso fica para outra vez.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-114919544146791237?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/114919544146791237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=114919544146791237&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114919544146791237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114919544146791237'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/06/cyclone-primeiras-impresses.html' title='Cyclone: primeiras impressões'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-114574829589088928</id><published>2006-04-22T16:16:00.000-07:00</published><updated>2006-04-22T16:24:55.900-07:00</updated><title type='text'>Um pouco de crítica</title><content type='html'>Duas observações não muito lisonjeiras sobre a linguagem C:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://catless.ncl.ac.uk/Risks/21.84.html#subj10"&gt;Henry Baker&lt;/a&gt; lembra que alguns problemas recorrentes na linguagem têm soluções conhecidas pelo menos desde a década de 60;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://calculist.blogspot.com/2006/03/c-rots-brain.html"&gt;Dave Herman&lt;/a&gt; discute sobre os problemas de aprender controle de fluxo nas linguagens de programação apenas baseado em C.&lt;br /&gt;  &lt;/li&gt; &lt;/ul&gt; Os dois são boa leitura, e aí podemos terminar com o conhecido ensaio de Richard Gabriel que estabelece que &lt;a href="http://www.dreamsongs.com/WIB.html"&gt;Worse is Better&lt;/a&gt; (mais contexto &lt;a href="http://www.dreamsongs.com/WorseIsBetter.html"&gt;aqui&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-114574829589088928?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/114574829589088928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=114574829589088928&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114574829589088928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114574829589088928'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/04/um-pouco-de-crtica.html' title='Um pouco de crítica'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-114368161492895049</id><published>2006-03-29T17:12:00.000-08:00</published><updated>2006-03-29T17:20:14.940-08:00</updated><title type='text'>Grafos e C++</title><content type='html'>Postando muito pouco por aqui, prazos abundam. Prazos tipo &lt;span style="font-style: italic;"&gt;deadlines&lt;/span&gt;, entende?&lt;br /&gt;&lt;br /&gt;Trabalhando em artigos para enviar, e trabalhando mais com teoria  dos grafos, os testes principalmente sendo feitos em C++.&lt;br /&gt;&lt;br /&gt;Houve uma época em que eu programava muito em C++, lia livros, entendia vários dos detalhes esotéricos da linguagem -- sabia que uma classe com membros virtuais e cujo destrutor não é virtual pode causar vazementos de memória? Pois é, essa é C++.&lt;br /&gt;&lt;br /&gt;Depois eu subi na vida e passei a usar linguagens mais decentes. Agora, voltando a usar C++, dá para ver de maneira mais isenta como a linguagem é &lt;span style="font-style: italic;"&gt;brain damaged&lt;/span&gt;. Os exemplos são muitos, mas só para ficar com um probleminha menor da biblioteca padrão: &lt;code&gt;fstream::open&lt;/code&gt; recebe um parâmetro que é o nome do arquivo para abrir; seria de se esperar que a função aceitasse uma &lt;code&gt;string&lt;/code&gt; C++ como nome do arquivo, mas não: só strings &lt;code&gt;char*&lt;/code&gt; em estilo C.&lt;br /&gt;&lt;br /&gt;Enfim, grafos por todos os lados e C++, infelizmente. Eventualmente eu devo voltar a estudar implementação paralela de linguagens funcionais. Algum dia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-114368161492895049?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/114368161492895049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=114368161492895049&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114368161492895049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114368161492895049'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/03/grafos-e-c.html' title='Grafos e C++'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-114140471347465291</id><published>2006-03-03T08:34:00.000-08:00</published><updated>2006-03-03T08:51:53.573-08:00</updated><title type='text'>Resenhas</title><content type='html'>Escrevi duas resenhas na Amazon.com, estão nas páginas dos respectivos livros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/customer-reviews/0126339511/ref=cm_cr_dp_2_1/104-1988057-3389557?%5Fencoding=UTF8&amp;customer-reviews.sort%5Fby=-SubmissionDate&amp;amp;n=283155"&gt;Programming Language Pragmatics&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/customer-reviews/0471976970/ref=cm_cr_dp_2_1/104-1988057-3389557?%5Fencoding=UTF8&amp;customer-reviews.sort%5Fby=-SubmissionDate&amp;amp;n=283155"&gt;Modern Compiler Design&lt;/a&gt; (por aqui traduzido com o título "Projeto Moderno de Compiladores")&lt;/li&gt;&lt;/ul&gt;Foi bom porque eu finalmente entendi os motivos porque eu não gosto do Projeto Moderno de Compiladores, e muito tem a ver com a péssima diagramação dele. E fica pior na versão traduzida, porque esse formato de livro-texto brasileiro (mais largo e alto que o americano) leva a linhas mais longas e páginas maiores, o que torna a leitura ainda mais cansativa.&lt;br /&gt;&lt;br /&gt;Também por motivos de qualidade da tradução e diagramação eu vendi o meu &lt;a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=3072685&amp;sid=1642311028216718341040960&amp;amp;k5=3B196371&amp;uid="&gt;exemplar nacional&lt;/a&gt; do &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0262062178/qid=1141404030/sr=2-1/ref=pd_bbs_b_2_1/104-1988057-3389557?v=glance&amp;amp;s=books"&gt;Essentials of Programming Languages&lt;/a&gt; e comprei o importado. Bem melhor. Já o &lt;a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=805580&amp;sid=1642311028216718341040960&amp;amp;k5=1B3B00E2&amp;amp;uid="&gt;Organização e Projeto de Computadores: A Interface-Hardware Software&lt;/a&gt; eu comprei traduzido mesmo. Apesar de alguns deslizes e de não ser colorido (o original é preto, cinza e azul), a versão brasileira é muito boa.&lt;br /&gt;&lt;br /&gt;Ainda sobre livros, tá faltando ou eu não encontrei um que seria "Assembly Intel x86 Moderno para Escritores de Compiladores". Todos os livros de assembly que eu vi têm alguma falha: ou são superficiais demais, ou são livros-texto e incluem até a parte 16 bits, ou usam uma notação maluca (o &lt;a href="http://webster.cs.ucr.edu/AoA/index.html"&gt;AoA de Randall Hyde&lt;/a&gt;) ou etc. Livros até sobre como gerar código para a JVM e o CLR .NET, mas não para a plataforma mais usada na atualidade. Que por sinal também é uma das mais complicadas para gerar código. O jeito por enquanto é ficar com os manuais da Intel e AMD.&lt;br /&gt;&lt;br /&gt;E a AMD agora só tem no site os manuais da arquitetura AMD64. 32 bits morreu por eles. Bom, vou parar de reclamar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-114140471347465291?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/114140471347465291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=114140471347465291&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114140471347465291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114140471347465291'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/03/resenhas.html' title='Resenhas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-114040257805990370</id><published>2006-02-19T17:45:00.000-08:00</published><updated>2006-02-19T19:59:15.406-08:00</updated><title type='text'>Algumas notas soltas</title><content type='html'>Apenas para registrar coisas que estive pensando hoje.&lt;br /&gt;&lt;br /&gt;A questão é: o que é um pesquisador em linguagens de programação, o que ele deve resolver? A primeira pergunta não vai ter resposta aqui, mas a segunda remete ao &lt;a href="http://www.chris-lott.org/misc/kaiser.html"&gt;conselho de Richard Hamming&lt;/a&gt; de sempre se perguntar qual é o problema mais importante na sua área; eu já pensei sobre isso algumas vezes, e quase sempre fico de postar os pensamentos aqui e não faço. Agora vai.&lt;br /&gt;&lt;br /&gt;O papel da pesquisa em linguagens de programação é desenvolver novas formas de expressar a parte de software dos sistemas computacionais. Com a tendência do hardware se tornar mais genérico, o peso nos sistemas computacionais recai quase todo sobre o software; portanto, ganhos de produtividade nas linguagens de programação se refletem como melhorias na construção e manutenção de todos os sistemas computacionais futuros (e mesmo, graças a técnicas de análise, a sistemas legados). Ou pelo menos deveria ser assim. As coisas avançam na indústria no campo das linguagens, mas a inércia é considerável. De toda forma, acho que isso está mudando; a discussão não cabe aqui. O fato é que eu considero a pesquisa em linguagens como uma parte fundamental e praticamente central da computação; é o pólo ao redor do qual todas as sub-áreas relacionadas a software se acomodam. Mesmo que não seja assim que a indústria vê a coisa.&lt;br /&gt;&lt;br /&gt;Quais são os problemas mais importantes em linguagens hoje? Pode-se dizer que &lt;span style="font-style: italic;"&gt;concorrência&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;mobilidade&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;verificação&lt;/span&gt; (incluindo verificações de segurança, mas não restrito a isso) estão entre os principas. É interessante se concentrar nesses problemas hoje em dia.&lt;br /&gt;&lt;br /&gt;Ao meu ver, um ponto importante com relação aos três problemas e com a própria natureza da programação de computadores é a questão dos efeitos colaterais. Efeitos colaterais devem ser evitados ao máximo e, quando isso não é possível, controlados. Linguagens imperativas cheias de estado se mostram cada vez mais problemáticas; toda análise que se faz de programas é complicada pela presença de efeitos colaterais arbitrários, e isso atrapalha tanto a concorrência quanto a mobilidade de código e a verificação (especialmente de segurança). Muita gente na indústria e pesquisa estão constatando a mesma coisa. Isso é uma prova que, assim como eu, muita gente acredita nos princípios da programação funcional; aliás, não só funcional, como de qualquer paradigma declarativo. A programação por restrições (constraint programming) é muito promissora para algumas aplicações.&lt;br /&gt;&lt;br /&gt;O problema é similar à controvérsia do goto nas décadas de 70 e 80: o programador que pode usar gotos é mais "livre" mas seu código se torna mais difícil de ser entendido e, por contrapartido, analisado automaticamente. Algumas coisas eram mais fáceis, principalmente na década de 70, usando um goto ao invés das construções estruturadas. Com o desenvolvimento das linguagens em uma direção cada vez mais longe dos gotos, isso se tornou completamente irrelevante. É muito difícil, hoje, justificar a necessidade de usar um goto; surgiram algumas alternativas estruturadas e semi-estruturadas a ele, e a própria forma de pensar sobre software atualmente (que é, por bem ou por mal, a orientação a objetos) passa longe de saltos arbitrários.&lt;br /&gt;&lt;br /&gt;Com efeitos colaterais é parecido. Reclamava-se que era muito mais complicado programar sem eles, e realmente era, se for considerado, por exemplo, o uso de continuações para modelar efeitos colaterais. Com o desenvolvimento de novas idéias, a situação foi melhorando: as mônadas em Haskell conseguem simplificar pelo menos os casos mais básicos, e em muitas situações escondem boa parte da complexidade envolvida. O problema é que ainda não dá para programar bem em Haskell sem entender as mônadas. E, sendo realista, mônadas são mais complicadas do que qualquer coisa que um programador médio &lt;span style="font-style: italic;"&gt;queira&lt;/span&gt; entender.&lt;br /&gt;&lt;br /&gt;Duas direções parecem possíveis: com o avanço das linguagens de programação e os sistemas relacionados, o aumento de produtividade pode ser suficiente para reduzir o número de programadores necessários. Isso causaria uma divisão parecida com a que ocorre na eletrônica: um pequeno grupo teria o conhecimento altamente especializado para programar componentes gerais, enquanto que a maioria apenas usaria esses componentes. Isso em parte já está acontecendo (vide linguagens de script e bibliotecas gigantescas) mas ainda não na escala desejada. A tendência histórica não parece apoiar a idéia que sobrarão poucos programadores: os ganhos de produtividade obtidos nas últimas décadas serviram para aumentar a demanda de software, e a complexidade do que é requerido, de forma que a demanda por programadores também acabou aumentando, ao invés de diminuir. Imagino que isso não mude tão cedo, com a necessidade cada vez maior de automatizar e informatizar. Parece que eventualmente o mundo inteiro será controlado, medido e modelado por software; como ainda estamos longe disso, a demanda só deve aumentar. Uma possibilidade é uma divisão de trabalho menos rígida, que acredito que é parecido com o que está acontecendo: a maioria programaria em linguagens de domínio específico, enquanto que os especialistas criariam as linguagens e o ferramental necessário. Idéia parecida com a Language Oriented Programming proposta por alguns, mas admitindo que nem todo mundo tem condições de criar linguagens efetivas, por mais que as ferramentas ajudem.&lt;br /&gt;&lt;br /&gt;A outra possibilidade não é tão diferente: as idéias como mônadas e sistemas de tipos e efeitos podem ser refinadas e desenvolvidas a ponto que um programador possa usar efeitos colaterais (provavelmente não de forma tão livre como nas linguagens atuais) sem se dar conta nos detalhes que estão por baixo. Claro que alguns precisarão conhecer os detalhes para desenvolver os compiladores e projetar as linguagens, mas isso já acontece hoje. Em relação aos que trabalham programando, só uma minoria conhece em detalhes as técnicas envolvidas no projeto de linguagens e criação de compiladores.&lt;br /&gt;&lt;br /&gt;É possível também que, assim como o advento da programação orientada a objetos tornou praticamente irrelevante a discussão de nível mais baixo sobre gotos, o uso cada vez maior de paradigmas declarativos (como a programação lógica e a programação por restrições) torne um tanto quanto irrelevante pensar em usar efeitos colaterais diretamente, exceto para uma pequena parcela de &lt;span style="font-style: italic;"&gt;system programmers&lt;/span&gt; (sempre achei meio estranho traduzir isso). Isso depende do avanço das implementações para tentar garantir maior eficiência, mas também do avanço do poder computacional do hardware, que é o que tem, historicamente, tornado atrativas construções menos eficientes mas de nível mais alto. Se os processadores multi-núcleo realmente se tornarem dominantes, a simplicidade de modelos declarativos como a concorrência por passagem de mensagens e a programação por restrições pode desalojar de vez o estilo imperativo altamente dependente de efeitos colaterais.&lt;br /&gt;&lt;br /&gt;Ora, os programadores costumam reclamar que é "difícil" pensar de maneira funcional (ou outro paradigma declarativo). Mas isso acontece somente porque eles foram treinados para usar efeitos colaterais. Da mesma forma, programadores que aprenderam a programar com muitos gotos tiveram problemas para passar à programação estruturada, e vários dos que aprenderam a estruturada sentiram o choque para mudar para a POO. O que interessa aos pesquisadores é o futuro, e para a indústria o importante é a produtividade; o paradigma no qual a maioria dos programadores é treinada hoje em dia tem algum peso na inércia total, mas isso pode ser mudado (vide as mudanças já ocorridas nessas poucas décadas de computação).&lt;br /&gt;&lt;br /&gt;A questão que resta aí é quanto ao modelo de nível mais baixo. Lá no processador o modelo ainda é o da máquina de von Neumann: estado compartilhado e efeitos colaterais são essenciais. Não sei se isso pode mudar, mesmo que os paradigmas dominantes se tornem declarativos. Mas se isso acontecer a arquitetura dos processadores com certeza será influenciada.&lt;br /&gt;&lt;br /&gt;Uma idéia interessante nesse sentido é tentar achar meios eficientes de definir construções fundamentais como mônadas. E isso tem uma intersecção com outros assuntos como Typed Assembly Language e Proof-Carrying Code. Tudo indica que as plataformas de software do futuro sejam cada mais virtuais, continuando o que já acontece hoje com a JVM e o .NET CLR. Podemos chegar a um ponto que praticamente todo código de aplicação rodando em uma máquina será código gerenciado por algum grande &lt;span style="font-style: italic;"&gt;runtime&lt;/span&gt;. Isso abre possibilidades para usar linguagens intermediárias tipadas e proof-carrying code, além de ter plataformas virtuais que não sigam o mesmo modelo computacional do hardware. O CLR se torna cada vez mais "amigável" às linguagens funcionais, e a estratégia da Microsoft promete incluir os princípios funcionais cada vez mais no &lt;span style="font-style: italic;"&gt;mainstream&lt;/span&gt;. Talvez não seja a melhor estratégia ter apenas poucas plataformas que tentam abarcar tudo, mas isso foi o que aconteceu com o hardware, principalmente hoje em dia, quando cada vez mais o mundo roda sobre a plataforma x86 (mesmo que nem sempre da Intel).&lt;br /&gt;&lt;br /&gt;Resumindo: formalizar a concorrência e achar novas formas de expressa-la nas linguagens de programação é interessante e importante, assim como estudar efeitos colaterais, como controla-los e especifica-los. Técnicas formais que chegam aos níveis mais baixos, como Typed Assembly Language e Proof-Carrying Code, também são. São essas as coisas que me ocorrem quando eu penso na pesquisa. Concorrência agora pode se tornar central à minha dissertação, embora que obviamente em uma fatia bem mais modesta: algoritmos para coleta de lixo paralela. Mas estudar o particular é uma forma de observar o geral.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-114040257805990370?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/114040257805990370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=114040257805990370&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114040257805990370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114040257805990370'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/02/algumas-notas-soltas.html' title='Algumas notas soltas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-114023073163464444</id><published>2006-02-17T18:40:00.000-08:00</published><updated>2006-02-17T18:47:01.506-08:00</updated><title type='text'>Nice quote</title><content type='html'>&lt;blockquote&gt;To make a literary analogy, mathematics produces the equivalent of one-liners – equations that are pithy, insightful, brilliant. Computer science is more like a novel by Tolstoy: it is messy and infuriatingly complex. But that is exactly what makes it unique and appealing – computer algorithms are infinitely more capable of capturing nuances of complex reality in a way that pure mathematics cannot. &lt;/blockquote&gt;&lt;br /&gt;A &lt;a href="http://www.physorg.com/news10957.html"&gt;entrevista inteira&lt;/a&gt; é interessante, ao menos para pensar sobre o assunto da natureza da ciência da computação. Via &lt;a href="http://sigfpe.blogspot.com/2006/02/mathematics-has-competition.html"&gt;A Neighborhood of Infinity&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-114023073163464444?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/114023073163464444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=114023073163464444&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114023073163464444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/114023073163464444'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/02/nice-quote.html' title='Nice quote'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113984577231965688</id><published>2006-02-13T07:30:00.000-08:00</published><updated>2006-02-13T07:49:32.376-08:00</updated><title type='text'>Velozes e Furiosas... aliás, Rápidas e Curtas</title><content type='html'>Um post rápido só para tirar a poeira aqui.&lt;br /&gt;&lt;br /&gt;Muito ocupado ultimamente,  sendo compiladores um dos motivos. &lt;a href="http://www.amazon.com/gp/product/155860698X/qid=1136224389/sr=2-1/ref=pd_bbs_b_2_1/104-1988057-3389557?s=books&amp;v=glance&amp;amp;n=283155"&gt;Livros&lt;/a&gt;, &lt;a href="http://www.amazon.com/gp/product/0126339511/qid=1139844826/sr=2-1/ref=pd_bbs_b_2_1/104-1988057-3389557?s=books&amp;v=glance&amp;amp;n=283155"&gt;livros&lt;/a&gt; e &lt;a href="http://www.amazon.com/gp/product/0521607647/qid=1139844867/sr=2-3/ref=pd_bbs_b_2_3/104-1988057-3389557?s=books&amp;v=glance&amp;amp;n=283155"&gt;mais&lt;/a&gt; &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/052182060X/qid=1139844867/sr=2-1/ref=pd_bbs_b_2_1/104-1988057-3389557?v=glance&amp;s=books"&gt;livros&lt;/a&gt;. E &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1558603204/qid=1139844867/sr=1-7/ref=sr_1_7/104-1988057-3389557?v=glance&amp;amp;s=books"&gt;ainda&lt;/a&gt; &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471976970/qid=1139844867/sr=1-6/ref=sr_1_6/104-1988057-3389557?v=glance&amp;s=books"&gt;mais&lt;/a&gt; &lt;a href="http://www.amazon.com/gp/product/0521416957/qid=1139845015/sr=1-2/ref=sr_1_2/104-1988057-3389557?s=books&amp;amp;v=glance&amp;n=283155"&gt;alguns&lt;/a&gt; &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0262062178/qid=1139845073/sr=2-1/ref=pd_bbs_b_2_1/104-1988057-3389557?v=glance&amp;amp;s=books"&gt;livros&lt;/a&gt;. Mas calma, &lt;a href="http://www.cs.brown.edu/%7Esk/Publications/Books/ProgLangs/"&gt;ainda&lt;/a&gt; &lt;a href="http://www.amazon.com/gp/product/0262220695/qid=1139845361/sr=1-2/ref=sr_1_2/104-1988057-3389557?s=books&amp;v=glance&amp;amp;n=283155"&gt;não&lt;/a&gt; &lt;a href="http://www.amazon.com/gp/product/3540654100/qid=1139845266/sr=2-1/ref=pd_bbs_b_2_1/104-1988057-3389557?s=books&amp;v=glance&amp;amp;n=283155"&gt;acabou&lt;/a&gt;. No final das contas é bom que eu releio e reviso muita coisa, além de ler muita coisa nova que eu já pretendia há tempos.&lt;br /&gt;&lt;br /&gt;A pesquisa anda por aí também, mas &lt;a href="http://cs.kent.ac.uk/people/staff/rej/gc.html"&gt;não exatamente&lt;/a&gt; &lt;a href="http://www.cs.cmu.edu/%7Etwelf/"&gt;no mesmo lugar&lt;/a&gt;. Tentando desenvolver idéias e me concentrar em alguns pontos, ao invés de dispersar demais (que é o meu hábito).&lt;br /&gt;&lt;br /&gt;Ironicamente, talvez o primeiro artigo com meu nome seja sobre teoria dos grafos. Mas não tô reclamando, se acontecer será muito bem-vindo.&lt;br /&gt;&lt;br /&gt;Outra hora, dando certo algumas coisas e surgindo tempo, eu escrevo sobre as idéias e o desenvolvimento delas. Ou outro post meio inútil como esse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113984577231965688?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113984577231965688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113984577231965688&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113984577231965688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113984577231965688'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/02/velozes-e-furiosas-alis-rpidas-e.html' title='Velozes e Furiosas... aliás, Rápidas e Curtas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113704668773916131</id><published>2006-01-11T22:16:00.000-08:00</published><updated>2006-01-11T22:18:07.753-08:00</updated><title type='text'>Tony Hoare, um rapaz simples, um homem do povo</title><content type='html'>&lt;blockquote&gt;Born in 1934, C. A. R. Hoare [...] graduated in Ancient Greats (Latin, Greek, Philosophy, and Ancient History) from Oxford University in 1956. While at Oxford, he also pursued extracurricular interests in the theory of probability and in mathematical logic[...]. Conscripted into the Royal Navy after his graduation, Hoare took the opportunity to study Russian, gaining an interpreter's qualification, and then spent a year at Moscow State University, attending lectures by the famous probability theorist A. N. Kolmogorov. At the end of his stay in Moscow, Hoare was asked to be an interpreter at an industrial exhibition. One of the exhibitors was the British firm Elliott Brothers, and Hoare was fascinated by the computer they had on display. [...]&lt;br /&gt;&lt;br /&gt;In 1961 Hoare, now working for Elliott Brothers, attended a course on ALGOL 60 taught by [Peter] Naur, [Edsger] Dijkstra, and the British computer scientist Peter Landin. The course was a revelation. During it Hoare suddenly realized how to use ALGOL's elegant features to implement a new, fast sorting algorithm that he had thought up. Hoare's Quicksort, published in 1962, began to establish his reputation as a computer scientist.&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0262632950/qid=1137046478/sr=1-1/ref=sr_1_1/104-8450727-6897542?s=books&amp;v=glance&amp;amp;n=283155"&gt;Mechanizing Proof: Computing, Risk and Trust&lt;/a&gt; de Donald MacKenzie&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113704668773916131?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113704668773916131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113704668773916131&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113704668773916131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113704668773916131'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/01/tony-hoare-um-rapaz-simples-um-homem.html' title='Tony Hoare, um rapaz simples, um homem do povo'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113642503614101998</id><published>2006-01-04T17:26:00.000-08:00</published><updated>2006-01-04T17:37:16.176-08:00</updated><title type='text'>Como programar em Java</title><content type='html'>Na &lt;span style="font-weight: bold;"&gt;plataforma&lt;/span&gt; Java, digo, não na linguagem. E a minha resposta é: programando em &lt;a href="http://scala.epfl.ch/"&gt;Scala&lt;/a&gt;. É uma linguagem orientada a objetos e funcional, que mistura muito bem os dois paradigmas, gera código para rodar na máquina virtual Java e se integra facilmente com as outras partes da plataforma.&lt;br /&gt;&lt;br /&gt;Scala tem funções como cidadãos de primeira classe da linguagem, polimorfismo paramétrico, uma espécie de híbrido de tipos algébricos e hierarquias de classes, tudo bem misturado e consistente. Tem atribuição e a parte imperativa também, de forma que é possível escrever código quase idêntico ao que seria em Java -- mas quem vai querer isso? O importante dessa decisão de projeto é a facilidade de usar classes Java em código Scala: é imediato e não requer nenhum processo, nada de &lt;span style="font-style: italic;"&gt;marshalling&lt;/span&gt;, pré-processamento, nada. Não é Haskell (a maior falta são tipos de ordem superior; embora seja possível definir mônadas específicas, não é possível definir o conceito de mônadas) mas é muito melhor do que Java. A sintaxe C-like perde um pouco de concisão, mas foi uma decisão consciente para atrair programadores, e não chega a atrapalhar muito. Eu só acho estranho, depois de uns 2 anos programando em &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt; e &lt;a href="http://haskell.org/"&gt;Haskell&lt;/a&gt;, escrever um &lt;code&gt;if&lt;/code&gt; sem &lt;code&gt;then&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;A partir de agora, sempre que eu precisar criar algum programa para a plataforma Java, será em Scala. Java não é uma linguagem ruim, só é extremamente &lt;span style="font-weight: bold;"&gt;chata&lt;/span&gt;. Sem graça. Além de muito prolixa.&lt;br /&gt;&lt;br /&gt;(Na plataforma .NET eu usaria &lt;a href="http://research.microsoft.com/projects/ilx/fsharp.aspx"&gt;F#&lt;/a&gt;. Uma vantagem de F# é a sintaxe, mais agradável para meu gosto atual; uma desvantagem é que a integração com as classes da plataforma .NET é bem menos descomplicada que em Scala.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113642503614101998?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113642503614101998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113642503614101998&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113642503614101998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113642503614101998'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/01/como-programar-em-java.html' title='Como programar em Java'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113622509692752896</id><published>2006-01-02T09:52:00.000-08:00</published><updated>2006-01-02T10:04:58.880-08:00</updated><title type='text'>Novos livros</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2776/513/1600/engcomp_sm.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/2776/513/320/engcomp_sm.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/155860698X/qid=1136224389/sr=2-1/ref=pd_bbs_b_2_1/104-1988057-3389557?s=books&amp;v=glance&amp;amp;n=283155"&gt;Engineering a Compiler&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2776/513/1600/reasoned.1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/2776/513/320/reasoned.1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0262562146/qid=1136224333/sr=2-1/ref=pd_bbs_b_2_1/104-1988057-3389557?s=books&amp;v=glance&amp;amp;n=283155"&gt;The Reasoned Schemer&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113622509692752896?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113622509692752896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113622509692752896&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113622509692752896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113622509692752896'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2006/01/novos-livros.html' title='Novos livros'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113418327828726430</id><published>2005-12-09T18:29:00.000-08:00</published><updated>2005-12-09T18:54:38.336-08:00</updated><title type='text'>darcs</title><content type='html'>Pensei em comentar um pouco sobre o &lt;a href="http://darcs.net/"&gt;darcs&lt;/a&gt;, um sistema de controle de versão bem recente e elogiado, principalmente para reclamar, mas eis que o problema era de BIOS mesmo e agora isso ficou para trás. Mas ainda assim vou comentar um pouco.&lt;br /&gt;&lt;br /&gt;Nos últimos anos surgiram &lt;a href="http://en.wikipedia.org/wiki/List_of_revision_control_software#Free_Software_and_Open_Source"&gt;vários&lt;/a&gt; sistemas de controle de versão &lt;a href="http://en.wikipedia.org/wiki/FOSS"&gt;FOSS&lt;/a&gt; que tentam substituir o &lt;a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System"&gt;CVS&lt;/a&gt;, o programa-padrão nesse domínio. Daí vieram o &lt;a href="http://en.wikipedia.org/wiki/Subversion_%28software%29"&gt;Subversion&lt;/a&gt; e o &lt;a href="http://en.wikipedia.org/wiki/GNU_Arch"&gt;Arch&lt;/a&gt;, só para citar dois dos mais famosos. As falhas do CVS são bem conhecidas, sendo que uma particularmente chata é que ele não controla diretórios (apenas arquivos dentro de diretórios) e não trata muito bem arquivos que são renomeados ou movidos. Todos esses novos sistemas sanam este e outros dos problemas mais importantes.&lt;br /&gt;&lt;br /&gt;O darcs tem alguns diferenciais, como ser um sistema distribuído. Cada cópia de trabalho é um repositório completo. Isso significa que você pode fazer tudo com o sistema mesmo sem estar conectado a um repositório central -- até porque não existe repositório central. Depois é só enviar os patches para o(s) outro(s) repositório(s) para sincronizar. E isso pode ser feito via SSH, ou email, ou você pode até levar o patch num disquete ou pendrive e aplicar manualmente lá. Muito mais prático que o CVS.&lt;br /&gt;&lt;br /&gt;Existem mais duas diferenças que não aparecem muito para o usuário, uma importante, outra apenas interessante. A importante é que o autor do darcs elaborou toda uma &lt;a href="http://darcs.net/manual/node8.html"&gt;teoria dos patches&lt;/a&gt; como modelo conceitual do sistema. Isso permite uma série de otimizações e uma visão integral do funcionamento do darcs em um nível mais alto, o que é muito bom. O autor diz ter se inspirado na mecânica quântica para elaborar a teoria, mas isso não vem ao caso. Em geral, os usuários não precisam aprende-la para usar o sistema, só para os usos mais avançados ou para quem pretende ler ou mexer no código. E aí vem a deixa para a segunda diferença: o darcs foi escrito em &lt;a href="http://haskell.org/"&gt;Haskell&lt;/a&gt;. Aliás, acho que foi a primeira aplicação feita em Haskell a "pegar" assim fora do universo das linguagens funcionais; inclusive já vi por aí gente instalando o &lt;a href="http://haskell.org/ghc"&gt;GHC&lt;/a&gt; só para compilar o darcs. E David Roundy, o autor do darcs, já declarou que a linguagem favoreceu a concepção da teoria dos patches e do sistema todo.&lt;br /&gt;&lt;br /&gt;Pode não ser uma &lt;span style="font-style: italic;"&gt;killer application&lt;/span&gt; que vai tornar a linguagem famosa e popular, mas é uma demonstração de aplicação prática de uma linguagem funcional muito recente e das mais avançadas. Outra é o &lt;a href="http://www.pugscode.org/"&gt;pugs&lt;/a&gt;, que eu já mencionei aqui.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113418327828726430?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113418327828726430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113418327828726430&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113418327828726430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113418327828726430'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/12/darcs.html' title='darcs'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113285868388768497</id><published>2005-11-24T10:34:00.000-08:00</published><updated>2005-11-24T11:00:37.023-08:00</updated><title type='text'>Ubuntu, controle de versão e afins</title><content type='html'>Uma nota mais administrativa, mas enfim.&lt;br /&gt;&lt;br /&gt;Finalmente, após muito planejamento, substituí o servidor que cuidava aqui da sala da pós-graduação. É um Pentium II meio antigo, que estava rodando Windows XP muito mal, cheio de problemas e que caía constantemente. Instalei o &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 5.10, só o sistema básico para funcionar como servidor. Aproveitei e coloquei &lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt;, &lt;a href="http://www.zope.org/"&gt;Zope&lt;/a&gt;, &lt;a href="http://www.nongnu.org/cvs/"&gt;cvs&lt;/a&gt; e &lt;a href="http://darcs.net/"&gt;darcs&lt;/a&gt;, só por enquanto. Pensei em instalar &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; também, para brincar um pouco, mas deixei para depois.&lt;br /&gt;&lt;br /&gt;Instalar sistemas de controle de versão era importante. Estou trabalhando atualmente em 4 máquinas diferentes, e às vezes é complicado saber onde está a versão mais nova de algum programa ou texto (será que a versão mais nova está no pendrive? ou esqueci de copiar?). Primeiro instalei o darcs que é um novo concorrente na praça, feito em &lt;a href="http://haskell.org/"&gt;Haskell&lt;/a&gt; e muito elogiado por aí pela sua &lt;a href="http://darcs.net/manual/node8.html"&gt;teoria dos patches&lt;/a&gt;. Instalei o cvs depois porque achei mais prático para outros alunos aqui que queiram usar controle de versão, já que é um sistema mais antigo, tem integração com &lt;a href="http://eclipse.org/"&gt;Eclipse&lt;/a&gt;, ferramentas GUI interessantes como o &lt;a href="http://tortoisecvs.sf.net/"&gt;TortoiseCVS&lt;/a&gt; e por aí vai.&lt;br /&gt;&lt;br /&gt;Também coloquei o ubuntu rodando em mais duas máquinas aqui (sendo uma para meu uso). Até agora tudo muito bem, e sem dúvida ele é infinitamente mais prático de instalar que o &lt;a href="http://gentoo.org/"&gt;Gentoo&lt;/a&gt;. A única experiência traumática parece ser fazer um &lt;code&gt;dist-upgrade&lt;/code&gt;, coisa que ainda não tentei. No geral, é uma das distros linux que eu mais recomendo hoje em dia, uma que tem o poder da &lt;a href="http://debian.org/"&gt;Debian&lt;/a&gt; mas muito mais facil de usar.&lt;br /&gt;&lt;br /&gt;Sobre o darcs, comecei a usar já e estou mantendo alguns projetos com ele. Depois eu comento sobre minhas experiências.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113285868388768497?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113285868388768497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113285868388768497&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113285868388768497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113285868388768497'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/11/ubuntu-controle-de-verso-e-afins.html' title='Ubuntu, controle de versão e afins'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113224229112043372</id><published>2005-11-17T07:44:00.000-08:00</published><updated>2005-11-17T07:44:51.130-08:00</updated><title type='text'>Será?</title><content type='html'>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;img src="http://www.math.mcgill.ca/~dsavitt/GTM/doob.jpg" width=120 height=182 alt=""&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;If I were a Springer-Verlag Graduate Text in Mathematics, I would be J.L. Doob's &lt;b&gt;&lt;i&gt;Measure Theory&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I am different from other books on measure theory in that I accept probability theory as an essential part of measure theory. This means that many examples are taken from probability; that probabilistic concepts such as independence, Markov processes, and conditional expectations are integrated into me rather than being relegated to an appendix; that more attention is paid to the role of algebras than is customary; and that the metric defining the distance between sets as the measure of their symmetric difference is exploited more than is customary. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Which Springer GTM would &lt;i&gt;you&lt;/i&gt; be? &lt;br /&gt;&lt;a href="http://www.math.mcgill.ca/~dsavitt/GTM.html"&gt;The Springer GTM Test&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113224229112043372?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113224229112043372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113224229112043372&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113224229112043372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113224229112043372'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/11/ser.html' title='Será?'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113129878072625809</id><published>2005-11-06T09:21:00.000-08:00</published><updated>2005-11-06T09:42:12.803-08:00</updated><title type='text'>Brincando com Haskell, parte 1</title><content type='html'>Estou experimentando agora com sistemas de inferência de tipos, começando com um Hindley-Milner clássico, escrevendo o código em &lt;a href="http://haskell.org/"&gt;Haskell&lt;/a&gt;. Claro que para experimentar eu precisava de uma linguagem funcional simples, mas desta vez resolvi não ficar apenas na sintaxe abstrata: criar um &lt;span style="font-style: italic;"&gt;parser&lt;/span&gt; e coisa e tal para poder escrever programas num formato razoável. Isso me levou a usar o &lt;a href="http://www.cs.uu.nl/%7Edaan/parsec.html"&gt;Parsec&lt;/a&gt;, biblioteca de combinadores de parsers. Já tinha ficado impressionado antes vendo alguns exemplos, mas nunca tinha usado de verdade. E, realmente, é muito bom de usar, pelo menos para uma linguagem simples. O trabalho é feito definindo parsers algebricamente, de uma forma que espelha quase perfeitamente a forma da gramática em BNF. A documentação no &lt;a href="http://www.cs.uu.nl/%7Edaan/parsec.html"&gt;site&lt;/a&gt; também ajuda bastante, tendo exemplos e casos de uso interessantes. Nada de usar um processador separado para gerar um parser quase incompreensível.&lt;br /&gt;&lt;br /&gt;Como um pequeno exemplo, aqui está a definição que analisa a expressão condicional:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;conditional :: Parser Exp&lt;br /&gt;conditional = do reserved "if"&lt;br /&gt;              e1 &lt;- expr&lt;br /&gt;              reserved "then"&lt;br /&gt;              e2 &lt;- expr&lt;br /&gt;              reserved "else"&lt;br /&gt;              e3 &lt;- expr&lt;br /&gt;              return (If e1 e2 e3)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Isso significa que o parser vai procurar pela palavra reservada &lt;code&gt;if&lt;/code&gt;, depois chamar o parser para expressões para analisar a expressão booleana do condicional, depois procura a palavra reservada &lt;code&gt;then&lt;/code&gt;, e por aí vai. Outro exemplo interessante é um analisador parcial para expressões básicas (que podem aparecer como fatores de expressões com operadores):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;baseExp :: Parser Exp&lt;br /&gt;baseExp = letexpr &lt;|&gt; conditional &lt;|&gt; variable &lt;|&gt; numberLiteral &lt;|&gt; &lt;br /&gt;          booleanLiteral &lt;|&gt; parens expr&lt;br /&gt;          &lt;?&gt; "basic expression"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Isso mostra de maneira bem clara que uma expressão de base é uma expressão &lt;code&gt;let&lt;/code&gt;, um condicional, uma variável, um literal (numérico ou booleano) ou uma expressão entre parênteses. Cada um desses como &lt;code&gt;letexpr&lt;/code&gt; que são operados com &lt;code&gt;&lt;|&gt;&lt;/code&gt; são parsers de algum tipo de expressão. O operador &lt;code&gt;&amp;lt;?&amp;gt;&lt;/code&gt; permite que o parser seja descrito, para ajudar na composição de mensagens de erro significativas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113129878072625809?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113129878072625809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113129878072625809&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113129878072625809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113129878072625809'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/11/brincando-com-haskell-parte-1.html' title='Brincando com Haskell, parte 1'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-113020904662191114</id><published>2005-10-24T19:28:00.000-07:00</published><updated>2005-10-24T20:13:02.063-07:00</updated><title type='text'>Notas sobre lógica e a correspondência Curry-Howard</title><content type='html'>Todos fatos conhecidos, mas que eu estou entendendo um pouco melhor somente há pouco tempo. Senão vejamos: na lógica de primeira ordem a sintaxe é estratificada em duas camadas: termos e fórmulas. Os termos representam os valores sobre alguma estrutura sobre a qual se fala; as fórmulas tratam de propriedades sobre os termos. Pode-se interpretar a lógica intuicionista de primeira ordem no λ-cálculo tipado de primeira ordem: os termos são os valores (não necessariamente em sua forma normal, ou seja, não necessariamente avaliados) e as fórmulas são tipos, que são propriedades dos termos. Então um tipo é como se fosse um predicado sobre um termo, o que faz todo sentido. Isso é mais ou menos a essência da correspondência Curry-Howard.&lt;br /&gt;&lt;br /&gt;Mas a coisa fica melhor. Na lógica de primeira ordem só podemos quantificar sobre variáveis, que são parte de termos. Na lógica de segunda ordem pode-se quantificar sobre predicados também. O correspondente no λ-cálculo é o &lt;a href="http://en.wikipedia.org/wiki/System_F"&gt;Sistema F&lt;/a&gt; de Girard, que é um λ-calculo tipado de segunda ordem, no qual pode-se estabelecer abstrações de tipos e aplicações de tipos. Girard utilizou o Sistema F para estudar o PA&lt;sub&gt;2&lt;/sub&gt;, a aritmética de Peano de segunda ordem, e provar sua consistência. De forma similar temos a lógica de ordem superior e o Sistema F de ordem superior (Fω). A quantificação no caso da lógica é sobre predicados e predicados de predicados e por aí vai; no sistema Fω os tipos de ordem superior são como funções de tipos em tipos (no Sistema F de segunda ordem existem apenas funções de tipos em termos), em qualquer nível. Mais uma vez, Girard utilizou esse sistema para estudar o PA&lt;sub&gt;ω&lt;/sub&gt;, a aritmética de Peano de ordem superior, e provar sua consistência pela propriedade de normalização dos termos no sistema Fω.&lt;br /&gt;&lt;br /&gt;Já na lógica de ordem superior a formulação mais utilizada é devida a Alonzo Church e, como esperado, envolve o λ-cálculo. É utilizado um cálculo tipado pois o cálculo sem tipos é inconsistente, graças ao paradoxo de Russell. Lógica de ordem superior também é utilizada como base para provadores de teoremas, por exemplo o sistema &lt;a href="http://www.cl.cam.ac.uk/Research/HVG/Isabelle/"&gt;Isabelle/HOL&lt;/a&gt;. Um outro provador de teoremas famoso, o &lt;a href="http://coq.inria.fr/"&gt;Coq&lt;/a&gt;, utiliza um cálculo baseado em tipos dependentes, que estabelecem uma conexão entre termos e tipos. Mas isso fica para outra hora.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-113020904662191114?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/113020904662191114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=113020904662191114&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113020904662191114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/113020904662191114'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/10/notas-sobre-lgica-e-correspondncia.html' title='Notas sobre lógica e a correspondência Curry-Howard'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112880039915333919</id><published>2005-10-08T12:32:00.000-07:00</published><updated>2005-10-08T12:39:59.173-07:00</updated><title type='text'>Mônadas são valores</title><content type='html'>Lendo uma série de artigos sobre mônadas (os de &lt;a href="http://homepages.inf.ed.ac.uk/wadler/"&gt;Philip Wadler&lt;/a&gt;, especificamente). Atualmente estou no "Imperative Functional Programming" de Peyton-Jones e Wadler. Esse trecho bateu com o que eu já tinha redescoberto recentemente:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Notice the distinction between an action and its performance. Think of an action as a "script", which is performed by executing it. Actions themselves are first-class citizens.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;As ações a que ele se refere, obviamente, são valores monádicos.&lt;br /&gt;&lt;br /&gt;Outra idéia importante é que mônadas não necessariamente precisam exprimir ação. No geral, são um mecanismo para capturar &lt;span style="font-style: italic;"&gt;diferentes estratégias de computação&lt;/span&gt;. Por exemplo, listas podem ser encaradas como mônadas que refletem uma estratégia de computação baseada no uso de vários valores por expressão, ao invés de apenas um. Isso também pode ser interpretado como não-determinismo. Aliás, existe um exemplo bem interessante de não-determinismo expresso por mônadas em "Comprehending Monads", de Wadler. Mas tratar uma lista como mônada, sem efeitos colaterais impuros, é bem diferente da mônada &lt;code&gt;IO&lt;/code&gt;, que delimita partes do código que são imperativos. E isso se reflete no fato que é possível sair de uma mônada de lista, mas nunca de uma imperativa como &lt;code&gt;IO&lt;/code&gt; ou &lt;code&gt;State&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112880039915333919?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112880039915333919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112880039915333919&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112880039915333919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112880039915333919'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/10/mnadas-so-valores.html' title='Mônadas são valores'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112758909053436483</id><published>2005-09-24T11:59:00.000-07:00</published><updated>2005-09-24T12:11:30.540-07:00</updated><title type='text'>Alguns comentários soltos</title><content type='html'>Voltando a estudar e praticar &lt;a href="http://haskell.org/"&gt;Haskell&lt;/a&gt;, o que me fez voltar a ler sobre mônadas. Uma coisa que eu ainda não tinha entendido direito é que, apesar da aparência imperativa da notação usando &lt;code&gt;do&lt;/code&gt;, um valor envolto em uma mônada é apenas um valor, não é a execução da ação em si. Algo tem que executar as ações. Minha intenção em estudar mônadas é entender suas relações com sistemas de tipos e efeitos, o que leva a regiões para gerenciamento de memória.&lt;br /&gt;&lt;br /&gt;E por falar em Haskell, é interessante ver como DSLs como &lt;a href="http://www.conal.net/Fran/"&gt;Fran&lt;/a&gt; (ou outras que utilizam a idéia da reatividade funcional) são expressivas e só são possíveis em Haskell. Elas utilizam exatamente o conjunto que distingue a linguagem: avaliação preguiçosa, type classes e mônadas.&lt;br /&gt;&lt;br /&gt;Sim, também tenho lido sobre uso de código carregado dinamicamente em uma linguagem com verificação estática de tipos (Haskell, novamente), um interesse antigo pois tem tudo a ver com sistemas distribuídos e código móvel. O &lt;a href="http://www.cse.unsw.edu.au/%7Edons/hs-plugins/"&gt;hs-plugins&lt;/a&gt; faz o possível mas algumas coisas ainda são impossíveis, e talvez menos flexíveis do que deveriam. Por exemplo, uma aplicação que tenha plugins deve definir a priori as interfaces que os plugins devem obedecer, algo similar aos pontos de extensão da plataforma &lt;a href="http://eclipse.org/"&gt;Eclipse&lt;/a&gt;. Por que não ter plugins que não necessariamente sigam (ou nao estritamente) a API delimitada pela aplicação? O maior problema é, como verificar os tipos de um plugin arbitrário, o que já é significantemente difícil no cenário com uma interface definida. Uma idéia poderia ser usar &lt;span style="font-weight: bold;"&gt;proof-carrying code&lt;/span&gt; para isso, de fato um uso talvez simplório, mas realizável, da idéia. É uma das coisas que eu espero investigar em breve. E &lt;a href="http://www.cs.cornell.edu/talc/"&gt;Typed Assembly Language&lt;/a&gt; é o futuro.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112758909053436483?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112758909053436483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112758909053436483&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112758909053436483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112758909053436483'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/09/alguns-comentrios-soltos.html' title='Alguns comentários soltos'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112689412114525696</id><published>2005-09-16T11:03:00.000-07:00</published><updated>2005-09-16T11:14:34.566-07:00</updated><title type='text'>Pesquisa em linguagens de programação e espeficicações formais</title><content type='html'>Ainda não veio a inspiração (ou foi a preguiça que não deu trégua) para escrever sobre a correspondência de Church-Turing. Enquanto isso, &lt;a href="http://blogs.gotdotnet.com/emeijer/commentview.aspx/c15c9d4c-e0f7-44b6-8de6-e857910940f3"&gt;este post&lt;/a&gt;, já antigo, de Erik Meijer em seu &lt;a href="http://blogs.gotdotnet.com/emeijer/"&gt;blog&lt;/a&gt; e os comentários discutem muito bem sobre o uso de definições precisas da semântica de uma linguagem de programação. O ponto mais importante, na minha opinião, está nesse parágrafo de Erik:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Of course the question is why smart language designers do not write formal specifications, and why equally brilliant researchers do not cover the complete design of real languages. The simple, recursive, answer I believe is that despite decades of research (&lt;a href="http://citeseer.nj.nec.com/koster95family.html"&gt;van         Wijngaarden grammars&lt;/a&gt;, &lt;a href="http://www-rocq.inria.fr/oscar/www/fnc2/attribute-grammar-people.html"&gt;attribute         grammars&lt;/a&gt;, &lt;a href="http://www.cl.cam.ac.uk/Teaching/Lectures/dens/"&gt;denotational         semantics&lt;/a&gt;, &lt;a href="http://citeseer.nj.nec.com/context/1357/0"&gt;operational semantics&lt;/a&gt;, &lt;a href="http://www.cse.ucsc.edu/%7Eabadi/CS203_F02/l5.pdf"&gt;axiomatic         semantics&lt;/a&gt;, &lt;a href="http://www.csr.ncl.ac.uk/vdm/"&gt;VDM&lt;/a&gt;, &lt;a href="http://www.cwi.nl/htbin/sen1/twiki/bin/view/SEN1/MetaEnvironment"&gt;ASF/SDF&lt;/a&gt;, &lt;a href="http://www.tcs.informatik.uni-muenchen.de/%7Ematthes/logikserver/software.html"&gt;theorem         provers&lt;/a&gt;, &lt;a href="http://research.microsoft.com/fse/asml/"&gt;abstract state machines&lt;/a&gt;, ...........................) we still lack the proper programming language to describe real programming languages at the right level of abstraction.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;E é ecoado no comentário de Neel Krishnaswami:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Our formal descriptions don't evolve as quickly as our code, for reasons I don't really understand. Eg, SML has evolved much more slowly than Ocaml or Haskell have, AFAICT because it has a formal semantics and they don't. So when a change is made to Ocaml, the implementors don't feel obligated to redo all of the soundness proofs -- which is good, because the proofs are sufficiently unmodular that even small changes can involve lots of work to fix. (Bob Harper and Chris Stone complain about this problem in so many words in their type-theoretic semantics of SML.)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112689412114525696?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112689412114525696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112689412114525696&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112689412114525696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112689412114525696'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/09/pesquisa-em-linguagens-de-programao-e.html' title='Pesquisa em linguagens de programação e espeficicações formais'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112681449286545388</id><published>2005-09-15T13:00:00.000-07:00</published><updated>2005-09-15T13:01:32.873-07:00</updated><title type='text'>Por enquanto fiquemos com um pouco de Dó sustenido</title><content type='html'>&lt;a href="http://googletron.blogspot.com/2005/09/c-uma-linguagem-funcional.html"&gt;Aqui&lt;/a&gt; um post que eu escrevi no &lt;a href="http://googletron.blogspot.com/"&gt;Googletron&lt;/a&gt; sobre as novas características que aparecerão na versão 3 da linguagem C#, que pelo jeito está praticamente se tornando objeto-funcional. &lt;span style="font-style: italic;"&gt;I mean&lt;/span&gt;, inferência de tipos? Expressões lambda? (Inclusive sem inventar algum nome mais "marketeiro" para substituir "lambda").&lt;br /&gt;&lt;br /&gt;Lembrando que C# já tem suporte a polimorfismo paramétrico desde a versão 2... ora, inventem logo uma versão puramente funcional do CLR. Haskell para as massas!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112681449286545388?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112681449286545388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112681449286545388&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112681449286545388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112681449286545388'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/09/por-enquanto-fiquemos-com-um-pouco-de.html' title='Por enquanto fiquemos com um pouco de Dó sustenido'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112604890161208752</id><published>2005-09-06T16:14:00.000-07:00</published><updated>2005-09-06T16:21:41.616-07:00</updated><title type='text'>Promessas</title><content type='html'>Ok, eu tinha ficado de publicar um artigo sobre prova de teoremas na programação aqui, há um bom tempo já. Mas vieram as provas de final de semestre, e vieram as curtas férias, e isso foi ficando para depois. Em breve a atividade no blog deve aumentar, aproveitando que as disciplinas acabaram e eu vou me dedicar mais à pesquisa. E o artigo prometido ainda vai aparecer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112604890161208752?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112604890161208752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112604890161208752&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112604890161208752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112604890161208752'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/09/promessas.html' title='Promessas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112309828421792029</id><published>2005-08-03T12:38:00.000-07:00</published><updated>2005-08-03T12:44:44.223-07:00</updated><title type='text'>Em breve</title><content type='html'>Motivos de força maior (&lt;a href="http://pt.wikipedia.org/wiki/Janio_Quadros"&gt;Jânio&lt;/a&gt; diria "forças terríveis") me impediram de postar ultimamente. Mas eu tenho pensado em um texto sobre programação e prova de teoremas. Espero mostrar que todo mundo que já programou em Java usou um provador automático de teoremas, mesmo que não tenha consciência disso. Isso nos levará em direção à correspondência de Church-Howard e algumas considerações defendendo a tese que programar é, basicamente, praticar uma forma de matemática construtiva. Ou quase.&lt;br /&gt;&lt;br /&gt;Depois disso devem voltar mais alguns posts específicos sobre minha pesquisa atual e assuntos relacionados. Até.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112309828421792029?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112309828421792029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112309828421792029&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112309828421792029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112309828421792029'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/08/em-breve.html' title='Em breve'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112251005390669736</id><published>2005-07-27T17:04:00.000-07:00</published><updated>2005-07-27T17:24:21.636-07:00</updated><title type='text'>Solução ?</title><content type='html'>Nos últimos posts eu apresentei argumentos para sustentar a idéia que a engenharia de software atual é insuficiente (e na verdade mal merece o nome). Mas qual seria a solução então ?&lt;br /&gt;&lt;br /&gt;A idéia é simples de conceber, embora não de realizar: colocar a atividade de criação de software em sólidas bases científicas, assim como as outras engenharias. Fazer com que um projetista de software não apenas desenhe diagramas bonitos com a última moda em confecção de diagramas, mas que também possa provar propriedades sobre o projeto dele, de forma a garantir que as especificações iniciais são satisfeitas. Especificações, aliás, que devem ser expressas formalmente também. Nesse ponto das especificações aparece uma crítica comum: provar que o programa obedece às especificações é inútil se estas não capturam os requerimentos reais do sistema. E como provar que as especificações capturam os requerimentos ? Esse é um problema complicado que poderia, em primeira análise, ser uma repetição do primeiro (coerência do software com especificações), mas a especificação é bem mais simples e de alto nível, o que ajuda a fazer a verificação.&lt;br /&gt;&lt;br /&gt;Encontrar essas bases científicas não é coisa que se faz do dia para a noite: os métodos formais atuais ainda são inadequados para as escalas de sistemas construídos. Mas, ao invés de abandonar a idéia de vez, me parece mais lógico trabalhar para melhorar os métodos até que eles se tornem suficientes. E o interessante é que isso já está acontecendo, como eu exemplifiquei &lt;a href="http://realpar.blogspot.com/2005/07/continuando-discusso.html"&gt;neste post&lt;/a&gt;. Minha crença é que essa tendência deve continuar, mas ela aconteceria mais rápido se a indústria, como um todo, se preocupasse mais com a qualidade. E essa falta de preocupação vem principalmente da tolerância dos clientes. A verificação que se faz hoje em dia é através de testes, mas todo mundo sabe que testes não podem provar a ausência de erros, apenas sua presença; você confiaria sua vida num sistema que foi apenas testado ?&lt;br /&gt;&lt;br /&gt;Em uma de suas frases famosas, &lt;a href="http://en.wikipedia.org/wiki/Alan_Perlis"&gt;Alan Perlis&lt;/a&gt; disse "&lt;span style="font-style: italic;"&gt;I think that it's extraordinarily important that we in computer science keep fun in computing&lt;/span&gt;", com o que eu concordo plenamente. A formalização não vai tornar a criação de software mais chata; programação como artesanato e atividade técnica vai continuar existindo -- eu mesmo junto umas linhas de código para fazer algo que eu quero (ou por diversão) de vez em quando, sem grande preocupação com corretude, e não pretendo deixar de fazer isso. Mas sempre que for necessário um nível de confiabilidade maior, teremos ferramentas para garantir que os programas se comportarão como esperamos.&lt;br /&gt;&lt;br /&gt;E isso, por incrível que pareça para quem está muito acostumado com software, é apenas o mínimo que as pessoas costumam exigir de qualquer artefato... que ele &lt;span style="font-weight: bold;"&gt;funcione&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112251005390669736?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112251005390669736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112251005390669736&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112251005390669736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112251005390669736'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/07/soluo.html' title='Solução ?'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112250870389432694</id><published>2005-07-27T16:40:00.000-07:00</published><updated>2005-07-27T17:27:58.130-07:00</updated><title type='text'>Mais sobre lógica e formalização</title><content type='html'>&lt;blockquote&gt;During the last 10 years we have seen a number of failures in these kind of systems. I just mention four well-known examples.&lt;br /&gt;&lt;br /&gt;The first example is the Ariadne rocket, a common European space project. The rocket exploded a few seconds after takeoff, due to a software error.&lt;br /&gt;&lt;br /&gt;Another well known example is the baggage-handling system of the Denver International Airport. Errors in the software that controls the system required postponement of the official opening (Oct. 1993). By June 1994 the $193 million system was still not functioning, but costing $1.1 million per day in interest and other costs. In early 1995 a manual baggage system was installed in order to open the airport.&lt;br /&gt;&lt;br /&gt;Some cancer patients in the USA have received fatal radiation overdoses from the Therac-25, a computer-controlled radiation-therapy machine.&lt;br /&gt;&lt;br /&gt;The last example is the Sizewell B nuclear power plant in England. Some years ago it was decided to test the subsystem which is used to close down the reactor if a dangerous situation occurs. The results were not comforting: the software failed almost half of them. They were not able to find the errors in the 100,000 lines of code. Instead, they reduced the overall expectation of the plant's performance from one failure every 10,000 years to one every 1,000 years.&lt;/blockquote&gt; &lt;div style="text-align: right;"&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.cs.chalmers.se/%7Ebengt/"&gt;Bengt Nordstrom&lt;/a&gt;, &lt;a href="http://www.cs.chalmers.se/%7Ebengt/papers/vatican.pdf"&gt;&lt;span style="font-style: italic;"&gt;Constructivism: A Computing Science Perspective&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Esses são exemplos de sistemas críticos, nos quais foi investido muito dinheiro e que mesmo assim foram fracassos consideráveis. Não são os únicos exemplos: &lt;a href="http://www.cl.cam.ac.uk/users/lcp/"&gt;Larry Paulson&lt;/a&gt; menciona, nas notas de um de seus cursos, um sistema de controle de ambulâncias na Inglaterra que causou a morte de vários pacientes por atraso de atendimento. Tendo em vista isso, é fácil concordar que essa tal &lt;span style="font-style: italic;"&gt;engenharia de software&lt;/span&gt; deixa muito a desejar. Será que eu sou o único a achar loucura confiar em sistemas assim ?&lt;br /&gt;&lt;br /&gt;O trecho é de uma palestra proferida por Bengt Nordstrom em um evento no Vaticano. Sigam o link e leiam a coisa toda, é interessante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112250870389432694?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112250870389432694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112250870389432694&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112250870389432694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112250870389432694'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/07/mais-sobre-lgica-e-formalizao.html' title='Mais sobre lógica e formalização'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112153295847280393</id><published>2005-07-16T09:47:00.000-07:00</published><updated>2005-07-16T09:55:58.480-07:00</updated><title type='text'>Continuando a discussão</title><content type='html'>Depois do &lt;a href="http://realpar.blogspot.com/2005/07/lgica-computao-e-engenharia-de.html"&gt;post passado&lt;/a&gt;, &lt;a href="http://herval.blogspot.com/"&gt;Herval&lt;/a&gt; escreveu no &lt;a href="http://googletron.blogspot.com/"&gt;Geek4Life&lt;/a&gt; &lt;a href="http://googletron.blogspot.com/2005/07/will-computing-flow-like-electricity.html"&gt;um post&lt;/a&gt; sobre "computação úbiqüa", computação pervasiva ou como queira chamar. Por acaso, essa é justamente uma das minhas maiores preocupações com a questão de computação confiável; quando se tem software em todo lugar, em todos aspectos da vida, é de extrema importância que tudo funcione bem. Então escrevi um comentário:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Relacionado ao meu post sobre engenharia de software, não dá medo usar software em todos esses lugares, considerando a qualidade média do que se produz hoje ? :)&lt;/blockquote&gt;&lt;br /&gt;Ao que Herval respondeu:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  Acho que desenvolvimento de software hoje é meio que um artesanato com gerência e prazos.&lt;br /&gt; &lt;br /&gt;ps.: software embarcado, imho, é uma das áreas menos problemáticas da tecnologia (talvez pelo pequeno tamanho da coisa). Meu celular costuma travar bem menos que meu PC. Meu cartão de crédito com 'chipinho inteligente' nunca travou durante uma compra ou autorização de crédito. Só não sei como vai ser quando a casa toda começar a ficar automatizada e inteligente... :)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;E eu, por fim, fiz como resposta um outro comentário que tem mais alguns exemplos:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Sim, concordo que software embutido dá muito menos problema, não por que sabemos fazer esse tipo de software melhor, mas porque ele é menos complexo. Como você disse, seu celular "trava bem menos" que o PC, mas ainda trava :)&lt;br /&gt; &lt;br /&gt;E o problema é, cada vez mais nossas vidas vão dependendo de software, em muitos aspectos. Esse nível de qualidade é claramente inaceitável quando coisas mais críticas começam a depender de software que é essencialmente imprevisível.&lt;br /&gt; &lt;br /&gt;Uma coisa que pouca gente tem idéia é que desde o fiasco do bug de divisão do Pentium, a Intel investe pesado em métodos formais para verificação do projeto dos seus chips; as concorrentes, obviamente, seguiram a mesma direção e hoje em dia nenhum chip sai da sala de projeto para a planta da fábrica sem ter sido verificado formalmente, com provas matemáticas que ele funciona como especificado.&lt;br /&gt; &lt;br /&gt;Outro ponto onde métodos formais são usados corriqueiramente é no projeto de protocolos. Um conhecido meu está trabalhando na Microsoft Research atualmente nesse ramo.&lt;br /&gt; &lt;br /&gt;E por falar em Microsoft, existe uma ferramenta desenvolvida internamente pelo pessoal da MSR que verifica drivers. Usa essas técnicas de métodos formais e verificação de modelos (model checking) e foi escrita em OCaml.&lt;br /&gt; &lt;br /&gt;Esses exemplos seriam quase impensáveis há meros 10 anos. Imagine o que pode acontecer 10 anos para frente...&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112153295847280393?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112153295847280393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112153295847280393&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112153295847280393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112153295847280393'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/07/continuando-discusso.html' title='Continuando a discussão'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-112120978229947077</id><published>2005-07-12T15:41:00.000-07:00</published><updated>2005-07-27T17:03:01.496-07:00</updated><title type='text'>Lógica, computação e engenharia de software</title><content type='html'>Existe uma verdade básica sobre engenharia de software: não existe engenharia de software. Não no sentido das outras engenharias; o que se rotula de "engenharia de software" hoje em dia é parte gerência de projetos, parte coleção de métodos &lt;span style="font-style: italic;"&gt;ad hoc&lt;/span&gt; para tentar assegurar que as coisas continuem nos trilhos. E os métodos frequentemente falham.&lt;br /&gt;&lt;br /&gt;Por outro lado, vinda lá da década de 60, existe a idéia de escrever provas matemáticas de corretude de programas. O assunto foi exaustivamente pesquisado na época, mas logo se viu que o esforço necessário era muito alto para programas não-triviais. As demandas econômicas e a expectativa relativamente baixa dos clientes acabaram impulsionando a atividade de criação de software como um artesanato ao invés de engenharia. E esta é, mais ou menos alguns detalhes, a situação até hoje. Existe uma legião de "programadores" profissionais com formação deficiente, e mesmo muitas universidades que oferecem cursos de ciência da computação se contentam em dar um verniz teórico muito superficial, acompanhado por incontáveis horas de treinamento vocacional em Java ou qualquer que seja a linguagem da moda no momento.&lt;br /&gt;&lt;br /&gt;O resultado é visível: bugs e falhas de segurança permanecem abundantes mesmo em software considerado de "alta qualidade". Os clientes se acostumaram a isso como se fosse a única forma, mas não precisa ser assim. O mesmo cliente que simplesmente balança a cabeça ao ver um &lt;span style="font-style: italic;"&gt;bug&lt;/span&gt; do Word ou uma falha de segurança no seu Windows voltaria correndo para a concessionária devolver um carro que apresentasse o menor defeito. E software livre, sinceramente, não resolve este problema: eu uso Linux diariamente, em casa, mas o número de bugs e incompatibilidades nas aplicações é considerável, embora a base do sistema operacional seja sólida.&lt;br /&gt;&lt;br /&gt;Baixas expectativas + altíssima demanda + profissionais incompetentes = software de má qualidade.&lt;br /&gt;&lt;br /&gt;Mas as outras engenharias não nasceram da forma que são hoje; elas primeiro passaram por um período de ensino vocacional e técnico antes de chegarem ao estágio atual de assumir uma base científica. O cálculo, a análise matemática, se tornou a base das engenharias entre os séculos XIX e XX.&lt;br /&gt;&lt;br /&gt;Pode-se ter esperança, então, que a engenharia de software siga o mesmo caminho. A lógica matemática se mostrou, nestas décadas de desenvolvimento da computação, ser uma base extremamente adequada para a atividade. Por que não dizer que a lógica está para a engenharia de software assim como a análise está para as outras ? Por que não basear a criação de software em uma fundação científica sólida ? Os problemas de gerenciamento de projetos vão continuar existindo, claro, como existem nas outras engenharias. Mas pelo menos quem precisa criar software que funcione terá um conjunto de métodos para &lt;span style="font-weight: bold;"&gt;garantir&lt;/span&gt; que as especificações são satisfeitas, assim como um engenheiro civil garante que uma ponte sustenta uma carga de até X toneladas, mais ou menos um porcentual de erro conhecido e controlado.&lt;br /&gt;&lt;br /&gt;Ao ler &lt;a href="http://international-lisp-conference.org/speakers.html#john_allen"&gt;este artigo&lt;/a&gt; de John Allen, eu tive vontade muitas vezes de simplesmente balançar a cabeça em concordância; os argumentos dele sintetizam muito do que eu já acreditava sobre o assunto. A teoria está se tornando cada vez mais relevante, embora a maioria dos praticantes ainda não se dê conta; por exemplo, a adição de genéricos em Java utiliza partes muito avançadas e recentes da teoria dos tipos (&lt;span style="font-style: italic;"&gt;quantificação limitada de tipos polimórficos&lt;/span&gt;, alguém já ouviu falar?). Mesmo que o resultado não tenha sido excelente, a linguagem foi aumentada de forma significativa sem quebrar a compatibilidade. Esse tipo de cirurgia em linguagens já existentes há anos é quase impossível de ser feita sem deixar alguns efeitos colaterais. E quem fez isso ? Um grupo de teóricos conhecidos, entre eles o famoso &lt;a href="http://homepages.inf.ed.ac.uk/wadler/"&gt;Philip Wadler&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A Microsoft, por sua vez, emprega uma verdadeira legião de pesquisadores em linguagens de programação, alguns dos quais trabalharam e ainda trabalham em várias extensões para o CLR (o runtime da plataforma .NET) e para a linguagem C#. A extensão do CLR para usar genéricos, por exemplo. Mas existem várias outras coisas sendo feitas.&lt;br /&gt;&lt;br /&gt;A questão é quando a teoria e o rigor vão atingir o Joe-Sixpack-Programmer, o programador comum que está "nas trincheiras". Isso eu não sei, mas desconfio que quem quiser trabalhar no ramo daqui a uns 20 anos deve se preparar para aprender uma boa quantidade de matemática, especialmente lógica...&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-112120978229947077?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/112120978229947077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=112120978229947077&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112120978229947077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/112120978229947077'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/07/lgica-computao-e-engenharia-de.html' title='Lógica, computação e engenharia de software'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111980336286325755</id><published>2005-06-26T09:26:00.000-07:00</published><updated>2005-06-26T09:29:52.836-07:00</updated><title type='text'>Type-Based Analysis and Applications</title><content type='html'>&lt;a href="http://www.cs.ucla.edu/%7Epalsberg/tba/papers/palsberg-paste01.pdf"&gt;Artigo&lt;/a&gt; de Jens Palsberg&lt;br /&gt;&lt;br /&gt;Um &lt;i&gt;survey paper&lt;/i&gt; que apresenta uma visão geral da área de análises estáticas de programas baseadas em tipos. Após introduzir o assunto e definir análise baseada em tipos (uma &lt;b&gt;análise baseada em tipos&lt;/b&gt; assume que o programa é aprovado pelo verificador de tipos, e a análise toma proveito deste fato), o artigo mostra um exemplo simples de análise para determinação do fluxo de controle, primeiro usando um sistema que não se baseia em tipos (0-CFA), depois três técnicas baseadas em tipos. Neste exemplo as análises baseadas em tipos são divididas em sistemas de tipos e efeitos e tipos-como-discriminadores.&lt;br /&gt;&lt;br /&gt;A próxima seção discorre sobre as vantagens das análises baseadas em tipos, resumidas nos tópicos simplicidade, eficiência, corretude e competitividade (com outras formas de análise estática). Em seguida são dados exemplos de várias ferramentas e técnicas já desenvolvidas utilizando análise baseada em tipos, e uma breve seção sobre outros tipos de análises já experimentadas. Um comentário interessante é o que diz respeito às diferenças entre as ferramentas implementadas e as técnicas pesquisadas: a maioria das ferramentas usa a técnica tipos-como-discriminadores, que parece mais simples, enquanto a maior parte da pesquisa se concentra no uso de sistemas de tipos e efeitos. A sugestão é que mais sistemas práticos devem ser formalizados, e mais sistemas pesquisados devem ser implementados.&lt;br /&gt;&lt;br /&gt;Das aplicações apresentadas duas bem interessantes e que eu já estava de olho são gerenciamento de memória e detecção de condições de corrida em sistemas concorrentes. Por que não pensar em gerenciamento de recursos baseados em tipos ? Análise de efeitos colaterais me parece interessante também, principalmente para o projeto de linguagens de programação. Nesse sentido, é uma boa ver o artigo de Wadler, "&lt;a href="http://citeseer.ist.psu.edu/wadler98marriage.html"&gt;The Marriage of Effects and Monads&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Palsberg mantém um &lt;a href="http://www.cs.ucla.edu/%7Epalsberg/tba/"&gt;site sobre o assunto&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111980336286325755?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111980336286325755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111980336286325755&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111980336286325755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111980336286325755'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/06/type-based-analysis-and-applications.html' title='Type-Based Analysis and Applications'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111949225830129423</id><published>2005-06-22T19:00:00.000-07:00</published><updated>2005-06-22T19:04:18.306-07:00</updated><title type='text'>Gerenciamento de recursos em sistemas distribuídos</title><content type='html'>Preciso elaborar um projeto de pesquisa para dar entrada na PROPESQ que pode ser aproveitado como o projeto da minha dissertação, e aí eu já aproveito e apresento isso como planejamento na disciplina de metodologia.&lt;br /&gt;&lt;br /&gt;O ponto de partida é usar os estudos sobre gerência de memória e tentar generalizar para gerência de recursos em grids e clusters. Eu prefiro enfocar nos primeiros. O interessante é que tem muito espaço para explorar e tentar técnicas avançadas: tipos lineares, tipos dependentes, etc etc.&lt;br /&gt;&lt;br /&gt;Espero que saia um bom projeto daí.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111949225830129423?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111949225830129423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111949225830129423&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111949225830129423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111949225830129423'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/06/gerenciamento-de-recursos-em-sistemas.html' title='Gerenciamento de recursos em sistemas distribuídos'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111885783141667040</id><published>2005-06-15T10:27:00.000-07:00</published><updated>2005-06-15T10:54:54.670-07:00</updated><title type='text'>Comparação, round 2</title><content type='html'>Para tirar um pouco da poeira aqui, vão os números finais da comparação informal C versus &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Recaptulando: eu precisei alterar os algoritmos de gerenciamento de memória de um interpretador de uma linguagem funcional simples. A estrutura do programa é a seguinte:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;um &lt;span style="font-style: italic;"&gt;frontend&lt;/span&gt; traduz o programa fonte em uma estrutura de grafos; aqui estão o lexer e o parser;&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;essa estrutura é compilada para um grafo de combinadores básicos (SKI);&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;o grafo de combinadores é otimizado para usar os combinadores de Turner;&lt;/li&gt;   &lt;li&gt;o grafo é avaliado (reduzido), efetivamente executando o programa fonte;&lt;/li&gt;   &lt;li&gt;o runtime consiste de algumas funções pré-definidas e um coletor de lixo modular, que deve usar diferentes estratégias (mark-scan, coletor de cópia ou contagem de referências)&lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;&lt;br /&gt;O interpretador original tinha sido escrito em C. Não muito bem, diga-se de passagem. Quando eu tentei alterar o que eu queria, &lt;span style="font-style: italic;"&gt;core dumps&lt;/span&gt; e ponteiros nulos pularam de todos os recantos escuros para me atingir. Em pouco tempo descobri o modo atroz que o programa tratava os ponteiros, e decidi que demoraria muito consertar. O melhor seria fazer de novo. Então decidi fazer em &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt;, depois de ver que &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; não seria legal (vide posts anteriores).&lt;br /&gt;&lt;br /&gt;Há umas semanas isso ficou pronto. Funcionando melhor que a versão C, e feito em aproximadamente um mês de trabalho. Os resultados final da contagem de linhas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;C - 11486 linhas de código&lt;/li&gt;   &lt;li&gt;OCaml - 1964 linhas de código&lt;/li&gt; &lt;/ul&gt; Ou seja, o programa em C é uma ordem de magnitude maior. Bem, a comparação não é completamente justa por um motivo: o programa C inclui lexer e parser, enquanto que o similar OCaml trata diretamente com uma sintaxe abstrata; faltaria implementar um frontend que traduzisse da sintaxe concreta para a abstrata. Para deixar a história um pouco mais justa: a parte do frontend no programa em C usa umas 2 mil linhas; mesmo que fosse retirada, ainda seria uma economia de quase 5 vezes. Mas &lt;a href="http://realpar.blogspot.com/2005/02/compiladores.html"&gt;recentemente&lt;/a&gt; eu implementei um frontend simples em SML; acredito que para a linguagem em questão, e usando OCaml, não seria muito diferente: lexer + parser em 200 linhas de código, apenas.&lt;br /&gt;&lt;br /&gt;Características principais em OCaml que ajudaram a fazer tanta diferença: &lt;a href="http://en.wikipedia.org/wiki/Pattern_matching"&gt;pattern-matching em estruturas de dados&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Higher_order_functions"&gt;funções de ordem superior&lt;/a&gt; e tipos de dados algébricos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111885783141667040?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111885783141667040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111885783141667040&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111885783141667040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111885783141667040'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/06/comparao-round-2.html' title='Comparação, round 2'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111729794007253709</id><published>2005-05-28T09:25:00.000-07:00</published><updated>2005-05-28T09:32:20.080-07:00</updated><title type='text'>Análise baseada em tipos</title><content type='html'>Da idéia de fazer gerenciamento de memória e gerenciamento de recursos baseados em tipos, generalizando um pouco, aparece a idéia de análise de programas baseada em tipos. Resumindo, é analisar certas propriedades de programas através dos tipos de dados empregados, possivelmente em conjunto com análise de fluxo de controle e de fluxo de dados. O gerenciamento de memória baseado em regiões é um exemplo de análise baseada em tipos, onde o compilador procura identificar os objetos que têm tempo de vida limitado a algum escopo e os aloca em uma disciplina de pilha.&lt;br /&gt;&lt;br /&gt;Agora achei uma página bem interessante para pesquisar sobre o assunto: &lt;a href="http://www.cs.ucla.edu/%7Epalsberg/tba/"&gt;Type-Based Analysis and Applications&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Vamos ver o que vai sair.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111729794007253709?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111729794007253709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111729794007253709&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111729794007253709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111729794007253709'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/05/anlise-baseada-em-tipos.html' title='Análise baseada em tipos'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111716538140636524</id><published>2005-05-26T20:34:00.000-07:00</published><updated>2005-05-26T20:46:21.423-07:00</updated><title type='text'>Comparação</title><content type='html'>Há algum tempo terminei de reescrever o programa de teste dos algoritmos de contagem de referências (como mencionado em &lt;a href="http://realpar.blogspot.com/2005/04/reduo-de-grafos-de-combinadores-e.html"&gt;outro post&lt;/a&gt;); a versão anterior era escrita em C, a atual foi escrita em &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Claro que eu já vinha percebendo que a nova versão era mais compacta que a anterior, mas só para ter uma idéia eu comparei o número de linhas de código apenas na parte do interpretador (responsável por reduzir os grafos e obter os resultados dos programas). O Resultado:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Versão anterior (C): 1600 linhas de código&lt;/li&gt;   &lt;li&gt;Versão atual (OCaml): 200 linhas de código&lt;/li&gt; &lt;/ul&gt; E não é manipulação: essas 200 linhas de OCaml fazem exatamente o mesmo, nada menos, que as 1600 linhas de C. Além do poder de expressão da linguagem, a tarefa também é bem adequada à linguagem: a família ML se dá muito bem para a escrita de compiladores e interpretadores de linguagens de programação. E uma coisa que ajudou muito a reduzir o tamanho foi utilizar &lt;a href="http://en.wikipedia.org/wiki/Higher_order_functions"&gt;funções de ordem superior&lt;/a&gt;. &lt;span style="font-style: italic;"&gt;Functional programming rules&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Depois eu pretendo levantar o tamanho completo das duas versões e postarei aqui.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111716538140636524?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111716538140636524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111716538140636524&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111716538140636524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111716538140636524'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/05/comparao.html' title='Comparação'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111535186902591788</id><published>2005-05-05T18:36:00.000-07:00</published><updated>2005-05-05T22:08:15.460-07:00</updated><title type='text'>Gerando texto</title><content type='html'>Na última parte da disciplina de Métodos Matemáticos, estudamos processos aleatórios e técnicas relacionadas à teoria das probabilidades. As tarefas foram preparar seminários demonstrando aplicações dos tipos de processos aleatórios estudados.&lt;br /&gt;&lt;br /&gt;Para demonstrar cadeias de Markov, eu escolhi uma aplicação na geração de textos aleatórios. É algo que eu vi há algum tempo e achei interessante, mas não sabia como funcionava; quando estudei sobre o assunto juntei as idéias e pensei nisso: fazer um programa que gera textos, a partir de um outro texto que serve de base.&lt;br /&gt;&lt;br /&gt;É como aquela história, junte alguns macacos digitando aleatoriamente e, dado tempo suficiente, devem surgir até as obras completas de Shakespeare :) Aliás, os macacos fariam toda a &lt;a href="http://es.wikipedia.org/wiki/La_biblioteca_de_Babel"&gt;Biblioteca de Babel&lt;/a&gt;, mas isto é outra história.&lt;br /&gt;&lt;br /&gt;Enfim, para quem se interessar, aqui está a apresentação (&lt;a href="http://ktulu.freezope.org/files/markov.pdf"&gt;PDF&lt;/a&gt;, &lt;a href="http://ktulu.freezope.org/files/markov.ppt"&gt;PPT&lt;/a&gt;) e o &lt;a href="http://ktulu.freezope.org/files/markov.zip"&gt;programa&lt;/a&gt; utilizado.&lt;br /&gt;&lt;br /&gt;Um exemplo de texto gerado com base em Dom Casmurro, de Machado de Assis, está &lt;a href="http://andnowforsomething.blogspot.com/2005/05/machado-na-esquina-com-breton-e-tzara.html"&gt;neste post&lt;/a&gt; do outro blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111535186902591788?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111535186902591788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111535186902591788&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111535186902591788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111535186902591788'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/05/gerando-texto.html' title='Gerando texto'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111474044025429481</id><published>2005-04-28T19:03:00.000-07:00</published><updated>2005-04-28T19:07:20.256-07:00</updated><title type='text'>Sobre software</title><content type='html'>&lt;blockquote&gt;The problem is that software is different from other merchandise.       Computer programs are the most intricate, delicately balanced and finely       interwoven of all the products of human industry to date. They are machines       with far more moving parts than any engine: the parts don't wear out, but       they interact and rub up against one another in ways the programmers themselves       cannot predict. &lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.around.com/"&gt;James Gleick&lt;/a&gt;, &lt;a href="http://www.around.com/bugs.html"&gt;Chasing Bugs in the Electronic Village&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gleick é jornalista científico, autor do premiado livro &lt;a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=62693&amp;sid=141133122742657267101711&amp;amp;k5=1D26BCB0&amp;amp;uid="&gt;Caos - A Criação de uma Nova Ciência&lt;/a&gt;, entre outros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111474044025429481?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111474044025429481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111474044025429481&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111474044025429481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111474044025429481'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/04/sobre-software.html' title='Sobre software'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111413151165436433</id><published>2005-04-21T17:49:00.000-07:00</published><updated>2005-04-21T17:58:31.656-07:00</updated><title type='text'>O destino de Perl 6</title><content type='html'>Às vezes as coisas tomam um rumo engraçado: há séculos que a comunidade Perl promete a &lt;a href="http://dev.perl.org/perl6/"&gt;versão 6&lt;/a&gt; da linguagem, e que ela vai ser a melhor coisa desde pão fatiado. Enquanto isso, a maior parte do desenvolvimento se arrasta interminavelmente no trabalho com a &lt;a href="http://www.parrotcode.org/"&gt;VM Parrot&lt;/a&gt;, e nada de ter um compilador disponível para Perl 6. E isso porque a nova versão foi anunciada há uns 4 anos...&lt;br /&gt;&lt;br /&gt;Aí um cara teve a idéia de fazer um protótipo do interpretador. Escrevendo em &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;. Aí começaram a aparecer hackers tanto da comunidade Haskell quanto da comunidade Perl interessados em ajudar e, em menos de dois meses, existe um protótipo disponível. Ele se chama &lt;a href="http://www.pugscode.org/"&gt;Pugs&lt;/a&gt;. O progresso tem sido incrivelmente rápido, e pelo andar da carruagem eu não duvido nada que o Pugs, que começou como um projeto de uma pessoa só (Autrijus Tang) e totalmente sem o apoio da equipe Perl 6, seja promovido a oficial. Isso acontecendo seria uma ótima notícia para Haskell, que ganharia popularidade em uma comunidade mais mainstream. Mas eles provavelmente reescreveriam o interpretador em C, aos poucos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111413151165436433?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111413151165436433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111413151165436433&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111413151165436433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111413151165436433'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/04/o-destino-de-perl-6.html' title='O destino de Perl 6'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111332684227515819</id><published>2005-04-12T10:25:00.000-07:00</published><updated>2005-04-12T10:27:22.276-07:00</updated><title type='text'>Tipos e regiões</title><content type='html'>No embalo dos estudos sobre &lt;span style="font-style: italic;"&gt;garbage collection&lt;/span&gt;, estou estudando gerenciamento de memória baseado em regiões. E teoria dos tipos também. A idéia é tentar generalizar algumas técnicas relacionadas a regiões e pensar em gerenciamento de memória baseado em tipos (&lt;span style="font-style: italic;"&gt;type-directed memory management&lt;/span&gt;). Não sei se vai sair algo daí, talvez nada, talvez minha dissertação, mas é uma investigação. Veremos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111332684227515819?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111332684227515819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111332684227515819&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111332684227515819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111332684227515819'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/04/tipos-e-regies.html' title='Tipos e regiões'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111332670571048874</id><published>2005-04-12T10:16:00.000-07:00</published><updated>2005-04-12T10:25:05.713-07:00</updated><title type='text'>Redução de grafos de combinadores e outros efeitos colaterais</title><content type='html'>A atividade agora é implementar uma máquina de Turner de redução de grafos de combinadores para implementação de linguagens funcionais. O objetivo real não é implementar linguagens funcionais, até porque uma máquina de Turner pura é uma tećnica muito antiga, mas observar o comportamento de várias estratégias de &lt;span style="font-style: italic;"&gt;garbage collection&lt;/span&gt;. E nem é uma implementação nova, mas uma reimplementação, porque isso já existia mas numa versão completamente horrenda, em C. É a versão que veio direto do poço da menina de O Chamado, e eu estou tentando envia-la de volta ao limbo.&lt;br /&gt;&lt;br /&gt;A nova versão é em &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt;, claro. Pensei em fazer em &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; mas como uma parte do programa simula um heap imperativo, isso só me deixaria duas opções: fazer tudo de forma funcional, o que seria extremamente ineficiente; ou espalhar mônadas na maior parte do programa, o que não agrada muito meu senso estético. Nesse caso, as características interativas em OCaml resolvem tudo de forma simples e elegante, logo é a ferramenta mais adequada para a situação.&lt;br /&gt;&lt;br /&gt;Ah, e o coletor de lixo usa contagem de referências. Por incrível que pareça. Mas as técnicas utilizadas permitem coleta de ciclos e tudo, embora eu ainda não veja muitas vantagens com relação a utilizar um coletor de cópia generacional, ou as abordagens híbridas comuns atualmente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111332670571048874?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111332670571048874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111332670571048874&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111332670571048874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111332670571048874'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/04/reduo-de-grafos-de-combinadores-e.html' title='Redução de grafos de combinadores e outros efeitos colaterais'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111159663390479346</id><published>2005-03-23T08:44:00.000-08:00</published><updated>2005-03-23T08:50:33.906-08:00</updated><title type='text'>Há quase 30 anos...</title><content type='html'>Dijkstra advertia, no seu livro &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/013215871X/qid=1111596313/sr=1-1/ref=sr_1_1/104-1988057-3389557?v=glance&amp;amp;s=books"&gt;A Discipline of Programming&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Historically speaking, this last aspect, viz. the fact that programming languages could be used as a vehicle for instructing existing automatic computers, has for a long time been regarded as their most important property. The efficiency with which existing automatic computers could execute programs written in a certain language became the major quality criterion for that language ! As a regrettable result, it is not unusual to find anomalies in existing machines truthfully reflected in programming languages, this at the expense of the intellectual manageability of the programs expressed in such a language (as if programming without such anomalies was not already difficult enough!).&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111159663390479346?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111159663390479346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111159663390479346&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111159663390479346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111159663390479346'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/03/h-quase-30-anos.html' title='Há quase 30 anos...'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111130014150743187</id><published>2005-03-19T22:27:00.000-08:00</published><updated>2005-03-19T22:29:01.506-08:00</updated><title type='text'>CiteULike</title><content type='html'>Sitezinho útil esse &lt;a href="http://www.citeulike.org/"&gt;CiteULike&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por falar no assunto, aqui vai a &lt;a href="http://www.citeulike.org/user/tautologico"&gt;minha página lá&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111130014150743187?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111130014150743187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111130014150743187&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111130014150743187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111130014150743187'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/03/citeulike.html' title='CiteULike'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111098695362768149</id><published>2005-03-16T07:25:00.000-08:00</published><updated>2005-03-16T07:29:13.626-08:00</updated><title type='text'>Wadler</title><content type='html'>Nao "Linkei" para o blog de &lt;a href="http://wadler.blogspot.com/"&gt;Philip Wadler&lt;/a&gt; antes. O blog é principalmente sobre Links...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111098695362768149?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111098695362768149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111098695362768149&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111098695362768149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111098695362768149'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/03/wadler.html' title='Wadler'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-111005906073620024</id><published>2005-03-05T13:32:00.000-08:00</published><updated>2005-03-06T07:40:43.866-08:00</updated><title type='text'>Concorrência, round 1</title><content type='html'>Lendo os capítulos do &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0521594146/qid=1110058409/sr=2-1/104-1988057-3389557?v=glance&amp;s=books"&gt;Theories of Programming Languages&lt;/a&gt; de &lt;a href="http://www-2.cs.cmu.edu/%7Ejcr/index.html"&gt;John Reynolds&lt;/a&gt; que tratam de concorrência, é interessante ver como a característica imperativa complica ainda mais as coisas que já são complicadas nessa área. No caso, a concorrência por variáveis compartilhadas, que é o paradigma mais utilizado hoje em dia, graças às &lt;span style="font-style: italic;"&gt;threads&lt;/span&gt; popularizadas pela linguagem Java. Supostamente mais eficientes, mas são uma grande bagunça para trabalhar.&lt;br /&gt;&lt;br /&gt;Uma coisa que me ocorreu: quando os modelos formais para uma linguagem ou técnica se complicam, é um sinal que é difícil raciocinar direito sobre ela. Dijkstra basicamente resolveu isso de uma vez por todas no caso do &lt;span style="font-weight: bold;"&gt;goto&lt;/span&gt; e da programação estruturada; ocorre uma simplificação no modelo conceitual que ajuda a concepção de sistemas formais, mas isso também se reflete em um modelo mental mais simples para os programadores.&lt;br /&gt;&lt;br /&gt;Com o estado explícito acontece a mesma coisa. As técnicas de programação modular e orientação a objetos não são formas de limitar o escopo das alterações de estado ? Dessa forma, o estado explícito fica um pouco mais contido, mais sob controle, mas ainda não totalmente. Uma linguagem funcional tem uma semântica formal muito mais simples que uma linguagem imperativa equivalente; isso se reflete na forma de pensar, e também nas ferramentas que manipulam código, incluindo aí compiladores.&lt;br /&gt;&lt;br /&gt;Ah, e um dos engenheiros importantes da Adobe reconhece que &lt;a href="http://opensource.adobe.com/asl_foreword.html"&gt;70% do código de interface usado hoje em dia (na Adobe) poderia ser declarativo&lt;/a&gt;.  E ele postula que a porcentagem seria aproximadamente a mesma no resto da indústria.&lt;br /&gt;&lt;br /&gt;Com isso e projetos como &lt;a href="http://realpar.blogspot.com/2005/02/links-e-volta-dos-que-no-foram.html"&gt;Links&lt;/a&gt;, e como aparentemente a indústria está acordando do mito da orientação a objetos como panacéia, será que a programação funcional vai &lt;span style="font-style: italic;"&gt;pegar&lt;/span&gt; ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-111005906073620024?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/111005906073620024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=111005906073620024&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111005906073620024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/111005906073620024'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/03/concorrncia-round-1.html' title='Concorrência, round 1'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110964001718659877</id><published>2005-02-28T17:15:00.000-08:00</published><updated>2005-02-28T17:20:17.186-08:00</updated><title type='text'>Olhando por aí...</title><content type='html'>O &lt;a href="http://www.google.com/googleblog/"&gt;blog do Google&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://pinker.wjh.harvard.edu/"&gt;página de Steven Pinker&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Uma &lt;a href="http://mathworld.wolfram.com/"&gt;matéria&lt;/a&gt; no MathWorld sobre os testes de aptidão para candidatos a um emprego no Google.&lt;br /&gt;&lt;br /&gt;Um &lt;a href="http://www.wired.com/wired/archive/8.04/joy.html"&gt;artigo antigo&lt;/a&gt; de Bill Joy na &lt;a href="http://www.wired.com/"&gt;Wired&lt;/a&gt; sobre o avanço da tecnologia e uma possível extinção da raça humana.&lt;br /&gt;&lt;br /&gt;Um &lt;a href="http://www.themodernword.com/pynchon/pynchon_essays_luddite.html"&gt;ensaio&lt;/a&gt; de Thomas Pynchon sobre os "&lt;span style="font-style: italic;"&gt;Luddites&lt;/span&gt;" (existe tradução para o termo?).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110964001718659877?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110964001718659877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110964001718659877&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110964001718659877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110964001718659877'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/02/olhando-por.html' title='Olhando por aí...'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110947468019021870</id><published>2005-02-26T19:04:00.000-08:00</published><updated>2005-02-26T19:24:40.193-08:00</updated><title type='text'>Connection Machine</title><content type='html'>Tentando reduzir a pilha de leitura, terminei hoje o &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0262580977/qid=1109473687/sr=1-1/ref=sr_1_1/104-1988057-3389557?v=glance&amp;s=books"&gt;The Connection Machine&lt;/a&gt; de &lt;a href="http://en.wikipedia.org/wiki/Danny_Hillis"&gt;Daniel Hillis&lt;/a&gt;. A connection machine é um misto de computador maciçamente paralelo e "memória ativa", no sentido que apesar da máquina ter poder de processamento, ela não é um sistema computacional completo; é preciso um computador &lt;span style="font-style: italic;"&gt;host&lt;/span&gt; para comandar a máquina, que fica funcionando praticamente como uma memória. De qualquer forma, é uma arquitetura completamente diferente das máquinas de von Neumann que usamos até hoje.&lt;br /&gt;&lt;br /&gt;O livro é baseado na tese de doutorado de Hillis no MIT; não sei o quanto mudou da tese para o livro, porque o texto em geral entra em poucos detalhes para uma tese (na minha opinião). O mais interessante é o primeiro capítulo, onde ele explica as motivações para fazer uma máquina dessa forma, a idéia principal sendo replicar o modelo de processamento do cérebro humano: ao invés de ter um grande processador central, ter milhares, ou talvez milhões, de pequenos processadores simples. Além disso, se aproveitar do fato de que processadores e memória hoje em dia são feitos do mesmo material para "esquecer" a barreira que os separa na arquitetura tradicional de von Neumann. Assim, o componente principal da máquina é uma célula processador/memória, que é agrupada pelo programador em "estruturas de dados ativos", ou seja, estruturas que possuem o próprio poder de processamento. O processamento não está apenas nas células em si, mas também na comunicação (ou conexão) entre elas; daí o nome "máquina de conexões".&lt;br /&gt;&lt;br /&gt;Os capítulos seguintes tratam de como programar a máquina (usando um dialeto Lisp), considerações sobre o projeto de uma máquina real seguindo esses princípios arquitetonicos, alocação de memória e uma visão geral sobre o protótipo da máquina que estava sendo construída na época. Acho que faltaram mais detalhes nesses capítulos, exceto o sobre programação. O último capítulo é um sermão confuso sobre como as ciências da computação deveriam se parecer mais com a física; não entendi muito bem onde o autor queria chegar, mas não concordo com a maioria do que entendi. Esse capítulo provavelmente foi resultado da influência de &lt;a href="http://en.wikipedia.org/wiki/Richard_Feynman"&gt;Richard Feynman&lt;/a&gt; sobre o pessoal da &lt;a href="http://en.wikipedia.org/wiki/Thinking_Machines"&gt;Thinking Machines&lt;/a&gt; (a empresa criada por Hillis para construir e vender a Connection Machine).&lt;br /&gt;&lt;br /&gt;Enfim, o mercado dos supercomputadores afundou, a Thinking Machines foi pro saco, e a Connection Machine não existe mais. Fico pensando se essa arquitetura era realmente vantajosa em relação ao que ainda usamos hoje em dia; se sim, porque ninguém mais tentou algo do tipo. Parece que vivemos condenados à arquitetura de von Neumann, criada quando os computadores eram feitos com válvulas e memórias de núcleos magnéticos. Uma arquitetura que, por sinal, favorece as linguagens imperativas... as pessoas acham que a computação, como um campo do conhecimento humano, avança muito rápido; eu já acho, às vezes, que ela avança devagar demais.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110947468019021870?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110947468019021870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110947468019021870&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110947468019021870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110947468019021870'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/02/connection-machine.html' title='Connection Machine'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110818818143036543</id><published>2005-02-11T21:54:00.000-08:00</published><updated>2005-02-11T22:03:01.433-08:00</updated><title type='text'>Aliás...</title><content type='html'>Qualquer pessoa aprende em poucos minutos o que é um isomorfismo. O nome parece feio mas a idéia é simples, basta explicar de uma forma adequada ao contexto. Pouca gente vai absorver uma definição formal: "dado um morfismo &lt;span style="font-weight: bold;"&gt;f&lt;/span&gt; de &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt; para &lt;span style="font-weight: bold;"&gt;B&lt;/span&gt;, diz-se que &lt;span style="font-weight: bold;"&gt;f&lt;/span&gt; é um isomorfismo se existe um morfismo &lt;span style="font-weight: bold;"&gt;g&lt;/span&gt; de &lt;span style="font-weight: bold;"&gt;B&lt;/span&gt; para &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt; tal que &lt;span style="font-weight: bold;"&gt;g o f = I(A)&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;f o g = I(B)&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;A notação matemática, assim como o jargão especializado e convenções de qualquer área, é ao mesmo tempo uma poderosa ferramenta de comunicação e uma ótima forma de esconder das pessoas "de fora" o significado do discurso.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110818818143036543?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110818818143036543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110818818143036543&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110818818143036543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110818818143036543'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/02/alis.html' title='Aliás...'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110818676776037115</id><published>2005-02-11T21:24:00.000-08:00</published><updated>2005-02-11T21:39:27.763-08:00</updated><title type='text'>O que é "natural" ?</title><content type='html'>Estou lendo o &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0521478170/qid=1108185913/sr=2-1/ref=pd_ka_b_2_1/104-1988057-3389557"&gt;"Conceptual Mathematics: A First Introduction to Categories"&lt;/a&gt; de Lawvere e Schanuel; postarei uma resenha depois, mas em suma o livro tem a intenção de ensinar teoria das categorias para qualquer pessoa que tenha tido uma exposição mínima às idéias da teoria dos conjuntos e funções, incluindo aí gente do ensino médio. É uma exposição totalmente voltada para as categorias, desde o começo, com muitos exemplos ilustrativos que ajudam muito na formação de uma intuição sobre o assunto. Na minha opinião muitas idéias do livro poderiam ser aproveitadas para reformulações futuras dos cursos de matemática no ensino básico, mas aí é história para outro dia.&lt;br /&gt;&lt;br /&gt;O que eu achei interessante é que na discussão sobre isomorfismos os autores mencionam os conceitos primitivos de contagem (coisa que eu já considerei muito, principalmente quando estudava sobre Cantor, diagonalização e álgebra transfinita), e chamam a atenção para algo que eu não tinha pensado: &lt;span style="font-weight: bold;"&gt;isomorfismo&lt;/span&gt; é o conceito primitivo, &lt;span style="font-weight: bold;"&gt;número&lt;/span&gt; é o conceito abstrato derivado dele. O engraçado é que se você chegar para alguma pessoa na rua falando sobre isomorfismo, é capaz dela sair correndo com medo, ou ficar olhando pra você estranho, pensando se foi um xingamento. Mas número todo mundo conhece, todo mundo sabe.&lt;br /&gt;&lt;br /&gt;Pra quê eu comentei isso tudo mesmo ? Ah, sim, para falar sobre linguagens de programação. De vez em quando aparece alguém que fala que "&lt;span style="font-style: italic;"&gt;o estilo interativo é mais natural para as pessoas&lt;/span&gt;", afirmação puramente baseada nos seus próprios pré-conceitos: claro, para qualquer programador que tenha sido educado em um paradigma imperativo, linguagens imperativas parecem mais naturais. Não necessariamente que seja mais natural do que uma linguagem funcional para alguém que nunca aprendeu nada sobre programação. O exemplo mostra que algumas idéias que parecem mais 'complicadas' ou 'abstratas' são, na verdade, mais fundamentais, por sua própria generalidade.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110818676776037115?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110818676776037115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110818676776037115&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110818676776037115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110818676776037115'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/02/o-que-natural.html' title='O que é &quot;natural&quot; ?'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110737397649675100</id><published>2005-02-02T11:44:00.000-08:00</published><updated>2005-02-02T11:52:56.496-08:00</updated><title type='text'>Links e a volta dos que não foram</title><content type='html'>O projeto &lt;a href="http://homepages.inf.ed.ac.uk/wadler/papers/links/"&gt;Links&lt;/a&gt; pretende criar uma nova linguagem funcional, voltada para aplicações Web. À frente estão Philip Wadler e outros nomes importantes (Xavier Leroy, Benjamin Pierce, Simon P-J).&lt;br /&gt;&lt;br /&gt;Wadler explica melhor do que eu. Vejam a &lt;a href="http://homepages.inf.ed.ac.uk/wadler/papers/links/links.pdf"&gt;introdução&lt;/a&gt; e os &lt;a href="http://homepages.inf.ed.ac.uk/wadler/papers/links/lablunch.pdf"&gt;slides&lt;/a&gt;, ou antes, veja a &lt;a href="http://groups-beta.google.com/group/comp.lang.functional/msg/4716d8724bb17ca2"&gt;mensagem introdutória&lt;/a&gt; no newsgroup comp.lang.functional.&lt;br /&gt;&lt;br /&gt;Mas a idéia de ter uma linguagem puramente funcional largamente usada é muito interessante, e pode ajudar a mudar algumas coisas nessa indústria. Sem falar que o projeto promete trazer inovações interessantes, numa linguagem que deve misturar aspectos de ML e Haskell. Mais ou menos como seria minha linguagem dos sonhos atualmente.&lt;br /&gt;&lt;br /&gt;(Ah, e o artigo que ele cita sobre efeitos e mônadas é o primeiro &lt;a href="http://homepages.inf.ed.ac.uk/wadler/topics/monads.html"&gt;nesta página&lt;/a&gt;)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110737397649675100?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110737397649675100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110737397649675100&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110737397649675100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110737397649675100'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/02/links-e-volta-dos-que-no-foram.html' title='Links e a volta dos que não foram'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110727056096698907</id><published>2005-02-01T06:53:00.000-08:00</published><updated>2005-02-01T07:09:20.966-08:00</updated><title type='text'>Compiladores</title><content type='html'>Primeiro estava olhando a documentação do projeto &lt;a href="http://gcc.gnu.org/projects/tree-ssa/"&gt;Tree SSA&lt;/a&gt; do GCC, que consiste na geração de código na forma &lt;span style="font-style: italic;"&gt;Static Single Assignment&lt;/span&gt; para o suporte a passes de otimização. O interessante é que a árvore SSA é processada sem efeitos colaterais; ou seja, é uma parte funcional do compilador GCC que está entrando em operação agora nas versões a partir da 3.4. Parece que o &lt;span style="font-style: italic;"&gt;mainstream &lt;/span&gt;está aprendendo algo com a comunidade funcional.&lt;br /&gt;&lt;br /&gt;E por falar em &lt;a href="http://gcc.gnu.org/"&gt;GCC&lt;/a&gt;, descobri que eles estão com um &lt;a href="http://gcc.gnu.org/wiki/"&gt;Wiki&lt;/a&gt;, incluindo informações sobre a estrutura do compilador e outras informações interessantes.&lt;br /&gt;&lt;br /&gt;E sim, ainda estou com meu projeto de compilador. Terminei o parser, tarefa mais agradável do que eu esperava, já que o MLYacc é menos "imperativo" que o ML-Lex; agora estou fazendo parte da análise semântica, mais especificamente a verificação de tipos. Nada difícil, nem inferência de tipos tem, mas é meio trabalhoso. A análise semântica trabalha em cima da árvore sintática gerada pelo parser, e aí é só fazer um punhado de funções recursivas e tá tudo resolvido.  Quando isso estiver terminado, vai ser a vez da geração de código intermediário. Daí pra frente, não sei se vou ter paciência para fazer geração de código nativo não; há muito o que fazer e o tempo é curto.&lt;br /&gt;&lt;br /&gt;Em breve: semântica e formalismos para concorrência.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110727056096698907?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110727056096698907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110727056096698907&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110727056096698907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110727056096698907'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/02/compiladores.html' title='Compiladores'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110670088833315789</id><published>2005-01-25T16:46:00.000-08:00</published><updated>2005-01-25T16:54:48.333-08:00</updated><title type='text'>Novas arquiteturas</title><content type='html'>Eu comecei lendo &lt;a href="http://lambda-the-ultimate.org/node/view/78"&gt;comentários no LtU&lt;/a&gt; sobre a nova "arquitetura celular" que o trio Toshiba/IBM/Sony está desenvolvendo para uso no Playstation 3. Daí segui para a &lt;a href="http://www.blachford.info/computer/Cells/Cell0.html"&gt;análise&lt;/a&gt; desta proposta (mas lendo as &lt;a href="http://arstechnica.com/news.ars/post/20050124-4551.html"&gt;observações&lt;/a&gt; no ars technica). Então surgiu um link para um &lt;a href="http://arstechnica.com/cpu/2q00/x86future/isa-future-1.html"&gt;artigo&lt;/a&gt; sobre o conceito da ISA (Instruction Set Architecture) e suas tendências atuais.&lt;br /&gt;&lt;br /&gt;Tudo muito interessante; e juntando com o advento dos processadores de múltiplos núcleos (&lt;span style="font-style: italic;"&gt;multicore&lt;/span&gt;), há muito o que se pensar sobre as arquiteturas do futuro, e como isso deverá afetar o lado do software.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110670088833315789?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110670088833315789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110670088833315789&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110670088833315789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110670088833315789'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/01/novas-arquiteturas.html' title='Novas arquiteturas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110530115640752882</id><published>2005-01-09T11:55:00.000-08:00</published><updated>2005-01-09T12:05:56.406-08:00</updated><title type='text'>Sofrendo com o ML-Lex</title><content type='html'>Ok, como eu disse, estou brincando um pouco com compiladores; fazendo um compilador para uma linguagem pequena com sintaxe parecida com ML em duas versões: uma imperativa e a outra funcional. O compilador está sendo escrito em SML, um tipo de tarefa bastante adequado para a linguagem.&lt;br /&gt;&lt;br /&gt;O problema começa nas ferramentas do &lt;span style="font-style: italic;"&gt;front-end&lt;/span&gt;: o gerador de analisadores léxicos ML-Lex e o gerador de analisadores sintáticos MLYacc. O que atrapalha é que eles seguem muito de perto as ferramentas tradicionais &lt;span style="font-weight: bold;"&gt;lex&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;yacc&lt;/span&gt; do Unix, que foram feitas em C para gerar código C. Com isso, é impossível fugir de um estilo muito imperativo na criação dos analisadores. A &lt;a href="http://tlang.blogspot.com/2005/01/objective-caml-3.html"&gt;situação não parece ser muito melhor em OCaml&lt;/a&gt;, o que é uma pena, já que compiladores e outros processadores de linguagens ficam condenados a esse estilo imperativo nessas linguagens que, a princípio, promovem um estilo de programação mais funcional. Um projeto interessante, mas para o qual eu não tenho tempo, seria pesquisar maneiras de fazer geradores de analisadores de maneira mais funcional, sem perdas significativas de eficiência. Uma idéia possível é usar &lt;span style="font-style: italic;"&gt;monadic parser combinators&lt;/span&gt; ao estilo do &lt;a href="http://www.cs.uu.nl/%7Edaan/parsec.html"&gt;parsec&lt;/a&gt; (feito em Haskell). Apesar das linguagens ML não suportarem mônadas nativamente, é possível criar construções baseadas em mônadas do mesmo jeito; talvez a falta de suporte sintático deixe uma ferramenta dessas bem menos prática de usar do que no caso do Haskell, mas só investigando.&lt;br /&gt;&lt;br /&gt;Enfim, o &lt;span style="font-style: italic;"&gt;lexer&lt;/span&gt; está pronto, incluindo seqüências de escape em strings, comentários aninhados e outros detalhes que dão um pouco mais de trabalho. Agora, de volta ao trabalho no &lt;span style="font-style: italic;"&gt;parser&lt;/span&gt;...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110530115640752882?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110530115640752882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110530115640752882&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110530115640752882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110530115640752882'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/01/sofrendo-com-o-ml-lex.html' title='Sofrendo com o ML-Lex'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110477340256553748</id><published>2005-01-03T09:24:00.000-08:00</published><updated>2005-01-03T09:45:40.396-08:00</updated><title type='text'>Férias e tal</title><content type='html'>Tirei uma semana de férias completas, passadas numa &lt;a href="http://www.pipaonline.com.br/"&gt;praia paradisíaca&lt;/a&gt; daqui do nordeste.&lt;br /&gt;&lt;br /&gt;Mas antes eu estudei um pouco de teoria das categorias, e agora estou de volta à carga. O interesse no momento é estudar formalismos para modelar concorrência. Encontrei a &lt;a href="http://www.wisdom.weizmann.ac.il/%7Edharel/dynamic_logic.html"&gt;lógica dinâmica&lt;/a&gt; de &lt;a href="http://www.wisdom.weizmann.ac.il/%7Edharel/"&gt;David Harel&lt;/a&gt;, pena que eu não tenha como comprar o livro; mas a tese de doutorado dele (na &lt;a href="http://www.wisdom.weizmann.ac.il/%7Edharel/1stdynamic_logic.html"&gt;versão editada pela Springer&lt;/a&gt;) está disponível na biblioteca da UPFE. Tem lógica linear também, outro assunto com pouquíssimos livros disponíveis. Teoria de jogos está no bolo; alguns formalismos usando jogos e categorias existem por aí.&lt;br /&gt;&lt;br /&gt;Enquanto isso, meus dedos coçam por um pouco de ação prática. Escrevendo código, quero dizer. Acho que vou mexer um pouco com compiladores.&lt;br /&gt;&lt;br /&gt;E assim caminha a minha busca... In the land of Mordor where Shadows Lie.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110477340256553748?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110477340256553748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110477340256553748&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110477340256553748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110477340256553748'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2005/01/frias-e-tal.html' title='Férias e tal'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110286918530820371</id><published>2004-12-12T08:29:00.000-08:00</published><updated>2004-12-12T08:33:05.306-08:00</updated><title type='text'>Mais um desejo aos ventos</title><content type='html'>Eu realmente queria que existisse uma tecnologia barata de impressão com qualidade razoável. São tantos artigos, manuais, documentação, livros e etc... Tem hora que dá vontade de imprimir e ir estudar na biblioteca, longe do monitor. Mas se for fazer isso sempre, eu gasto minha bolsa inteira com tinta e papel.&lt;br /&gt;&lt;br /&gt;E aí, Papai Noel, desenrola uma impressora boa e com baixissimo custo de impressão ?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110286918530820371?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110286918530820371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110286918530820371&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110286918530820371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110286918530820371'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/12/mais-um-desejo-aos-ventos.html' title='Mais um desejo aos ventos'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110253531416650105</id><published>2004-12-08T11:46:00.000-08:00</published><updated>2004-12-08T11:48:34.166-08:00</updated><title type='text'>Grupóides, Monóides, Herculóides</title><content type='html'>Resenha do livro &lt;a href="http://www.sagra-luzzatto.com.br/buscadescritiva.asp?varbusca=8524106913"&gt;Matemática Discreta para Computação e Informática&lt;/a&gt;, de Paulo Blauth Menezes.&lt;br /&gt;&lt;br /&gt;Eu costumo reclamar por aí que livro técnico brasileiro é uma desgraça. Os livros ruins quase sempre têm sido maioria, embora a situação tenha melhorado um pouco nos últimos tempos. Que fique claro que eu estou falando de livros de autores brasileiros, e não necessariamente traduções de livros técnicos importados (embora algumas traduções sejam deploráveis também). E a culpa não é tanto dos autores; pelo que eu sei, as editoras impõem prazos curtíssimos. Enquanto nos livros de fora é normal você ler que o autor passou anos preparando um livro didático, aqui na Terra Brasilis o tempo médio é por volta de 6 meses. Isso é mais sentido nos livros das ciências básicas, que requerem um cuidado de elaboração que normalmente não cabe em 6 meses. Ainda por cima, muitos livros são porcamente tipografados e mal escritos.&lt;br /&gt;&lt;br /&gt;Uma vantagem dos livros do Paulo Blauth Menezes é que são bem escritos. Mesmo assim, fica a sensação que o livro é pouco mais que notas de aula. Os assuntos são tratados corretamente, mas de forma muito superficial. Além disso, existe uma quantidade enorme de assuntos para um livro deste tamanho; existe até uma introdução à teoria das categorias que serve de muito pouco. Os exercícios são interessantes, mas pouco desafiantes, na maioria. Os exemplos de aplicações também são muito simples, embora nesse caso exista uma justificativa, já que é comum que estudantes de ciência da computação façam uma matéria de matemática discreta logo no primeiro semestre.&lt;br /&gt;&lt;br /&gt;Para mim foi proveitoso ler sobre reticulados, e ver como alguns conceitos da matemática como relações e homomorfismo são vistos pelo ponto de vista da computação. Por exemplo, funções parciais dificilmente são tratadas em livros de matemática, mas são muito importantes na computação.&lt;br /&gt;&lt;br /&gt;Enfim, o material é bom, mas o livro poderia se aprofundar mais, talvez reduzindo o escopo dos assuntos cobertos ou dividindo em dois volumes. A tipografia do livro também poderia ser bem melhor, principalmente em relação à notação matemática. Seria interessante ver outra edição, de preferência com alguns desses problemas resolvidos.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110253531416650105?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110253531416650105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110253531416650105&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110253531416650105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110253531416650105'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/12/grupides-monides-herculides.html' title='Grupóides, Monóides, Herculóides'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110196172719980582</id><published>2004-12-01T20:23:00.000-08:00</published><updated>2004-12-01T20:28:47.200-08:00</updated><title type='text'>Salada</title><content type='html'>Ok, agora eu estou estudando zilhões de coisas e tentando construir algumas idéias. Na verdade, eu tive idéias, alguns palpites, e estou correndo atrás da teoria para ver o que é viável, onde eu posso desenvolver alguma coisa.&lt;br /&gt;&lt;br /&gt;Decidi estudar mesmo teoria dos jogos, lógica da computabilidade e computação interativa. Mas é bom estudar lógica linear também, que é um formalismo alternativo para mais ou menos o tipo de coisa. Estou até lendo sobre a Web Semântica, porque acho que algumas coisas nela podem ser relevantes, mesmo que eu não vá trabalhar diretamente com RDF ou OWL ou o que seja.&lt;br /&gt;&lt;br /&gt;Sistemas reativos também, reflexão, mutação, avaliação em múltiplos estágios (programação generativa, meta-programação, MOPs), avaliação parcial, transformações... a lista não tem fim. Mas estou em estágio de exploração mesmo, e espero que dessa bagunça surja alguma idéia interessante para desenvolver. Espero mesmo...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110196172719980582?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110196172719980582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110196172719980582&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110196172719980582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110196172719980582'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/12/salada.html' title='Salada'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110126583304167527</id><published>2004-11-23T18:56:00.000-08:00</published><updated>2004-11-23T19:10:33.040-08:00</updated><title type='text'>How to Solve Mathematical Problems</title><content type='html'>&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0486284336/qid=1101264939/sr=1-1/ref=sr_1_1/103-1684395-8951006?v=glance&amp;s=books"&gt;Livro&lt;/a&gt; de Wayne A. Wickelgren.&lt;br /&gt;&lt;br /&gt;Seguindo os passos de Polya com seu aclamado clássico "A Arte de Resolver Problemas" (How to Solve It), Wickelgren estuda os métodos utilizados para resolver problemas de raciocínio, incluindo &lt;span style="font-style: italic;"&gt;puzzles&lt;/span&gt; recreativos e problemas lógico-matemáticos. Enquanto o livro de Polya é bastante conciso nos princípios, sendo principalmente formado por exemplos de problemas a resolver e as soluções dos problemas, o livro de Wickelgren detalha várias técnicas sistemáticas para encontrar as soluções:  representar as informações, fazer inferências, definir funções de avaliação de estados, &lt;span style="font-style: italic;"&gt;hill climbing&lt;/span&gt;, trabalhar de trás para frente, etc. Muitas técnicas seguem idéias consagradas na área de Inteligência Artificial para resolução automatizada de problemas, principalmente as que usam uma função de avaliação de estados para navegar por um espaço de estados. Ao longo do texto vários problemas são colocados como exemplos das técnicas expostas; vale a pena parar e ao menos tentar resolver os problemas, e o livro vai dando dicas para quem não consegue de cara. Os problemas em geral são do tipo &lt;span style="font-style: italic;"&gt;puzzle&lt;/span&gt; e não requerem conhecimento matemático especializado.&lt;br /&gt;&lt;br /&gt;Assim como Polya, Wickelgren afirma que as mesmas técnicas são úteis para escrever demonstrações, embora praticamente nenhum exemplo seja dado. Existem &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0521446635/qid=1101265455/sr=1-1/ref=sr_1_1/103-1684395-8951006?v=glance&amp;s=books"&gt;outros&lt;/a&gt; &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0471406473/ref=pd_sim_b_1/103-1684395-8951006?%5Fencoding=UTF8&amp;amp;v=glance"&gt;livros&lt;/a&gt; com enfoque em técnicas para demonstrações.&lt;br /&gt;&lt;br /&gt;É interessante ficar consciente de várias técnicas usadas na solução de problemas, mas alguns métodos apresentados no livro são bem trabalhosos; seguir um procedimento metódico em cada problema pode ser mais lento do que simplesmente &lt;span style="font-style: italic;"&gt;intuir&lt;/span&gt; a solução. Os métodos ajudam naqueles casos em que não se consegue achar facilmente uma saída. Mas na minha experiência os métodos mais úteis são os mais diretos: representar as informações disponíveis e realizar inferências. Isso já encaminha a solução da maioria dos problemas. Somado a isso, o texto é muito longo; dá para resumir as idéias e técnicas em umas duas ou três páginas.&lt;br /&gt;&lt;br /&gt;E é o que eu tenho pensado em fazer, após ter terminado: fazer um resumo para consulta fácil, juntando idéias deste livro e do Polya. Mais um, entre inúmeros projetos...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110126583304167527?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110126583304167527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110126583304167527&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110126583304167527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110126583304167527'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/11/how-to-solve-mathematical-problems.html' title='How to Solve Mathematical Problems'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110101849648671517</id><published>2004-11-20T22:18:00.000-08:00</published><updated>2004-11-20T22:42:57.673-08:00</updated><title type='text'>Google Scholar</title><content type='html'>Mais um produto das organizações Google.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://scholar.google.com/"&gt;Google Scholar&lt;/a&gt; é um serviço de busca voltado especificamente para artigos científicos. Também retorna resultados de citações em livros, e indica um índice de citações para cada artigo.&lt;br /&gt;&lt;br /&gt;Testei hoje, e é bem interessante. Mas ainda não é melhor que o &lt;a href="http://citeseer.ist.psu.edu/"&gt;CiteSeer&lt;/a&gt; porque&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;Não apresenta o artigo em uma página com informações contextuais: abstract, links para artigos citados, links para citações; e&lt;/li&gt;   &lt;li&gt;não mostra links para artigos similares, uma coisa que já me ajudou muito a descobrir artigos relacionados.&lt;/li&gt; &lt;/ol&gt;&lt;br /&gt;A vantagem do Google Scholar é que ele não é limitado à literatura das ciências da computação, ao contrário do CiteSeer. Mas talvez eles ainda melhorem a apresentação dos resultados, vamos ver.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110101849648671517?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110101849648671517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110101849648671517&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110101849648671517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110101849648671517'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/11/google-scholar.html' title='Google Scholar'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-110028446465394967</id><published>2004-11-12T10:29:00.000-08:00</published><updated>2004-11-12T10:34:24.653-08:00</updated><title type='text'>De volta à ativa: sai Debian, entra Mandrake</title><content type='html'>Finalmente com Internet no novo apartamento, fica mais fácil voltar a postar. E, por enquanto, a única coisa digna de nota é que eu desisti do Debian: a &lt;span style="font-style: italic;"&gt;stable&lt;/span&gt; é muito desatualizada, e a &lt;span style="font-style: italic;"&gt;unstable&lt;/span&gt; é, bem, instável. Por consenso com a outra alma que vai trabalhar no cluster, decidimos tentar o Mandrake. Eu usei até o Mandrake 9, mas desisti por ser instável demais, muitos bugs; mas o comentário geral é que a versão 10 estava bem melhor. Peguei a 10.1, instalei e não me arrependi: o bicho tá redondo. E olhe que eu estou usando a Community Edition que, para todos os propósitos, é uma beta. A Official Edition sai em uma ou duas semanas, mas para isso serve o urpmi; por falar nisso, ele é bem melhor que o yum, que eu estava usando no Fedora.&lt;br /&gt;&lt;br /&gt;Agora, com o cluster reestabelecido, vamos começar a rodar as aplicações e testes.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-110028446465394967?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/110028446465394967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=110028446465394967&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110028446465394967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/110028446465394967'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/11/de-volta-ativa-sai-debian-entra.html' title='De volta à ativa: sai Debian, entra Mandrake'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109914620312503472</id><published>2004-10-30T07:16:00.000-07:00</published><updated>2004-10-30T07:23:23.126-07:00</updated><title type='text'>Finalmente, o cluster</title><content type='html'>Fui apresentado ao cluster menor que deve ser minha plataforma de testes; apenas 16 máquinas. Infelizmente, algumas máquinas estão mal configuradas ou nem dando boot (kernel panic). E as que funcionam estão com RedHat 8, então o primeiro passo vai ser instalar Debian em todas. Pena o Debian estar tão desatualizado, mas para essa aplicação, não será problema. A parte mais &lt;span style="font-style: italic;"&gt;interessante&lt;/span&gt;, para não usar outra palavra, é que o compilador Haskell# (a linguagem funcional paralela criada pelo grupo de pesquisa do qual eu faço parte) não está disponível em lugar nenhum. Que ótimo. Vamos ver no que dá.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109914620312503472?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109914620312503472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109914620312503472&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109914620312503472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109914620312503472'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/10/finalmente-o-cluster.html' title='Finalmente, o cluster'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109838753065528417</id><published>2004-10-21T13:34:00.000-07:00</published><updated>2004-10-21T12:38:50.656-07:00</updated><title type='text'>Hiatus Prolongadus</title><content type='html'>O blog está parado, é o tipo da coisa que uma mudança faz com a pessoa... Fora o início do mestrado, estou lendo alguns livros interessantes sobre os quais comentarei em breve. Além disso, uma nova versão do plugin OCaml para Eclipse também está no forno.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109838753065528417?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109838753065528417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109838753065528417&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109838753065528417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109838753065528417'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/10/hiatus-prolongadus.html' title='Hiatus Prolongadus'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109721145436249895</id><published>2004-10-07T21:55:00.000-07:00</published><updated>2004-10-07T21:57:34.363-07:00</updated><title type='text'>Semestre 1/3 - Disciplinas</title><content type='html'>Só duas: Métodos Matemáticos 1C (processos estocásticos, transformada de Fourier e transformada Z) e Teoria da Informação. Poucas aulas, muito trabalho; mas os assuntos não são totalmente novos. Espero que sobre um bom tempo para pesquisa.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109721145436249895?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109721145436249895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109721145436249895&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109721145436249895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109721145436249895'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/10/semestre-13-disciplinas.html' title='Semestre 1/3 - Disciplinas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109682476066901786</id><published>2004-10-03T10:18:00.001-07:00</published><updated>2004-10-03T10:35:51.056-07:00</updated><title type='text'>Leituras iniciais</title><content type='html'>Como início da investigação, uma lista de leituras e assuntos que pretendo pesquisar de início, por ordem de prioridade.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Fundamentos&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.info.ucl.ac.be/people/PVR/book.html"&gt;Concepts, Techniques and Models of Computer Programming&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.usingcsp.com/"&gt;Communicating Sequential Processes&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/354066579X/ref=wl_it_dp/002-6414329-5877666?%5Fencoding=UTF8&amp;coliid=I2K9NWTJUSMQJZ&amp;amp;v=glance&amp;colid=1VJT4SC4TORX4"&gt;Communicating Mobile Systems: The pi-calculus&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/354066579X/ref=wl_it_dp/002-6414329-5877666?%5Fencoding=UTF8&amp;amp;coliid=I2K9NWTJUSMQJZ&amp;v=glance&amp;amp;colid=1VJT4SC4TORX4"&gt;Introduction to Process Algebra&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www-2.cs.cmu.edu/afs/cs.cmu.edu/user/jcr/www/tpl.html"&gt;Theories of Programming Languages&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.cis.upenn.edu/%7Ebcpierce/tapl/"&gt;Types and Programming Languages&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;2. Bases matemáticas&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;   &lt;li&gt;Lógica (lambda-calculus, etc)&lt;br /&gt; &lt;/li&gt;   &lt;li&gt;Álgebra&lt;/li&gt;   &lt;li&gt;Topologia (domínios, &lt;span style="font-style: italic;"&gt;lattices&lt;/span&gt;)&lt;/li&gt;   &lt;li&gt;Teoria das categorias&lt;/li&gt;   &lt;li&gt;Teoria da computação&lt;br /&gt; &lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;3. Acessórios&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;   &lt;li&gt;Compiladores (dragão, Grune et al., Gough, etc)&lt;/li&gt;   &lt;li&gt;Fundamentos de Linguagem de Programação (&lt;a href="http://www.cs.indiana.edu/eopl/"&gt;Essentials of Programming Languages&lt;/a&gt;)&lt;/li&gt;   &lt;li&gt;&lt;a href="http://theory.stanford.edu/people/jcm/books.html"&gt;Foundations for Programming Languages&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Programação funcional (Paulson, Reade, Okasaki, etc)&lt;br /&gt;  &lt;/li&gt;  &lt;/ul&gt;&lt;br /&gt;Eu sei que é muita coisa (principalmente na parte matemática), e que provavelmente não vai dar tempo de estudar tudo, quando começarem as obrigações formais do mestrado. Mas para isso servem as prioridades e &lt;span style="font-style: italic;"&gt;leitura rápida&lt;/span&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109682476066901786?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109682476066901786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109682476066901786&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109682476066901786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109682476066901786'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/10/leituras-iniciais_03.html' title='Leituras iniciais'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109669331668630270</id><published>2004-10-01T21:48:00.000-07:00</published><updated>2004-10-01T22:01:56.686-07:00</updated><title type='text'>Ordem !</title><content type='html'>Hora de começar a por ordem nesta birosca. Comecei falando sobre processamento paralelo, a coisa se desviou para alguns artigos sobre linguagens de programação, e aqui estamos. As aulas começam em duas semanas, mas só na quarta eu saberei quais serão as disciplinas. Meu programa de pesquisa pessoal não precisa depender disso.&lt;br /&gt;&lt;br /&gt;A área de pesquisa é processamento paralelo. Ainda não sei em que tópico, exatamente. A minha idéia é &lt;span style="font-weight: bold;"&gt;desenvolver um trabalho na área de processamento paralelo, de preferência relacionado a linguagens de programação&lt;/span&gt;. Ainda não sei se será algo teórico ou aplicado, embora a ênfase em um lado não exclua o outro. O que eu preciso fazer, em termos gerais:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;estudar a teoria da concorrência e computação paralela&lt;/li&gt;   &lt;li&gt;estudar a teoria e aspectos práticos das linguagens de programação&lt;/li&gt;   &lt;li&gt;procurar um problema interessante e relevante para resolver na área de processamento paralelo; isso pode ou não já envolver linguagens de programação&lt;/li&gt;   &lt;li&gt;buscar uma solução para o problema; a solução poderá ser no nível das linguagens e usar métodos e técnicas da área&lt;/li&gt; &lt;/ol&gt; Por que estudar a teoria das linguagens de programação ? Porque é um objetivo relacionar minha dissertação com essa área; estudando a teoria eu vou saber que soluções e técnicas estão disponíveis, e onde ir para saber mais sobre elas.&lt;br /&gt;&lt;br /&gt;Os passos 1 e 2 são para construir a fundação, e o 3 e 4 para "executar" o plano em si. Em seguida vou detalhar melhor o que eu já tenho planejado, principalente para os passos 1 e 2.&lt;br /&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109669331668630270?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109669331668630270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109669331668630270&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109669331668630270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109669331668630270'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/10/ordem.html' title='Ordem !'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109648369604483481</id><published>2004-09-29T11:37:00.000-07:00</published><updated>2004-09-29T11:48:16.043-07:00</updated><title type='text'>Schizoid Classes</title><content type='html'>&lt;a href="http://acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=205"&gt;Artigo&lt;/a&gt; na &lt;a href="http://acmqueue.com/"&gt;ACM Queue&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Através dos métodos (e variáveis) de instância e de classe, as classes em Java e C++ misturam o conceito de &lt;em&gt;tipo&lt;/em&gt; com o de &lt;em&gt;módulo&lt;/em&gt;, criando uma crise de múltipla personalidade. Em contraste, na linguagem Smalltalk os métodos e variáveis de instância e de classe são conceitualmente unificados através do uso de metaclasses e metaobjetos. Em outras linguagens, classes e módulos coexistem, reconhecendo o fato que nenhum dos dois pode substituir o outro. &lt;br /&gt;&lt;br /&gt;Artigo curto e de boa leitura; é uma demonstração do que acontece quando você tenta construir linguagens sem uma visão geral de projeto; Smalltalk tem essa visão, C++ e Java não. C++ é um frankenstein ao qual foram adicionadas características (por vezes conflitantes) ao longo dos anos, e Java é uma "linguagem política" que foi feita para tentar satisfazer a gregos e troianos. Não se pode dizer que nenhuma das duas tenha "integridade conceitual".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109648369604483481?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109648369604483481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109648369604483481&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109648369604483481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109648369604483481'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/schizoid-classes.html' title='Schizoid Classes'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109647166454054354</id><published>2004-09-29T07:56:00.000-07:00</published><updated>2004-09-29T08:30:48.643-07:00</updated><title type='text'>An Axiomatic Basis for Computer Programming</title><content type='html'>Um &lt;a href="http://sunnyday.mit.edu/16.355/Hoare-CACM-69.pdf"&gt;artigo&lt;/a&gt; clássico de C. A. R. Hoare, datado de 1969. Esse artigo lançou as bases para provas axiomáticas de corretude de programas e para a semântica axiomática. &lt;br /&gt;&lt;br /&gt;O método axiomático foi usado com sucesso na matemática desde que Euclides publicou uma axiomatização da geometria nos seus Elementos. Com o tempo, o método foi aperfeiçoado e hoje é a base de praticamente todas as teorias matemáticas; Aristóteles já chamava a atenção para o fato que uma cadeia de demonstrações deve começar em algum lugar, algumas verdades que são assumidas. Estes são os axiomas.&lt;br /&gt;&lt;br /&gt;A tese de Hoare é que é possível estabelecer axiomas básicos para a programação de computadores, e a partir deles, usando regras de inferência também estabelecidas, provar propriedades dos programas, especialmente a sua corretude. Um programa é correto se ele realiza as especificações que foram determinadas para ele, ou seja, se ele faz o que deve fazer. Além disso, os axiomas podem ser utilizado na definição formal de linguagens de programação.&lt;br /&gt;&lt;br /&gt;Para exemplificar a plausibilidade do método axiomático na programação, o artigo apresenta alguns axiomas relacionados aos números inteiros e a construções básicas de programação: atribuição, sequenciamento, iteração. Com isso, prova-se que um programa que calcula o máximo divisor comum de dois números é correto, satisfazendo as propriedades matemáticas necessárias para o cálculo.&lt;br /&gt;&lt;br /&gt;A seção 5 discute provas de corretude para programas; a idéia, já antiga, de que erros de programação custam caro e que testes nunca podem provar completamente que um programa está correto. Um trecho é interessante:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The practice of supplying proofs for nontrivial programs will not become widespread until considerably more powerful proof techniques become available, and even then will not be easy.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Coisa que até hoje não aconteceu; ainda é trabalhoso demais provar a corretude de programas além dos mais triviais. Entretanto, em alguns casos mais críticos isso já foi feito, principalmente com a ajuda de &lt;em&gt;theorem provers&lt;/em&gt; especializados. Muitos microprocessadores também passam por processos de prova formal atualmente; é possível que os métodos formais realizem, um dia, os benefícios visualizados por pioneiros como Hoare e Dijkstra. No artigo, Hoare também menciona como as provas de corretude podem ajudar na documentação e portabilidade de programas. &lt;br /&gt;&lt;br /&gt;A seção 6 termina o artigo falando do uso do método axiomático na definição formal de linguagens de programação. Dado que sejam estabelecidos os axiomas e regras de inferência da linguagem, eles servem de definição da própria linguagem: uma implementação só é válida se tornar válidos os axiomas e regras de inferência definidos. Ao mesmo tempo, os axiomas servem automaticamente como base para a prova de corretude da implementação. Hoare fala de Algol 60 e de como a definição formal da sua sintaxe ajudou na formulação de regras sintáticas coerentes, advogando a mesma vantagem para uma definição formal da semântica (tema antigo: simplicidade da definição formal da sintaxe versus complexidade na definição formal da semântica). A semântica axiomática, cuja pesquisa se aprofundou nos anos seguintes, anda meio em desuso, mas os princípios são sólidos. &lt;br /&gt;&lt;br /&gt;Faz você pensar no que a computação poderia ser se mais atenção fosse dada às bases teóricas. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109647166454054354?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109647166454054354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109647166454054354&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109647166454054354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109647166454054354'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/axiomatic-basis-for-computer.html' title='An Axiomatic Basis for Computer Programming'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109640898951427422</id><published>2004-09-28T15:00:00.000-07:00</published><updated>2004-09-28T15:03:09.513-07:00</updated><title type='text'>Idéias</title><content type='html'>Relendo o paper sobre Haskell#, e pensando na especificação estática do paralelismo, me perguntei: por que não codificar a informação de configuração no sistema de tipos ? Atualmente, é utilizada uma linguagem separada para isso, a HCL (Haskell Configuration Language), o que traz os problemas de &lt;em&gt;casamento de impedância&lt;/em&gt; e coisa e tal. Uma solução integrada ao sistema de tipos poderia manter a especificação dinâmica, a separação das preocupações de coordenação e computação e ainda eliminar os problemas de impedância. Além de codificar os componentes e a configuração, é necessário codificar os &lt;em&gt;skeletons&lt;/em&gt; também. Templates ? Meta-programação ? É preciso verificar que outras técnicas já foram tentadas (Eden, GpH, etc)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109640898951427422?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109640898951427422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109640898951427422&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109640898951427422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109640898951427422'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/idias.html' title='Idéias'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109597149838770295</id><published>2004-09-27T12:16:00.000-07:00</published><updated>2004-09-27T08:04:41.703-07:00</updated><title type='text'>Lambda: the Ultimate Declarative</title><content type='html'>Outro &lt;a href="ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-379.pdf"&gt;artigo&lt;/a&gt; da "série Lambda" de Guy Steele e Gerald Sussman.&lt;br /&gt;&lt;br /&gt;Este abre caminho para o projeto do compilador RABBIT que foi o objeto de estudo do mestrado de Steele. O foco é na definição de primitivas para estruturas de controle e operadores de ambiente, usando expressões-lambda como base sempre que possível; e em como compilar estas primitivas eficientemente para código de máquina (o PDP-10 é usado como plataforma-alvo).&lt;br /&gt;&lt;br /&gt;Logo no começo há uma explicação bastante didática sobre recursividade final, porque ela é eficiente e como o interpretador Scheme apresentado no artigo "SCHEME: An Interpreter for Extended Lambda Calculus" implementa essa otimização (exatamente o que eu comentei em um &lt;a href="http://realpar.blogspot.com/2004/09/tail-recursion.html"&gt;post anterior&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Então são apresentadas duas primitivas fundamentais: a aplicação de funções como uma primitiva de controle fundamental (juntamente com expressões condicionais) e as expressões-lambda como operadores de renomeamento de quantidades de um ambiente. Seguem as propriedades dessas primitivas (controle e ambiente) que permitem uma compilação eficiente do código; há um exemplo de compilação mostrando como uma função recursiva é compilada para código de máquina iterativa.&lt;br /&gt;&lt;br /&gt;A próxima seção trata de fechamentos e estilo de passagem de continuações. A continuação é apresentada como um parâmetro explícito que guarda o endereço de retorno, em contraste ao endereço de retorno implícito nas chamadas de função habituais. Também se mostra como o uso do CPS facilita o suporte a funções que retornam múltiplos valores. O uso de CPS em todo lugar acaba com o problema de ter primitivas que tiram o endereço de retorno da pilha, mas criam a necessidade de converter código para o CPS, e usar todas as primitivas em CPS.&lt;br /&gt;&lt;br /&gt;A seção 3 é a que é mais fiel ao título do artigo: falando de estruturas de dados definidas proceduralmente, expõe técnicas para usar fechamentos e expressões lambda na representação de tipos de dados. Nisso, toca-se no assunto dos ADTs (Abstract Data Types), mencionando inclusive CLU, e em formas eficientes de compilar fechamentos que representam dados. Apenas sugestões mostrando o que é possível, mas nada concreto (lembrando que o artigo é uma proposta de tese).&lt;br /&gt;&lt;br /&gt;Enfim, fala-se da estrutura proposta para o compilador Scheme que é o objeto da tese de mestrado de Guy Steele. Resumem-se as técnicas necessárias, requisitos e resultados esperados com o compilador. Interessante que a visão dos autores era a de usar Scheme como uma linguagem intermediária universal, pela facilidade de expressar as operações gerais das linguagens de programação com construções simples, a maioria baseada nas expressões lambda. Apesar de não ser o uso corrente da linguagem, isso se reflete em algumas linhas de trabalho, como a do livro &lt;a href="http://www.cs.indiana.edu/eopl/"&gt;Essentials of Programming Languages&lt;/a&gt; e do pessoal do &lt;a href="http://www.plt-scheme.org/"&gt;PLT&lt;/a&gt; da universidade de &lt;a href="http://www.cs.indiana.edu/"&gt;Indiana&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A conclusão reapresenta as idéias principais do memo, com a parte mais interessante para mim sendo as analogias entre definição e aplicação de funções (eval/apply). Os dois apêndices tratam da conversão de código arbitrário para CPS.&lt;br /&gt;&lt;br /&gt;No geral é um tanto heterogêneo para um artigo, já que é mais uma proposta de tese. Também inclui muitas referências específicas a trabalhos do AI Lab e ao PDP-10, mas ainda assim o memo vale a pena por condensar várias idéias sobre Scheme, focalizando na construção de um compilador.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109597149838770295?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109597149838770295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109597149838770295&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109597149838770295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109597149838770295'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/lambda-ultimate-declarative.html' title='Lambda: the Ultimate Declarative'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109629397913639972</id><published>2004-09-27T07:01:00.000-07:00</published><updated>2004-09-27T07:06:19.136-07:00</updated><title type='text'>Curtas</title><content type='html'>&lt;ul&gt;   &lt;li&gt;Computação interativa leva ao estudo da teoria dos jogos. von Neumann, John Nash, etc&lt;/li&gt;   &lt;li&gt;O &lt;a href="http://mlton.org/"&gt;mlton&lt;/a&gt; está avançando bastante; pode ser uma boa alternativa de um sistema ML prático, concorrendo com &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;O &lt;a href="http://www.plt-scheme.org/"&gt;PLT Scheme&lt;/a&gt; está com um sistema de módulos interessante, o &lt;a href="http://planet.plt-scheme.org/"&gt;PLaneT&lt;/a&gt;. PLT ficando cada vez melhor&lt;/li&gt;   &lt;li&gt;Não é muita novidade, mas saíram os &lt;a href="http://www.cis.upenn.edu/proj/plclub/contest//results.php"&gt;resultados&lt;/a&gt; do &lt;a href="http://www.cis.upenn.edu/proj/plclub/contest//index.php"&gt;ICFP Contest&lt;/a&gt; desse ano. Haskell na frente, OCaml no prêmio especial do juri.&lt;br /&gt;  &lt;/li&gt; &lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109629397913639972?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109629397913639972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109629397913639972&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109629397913639972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109629397913639972'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/curtas.html' title='Curtas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109598052371370005</id><published>2004-09-23T15:56:00.000-07:00</published><updated>2004-09-23T16:02:03.713-07:00</updated><title type='text'>Computação Interativa</title><content type='html'>Vários trabalhos de pesquisa, ultimamente, têm se concentrado no conceito de &lt;span style="font-style: italic;"&gt;computação interativa&lt;/span&gt;: focalizar, na teoria da computabilidade, não mais o algoritmo como peça central, mas a interação. Isso torna os modelos clássicos (máquinas de Turing, lambda-calculus, etc) inadequados para descrever os sistemas computacionais atuais. A idéia é desenvolver novos fundamentos que levem em conta interação, distribuição, mobilidade e concorrência.&lt;br /&gt;&lt;br /&gt;Um dos tipos de formalismo desenvolvido são as álgebras de processo, como o pi-calculus; assuntos que pretendo estudar em breve (os livros já estão aqui). A busca dos fundamentos para computação interativa me interessa muito, e é algo que eu posso relacionar com a minha pesquisa de mestrado.&lt;br /&gt;&lt;br /&gt;A conferência &lt;a href="http://www.cse.uconn.edu/cse/finco05/"&gt;Foundations of Interactive Computation&lt;/a&gt; é sobre isso. O call for papers apresenta alguma contextualização para os motivos dessa busca.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109598052371370005?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109598052371370005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109598052371370005&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109598052371370005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109598052371370005'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/computao-interativa.html' title='Computação Interativa'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109596496456921642</id><published>2004-09-23T11:39:00.000-07:00</published><updated>2004-09-23T11:42:44.570-07:00</updated><title type='text'>References for Beginners in Programming Language Theory</title><content type='html'>&lt;a href="http://lambda-the-ultimate.org/node/view/272"&gt;Thread&lt;/a&gt; no &lt;a href="http://lambda-the-ultimate.org/"&gt;LtU&lt;/a&gt;. Vou observar se aparecem indicações interessantes (além das que já estão lá).&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109596496456921642?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109596496456921642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109596496456921642&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109596496456921642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109596496456921642'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/references-for-beginners-in.html' title='References for Beginners in Programming Language Theory'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109568512409106709</id><published>2004-09-20T05:55:00.000-07:00</published><updated>2004-09-20T05:58:44.090-07:00</updated><title type='text'>Hiato...</title><content type='html'>É, as coisas andam paradas por aqui mesmo. Prazo apertado no trabalho, um rapido desvio pelo mundo da criptografia e muito código Java (eca). Se tudo der certo, em duas semanas estarei livre disso e aí vai ser só Haskell e clusters.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109568512409106709?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109568512409106709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109568512409106709&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109568512409106709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109568512409106709'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/hiato.html' title='Hiato...'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109519091460050502</id><published>2004-09-14T13:35:00.000-07:00</published><updated>2004-09-14T12:46:19.186-07:00</updated><title type='text'>Lambda the Ultimate</title><content type='html'>Lembrando que no LtU Imperative os modelos semânticos se baseiam apenas em:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;expressões lambda&lt;/li&gt;   &lt;li&gt;expressões condicionais&lt;/li&gt;   &lt;li&gt;atribuição&lt;/li&gt; &lt;/ol&gt; Se tivermos avaliação em ordem normal, até mesmo as expressões condicionais podem ser modeladas usando expressões lambda. Assim, teríamos apenas a necessidade de 1 e 3. O problema é que, como notado no paper original sobre Scheme, a ordem normal de avaliação complica a implementação correta da recursividade final. Mas, se usarmos o estilo de passagem de continuações sempre, obtemos independência da ordem de avaliação específica, como observado por Reynolds e Steele &amp; Sussman; assim podemos ter uma linguagem em ordem normal e com recursividade final, eliminando a necessidade de ter expressões condicionais como primitivas.&lt;br /&gt;&lt;br /&gt;Agora acabei de reler essa parte no AIM-349 (o "Scheme: an Interpreter for Extended Lambda Calculus") e vi que esta observação também está lá. Enfim, é difícil ser original, ainda mais considerando que esses artigos têm em média 30 anos de idade.&lt;br /&gt;&lt;br /&gt;Seria possível eliminar a atribuição, ficando apenas com expressões lambda para tudo ? Aparentemente não, até porque o lambda-calculus puro é livre de efeitos colaterais, e nós queremos modelar estruturas que apresentam efeitos colaterais. Será que não dá para colocar uma mônada aí no meio ? E mais, fazer isso sem passar para uma extensão do lambda-calculus puro ?&lt;br /&gt;&lt;br /&gt;(Nota: se não me engano alguém já provou que ter continuações e atribuição em uma linguagem é equivalente a ter mônadas numa linguagem sem efeitos colaterais, mas qualquer conjunto menor é menos expressivo; depois vou procurar esse artigo)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109519091460050502?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109519091460050502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109519091460050502&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109519091460050502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109519091460050502'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/lambda-ultimate.html' title='Lambda the Ultimate'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109518187137439234</id><published>2004-09-14T09:46:00.000-07:00</published><updated>2004-09-14T10:18:31.110-07:00</updated><title type='text'>Lambda: the Ultimate Imperative</title><content type='html'>Mais um &lt;a href="ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-353.pdf"&gt;artigo&lt;/a&gt; de Steele e Sussman.&lt;br /&gt;&lt;br /&gt;São apresentados modelos semânticos de algumas estruturas de linguagens de programação. A linguagem usada para especificar a semântica é Scheme (claro). O título vem do fato da maioria das estruturas serem consideradas imperativas, e os modelos utilizarem expressões lambda quase que exclusivamente (&lt;span style="font-style: italic;"&gt;"o poder do lambda-calculus"&lt;/span&gt;). As estruturas são:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;recursão simples&lt;/li&gt;   &lt;li&gt;iteração&lt;/li&gt;   &lt;li&gt;sequenciamento de expressões (comandos compostos)&lt;/li&gt;   &lt;li&gt;saltos com &lt;span style="font-weight: bold;"&gt;goto&lt;/span&gt;&lt;/li&gt;   &lt;li&gt;atribuição&lt;/li&gt;   &lt;li&gt;passagem de continuações&lt;/li&gt;   &lt;li&gt;expressões de escape (saídas não-locais)&lt;/li&gt;   &lt;li&gt;variáveis fluidas (escopo dinâmico)&lt;/li&gt;   &lt;li&gt;convenções de passagem de parâmetros: &lt;span style="font-weight: bold;"&gt;call by name&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;call by need&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;call by reference&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;O mote do artigo é que essas estruturas são modeladas usando apenas expressões lambda, expressões condicionais (&lt;span style="font-weight: bold;"&gt;if&lt;/span&gt;) e, em alguns poucos casos, atribuição. Na maior parte dos casos os modelos são realizados a partir de transformações sintáticas locais, mantendo a mesma estrutura do programa original.&lt;br /&gt;&lt;br /&gt;Os dois primeiros itens são gratuitos em Scheme. O sequenciamento consegue-se pelo aproveitamento da ordem de avaliação aplicativa em expressões lambda. Assim, a sequência &lt;code&gt;S1; S2&lt;/code&gt; vira &lt;code&gt;((lambda (dummy) S2) S1)&lt;/code&gt;. Neste exemplo, &lt;code&gt;S1&lt;/code&gt; é executada apenas pelos efeitos colaterais. Os saltos também são consequência da recursividade final, que garante que uma chamada de função seja apenas uma transferência de controle direto (ver últimos posts). A atribuição pode ser modelada também com expressões lambda, usando uma chamada de função para cada novo valor da variável. Expressões compostas são consequência de como o sequenciamento é implementado; nada de novo. Continuações também ficam simples graças à recursividade final; expressões de escape são modeladas com &lt;span style="font-weight: bold;"&gt;CATCH&lt;/span&gt; ou com continuações.&lt;br /&gt;&lt;br /&gt;A parte mais longa e elaborada do artigo são os modelos para escopo dinâmico e as convenções de chamada. Para escopo dinâmico utiliza-se um &lt;span style="font-weight: bold;"&gt;ambiente fluido&lt;/span&gt; que é transmitido entre todas as funções que podem fazer atribuições a variáveis dinâmicas. É preciso alguma convenção sintática para diferenciar as variáveis léxicas das fluidas. Se a implementação usa o estilo de passagem de continuações em todas as funções, o ambiente fluido pode ser incorporado na mesma função da continuação.&lt;br /&gt;&lt;br /&gt;Para as convenções de chamada, o &lt;span style="font-weight: bold;"&gt;call-by-name&lt;/span&gt; da linguagem ALGOL é simulado usando &lt;span style="font-style: italic;"&gt;thunks&lt;/span&gt;, que são expressões lambda sem argumentos: uma expressão &lt;code&gt;E1&lt;/code&gt; é transformada para &lt;code&gt;(lambda ()  E1)&lt;/code&gt;. Pode-se adicionar memoização permantente, chegando ao esquema  &lt;span style="font-weight: bold;"&gt;call-by-need&lt;/span&gt;. Embora semelhante, o call-by-need é diferente do call-by-name, mas mesmo assim pode-se utilizar algumas formas de memoização para tornar o call-by-name mais eficiente. O problema da atribuição de parametros passador por nome e por referência é tratado por último, incluindo algumas considerações gerais de como, por exemplo, tornar o &lt;span style="font-weight: bold;"&gt;car&lt;/span&gt; de uma lista, ou qualquer outra localização de valor, atribuível. Assim, discute-se sobre convenções de atribuição em outras linguagens.&lt;br /&gt;&lt;br /&gt;A conclusão nota que Landin e Reynolds já tinham realizado modelos de algumas das mesmas estruturas usando técnicas similares; entretanto, eles utilizaram formalismos mais complexos do que a linguagem Scheme utilizada neste artigo. Além disso, os modelos para expressões de escape, escopo dinâmico e chamada por nome não tinham sido apresentados antes.&lt;br /&gt;&lt;br /&gt;Em seguida: Lambda, the Ultimate Declarative. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109518187137439234?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109518187137439234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109518187137439234&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109518187137439234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109518187137439234'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/lambda-ultimate-imperative.html' title='Lambda: the Ultimate Imperative'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109517161516890670</id><published>2004-09-14T07:16:00.000-07:00</published><updated>2004-09-14T07:25:53.330-07:00</updated><title type='text'>Mais Reflexões Recursivas</title><content type='html'>O fato de ser mais difícil implementar a recursividade final corretamente em linguagens imperativas, por causa do sequenciamento de instruções principalmente, deve explicar a falta deste aspecto em linguagens como C e Java. Também para explicar por que isso foi "descoberto" no âmbito da programação funcional. Mas hoje já se sabe como fazer isso em linguagens imperativas, então não deveria haver desculpas. Ou deveria ?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109517161516890670?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109517161516890670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109517161516890670&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109517161516890670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109517161516890670'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/mais-reflexes-recursivas.html' title='Mais Reflexões Recursivas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109517108370518969</id><published>2004-09-14T07:05:00.000-07:00</published><updated>2004-09-14T07:13:38.190-07:00</updated><title type='text'>Enfim</title><content type='html'>Sobre a &lt;span style="font-style: italic;"&gt;tail recursion&lt;/span&gt; no interpretador Scheme, a resposta é simples e engenhosa; está nas entrelinhas do interpretador. É só não salvar o estado na hora de avaliar (executar) uma combinação.&lt;br /&gt;&lt;br /&gt;Mas não tem que voltar ? Nem sempre, só se a combinação for uma subcombinação de outra combinação. E aí o interpretador salva: antes de avaliar cada argumento de uma combinação, ele salva o estado, para restaurar quando a avaliação do argumento tiver sido terminada.&lt;br /&gt;&lt;br /&gt;Ou seja, o controle de uma função para outra é simplesmente transferido (&lt;span style="font-weight: bold;"&gt;goto&lt;/span&gt; mesmo). Lembrando do artigo de Reynolds, isso é o interessante do estilo de passagem de continuações: uma função no CPS nunca retorna, apenas transferindo o controle para a próxima continuação.&lt;br /&gt;&lt;br /&gt;Dá para ver que isso é possível em uma linguagem orientada a expressões como Scheme, sem sequenciamento de instruções e outras características imperativas. É preciso refletir como seria possível fazer isso em C, por exemplo (sim, eu sei que já foi feito).&lt;br /&gt;&lt;br /&gt;Agora posso terminar o LtU Imperative.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109517108370518969?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109517108370518969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109517108370518969&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109517108370518969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109517108370518969'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/enfim.html' title='Enfim'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109511349498395192</id><published>2004-09-13T15:06:00.000-07:00</published><updated>2004-09-13T15:11:34.983-07:00</updated><title type='text'>Tail Recursion ?</title><content type='html'>Já estava quase terminando o Lambda: the Ultimate Imperative quando me veio uma dúvida à cabeça, sobre a implementação Scheme que é mostrada no artigo anterior: como são implementadas as &lt;span style="font-style: italic;"&gt;tail calls&lt;/span&gt; (chamadas finais) ?&lt;br /&gt;&lt;br /&gt;Eu não analisei a implementação apresentada a fundo, até porque é MacLisp, um dialeto de mais de 30 anos de idade. Mas agora fiquei curioso com isso.&lt;br /&gt;&lt;br /&gt;Em uma olhada superficial, a função &lt;span style="font-weight: bold;"&gt;EVLIS&lt;/span&gt; é a responsável pela avaliação de combinações, então aparentemente é aí que o controle deve ser transferido. Mas como diferenciar quando salvar e quando não salvar um quadro de ativação (CLINK, na notação do artigo) ?&lt;br /&gt;&lt;br /&gt;A transferência entre as funções que implementam o interpretador é por meio de &lt;span style="font-style: italic;"&gt;tail calls&lt;/span&gt; forçadas, utilizando a variável do contador de programa (**PC**); mas ainda não percebi como isso se reflete nas funções da linguagem interpretada... bom, verificarei isso.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109511349498395192?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109511349498395192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109511349498395192&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109511349498395192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109511349498395192'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/tail-recursion.html' title='Tail Recursion ?'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109508456805624142</id><published>2004-09-13T06:39:00.000-07:00</published><updated>2004-09-13T07:16:51.176-07:00</updated><title type='text'>SCHEME: An Interpreter for Extended Lambda Calculus</title><content type='html'>O &lt;a href="ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-349.pdf"&gt;artigo&lt;/a&gt; original de Steele e Sussman que define a linguagem Scheme. Na verdade, é um memo interno do laboratório de inteligência artificial do MIT; mas uma publicação respeitada mesmo assim.&lt;br /&gt;&lt;br /&gt;Muitas informações históricas interessantes, mas alguma parte das informações técnicas ainda é relevante também. O memo é de 1975; tanto Landin quanto Reynolds já tinham publicado artigos importantes sobre o lambda-calculus e sua relação com as linguagens de programação, tanto que ambos são citados no memo. Mesmo assim, Scheme foi a primeira linguagem prática a implementar o lambda-calculus e ser explicitamente baseada nele (a LISP original chega perto, mas tem o problema de funções não serem valores).&lt;br /&gt;&lt;br /&gt;A primeira parte é um manual de referência da linguagem Scheme; bastante primitiva se comparada com as versões atuais. O operador &lt;span style="font-weight: bold;"&gt;call/cc&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;call-with-current-continuation&lt;/span&gt;) se chamava &lt;span style="font-weight: bold;"&gt;CATCH&lt;/span&gt;. A definição original também incluía primitivas de multiprogramação: operações para criar e gerenciar processos, coisas que foram retiradas da linguagem para sempre, posteriormente. A parte é curta e vai direto ao ponto.&lt;br /&gt;&lt;br /&gt;A segunda parte tem exemplos de programas em Scheme, começando com a tradicional função fatorial recursiva, depois tratando de funções iterativas implementadas recursivamente (usando recursão final, ou &lt;span style="font-style: italic;"&gt;tail recursion &lt;/span&gt;se preferir), estilo de passagem de continuações, e dois exemplos maiores: a função &lt;span style="font-weight: bold;"&gt;SAMEFRINGE &lt;/span&gt;e uma função de reconhecimento de padrões, ambas usando continuações e &lt;span style="font-weight: bold;"&gt;CATCH &lt;/span&gt;extensivamente. No final, um exemplo de multi-processamento. Os exemplos são interessantes principalmente como uso de continuações e &lt;span style="font-weight: bold;"&gt;call/cc&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Na parte 3 discute-se a semântica da linguagem, utilizando o lambda-calculus de maneira um tanto quanto informal para basear a discussão. Fala-se da semântica de substituição típica da teoria de Church. A semântica de substituição é utilizada para justificar como programas com recursividade final são iterativos, pois não necessitam de uma pilha proporcional ao tamanho da entrada. Da mesma forma, analisa-se a execução de funções no estilo de passagem de continuações.&lt;br /&gt;&lt;br /&gt;Em seguida, a quarta parte discute sobre a implementação da linguagem, destacando as principais dificuldades e como contorná-las. Steele e Sussman definem como principal dificuldade a eficiência da implementação. Aqui é apresentada a técnica de utilizar ambientes (&lt;span style="font-style: italic;"&gt;environments&lt;/span&gt;) como forma eficiente de implementar a semântica de substituição do lambda-calculus; uma implementação ingênua, utilizando substituição textual, é bem mais complexa. Apresenta-se também a noção de fechamentos (&lt;span style="font-weight: bold;"&gt;closures&lt;/span&gt;), que são o resultado da avaliação de uma expressão lambda; o fechamento inclui a própria expressão lambda e o ambiente na qual ela foi avaliada, resultando numa das principais características da linguagem Scheme: o escopo léxico (as variantes Lisp da época utilizavam escopo dinâmico). Os autores chamam a atenção para a semelhança com ALGOL e o uso do conceito de fechamento em outros sistemas. Uma consequência importante é que o escopo léxico garante que os axiomas do lambda-calculus são válidos na linguagem. Por fim, discute-se os problemas relacionados ao fluxo de controle do interpretador e dos programas interpretados, o que traz à tona o assunto da ordem de avaliação (normal vs. aplicativa). Chama-se a atenção para o fato que a ordem normal, que é a tradicional no lambda-calculus, evita a implementação eficiente de algoritmos iterativos, e por isso Scheme usa a ordem aplicativa. Mesmo assim, formas especiais usadas como macros usam uma forma de ordem normal, efetivamente misturando as duas formas na mesma linguagem. Fala-se também sobre como o uso do estilo de passagem de continuações pode eliminar a dependência da ordem de avaliação específica; o mesmo já foi tratado por Reynolds em seu "Definitional Interpreters for Higher-Order Programming Languages" de 1972. Mais alguns detalhes são considerados, como extensões para constantes e operações primitivas.&lt;br /&gt;&lt;br /&gt;A seção 5 conclui o artigo apresentando uma implementação "didática" (não totalmente otimizada) da linguagem, usando MacLisp como linguagem de implementação. O fato de MacLisp ser um tanto diferente do Common Lisp atual atrapalha um pouco o entendimento, mas nada que não possa ser superado. A principal idéia da implementação é pensar em baixo nível; não utilizar a recursividade da linguagem de implementação para expressar a recursividade na linguagem implementada, pois isso atrelaria as estruturas de controle desta às daquela. Uma parte interessante é a implementação da forma LABELS, que apresenta um ambiente recursivo no qual as expressões podem se referir umas às outras; o efeito é conseguido utilizando-se alterações destrutivas na estrutura do ambiente, cujos fechamentos são alterados para apontar para o próprio ambiente criado.&lt;br /&gt;&lt;br /&gt;No final, os agradecimentos dão uma idéia das origens da linguagem Scheme. Isso termina o primeiro artigo da série dos "lambda papers" de Steele e Sussman. Os próximos já estão na fila de leitura.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109508456805624142?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109508456805624142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109508456805624142&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109508456805624142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109508456805624142'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/scheme-interpreter-for-extended-lambda.html' title='SCHEME: An Interpreter for Extended Lambda Calculus'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109482714722836356</id><published>2004-09-10T07:29:00.000-07:00</published><updated>2004-09-13T07:16:29.086-07:00</updated><title type='text'>Enquanto isso, na programação funcional...</title><content type='html'>Na programação funcional não existem valores parciais, então não dá para fazer o mesmo truque. Também seria estranho ver procedimentos em uma linguagem funcional. Mas ainda dá para conseguir recursividade final (já vi em algum lugar a tradução &lt;span style="font-style: italic;"&gt;recursão de cauda&lt;/span&gt; ou algo similarmente horrendo) através de outra transformação. A idéia é utilizar uma convenção idiomática comum, através de acumuladores. Vejamos como isso fica em Scheme. A função &lt;code&gt;mapl&lt;/code&gt; (&lt;code&gt;map&lt;/code&gt; já existe em Scheme) é uma versão direta da função em Oz:&lt;br /&gt;&lt;pre&gt;(define (mapl f l)&lt;br /&gt;(if (null? l)&lt;br /&gt;   ()&lt;br /&gt;   (cons (f (car l)) (mapl f (cdr l)))))&lt;/pre&gt;&lt;br /&gt;Ela claramente não apresenta recursividade final. Agora vamos passar utilizar um acumulador como parâmetro adicional:&lt;br /&gt;&lt;pre&gt;(define (mapla f l a)&lt;br /&gt;(if (null? l)&lt;br /&gt;    a&lt;br /&gt;    (mapla f (cdr l)&lt;br /&gt;           (cons (f (car l)) a))))&lt;/pre&gt;&lt;br /&gt;E &lt;span style="font-style: italic;"&gt;voilà&lt;/span&gt;: tail recursion. Mas aqui temos um problema: a lista resultante está invertida com relação ao resultado esperado, pois a operação de construção de lista não é comutativa. Resolve-se isso adicionando uma chamada a reverse:&lt;br /&gt;&lt;pre&gt;(define (mapla f l a)&lt;br /&gt;(if (null? l)&lt;br /&gt;    (reverse a)&lt;br /&gt;    (mapla f (cdr l)&lt;br /&gt;           (cons (f (car l)) a))))&lt;/pre&gt;&lt;br /&gt;Pode testar que dá o mesmo resultado (recomendo o &lt;a href="http://www.drscheme.org/"&gt;DrScheme&lt;/a&gt;); como acumulador inicial usa-se a lista vazia, segundo a equação de equivalência &lt;code&gt;(mapl f l) = (mapla f l ())&lt;/code&gt;. Pode-se criar uma função &lt;span style="font-style: italic;"&gt;wrapper&lt;/span&gt; que faça isso automaticamente.&lt;br /&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109482714722836356?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109482714722836356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109482714722836356&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109482714722836356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109482714722836356'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/enquanto-isso-na-programao-funcional.html' title='Enquanto isso, na programação funcional...'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109482603115363737</id><published>2004-09-10T06:57:00.000-07:00</published><updated>2004-09-10T07:25:34.783-07:00</updated><title type='text'>Eine Kleine Nachtmusik</title><content type='html'>&lt;a href="http://www.mozart-oz.org/"&gt;Oz&lt;/a&gt; é uma linguagem estranha. Seus conceitos fundamentais são uma mistura de programação imperativa, funcional e lógica, além de programação concorrente e distribuída. Intrinsecamente multi-paradigma.&lt;br /&gt;&lt;br /&gt;Terminei os dois primeiros capítulos do &lt;a href="http://www.info.ucl.ac.be/people/PVR/book.html"&gt;CTMCP&lt;/a&gt; e ainda fica um certo estranhamento, até porque no começo parece tanto com uma linguagem funcional. Mas tem unificação, valores parciais e outras coisas estranhas que parecem Prolog.&lt;br /&gt;&lt;br /&gt;Para exemplificar, vamos começar com algum &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;: Oz é dividida em uma &lt;span style="font-weight: bold;"&gt;kernel language&lt;/span&gt; que abriga os conceitos fundamentais, e uma &lt;span style="font-weight: bold;"&gt;full language&lt;/span&gt; que inclui sintaxe extra e outras conveniências. A kernel language é simples e é nela que se define a semântica da linguagem; além disso, especifica-se formalmente como traduzir programas na full language para a kernel language, e assim é possível especificar a semântica de qualquer programa na linguagem completa.&lt;br /&gt;&lt;br /&gt;Pois bem, a kernel language define procedimentos, e não funções, como conceitos primitivos. Funções são uma abstração sintática da linguagem completa, que são traduzidas para procedimentos na kernel language. Como exemplo, a função&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;fun {Times2 N}&lt;br /&gt;  N * 2&lt;br /&gt;end&lt;/pre&gt;é traduzida para o procedimento&lt;br /&gt;&lt;pre&gt;proc {Times2 N ?R}&lt;br /&gt;  R = N * 2&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;O &lt;code&gt;?R&lt;/code&gt; é um parâmetro de saída que é atribuído com o resultado de retorno do procedimento (se houver um). O que era funcional vira imperativo na kernel language. O que é realmente interessante é a forma como isso interage com valores parciais e estruturas de dados. Vamos definir uma função &lt;code&gt;Map&lt;/code&gt; que aplica uma função &lt;code&gt;F&lt;/code&gt; a cada elemento de uma lista &lt;code&gt;L&lt;/code&gt;. O operador &lt;code&gt;|&lt;/code&gt; é o construtor de lista (&lt;code&gt;cons&lt;/code&gt; em Scheme/Lisp, &lt;code&gt;::&lt;/code&gt; em ML, &lt;code&gt;:&lt;/code&gt; em Haskell); &lt;code&gt;{F H}&lt;/code&gt; é uma chamada da função &lt;code&gt;F&lt;/code&gt; com argumento &lt;code&gt;H&lt;/code&gt;; &lt;code&gt;case&lt;/code&gt; faz &lt;span style="font-style: italic;"&gt;pattern matching&lt;/span&gt;.  Logo após a função tem a tradução dela para a kernel language.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;fun {Map F L}&lt;br /&gt;  case L of H | T then {F H} | {Map F T}&lt;br /&gt;  else nil end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;proc {Map F L ?R}&lt;br /&gt;  case L of H | T then&lt;br /&gt;    local Rr in&lt;br /&gt;      R = {F H} | Rr&lt;br /&gt;      {Map F T Rr}&lt;br /&gt;    end&lt;br /&gt;  else nil end&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;Note-se aí a atribuição do resultado (&lt;code&gt;R&lt;/code&gt;) a um valor parcial, pois &lt;code&gt;Rr&lt;/code&gt; (o "resto" do resultado) ainda não possui valor. O efeito disso é transformar uma função que não é &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;tail recursive&lt;/span&gt;&lt;/span&gt; em um procedimento que é. O programador ganha automaticamente os benefícios da recursão final (tradução tentativa para &lt;span style="font-weight: bold;"&gt;tail recursion&lt;/span&gt;), sem se preocupar com isso.&lt;br /&gt;&lt;br /&gt;Estranho, mas interessante.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109482603115363737?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109482603115363737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109482603115363737&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109482603115363737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109482603115363737'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/eine-kleine-nachtmusik.html' title='Eine Kleine Nachtmusik'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109466465312274169</id><published>2004-09-08T10:16:00.000-07:00</published><updated>2004-09-08T12:38:01.633-07:00</updated><title type='text'>Outras relações</title><content type='html'>Ainda sobre o artigo de Reynolds, algumas observações adicionais.&lt;br /&gt;&lt;br /&gt;O método de usar interpretadores meta-circulares na definição de linguagens de programação começa, como é conhecido, com &lt;a href="http://www-formal.stanford.edu/jmc/"&gt;John McCarthy&lt;/a&gt; e o &lt;a href="http://www-formal.stanford.edu/jmc/recursive.html"&gt;artigo original sobre a linguagem Lisp&lt;/a&gt;. A mesma abordagem é utilizada em um dos capítulos do influente livro "&lt;a href="http://mitpress.mit.edu/sicp"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt;" de Abelson e Sussman; o uso de interpretadores para explicar características de linguagens de programação também é a idéia central no livro &lt;a href="http://www.cs.indiana.edu/eopl/"&gt;Essentials of Programming Languages&lt;/a&gt; de Friedman, Wand e Haynes.&lt;br /&gt;&lt;br /&gt;Steele e Sussman definem, em Scheme, um conceito similar ao &lt;span style="font-weight: bold;"&gt;escape&lt;/span&gt; de Reynolds no artigo &lt;a href="ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-353.pdf"&gt;&lt;span style="font-style: italic;"&gt;Lambda, the Ultimate Imperative&lt;/span&gt;&lt;/a&gt;. Ambos são muito parecidos ao operador J de Peter Landin. A mesma idéia aparece no operador &lt;span style="font-weight: bold;"&gt;call-with-current-continuation&lt;/span&gt;, ou &lt;span style="font-weight: bold;"&gt;call/cc&lt;/span&gt;, das versões recentes da linguagem &lt;a href="http://www.schemers.org/"&gt;Scheme&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A notação utilizada, sendo influenciada pelos trabalhos de Landin, lembra uma forma primitiva da linguagem ML. O uso de referências como entidades explicitamente separadas dos outros tipos de variáveis também apareceu em ML.&lt;br /&gt;&lt;br /&gt;A adaptação do interpretador para incluir atribuições de variáveis, com o estado sendo propagado por todas as funções, lembra o uso de mônadas na linguagem &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O artigo de &lt;span style="font-style: italic;"&gt;follow-up&lt;/span&gt; "Definitional Interpreters Revisited" fala sobre essas relações também (ainda não tinha lido quando escrevi isso aqui).&lt;br /&gt;&lt;br /&gt;Enfim, é fácil de ver o quanto esse artigo foi bem sucedido em reunir uma série de idéias fundamentais da área; e a abordagem de mostrar as idéias construtivamente, a partir de interpretadores para elas, foi a maior inovação dele.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109466465312274169?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109466465312274169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109466465312274169&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109466465312274169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109466465312274169'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/outras-relaes.html' title='Outras relações'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109465782912491228</id><published>2004-09-08T08:24:00.000-07:00</published><updated>2004-09-08T08:37:09.123-07:00</updated><title type='text'>Definitional Interpreters for Higher-Order  Programming Languages</title><content type='html'>&lt;a href="ftp://ftp.cs.cmu.edu/user/jcr/defint.ps.gz"&gt;Artigo&lt;/a&gt; de &lt;a href="http://www-2.cs.cmu.edu/afs/cs.cmu.edu/user/jcr/www/"&gt;John C. Reynolds&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O seu propósito é sumarizar o estado-da-arte (da época, 1972) na construção de interpretadores utilizados para definir a semântica de linguagens de programação. Basicamente, ele classifica os interpretadores conhecidos, e demonstra como um interpretador de uma classe pode ser transformado em um de outra classe, clarificando as relações entre as classes. As classes são definidas em dois eixos: se a linguagem definida depende ou não da ordem de avaliação (normal ou aplicativa) da linguagem definidora; e se o interpretador usa funções de alta ordem ou não.&lt;br /&gt;&lt;br /&gt;Começando com um interpretador meta-circular que depende da ordem de avaliação da linguagem definidora e com funções de alta ordem, o artigo mostra como retirar as dependências, assim informando como construir uma linguagem com funções de alta ordem com base em outra linguagem que não as possui, e como tornar a linguagem definida independente da ordem de avaliação da linguagem definidora.&lt;br /&gt;&lt;br /&gt;Um aspecto interessante é como um tipo de interpretador é transformado em outro através de transformações locais que preservam o significado do programa. Esta idéia é muito presente na literatura produzida pelo grupo do &lt;a href="http://www.plt-scheme.org/"&gt;PLT Scheme&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Interessantíssimo para quem quer aprender mais sobre a natureza das linguagens, especialmente as funcionais. Podem-se perceber as influências do artigo em várias partes, por exemplo nas linguagens funcionais atuais (tanto Scheme quanto ML) . Claro que as idéias no artigo em si não eram novas (embora a abordagem seja), já que ele resume idéias de vários outros trabalhos. Por isso mesmo, serve como um excelente guia para a literatura da época sobre o assunto. E é fácil de entender para quem tem alguma exposição a linguagens aplicativas ou ao lambda-calculus.&lt;br /&gt;&lt;br /&gt;Vale a pena ver também o &lt;span style="font-style: italic;"&gt;follow-up&lt;/span&gt; "&lt;a href="ftp://ftp.cs.cmu.edu/user/jcr/defintintro.ps.gz"&gt;Definitional Interpreters Revisited&lt;/a&gt;".&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109465782912491228?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109465782912491228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109465782912491228&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109465782912491228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109465782912491228'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/definitional-interpreters-for-higher.html' title='Definitional Interpreters for Higher-Order  Programming Languages'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109464769118616945</id><published>2004-09-08T05:41:00.000-07:00</published><updated>2004-09-08T07:37:16.340-07:00</updated><title type='text'>Paralelismo para todos</title><content type='html'>Sim, chips dual-core estão vindo de vez. E o futuro é quad-core; oito e até mesmo 16 núcleos num chip só estão sendo tentados. Paralelismo fundamental nas máquinas de todos, em poucos anos.&lt;br /&gt;&lt;br /&gt;Veja-se, por exemplo, a &lt;a href="http://news.com.com/Intel+talks+dual-core+at+its+developer+conference/2009-1030_3-5349536.html?tag=st_lh"&gt;cobertura&lt;/a&gt; do Intel Developer Forum deste ano.&lt;br /&gt;&lt;br /&gt;O problema é que não adianta o quanto nossos chips são potentes, se o software não foi feito para aproveitar essas novas tecnologias. Normalmente estima-se em anos o tempo necessário para que uma parte significativa do software utilizado aproveite as inovações do hardware. É possível que isso ficaria mais fácil se tivéssemos tecnologias de criação de software mais adaptáveis ?&lt;br /&gt;&lt;br /&gt;Outra coisa: concorrência e paralelismo vieram para ficar, desta vez. Qual o impacto que isso trará para as tecnologias de programação ? Será que linguagens e tecnologias mais apropriadas ao meio (erlang, por exemplo) serão utilizadas, em detrimento das que lidam muito mal com concorrência (java) ? Difícil de acreditar, mas tenhamos esperança...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109464769118616945?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109464769118616945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109464769118616945&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109464769118616945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109464769118616945'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/paralelismo-para-todos.html' title='Paralelismo para todos'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109432312198523979</id><published>2004-09-04T11:32:00.000-07:00</published><updated>2004-09-04T11:39:43.596-07:00</updated><title type='text'>OCaml e o eclipse</title><content type='html'>Fiz essa semana o primeiro release oficial do &lt;a href="http://eclipsefp.sf.net/ocaml"&gt;plugin&lt;/a&gt; para usar o &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; como uma IDE &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt;. Versão alfa e tal, ainda bem primitiva. Mas deu um alívio liberar isso e tirar uns dias de folga. Muito trabalho braçal, e ainda mais em Java. Agora vem as partes mais interessantes: modelo da linguagem, análise sintática, melhorar a análise de depedências, trabalhar com o interfaceamento entre a JVM e OCaml, etc...&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109432312198523979?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109432312198523979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109432312198523979&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109432312198523979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109432312198523979'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/09/ocaml-e-o-eclipse.html' title='OCaml e o eclipse'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109389453590352149</id><published>2004-08-30T12:34:00.000-07:00</published><updated>2004-08-30T12:35:35.903-07:00</updated><title type='text'>Supercomputer Seeks Comeback</title><content type='html'>&lt;a href="http://www.wired.com/news/technology/0,1282,64701,00.html"&gt;Artigo&lt;/a&gt; na &lt;a href="http://www.wired.com/"&gt;Wired&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109389453590352149?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109389453590352149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109389453590352149&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109389453590352149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109389453590352149'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/supercomputer-seeks-comeback.html' title='Supercomputer Seeks Comeback'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109352948101608863</id><published>2004-08-26T07:06:00.000-07:00</published><updated>2004-08-26T07:18:53.740-07:00</updated><title type='text'>Mais um livro que chega</title><content type='html'>Agora foi &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0262220695/104-2699845-7763913?%5Fencoding=UTF8&amp;amp;v=glance"&gt;Concepts, Techniques and Models of Computer Programming&lt;/a&gt; de Peter Van Roy e Seif Haridi, considerado o novo &lt;a href="http://mitpress.mit.edu/sicp"&gt;SICP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A falta de posts reflete o fato que ultimamente não tenho estudado muito,  mas espero voltar à ativa em breve.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109352948101608863?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109352948101608863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109352948101608863&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109352948101608863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109352948101608863'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/mais-um-livro-que-chega.html' title='Mais um livro que chega'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109302862451996232</id><published>2004-08-20T11:57:00.000-07:00</published><updated>2004-08-26T07:35:09.656-07:00</updated><title type='text'>The Role of the Study of Programming Languages in the Education of a Programmer</title><content type='html'>Transcrição de uma palestra proferida por &lt;a href="http://www.cs.indiana.edu/%7Edfried/"&gt;Dan Friedman&lt;/a&gt; (&lt;a href="http://www.cs.indiana.edu/%7Edfried/dfried/mex.pdf"&gt;pdf&lt;/a&gt;, &lt;a href="http://www.cs.indiana.edu/%7Edfried/dfried/mex.ps"&gt;ps&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Defende que todo programador deve estudar ao menos o essencial sobre os mecanismos utilizados pelas linguagens de programação, apresentando exemplos de transformações e testemunhos de ex-alunos. A idéia é que entendendo os mecanismos básicos das linguagens, de forma independente das sintaxes específicas, pode-se trabalhar com os programas como dados, realizando transformações que preservam a semântica a fim de melhorar propriedades do código. E que para entender os mecanismos, é importante ver implementações dos mesmos; implementar as idéias em outra linguagem (no caso, Scheme).&lt;br /&gt;&lt;br /&gt;É a abordagem utilizada no &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0262062178/qid=1093530787/sr=1-1/ref=sr_1_1/104-2699845-7763913?v=glance&amp;s=books"&gt;&lt;span style="font-style: italic;"&gt;Essentials of Programming Languages&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109302862451996232?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109302862451996232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109302862451996232&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109302862451996232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109302862451996232'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/role-of-study-of-programming-languages.html' title='The Role of the Study of Programming Languages in the Education of a Programmer'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109283992175588146</id><published>2004-08-18T07:13:00.000-07:00</published><updated>2004-08-20T06:03:17.993-07:00</updated><title type='text'>Parallel and Distributed Programming Using C++</title><content type='html'>&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0131013769/qid=1092838414/sr=1-1/ref=sr_1_1/002-6414329-5877666?v=glance&amp;amp;s=books"&gt;Livro&lt;/a&gt; de 2003, de autoria de Cameron Hughes e Tracey Hughes.&lt;br /&gt;&lt;br /&gt;Superficial e sem foco, apesar de ter alguns exemplos que podem ser úteis para a implementação de sistemas usando PVM, pthreads ou MPI. Os primeiros capítulos são mais conceituais, e possivelmente a parte mais útil do livro (embora seja também superficial). Os capítulos "aplicados" tratam mais de C++ e UML do que do tópico do livro. E os capítulos finais, que deveriam ser os grandes exemplos e estudos de caso, se limitam a discutir um pouco sobre a arquitetura dos sistemas e mostrar meia dúzia de linhas de código. Vagamente interessante, mas nada muito proveitoso.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109283992175588146?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109283992175588146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109283992175588146&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109283992175588146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109283992175588146'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/parallel-and-distributed-programming.html' title='Parallel and Distributed Programming Using C++'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109277348283876165</id><published>2004-08-17T13:09:00.000-07:00</published><updated>2004-08-17T13:11:22.840-07:00</updated><title type='text'>Novos livros</title><content type='html'>Chegaram hoje:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/354066579X/ref=wl_it_dp/002-6414329-5877666?%5Fencoding=UTF8&amp;coliid=I2K9NWTJUSMQJZ&amp;amp;v=glance&amp;colid=1VJT4SC4TORX4"&gt;&lt;span style="font-weight: bold;"&gt;Introduction to Process Algebra,&lt;/span&gt; de Wan Fokkink&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/354066579X/ref=wl_it_dp/002-6414329-5877666?%5Fencoding=UTF8&amp;coliid=I2K9NWTJUSMQJZ&amp;amp;v=glance&amp;colid=1VJT4SC4TORX4"&gt;&lt;span style="font-weight: bold;"&gt;Communicating and Mobile Processes: the Pi-calculus&lt;/span&gt;, de Robin Milner&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Postarei resenhas quando estiver lendo e/ou terminado de ler.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109277348283876165?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109277348283876165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109277348283876165&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109277348283876165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109277348283876165'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/novos-livros.html' title='Novos livros'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109276352770034513</id><published>2004-08-17T10:14:00.000-07:00</published><updated>2004-08-17T10:28:48.326-07:00</updated><title type='text'>Motivações</title><content type='html'>Em algum post anterior eu fiz a pergunta "Por que usar processamento paralelo/concorrente?". A resposta que eu dei no mesmo post se baseou em ganhos de eficiência. Esta talvez seja, sim, a principal motivação para usar processamento paralelo, especialmente em aplicações científicas. Mas não é a única possibilidade.&lt;br /&gt;&lt;br /&gt;Além de alta eficiência, pode-se usar sistemas paralelos para alta disponibilidade. A idéia, neste caso, é ter uma rede com nós redundantes de forma que, mesmo se alguns nós falharem o sistema inteiro continua executando suas funções sem maiores problemas. É o mesmo tipo de redundância-como-tolerancia-a-falhas que encontramos em sistemas de disco RAID, servidores de bancos de dados e sondas espaciais da NASA. A questão aí, quando se lida com informações e processamento, é como manter os nós redundantes em sincronia para que a falha não seja percebida externamente: o nó redundante que entra em ação para substituir o nó problemático deve continuar exatamente onde ele parou.&lt;br /&gt;&lt;br /&gt;Essa noção de redundância também encontra analogias na biologia. Os sistemas biológicos normalmente contem redundâncias, do código genético a partes macroscópicas de corpos que se regeneram, passando pelos neurônios no cérebro (de novo). Parece ser uma forma óbvia de criar sistemas robustos e tolerantes a falhas.&lt;br /&gt;&lt;br /&gt;O que mais podemos levantar como motivos ? Alguns (por ex. Joe Armstrong, criador da linguagem &lt;a href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt;) defendem que alguns sistemas são mais naturalmente modelados por tarefas concorrentes, ao invés de uma única sequencial. Além disso, podemos pensar em modularidade: se temos tarefas isoladas que se comunicam com as outras, mas cada uma fazendo seu trabalho, temos fronteiras de abstração mais administráveis e interfaces mais definidas, reduzindo o acoplamento; isso pensando em um modelo de concorrência com passagem assíncrona de mensagens. Componentes concorrentes com estado compartilhado (&lt;span style="font-style: italic;"&gt;shared state&lt;/span&gt;) se tornam &lt;span style="font-weight: bold;"&gt;mais&lt;/span&gt; acoplados do que se fossem realizados sequencialmente. Essa é a diferença de abordagem de Erlang e outros versus o modelo de concorrência encontrado em linguagens populares como Java e C#.&lt;br /&gt;&lt;br /&gt;Além do mais, do jeito que as coisas vão, em pouco tempo ninguém precisará mais pensar muito em motivos para usar o paralelismo: a tendência é realmente usar sistemas multi-processados e com processamento paralelo mesmo em equipamentos domésticos e consoles de video-game. Sistemas paralelos e distribuídos parecem ser o futuro da computação, em escalas e instâncias variadas.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109276352770034513?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109276352770034513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109276352770034513&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109276352770034513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109276352770034513'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/motivaes.html' title='Motivações'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109250354610120313</id><published>2004-08-14T10:03:00.000-07:00</published><updated>2004-08-14T10:13:51.026-07:00</updated><title type='text'>Paralelismo e o cérebro humano</title><content type='html'>No cérebro temos dezenas de bilhões de neurônios, e eles operam paralelamente. Os sinais são transmitidos em cadeias de neurônios, mas isso acontece em várias cadeias ao mesmo tempo.&lt;br /&gt;&lt;br /&gt;A analogia com processadores paralelos é óbvia, e também nada nova. O projetista da &lt;span style="font-style: italic;"&gt;connection machine&lt;/span&gt;, Daniel Hillis, pensou em criar uma máquina que funcionasse de forma similar à mente humana. Tanto que o nome da empresa que ele fundou era &lt;span style="font-style: italic;"&gt;Thinking Machines Corporation&lt;/span&gt;, e até hoje fala-se da connection machine relacionada à Inteligência Artificial. Paralelismo massivo para simular o processamento realizado pelo cérebro.&lt;br /&gt;&lt;br /&gt;O interessante, ao meu ver, é que apesar do cérebro, fisiologicamente, funcionar de maneira paralela, nosso pensamento se aproxima mais de algo sequencial. Não é linear, em geral, mas só conseguimos pensar em uma coisa de cada vez, mesmo que numa sucessão tão rápida que às vezes nem lembramos de tudo. O processamento sequencial faz parte de como pensamos.&lt;br /&gt;&lt;br /&gt;O que isso implica para as pessoas que querem construir sistemas paralelos/concorrentes ? E será possível ter paralelismo nas camadas inferiores, mas um modelo sequencial na superfície (que é mais fácil de entender, portanto), de forma similar ao cérebro ?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109250354610120313?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109250354610120313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109250354610120313&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109250354610120313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109250354610120313'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/paralelismo-e-o-crebro-humano.html' title='Paralelismo e o cérebro humano'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109233574002591564</id><published>2004-08-12T11:28:00.000-07:00</published><updated>2004-08-12T18:46:16.023-07:00</updated><title type='text'>Idéias soltas</title><content type='html'>&lt;ul&gt;   &lt;li&gt;Hierarquias de sistemas concorrentes (threads, processos, nós, redes, clusters, grids)&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Formalismos: CSP, CCS, pi-calculus&lt;/li&gt;   &lt;li&gt;Linguagens: Occam, Erlang, Oz, Alice, CML, Concurrent Haskell, etc&lt;/li&gt;   &lt;li&gt;Abordagem: o problema do paralelismo/concorrência como um problema de linguagens de programação/expressividade do programador&lt;/li&gt;   &lt;li&gt;Especificações explícitas (Haskell#)&lt;/li&gt;   &lt;li&gt;&lt;span style="font-style: italic;"&gt;Impedance mismatch&lt;/span&gt; entre linguagens de computação e coordenação&lt;/li&gt;   &lt;li&gt;Grids e clusters: o panorama arquitetural dos sistemas computacionais do futuro&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109233574002591564?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109233574002591564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109233574002591564&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109233574002591564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109233574002591564'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/idias-soltas.html' title='Idéias soltas'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109232344238889786</id><published>2004-08-12T07:46:00.000-07:00</published><updated>2004-08-12T18:52:59.373-07:00</updated><title type='text'>Execução sequencial ?</title><content type='html'>Em oposição à execução concorrente. Imagine seu computador doméstico (&lt;span style="font-style: italic;"&gt;garden-variety&lt;/span&gt;), que deve ser um Pentium qualquer, ou Athlon, Duron, Celeron, K6, o que seja. Digamos que seja um Pentium III: este é o processador, ou CPU do computador; como o próprio nome diz, é a &lt;span style="font-weight: bold;"&gt;unidade central de processamento&lt;/span&gt;. Tudo que a CPU faz é obedecer ordens, ou seja, executar as instruções que recebe. As instruções estão na memória, e são códigos que dizem "some estes dois números e me dê o resultado", ou coisas similares. O interessante é que, apenas com as operações aritméticas e operações para mover dados na memória de um lugar para o outro, o computador consegue fazer tudo que faz...&lt;br /&gt;&lt;br /&gt;Mas estou me desviando do assunto. O importante aqui é que temos apenas um processador nos nossos computadores caseiros usuais. E, a rigor, um processador só pode executar uma instrução de cada vez &lt;a href="#foot"&gt;(*)&lt;/a&gt;. Por isso dizemos que a execução é sequencial.&lt;br /&gt;&lt;br /&gt;E a multitarefa ? E o editor de texto, navegador &lt;span style="font-style: italic;"&gt;web&lt;/span&gt;, programa de email e campo minado rodando ao mesmo tempo ? Truque simples: tendo vários programas para executar, o processador alterna entre eles o tempo todo, de forma muito rápida. Por exemplo, digamos que existam apenas 5 programas executando. O processador pode executar cada um deles por 2 décimos de segundo de cada vez; em cada segundo, todos os 5 programas serão executados durante algum tempo. Para o usuário, não dá para perceber essas trocas, porque elas são muito rápidas, normalmente mais rápidas que 2 décimos de segundo. E os processadores atuais executam milhares ou milhões de instruções em apenas 2 décimos de segundo. Assim, cria-se a ilusão de vários programas rodando ao mesmo tempo, apesar do processador continuar executando apenas uma instrução de cada vez.&lt;br /&gt;&lt;br /&gt;&lt;a name="foot"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;* Isso é uma simplificação. Nos processadores atuais as instruções são executadas em &lt;span style="font-style: italic;"&gt;pipelines&lt;/span&gt; superescalares; isso significa que, a rigor, mais de uma instrução é executada simultaneamente. Mas com restrições: as instruções devem estar em fases diferentes de execução e são obtidas (&lt;span style="font-style: italic;"&gt;fetch&lt;/span&gt;) sequencialmente. Os detalhes são complicados, mas em suma isso significa que não é concorrência arbitrária; no fundo, é apenas uma forma de acelerar a execução sequencial.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109232344238889786?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109232344238889786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109232344238889786&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109232344238889786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109232344238889786'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/execuo-sequencial.html' title='Execução sequencial ?'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109226980311295795</id><published>2004-08-11T17:15:00.000-07:00</published><updated>2004-08-11T17:23:56.776-07:00</updated><title type='text'>Antes que eu me esqueça...</title><content type='html'>Vou comentar mais sobre a Connection Machine assim que chegar o &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0262580977/103-9106108-8307801?%5Fencoding=UTF8&amp;amp;v=glance"&gt;livro&lt;/a&gt; que eu encomendei. Também pretendo definir, de maneira tentativa, o que são sistemas de processamento paralelo e o que são sistemas distribuídos, quais as diferenças entre eles, e outras considerações taxonômicas. E então chegar num ponto onde eu vou tentar responder, principalmente para mim mesmo, qual é a relevância desses assuntos, hoje e no futuro.&lt;br /&gt;&lt;br /&gt;Mas vai ser assim, aos pedaços, e tudo diretamente da minha cabeça, sem edição. Então não me culpe se você copiar o que eu digo aqui em um trabalho e o professor expressar a frustração dele com muita tinta vermelha. De resto, a caixa de comentários está aí, logo abaixo dos posts.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109226980311295795?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109226980311295795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109226980311295795&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109226980311295795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109226980311295795'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/antes-que-eu-me-esquea.html' title='Antes que eu me esqueça...'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7928488.post-109226958604701223</id><published>2004-08-11T17:01:00.000-07:00</published><updated>2004-08-11T17:13:06.046-07:00</updated><title type='text'>Novidade</title><content type='html'>Não são assuntos realmente novos. As idéias por trás do processamento paralelo são quase tão antigas quanto os computadores em si (lembrando que os computadores analógicos operavam de maneira paralela, por assim dizer). Computação distribuída, apesar de estar na moda, também não é novidade. Sobre processamento maciçamente paralelo existem trabalhos pioneiros como a &lt;a href="http://en.wikipedia.org/wiki/Connection_Machine"&gt;connection machine&lt;/a&gt;, com a qual até o lendário físico &lt;a href="http://www.kurzweilai.net/articles/art0504.html?printable=1"&gt;Richard Feynman&lt;/a&gt; esteve envolvido.&lt;br /&gt;&lt;br /&gt;Por que usar arquiteturas que realizam processamento paralelo ? Intuitivamente, sempre pareceu que ter vários processadores colaborando para uma tarefa comum deveria ser mais eficiente que um único processador trabalhando sequencialmente na mesma tarefa. Imagine, então, se pudéssemos ter dezenas, centenas, quem sabe milhares de processadores trabalhando em conjunto... teríamos um poder de processamento além da imaginação, e poderíamos calcular (computar) várias coisas que são impossíveis hoje em dia.&lt;br /&gt;&lt;br /&gt;Essa foi exatamente a idéia por trás da &lt;span style="font-style: italic;"&gt;Connection Machine&lt;/span&gt;. Mas aí de cara surgiram as dificuldades: a comunicação e coordenação dos processadores se tornaram tão complicadas que o esforço realizado para realiza-las praticamente inviabilizou o projeto. Os projetistas da connection machine tiveram de baixar a bola e pensar mais com os pés no chão, abandonando as idéias iniciais.&lt;br /&gt;&lt;br /&gt;E assim foi a história do processamento paralelo, aparentemente. A promessa é tentadora mas os custos altos demais, o que sobe o nível dos problemas para os quais compensa pagar. Por décadas, os supercomputadores usados em aplicações científicas e militares de ponta utilizaram o processamento paralelo como base para sua eficiência. Mas quem pode pagar por um deles ? Apenas um punhado de gente nos países muito ricos.&lt;br /&gt;&lt;br /&gt;Mas aí apareceram os clusters na história.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7928488-109226958604701223?l=realpar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realpar.blogspot.com/feeds/109226958604701223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7928488&amp;postID=109226958604701223&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109226958604701223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7928488/posts/default/109226958604701223'/><link rel='alternate' type='text/html' href='http://realpar.blogspot.com/2004/08/novidade.html' title='Novidade'/><author><name>tautologico</name><uri>http://www.blogger.com/profile/03658701069636639534</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
