Murilo :P

C++, Computação, Programação, Web e afins :)

Linguagens de programação – C++ – Direito de defesa

with 28 comments

C++Um dia desses passeando por blogs ví um post que me chamou a atenção. O título é Linguagens de programação – C++ e, claro, chamou minha atenção, não apenas por causa do post assim com também por causa dos comentários sobre o post.

O objetivo desse post não é gerar um flame, até porque não atacarei nenhuma linguagem, só dissertarei sobre fatos.

O post é pequeno mas o estrago é grande!

Bom, vamos começar:

Não tenho tanta experiência com C++, mas a que tenho já é suficiente para mim.

Na minha opinião, já começou mal. Pode ser suficiente para ele, mas não para os leitores do blog onde deve haver muitas visitas e muitos deles podem ser programadores em formação (novatos). A influência pode ser malígna, já que pode aterrorizar marinheiros de primeira viajem.

C++ é uma linguagem derivada de C, acrescentando-se suporte a orientação a objetos. Não que não seja possível escrever programas orientados a objetos em C (o kernel do Linux faz isso em vários lugares), mas dá bastante trabalho.

Esqueceu totalmente de falar sobre a Standard Template Library (STL), sobre o suporte a namespaces, a programação genérica etc.

A linguagem tem como único ponto positivo o suporte a orientação a objetos, definindo o que são classes e suportando herança entre elas; só.

Descordo totalmente. Único ponto positivo? Orientação a objetos qualquer linguagem hoje em dia tem suporte. Se esse for o único diferencial do C++, isso não seria diferencial. E se for seguir essa linha de raciocínio, poderia-se dizer por exemplo que Java é um C++ com um único ponto positivo: o Garbage Collector e certamente o Java não tem apenas esse ponto positivo.

Segundo o Wikipedia:

  • C++ é desenvolvido para ser uma linguagem tipada estaticamente e de propósito geral que é tão eficiente e portátil quanto o C.
  • C++ é desenvolvido para suportar múltiplos paradigmas.
  • C++ é desenvolvido para fornecer ao programador escolhas, mesmo que seja possível ao programador escolher a opção errada.
  • C++ é desenvolvido para ser o mais compatível com C possível, fornecendo transições simples para código C.
  • C++ evita fornecer facilidades que são específicas a certas plataformas ou a certos grupos de desenvolvedores.
  • C++ não exige overhead para facilidades que não são utilizadas.
  • C++ é desenvolvido para ser utilizado mesmo sem um ambiente de desenvolvimento sofisticado.

É veloz, suporta código C, suporta instruções em Assembly in-line, propicia as facilidades da programação genérica, permite o trabalho tanto em alto como em baixo nível (para funcionalidades) críticas, permite a abstração de liberamento de memória com smart pointers, suporte a espaço de nomes (namespaces) e outros.

Em compensação, tem diversos problemas: [1]demora para compilar, [2]seus programas são lentos (apesar de dizerem o contrário, Java é mais rápido que C++, por exemplo), [3]suporta herança múltipla (ou seja, apóia o uso de hierarquias malfeitas), [4]mistura paradigmas diferentes de programação (procedural e orientado a objetos), [5]torna os programas difíceis de serem refatorados e exige que o programador se preocupe com alocação de memória, algo que a maioria das linguagens de programação orientadas a objeto não exige, graças à coleta de lixo.

Depois de ler isso eu pensei: “é por isso que eu bebo!” 🙂

Quanta bobeira, mas vamos lá! Numerei algumas partes para discutir:

[1] Vou usar as palavras do Jardel Weyrich que comentou sobre essa parte:

Em muitos casos, demora pra compilar sim, pois o indivíduo não usa objetos pré-compilados, e recompila tudo sempre…

Qual a maior motivação da orientação a objetos? Reutilização de código! Se o indivíduo (como citado acima) já tem uma parte do código compilado a pergunta é: para que compilar novamente? Fazer isso é ir contra o paradigma de orientação a objetos. Mesmo em C ninguém recompila tudo. Criamos os objetos ou as bibliotecas dinâmicas justamente para não ter aquele bolo na hora de compilar.

[2] Cara se tem uma coisa que eu aprendi foi não acreditar em benchmark. Há um professor (Augusto Silva) meu que diz que existem níveis de mentira: a mentira, a mentira cabeluda e benchmark. Benchmarks são sempre manipulados para que o resultado favoreça certa parte. Não duvido que tenham feito algum BM em que o Java ganhou em performance do C++, mas certamente o que fizeram foi ridículo. Em aplicações práticas, o Java nunca vai ser mais rápido que o C++, pois, como a grande maioria aqui sabe, Java é uma linguagem interpretada pela JVM (quem adivinhar em que linguagem a JVM foi escrita ganha o direito de comentar hehe :]) e fica quase impossível que Java tenha algum aspecto com maior performance (em termos de aplicação) que o C++.

[3] A linguagem de programação C++ (aliás nenhuma) não projeta a hierarquia de classes de um software. Então é aquilo, C++ te dá liberdade pra fazer o que quiser, mesmo que seja a coisa errada.

[4] O C++ é uma linguagem que suporta múltiplos paradigmas. Mas não é o C++ que mistura os paradigmas não. É o que eu disse sobre [3]. A culpa de misturar paradigmas é do desenvolvedor.

[5] Aqui ele se enganou. Todos as linguagens precisam de alocação de memória. O que certamente ele quis dizer é “se preocupe com a desalocação de memória” onde se lê “… se preocupe com alocação de memória …”.
Mais uma vez a falta de experiência dele na linguagem fez falta nessa afirmação. Um recurso muito interessante que o C++ oferece são os smart pointers (breve falarei sobre aqui no blog). Esse recurso permite que você não se preocupe com a desalocação de memória e funciona perfeitamente como um Garbage Collector.

Em resumo, se você quer C com orientação a objetos, prefira Java ou C#. Qualquer um dos dois é melhor do que C++ e, provavelmente, mais eficiente. Agora, se você gosta de POG (programação orientada a gambiarras), C++ é uma boa.

Nesse trecho na minha opinião o cara partiu pra ignorância já. Como está na moda esse termo POG não é? Mas falar que C++ é pra quem gosta de POG é triste de se ouvir (e ler). Quem não é organizado, não programa bem e/ou faz gambiarras em programas, vai fazer isso independentemente de qual linguagem utilizar.

Quero que fique claro que eu não sou xiita (eu trabalho com Java), apenas acho que o post foi injusto.

Claro que C++ tem suas deficiências como ter uma curva de aprendizado muito longa, mas acho que compensa o esforço.

Quanto ao Java, o que tenho a dizer é: uma linguagem excepcional, com um propósito bastante legal e que admiro a facilidade de disponibilidades de recursos como API, IDE’s, documentação, bibliotecas, etc. Gosto de Java, trabalho com tal linguagem, estou em um projetos em conjunto à Universidade Católica de Goiás – UCG e o Instituto Tecnológico de Aeronáutica – ITA em que utilizamos Java como linguagem de programação e dou aulas básicas de Java para meu grupo de Iniciação Científica na UCG.

Muito obrigado gente, sintam-se a vontade para discutir. Só peço que tenham educação e respeito no que disserem.

Regards 🙂

Update:

Recebi um e-mail do professor Algusto Silva que comentou o seguinte sobre o que falei em [2] sobre Java ser interpretado pela JVM:

“A maioria das implementações da JVM utilizam compilação “Just In Time”, ou seja, o arquivo em bytecode Java é traduzido para a linguagem de máquina do host e só então é executado. Apesar disso, mesmo nesse caso, a velocidade do código tende a ser mais lenta que o código derivado de C++ porque pode haver overhead no código final.”

Written by Murilo Adriano

14 de November de 2008 at 01:12

Posted in C/C++, Programação

Tagged with , , ,

28 Responses

Subscribe to comments with RSS.

  1. Poisé eu também li este infeliz post, mas não dei muita atenção; É como uma criança falando que física quântica é besteira porque muitas coisas que estão lá não vamos usar.

    Na minha opinião, linguagem de programação é como uma chave de fenda ou um martelo, é uma ferramenta para o seu trabalho, você tem que entender muito do seu trabalho e não só da ferramenta, por exemplo você não usaria um martelo para apertar um parafuso e nem uma chave de fenda para pregar um prego do mesmo jeito que você não usaria Java para fazer um software embarcado e nem um C/C++ para fazer um web service. (não significa que não dá para fazer)

    Se você se submete a escrever sobre um assunto você tem que no minimo saber um pouco sobre o que esta escrevendo, por que senão você acaba escrevendo besteira que foi o caso deste infeliz post.

    Eu acho que o autor deste post, (que não se identifica) escreveu muito mal este post só para divulgar sua série sobre linguagem de programação, e parece que deu certo, você pode reparar que sua série começa a ter comentários só depois deste infeliz post, agora me vem a pergunta, será que ele é tão burro assim? Ou usou um assunto polêmico para divulgar o seu blog.

    Bom, pra mim o currículo deste blog esta manchado e retirei ele da minha lista de RSS, simplesmente pelo o motivo de não respeitar o leitor e querer apenas divulgação.

    Talvez este tal de luiz como programador seja um ótimo marqueteiro.

    Kabloc Vacavoa.

    Kabloc

    14 de November de 2008 at 08:37

  2. Excelente defesa.

    O sujeito lá do vida geek que escreveu aquele post sobre c++ foi extremamente infeliz nos seus comentarios. Se c++ fosse tão ruim como ele diz, programas como Photoshop, Firefox e outros programas importantes não seriam escritos nela.

    abraços

    Diego Henrique

    14 de November de 2008 at 09:02

  3. hehehe, comentários típicos!
    A primeira citação fez-me lembrar logo da frase do Steve jobs, “Continue com fome, continue tolo”.

    Felipe Pena

    14 de November de 2008 at 09:52

  4. Sensato, mas acho que dar mais ibope pra alguém que não sabe escrever/programar não vale a pena.

    Programo em Java E em C++ pra ganhar a vida. Ambas são excelentes, excepcionais. Gosto das duas e sou produtivo em ambas, mas se for pra defender alguma hoje em dia vou de Ruby, onde em meia hora faço um programa que levaria dois dias em Java e três em C++ (exageros a parte, vc entendeu).

    O problema é que hoje pensa-se que programar é fazer um site bonitinho. Quero ver o cara usar C# pra fazer um firmware. Vamos em frente.

    Marcelo Castellani

    14 de November de 2008 at 10:04

  5. Belo artigo, parabéns!

    André Luís Toledo

    14 de November de 2008 at 10:16

  6. Obrigado!

    Murilo Adriano

    14 de November de 2008 at 12:46

  7. Muito bom.
    Vou fazer referência a este post no Portal Embarcados.

    Regards

    Diego

    14 de November de 2008 at 17:37

  8. parabéns pelo post foi bem esclarecedor.
    parabéns mesmo e vou ficar aguardando o post sobre smart pointers (e os memory’s leaks na minha engine tb)

    Gabriel Moreira

    14 de November de 2008 at 18:53

  9. Hey buddy!

    Muito legal este seu POST, so tenho a lamentar pelo “pobre coitado” la do vidageek!

    []s

    Jorge Pereira

    14 de November de 2008 at 18:57

  10. Texto muito bom, ao contrário do outro que foi postado.

    Meus parabéns!

    Virgilio Fornazin

    14 de November de 2008 at 19:23

  11. Obrigado a todos, esses elogios me motivam a escrever mais :p

    Murilo Adriano

    15 de November de 2008 at 12:44

  12. Você ficaria ofendido se eu corrigisse o seu “orientação à objetos” por “orientação a objetos”? (sem crase). “Objetos” é masculino plural e “à” é feminino singular… “À” é o feminino de “Ao”!

    Espero que não leve a mal…

    xxx

    15 de November de 2008 at 13:25

  13. Obrigado pela correção sr. Xxx.
    Não fiquei ofendido, muito pelo contrário, fiquei agradecido, viu?
    Só não entendi o porquê do anonimato!
    Bom, de qualquer forma respeito a sua vontade.

    Abraço.

    Murilo Adriano

    15 de November de 2008 at 13:34

  14. Se eu fosse você, não daria trela pra essa gente que fala besteira do C++.

    Eles só sabem publicar artiguinhos em seus blogs criticando os outros e não produzem nada de importante. Portanto as opiniões deles são irrelevantes. Diria até mesmo que a existência deles é irrelevante.

    anonymous

    15 de November de 2008 at 13:46

  15. Bom, é incrivel, o cara falou que nao tem muita experiencia com c++.
    Tb ja usei java e ele tem um grande numero de facilidades, em 1 dia eu monto uma serie de coisas, a gui fica pronta em pouquissimo tempo, isso é verdade.
    Agora, controlhe de memoria otimizado, isso nunca achei, nunca pude fazer na mao, jamais poderia fazer java rodar em um console por exemplo, pois absolutamente nunca saiu nada desse tipo.
    XNA usa c#, que é muito semelhante a c++ em questoes de code, claro que o metodo como ele importa os headers e outros é diferente, jogos de psp podem ser programados em c++ se usando um firmware especifico, o mesmo para nintendo ds, se nao me engano ps2 e ps3 tb.
    Agora, se c++ é tao ruim assim, tao lento, pq nao usam java que é mais rapido?
    Basicamente pq java nao é mais rapido, nao adianta o cara pegar a iostream todinha e sair fuçando sendo que nem sabe como a mesma funciona internamente, usar uma engine que usa o resto do processador para otimizar o jogo e falar que é pesado.
    Exemplo simples, o HGE usa quase sempre tudo que sobra do processador, ai chega o cara e fala, po fica lento, ai eu abro photoshop, sony vegas, ouço musica no winamp abro opera com 10 abas e continua tudo normal, bom.. acho que deu pra entender.

    Nao da pra sair chutando uma linguagem que é tao usada.
    Java e c++ tem seus pos e contras, porem nunca fale mal de uma linguagem se vc nao conhece ela direito, tem que saber usar e nao o suficiente, pq o suficiente para vc pode ser nada para outro.

    Demonofnight

    16 de November de 2008 at 13:04

  16. sobre o benchmarks, eu gosto desse site:

    http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=gpp&lang2=java

    Tem codigos disponivel para quem quiser “auditar” 🙂

    Bruno Sanches

    17 de November de 2008 at 10:08

  17. Gostei do que fez, como comentei no post do maluco q escreveu as asneiras sobre c++, o q me irrita é a confusão q pode causar na cabeça de novos marinheiros, e vc corrigiu o equivico com muita classe fez um ótimo trabalho.

    Gabriel Moreira

    19 de November de 2008 at 10:28

  18. Acho que o grande lance não é ele ter falado mal de C++, o problema que quase tudo que ele falou de mal de C++ eram informações equivocadas.

    Eu dei o seguinte comentário no post na época em que eu li: “Não tendo o que falar é melhor ficar calado, pois calado você até se passa por sábio!…”

    Cada linguagem tem suas particularidades, por exemplo, se eu dependesse de uma linguagem com suporte ao framewok .net talvez usasse C#, mas substituir completamente C++ por Java ou C# como ele sugere é absurdo, há situações onde uma linguagem é mais cabível que outra.

    Mas de qualquer forma é impressionante a quantidade de besteira que se pode concentrar em um único parágrafo!

    André Luís Toledo

    21 de November de 2008 at 14:40

  19. Obrigado por não citar a parte que eu “chutei o balde”.
    Até gostaria de me desculpar com o cara, mas acho que depois do que escrevi, não faria muita diferença.
    De qualquer forma, eu acredito que todos tem o direito de errar, porém, devemos ser suficientemente humildes para reconhecer os erros e ao menos tentar corrigí-los.
    Quando comecei a trabalhar com Java, notei que a comunidade e os grupos Java eram bastante unidos, além de extremamente organizados, e de fato, C e C++ não podem ser comparados com Java neste quesito.
    Mas o que me não me deixa tão alegre, é ver que grande parte das pessoas que participam dos grupos e comunidades Java, exercendo grande influência na “massa de desenvolvedores”, não possuem um nível de humildade que me agrade. Será que é só comigo?
    Desculpe usar este comentário para isto, mas achei cabível. Qualquer problema, pode removê-lo.
    E por último, mas não menos importante, parabéns ao Murilo por saber defender a linguagem tão bem como ela merece.

    Jardel Weyrich

    21 de November de 2008 at 22:27

  20. […] um comentário » E aí pessoal, como prometido, vou falar sobre Smart Pointers em C++. Neste post irei abordar smart pointers, o que são, como […]

  21. Só um adendo em [2] (sobre Java/C# ser mais lento):

    O JIT Compiler pode deixar sim o código de linguagens que rodam sobre uma VM mais rápido que o compilado estaticamente como C/C++.

    Isso acontece pois o JIT não precisa fazer nenhuma suposição sobre como o código será executado para compilá-lo. A máquina virtual começa interpretando o código, mas coleta informações sobre como o código está sendo usado durante a própria execução e o compila da maneira *mais otimizada* possível, de acordo como está a execução.

    Além disso, o JIT pode até decidir jogar fora algum pedaço de código compilado e compilar denovo, se ele perceber que a estratégia de compilação que usou antes não é mais adequada.

    Isso se chama adaptatividade (tecnologias adaptativas, JITs adaptativos, autômatos adaptativos, …). JITs e adaptatividade são a grande revolução na tecnologia de máquinas virtuais e linguagens gerenciadas. Coisas como essas fazem sim programas escritos em linguagens “gerenciadas” mais rápidos que alternativas compiladas estaticamente, em muitos casos, onde o compilador tem que usar heurística e “chutar” o melhor jeito de compilar o código.

    Claro, é sempre uma questão de vantagens e desvantagens. Programas que rodam por muito tempo costumam se beneficiar mais da otimização em tempo de execução dos JIT’ers. É por isso que aplicações que rodam em servidores (e ficam no ar por muito tempo), costumam usar linguagens gerenciadas por VMs.

    Para programas que rodam por pouco tempo, geralmente não compensa o overhead de carregar uma máquina virtual e da interpretação no começo, até que o código comece a ser compilado pelo JIT.

    *SEMPRE* depende. Não existe melhor tecnologia. Odeio ver xiitismos com relação a linguagens e tecnologia em geral. É *sempre* uma questão de vantagens e desvantagens; *sempre* um tradeoff (troca). Assim como o post no VidaGeek talvez tenha sido um pouco infeliz no radicalismo, as respostas sobre como Java e C# são _sempre_ mais lentos que linguagens gerenciadas também não passam de falácia de pessoas que não tem a mínima noção de como funcionam as VMs, JITs e GCs modernos.

    Quase todas as linguagens mais modernas são baseadas em VMs. Algum motivo precisa existir.

    No mais, se performance fosse sempre a principal preocupação de todos, escreveríamos todos os nossos programas direto em linguagem de máquina. Assim não corremos mais o risco desses “malvados” compiladores e máquinas virtuais deixarem nosso código “lento”, não?

    Fabio Kung

    15 de December de 2008 at 23:41

  22. Interessante!
    Estudarei mais sobre essas implementações Just In Time e analisarei os prós e os contras.
    De qualquer forma, obrigado pelo comentário Fabio Kung, é bom ter um outro ponto de vista para poder ter uma discussão maior.

    Murilo Adriano

    16 de December de 2008 at 12:50

  23. Cara, acho que esse foi o segundo post mais enriquecedor sobre linguagens de programação que eu já li (só perde pra um do Guilherme Chapiewski) que eu já li. Não só pelas coisas que você falou, mas também pelo comentário do Fabio Kung.

    Seriedades a parte, falar mal de C++ com poucos e fracos argumentos é pedir pra ser criticado :p
    Ou melhor, falar mal de alguma linguagem sem ter um contexto é errado.

    Abraço.

    Andre Brito

    2 de January de 2009 at 21:52

    • Obrigado Andre!
      É bom saber que apreciou o meu post 🙂
      Faltou só você deixar a url desse post sobre linguagens de programação do GC que eu gostaria muito de ler.
      Abraço.

      Murilo Adriano

      3 de January de 2009 at 02:09

  24. Opz, faltou mesmo.
    Ele fala umas coisas muito legais no post.
    http://gc.blog.br/2008/10/19/java-e-ruim/

    Abraço!

    Andre Brito

    18 de January de 2009 at 02:21

  25. Achei o Orkut do cara, ele é muito tosco, que cara sem noção. Em primeiro lugar, NUNCA julgue uma linguagem desta forma, até parece o deus da razão.

    AuhauhauhAUAhauhuH
    Ai, Ai, esses moleques que acham que sabem programar é F#@$.

    [i][link removido][/i]

    Anonymous

    10 de February de 2009 at 11:27

  26. Desculpem se eu falar bobagem pois comecei ontem a estudar C, ainda nao cheguei no C++.

    Entretanto, pude notar que a apologia do C se baseou em criticas de quem espera que seus programas sejam feitos por um framework robotizado, que ja carrega em si os sistemas mau depurados.

    E olha que eu nao bbi oje!

    Silvio Pontes

    21 de May de 2009 at 03:17

  27. […] merece…) sobre c/c++, basicamente esculhambando a linguagem. No blog do Murilo ele fez um post bem legal defendendo a linguagem. Vale a pena dar uma lida, para você poder se esclarecer melhor caso pense […]


Leave a reply to Demonofnight Cancel reply