On 3 Apr 2003, at 9:36, Alexandre Monteiro Janoni wrote:

> http://www.portaldaprogramacao.com/artigos2.asp?n=104


        Eu achei muito engracada a lista de "vantagens" do C#
        sobre o Java. Torcidas organizadas aa parte, vamos e-
        xaminar algumas delas:




        1 - "Compilado para código nativo
        Java: Raramente. O Java é quase sempre interpretado."

        (Nosso amigo autor do artigo certamente nunca ouviu
        falar em JIT.)


        "C#: Sempre compilado para código nativo. A compilação 
        pode ser feita na instalação ou na primeira execução 
        do programa."


        Ou seja: perde-se a portabilidade do binario ao e-
        xecutar a 1a. vez. Isso eh "vantagem" ? Ok.



        2 - "Todos os tipos derivados de ancestral comum"
        "Java: Não."

        Excelente! Se eu quiser um boolean apenas, ocupo um
        byte da memoria, e nao o espaco de  um objeto intei-
        ro, apenas para guardar um estado logico! Sem contar
        que eh um  objeto a menos  para o garbage collector
        tratar...

        "C#: Sim, todos os tipos são derivados de object."

        Duh... Novamente nao entendi a "vantagem". Mas vamos
        adiante...

        3 - "'Boxing' e 'Unboxing' - conversão de tipos por 
        valor para tipos por referência"
        "Java: Não. Exige conversão manual."
        "C#: Sim."

        Ei, estamos falando de uma linguagem fortemente tipa-
        da. Nao de Visual Basic. Conversao automatica signi-
        fica execucao mais lenta, porque a toda hora o runtime
        tem que ficar checando tipos de dados. Tipagem forte
        significa checagem sendo feita apenas em tempo de com-
        pilacao, nao de execucao - logo, o codigo roda mais
        rapido! Cade a "vantagem", que eu ainda nao vi ? Ok, 
        vamos ser pacientes, devem estar todas no final...


        4 - "Structs"
        "Java: Não."
        "C#: Sim."

        Essa eu confesso que nao entendi: ele estah se refe-
        rindo a estruturas do C ? Mas vem cah, se Java eh uma
        linguagem TOTALMENTE ORIENTADA A OBJETO, que sentido
        faz suportar estruturas de dados C-like ? 

        5 - "Enum"
        "Java: Não."
        "C#: Sim."

        Ok, aqui dou o braco a torcer: eu ateh que gostaria 
        de ter tipos enumerados em Java. Com eles, dah para 
        escrever um codigo mais claro e legivel do que ficar
        fazendo coisas do tipo:

        public final static int MINHA_CONSTANTE_1 = 1;
        public final static int MINHA_CONSTANTE_2 = 2;

        Mas nada que me tire o sono ou me faca correr deses-
        perado para o C#. Vamos adiante.


        6 - "Passagem de parâmetros por referência"

        "Java: Não."
        "C#: Sim, de duas maneiras: ref para parâmetros de 
        entrada e saída e out para parâmetro apenas de saída."

        Sinceramente ? Prefiro assim. Porque ? Bom, para
        qual plataforma voces acham que eh mais facil surgir
        uma falha de seguranca explorando justamente acessos
        ilegais aa areas de memoria ?

        7 - "Propriedades"

        "Java: Não. Podem ser simuladas com métodos Get/Set, 
        com alguma dificuldade."

        "C#: Sim, diretamente. A criação de “componentes” 
        é bastante facilitada."


        Componentes visuais. Mas o conceito de componente
        vai alem de uma GUI com iconezinhos para arrastar
        num formulario. Um EJB eh um componente; uma servlet,
        um portlet, e por aih vai. Todos com propriedades e
        metodos, passiveis de customizacao. A unica diferen-
        ca eh que no Java nao se usa uma GUI (ateh existe su-
        porte a programar desta maneira em algumas ferramen-
        tas, como o Visual Age for Java, mas nunca usei - e
        sinceramente, nao me fez falta). 

        Eu gostaria de saber se ele saberia escrever uma
        aplicacao em C# sem a GUI...   :)


        8 - "Eventos e Delegates"

        "Java: Não, categoricamente (veja link abaixo)."

        "C#: Sim. Um “delegate” é um “ponteiro de função 
        orientado a objetos”, permitindo a associação de 
        um evento de uma classe ao código de outra de 
        maneira conceitualmente simples e poderosa."


        Novamente: isso eh plenamente possivel de ser feito
        em Java. Apenas, nao eh visual (selecionar um even-
        to num object inspector, e selecionar um metodo pronto
        ou escrever um novo). 


        9 - "Atributos"

        "Java: Não."

        "C#: Sim, permitindo “etiquetar” o código com 
        características que são interrogadas em tempo 
        de execução através de “reflection”."


        Vide acima.


        10 - "Ponteiros"

        "Java: Não suportado diretamente, apenas indiretamente 
        através de “referências”."

        "C#: A princípio suporta referências, mas os ponteiros 
        podem ser usados em código “inseguro” por questões 
        de performance ou compatibilidade com DLLs."



        Alguem mais estah sentindo cheiro de falhas de se-
        guranca e codigo amarrado aa plataforma Windows ?



        11 - "Sobrecarga de operadores"

        "Java: Não."
        "C#: Sim."

        Se com "sobrecarga de operadores" ele estah falando
        de sobrecarga de metodos, nosso amigo estah por fo-
        ra, mesmo...


        12 - "Operadores de conversão"

        "Java: Não."
        "C#: Sim."

        Dispensaveis gracas aa forte tipagem da linguagem.
        

        13 - "Operadores de cast"

        "Java: Um, sintaxe semelhante ao C/C++."

        "C#: Dois, um semelhante ao C/C++ e o outro “as”. 
        Um retorna null e outro dispara exception em casso 
        de erro de conversão."

        Ou seja, seu codigo pode compilar e ainda sim estar
        errado. Eh por isso que a tipagem forte do Java eh
        melhor. Ele realmente acha isso "vantagem" ?


        14 - "Inteiros sem sinal"

        "Java: Não."

        "C#: Sim."


        Realmente, nao existem inteiros sem  sinal no  Java.
        Tambem nao  existem no  Pascal,  Visual Basic  e um
        monte de outras linguagens. Na verdade, soh existem
        inteiros  unsigned no  C e C++,  pelo que Lembro. E 
        ainda assim o mundo nao acabou.


        15 - "Tipo numérico pouco sujeito a erros de representação 
        e arredondamento"

        "Java: Não."

        "C#: Sim, o tipo decimal pode ser usado em softwares 
        que não toleram facilmente erros de arredondamento, 
        como programas de contabilidade"


        java.text.NumberFormat
        java.util.Currency

        Simples e preciso.


        16 - "Forech: loop para varrer arrays e coleções"

        "Java: Não."
        "C#: Sim."

        17 - "Campo readonly"

        "Java: Não."
        "C#: Sim."


        Simples: nao implemente o metodo set do
        atributo. Duh...


        17 - "Documentação integrada em XML"

        "Java: Não."

        "C#: Sim, permitindo que o programador escreva 
        facilmente a documentação enquanto programa. 
        Este documentação pode depois ser extraída do 
        fonte ou usada no próprio ambiente de desenvolvimento."


        Ele jah ouviu falar de JavaDoc ?


        18 - "Switch com strings"

        "Java: Não."
        "C#: Sim, facilitando o desenvolvimento."


        E diminuindo a performance. Internamente, o switch
        comparando strings eh construido de  forma diferen-
        te (e mais lenta) do que  usando um  literal  (int,
        char ou coisa que  o valha). Resta  saber o que eh
        melhor: ter uma  vez o conforto de usar  um string 
        para controlar  um processo, ou escrever um codigo 
        que gera um opcode  menor e execute mais rapido to-
        das as vezes.
        


        19 - "Controle sobre “estouro de faixa” numérica"

        "Java: Não."

        "C#: Sim. As palavras reservadas checked e unchecked 
        permitem mudar o que o programa faz quando há um 
        “estouro de faixa numérica”: o checked dispara uma 
        exception; o unchecked não."

        Ou seja, eh  um bypass do  mecanismo de  tratamento 
        de excecao. Para quem jah estah  acostumado a lidar
        com try - catch, eh um superfluo. E quem nao estah,
        eventualmente vai ter que  se acostumar, porque to-
        dos os  outros tipos de erro geram excecoes, e  nao
        tem como desliga-las todas.  



        20 - "Funções com número variável de parâmetros"

        "Java: Não."

        "C#: Sim, de forma “tipada”, com a palavra reservada 
        params."

        Oh... Tem razao: eu nao consigo escrever codigo dubio
        e pouco legivel facilmente com Java. Que droga.


        21 - "Formas do método Main"

        "Java: Uma."

        "C#: Quatro. O main pode aceitar um array de strings 
        ou nada; pode retornar inteiro ou nada."

        Este eh o segundo ponto em que eu realmente acho que
        o Java peca: o metodo Main() nao faz qualquer retor-
        no ao sistema operacional sobre o status final da e-
        xecucao. Isso pode ser util no  caso de  execucao a
        partir de shell scripts no Unix. 


        22 - "Goto"

        "Java: Não."

        "C#: Sim, com a restrição de que não pode entrar em 
        um bloco."



        Java nao tem GOTO! Java nao eh BASIC! Vamos todos
        dizer: AMEM! 

        Qualquer curso de programacao serio jah aboliu o 
        GOTO faz alguns anos. Seja em qual linguagem for.
        Eh altamente prejudicial para a legibilidade do
        codigo e modularizacao. Ateh em Cobol se proibe o 
        uso de GOTO hoje em dia, e vem nosso amigo anunciar 
        isso como "vantagem"... Soh se for para o Java.



        23 - "Arquivo “executável” independente do namespace"

        "Um “package” Java obrigatoriamente está associado a 
        um único arquivo “.class”."

        "Não existe relação direta entre o “namespace” e a 
        DLL que o implementa, dando mais flexibilidade ao 
        desenvolvedor na hora de quebrar seus projetos em 
        pedaços menores."

        
        E ajudando a manter o caos na hora de organizar o 
        codigo...

        E francamente, de onde saiu esse "um package estah
        obrigatoriamente associado a um unico arquivo .class ?"


        24 - "Especificadores de acesso"

        "Quatro."

        "Cinco. O internal, adicional, especifica acesso 
        apenas no mesmo “assembly” (mesma DLL, a grosso modo)."


        Java eh independente de plataforma. Eh a sua principal
        caracteristica. Eu acho otimo que seja assim.


        25 - "Diretivas de compilação condicional (#ifdef etc)"

        "Java: Não."
        "C#: Sim."

        Diretiva de compilacao para codigo binario que executa
        sem modificacao em qualquer plataforma ? 

        26 - "Destrutores"

        "Java: Não, mas o método Finalize pode ser usado."

        "C#: Sim."

        Quando nao se tem um bom garbage colletor...

        27 - "Padronização por algum organismo internacional"

        "Java: Não. Duas submissões da Sun foram posteriormente
        retiradas."

        "C#: Sim. Submetido e aceito pelo ECMA (http://www.ecma.ch)."


        Java eh usado largamente pela industria de software,
        de  telefonia movel, meios academicos e cientificos.
        A sonda Sojourney rodava Java. Eh uma linguagem que
        se consagrou como um padrao     de fato. Alguem aih sabe 
        o que eh ECMA, por acaso ?
        


        28 - "Chama APIs do Windows e DLLs"

        "Java: Não. Mesmo o suporte “nativo” de alguns compiladores 
        é extremamente limitado pela falta de ponteiros na linguagem."

        "C#: Sim."


        Vamos todos dizer, irmaos: AMEM por isso!


        29 - "Chama objetos COM/COM+"

        "Java: Não."

        "C#: Sim."

        30 - "Cria objetos COM/COM+"

        "Java: Não."

        "C#: Sim."

        Quem precisa de COM (M$) quando tem CORBA (open source) ?


 "Existem alguns pontos importantes por trás dos tópicos acima:

    * O C# implementa características interessantes do C++ que foram 
removidas no Java, como passagem de parâmetros por referência, enum, 
struct, sobrecarga de operadores, operadores de conversão e 
compilação condicional;"


        Tudo foi retirado com um proposito: tornar a linguagem 
        universal e totalmente portavel. Nao foi por outro mo-
        tivo. 


    "* O C# tem vários recursos que melhoram a performance, como uso 
de “tipos por valor” (structs e enums) em situações simples onde o 
uso de uma classe seria muito “caro” e suporte direto a ponteiros;"


        E tem varias "vantagens" que podem jogar a performance no
        chao, como  a tipagem fraca (pior de todos, heranca maldi-
        ta do BASIC que  a Microsoft ateh hoje  insiste em manter
        nas suas linguagens, criando maus habitos de programacao) 
        e os switches usando strings.



    "* Suporte direto a componentes, através de a propriedades e 
eventos;"


        Java eh *todo componentes* - apenas nao sao visuais.



    "* A unificação do sistema de tipos (tudo é derivado de object) e 
a conversão de valores para referências através de “boxing” são 
recursos que, ao mesmo tempo simplificam a programação, como também 
permitem melhores abstrações;"


        E jogam contra a performance.


    "* Boa integração com código anterior escrito para Windows:"



        Mantendo voce atrelado aa plataforma Windows, nao por acaso.



        "suporte a ponteiros, chamar DLLs, chamar objetos COM e criar
        objetos COM. Não é necessário abandonar o C# para usar alguma
        facilidade não contemplada pela biblioteca de classes;"


        Eh o trade-off que se faz por ficar atado ao Windows. Talvez
        para alguns isso seja aceitavel, mas nao para todos.

        No resumo deste testamento, fica a seguinte impressao: C#
        promete "facilitar a vida" do programador - mas soh do pro-
        gramador "desenhista de formularios"; aquele que realmente
        sabe programar, que conhece os pros e contras de cada tec-
        nologia, sabem que no geral, Java estah ganhando e facil,
        pelo menos no aspecto tecnico. Infelizmente, este canto de
        sereia da Microsoft seduz muita gente boa - e principalmente,
        muita gente que toma decisoes dentro de empresas. Cabe aa
        nos, que conhecemos a ferramenta que usamos e seu potencial,
        nos esforcarmos para que a verdade sempre se sobreponha ao
        marketing. Vamos trabalhar nesse sentido, sem radicalismos
        exagerados, sempre procurando embasar nossas opinioes em 
        fatos e nao em emocao (o que eh muito dificil, eu sei bem).
        Isso nao eh torcida por time de futebol, eh nosso ganha-
        pao. Tambem nao eh religiao (pelo menos para mim), portanto
        respeitar diferencas de opiniao faz parte. Apenas, nao 
        permitir que este tipo de material se torne "verdade"
        por conta de nosso silencio e omissao.


Abracos, Carlos

------------------------------ LISTA SOUJAVA ---------------------------- 
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP 
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED] 
-------------------------------------------------------------------------

Responder a