Renascendo - ou Os Desafios de aprender C e C++

Oi pessoal,

Tem um bom tempo que não escrevo nesse Blog. Muita coisa aconteceu desde que criei o primeiro post. Quando comecei, imaginei usar a biblioteca do Ogre e o SDL para criar um game simples, que pudesse ser usado como tutorial e alguém pudesse aprender alguma coisa com isso.

A idéia central era "ensinar enquanto aprendia", assim todos poderiam aprender juntos. Porém, por razões pessoais e profissionais, eu não conseguia ter mais tempo livre para estudar o Ogre e o SDL, então por consequência acabei parando de escrever aqui.

Embora eu tenha deixado essas duas bibliotecas um pouco de lado, meu interesse em C/C++ não diminuiu e eu continuei estudando sempre que podia. Peço desculpas por não compartilhar meu progresso por aqui, porque pensei que como o que eu estudava não estava diretamente relacionado à proposta de um game 3D, pensei que aqui não seria o lugar correto para escrever.

Aprendi nesse processo que o desafio de aprender C e C++ está muito além da linguem em si. As linguagens são fáceis. Não muda muita coisa em relação a todas as outras. O desafio, na verdade, é que para aproveitá-las ao máximo você precisa estudar os fundamentos do funcionamento de um computador. Precisa voltar um pouco na história, ver o contexto em que elas foram criadas, daí a coisa começa a fazer mais sentido.

Outra grande dificuldade é que não existe um repositório central de informações sobre C. Diferentemente do PHP, por exemplo, que possui o manual no php.net, com tudo explicadinho e cheio de exemplos, com o C a gente precisa fuçar muito mais. Em geral, os tutoriais na internet são básicos, explicam o uso das funções e tal, mas em lugar algum você vai achar exemplos avançados, a não ser que baixe o código de programas open-source pra estudar.

Não estou com os links de todas as referências que andei fuçando (fica para um próximo post), mas pra quem tem interesse nos fundamentos, passo o link do livro do Dennis Ritchie, criador da linguagem C. Passo também o link do Gwan, hoje o servidor web mais rápido do mundo, que permite que você escreva em C direto, sem compilar (você salva o arquivo, o servidor compila em real-time e voilà, seu programa tá funcionando). Finalmente, pra quem quiser fuçar o código-fonte de alguma coisa, é interessante olhar a evolução da linguagem de programação Lua, que foi feita em C. O código fonte está aqui, recomendo baixar o lua-all.tar.gz e ler o documento em que os criadores descrevem sua evolução.

Vou tentar pegar um tempo livre nesse final de semana pra migrar esse blog para Wordpress e dividí-lo em duas partes: uma para os fundamentos da linguagem e outra para o tal do game 3D que todos estão esperando. Espero poder cumprir minha missão dessa vez, sem interrupções.

Abraço a todos,
Rafael

Comentários

Anônimo disse…
Olá, Mestre (estou com preguiça de voltar a página e ler vosso nome ;-).
Você que trabalha nesse badalado mundo de programação, o que tem visto no mercado no que se diz respeito a essas duas linguagens, principalmente C? Não sou fanboy nem atendente de suporte técnico... mas absolutamente não tenho visto empregos que peçam C ou C++. Ao contrário, dá impressão que estamos regredindo aprendendo estas línguas, pois precisa-se de Java aqui, php ali, .Net, .Ado, ASP. etc etc etc. Sente-se ainda firme nesta empreitada desafiadora em um mundo cada vez mais das linguagens gerenciadas? Um abraço.
Rafael Beckel disse…
Olá anônimo...

Bom, acho que a grande motivação pra se aprender C/C++ (ou qualquer outra linguagem) definitivamente não deve ser apenas mercado de trabalho.

A popularidade do C para softwares corporativos pode até cair, porque em outras linguagens você desenvolve mais rápido e a velocidade de execução não é um fator crítico. Porém, o C não deixará de ser usado para aplicações de missão crítica, como transações na Bolsa de Valores, por exemplo.

Entenda que numa aplicação que a cada segundo são negociados Milhões de R$, cada milissegundo de desempenho que seu código ganha faz muita diferença no bolso de muita gente. Essa diferença de milissegundos não consegue ser ganha em Java ou PHP, por exemplo.

Outro caso em que o C/C++ é muito popular é no mercado de games. As melhores engines são feitas em C, e não vão deixar de ser, porque você precisa calcular iluminação, partículas, câmera, textura, coordenadas, som, física, input do jogador, inteligência artificial e mais algumas outras coisas para centenas de milhares de polígonos no mínimo 30 vezes por segundo. Esse desempenho para gráficos mais realistas só se consegue em C/C++.

Outros exemplos são Sistemas Operacionais (não só Linux, Windows e Mac OS; pense também no SO do robozinho que foi pra Marte, da sua televisão, do elevador do seu prédio e até das maquininhas de café).

Navegadores de Internet, Processadores de Texto e mais uma infinidade de aplicativos que usamos diariamente tem o C/C++ nas suas entranhas.

Quanto ao emprego, sempre vão existir programas feitos em C que precisam de manutenção e upgrade. E se a quantidade de pessoas interessadas em C diminui, o valor (e o salário) das que se interessam aumenta bastante.

Pra concluir, independentemente do mercado de trabalho ou do que se possa fazer com a linguagem, no final das contas não é a linguagem que importa; e sim o que você quer fazer com ela. A linguagem é só uma ferramenta. Nenhuma ferramenta no mundo é a melhor para TODOS os casos. Portanto, procure aprender por curiosidade, por prazer, por satisfação pessoal e se divirta ao longo do caminho. Se não há o desejo de aprender dessa forma, mesmo que vc arrume um emprego na área vc não vai ser feliz nessa profissão.

Abração, boa sorte aí no aprendizado e na procura do trampo. ;)
icaro disse…
Este comentário foi removido pelo autor.
icaro disse…
digamos q eu aprendi o c/c++ como eu posso aplicalo no game e postalo dps do fato d eu ter aprendido todos os termos de criar e c/++ e sem esquecer q sou iniciante como eu posso colocalo,mestre?
Rafael Beckel disse…
Este comentário foi removido pelo autor.
Rafael Beckel disse…
Oi Ícaro, td bom?

Não entendi direito a pergunta, mas para publicar um game, você vai precisar de muito mais do que só a programação. Precisa de uma equipe de programadores e artistas, dinheiro e um publisher. Se quiser fazer um game sozinho, a ferramenta correta não é o C/C++; vc deve usar Unity (http://unity3d.com) ou Flash.

Espero ter ajudado.

Abraço
icaro disse…
eu queria fazer eu jogo estilo o
crossfire on-line,sabe level up e
3d suponho q o flash nao daria pra fazer um jogo iper ne intao q q eu posso fazer?mestre.
precisaria de um progama iper bom nao e?
icaro disse…
a e eu queria perunta se vc tem outro blog em outro lugar.
icaro disse…
e eu queria dizer se nao seria mais facil se vc colocase um video
pra quelas pessoas com o raciosinio fraco como eu pq eu nao entendi ja li tudo tipo, todos os cliks todos os links vi todos os dowloads mas nao consigo entender por causa q eu sou mais ou menos iniciante e nao entendo nada sobre o caso do c/c++ entao se vc puder postar um video de como vc fez para postar,os movimentos,os artistas por causa q eu nao sei como fazer isso entendi.
li tudo q vc colocou as escritas os cliks e os em destak eu queria pedir um favor,eu so das pessoas que tem um raciosinio fraco e muito lento como uma tartaruga eu tenho vontade e prazer e mais do q satisfasao mas fiko triste por saber q nao consigo colocar o q aprendi em jogo entao se vc puder mostar os dowloads as manutenções e poder me mostrar como por tudo em jogo e postar o jogo por favor rafael(mestre), pesso q vc poste videos com cada detalhe agradesso mestre obrigado icaro
icaro disse…
a para ter uma idea eu queria criar um jogo tosco pelo comeso um counter strike com level up
SergioLB disse…
Bom dia Rafael,
estou começando a entender o C/C++,
e o vosso comentario ao anonimo me
ajudou muito.



abraço.
Rafael Beckel disse…
Oi Icaro,

Recomendo você baixar o Unity em http://unity3D.com, tem vários vídeos tutoriais ensinando como faz. Dá pra fazer jogos muito bons, com a qualidade dos que vc quer fazer.

Tem vários vídeos tutoriais em português para Unity, dá uma procurada no Youtube que vc encontra. Segue o link de um deles: http://www.youtube.com/watch?v=KN2dynRPi8c

Abraço
Rafael Beckel disse…
Oi Sérgio... bom saber que estou ajudando alguém, nem que seja num comentário. Eu quero muito dar continuidade a esse blog, postar mais tutoriais, vídeos, etc. Assim poderei ajudar mais ainda. ;)

Vida profissional, filho que vem em janeiro, lar e estudos não me ajudam com esse blog; mas espero transformar ele em algo mais útil para as pessoas. Pode demorar, mas um dia sai, com certeza. =)
RAFAELA SOUZA disse…
gostaria muito de saber mais sobre essa linguqgem, estou com dificudades na faculdade, faço estrutura de dados I, e usamso a liguagem c++, preciso de ajuda!!!
Matheus Santana disse…
Pessoal, eu também estou estudando C++ e, visto que o autor do blog não tem postado frequentemente, uma referência que pode ajudar a todos nós é http://www.cprogramming.com/tutorial/lesson1.html .

Tenho estudado por esse tutorial e acho que é atual, simples e completo. A única desvantagem é a língua - pra quem não manja de inglês.

Abraços.
Anônimo disse…
cara sou doente por engenharia eletrônica e para ficar digamos completão quero aprender engenharia de software para quem sabe no futuro eu mesmo projetar do zero meu propio pc não só pc como outros eletrônicos eletrônica ja entendo bastante não a nível de um engenheiro eletrônico ainda! mais entendo muito como funcionam as coisas você saberia me responder como surge os botôs virtuais ìcones janelas de um sistema operacional ja que são apenas códigos ? tudo bem que o código será convertido para a linguagem da máquina mais como funciona isso ? como funciona esse negócio de interface ? pô cara me dá essa ajuda ae valeu ? tipo como aparece a interface com tudo bonitinho linhas perfeitas me ajuda cara
Rafael Beckel disse…
Olá, Anônimo, tudo bom?

Para converter os códigos em pixels para formar as janelas, o programa usa algumas facilidades das bibliotecas do próprio sistema operacional, que usa os drivers que são fornecidos pelo fabricante do hardware (placa de vídeo e monitor). O programador geralmente não se preocupa com isso, pois existem métodos prontos nessas bibliotecas que vocẽ chama no seu código e a janela aparece magicamente, do jeito que você definir (coordenadas, tamanho, aparência, etc.).

A baixo nível, o programa usa uma Array (coleção) de bytes, onde cada 4 bytes representa 1 pixel. Os valores desses bytes (0 a 255) representam os níveis de 1:Vermelho, 2:Verde, 3:Azul e 4:Alpha (transparência) de cada pixel da tela.

As coordenadas X e Y de um pixel são calculadas multiplicando o valor X que você quer por 4, daí você tem o primeiro byte vermelho do X. Depois multiplica-se esse valor pelo Y que você quer para achar o primeiro byte vermelho do Y.

Claro que não vamos fazer tudo isso na mão, do zero. Existem bibliotecas prontas (e muito boas) para desenhar janelas, como a WxWidgets, que desenha para TODOS os sistemas operacionais e é de graça. Também tem a QT, da Nokia e a GTK+. Existem programas para desenhar interfaces de uma forma mais visual, onde vocẽ "monta" suas janelas arrastando os componentes e ele gera o código para você.

Você também pode usar o que o seu sistema operacional te oferece, mas assim você limita seu programa a rodar apenas no sistema que você está usando. No Windows, tem a biblioteca Win32 e vários programinhas para montar interfaces. Para Mac, existe as bibliotecas Cocoa e Carbon, que vêm com o Xcode (ambiente de desenvolvimento para Apple). Com o Xcode você também desenvolve para iOS (iPhone e iPad). Para Linux existem várias, dependendo do sistema de interfaces que vc usa (como KDE e Gnome), mas geralmente o pessoal usa GTK+ mesmo (já citada acima) que abstrai isso.

Se vc deseja manipular os pixels mais diretamente, existem outras bibliotecas, como a SDL (que já foi abordada aqui nesse blog) e a SFML, mas isso é assunto para outra pergunta.

Você acaba de me dar a ideia de transformar esse blog numa espécie de "perguntas e respostas",onde para cada resposta eu escreveria um post novo. Assim acho que eu atualizaria ele mais. Já migrei ele pro Wordpress, mas não fiz a migração ainda. Com filho vindo aí, fica bem difícil, mas um dia vou arrumar tempo (sempre digo isso) se Deus quiser.
Rafael Beckel disse…
@Matheus Esse foi um dos tutoriais que usei pra aprender. Falei dele em um dos primeiros posts desse blog. É uma excelente dica para quem sabe inglês. =)

Abraço
Anônimo disse…
cara agradeço a vc ae pela resposta das interface
Anônimo disse…
Oi Rafael, estou começando agora, ou a poucos dias para ser mais exato, me indicaram aprender primeiro pascal por ser linguagem fácil e de aprendizado e logo que dominar o pascal ir para o C++
sabe, andei compilando códigos de C#, um servidor ou emulador de um jogo para poder jogar em single player e vi que ele é meio parecido com java e c++ além de ter direcionado a objeto.

Queria muito aprender, mas esses tutorais que vejo pela net são complicado, complexo, não ensina nada para quem nunca mexeu com a linguagem propriamente dita (leigo dos leigos) vamos dizer assim.

sem contar os livros que são muito, mas muito caro.. um livro do visual C# por exemplo ta custando mais que 200 reais.

como eu posso usufruir desses tutorais e ter uma noção clara e tirar aproveito sem me esforçar, pq ta difícil de mais.. pra vc ter uma idéia.. em 2003 comecei mexer com debugger em assembly sem saber nada de nada e hoje tenho uma noção 70% e C/C++/C# ta difícil de mastigar e engolir, assim como object pascal, visual basic..


falta mesmo é um tutorial didático e claro para leigo


Abraços
Unknown disse…
Já fiz um jogo mas não acabei..eu fazia em unity3D a plataforma o de era que se colocava o cenário .para renderizaçao e criação de objeto e char eu usava o blender 3D ..e para a texturização eu usava o gimp ..a programação que tinha era Java script ,C#.e outras eu programava com tutorias no YouTube fui pegando já que tinha a base no c++ foi mais fácil.... Do que como era somente eu trabalhando nisso eu cancro comecei uns 3 jogos e larguei..fiz de parkour.fiz um de terror e selva de tiro ..bom..e outro um cenário q vc caminhava num campo cheio de arvores e escuro.e tinha uma arma com laser pra matar demônios
Rafael Beckel disse…
Oi anônimo,

De fato, a falta de materiais bons para leigos dificulta um pouco, mas não impossibilita. Com persistência, dá pra superar as principais dificuldades, daí depois parece que as coisas ficam mais fáceis depois que você tem um daqueles momentos "A-HA"!.

Eu vou tentar retomar esse blog com mais calma para escrever o que eu acho que falta enquanto estava aprendendo (e ainda estou, sempre). Hoje tenho mais experiência do que naquela época. O que dificultava escrever é que eu pesquisava para poder colocar aqui, hoje tem algumas coisas que já entendo e consigo compartilhar mais rápido.

O primeiro passo vai ser copiar algumas perguntas que me fizeram nesses comentários e transformar em postagens, daí acho que vamos ter um bom material para começar.

Abs
Rafael Beckel disse…
Oi Shake, e aí, como andam os jogos em Unity? Conseguiu concluir algum? Abs

Postagens mais visitadas deste blog

Quarto, quinto... décimo sexto.

Desvendando o SDL (Simple Directmedia Layer)