Linguagem ou Plataforma?
Em primeiro lugar, antes de fazer qualquer comparação entre Java e alguma outra tecnologia, é bom enfatizar que “Java” pode significar duas coisas bastante diferentes:
- Uma linguagem de programação.
- Uma plataforma de execução, que inclui, no mínimo, um “runtime” e uma biblioteca de classes, usualmente conhecidos como “Java Virtual Machine”.
Por uma questão de objetividade, esta comparação limita-se à linguagem de programação Java e não compara as plataformas da Sun e da Microsoft. Algumas características bastante interessantes no desenvolvimento de software, como por exemplo, o amplo suporte a diferentes culturas presente no C# foram deixados de lado por tecnicamente fazerem parte da “.NET Framework”.
Não estou também comparando o Visual Studio.NET com nenhum ambiente integrado de desenvolvimento para Java, embora o Visual Studio seja, na minha opinião, um produto muito mais completo.
Semelhanças
O C# foi sem dúvida influenciado por diversas linguagens, dentre as quais evidentemente Java, C++, Delphi e Smalltalk. Veja no quadro a seguir algumas das semelhanças com o Java:
| Semelhanças entre C# e Java | |
| Característica | Implementação |
| Inspirado no C/C++ | Boa parte da sintaxe de ambas as linguagens foi inspirada no C/C++, especialmente declaração de variáveis, funções e estruturas de controle. |
| Orientação a objetos | Ambas as linguagens suportam conceitos de programação orientada a objetos com a palavra reservada class. |
| Herança | Herança simples de classes a partir de ancestral comum e herança múltipla de interfaces. |
| Gerenciamento de memória | Automático, com “coletor de lixo”. |
| Tipagem forte | Todas as atribuições tem os tipos validados. Os “casts” são sempre verificados em tempo de execução. Não é possível violar o sistema de tipos. |
| Compila para código intermediário | Sim. No caso da Microsoft compila para “Intermediate Language” e no Java para “bytecode”. |
| Tratamento de erro | Exceptions. |
| Reflections | Ambas as linguagens suportam “reflections”. |
| Unicode | Ambas as linguagens usam o padrão Unicode para representar caracteres e strings. |
| Classe que não pode ser herdada | “final” em Java; “sealed” em C#. |
| Campo constante | “static final” em Java; “const” em C#. |
| Operador que verifica compatibilidade de tipos | “instanceof” em Java; “is” em C#. |
Os aspectos acima são auto-explicativos e refletem o pensamento atual no desenvolvimento de software, especialmente o uso de orientação a objetos em um ambiente “gerenciado”, no qual o programa não pode danificar o ambiente de execução.
Novidades do C#
O C# tem diversas novidades que tornam o desenvolvimento de software mais fácil e produtivo, como mostrado a seguir:
| Recursos novos no C# | ||
| Característica | Java | C# |
| Compilado para código nativo | Raramente. O Java é quase sempre interpretado. | Sempre compilado para código nativo. A compilação pode ser feita na instalação ou na primeira execução do programa. |
| Todos os tipos derivados de ancestral comum | Não. | Sim, todos os tipos são derivados de object. |
| “Boxing” e “Unboxing” - conversão de tipos por valor para tipos por referência | Não. Exige conversão manual. | Sim. |
| Structs | Não. | Sim. |
| Enum | Não. | Sim. |
| Passagem de parâmetros por referência | Não. | Sim, de duas maneiras: ref para parâmetros de entrada e saída e out para parâmetro apenas de saída. |
| Propriedades | Não. Podem ser simuladas com métodos Get/Set, com alguma dificuldade. | Sim, diretamente. A criação de “componentes” é bastante facilitada. |
| Eventos e Delegates | Não, categoricamente (veja link abaixo). | 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. |
| Atributos | Não. | Sim, permitindo “etiquetar” o código com características que são interrogadas em tempo de execução através de “reflection”. |
| Ponteiros | Não suportado diretamente, apenas indiretamente através de “referências”. | 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. |
| Sobrecarga de operadores | Não. | Sim. |
| Operadores de conversão | Não. | Sim. |
| Operadores de cast | Um, sintaxe semelhante ao 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. |
| Inteiros sem sinal | Não. | Sim. |
| Tipo numérico pouco sujeito a erros de representação e arredondamento | Não. | Sim, o tipo decimal pode ser usado em softwares que não toleram facilmente erros de arredondamento, como programas de contabilidade |
| Forech: loop para varrer arrays e coleções | Não. | Sim. |
| Campo readonly | Não. | Sim. |
| Documentação integrada em XML | Não. | 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. |
| Switch com strings | Não. | Sim, facilitando o desenvolvimento. |
| Controle sobre “estouro de faixa” numérica | Não. | 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. |
| Funções com número variável de parâmetros | Não. | Sim, de forma “tipada”, com a palavra reservada params. |
| Formas do método Main | Uma. | Quatro. O main pode aceitar um array de strings ou nada; pode retornar inteiro ou nada. |
| Goto | Não. | Sim, com a restrição de que não pode entrar em um bloco. |
| 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. |
| Especificadores de acesso | Quatro. | Cinco. O internal, adicional, especifica acesso apenas no mesmo “assembly” (mesma DLL, a grosso modo). |
| Diretivas de compilação condicional (#ifdef etc) | Não. | Sim. |
| Destrutores | Não, mas o método Finalize pode ser usado. | Sim. |
| Padronização por algum organismo internacional | Não. Duas submissões da Sun foram posteriormente retiradas. | Sim. Submetido e aceito pelo ECMA (http://www.ecma.ch). |
| Chama APIs do Windows e DLLs | Não. Mesmo o suporte “nativo” de alguns compiladores é extremamente limitado pela falta de ponteiros na linguagem. | Sim. |
| Chama objetos COM/COM+ | Não. | Sim. |
| Cria objetos COM/COM+ | Não. | Sim. |
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;
- 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;
- Suporte direto a componentes, através de a propriedades e eventos;
- 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;
- Boa integração com código anterior escrito para Windows: 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;
- Diversos recursos que facilitam a programação, como switch com strings, “loop” foreach para varrer todos os elementos de uma coleção ou array, campo readonly;
Conclusão
Embora compartilhe características com o Java, o C# é uma linguagem que traz vários recursos muito interessantes que não ou existem no Java ou dão muito trabalho para implementar ou têm performance ruim.
Leitura interessante na Web
Introdução ao C#:
http://msdn.microsoft.com/vstudio/nextgen/technology/csharpintro.asp
Artigo da MSDN Magazine:
http://msdn.microsoft.com/msdnmag/issues/0900/csharp/csharp.asp
Artigo da Doctor Dobb’s Journal sobre C#:
http://www.ddj.com/articles/2000/0065/0065g/0065g.htm
Site de C# da O’Reyley, com vários artigos comparativos:
http://www.oreillynet.com/topics/dotnet/csharp.net
Artigo da Sun “explicando” porque o Java não tem nem terá delegates:
http://java.sun.com/docs/white/delegates.html
Resposta da Microsoft mostrando porque os delegates são úteis:
http://msdn.microsoft.com/archive/default.asp?url=/ARCHIVE/en-us/dnarvj/html/msdn_deltruth.asp
Sobre o prêmio da DDJ a Anders Hejlsberg, o criador do C#:
http://www.ddj.com/articles/2001/0105/0105a/0105a.htm
Entrevista de Anders Hejlsberg:
http://www.dnjonline.com/teched2001/Hejlsberg_head2head.html
Mais uma entrevista com Anders Hejlsberg:
http://news.cnet.com/news/0-1003-200-5677521.html?tag=tp_pr
http://www.ddj.com/columns/stob/2001/0106vs001.htm

Nenhum comentário:
Postar um comentário