| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 13:26:26
|
MaikoID
JavaChild
![[Avatar]](/images/avatar/fb5099b705cbdf454ab869c32d22f029.jpg)
Membro desde: 26/11/2007 23:02:21
Mensagens: 111
Offline
|
Olá,
Queria saber na opnião de vocês desenvolvedores C++ && Java e já adiantar a minha sobre essas linguagens. Não sou expert em nenhuma delas então não tomem nada como verdade até a prova ao contrário rsrs
- Já passou momentos no Java que você gostaria de estar usando C++ ? Tipo - Preciso mexer com bytes agora, posso precisar de um unsigned short int aqui e... opa! Google..
- Ah estou usando esse int aqui como flag ou contador então vou mandar ele como parãmetro e a outra função altera se der tudo certo.. opa. Google..
- Vou fazer uns filtro de imagem aqui com I.A pra identificar qual o melhor filtro pra este tipo de imagem, só colocar esses métodos aqui num vetor e randomizar a escolha dos filtros e... deu certo (era c++ rsrs).
Essa liberdade do C++ é muito boa, o Java é excelente tbem você recorre menos ao Google do que o C++ já que vem com bastante métodos prontos e documentados, mas as vezes poderia ser mais flexível.
Tanta liberdade em C++ pode dar problema também, mas é mais para desenvolvedores inexperientes no uso de ponteiros e afins.
E vocês qual situações já queria um pouco de mais liberdade do C++ em Java e quando mais do gerenciamento do Java em C++ ?
Abraço.
|
 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 13:33:05
|
enantiomero
JavaEvangelist
Membro desde: 23/04/2008 09:44:26
Mensagens: 304
Offline
|
Cara, faz mais de um ano que meu 'day job' é programar em C++. Acho um porre ter de ficar me preocupando com as seguintes coisas do C++:
- Ponteiros apontando sei lá pra onde
- Exceções que, se não tratadas, derrubam tudo e não têm stack trace
- Vazamentos de memória absurdos
- Velocidades de compilação do tempo das cavernas (um sistema em que trabalho leva mais de uma hora para compilar - e isso que ele não é muito complexo)
E isso que usamos uma porção de bibliotecas que minimizam esses problemas (e que casualmente deixam seu programa muito semelhante a um programa em Java ou C#). Eu mesmo raramente tenho problemas com isso, mas o problema é quando você tem de manter um programa dos outros, que costuma ser infestado de tais problemas nojentos.
Eu sei que, se precisar de alguma coisa de baixo nível no Java, é só criar uma DLL JNI em C++ ou C mesmo, e depois chamá-la do Java. Se é para usar nível baixo, uso então aquelas instruções SSE3/SSE4 (que são possíveis de serem usadas só com extensões do compilador C/C++, para que haja pelo menos alguma diferença em relação ao Java (que já usa essas instruções "sem você saber", dependendo da versão da JVM).
Eu me queixo do Java é que ele não incluiu (nem tão cedo vai incluir) certas coisas que serão incluídas no C++ na próxima versão (C++0X), como
- Funções lambda (o correspondente dos "closures" propostos no Java, ou dos "anonymous delegates" do C#)
This message was edited 1 time. Last update was at 16/09/2009 13:37:49
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 13:38:19
|
juliocbq
GUJ Expert
![[Avatar]](/images/avatar/153704bb24a28e9a6bb49e8ffde1492e.jpg)
Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Online
|
tudo o que você citou é possível fazer com qualquer linguagem. Tanto filtros de imagens digitais, como compiladores, etc...
A vantagem de uma máquina virtual é o coletor de lixo, que te abstrai de gerenciar memória
ex:
java
c++
O único quesito contra coletores de lixo, é na questão performance. Este ponto pode ser muito evidente em determinados tipos de software, ou de não fazer notar nenhuma diferença em outros.
|
www.citrox.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 13:46:14
|
MaikoID
JavaChild
![[Avatar]](/images/avatar/fb5099b705cbdf454ab869c32d22f029.jpg)
Membro desde: 26/11/2007 23:02:21
Mensagens: 111
Offline
|
Pra controlar bem ponteiros, as classes e métodos tem de ser o mais modular possível, assim fica fácil o gerenciamento deles é só lembrar teve um new tem um delete, agora métodos muito grandes que mexem em endereços ai fica meio foda mesmo. As famosas classes chuck norris não é nenhum pouco agradavel em C++.
Tratamento de exceções tem não tem? Lembro de ja ter pesquisado sobre o assunto mas acabei usando o controle por retorno mesmo. Em Java nos acostumamos a depender de exceções, em C/C++ o controle de erros é mais no braço mesmo.
Compilação é brabo mesmo, mas existe o make pra essas coisas ai né.. onde compila só o que foi mexido.
Eu nunca usei uma JNI, precisa ter o um compilador C instalado ou o JVM cuida disto? Não fica meio frankstein isso não?
por mim C++ teria tudo o que Java tem, mas com a liberdade de escolha de poder ou não usar, ai sim seria um show de linguagem. Gosto ambas das duas, as vezes um tratamento fácil de execeções como no Java seria bem interessante também.
No próximo C++ já esta decidido a inclusão das libs boost www.boost.org, ai sim vai ficar uma belezura rsrs.
|
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 13:49:51
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20577
Localização: Curitiba/PR
Online
|
enantiomero wrote:Cara, faz mais de um ano que meu 'day job' é programar em C++. Acho um porre ter de ficar me preocupando com as seguintes coisas do C++:
- Ponteiros apontando sei lá pra onde
- Vazamentos de memória absurdos
Você está usando Smart Pointers? Sua equipe segue corretamente o conceito de RAII?
Se está, você não deveria ter desses problemas...
enantiomero wrote:- Exceções que, se não tratadas, derrubam tudo e não têm stack trace
Isso ocorre no Java também, mas gera stack trace. De qualquer forma, se você fizer direitinho, o postmortem debugger também poderá gerar para você um process dump, que te dará a stack trace do erro.
enantiomero wrote:- Velocidades de compilação do tempo das cavernas (um sistema em que trabalho leva mais de uma hora para compilar - e isso que ele não é muito complexo)
Realmente, é e desvantagens de ter os templates. Entretanto, isso pode ser minimizado caso você gerencie corretamente os .h. Agora, se seu projeto não usa templates, e nem bibliotecas que as usam internamente, seu tempo de compilação não deveria ser tão longo.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 13:51:34
|
enantiomero
JavaEvangelist
Membro desde: 23/04/2008 09:44:26
Mensagens: 304
Offline
|
MaikoID wrote:é só lembrar teve um new tem um delete
Pois é, com o boost::shared_ptr<> (que vai entrar no C++0X como std::tr1::shared_ptr<>, se não me engano) nem preciso me preocupar com isso - quando a contagem de referências cai a zero, o objeto é automaticamente deletado.
As únicas coisas chatas :
- você precisa se preocupar se você vai ter uma referência ao próprio objeto (que se resolve fazendo a classe herdar de "boost::enable_shared_from_this<>" .
- você precisa se preocupar se há referências circulares ou recursivas nos objetos - aí você precisa usar uns boost::weak_ptr em vez de boost::shared_ptr em lugares adequados.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 13:54:33
|
enantiomero
JavaEvangelist
Membro desde: 23/04/2008 09:44:26
Mensagens: 304
Offline
|
ViniGodoy wrote:
Você está usando Smart Pointers? Sua equipe segue corretamente o conceito de RAII?
Se está, você não deveria ter desses problemas...
Concordo com você, mas o problema é que, como todo bom sistema grande, há toneladas de código antigo (que normalmente tem aqueles problemas do tipo "o programador que deixou essa bomba não acreditava em std::string e fazia tudo com char*, e não tinha a menor ideia para que servia a palavra-chave "const""), e claro que é impraticável reescrever o código antigo para ficar de acordo com as melhores práticas.
Isso é o meu inferno.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 13:59:00
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20577
Localização: Curitiba/PR
Online
|
Eu programei 6 anos com C++ e 8 anos com Java. Mesmo na época do Java, ainda mantive o contato com o C++. Eis algumas conclusões: a) O C++ é muito vantajoso quando você quer interagir com o sistema operacional ou com hardware. Exemplo disso é que é virtualmente impossível programar um sistema DirectX em Java. b) O C++ é vantajoso também quando você precisa de uma aplicação muitíssimo enxuta. Entretanto, raramente você precisa de algo assim. c) O Java, para aplicações normais, é até mesmo mais eficiente do que o C++. Exemplos disso são o fato do operador new e delete terem um custo baixíssimo, assim como a geração de exceções; d) A personalização do C++ é possível, porém, geralmente é muito cara e complexa. Por exemplo, seria possível sobrescrever os operadores new e delete de forma a fazer o gerenciamente de memória como no Java. Mas isso não é tarefa fácil. e) Se você precisa de um software crítico (para controlar usinas, aviões, etc), você está proibido de usar o Java. f) Embora o C++ seja mais otimizável que o Java, é mais fácil e barato produzir aplicações otimizadas com Java. O Java possui ferramentas melhores e gratuitas para isso, como a Visual VM, o profiler do Netbeans ou o projeto TPTP, do Eclipse. Qual eu prefiro? Bom, para a absurda maior parte dos sistemas hoje em dia, eu prefiro o Java. Geralmente, não se precisa interagir com SO, nem com drivers de hardware. Além do que, muitas libs que necessitariam JNI já foram portadas (como OpenGL e até GPIB). Entretanto, para estudar os jogos AAA, é C++ na cabeça.
This message was edited 1 time. Last update was at 16/09/2009 14:01:26
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 14:04:45
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20577
Localização: Curitiba/PR
Online
|
Até onde eu sei, o std::tr1::shared_ptr já existe, desde a TR1. Por ser um tecnical report, obviamente sua implementação é opcional, mas os compiladores GNU já o incluem. No próximo C++ a proposta é que ele passe para o std:: diretamente. Ainda irá manter o handle para o std::tr1 por questões de compatibilidade (como fizeram com os cabeçalhos do Czão). Realmente, se tem sistema legado no meio, aí só posso lamentar. E, Maiko, essa história de "se tem um new é só lembrar de um delete" é uma simplificação grosseira de um problema muitíssimo maior. Você precisa garantir que para cada new existe um, e somente um, delete. E que esse delete só pode ser dado caso esse objeto não seja referenciado por mais nada. O que significa dizer que sua programação toda terá que convergir para um ponto, onde o objeto será totalmente desreferenciado e deletado. E isso, sem técnicas mais avançadas, é uma tarefa extremamente complexa. Aliás, é a grande dor de cabeça do C, ou do C++ mal utilizado (como é o caso do sistema legado do colega ali).
This message was edited 1 time. Last update was at 16/09/2009 14:05:48
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 14:09:23
|
MaikoID
JavaChild
![[Avatar]](/images/avatar/fb5099b705cbdf454ab869c32d22f029.jpg)
Membro desde: 26/11/2007 23:02:21
Mensagens: 111
Offline
|
e) Se você precisa de um software crítico (para controlar usinas, aviões, etc), você está proibido de usar o Java.
Essa fiquei surpreso, não era Java que iria substituir cobol pela estabilidade e tararannn ?
Como vinigodoy falou, da pra customizar o C++ mas acaba pesando bastante, ele deveria ja vir um pouco mais pronto.
Sobre aplicações enxutas, discordo que seja muito raro a necessidade, qdo vai ter 30mb de ram pra um pequeno hardware, instalar o jvm fica complicado.
|
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 14:15:06
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20577
Localização: Curitiba/PR
Online
|
Quando eu disse proibido, quis dizer proibido mesmo:
Java License Agreement wrote:You acknowledge that Licensed Software is not designed or intended for use in the design, construction, operation or maintenance of any nuclear facility. Sun Microsystems, Inc. disclaims any express or implied warranty of fitness for such uses
Infelizmente, o garbage collector ainda não pode dar garantias sobre o momento da execução. Parece que vão resolver boa parte desse problema nas próximas versões de java mas, até lá, só se pode fazer sistemas críticos como esse em linguagem compiladas onde se tenha muito controle.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 14:18:48
|
enantiomero
JavaEvangelist
Membro desde: 23/04/2008 09:44:26
Mensagens: 304
Offline
|
Mesmo a licença do Java Real-Time (onde você pode desligar o Garbage Collector para alguns tipos de dados) diz exatamente a mesma coisa. Provavelmente foi um copy & paste, ou então a Sun é contra a energia nuclear (talvez seja a favor da energia solar )
http://java.sun.com/javase/technologies/realtime/rts/90daylicense.txt
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 14:20:41
|
enantiomero
JavaEvangelist
Membro desde: 23/04/2008 09:44:26
Mensagens: 304
Offline
|
MaikoID wrote:e) Se você precisa de um software crítico (para controlar usinas, aviões, etc), você está proibido de usar o Java.
Eu proibiria o C++ também - imagine seu avião cair por um ponteiro perdido. Uma linguagem mais burocrática como o Ada (que também derrubou foguetes) talvez fosse melhor nesse ponto.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 14:26:18
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20577
Localização: Curitiba/PR
Online
|
MaikoID wrote:Como vinigodoy falou, da pra customizar o C++ mas acaba pesando bastante, ele deveria ja vir um pouco mais pronto.
Quando ouço isso aqui, geralmente penso na velha comparação C++ puro sem qualquer lib, versus Java com todas as libs. Tipicamente, é comparação que os programadores java fazem...
O C++ hoje é composto do C++, da STL e da Boost. A STL é a biblioteca padrão, já com classes como string, vector, list, etc. Todo C++ vem com ela em sua distribuição oficial.
Embora a boost não seja de distribuição oficial, ela é mantida pela mesma comunidade que produz o C++. É extremamente bem documentada, e tem classes para fazer praticamente qualquer coisa. É praticamente tão extensa quanto a própria biblioteca do Java. Muito do que será adicionado nas próximas versões do C++ vem da boost.
Se quiser conhecer:
http://www.boost.org
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2009 14:56:53
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20577
Localização: Curitiba/PR
Online
|
enantiomero wrote:
MaikoID wrote:e) Se você precisa de um software crítico (para controlar usinas, aviões, etc), você está proibido de usar o Java.
Eu proibiria o C++ também - imagine seu avião cair por um ponteiro perdido. Uma linguagem mais burocrática como o Ada (que também derrubou foguetes) talvez fosse melhor nesse ponto.
A diferença é que isso pode ser testado, e pode ser corrigido.
O garbage collector não pode ser corrigido.
No caso do Java RTS, talvez isso ainda esteja escrito pq se trata de uma versão para avaliação.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
|
|