C++

Meu chefe diz que “não existe programador júnior em C++”. Ou é sênior, ou então não presta. Se é para fazer *** use alguma outra linguagem, que provoca menos danos.

Certo, mas aplicações feitas em C++, tendem a ser mais robusta, ou não?

[]s[/quote]

Para banco de dados não, mas em computação gráfica sim.

C++ é legal para fazer coisas pequenas que devem executar muito rápido ou que devem fazer algumas coisas milagrosas ou que não se consegue fazer só com Java, mas não para fazer coisas muito grandes.

Por exemplo: fazer uma DLL JNI que interfaceia com o OpenGL, ou então (menos ambiciosamente) chamar aquelas APIs do Windows ou do Unix que fazem manipulação de metadados de arquivos (como data de criação, data de último acesso, tornar o arquivo executável ou read-only, mudar as permissões) e que não estão disponíveis na classe java.io.File.

Eu digo que “se tiver alguma lógica de negócio, ou mais de 2 telas, não deve usar C++”.

O que é uma aplicação robusta?
É aquela que não dá pau?
Se for isso, é melhor confiar mais em Java ou Erlang que em C++, que é notoriamente sujeita a problemas como invasão de memória, vazamento de memória e erros esquisitos que são oriundos de outras APIs que são chamadas em C++ e que precisam de um determinado ambiente que talvez seu programa C++ não consiga replicar.

Certo, mas aplicações feitas em C++, tendem a ser mais robusta, ou não?[/quote]

Robustes não depende da linguagem e sim de inumeros fatores, um deles inclusive é a implementação da mesma.

Se eu pegar um compilador bugado…

Tava conversando com um colega que foi pros EUA. Programador Java lá, senão me engano, ganha em torno de 25 dólares a hora.
Programador C (não lembro se ele tinha falado C++) ganha 60.
60!! Po, eu trabalhava 10 horas por dia :stuck_out_tongue:

É por isso que eles tentam migrar sistemas antigos de C para Java - a manutenção é muito cara, e a confiabilidade e flexibilidade deixam a desejar. (O Microsoft Money era feito em C++, não sei se ele ainda é feito em C++ ou se a Microsoft já o passou para C#).

C e C++ não devem ser usados, por exemplo, para fazer uma folha de pagamento, mas não há como deixar de escrever um “device driver” em C e Assembler, por exemplo.

Pois é.
Eu tenho muita vontade de trabalhar com sistemas embarcados, mais precisamente na área de robótica e celulares. Por falar nisso, já que estamos só entre “amigos”, já ouviram falar do Android né?

Esse Android aí é uma das razões pelas quais eu quero saber muito de Java e C++. Se vocês verem como foi feita a arquitetura em camadas, tem C++ e Java juntos. Uns colegas aqui apresentaram um trabalho de um robô feito com pessoas de impressora em C e Java. C comnadava a porta paralela da impressora e Java era a IDE que controlava o robô por meio de comandos. Muito interessante.

C++ tem muito espaço ainda em diversas areas de peso, tipo telecom e financeira.
Estas areas, além de terem enormes legados em C/C++, processam volumes gigantes de dados, em base de dados, arquivos ou transações em rede. É um mundo muito diferente do que contruir uma aplicação web, por maior que seja.

Eu tenho um boa esperiência em C++ em processos de grandes volumes (billing e cobilling).
E tenho um grande expêriencia em Java fazendo a mesma coisa (na época me acharam louco de fazer um sistema de processamento bath em Java).

O que posso dizer ?
É mais rápido devenvolver em Java, mas é muito mais facil devenvolver algo muito lento em Java. Java tem uma Api enorme e bem documentada. O uso de threads chega a ser trivial comparado com C++.

A JVM esta rápida, cada vez mais rápida. Mas não é qualquer programador Java que consegue tirar o desempenho da JVM para utilizar Java neste cenário.

Neste projeto tinha duas equipes de desenvolvedores Java, os Java Web e os desenvolvedores Java cabra macho :slight_smile:

Outra vantagem do uso de Java, foi que a arquitetura foi bem desenhada com o bom uso de threads e a escalabilade deste sistema em Java é muito boa.

Escrever esta mesma arquitetura em C++ seria possível é claro, possívelmente até melhor com uso de de recursos do SO para o controle das threads. Mas quanto tempo isso iria demorar ?

[quote=dedejava]Tava conversando com um colega que foi pros EUA. Programador Java lá, senão me engano, ganha em torno de 25 dólares a hora.
Programador C (não lembro se ele tinha falado C++) ganha 60.
60!! Po, eu trabalhava 10 horas por dia :stuck_out_tongue:
[/quote]

[quote=thingol]É por isso que eles tentam migrar sistemas antigos de C para Java - a manutenção é muito cara, e a confiabilidade e flexibilidade deixam a desejar. (O Microsoft Money era feito em C++, não sei se ele ainda é feito em C++ ou se a Microsoft já o passou para C#).

C e C++ não devem ser usados, por exemplo, para fazer uma folha de pagamento, mas não há como deixar de escrever um “device driver” em C e Assembler, por exemplo.
[/quote]

Cara, olhando o post do dedejava não dá pra chegar à conclusão do thingol. O que eu posso concluir é apenas que não estão sendo formados muitos programadores em C ou C++ quanto o mercado precisa, só isso.

Thingol, repetir a mesma coisa várias vezes não a torna verdade. É fácil dizer que C++ não serve pra coisas grandes ou que a manutenção é difícil, mas não me convence, porque:

  1. Problema de manutenção é problema de arquitetura! C++, Cobol, Ada, Java, Python ou Ruby não são os culpados pelos problemas de manutenção, isso é mais problema do código espaguete, das abstrações ruins, entre outros.

  2. Gerenciamento manual de memória é algo trabalhoso, mas não impossível. Programadores experientes em C++ sabem das armadilhas mais comuns e também conhecem o valgrind para detectar problemas. Eu, por exemplo, já trabalhei em uma empresa que só entregava o software se não houvesse nenhum memory leak, e entregávamos, em 100% dos casos.

  3. Nem todo mundo prefere a abordagem C++ e Java ligado por JNI. Em certas empresas onde trabalhei que necessitava de acesso a hardware, a parte de C++ se estendia às regras de negócio também.

  4. A única coisa que é responsável pelo sucesso de uma linguagem é a quantidade e a possibilidade de se fazer boas bibliotecas e frameworks. Java tem o trunfo de se fazer frameworks contando com reflexão e proxies dinâmicos, coisa que C++ não tem. Com Ruby, as possibilidades de abstração de uma biblioteca são maiores ainda que o Java. Pra mim, é isso que determinaram o sucesso dessas linguagens.

@Leonardo3001

O que determina o sucesso de uma linguagem, é quantas grandes empresas apostam ($$) nela.
Pode ser a linguagem mais tosca do mundo (VB?) mas se tem grandes empresas com interesse comercial nela, ela decola.

Hummm, talvez Ruby esteja quebrando este paradigma, primeiro a comunidade a criou e começou a usa-la, e depois, agora, grandes empresa estão olhando para ela (Sun, Oracle só para citar)

Nisso eu tenho que concordar com você. Pegamos Java (que o código é “bonito”). Se um cara que não sabe programar direito e nem identar corretamente fizer um código grande, fica extremamente ruim de analisar o código.

[quote]C++ tem muito espaço ainda em diversas areas de peso, tipo telecom e financeira.
Estas areas, além de terem enormes legados em C/C++, processam volumes gigantes de dados, em base de dados, arquivos ou transações em rede. É um mundo muito diferente do que contruir uma aplicação web, por maior que seja.
[/quote]

Acredito que em embarcados com restrições muito fortes também (pouca memória e coisa e tal).

batch? Mas por que acharam você louco?? É porque o processamento em lote tem i/o bounds?? Não entendo direito dessas coisas :>

Sobre o que você falou em C++ eu não posso opinar porque não sei, mas sobre a facilidade de se fazer algo lento em Java… a… isso eu concordo muito!

Leonardo,

[quote]
Escrever esta mesma arquitetura em C++ seria possível é claro, possívelmente até melhor com uso de de recursos do SO para o controle das threads. Mas quanto tempo isso iria demorar ? [/quote]

Acho que foi por isso com o thingol falou aquelas coisas.
No mormaço, deu pra entender que Java é uma linguagem que aplica extremamente o Reuso. Dizem que existe muita coisa pronta em C++, só que todas são de código fechado e pago :;

Eu não fiz a folha de pagamento, mas a contabilidade, livros fiscais, estoques, crédito e cobrança, contas a pagar, comercial… :smiley:

Porque C++? Tenho muuuuuitos clientes com estações pentium 233 :shock: . Nesse caso a gente tem de programar “no osso”.

Leonardo,

Acho que não é bem assim. A linguagem fornece muitos mecanismos que contribuem para a robustês dos frameworks.
Um programador pouco experiente em C++ está muitíssimo sujeito a erros. A linguagem propicia isso. Mesmo um programador experiente tem que ser muito cauteloso.

Alguns exemplos de coisas "error prone", que podem acontecer no C++ mas não no Java:

  1. No C++ os objetos são construídos de maneira implicita, a menos que se diga explicitamente o contrário;
  2. No C++, pode não haver erros imediatamente caso o tamanho de arrays seja estourado (e isso pega até os mais experientes).
  3. Não tem garbage collection. Isso significa que você pode deletar um objeto que outros estão usando (e o erro vai pipocar num outro lugar, não no código maldoso que deu o delete). Ou então, que você pode perder a referência e gerar um memory leak. É bom lembrar que ninguém projeta essas coisas…
  4. Algumas macros podem gerar um código capicioso. Um exemplo clássico é a macro:
    #define MAX(x,y) (x)>(y)?(x): (y)

Que simplesmente se comporta mal ao chamar:
int a = max(x++, y);
pois soma x 2 vezes.

Eu poderia adicionar mais uns 30 itens a essa lista…

Claro, um bom projeto não tem dessas coisas. Mas, qual é o custo de se obter um bom projeto em C++? É muito mais alto do que em Java.

Hoje, eu concordo com o Thingol. Mas ampliaria a lista dele para incluir também software embarcado, aplicações gráficas no geral, simuladores físicos, aplicações de tempo real (você confiaria uma aplicação que abre as comportas de uma usina nuclear ao java? Nem eu. Nem a Sun - tem uma clausula que isenta o Java de aplicações desse tipo, afinal, vc nunca sabe quando o garbage collector vai rodar…). Sistema comercial? Deixa isso para linguagens com garbage collection, como Java e C#.

Ah sim, no caso das bibliotecas e APIs. C++ pode não ter reflection (tem a compilação com RTTI, mas não chega perto da forma que o Java implementa reflexão), mas tem programação genérica. É algo que o Java não tem. :wink:

Apoiado.
Essa é uma das razões que escolhem C++ para sistemas embarcados, não é? Pode-se ver e “controlar” o código… no Java tem muita pouca coisa que se precisa implementar… é tudo na base do reuso… e esse reuso pode pegar muita memória.

[quote=dedejava]
Apoiado.
Essa é uma das razões que escolhem C++ para sistemas embarcados, não é? Pode-se ver e “controlar” o código… no Java tem muita pouca coisa que se precisa implementar… é tudo na base do reuso… e esse reuso pode pegar muita memória.[/quote]

No C++, você pode até mesmo alterar o compotamento do new e delete. Isso é controle suficiente para você? :lol:

É verdade, ja trabalhei num sistema onde o new foi sobrecarregado para carregar em uma tabela informações sobre todos os objetos em memória de forma a fazer, entre outras coisas, testes de alocação de recursos.

Mas era bizarro. Pior só aquela linguagem que permite reescrever o if (Haskell?)

Sim, em sistemas embarcados muitas vezes é impossível pensar em Java.
Estou falando de sistemas embarcados com poucos recursos de hardware, não Pocket e iPhones da vida.

Porque nunca tinham visto sistemas deste tipo em Java, apenas em C++.
E acredite, as JVMs anteriores à 1.4 marcaram em muitas cabeças que Java é muito, mas muito lento, e em muitas cabeças este mito permanece ainda hoje.

Vamos ser realista, Java não mais munto leito desde a versão 1.4. Hoje ele é só um pouquinho lento. :slight_smile:

Hehehe.
Se a Sun conseguiu melhorar bastante isso eu não duvide que ela melhore muito mais.
E ainda existe muitas aplicações feitas em C++ paraIPhones. Até mesmo o GPhone usa.

Ah!
Uma coisa que eu queria perguntar:

Existe algum GUC++? ou GUCPP?