C++ ou Java para Jogos, por que?

[quote=kicolobo]

O mesmíssimo elevador! :lol:

Eu acho um livro excelente. MUITO bom mesmo pra quem quiser aprender, assim como o Java Como Programar.[/quote]

Blz, eu gostei muito do Java como programar, explica cada detalhe, tem varios exercicios, excelente livro, agora é criar coragem pra ler o C++ e ver se aquele elevador sobe ou nao sobe :lol:

No meu site você encontra o RoadMap C++ com dicas de livros desde o básico até o avançado. Sugestão: lá tem o link para o e-book do André Bueno, totalmente gratuito, e de excelente qualidade.

O livro do Stroustrup era tão difícil, que depois que ele virou professor ele percebeu a gafe, e decidiu escrever um novo livro. Se quiser pegar o dele, sugiro que comece por esse aqui: http://www2.research.att.com/~bs/programming.html

Pelo menos nele, os exemplos não serão com trechos de código de analisadores léxicos e compiladores. Fora que ele tem uma cobertura bem melhor da STL e das novas práticas envolvendo C++.

No meu site você encontra o RoadMap C++ com dicas de livros desde o básico até o avançado. Sugestão: lá tem o link para o e-book do André Bueno, totalmente gratuito, e de excelente qualidade.

O livro do Stroustrup era tão difícil, que depois que ele virou professor ele percebeu a gafe, e decidiu escrever um novo livro. Se quiser pegar o dele, sugiro que comece por esse aqui: http://www2.research.att.com/~bs/programming.html

Pelo menos nele, os exemplos não serão com trechos de código de analisadores léxicos e compiladores. Fora que ele tem uma cobertura bem melhor da STL e das novas práticas envolvendo C++.[/quote]

Eu lembro de ter lido o livro do Stroustrup e não achei tão difícil assim.

Agora, ele tem um OUTRO livro, este sim fascinante: “The Design and Evolution of C++”
Nele é descrito como a linguagem C++ foi criada, e porque alguns de seus aspectos são do modo como estão hoje.
É um dos livros mais fascinantes que já li e, numa boa? 90% dos criticismos que já vi sobre C++ são anulados após a leitura deste livro.
Recomendo totalmente, mas infelizmente é bem difícil de ser encontrado.

No meu site você encontra o RoadMap C++ com dicas de livros desde o básico até o avançado. Sugestão: lá tem o link para o e-book do André Bueno, totalmente gratuito, e de excelente qualidade.

O livro do Stroustrup era tão difícil, que depois que ele virou professor ele percebeu a gafe, e decidiu escrever um novo livro. Se quiser pegar o dele, sugiro que comece por esse aqui: http://www2.research.att.com/~bs/programming.html

Pelo menos nele, os exemplos não serão com trechos de código de analisadores léxicos e compiladores. Fora que ele tem uma cobertura bem melhor da STL e das novas práticas envolvendo C++.[/quote]

Eu lembro de ter lido o livro do Stroustrup e não achei tão difícil assim.

Agora, ele tem um OUTRO livro, este sim fascinante: “The Design and Evolution of C++”
Nele é descrito como a linguagem C++ foi criada, e porque alguns de seus aspectos são do modo como estão hoje.
É um dos livros mais fascinantes que já li e, numa boa? 90% dos criticismos que já vi sobre C++ são anulados após a leitura deste livro.
Recomendo totalmente, mas infelizmente é bem difícil de ser encontrado.[/quote]
Não conheço esse livro. Mas vou procurar por ele.

O “Principles and Practice Using C++” é um livro muito bom, apesar de ser de difícil compreenção, como o vini falou. Ele explica praticamente tudo que a linguagem é capaz de fazer, com exemplos.

Eu ressalto ainda a importância de se pegar livros de boas práticas com C++, como o Effective C++ ou o Exceptional C++.

O C++ tem algumas características, que o torna diferente do Java e do C#:
“C++ is designed to give the programmer choice, even if this makes it possible for the programmer to choose incorrectly”

Ou seja, a linguagem é muito poderosa, mas se você não tomar muito cuidado, pode acabar se complicando. As linguagens modernas tentam evitar o erro dos programadores ao máximo, mesmo que isso custe a eles abrir mão de certos recursos.

Com o C++ é ao contrário. Se um recurso pode ter certa utilidade, ele vai estar lá, mesmo que ele seja extremamente perigoso. Você é o especialista, então, é você quem manda.

Exemplos disso no Java é a ausência de sobrecarga de operadores, ou a possibilidade de trabalhar com memória de maneira não-gerenciada, ou uma API que facilite o uso do JNI. No C++, podemos citar a possibilidade de manipular ponteiros diretamente ou de sobrecarregar o new e o delete para escrever, você mesmo, seu próprio memory manager.

O segundo “problema” é também esse aqui:
# C++ is designed to be as compatible with C as possible, therefore providing a smooth transition from C

Ou seja. Por padrão, C++ é compativel com C. Em muitos aspectos, isso é ótimo. Você pode usar livremente bibliotecas do C no C++, como a excelente SDL, ou o próprio DirectX e OpenGL. Entretanto, isso leva a uma desvantagem séria: Muitos recursos estão presentes na linguagem só para manter a compatibilidade com C, não porque seria recomendável utiliza-los. E isso também dá margem a um programador C chegar cheio de vícios no C++, e aplica-los totalmente (como o uso de macros no lugar de funções inline, por exemplo, ou passar argumentos através de ponteiros no lugar de referências const).

Por fim, o último ponto:
C++ is designed to directly and comprehensively support multiple programming styles (procedural programming, data abstraction, object-oriented programming, and generic programming);

Se no Java, quando você tenta misturar 2 paradigmas (o reflexivo e o OO) você já se complica todo, extrapole isso para o C++, que implementa 3 paradigmas: procedural, orientado a objetos e metaprogramação. É importante também ressaltar que o último paradigma é o responsável pela maior parte da evolução do C++ nos últimos anos.

Os livros de boas práticas também mostram que a maior parte da evolução do C++ está nas suas libs, e não necessariamente na linguagem. Hoje, não se fala em criar novos programas em C++ sem usar, por exemplo, os Smart Pointers. E eles praticamente implementam um garbage collector em C++, o que te livra de centenas de dores de cabeça relacionadas a ponteiros. Graças a metaprogramação, evoluções nas bibliotecas do C++ também se aproximam muito de evoluções na própria linguagem. Exemplos disso são as lambda functions da boost, ou o próprio boost for…each. Sem falar claro, nas APIs da boost e STL, que contém uma série de classes que quem costuma falar mal do C++ geralmente ignora solenemente.

O roadmap cobre livros que falam de todos esses tópicos. Após estuda-los você geralmente tem uma vida mais tranquila e feliz com o C++. Muitos dos problemas, especialmente os relacionados a ponteiros, simplesmente desaparecem. Reforçam-se conceitos modernos da linguagem, como constness ou RAII, e tem-se acesso a várias bibliotecas do C++, que facilitam muito o desenvolvimento.

[quote=ViniGodoy]Eu ressalto ainda a importância de se pegar livros de boas práticas com C++, como o Effective C++ ou o Exceptional C++.

O C++ tem algumas características, que o torna diferente do Java e do C#:
“C++ is designed to give the programmer choice, even if this makes it possible for the programmer to choose incorrectly”

Ou seja, a linguagem é muito poderosa, mas se você não tomar muito cuidado, pode acabar se complicando. As linguagens modernas tentam evitar o erro dos programadores ao máximo, mesmo que isso custe a eles abrir mão de certos recursos.

Com o C++ é ao contrário. Se um recurso pode ter certa utilidade, ele vai estar lá, mesmo que ele seja extremamente perigoso. Você é o especialista, então, é você quem manda.

Exemplos disso no Java é a ausência de sobrecarga de operadores, ou a possibilidade de trabalhar com memória de maneira não-gerenciada, ou uma API que facilite o uso do JNI. No C++, podemos citar a possibilidade de manipular ponteiros diretamente ou de sobrecarregar o new e o delete para escrever, você mesmo, seu próprio memory manager.

O segundo “problema” é também esse aqui:
# C++ is designed to be as compatible with C as possible, therefore providing a smooth transition from C

Ou seja. Por padrão, C++ é compativel com C. Em muitos aspectos, isso é ótimo. Você pode usar livremente bibliotecas do C no C++, como a excelente SDL, ou o próprio DirectX e OpenGL. Entretanto, isso leva a uma desvantagem séria: Muitos recursos estão presentes na linguagem só para manter a compatibilidade com C, não porque seria recomendável utiliza-los. E isso também dá margem a um programador C chegar cheio de vícios no C++, e aplica-los totalmente (como o uso de macros no lugar de funções inline, por exemplo, ou passar argumentos através de ponteiros no lugar de referências const).

Por fim, o último ponto:
C++ is designed to directly and comprehensively support multiple programming styles (procedural programming, data abstraction, object-oriented programming, and generic programming);

Se no Java, quando você tenta misturar 2 paradigmas (o reflexivo e o OO) você já se complica todo, extrapole isso para o C++, que implementa 3 paradigmas: procedural, orientado a objetos e metaprogramação. É importante também ressaltar que o último paradigma é o responsável pela maior parte da evolução do C++ nos últimos anos.

Os livros de boas práticas também mostram que a maior parte da evolução do C++ está nas suas libs, e não necessariamente na linguagem. Hoje, não se fala em criar novos programas em C++ sem usar, por exemplo, os Smart Pointers. E eles praticamente implementam um garbage collector em C++, o que te livra de centenas de dores de cabeça relacionadas a ponteiros. Graças a metaprogramação, evoluções nas bibliotecas do C++ também se aproximam muito de evoluções na própria linguagem. Exemplos disso são as lambda functions da boost, ou o próprio boost for…each. Sem falar claro, nas APIs da boost e STL, que contém uma série de classes que quem costuma falar mal do C++ geralmente ignora solenemente.

O roadmap cobre livros que falam de todos esses tópicos. Após estuda-los você geralmente tem uma vida mais tranquila e feliz com o C++. Muitos dos problemas, especialmente os relacionados a ponteiros, simplesmente desaparecem. Reforçam-se conceitos modernos da linguagem, como constness ou RAII, e tem-se acesso a várias bibliotecas do C++, que facilitam muito o desenvolvimento.[/quote]

Vini,

você aprendeu C++ somente lendo e praticando ou fez algum curso específico?

Normalmente a maioria do pessoal que aprendeu c ou c++, aprendeu com livros e usando sistemas unix, que é o meu caso. Na minha época de faculdade, os algoritmos eram implementados em c, mas se podia optar por qualquer linguagem. O objetivo era que o algoritmo fosse implementado corretamente.

Lendo, praticando e me ferrando muito.

C++ é aquela linguagem que você lê, lê, lê, pratica, pratica, pratica e ainda assim tem que ler mais alguma coisa.

Aliás, um ótimo texto sobre Exceptions, recomendado inclusive para quem programa em Java, é o seguinte:
http://www.octopull.demon.co.uk/c++/dragons/

Ele fala de C++ e exceptions, num tom de quem está jogando RPG. Muito bom.

Por favor, não dê falsas idéias a respeito da linguagem. Em C++ não é possível por exemplo gerar seqüências arbitrárias de código trabalhando-se diretamente com a árvore sintática. Logo a metaprogramação é restrita a criar diferentes classes a partir de templates, mais ou menos como um “Generics” que realmente cria uma classe ao invés de usarem erasure e com mais algumas features.

Ou seja, é bem limitado. É mais limitado do que Ruby ou Python. E olha que Ruby e Python já são limitadíssimos.

Por favor, não dê falsas idéias a respeito da linguagem. Em C++ não é possível por exemplo gerar seqüências arbitrárias de código trabalhando-se diretamente com a árvore sintática. Logo a metaprogramação é restrita a criar diferentes classes a partir de templates, mais ou menos como um “Generics” que realmente cria uma classe ao invés de usarem erasure e com mais algumas features.

Ou seja, é bem limitado. É mais limitado do que Ruby ou Python. E olha que Ruby e Python já são limitadíssimos.[/quote]

Thiago, antes de falar bobagem, sugiro que estude a linguagem. Recomendo o livro de templates do Vandervoorde.

Por favor, não dê falsas idéias a respeito da linguagem. Em C++ não é possível por exemplo gerar seqüências arbitrárias de código trabalhando-se diretamente com a árvore sintática. Logo a metaprogramação é restrita a criar diferentes classes a partir de templates, mais ou menos como um “Generics” que realmente cria uma classe ao invés de usarem erasure e com mais algumas features.

Ou seja, é bem limitado. É mais limitado do que Ruby ou Python. E olha que Ruby e Python já são limitadíssimos.[/quote]
Pode nos esclarecer com exemplos, de sequências, arvores sintaticas, e como metaprogramação funciona como generics. Aliás, porque é mais limitado que ruby ou python?

Todos nós gostaríamos de entender.

Acho que quem deveria aprender o que é metaprogramação é você. Existem inúmeras linguagens que usam sistemas melhores, como Lisp por exemplo, e outras sistemas parecidos com o do C++.

Thiago, dê uma olhada ali em cima na boost, no exemplo de lambda functions, e me explique como aquilo pode ser implementado com generics. Depois que você fizer isso, eu concordo com o que você quiser. E, mesmo que haja outra linguagem com uma implementação melhor de metaprogramação, isso não tira o método do C++ de suportar o paradigma.

[quote=Thiagosc][quote=ViniGodoy]
Thiago, antes de falar bobagem, sugiro que estude a linguagem. Recomendo o livro de templates do Vandervoorde.
[/quote]

Acho que quem deveria aprender o que é metaprogramação é você. Existem inúmeras linguagens que usam sistemas melhores, como Lisp por exemplo, e outras sistemas parecidos com o do C++. [/quote]

Com o lisp eu concordo em partes. Pena que o compilador do lisp não chegue nem na poeira do que é um compilador de c++. Lisp é restrito a apenas algumas aplicações. Comum em projetos de IA como Prolog.

[quote=juliocbq][quote=Thiagosc][quote=ViniGodoy]
Thiago, antes de falar bobagem, sugiro que estude a linguagem. Recomendo o livro de templates do Vandervoorde.
[/quote]

Acho que quem deveria aprender o que é metaprogramação é você. Existem inúmeras linguagens que usam sistemas melhores, como Lisp por exemplo, e outras sistemas parecidos com o do C++. [/quote]

Com o lisp eu concordo em partes. Pena que o compilador do lisp não chegue nem na poeira do que é um compilador de c++. Lisp é restrito a apenas algumas aplicações. Comum em projetos de IA como Prolog.[/quote]

Não sei, mas ele parece estar confundindo programação funcional com metaprogramação. Ou veio aqui só para fazer barulho mesmo e, novamente, desviar o assunto do tópico.

Novamente a sua capacidade de leitura falha. Eu jamais disse que aquilo poderia ser feito com generics, mas sim que templates são parecidos com generics, porque pode-se parametrizar classes e funções, com a diferença de que isso é feito em tempo de compilação.

Mas isso é muito limitado. Em Ruby ou Python existe uma espécie de “metaprogramação”, muito mais flexível.

Em Lisp usa-se a própria linguagem para criar macros e pode-se assim criar qualquer coisa. Seja estruturas ou classes completamente diferentes, funções ou implementações de métodos, valores em ambiente léxico ou dinâmico, etc. Trabalha-se diretamente com a árvore do código e por isso é possível fazer coisas que seriam impossíveis ou muito difíceis de serem feitas em outras linguagens.

A metaprogramação em C++ é uma piada em comparação. É uma definição de metaprogramação bem técnica, pois gera código em tempo de compilação. Não deixa de estar correto, mas Ruby já dá um pau nisso. É muito ruim e limitado.

[quote=ViniGodoy][quote=juliocbq][quote=Thiagosc][quote=ViniGodoy]
Thiago, antes de falar bobagem, sugiro que estude a linguagem. Recomendo o livro de templates do Vandervoorde.
[/quote]

Acho que quem deveria aprender o que é metaprogramação é você. Existem inúmeras linguagens que usam sistemas melhores, como Lisp por exemplo, e outras sistemas parecidos com o do C++. [/quote]

Com o lisp eu concordo em partes. Pena que o compilador do lisp não chegue nem na poeira do que é um compilador de c++. Lisp é restrito a apenas algumas aplicações. Comum em projetos de IA como Prolog.[/quote]

Não sei, mas ele parece estar confundindo programação funcional com metaprogramação. Ou veio aqui só para fazer barulho mesmo e, novamente, desviar o assunto do tópico.[/quote]

Realmente só para atrapalhar o debate, que está super legal. Se pelo menos tivesse algo concreto para apresentar, a gente ganharia conhecimento, mas no geral é só pra flame mesmo.

Lisp é usado em engenharia, seja em CADs ou sistemas embarcados.