Sim, você está falando bobagem. A diferença é brutal.
O hotspot compilation identifica os pontos “quentes” do código e os compila para código nativo. Todo código do hotspot é compilado. Quando o método é chamado uma segunda vez, não há nenhum tipo de compilação ou interpretação. Ele roda diretamente em linguagem de máquina.
Também vale lembrar que o interpretador java roda sobre um bytecode, não sobre o código fonte puro. O bytecode é um código pré-compilado. Isso significa que ele é isento de erros de sintaxe, erros léxicos ou semânticos, o que torna sua interpretação centenas (para não dizer, milhares) de vezes mais rápida que a de um código de uma linguagem puramente interpretada.
Hum…interessante.(nao foi ironia antes que alguem me interprete errado)
Bom, em primeiro lugar obrigado a todos pelas respostas, o topico desviou um pouco do assunto mas mesmo assim tive algumas respostas muito boas …
[quote=alexspe]qual a finalidade de um engenheiro civil saber programar? até vc dominar c++ para fazer softwares como vc citou(estilo cad etc)
vc ja esqueceu das aulas de engenharia que teve hehe[/quote]
Alexspe, atualmente praticamente todos os cursos tem pelo menos uma introduçao a programacao, praticamente todas as areas do conhecimento podem e muito se beneficiar com programacao de computadores, eu mesmo tenho um conhecido, q faz biologia e está utilizando programacao para modelar comunidades biologicas.
[quote=carlos.e.a]Deixa eu ver se entendi bem: Voce pretende desenvolver softwares de um nivel razoável pra SOMENTE VOCE USAR?
Tah de brincadeira ne? [/quote]
Não sei o que eu disse que te deixou com essa impressão mas nao é essa a ideia, inclusive perguntei sobre softwares comerciais em Java. Claro q tenho a pretensão de se algum dia fizer um software de qualidade lucrar com ele, ou no mínimo disponibilizá-lo para download.
Braven, meu post é meio longo, mas acabo voltando ao assunto nele. Não deixe de ler. Acho que para a engenharia, não pense 2 vezes. C++.
O que me levou a ter essa ideia foi voce ter dito que a portabilidade nao seria “muito importante ja que o seu foco seria Windows”. Eu só tentei dizer justamente o que voce falou sobre as suas perspectivas para o futuro. Pensar em portabilidade desde o inicio, mesmo que nao pareça algo util inicialmente, evita muitas dores de cabeça.
Com relação ao desempenho do Java eu não tenho dúvidas de que ele é capaz de um desempenho muito próximo do C++, inclusive essa semana tive essa dúvida sobre o desempenho Java e resolvi testar com um problema de cálculo bem custuso para o computador, fiz aquela clássica função recursiva que chama duas vezes para o cálculo do número de Fibonacci e o desempenho do Java foi muito superior ao do C++ (inclusive fiquei espantado com o resultado pois não era o que eu esperava).
Em minha faculdade mesmo há um projeto de um programa semelhante ao que tenho em mente, porém sem 3d, que tem um desempenho muito bom. Caso alguem tenha interesse: http://www.insane.dees.ufmg.br/insane. Uma tese de mestrado de uma aluna foi sobre esse programa e nela havia alguns cálculos de desempenho das versões iniciais que diziam que o programa era mais rápido que uma versão feita em C++ (não tenho muitos detalhes de como foi feito na época esse estudo).
Agora, baseando nas respostas, aparentemente o C++ é a linguagem que mais me acrescentará com relação ao mercado de trabalho, o post ViniGodoy , que ja teve experiencias inclusive na minha área de engenharia civil. Pelo que eu entendi pode ser por ser uma linguagem de mais baixo nível, permitir intereção direta com hardwares e o fato de gerar executáveis.
O problema do C++ pra mim é a graaaaaande curva de aprendizado, por exemplo tenho em mãos aqui dois livros do Deitel, “Java: como programar - 8 ed” e " C++: como programar - 5 ed", ambos os livros possuem cerca de 1100 páginas, porém o Java, aborda temas como o Swing, Multithreading, Redes, Bancos de Dados e muitas outras coisas sobre web. Já o C++ tirando um capítulo sobre programação web é todo sobre C++ (e pouco de C e código legado) em modo texto. Ou seja, após o estudo do C++ seria interessante aprofundar o estudo em alguma API de interfaces gráficas (Win32, MFC, Qt, WxWidgets … ) que tbm possuem curvas de aprendizado e complexidade bastante grandes. Ainda teria de ler algum material complementar sobre a STL, Multithreading, Boost, que de jeito nenhum são pequenos ou fáceis.
Entao ViniGodoy, seu post foi bastante esclarecedor e ajudou muito. Eu resolvi responder separado pra nao misturar muito as ideias.
Deixei de responder muitos ai pra trás e peço desculpas por isso, eu li todos e foram muito úteis.
Eu já tinha mesmo essa ideia do que vc disse, que o C++ iria ser melhor, mas tava mesmo com dúvida sobre o potencial do Java no mercado e na influencia dele no curriculo, acho que por ser mais moderno e estar bombando no mercado talvez a influencia dele atualmente fosse maior.
De qualquer forma eu vou ter de aprender um pouco sobre Java pois esse periodo vou ter uma disciplina , Programação de Computadores Para Análise Estrutural, que terá como base o programa que citei no post anterior (INSANE), tenho certeza que será um Java bem básico pois a grande maioria dos alunos do meu curso só sabem o basico de MATLAB que foi dado no primeiro semestre, mas de qq forma vou poder ter uma visão melhor da linguagem e uma aplicação direta na área.
Braven,
Eca… matlab me lembra matcad e isto me traz más lembranças da época de facu… rs
ViniGodoy,
Ótimo post. Muito esclarecedor. Acho que suas explicações consolidaram a idéia que eu já tinha na mente sobre o assunto.
Aproveitando um gancho do assunto mas já ficando meio offtopic… vc já usou a palavra chave “Native” em Java? Sempre tive uma imensa curiosidade em usar isto!.. Acho que vou escrever algo em C++ só pra usar isto do Java usando esta interface.
Braven, ViniGodoy e a quem mais se interessar,
Voltando ao assunto e aproveitando a idéia do paragrafor anterior. Acho que tem espaço na industria de engenharia para o uso conjunto das tecnologias Java e C++. Imagino que um software de envenharia poderia se beneficiar dos dois mundos. Ex:
Poderia ter uma parte escrita em C++ para se comunicar com algum hardware, possivelmente de automação industrial ou algo do gênero que por sua vez seria chamado por um código java com interface web (telas de administração, por exemplo).
Não sei se estou dizendo besteira, mas de qq forma, isto é só curiosidade sobre o assunto. Concordo com o ViniGodoy quando ele diz que para um engenheiro, vale mais aprender C++ que Java. Entretanto… acho que um engenheiro “super-extra-plus” poderia saber os dois e isto não seria mau… o foda é ter tempo pra isso… rs
[]s
Obs.: Um amigo meu postou um material interessante no blog dele sobre C++ versus Java pra quem está inserto sobre o futuro do Java e pensa em investir em algo mais, só por segurança.
O material é este:
http://turing.iimas.unam.mx/~elena/PDI-Lic/qt-vs-java-whitepaper.pdf
O blog é este:
http://codigobom.com/
Inda não lí mas talvez isto interesse ao pessoal nesta thread em específico.
[]s
Eu faço um comparativo de Java e C++ nesse post, para o desenvolvimento de jogos:
O java no desenvolvimento de jogos
[quote=iogui]Obs.: Um amigo meu postou um material interessante no blog dele sobre C++ versus Java pra quem está inserto sobre o futuro do Java e pensa em investir em algo mais, só por segurança.
http://turing.iimas.unam.mx/~elena/PDI-Lic/qt-vs-java-whitepaper.pdf
[/quote]
Li o artigo, mas achei que ele se baseou na mesma argumentação de sempre, quando dizem que o java é lento. Basicamente, o que fazem é rodar algoritmos extremamente matemáticos, geralmente single-threaded, e comparar o tempo de execução de ambos.
Benchmarks feitos dessa forma são altamente questionáveis. Primeiro, porque a maior parte das aplicações não são puramente matemáticas. Depois, porque desprezam a forma que a virtual machine trabalha. Ela necessita de um tempo de warmup.
O artigo, apesar de ter cara de artigo científico, não deu referências de onde surgiram frases como essa
“Our own experience shows that Java programs tend to run about 2-3 times as long than their equivalent C/C++ programs for the same task.”
No mínimo deveria indicar que experiência são essas e como esses resultados foram calculados. O próprio link que ele toma como referência no artigo inteiro baseia-se em observações empíricas, onde o próprio autor não garante a confiabilidade dos dados.
Ele também afirma que:
“Garbage collection is very convenient, but the trade offs are greater memory consumption and slower runtime speed”
Tenho que discordar radicalmente desse último ponto. O gargabe collector possui algoritmos de gerência de memória extremamente eficientes (realmente, ao custo de alocação). Ele consegue alocar e desalocar blocos grandes de memória, e evita ao máximo chamadas as rotinas do SO, que são extremamente lentas. Ele obviamente não mediu o que falou, ou cometeu o erro classico de comparar o gc com objetos alocados no heap, e não no stack. Para bater a performance do gc, deve-se tomar extremo cuidado no C++, ou usar um framework de gerenciamento de memória externo.
Finalmente, acho que vale um ponto importante: Hoje performance está mais relaciada a escolher boas bibliotecas e boas implementações do que na linguagem em si. De nada adianta você ter uma linguagem de execução super rápida, se você está ordenando dados com o algorítmo da bolha, e pesquisando com um for simples.
Por isso, cenários muito matemáticos, onde coloca-se lado-a-lado dois programas muitíssimo matemáticos não medem absolutamente nada. Na prática, não é assim que software comercial se comporta. E, provavelmente, se alguém simular um software comercial de verdade, vai ver que a linguagem tem pouco ou nenhum impacto sobre os problemas de performance. Os problemas estão onde falei: I/O (Leitura de arquivos, banco, redes) ou maus algorítmos.
ViniGodoy,
Ainda não lí este artigo que meu amigo postou. Quero degustar ele com calma depois. Entretanto, por curiosidade, lí o seu artigo comparando Java e C++ pra jogos.
O fato é que, seja para desenv de games, softwares de engenharia ou aplicações coorporativas, cada linguagem tem suas vantagens e desvantagens.
Para o desenvolvedor profissional, inclusive, acho perigoso se fixar apenas em uma linguagem e fechar os olhos para tudo que existe e vem surgindo por aí.
Como programo e já programei em diversos tipos de linguagens diferentes em épocas e usando paradigmas diferentes, prefiro ter uma visão mais global embora saiba da nececidade de especialização em alguma linguagem. Afinal de contas, não tem como ter tempo disponível para se aprofundar em tudo.
Java é a linguagem do meu dia a dia. Meu ganha pão. Mas ainda pretendo dar uma atenção maior para o C++ assim que possível pois acho esta uma linguagem fantástica.
Agora… eu sou programador. Este é meu mundo.
Uma linguagem a mais, uma a menos… não tem problema… rs
Quanto ao nosso amigo engenheiro, melhor não perder o foco né?..
Dúvida.: O que é o mercado de Jogos AAA?
[]s
Deixa eu ver se entendi bem: Voce pretende desenvolver softwares de um nivel razoável pra SOMENTE VOCE USAR?
Tah de brincadeira ne?
Sem contar que se voce pretende desenvolver softwares com um bom desempenho, principalmente em java que já sacrifica um pouco do desempenho justamente em prol da portabilidade, acho melhor começar a mudar as suas idéias de Sistema Operacional. Sem querer ofender quem gosta de windows mas o desempenho dele em relacao a MAC e Linux não dá nem pra medir.[/quote]
É normal no ramo da engenharia e da pesquisa os profissionais desenvolverem ferramentas para uso próprio. É uma maneira de automatizar e facilitar o trabalho especialmente se for trabalhar com cálculos complexos, e um bom exemplo pode ser dito de transformadas em telecomunicações para se poder enxergar o sinal em outro plano(pelo espectro dele).
Respondendo a pergunta do tópico,
Dizer que java hoje não serve para criar programa com bom desempenho é mentira, e até porque o hotspot gera código nativo e muito bem otimizado.
É uma ótima vantagem do java nesse quesito pois te garante uma sintaxe simples e um ótimo resultado no final por causa dessas otimizações.
Usar opengl com java se torna uma tarefa e simples e novamente o desempenho do aplicativo será praticamente o mesmo pois usa bibliotecas nativas da opengl.
O problema do java hoje é que quando se começa a trabalhar com objetos complexos, o código gerado pelo compilador possui uma chamada “volatile” em seus métodos, o que faz esses objetos irem todos para o heap. Isso cria um alto comsumo de memória virtual e é comum programas java ultrapassarem 500mb de memória. Isso acaba tornando java inviável para desktop(Quando digo desktop quero dizer ter dezenas de aplicações java rodando num desktop simultaneamente), e acaba afetando um pouco o desempenho do programa. A diferença acaba sendo muito pequena.
Falando em c++ existem vários toolkits que te permitem escrever software multiplataforma. Existem várias bibliotecas que facilitam o uso da opengl como a GLUT. O software c++ bem desenhado é muito estável e essa história de ter muitos problemas com memory leaks é conversa de quem não conhece a linguagem e algoritmos como os smart pointers.
Apesar de c++ ser uma ótima linguagem ela é muito mais complexa que java e isso acaba por não te dar uma produtividade tão boa quanto a segunda citada.
Enfim, qualquer uma das duas que escolher vai ser uma boa escolha. Todas tem muitas ferramentas boas que facilitam o desenvolvimento.
São os jogos tops, de prateleira, como os que a EA e a Blizzard produzem. Geralmente usam o máximo do hardware e estão presente em consoles.
Me esqueci de citar:
Java e C++ são linguagens de alto nível.
C é linguagem de médio nível.
assembly não é linguagem de programação. É linguagem de montagem.
Quando eu usaria C++:
- Sistemas que dependem muito de hardwares diferenciados: Portas seriais e paralelas, usb, placas de captura, webcam, etc;
- Sistemas de tempo real crítico, onde o delta máximo é inferior a um possível congelamento do GC;
- Sistemas que exijam baixo consumo de memória;
- Sistemas de prateleira, desses vendidos em lojas;
- Sistemas com muita integração com o SO (que acessam, por exemplo, o AD, se integrem com o sistema de arquivos, etc);
- Sistemas que rodam em modo kernel (embora aqui talvez eu usasse só a parte estruturada, como uma espécie de “C turbinado”);
- Em aplicações científicas e sistemas extremamente CPU bound;
Quando eu usaria o Java ou C#:
- Em praticamente todos os sistemas web;
- Em praticamente todos os sistemas comerciais;
- Em desenvolvimento de jogos para celular ou indie;
- No estudo de algorítmos, padrões, etc;