Java ou C++?

[quote=carlos.e.a][quote]
Deixa eu ver se entendi bem: se eu for desenvolver algo pra uso próprio, tem de ser porcaria ou mediocre? Tá de brincadeira né?
Aliás, qual o problema do sujeito querer fazer algo bacana, mesmo que seja para uso próprio? E, continuando na pergunta: qual o problema com isto? [/quote]

Enquanto ele poderia ganhar muito mais alem de usar o software poder distribuí-lo? É muita burice pensar tao pequeno.

[quote]
E que engraçado, um entusiasta Java que ainda fala dos problemas de desempenho da plataforma, problema este que hoje práticamente foi resolvido e, em sua maior parte é mito? Tá de brincadeira né?[/quote]

UHSUAHsuaH MITO? Cara, eu que pergunto, ta de brincadeira ne? Primeiro que esse tipo de coisa quem fala é usuario windows que nunca teve contato com linux por pura acomodacao. Se voce tivesse tido o minimo de contato com os dois SO’s saberia que o Linux dá um controle infinitamente maior sobre a máquina e se voce alguma vez na vida tivesse estudado SO um pouco mais a fundo saberia que o Windows faz muita coisa porca pra gerenciar os recursos. Sem contar a fome do Windows por GUI já que os seus usuários o adoram tanto justamente por isso. Enfim, problemas praticamente resolvidos só se for na tua cabeça.

E mais uma coisinha: nao significa que por eu ser um “Entusiasta” eu possa saber menos que qualquer outro aqui. Significa apenas que eu nao passo o dia inteiro postando pro lado e pro outro porque tenho mais o que fazer. Esse “status” nao mede conhecimento e sim numero de mensagens. Nao sei o que voce quis dizer com isso…[/quote]

Carlos, em sua maior parte, sim, é mito (aliás, há cenários nos quais Windows fica mais rápido que Linux). E antes de falar sobre a minha experiência e tal, que tal pesquisar um pouco a meu respeito hein? Como disse anteriormente, o prolema do Java, atualmente, como todos podem ver aqui neste seu último post, são as maçãs podres da comunidade, que ao invés de ajudar, vêm com toda uma mitologia baseada no “disse não disse” que, ao invés de ajudar, simplesmente agridem os que estão chegando (os chamando de burros, como vocẽ acabou de postar (aliás, “burro” é com 2 R’s)) se dizendo muito espertos, superiores e fodásticos quando, na realidade, bastando analisar os últimos posts, basicamente só dizem merda.

E olha que legal: se você só diz que não é tão ruim o Windows, de cara é chamado de “usuário acomodado”. Não é o “máximo”? É Carlos, sua postura é “super legal”. Continue assim que seu futuro tá garantido. Troféu joinha pra você.

(reparem que interessante: nos posts do Carlos (ao contrário dos meus) não há basicamente informação alguma útil pro Braven, que veio aqui nos buscar ajuda. Eis um membro “atuante” da comunidade hein?)

Me desculpe caro amigo, mas eu nao disse que JAVA É SUPERIOR NO MAC eu simplesmente disse que MAC É SUPERIOR AO WINDOWS. São duas coisas bem diferentes. Eu separo criança de adulto por outro criterio: Aqueles que gostam/adoram GUI e aqueles que preferem o controle e desempenho.Criança adora ver “letrinha pulando na tela”. Vou abandonar essa discussao pq nao vou ganhar nada com isso. Já dei a minha opiniao relativa a pergunta do criador do topico e é só isso que interessa.

Quanto ao “buro” desculpe mas nao fico lendo e relendo minha mensagem antes de postar, e obviamente sei que é com 2 R’s. O seu texto tambem tem erros de portugues como por exemplo “prolema” mas eu nao perco meu tempo olhando isso. Mas isso foi pra desviar o foco ou foi só impressao minha? Nao se preocupe mais com o foco porque ele nao vai mais existir porque nao adianta discutir isso. Sinceramente isso que voce esta dizendo de que “windows tem desempenho superior em um caso x” tambem é “disse me disse” porque todas as experiencias que tive mostram o contrario.

[quote]
E olha que legal: se você só diz que não é tão ruim o Windows, de cara é chamado de “usuário acomodado”. Não é o “máximo”? É Carlos, sua postura é “super legal”. Continue assim que seu futuro tá garantido. Troféu joinha pra você. [/quote]

Nem posso comentar isso porque sequer entendi o que voce quis dizer. E nao precisa se preocupar com o meu futuro porque eu estar preocupado ja basta xD

[quote]
(reparem que interessante: nos posts do Carlos (ao contrário dos meus) não há basicamente informação alguma útil pro Braven, que veio aqui nos buscar ajuda. Eis um membro “atuante” da comunidade hein?) [/quote]

[sarcasmo]Desculpe, quem é mesmo que voce esta tentando convencer disso? =D[/sarcasmo]

E como eu ja disse, nao adianta ficar discutindo essas bobagens, eu sei das minhas conviccoes. Só tentei expor a minha ideia. Agora se voce concorda ou discorda me apresente pelo menos algum embasamento porque voce esta fazendo justamente o que voce disse que nao gosta: “disse me disse” sem nenhum fato concreto. E se quiser continuar a discussao vá em frente, mas eu nao digo mais nada.

Essa discussao toda me fez lembrar de uma coisa. Por esses dias eu tava tentando desenvolver um script pra alterar a prioridade dos processos(o que é uma coisa básica e muito util) no Windows para ajudar um amigo de forma que toda vez que o processo rodasse a prioridade dele fosse alterada para o maximo. Tentei fazer isso por dias, mechendo na bela interface do Windows e nao achei nada. O resultado foi que tive que dizer pro meu amigo que eu era incapaz de fazer isso. Coisa que com 20~30 linhas em shell eu faço =D. Alias eu fiz e é uma verdadeira mao na roda quando preciso fazer umas conversoes para DVD. Com isso consigo economizar mais ou menos 1 hora do meu tempo.
É por isso que as vezes eu tenho pena de quem usa Windows por isso: é cego e nao sabe, por isso eu nao te culpo Kico =D
E é por isso tambem que acho que nao vale a pena discutir contigo.

Senhores, controlem-se. Este tipo de discussão só serve para estragar a informação do tópico.
Por favor, mantenham o foco.

Bom… segue uma observação (que representa uma opinião pessoal):
Sou programador Java. E gosto de Java.
Entretanto, acho que para uma pessoa que vai trabalhar com engenharia e não quer focar em programação mas apenas dar um “plus” no currículo. Vale muito mais a pena aprender um pouco de C++ que vai deixá-lo mais próximo do controle da máquina do que aprender Java.
Entretanto… não estou assim tão por dentro do assunto embora conheça proficionais que são engenheiros e trabalham com automação industrial. Assim que eu puder, vou consultar alguém que relmente mexa com isto.

[]s

Anyway, se seu software não é de missão crítica Java lhe atenderá muito bem.
Trás muitas facilidades, mas a um certo custo.

De qualquer maneira seja bastante criterioso no seu código.
Infelizmente só terá escrito um algoritmo bem performático quando obtiver certa fluência na linguagem (inclua C++ nessa) o que leva tempo.

Sei que meu primeiro post não acrescentou o que o autor do tópico quis, mas ele não veio aqui pra discutir sistemas operacionais ou software livre.
Só prefiro alerta-lo pra que não tome como base toda a comunidade por conta de uma pequena e barulhenta amostragem.

Sistema operacional é um ponto chave no que ele veio discutir: Aplicativos para engenharia geralmente exigem uma boa performance geral do sistema incluindo o SO. E eu nao vejo nada de barulhento aqui. A melhor forma de avaliar a melhor opcao para quem esta iniciando é acompanhando uma discussao.Com isso ele pode ter uma boa ideia dos prós e dos contras. Agora o pessoal associar discussao com xingamentos e falta de respeito é outra coisa e eu só entrei nesse joguinho porque fui dar a minha opiniao e vieram me atacar sem motivo aparente. E eu detesto falta de respeito com a opiniao dos outros. Se eu tivesse vindo aqui pra fazer baderna tudo bem, mas meu objetivo desde o inicio era ajudar.

E qual o problema dele desenvolver em C++ no linux?
Se mudar de distro basta recompilar na maioria dos casos.

Não faz sentido discutir isso aqui.

Nem sempre é so recompilar. Chamadas ao SO muitas vezes tem assinaturas diferentes em compiladores diferentes, o que dizer de sistemas diferentes. Na melhor das hipoteses ele teria que refatorar tudo buscando as instrucoes que nao sao reconhecidas em um compilador e trocando somente a assinatura. Mas ha casos que sequer tem um comando equivalente. Ai ele teria muitos problemas. Isso sem falar de aplicativos que fazem chamadas diretas ao Sistema. Se fosse so recompilar nao se falava tando de portabilidade em Java.

Reconheço que acabei desviando o foco do topico mais foi porque me atacaram cara. É muito chato voce estar aqui tentando ajudar e tambem aprender e vem alguem e diz que a sua opiniao nao vale nada ou que voce esta falando bobagem. E eu ja percebi que nao sei se é alguma coisa que eu escrevo ou como escrevo o pessoal diz que eu to dizendo que a minha opiniao é a certa. Longe disso! É apenas a minha opiniao e nada mais, eu posso estar totalmente enganado e se alguem vier com argumentos provavelmente vai me convencer que estou errado.Tá todo mundo aqui tentando aprender.Eu nao tenho problemas em reconhecer quanto estou errado. Acho que vou começar a colocar no topo das minhas msg “EU ACHO” mas isso pode tirar totalmente qualquer credibilidade que possa ter o que eu digo.

Eu sou um programador experiente em Java e C++. Programo há mais de 10 anos nas duas linguagens. Boa parte da minha carreira é em sistemas de tempo real, e agora que trabalho muito com jogos, não é diferente.

Em primeiro lugar. Sobre java ser lento. É mito sim.
Ou, no mínimo, é uma observação muito mal feita. Se você é programador no ano 2011, e ainda repete essa besteira, informe-se. Você é tão desatualizado quanto aquele professor dinossauro que você reclamava na faculdade.

Eis os porquês:

  1. Java é compilado. Se você ainda acha que ele é uma linguagem interpretada, você deve ler sobre hotspot compilation. Isso está no java há alguns anos (artigo de 2004, helllooow).

  2. O processo de compilação do Java ocorre em runtime. E isso dá a possibilidade dele usar otimizações específicas do processador do usuário, de fazer inline em funções virtuais e de remover sincronização desnecessária;

  3. A maior parte dos gargalos não está na linguagem. I/O, algorítmos mau implementados e mau gerenciamento de memória são os vilões. No caso de aplicações de desenho, o gargalo estará na placa de vídeo (ou no desenho em si, ou na comunicação entre CPU e GPU), não na CPU. Por isso dei essas dicas sobre otimização.

O item 3 geralmente é mais crítico em linguagens não gerenciadas (como o C e o C++), e não é em linguagens com garbage collection (como mostrei nesse post, o Particles em java fica mais rápido e mais bonito que o mesmo escrito em C++, e eu escrevi um alocador de memória próprio para o segundo. Mas a escolha do algorítmo feita pela SDL acabou com a performance);

Em segundo, é mais fácil escrever código rápido em java. A linguagem tem profilers excelentes. Muitos melhores que os melhores profilers existentes em C++. E tudo de graça.

As reais desvantagens do java, para tempo real ou engenharia, são:

  1. Garbage collector: Ele congela a aplicação por algum tempo… um tempo muito curto. Se seu sistema é crítico ao ponto desse tempo não ser tolerável, isso inviabilizará o uso da linguagem (por outro lado, é o GC que dá performance na alocação de memória e te livra de problemas como dangling pointers e boa parte dos memory leaks);
  2. Baixa integração com o hardware. Esqueça o uso de dispositivos exóticos como mesas digitalizadores, trackballs, volantes, joysticks, etc. Você sempre dependerá de um binding;
  3. É fácil descompilar a aplicação. Embora se você for fazer seu CAD, eu não me preocuparia com isso. Pouquíssimos programadores irão entender os processos matemáticos como transformações (aliás, tema do próximo artigo que lançarei no Ponto V!), projeções, quaternions, técnicas de culling e shaders, mesmo que olhem o código fonte comentado… e muitas vezes, mesmo que comprem um livro de matemática e tentem estudar por conta o assunto.
  4. Há um número pequeno de libs prontas pra esses fins, se comparadas com as existentes em C e C++.

Para um engenheiro, acho que o C++ valoriza mais o currículo. É a linguagem mais usada em empresas de engenharia. Eu mesmo trabalhei na Siemens, e era isso que usavam (junto com Java). Na Bosch, também era o que pediam. Também vi pedirem a linguagem na construtora Caixilho, na Esteio Engenharia, e tive que usá-la em três trabalhos para civil, um numa aplicação que integrava GPSs, uma para analisar um mapa de aerofotogrametria e outra numa aplicação que usava webcam para fotografar buracos em estradas.

Com o C++, você também pode trabalhar com o DirectX (embora seja só para Windows), ou acelerar boa parte dos códigos com hardware, usando o CUDA.

Se for estudar C++, procure atualizar-se. A maioria das pessoas tem uma visão errada da linguagem, pois limita-se ao que estudou na faculdade. Se você só viu C e OO, você não viu C++. Você viu C with classes, linguagem que surgiu em 1979 e caiu em desuso em 1980.

A maior parte da evolução do C++ se deu no mecanismo de templates, na biblioteca padrão, na biblioteca boost, e em práticas de código (como uso de RAII, constness, etc). Sem falar em bibliotecas de terceiros, extremamente portáveis, como é o caso do Qt (se alguém aqui acha que o Java é multiplataforma, estude Qt). O que você viu na faculdade, é o mesmo que tentar programar em java usando somente o pacote java.lang.

O C++ é, realmente, mais otimizável que o Java, o que é diferente de dizer que seu código sairá “por padrão” mais otimizado. Se você estiver disposto a investir em otimização (e empresas de jogo e engenharia as vezes estão), você poderá escrever um gerenciador de memória próprio, usar instruções específicas de SO ou hardware, usar compiladores especialistas e até integrar com hardwares específicos (PICs, DSPs, microcontroladores, etc.) e, realmente, ter um código em C++ que, nas condições para as quais foi feito, roda muito mais rápido do que um código em Java.

Só tenha em mente que isso envolve um custo alto, e a maior parte das empresas não está disposto a pagar, quem dirá um desenvolvedor solitário.

Posso estar falando bobagem mas a diferença entre interpretar o codigo e uma “compilacao lazy”(nem sei se posso falar assim, foi o que entendi do texto) é bastante sutil…

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