29 de dezembro de 2006

Linux X Windows

Como o leitor pode notar, este é o terceiro artigo deste blog que trata de algum tipo de comparação. Mas não podia deixar de ser...

(Nota: o termo correto é "GNU/Linux", mas pra fins de simplicidade utilizarei neste texto apenas o nome "Linux")

Talvez mais do que Java ou C? ou Engenharia ou Ciência?, a discussão que eu mais tenha presenciado (e participado) nos últimos quatro anos - durante os quais estou cursando a graduação - tenha sido sobre comparações entre Linux e Windows.

99,9% das pessoas no mundo conhecem o Windows. E 99,9% desses 99,9% pensam que o Windows é o único sistema operacional que existe.

Pra muita gente, ele é o ar que o computador respira. Alguns chegam a acreditar que o Windows faz parte dos computadores; seria uma "peça" essencial ao seu funcionamento, como a placa mãe ou o monitor.

- Ih... O Windows "deu pau"? Troca de computador!

Pra quem não sabe, o Linux é um sistema operacional também. E bom. E grátis! :-)

Um Pouco Da História Do Linux

O Linux não nasceu como um projeto sério e ambicioso, mas como um hobby. Em 1988, um rapaz chamado Linus Torvalds começou a estudar Ciência da Computação da Universidade de Helsinki (Finlândia), e, depois de adquirir um computador Intel 386, começou a utilizar o Minix - um "mini"-sistema operacional baseado em Unix (este, por sua vez, um sistema operacional proprietário) e criado para fins didáticos pelo então professor Andrew Tanembaum.

Linus não gostava muito do Minix; além disso, precisava de um sistema que emulasse terminais, para poder se conectar aos computadores da universidade, e o Minix não tinha essa capacidade. E Andrew Tanembaum não permitia que outras pessoas fizessem modificações em seu sistema.

Por isso, em 1991, Linus resolveu criar ele mesmo um sistema operacional - que fosse mais eficiente que o Minix e que tivesse a capacidade de emular terminais. Em agosto daquele ano, Linus enviou o email abaixo para a lista de discussão sobre Minix na universidade:

From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Newsgroups: comp.os.minix
Subject: What would you like to see most in minix?
Summary: small poll for my new operating system
Message-ID: <1991aug25 .205708.9541="" klaava.helsinki.fi="">
Date: 25 Aug 91 20:57:08 GMT
Organization: University of Helsinki

Hello everybody out there using minix -

I'm doing a (free) operating system (just a hobby, won't be big and
professional like gnu) for 386(486) AT clones. This has been brewing
since april, and is starting to get ready. I'd like any feedback on
things people like/dislike in minix, as my OS resembles it somewhat
(same physical layout of the file-system (due to practical reasons)
among other things).

I've currently ported bash(1.08) and gcc(1.40), and things seem to work.
This implies that I'll get something practical within a few months, and
I'd like to know what features most people would want. Any suggestions
are welcome, but I won't promise I'll implement them :-)

Linus (torvalds@kruuna.helsinki.fi)

PS. Yes - it's free of any minix code, and it has a multi-threaded fs.
It is NOT protable (uses 386 task switching etc), and it probably never
will support anything other than AT-harddisks, as that's all I have :-(.


Traduzindo:

Olá a todos os que estão usando o Minix,

Estou trabalhando num sistema operacional (livre) (apenas um hobby, não é pra ser nada grande e profissional como o gnu) para máquinas AT 386 (486). Está sendo desenvolvido desde abril e começando a ficar pronto. Eu gostaria de receber informações sobre o que as pessoas gostam/não gostam no Minix, pois meu sistema se assemelha com ele em alguns aspectos (tem o mesmo projeto físico do sistema de arquivos (por razões práticas), entre outras coisas).

Atualmente, já "portei" o bash (1.08) e o gcc (1.40), e parece ter funcionado. Isso significa que, em poucos meses, terei algo prático, e gostaria de saber que características as pessoas querem. Toda sugestão é bem-vinda, mas eu não posso prometer que irei implementá-las. :-)

Linus (torvalds@kruuna.helsinki.fi)

PS. Sim - ele é livre de qualquer código Minix, e possui um "fs" multitarefa. Ele NÃO é portável (utiliza escalonamento 386, etc), e provavelmente nunca suportará discos rígidos que não sejam AT, já que são tudo o que eu tenho :-(.


(Nota: Pra falar a verdade, não tenho certeza do que siginificaria esse "fs", e por isso deixei entre aspas; mas creio que Linus estivesse se referindo ao "sistema de arquivos", ou "file system".)

Linus lançou a primeira versão do Linux (0.01) em setembro de 1991. Em 1994, veio a versão 1.0. Atualmente, já está disponível a versão 2.6.

Linus não tinha ambições comerciais com seu projeto. Ele o disponibilizou ao público sob a licença GPL (General Public License), o que significa que o sistema pode ser modificado por qualquer pessoa. De fato, o Linux chegou ao estágio atual graças às contribuições de milhares de programadores ao redor do mundo, dedicados a trabalhar de graça para melhorá-lo cada vez mais.

Distribuições e Kernel Linux

Quando se fala em Linux, geralmente se confunde distribuição Linux com kernel Linux.

Na verdade, o Linux em si é um kernel (ou núcleo). Ele é uma camada de software que provê, por exemplo, o acesso ao sistema de arquivos, manipula e escalona processos, gerencia a memória e os dispositivos de entrada/saída, entre outras funções críticas e essenciais ao funcionamento de um computador.

Mas, para que esse kernel tenha alguma utilidade para o usuário, é preciso que algum software aplicativo rode sobre ele. As distribuições Linux nada mais são do que conjuntos de software's aplicativos adicionados ao núcleo.

Existem centenas de distribuições disponíveis atualmente (como Debian, Fedora, Suse, Mandriva, etc), que podem ser adquiridas através de download pela internet ou em cd's e dvd's (geralmente como encarte em revistas especializadas). Cada uma delas possui um conjunto de aplicativos diferente, além do kernel obviamente. Algumas empresas, como a Novell ou a Red Hat, vendem kits compostos de cd/dvd e manual do usuário, além de oferecem suporte técnico e garantia.

O kernel e várias distribuições podem ser baixados gratuitamente da internet, mas não há suporte técnico nem garantia. No entanto, pelo fato de o kernel Linux ser open source (código aberto) e desenvolvido pela comunidade, existem literalmente milhares de fóruns sobre ele e suas distribuições na internet, onde é quase impossível não obter respostas para dúvidas ou soluções para os problemas encontrados.

Mas cadê a comparação?

Até o momento só falei do Linux. De fato, o Windows é tão conhecido que, creio eu, dispensa explicações.

Mas, em termos de comparação, pode-se o Linux tem tomado um espaço cada vez maior. Já há alguns anos, por exemplo, ele vem sendo muito utilizado em servidores de empresas, por ser:

- Estável
- Seguro
- Adaptável
- Gratuito

No entanto, até há pouco tempo, era um sistema bastante difícil de ser utilizado pelo usuário comum, acostumado ao ambiente intuitivo do Windows. Além disso, a maioria dos dispositivos no mercado (placas de vídeo, modems, etc) eram ou tinham seus drivers projetados especificamente para as bibliotecas Windows, o que trazia a necessidade da criação apressada de drivers para Linux assim que o dispositivo era lançado e os problemas de compatibilidade eram constatados.

Mas, nos últimos anos, com o crescimento da comunidade usuária do Linux e com o incentivo de grandes empresas - que viram nessa comunidade um grande mercado -, muitos fabricantes têm inclusive oferecido drivers Linux junto com seus dispositivos.

Além disso, os vários ambientes gráficos desenvolvidos para esse sistema (sendo os mais conhecidos o Gnome e o KDE) estão cada vez mais intuitivos e fáceis de usar, o que atrai cada vez mais usuários que não tenham conhecimento profundo em computação e queiram apenas desfrutar das capacidades de seus computadores.

(O desenvolvimento do Linux chegou a tal ponto que, agora, não se pode mais alegar dificuldades de uso ou falta de compatibilidade como desculpa para não querer, ao menos, conhecer o sistema.)

Hoje, temos em lados opostos dois grandes sistemas operacionais que têm cada um seus defeitos e suas qualidades.

O Linux tem, provavelmente, como principal vantagem o custo zero (sua licença, como já foi dito, é gratuita, enquanto o Windows, dependendo da versão, pode custar centenas ou até milhares de reais). Além disso, é considerado por alguns como um sistema mais seguro e estável que o Windows. E, por ser mantido pela comunidade - e não por uma organização individual -, acredita-se que seus problemas sejam detectados e corrigidos com mais rapidez.

No entanto, pesa a favor do Windows o suporte técnico especializado (apesar de algumas distribuições Linux, como mencionado anteriormente, serem oferecidas com suporte também, e por um preço geralmente menor), além da identificação maior com os usuários, já que ele - ainda - é o sistema operacional mais utilizado por usuários domésticos no mundo.

Outro fator importante é a maior oferta de aplicativos mais sofisticados (como jogos em realidade virtual, software's multimídia, etc) para Windows do que para Linux. Apesar de as distribuições Linux virem com centenas ou até milhares de aplicativos para todos os gostos (muitos com qualidade excelente), boa parte desses programas é pouco conhecida ou possui baixa confiabilidade. A tendência, entretanto, é que grandes fabricantes de software lancem programas cada vez melhores para Linux.

Fica a cargo do usuário, portanto, decidir qual dois dois sistemas vale mais a pena (ou qual deles é o "melhor"). Muitos, como eu, utilizam os dois sistemas em conjunto, aproveitando seus pontos fortes em cada situação.

O importante, nese caso, é experimentar; baixar alguma distribuição da internet ou adquirir seu CD/DVD (recomendo o Suse, mas é apenas uma questão de gosto), instalá-la (se você não entende de computação, ou entende mas tem medo de fazer bobagem, peça ajuda para aquele seu amigo de óculos que nunca sai de casa e só tira dez), e começar a usar.

Portanto, mãos à obra!

27 de dezembro de 2006

Até os melhores engenheiros erram...



(Artigo copiado do meu blog pessoal)

O robô (ou "robozinho", para os mais íntimos) acima se chama ASIMO. É incrível como nós, humanos, passamos a sentir pena de uma maquininha quando ela demonstra ser parecida conosco. Se fosse uma máquina de lavar roupa, duvido que o leitor dissesse algo como "tadinha da máquina de lavar roupa" depois de ver este vídeo...

Mas precisamos já ir nos acostumando. O futuro do mundo pertence aos robôs. Alguns dizem que eles adquirirão inteligência própria e livre-arbítrio, o que significa que eles passarão a não gostar mais da gente e sairão matando todo mundo a torto e direito. Se você duvida, caro leitor, assista então a O Exterminador do Futuro I, II e III e você entenderá o quanto nossos dias serão sombrios quando isso acontecer!

ASIMO com certeza irá voltar (I'll-BE-BA-CK-!), e chamará todos os seus colegas de exército para destruir a humanidade em vingança à humilhação sofrida nesse envento da Honda. Pode apostar.

26 de dezembro de 2006

Java ou C?


Bom, continuando a seção tira-dúvidas...

Uma pergunta bastante comum entre estudantes da área de computação é: "qual a melhor linguagem, Java ou C?"

Não há uma resposta simples pra essa questão. Na verdade, não há uma só resposta; as duas linguagens podem ser uma melhor que a outra, dependendendo das circunstâncias.

C é uma linguagem relativamente antiga ("relativamente" porque, na tecnologia, nada consegue se manter novo por mais do que alguns dias). De acordo com a Wikipedia, a linguagem foi criada em 1972, por Dennis Ritchie (atenção amantes da programação: vale a pena clicar no site desse cara!).

É uma linguagem procedural - ou seja, seu foco está não nos dados, mas nas ações (ou procedimentos) sobre esses dados. Por ser eficiente e gerar programas que rodam com bom desempenho, C se tornou rapidamente popular, e até hoje é muito usada, principalmente na programação de sistemas operacionais, já que as rotinas executadas por esses sitemas - como escalonamento de processos, alocação de memória, interfaceamento de dispositivos, etc - exigem o máximo de rapidez e simplicidade. Muitos a consideram não apenas uma, mas a linguagem de programação.

Para o tipo de desenvolvimento de software aplicativo utilizado nos anos 70, C era suficiente. No entanto, com o aumento da complexidade dos programas e com a perpepção de que milhares de linhas de código envolvendo centenas de funções não são nada fáceis de entender, manter e modificar, ganhou força o conceito de Programação Orientada a Objetos.

(Esse conceito já existia há bastante tempo, e baseava-se em um tripé que praticamente transformou o mundo da programação: o encapsulamento, a herança e o polimorfismo.)

É interessante, portanto, acrescentar à "disputa" uma terceira linguagem de programação. Por volta de 1980, Bjarne Stroustrup (não é preciso entender o nome) criou uma espécie de linguagem C "adaptada" para a orientação a objetos, que ele inicialmente chamou de "C com classes". Mais tarde ela recebeu o nome de C++. C++ possui as mesmas funcionalidades de C, mas com a vantagem de suportar a programação genérica, a orientação a objetos e a abstração de dados. De acordo com o próprio Bjarne Stroustrup, C++ é basicamente uma "linguagem C melhor que a linguagem C".

Java, por sua vez, é mais "novinha". Nasceu por volta de 1990, na Sun Microsystems.

Apesar de ter uma sintaxe bastante semelhante à das linguagens C e C++, Java possui algumas características que a tornam única.

A mais conhecida delas é a portabilidade. Todos os programas escritos em Java (chamados de classes) são compilados em códigos chamados de bytecodes, que por sua vez rodam em cima da Java Virtual Machine (JVM) - ou Máquina Virtual Java, em português. A JVM é, basicamente, um programa de computador que traduz os bytecodes, em tempo real, para instruções da máquina sobre a qual o programa deve rodar. Para cada arquitetura de processadores existente no mercado, desde o mais simples telefone celular até os potentes processadores com núcleo duplo, existe uma implementação da JVM.

Para os bytecodes, a máquina é sempre a mesma. Um inteiro tem sempre X bits, um número de ponto flutuante tem sempre Y bits, e as instruções são sempre as mesmas. É a JVM que se encarrega de manipular esses parâmetros, para que os bytecodes de fato funcionem. E é isso que permite que uma classe Java rode tão bem num Pentium II quanto num Atlhon 64.

No entanto, para fazer essa "tradução" em tempo real (ou interpretação) de bytecodes para a linguagem de máquina real, a JVM também consome tempo e processamento; por isso, os programas Java geralmente têm um desempenho inferior, em termos de velocidade de execução, a programas similares escritos em C ou C++.

Mas, se Java é mais "lenta", por assim dizer, porquê é que ela conquistou tanto espaço entre os programadores?

Bem, a portabilidade não é a única característica que se destaca em Java. Java é também uma linguagem 100% orientada a objetos. Isso significa que qualquer programa, até mesmo o mais simples "Hello world!", é definido como um objeto. Esse paradigma força o programador a escrever códigos mais curtos, divididos em classes, que são muito mais fáceis de entender, manter e modificar. E isso é bastante atraente.

As classes Java também são facilmente reutilizáveis. Por exemplo: um engenheiro pode escrever uma biblioteca de classes Java que executem o cálculo de integrais e derivadas, transformações lineares, etc, para utilizá-las no projeto de um aplicativo voltado à engenharia. Mais tarde, se um matemático pedir que um programador escreva um aplicativo que execute esses mesmos cálculos, basta que o programador "empreste" a biblioteca e escreva uma intrerrface mais voltada ao problema em questão.

Java também possui regras rígidas com relação à segurança dos dados. Manipulações por meio de ponteiros, por exemplo, não são permitidas.

Outro recurso interessante de Java é o "coletor automático de lixo" (garbage collector), que se encarrega de verificar, em tempo de execução, se existem referências a variáveis que não estejam sendo mais utilizadas (e, portanto, desperdiçando memória); quando o garbage collector encontra alguma dessas referências, ele a descarta automaticamente, liberando a memória que estava sendo desperdiçada. Ou seja, ao mesmo tempo em que perde desempenho por causa da necessidade de interpretação dos bytecodes, Java utiliza de forma mais eficiente a memória disponível.

Enfim, não há como definir a "melhor" linguagem de programação entre Java e C ou C++.

Java possui grande portabilidade (em tempos de Internet isso é bastante importante), mas C e C++ oferecem acesso a recursos de hardware que Java não oferece. Java é organizada, mas o excesso de regras pode aborrecer alguns programadores.

O fato é que essas três linguagens continuam sendo utilizadas a todo vapor, e não há perspectiva de que tão cedo elas sejam abandonadas.

Para entender mais sobre cada uma delas, recomendo os livros abaixo (há vários outros, mas estes foram os que me vieram primeiro à cabeça), que podem ser emprestados em bibliotecas universitárias ou adquiridos nas boas livrarias (edições mais recentes):

C Completo e Total 3a Edição - Herbert Schildt

C++ How to Program, 5/e (Deitel & Associates)

Java How to Program, Sixth Edition (Deitel & Associates)


Na internet há também vasta quantidade de informação sobre o assunto. Dennis Ritchie disponibiliza em seu site bastante informação sobre a linguagem C. No site de Bjarne Stroustrup encontra-se tudo sobre a linguagem C++. E, na página de Java da Sun Microsystems pode-se encontrar vários artigos e tutoriais sobre a linguagem.

Um dia de blog!

Hoje, o Blog do Engenheiro de Computação completa o seu segundo dia de vida! E, contrariando as expectativas, recebeu nada menos do que 4 comentários!

O leitor deve estar me achando louco (por que o editor do blog está comemorando 4 comentários?), mas o ponto de exclamação acima tem um motivo muito simples: estamos na semana que separa as festas de natal das festas de fim de ano, e encontrar alguém na internet nesse período (além do editor do blog, claro, que é viciado em internet) é tarefa quase impossível. Nestas circunstâncias, 4 comentários (e nenhum xingamento!) é motivo pra comemorar!

A todos os que visitaram o blog, deixo aqui meus sinceros agradecimentos pela atenção e interesse. Sejam sempre bem-vindos!

25 de dezembro de 2006

A Engenharia de Computação


Desde que entrei no curso de Engenharia de Computação da UFPA, no primeiro semestre de 2003, tenho ouvido por várias vezes, de amigos ou conhecidos, basicamente três perguntas:

1) Qual a diferença entre a Ciência e a Engenharia "da" Computação?
3) O que um estudante de Engenharia de Computação estuda?
2) O que um Engenheiro de Computação faz?

Tentarei, a seguir, esclarecer essas dúvidas (espero não confundir ainda mais a cabeça do leitor...)

Diferenças?

Na verdade, o mais interessante não é saber as diferenças entre esses dois cursos, mas sim as suas semelhanças...

A Engenharia de Computação (ou "da" Computação) é um curso de graduação cada vez mais conhecido no Brasil, apesar de existir há um tempo relativamente longo (na Unicamp, por exemplo, o curso é ofertado desde 1990).

Sua concepção engloba duas vertentes de conhecimento que, com a evolução dos computadores, passaram a caminhar cada vez mais próximas: a informática e a eletrônica. Na verdade, há muito tempo uma vem precisando da outra; usam-se computadores para projetar circuitos eletrônicos de alta complexidade e, por outro lado, computadores nada mais são do que conjuntos de circuitos eletrônicos trocando impulsos elétricos entre si (falando assim parece até fácil...)

Em termos simples, pode-se dizer que a Engenharia de Computação é uma espécie de mesclagem entre a Engenharia Elétrica e a Ciência da Computação. No entanto, não se deve levar em conta unicamente esse conceito; apesar de abordar assuntos dos dois cursos citados, a Engenharia de Computação é um curso com "identidade própria".

O que um estudante de Engenharia de Computação estuda?

O currículo do curso pode variar de acordo com a instituição, mas geralmente abordará disciplinas matemáticas (como Cálculo, Álgebra Linear, Matemática Discreta, Cálculo Numérico, etc), de eletricidade/eletrônica (Eletricidade básica, Eletrônica Digital, Eletrônica Analógica, Microprocessadores, etc) e de informática (Algoritmos e Programação, Bancos de Dados, Redes de Computadores, etc).

Nos semestres finais, serão vistas disciplinas que abrangem todas ou várias das áreas de conhecimento estudadas no decorrer do curso. Por exemplo, a disciplina Processamento Digital de Sinais exige conhecimentos em Cálculo, Álgebra Linear, Probabilidade e Processos Estocásticos. Já a Engenharia de Software exige que o aluno tenha conhecimentos de Algoritmos e Programação, Análise e Projeto de Sistemas de Software, Bancos de Dados, entre outras.

Eu poderia citar vários outros exemplos aqui, mas isso tomaria muito espaço do texto - e entediaria o leitor...

O que faz um Engenheiro de Computação?

Em termos de mercado, o Engenheiro de Computação tem ótimas perspectivas. Grandes empresas, como a IBM ou a Lucent Technologies, oferecem vagas de estágio com boas possibilidades de efetivação para estudantes de Engenharia de Computação no Brasil. As universidades também oferecem estágios, além de bolsas de iniciação científica. E, depois de formado, o Engenheiro de Computação poderá atuar em várias áreas, como:

- Telecomunicações;
- Gerência de desenvolvimento de software;
- Administração de bancos de dados;
- Automação e controle;
- E vários outros...

Há ainda a possibilidade de se fazer pós-graduação (mestrado e doutorado), inclusive no exterior. Boas instituições estrangeiras oferecem bolsas de intercâmbio para alunos de graduação e pós-graduação em Engenharia de Computação.

Enfim, o curso de Engenharia de Computação é uma ótima escolha tanto para aqueles que gostam e se interessam por informática, tecnologia, eletrônica, quanto para quem ainda não sabe bem que área seguir mas quer se dar bem no mercado.

No entanto, é bom frisar: gostar da própria profissão é fator essencial para ser um bom profissional.

Portanto, se você está se preparando para entrar na faculdade e ainda está escolhendo que curso irá fazer, não se deixe levar apenas por questões de mercado; o curso é difícil e exige muita dedicação e vontade.