Qual você prefere a liberdade do C++ ou a administração da JVM no Java

Você já começou mal em colocar o C++ e o C no mesmo balaio. Depois, desprezou o fato do C++ ser uma das linguagens com o maior número de bibliotecas integráveis que existe.
No segundo post, também ignorou o fato do C++ também encapsular a absurda maioria dos protocolos de rede, e ter as mais rápidas implementações de WebServices do mercado.

[quote=sergiotaborda]Vc está esquecendo que mensagens em bytes são protocolos E protocolos envolvem consenso. Java pode ler qualquer protocolo, mas não precisa ser amarrado aos protocolos que pode ler. é muit mais importante ter primitivos seguros que ter programação fácil
de protocolos binários (aka não OO).[/quote]

Não estou esquecendo, não.

Tudo isso que você falou não exclui o fato de ser extremamente difícil ler protocolos de mercado simples, como FTP, etc, que tem dados do tipo “unsigned”. Considero uma falha grave de projeto uma biblioteca feita para uso em networking não lidar com um tipo de dado tão comum. Aliás, não só networking. Muitos arquivos, como o wav, formatos de vídeo, cabeçalhos de imagem e de compactador tem informações importantes do tipo unsigned. Para ler isso no java, só fazendo mágicas de bits.

Uma biblioteca para ler coisas externas, como é o caso de I/O, já deveria encapsular isso.
Não se pode cair na inocência de que tudo vai ser escrito e lido em Java. Aliás, mesmo que se pense isso, é um pensamento infantil, já é muitíssimo pouco provável que Java se torne a única opção do mercado.

Note que não estou falando em colocar tipos novos na linguagem Java. Estou falando que o DataInputStream deveria ter um método chamado readUnsignedShort, que lesse 2 bytes da rede, e me retornasse um int, contendo o valor desse dado sem sinal.

[quote=sergiotaborda]Sim. C lhe dá liberdade. Java lhe dá portabilidade. Mas C não lhe dá a liberdade de portar a sua aplicação sem recompilação.
além disso essas coisa que enumera são o tipo de liberdade que não queremos. [/quote]

Foi por isso que conclui que na maior parte das vezes, o Java é mesmo uma boa opção. E citei diversos mercados onde não se encaixa no caso do “não queremos”. E o detalhe, não são mercados pequenos. Se ainda não acredita, basta olhar para o número de aplicações na sua máquina que ainda são desktop, já que usam muitos recursos de SO. Vai desde o seu próprio SO, até o webbrowser onde está lendo o que escrevi. Nada disso foi feito em Java.

[quote=sergiotaborda]É como o GOTO. Lhe dá toda a liberdade, mas é uma porcaria de instrução em programação estruturada.
Vai me dizer que não prefere programação estruturada ?[/quote]

De onde surgiu o assunto de programação estruturada?

[quote=sergiotaborda]Java é acima de tudo estruturada. O seus objetivos são segurança e portabilidade. Os objetivos de C são fazer qualquer coisa
a qualquer preço. [/quote]

O C++ tem dois objetivos que contrastam muito com a linguagem Java:

  1. O C++ é uma linguagem criada para dar ao programador escolhas, mesmo que isso implique em ele fazer as escolhas erradas;
  2. O C++ baseia-se no princípio de recursos mínimos: o programador não deve pagar por coisas que não use;
  3. O C++ é projetado para suportar multiplos estilos e paradigmas de programação.

Nos artigos do Java, escutamos muito o “não implementamos esse recurso por que muitos programadores podem errar…”. Além disso, o Java reserva recursos por conta própria. O GC pré-aloca memória no heap, a linguagem Java cria diversos caches. Finalmente, o Java foca-se em um único paradigma, que é o orientado à objetos (embora haja também a possibilidade de programação reflexiva em menor escala), enquanto o C++ engloba 3 paradigmas: estruturado, OO e genérico.

Isso implica também no fato do C++ exigir um programador informado, responsável e disciplinado. Mas admito que seja difícil porque tradicionalmente não somos disciplinados. O que se torna ainda pior quando se trabalha em equipe.

Mas Vini, minha argumentação se baseia no fato de que é possível ler um unsigned de um DataInputStream url=http://java.sun.com/javase/6/docs/api/java/io/DataInput.html#readUnsignedShort%28%29[/url].

E anteriormente, você havia dito que seria possível jogar os dados de uma rede numa struct, o que eu discordo. Isso só é possível se você tiver certeza que as duas máquinas que se comunicam em rede são da mesma arquitetura. Se for o caso de um Sparc mandar dados para um Intel, então você terá que mudar o “endian” das variáveis um a um. Por isso que eu acredito que interpretação de bytes é um caso que pode ser feito melhor em Java.

[quote=Leonardo3001]Note que não estou falando em colocar tipos novos na linguagem Java. Estou falando que o DataInputStream deveria ter um método chamado readUnsignedShort, que lesse 2 bytes da rede, e me retornasse um int, contendo o valor desse dado sem sinal.
Mas Vini, minha argumentação se baseia no fato de que é possível ler um unsigned de um DataInputStream(link)[/url].[/quote]

É verdade, tinha me esquecido desse método. Mas ainda não tem métodos como readUnsignedInt e readUnsignedLong (e esse era justamente o meu problema).
Ironicamente, esses métodos não existem na java.nio também.

[quote=Leonardo3001]E anteriormente, você havia dito que seria possível jogar os dados de uma rede numa struct, o que eu discordo. Isso só é possível se você tiver certeza que as duas máquinas que se comunicam em rede são da mesma arquitetura. Se for o caso de um Sparc mandar dados para um Intel, então você terá que mudar o “endian” das variáveis um a um. Por isso que eu acredito que interpretação de bytes é um caso que pode ser feito melhor em Java.
[/quote]

Sim, verdade. Mas eu estava falando de manipulação de bytes no geral, e isso é muito prático com arquivos, por exemplo (meu exemplo foi realmente infeliz). Entretanto, no java, você também só tem o benefício do DataInputStream se for Java com Java. Se for java com máquina Sparc rodando C, aí você também vai ter que girar bytes, e essa será uma tarefa igualmente difícil com DataInputStream. Claro que o Java.nio já implementa a classe prática ByteBuffer, que faz isso por você, assim como as funções práticas do boost::asio no C++.

Aliás, geralmente, falam mal da parte de rede de C++, sendo que a maior parte das pessoas só usou os métodos nativos do SO, ou os métodos derivados do C. Uma forma bastante primitiva de usar sockets em C++. Aí, claro, fica injusto comparar as bibliotecas canhão do Java, com a arquitetura usada pelos caras que faziam TCP ainda na época do Unix.

Na verdade, é bem comum em fóruns como esse, de Java, as pessoas relatarem suas experiências traumatizantes em C, e associarem as mesmas experiências ao C++. Em termos de analogia, é como vocês reclamarem do Java, porque insistem em usar uma versão 1.0 do compilador…

Enfim, não é o caso de vocês que já tiveram experiência profissional, mas tenho certeza que parte da culpa é das próprias faculdades. Um professor dá aula de C, mal e mal esbarrando nas classes, e chama aquilo de C++. O aluno vê tudo no braço, de uma maneira que não se programa desde da época que os computadores eram medidos em megahertz. Aí, no semestre seguinte o neguinho vê Java… lógico, vai achar o negócio a quinta maravilha do mundo, e associar a imagem do C ao C++. Detalhe que esse mesmo cara sai da faculdade usando DefaultTableModel, Vector e HashTable, porque, afinal, o professor de Java dele também é um pouco defasado… :confused:

Mas… voltando a rede, se querem ver como se faz sockets no C++ hoje em dia, vale a pena conferir essa biblioteca aqui:
http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio.html

Ali também não há chances de se esquecer de um hton e nem de um ntoh.

PS: Embora eu esteja defendendo bastante o C++ aqui, quero deixar claro que sou muito fã de Java. Aliás, continuo recomendando ele para a absurda maioria dos casos. Só que, infelizmente, muita gente ainda não conhece a forma moderna de se programar em C++, e acaba falando mal da linguagem sem qualquer conhecimento de causa. Vocês também vão achar tópicos meus falando sobre performance de Java em fóruns de C++, e explicando para eles que o Java já não é lento também desde que inventaram uma tal de hotspot vm…

Bom pode dar exemplo usando RestFull em C++, ou em OSB ?

É muito fácil fazer um backend RESTFul em C++.

Obviamente, você vai fazer o backend em C++ e deixar o front end para linguagens feitas para isso, como o JSP ou mesmo o Asp.net (é até possível fazer o frontend em C++, mas seria tão prático quanto faze-lo em java diretamente).

Depois, você integra o backend com o frontend usando componentes como esses aqui:
http://www.webtoolkit.eu/wt
http://www.hughes.com.au/products/libhttpd/
http://www.webdav.org/neon/
http://xaxxon.slackworks.com/ehs/html/

Existem milhares de pessoas fazendo web com C++ por aí (inclusive a Google). Só ignorantes acham que o mundo é restrito ao Java, ou que só o java tem uma comunidade ativa, que cria componentes gratuitos. O C++ tem uma comunidade igualmente grande, fóruns bastante ativos e desenvolvimento gratuito e de boa qualidade.

E também não se faz coisas do zero por lá. Há centenas de milhares de libs prontas para toda e qualquer necessidade.

Agora, se for para fazer web, volto a recomendar o uso de Java, a menos que sua aplicação web acabe recaindo numa das exceções que citei em posts anteriores. Vejam bem, em momento nenhum eu falei que devemos substituir tudo por C++, ou que é a melhor linguagem do mundo. Só estou tentando esclarecer que não é tão ruim quanto a imagem que a maior parte das pessoas tem dele. O desenvolvimento por lá amadureceu muito. Agora, ele continua sendo uma linguagem mais difícil do que o Java.

[quote=ViniGodoy]É muito fácil fazer um backend RESTFul em C++.
Obviamente, você vai fazer o backend em C++ e deixar o front end para linguagens feitas para isso, como o JSP ou mesmo o Asp.net (é até possível fazer o frontend em C++, mas seria tão prático quanto faze-lo em java diretamente).
[/quote]
Acredito realmente que o backend é um papel mais especifico no que se encaixa mesmo para C++, ao passo que padrões de projetos e patterns java são especificações que vão atender a familia daquela tecnologia no caso java extende para APIs ao seu Core de desenvolvimento.

Aqui algo que vou explorar melhor ao assunto comentado.

Google usa Python para suportar sua Plataforma

[quote]
E também não se faz coisas do zero por lá. Há centenas de milhares de libs prontas para toda e qualquer necessidade.
Agora, se for para fazer web, volto a recomendar o uso de Java, a menos que sua aplicação web acabe recaindo numa das exceções que citei em posts anteriores. Vejam bem, em momento nenhum eu falei que devemos substituir tudo por C++, ou que é a melhor linguagem do mundo. Só estou tentando esclarecer que não é tão ruim quanto a imagem que a maior parte das pessoas tem dele. O desenvolvimento por lá amadureceu muito. Agora, ele continua sendo uma linguagem mais difícil do que o Java.[/quote]
Java é o que o Sergio Taborda colocou e fez uma otima observação, sobre o que você agora se propõe a fazer, leia o texto Java é o proximo C, acredito nisso também.

… que é feita em C++.

… que é feita em C++.[/quote]
E você esta no backend dessa sua observação na aplicação com C++, pois para chamada de serviço e somente com python mesmo sendo é uma linguagem de programação de alto nível, interpretada, imperativa, orientada a objetos, de tipagem dinâmica e forte.

… que é feita em C++.[/quote]

E daí? JRuby é feito em Java. Aliás, é perfeitamente possível fazer um compilador que gere código nativo ou interpretador em qualquer linguagem. BTW, Lisp é feito em Lisp.

… que é feita em C++.[/quote]

E daí? JRuby é feito em Java. Aliás, é perfeitamente possível fazer um compilador que gere código nativo ou interpretador em qualquer linguagem. BTW, Lisp é feito em Lisp.[/quote]

Eu não falei que o Python era feito em C++, embora seja. Mas que a plataforma do Google, o backend, é em C++.
:wink:

Ahem… e daí?

Só citei o google como um exemplo de empresa que usa o C++ em backend. E eles usam mesmo. Existem diversas linguagens fazendo front end sobre ela, como o Java (Orkut) e o Python. Mas não entendi… Porque da insistência em dizer que o python é tudo isso? Ninguém em momento nenhum está questionando os méritos do Python.

Nem inferiorizando qualquer linguagem.

[quote]
Ahem… e daí?

Só citei o google como um exemplo de empresa que usa o C++ em backend. E eles usam mesmo. Existem diversas linguagens fazendo front end sobre ela, como o Java (Orkut) e o Python. Mas não entendi… Porque da insistência em dizer que o python é tudo isso? Ninguém em momento nenhum está questionando os méritos do Python.

Nem inferiorizando qualquer linguagem.[/quote]

Só reforcei que ao contexto que a tecnologica tem ao seu papel, a liberdade do C++ em foco com a JVM ou melhor ainda as engines que rodam sobre a VM tais como JRuby, JPython que tem intercambeamento para usar padrões não alcançados, então precisamos entender cenários e sobre o que é backend ao C++, que não deixa de ter a sua importancia, mas não querer usar a ótica ao aspecto que ela não tem atuação, imagina usar C++ para IOC no Spring ao menos nunca ouvi falar.

Realmente. Aliás, até pela ausência de estruturas para reflexão, é uma tarefa árdua fazer injeção de dependências em C++. Ela é possível (até pq injetar dependências não obriga ter reflexão), mas é bem menos prático.

[quote=ViniGodoy]
Realmente. Aliás, até pela ausência de estruturas para reflexão, é uma tarefa árdua fazer injeção de dependências em C++. Ela é possível (até pq injetar dependências não obriga ter reflexão), mas é bem menos prático.[/quote]
Linguagem C++ não é Orientada a Aspecto mas Orientada a Objeto o que tornaria totalmente descabido repassar tal responsabilidade por cima de metodologia que se prega sobre adoções e suas estrategias, estariamos redesenhando uma tecnologia ou não aceitando o que foi sua geração e metodologia, algo como eu querer fazer uso do TDD, MDA, BDD, FDD com C++ , ou dizer que ela atua também na application , ou delegar outras arquitetura projetada a contexto que não é de seu padrão, backend sim atras desse bastidores e aceitavel, mas não vamos desvirtualizar sua real aplicação.

O C++ é uma linguagem multi-paradigma. Ela suporta os paradigmas orientado a objetos, estruturado e genérico (não suportada pelo Java);

Também não entendi pq sua sopa de letrinhas não são possíveis em C++. Todas elas são apenas métodos de desenvolvimento, todos independentes de linguagem, todos independentes da capacidade ou não de ter reflexão. E nenhuma delas depende de uma linguagem ser ou não orientada a aspectos.

Pegue por exemplo o TDD. É possível e anterior ao Java a prática de TDD em C++. Algumas bibliotecas já faziam TDD até mesmo em C. E onde aspectos são aplicados em TDD? Talvez facilite a implementação de um executor de testes automático. Mas nada que o uso de uma linguagem de script de suporte não torna possível também. Ou mesmo chamar estaticamente os métodos de teste dentro de um main (abordagem citada pelo fowler, no livro Refactoring, por sinal).

Todas as outras metodologias citadas por você são plenamente cabíveis em C++. Inclusive MDA, BDD e FDD. Talvez você esteja simplesmente ignorando o fato de que o C++ está presente em aplicações de desktop, inclusive com muito mais força que o Java, e que tudo isso não é só aplicável a web.

[quote=ViniGodoy]
O C++ é uma linguagem multi-paradigma. Ela suporta os paradigmas orientado a objetos, estruturado e genérico (não suportada pelo Java);[/quote]
Java é uma linguagem portável e C, C++ não é, posso ter java rodando em cenários multi-diferenciados, isso é a razão por que Java faz tanto sucesso, e a Oracle não pagou seus 7 bilhões, sem ter previsões para os seus negocios, motivo ai de ter uma tecnologia superior a muitas ai no controle de ESB usando Oracle Service Bus, é o que faz SOA realmente acontecer.

[quote]
Também não entendi pq sua sopa de letrinhas não são possíveis em C++. Todas elas são apenas métodos de desenvolvimento, todos independentes de linguagem, todos independentes da capacidade ou não de ter reflexão. E nenhuma delas depende de uma linguagem ser ou não orientada a aspectos.[/quote]
Se Ruby já existe mesmo antes do Java, porque não elegeram C++ para ser uma linguagem Ágil ?

[quote]
Pegue por exemplo o TDD. É possível e anterior ao Java a prática de TDD em C++. Algumas bibliotecas já faziam TDD até mesmo em C. E onde aspectos são aplicados em TDD? Talvez facilite a implementação de um executor de testes automático. Mas nada que o uso de uma linguagem de script de suporte não torna possível também. Ou mesmo chamar estaticamente os métodos de teste dentro de um main (abordagem citada pelo fowler, no livro Refactoring, por sinal).[/quote]
C++ trabalha junto ao Hibernete, então eu teria classe em C++ que são classes que persistem usando o modelo DAO, algo estranho nunca ouvi falar sobre o uso de C++ para essas condições, se tiver alguem que conheça pode se manisfestar.

[quote]
Todas as outras metodologias citadas por você são plenamente cabíveis em C++. Inclusive MDA, BDD e FDD. Talvez você esteja simplesmente ignorando o fato de que o C++ está presente em aplicações de desktop, inclusive com muito mais força que o Java, e que tudo isso não é só aplicável a web.[/quote]
No cenário Backend mas não que faça uso disso usando um Patterns de Controle, ou mesmo imagina usar anotação em C++ nunca ouvi falar disso também, as metodologias são efeitos de empregos aceitos em pró do Design de projetos e C++ é standAlone não vejo ser Domain ou ter MultiCamadas para tratar de modelos que não são compreensiveis ou fatos de que comprovem o uso até para essas novas adoções ao cenário Ágil, alguém já deu exemplos de Rails suportando C++ não lembro.

[quote=JavaLivros][quote=ViniGodoy]
O C++ é uma linguagem multi-paradigma. Ela suporta os paradigmas orientado a objetos, estruturado e genérico (não suportada pelo Java);[/quote]
Java é uma linguagem portável e C, C++ não é, posso ter java rodando em cenários multi-diferenciados, isso é a razão por que Java faz tanto sucesso, e a Oracle não pagou seus 7 bilhões, sem ter previsões para os seus negocios, motivo ai de ter uma tecnologia superior a muitas ai no controle de ESB usando Oracle Service Bus, é o que faz SOA realmente acontecer.

[quote]
Também não entendi pq sua sopa de letrinhas não são possíveis em C++. Todas elas são apenas métodos de desenvolvimento, todos independentes de linguagem, todos independentes da capacidade ou não de ter reflexão. E nenhuma delas depende de uma linguagem ser ou não orientada a aspectos.[/quote]
Se Ruby já existe mesmo antes do Java, porque não elegeram C++ para ser uma linguagem Ágil ?

[quote]
Pegue por exemplo o TDD. É possível e anterior ao Java a prática de TDD em C++. Algumas bibliotecas já faziam TDD até mesmo em C. E onde aspectos são aplicados em TDD? Talvez facilite a implementação de um executor de testes automático. Mas nada que o uso de uma linguagem de script de suporte não torna possível também. Ou mesmo chamar estaticamente os métodos de teste dentro de um main (abordagem citada pelo fowler, no livro Refactoring, por sinal).[/quote]
C++ trabalha junto ao Hibernete, então eu teria classe em C++ que são classes que persistem usando o modelo DAO, algo estranho nunca ouvi falar sobre o uso de C++ para essas condições, se tiver alguem que conheça pode se manisfestar.

Apesar de não rodar em máquina virtual, c++ é portável a todos os sistemas que você pode imaginar, além de outros cenários que java não é utilizado, como eletrônica digital.

Toda metodologia é cabível em qualquer linguagem. Tudo isso também foi implementado em pascal e n outras linguagens.

Java é uma linguagem portável, pena que a Sun só disponibilize VMs para 3 sistemas operacionais. Já no C++, você tem portabilidade para centenas de plataformas. Infelizmente, a portabilidade do C++ envolve mais disciplina no código e recompilação, ou seja, acaba sendo um pouco mais difícil que em Java. Entretanto, já escrevi jogos em SDL, que foram portáveis em aproximadamente 16 plataformas, inclusive algumas que o Java nunca sequer ouviu falar.

Bom, obviamente você não ouviu falar de muita coisa em C++…
Mas como volto a repetir pela ducentézima vez, o C++ é menos forte nos mercados do Java, não porque não seja possível usar as técnicas em C++, mas porque realmente é mais difícil. Tanto porque a linguagem exige a preocupação em detalhes que na maior parte das vezes são inúteis para esse tipo de aplicação (como a gerência de memória), quanto porque os profissionais Java são mais disponíveis e mais baratos.

[quote=“javalivros”]No cenário Backend mas não que faça uso disso usando um Patterns de Controle, ou mesmo imagina usar anotação em C++ nunca ouvi falar disso também, as metodologias são efeitos de empregos aceitos em pró do Design de projetos e C++ é standAlone não vejo ser Domain ou ter MultiCamadas para tratar de modelos que não são compreensiveis ou fatos de que comprovem o uso até para essas novas adoções ao cenário Ágil, alguém já deu exemplos de Rails suportando C++ não lembro.
[/quote]

Patterns de controle são usados também em qualquer linguagem. Modelos multicamadas também.

Agora, anotações, não. Como falei, o C++ não implementa o paradigma reflexivo, então, não existem anotações. Você pode driblar isso como o hibernate fazia antigamente, através de arquivos xml, ou usando scripts escritos em Lua, Squirrel, ou qualquer outra linguagem do tipo.

Só lembrando. “Cenário ágil” não se restringe ao Rails. Novamente, você ignora a existência de outros tipos de aplicação, como as de desktop, onde o C++ é fortemente inserido. Para se ter um cenário ágil existe uma série de práticas, e como isso se trata de uma metodologia relacionada ao processo de desenvolvimento, pode ser aplicado em qualquer linguagem.

Só falta você dizer que C++ é a melhor solução em cloud-computing.