“jujo”:
Legal!
Gostei do conhecimento passado.
Obrigado pelas explicações.
Quanto a CLS tenho conhecimento, mas ja vi artigos onde estudiosos do .Net desaconselhavam o uso das outras linguagens da plataforma por não serem tão boas quanto o C# (claro), mas também pelo motivo das imcompatiblidades que em certos casos ocasionava, pelo motivo de terem que ser portadas para aceitarem OO, e para trabalharem de acordo com a plataforma…
Ja vi como a VM do .Net funciona, e é realmente igual nas idéias, ao java, mas com algumas diferenças na implementação, o que, sem querer “vender meu peixe”, são inferiores ao Java, e ainda mais agora com o Tiger, o qual trouxe muitas modificações, e melhorou muito alguns aspectos internos como as implementações de reflections, e chamadas a métodos que o deixou muito mais rapido, e “preciso”, digamos assim…
E quanto ao MSIL do .Net (byteCodes do Java), ouvi falar, e gostaria de saber de vc, se os códigos gerados, ja tem algumas coisas de códigos de máquina, para tentar torna-lo mais rapido quando interpretado/compilado pelo CLR.
Obrigado e até mais!
ps: para quem se interessar no assunto das diferenças de C# e Java, de uma olhada nesse artigo, onde Thomas Paul, faz uma comparação bem imparcialista sobre as duas linguagens em:
http://www.javaranch.com/newsletter/Sept2002/JavaAndCSharp.html
ps2: Sendo este artigo meio antigo, algumas coisas dessas ja estão no Java1.5, das quais o nosso amigo Rogerio poderia destacar.
Olá Juliano,
Por favor, se for possível, passe o link dos artigos destes “estudiosos” de .NET que desaconselham o uso das outras linguagens por não serem tão boas quanto o C#. Primeiro, eu acho muito difícil que eles tenham feito um estudo tão completo a ponto de comparar o C# com as mais de 40 linguagens disponíveis atualmente para a Plataforma .NET. Apenas para citar algumas linguagens disponíveis para a plataforma .NET, veja a seguinte relação: Visual Basic .NET, C++ managed Code, J#, JScript .NET, IL Assembler, Delphi, Python for .NET, Perl for .NET, Smalltalk for .NET, COBOL for .NET, Salford FTN95 for .NET (Fortran95), Fortran for .NET, DotLisp (dialeto Lisp for .NET), PHP#, Forth, Chrome for .NET, Standard ML, S#, Boo, Nemerle, Oberon, Eiffel, Component Pascal, F#, Mercury, IronPython, P#, Pan#, RPG, Lua .NET, Haskell, APL, Scheme, Mondrian for .NET, extensible C# (XC#), etc. É importante ressaltar que não podemos concluir que C# é a melhor linguagem .NET simplesmente pelo fato de ter sido criada do zero para a plataforma .NET. Outras linguagens também foram criadas do zero para a plataforma .NET, como: Nemerle (http://nemerle.org) e Boo (http://boo.codehaus.org), dentre outras.
É importante deixar claro que o compilador de qualquer linguagem para .NET compila o código fonte para IL (Intermediate Language), como o bytecode em Java. Sendo assim, o ambiente de execução do .NET (Common Language Runtime - CLR) executa o código intermediário do mesmo modo, independente do código fonte original. As diferenças de performance podem acontecer por causa de diferenças na compilação do código fonte para o código IL. (Na realidade, o código gerado na compilação é denominado PE, que será explicado adiante.)
Quanto a qual é a melhor máquina virtual, JVM (Java Virtual Machine) ou o CLR (Comoon Language Runtime), eu acho que existem vários aspectos s serem analisados. Certamente, em alguns aspectos a JVM deve ter uma implementação melhor que o CLR e em outros, o contrário. A Microsoft trabalhou durante alguns anos na sua própria implementação de um compilador Java (Visual J++) e uma máquina virtual. Neste período, técnicos altamente especializados em Java e outras linguagens trabalharam na Microsoft estudando detalhadamente a plataforma Java. Por exemplo, em 1996 a Microsoft contratou o Anders Hejlsberg (criador do Turbo Pascal e arquiteto chefe do Borland Delphi) da Borland e vários outros especialistas da Borland e de outras empresas (inclusive da Sun), para desenvolver o projeto do Visual J++. Além disto, a Microsoft investe bilhões de dólares por ano em pesquisa. Será que todos estes especialistas em Java e com todo este investimento, eles não conseguiram melhorar em nada a máquina virtual Java? Isto é uma questão de bom senso.
O projeto do “Tiger” (J2SE 5.0) teve como principal objetivo manter a compatibilidade com as máquinas virtuais do legado. Sendo assim, grande parte das melhorias na linguagem Java corresponde a um “açúcar sintático”, pois o compilador gera um código que, anteriormente, teria que ser gerado manualmente pelo desenvolvedor Java. A Sun investiu muito tempo também para melhorar a performance de execução das aplicações Java na JVM. Porém, as restrições impostas pela compatibilidade com o legado atrapalham muito a questão de performance. Mas, este é um preço que a Sun vai ter que pagar neste momento, pois a quebra de compatibilidade com as máquinas virtuais antigas poderia causar o fracasso da adoção do J2SE 5.0 e, conseqüentemente, das várias novidades introduzidas na linguagem Java.
Todo o código compilado para a plataforma .NET gera um PE (Portable Executable). O PE corresponde a um formato de arquivo que define a estrutura que todos os arquivos executáveis (EXE) e bibliotecas de ligação dinâmica (DLL) devem ter para permitir que sejam carregados e executados pelo Windows. O formato PE é derivado do Common Object File Format (COFF). Os arquivos .EXE e .DLL criados para o .NET Framework obedecem aos formatos PE/COFF. Para ver uma análise em profundidade sobre este assunto, você pode ler o artigo “An In-Depth Look into the Win32 Portable Executable File Format” (http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx), escrito pelo “Matt Pietrek” e dividido em duas partes. O único código nativo que existe é para carregar e iniciar a execução da aplicação .NET na memória. Desta forma, uma aplicação executável .NET não precisa chamar um programa intermediário como acontece com Java (java.exe). Você chama o executável da aplicação diretamente. Quando o PE é portado para outra plataforma (como a plataforma Linux, por exemplo), então o código nativo para carregar e iniciar a execução da aplicação não vai funcionar. Sendo assim, as outras plataformas devem fornecer um programa para carregar e iniciar a execução do código IL. Por exemplo, para executar o programa PE “MeuPrograma.exe” no Mono, rodando em Linux, você deve utilizar a seguinte instrução “mono MeuPrograma.exe”, de modo similar ao que acontece com Java. Para finalizar, desde que a sua aplicação não acesse recursos do sistema operacional, ela será portável para outros sistemas operacionais suportados pela plataforma, assim como acontece com Java.
Obs.: Apenas para esclarecer, o artigo “Java and C# - A Programmer’s Comparison” não tem nada de imparcial. O artigo foi escrito em setembro de 2002, sendo que o autor, “Thomas Paul”, já programava em Java desde 1996 (de 6 a 7 anos de experiência em Java até escrever o artigo). Ele havia iniciado a programação em C# em abril de 2002 (aproximadamente 6 meses de experiência em C# até escrever o artigo). Algumas das coisas que ele “odeia” em C# correspondem a recursos poderosos que a linguagem fornece, como: propriedades e indexers. Um recurso que ele “ama” em C# é duramente criticado pela Sun: delegates. Porém, eu não quero estender demais a discussão comentando detalhe por detalhe das linguagens Java e C#. É muito difícil encontrar algum artigo de comparação das linguagens Java e C# que seja imparcial. Na maiorias das vezes, as opiniões dos autores são tendenciosas para as linguagens que eles têm um maior domínio. Observe que um recurso inicialmente mal entendido numa linguagem pode ser mal interpretado e mal utilizado. Porém, com a experiência, o desenvolvedor com uma mente aberta pode ser capaz de compreender melhor o recurso e utilizá-lo bem. Neste momento, ele estará apto a dar uma opinião mais consistente.
Abraços,