Por que razões devo escolher C # em Java e C ++? [fechadas]

46

C # parece ser popular nos dias de hoje. Ouvi dizer que, sintaticamente, é quase o mesmo que Java. Java e C ++ existem há mais tempo. Por que razões devo escolher C # em Java e C ++?

Templário Sombrio
fonte
16
Como foi escrita, a pergunta era um exemplo didático de não construtivo "qual idioma é melhor?" perguntas que estão fora do tópico aqui. Eu tentei torná-lo mais construtivo com uma edição, uma vez que ela realmente obteve respostas boas e bem pensadas. Ainda assim, lembre-se das perguntas frequentes e desta postagem do blog ao fazer perguntas dessa natureza.
Adam Lear
Deixe-me adicionar alguns itens mais ousados. O .NET possui um DOM bem definido ( por exemplo, CodeDOM ) para seu idioma e, consequentemente, gerar coisas dinamicamente em tempo de execução é muito mais simples e eficiente. Isso também pode ser útil como um recurso de infraestrutura. Além disso, o sistema de tipos tem uma correspondência 1 para 1 com todos os tipos W3 nativos. Em sua essência, o W3 e outras interoperações foram incorporados ao idioma desde o início. Para outros idiomas, essas preocupações apenas surgiram e apresentam muitos desafios para elas. Além disso, se você vai ser interoping com muitas línguas e / ou protocolos depois .NET é muito forte também
JoeGeeky
5
Ei, JoeGeeky, adicione seu comentário como resposta à pergunta.
Anthony Mastrean
1
A verdadeira questão é: Por que razões devo escolher Nemerle, F * e F # em vez de C #? (isto é, todos os três idiomas são de MS e todas as três são melhor)
mrsteve
Eu realmente não acho que nenhuma afirmação do gênero "idioma / plataforma X em comparação com o idioma / plataforma Y é SEMPRE melhor" seja válida e também acho que, para qualquer X e Y, pode ser facilmente invalidado em determinados contextos. Qual é o objetivo desta pergunta?
21713 Shivan Dragon

Respostas:

76

A pergunta deve ser "Qual idioma é mais adequado para o desenvolvimento moderno e típico de aplicativos?".

Edit: Abordei alguns dos comentários abaixo. Uma pequena observação: considere que, quando você tem muitas coisas de forma nativa, como idiomas, é uma grande diferença do que implementar ou fazer o download e usá-las sempre. Quase tudo pode ser implementado em qualquer um desses idiomas. A questão é: o que os idiomas lhe fornecem nativamente.

Então, de cabeça para baixo (alguns argumentos se aplicam aos dois idiomas) ...

C # é melhor que C ++ na medida em que:

  • Possui coleta de lixo nativa .
  • Ele permite que você trate as assinaturas dos métodos de classe como funções livres (ou seja, ignorando o thisargumento do ponteiro digitado estaticamente ) e, portanto, crie relacionamentos mais dinâmicos e flexíveis entre as classes. edite se você não souber o que isso significa, tente atribuir um método de membro retornando nulo e aceitando nulo a uma void (*ptr)()variável. Delegados de C # carregam o thisponteiro com eles, mas o usuário nem sempre precisa se preocupar com isso. Eles podem apenas atribuir um void()método de qualquer classe a qualquer outro void()delegado.
  • Possui uma enorme biblioteca padrão com tantas coisas úteis que são bem implementadas e fáceis de usar.
  • Permite blocos de código gerenciado e nativo.
  • O controle de versão do assembly soluciona facilmente os problemas infernais do DLL.
  • Você pode definir classes, métodos e campos para serem internos da montagem (o que significa que eles podem ser acessados ​​de qualquer lugar dentro da DLL em que estão declarados, mas não de outras montagens).

C # é melhor que Java na medida em que:

  • Em vez de muito barulho (EJB, implementações de classes estáticas privadas, etc.), você obtém construções nativas elegantes e amigáveis, como Propriedades e Eventos.
  • Você tem genéricos reais (não a piada de elenco ruim que Java chama de genéricos) e pode refletir sobre eles.
  • Ele suporta expressões nativas de gerenciamento de recursos (a usingdeclaração). O Java 7 também vai dar suporte a isso, mas o C # já o suporta há muito mais tempo.
  • Não possui exceções verificadas :) (discutível se isso é bom ou ruim)
  • É profundamente integrado ao Windows, se é isso que você deseja.
  • Possui Lambdas e LINQ, suportando, portanto, uma pequena quantidade de programação funcional.
  • Permite explicitamente covariância e contravariância genéricas.
  • Possui variáveis ​​dinâmicas, se você as quiser.
  • Melhor suporte de enumeração, com a yieldinstrução
  • Permite definir novos tipos de valor (ou não referência).

Editar - Endereçando comentários

  • Eu não disse que o C ++ não suporta RAII nativo. Eu disse que o Java não o possui (você deve tentar explicitamente / finalmente). O C ++ possui ponteiros automáticos que são ótimos para RAII e (se você sabe o que está fazendo) também pode substituir a coleta de lixo.
  • Eu não disse nada sobre como emular funções livres. Mas, por exemplo, se você precisar acessar um campo por um thisponteiro e vincular o método que o faz a um ponteiro de função genérico (ou seja, não da mesma classe), simplesmente não há uma maneira nativa de fazê-lo. Em C #, você obtém o gratuitamente. Você nem precisa saber como isso funciona.
  • Ao "tratar os métodos membros como funções livres", quis dizer que você não pode, por exemplo, vincular nativamente um método membro a uma assinatura de função livre, porque o método membro "secretamente" precisa do thisponteiro.
  • A usingdeclaração, obviamente junto com os invólucros IDisposable, é um ótimo exemplo de RAII. Veja este link . Considere que você não precisa de RAII tanto em C # quanto em C ++, porque possui o GC. Nos horários específicos em que você precisa, você pode usar explicitamente a usinginstrução Outro pequeno lembrete: liberar memória é um procedimento caro. O GC tem sua vantagem de desempenho em muitos casos (especialmente quando você tem muita memória). A memória não vazará e você não gastará muito tempo desalocando. Além disso, a alocação também é mais rápida, pois você não aloca memória todas as vezes, apenas de vez em quando. Chamar newé simplesmente incrementar um último ponteiro de objeto.
  • "O C # é pior porque tem coleta de lixo". Isso é realmente subjetivo, mas, como afirmei no topo, para o desenvolvimento típico de aplicativos mais moderno, a coleta de lixo é uma vantagem enorme.
    No C ++, suas opções são gerenciar manualmente sua memória usando newe delete, o que empiricamente sempre leva a erros aqui e ali, ou (com o C ++ 11) você pode usar ponteiros automáticos nativamente, mas lembre-se de que eles adicionam muito e muito de ruído para o código. Então a GC ainda tem uma vantagem aí.
  • "Os genéricos são muito mais fracos que os modelos" - simplesmente não sei de onde você tirou isso. Os modelos podem ter suas vantagens, mas, na minha experiência, restrições de verificação de tipo de parâmetro genérico, contravariância e covariância são ferramentas muito mais fortes e elegantes. A força dos modelos é que eles permitem que você brinque um pouco com o idioma, o que pode ser legal, mas também causa muitas dores de cabeça quando você deseja depurar algo. Portanto, os modelos têm seus recursos interessantes, mas acho os genéricos mais práticos e limpos.
Yam Marcovic
fonte
5
E se você ainda deseja um Garbage Collector for C ++, pode fazer o download de um .
Fredoverflow
3
vamos continuar esta discussão no chat
Yam Marcovic
6
Outro recurso importante do C # comparado ao Java, por motivos de desempenho, é o "struct", um tipo de objeto que pode ser armazenado na pilha (ou nos registros da CPU, em casos especiais) ou incorporado a outros objetos de heap. Eles são freqüentemente usados ​​para objetos pequenos com 1 a 4 campos, como pares de coordenadas X, Y.
Qwertie
2
@LokiAstari Mind explicando? Contanto que você lembre de cancelar o registro de manipuladores de eventos e use o padrão Dispose em classes que contêm wrappers nativos, você ficará bem. É muito menos saber e lembrar do que o gerenciamento de memória em C ++.
Yam Marcovic
2
-1, pois estou com falta das seções "C ++ é melhor que C # naquele ..." e "Java é melhor que C # ...". Eu não acho que o C # seja superior em todas as áreas; portanto, uma resposta sem essas duas seções provavelmente carece de informações importantes.
Giorgio
30

O ambiente

Clientes do .NET Framework e Windows

O Windows é o sistema operacional dominante nos computadores clientes. As melhores estruturas de GUI para aplicativos do Windows são Winforms e WPF, juntamente com o .NET Framework . A melhor linguagem de programação para trabalhar com o .NET Framework e suas APIs é C # . Java não é uma alternativa para isso. E o C ++ é uma linguagem antiga, sem gerenciamento automático de memória. O C # é semelhante ao C ++, mas possui gerenciamento automático de memória e você não precisa trabalhar com ponteiros, o que o torna mais produtivo. O C ++ ainda pode ser a melhor opção para alguns casos, mas não para aplicativos de banco de dados com muitos formulários, comuns nos negócios.

IIS e Windows Server

Se você está acostumado a trabalhar no ambiente Windows e com C #, precisará de menos investimento para aprender o IIS para programação de servidores e o Windows Server para administração básica.

Active Directory e Windows Server

Se você estiver desenvolvendo um software que será implantado nas redes da empresa, é provável que eles usem um ambiente centrado no Windows usando um Windows Server com Active Directory. Nesse ambiente, é fácil integrar e implantar uma solução feita em C # e .NET Framework .

Pessoalmente, sou desenvolvedor Java, não desenvolvedor C #, mas trabalho com a web. Eu mudaria para C # se estivesse desenvolvendo aplicativos de rede para a rede Windows. Mas eu prefiro servidores Web baseados em Java para Linux. Eu escolheria C ++ para sistemas embarcados, caso eu não tenha muitas dependências.

Sim, C # é uma linguagem melhor com recursos mais modernos que C ++ e Java, mas isso não é a coisa mais importante para escolher C # .

Sumário

O ambiente do seu software é mais importante para a escolha de C # . Se você trabalha em um ambiente com clientes Windows, servidores Windows, Active Directory, IIS e talvez SQL Server , o C # é a melhor linguagem do .NET Framework .

Se você trabalha em um ambiente Unix com, por exemplo, serviços web, Java seria minha escolha. E se você trabalha com sistemas embarcados ou precisa se integrar a dispositivos de hardware, o C ++ seria uma boa escolha.

Jonas
fonte
3
Absolutamente - é por isso que eu uso c # não é realmente qualquer outro motivo #
Murph
Certamente você pode usar o .NET em outras plataformas via Mono, MonoTouch e MonoDroid, mas meus benchmarks consideraram o Mono significativamente mais lento que o .NET para Windows, e o próprio Compact Framework da Microsoft é extremamente lento no Windows CE: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... claro, WPF está disponível apenas no Windows (mas eu não gosto de qualquer maneira.)
Qwertie
Quais dependências você quer dizer com "Eu escolheria C ++ para sistemas embarcados, se não houver muitas dependências". Você quer dizer as bibliotecas java?
Puckl
@ Puckl sim, mas principalmente o jvm / jre.
Jonas
"Se você trabalha em um ambiente Unix com, por exemplo, serviços da web", existem outras linguagens e estruturas que podem ser consideradas: ruby, Python, node.js etc.
MarkJ 13/13/13
15

C # e Java

C # é uma linguagem muito boa se:

  • Você deseja fazer um desenvolvimento orientado a objetos de uso geral. É uma linguagem OOP clássica e de tipo estatístico.
  • Você está direcionado apenas às plataformas Microsoft (vale a pena lembrar que a Microsoft clonou efetivamente o Java para criar C # porque eles queriam uma linguagem semelhante ao Java que trancasse as pessoas no Windows. Eles poderiam ter usado o Java, mas isso permitiria que as pessoas executassem aplicativos facilmente em outras plataformas ....)

O C # como linguagem é mais agradável que o Java de várias maneiras (melhor sintaxe para propriedades, tipos de valor, genéricos reificados etc.). Prefiro o C # como uma linguagem ao Java, mas no grande esquema das coisas, elas são linguagens bastante semelhantes e adequadas para aplicativos semelhantes.

Por outro lado, o Java também possui algumas grandes vantagens:

  • Um enorme ecossistema de código aberto - as bibliotecas para Java que você pode obter gratuitamente são de longe o melhor de qualquer idioma. É difícil exagerar a importância disso - do ponto de fazer as coisas, o Java é muito eficaz.
  • Ferramentas - as ferramentas Java são, na minha opinião, melhores do que as que você pode obter no mundo .Net. por exemplo, o Maven (depois de dominá-lo!) é particularmente impressionante.
  • Manutenção - O Java já existe há algum tempo e tem sido bem-sucedido em grandes empresas precisamente porque é relativamente estável e tem havido muito esforço para compatibilidade com versões anteriores. A sintaxe simples e um pouco detalhada também ajuda o Java aqui - é mais fácil ler e manter o código se o código for muito claro e explícito.
  • Novas linguagens - A JVM possui algumas novas linguagens incríveis (Scala, Clojure, Groovy etc.) que são o futuro da plataforma Java. É aqui que muita inovação de linguagem está acontecendo e muito mais rapidamente do que em Java ou C #.

Portanto, Java vs. C # é uma decisão muito estreita e realmente se resume a se você deseja estar no campo da Microsoft ou no campo de código aberto / plataforma cruzada.

Pessoalmente, prefiro Java porque:

  • O ecossistema de bibliotecas é, na minha opinião, muito mais importante que o fato de o C # ter uma sintaxe melhor do que o Java
  • A longo prazo, quero que todo o meu código seja adequadamente multiplataforma e capaz de rodar em grandes grupos de máquinas linux baratas na nuvem.
  • O Clojure é o IMHO, o idioma mais promissor do mundo atualmente, e se eu continuar com a plataforma JVM, poderei fazer a transição do meu código e habilidades facilmente para o Clojure ao longo do tempo.

C / C ++

C / C ++ é basicamente um animal completamente diferente. Atualmente, eu não o recomendaria para o desenvolvimento de aplicativos de uso geral pelos seguintes motivos:

  • Gerenciamento de memória - hoje em dia, para a programação de uso geral, você não deseja gerenciar sua própria memória. A coleta de lixo em C # ou Java é muito melhor para sua produtividade e sanidade do que qualquer uma das técnicas explícitas de gerenciamento de memória que você precisará usar em C / C ++
  • Complexidade - C ++, em particular, é uma linguagem extremamente complexa. Leva muito tempo para dominar e o próprio código também pode ser extremamente complexo. (Modelos C ++, por exemplo, são particularmente cabeludos ....)
  • Produtividade - na maioria das vezes e tudo o mais é igual, você levará mais tempo para realizar as tarefas em C / C ++.

No entanto, é sem dúvida uma ótima escolha em um determinado número limitado de domínios especiais, em particular:

  • Sistemas operacionais - você provavelmente deseja usar C / C ++ se estiver escrevendo um sistema operacional.
  • Desenvolvimento de jogos - quase todos os melhores mecanismos de jogos comerciais são C / C ++. Ainda é a melhor opção se você estiver desenvolvendo um título AAA exigente (C # e Java são perfeitamente adequados para jogos menos exigentes / casuais)
  • Computação de alto desempenho C / C ++ otimizado é provavelmente a melhor maneira de criar código de alto desempenho. Para a maioria dos aplicativos, esse nível de otimização não vale o esforço, mas em certos domínios pode ser extremamente valioso (negociação de alta frequência, por exemplo)
  • Acesso ao hardware - Você precisa de acesso direto ao hardware (por exemplo, para um sistema incorporado)

Então, basicamente, o C / C ++ é uma ótima opção se, e somente se, você estiver focado em um dos domínios em que ele é particularmente adequado.

Mikera
fonte
1
Você mencionou o maven como um exemplo de melhores ferramentas para java. Eu não sou particularmente familiarizado com isso, mas, olhando a documentação, o Maven parece bastante semelhante à ferramenta nativa de compilação .Net MSBuild. O que torna o Maven melhor que o MSBuild?
Kevin Cathcart
1
+! (apenas porque tenho apenas um voto): você explicou muito bem por que o ecossistema Java é melhor e por que não se deve comparar apenas a sintaxe de C # vs Java. Java possui mais e melhores bibliotecas e ferramentas. Não está acontecendo muita coisa na própria linguagem Java, mas novas linguagens muito interessantes estão aparecendo para a JVM que são (IMO) muito mais interessantes que o C #. Não conheço Clojure, mas acho o Scala muito interessante: projetado para ser OOP + FP desde o início.
Giorgio
2
Por que todos pensam que o código C ++ está cheio de gerenciamento manual de memória. Você não sabe C, RAII significa que quase nunca é necessário alocar / liberar memória manualmente (as vezes em que você faz são aquelas em que um idioma como C # seria inútil para você).
Gbjbaanb
3
@gbjbaanb - provavelmente porque o RAII é inadequado para o gerenciamento de memória de uso geral. Não tem flexibilidade equivalente a um sistema GC completo como você vê em Java ou C #. Assim que você ultrapassa os limites da RAII, você volta ao território de gerenciamento manual de memória.
Mikera
3
@mikera Só quero ressaltar que também existe bastante desenvolvimento de linguagem na plataforma .NET. Por exemplo, o F # é uma linguagem funcional elegante que integra perfeitamente o restante do .NET, e o Python foi portado recentemente para o .NET como Iron Python (e também possui um ótimo IDE !).
Ikh
13
I heard that syntactically they are almost the same.

Sintaticamente? Quem dá macacos voadores sobre sintaxe? A sintaxe serve apenas para uma coisa: permitir uma migração mais rápida de idiomas sintaticamente semelhantes. É isso aí.

C # é muito melhor que Java. Considere o suporte à programação genérica e funcional - o C # está muito à frente do Java. Sem mencionar as sobrecargas do operador e outras coisas boas - o C # é muito melhor em destaque. Não há como o Java ser considerado melhor que o C #.

C ++ e C # é mais um concurso. O C ++ possui um modelo de compilação arcaica incrivelmente irritante e várias doenças herdadas do C, mas seus modelos são muito mais poderosos que os genéricos, e suas abordagens de gerenciamento de recursos são muito mais flexíveis e poderosas em geral, como usingé uma falha completa e são executadas Mais rápido.

DeadMG
fonte
6
Acho que se deve comparar os recursos de idiomas e a disponibilidade de um idioma em diferentes plataformas. Com o C #, um está bloqueado com a Microsoft, com o Java, não: é uma grande vantagem, pelo menos para desenvolvedores de UNIX / Linux. OOP + FP são recursos interessantes, mas por que se preocupar com o C # se você pode usar o Scala, que é executado na JVM e pode interagir com o código Java herdado? Eu nunca aprenderia um idioma específico da plataforma, a menos que seja forçado.
Giorgio
2
@Giorgio: O projeto Mono existe. Mas, em segundo lugar, a Microsoft realmente cuida de sua plataforma - eles oferecem grandes atualizações regulares. Java quase não teve nada de novo. Além disso, a pergunta é sobre C # vs Java, não CLR vs JVM.
DeadMG
4
@DeadMG: Até onde eu sei, não posso pegar nenhum programa em C # desenvolvido no Windows e construí-lo com o Mono. Não é CLR vs JVM? A questão é por que as pessoas usam C # ou Java. Para que as pessoas usem um idioma, precisam de um tempo de execução e de um sistema operacional. Não discuto sobre o fato de que o C # possui mais recursos que o Java, mas o Java é muito mais portátil: esse é um fator que pode influenciar a adoção de uma linguagem. De fato, o Java ainda é usado com muito mais frequência que o C #, mesmo que não possua certos recursos avançados.
Giorgio
3
@Giorgio, você pode pegar qualquer programa em C # e construí-lo com o Mono. Você não pode usar determinadas bibliotecas (que não fazem parte da linguagem C # de qualquer maneira). E o java não é "muito mais portátil". Você pode codificar para iOS em C #, mas não em Java, por exemplo.
SK-logic
2
@Giogio, o Mono é pelo menos tão portátil quanto a JVM.
SK-logic
7

O Well C#possui alguns recursos internos agradáveis, como LINQdelegados. Está obtendo o melhor dos dois mundos - Javae C++. Veja aqui uma comparação completa.

Mas eu gosto mais do Javamundo - muito mais estruturas de código aberto e ele roda em todas as plataformas. E não me fale Mono- não é uma opção confiável.

Petar Minchev
fonte
9
+1: "Mas eu gosto mais do mundo Java - muito mais estruturas de código aberto e ele roda em todas as plataformas". Vamos torcer para que a Oracle não mude isso!
Giorgio
15
Mente explicando, o que não é "confiável" no Mono?
SK-logic
2
@Petar Minchev, não é nada além de sua própria culpa. Você deve seguir as diretrizes de portabilidade e não deve usar bibliotecas não portáteis - e dessa maneira qualquer aplicativo complexo seria executado de maneira confiável com o Mono. Coisas como o WPF nunca serão portadas.
SK-logic
2
@Petar Minchev, existem muitas bibliotecas Java não portáteis por aí. Você deve sempre ter cuidado com a portabilidade, independentemente do idioma que estiver usando. De qualquer forma, a questão é sobre os idiomas, não as bibliotecas de terceiros.
SK-logic
3
@Petar Minchev, GTK # é portátil. Use-o em seu lugar.
SK-logic
3

De acordo com algumas fontes (veja, por exemplo, http://www.indeed.com/jobtrends ), o C # ainda é menos popular que o Java e tão popular quanto o C ++.

O C # fornece recursos que o Java não possui, por exemplo, suporte direto a certos idiomas de programação, como propriedades, estilo de programação funcional e assim por diante. O C # possui um nível de abstração mais alto que o C ++, o que é uma vantagem quando o tempo de desenvolvimento é mais importante que a velocidade do programa.

Pessoalmente, ainda prefiro os mundos Java / C ++. Como disse Petar Minchev, o Java tem mais estruturas e aplicativos de código aberto, é executado em todos os lugares e está menos ligado a um fornecedor e sistema operacional em particular. O C ++ tem vantagens semelhantes, embora o código geralmente precise de adaptações, indo de uma plataforma para outra. Como eu prefiro desenvolver no Linux e, que eu saiba, não posso ter um C # completo no Linux, nunca tive um interesse real em C # porque minhas necessidades de programação são cobertas por C, C ++, Java e Scala.

Por outro lado, para muitos desenvolvedores estar vinculado a um fornecedor específico não é um problema: a Microsoft tem uma posição dominante no mercado de sistemas operacionais e o C # oferece muitas oportunidades de emprego. Portanto, muitos desenvolvedores da IMO adotam o C # porque, além de ser uma linguagem rica em recursos, também é um bom investimento.

Giorgio
fonte
"Não posso ter o C # completo no Linux" - Você poderia elaborar isso? Você quer dizer que a estrutura .Net completa não está disponível porque não encontrei nenhum problema com a própria linguagem C # (ou F #) no Linux?
Wesley mais sábio
@wawa: Que eu saiba, a estrutura .Net corresponde ao JDK, e a estrutura .Net está disponível apenas para Windows, enquanto o JDK está disponível para vários sistemas operacionais. Se isso não estiver correto, posso editar minha resposta (e mudar minha opinião também).
Giorgio
1
Eu acho que uma analogia mais próxima seria a Biblioteca de Classes Base para o JDK. O BCL possui peças padronizadas e não padronizadas. O projeto mono implementa tanto as peças padronizadas quanto as não padronizadas.
Wesley mais sábio
@wawa: Obrigado pela informação. Estou pensando em tentar C # usando o Mono. No entanto, ainda tenho uma forte sensação de que o C # está muito mais fortemente vinculado à Microsoft do que Java ao Oracle (ou à Sun no passado).
Giorgio
3

E quanto a "Qual Software Development Framework, que inclui uma linguagem de programação", é melhor?

Você esqueceu de incluir outras coisas, como o "ambiente" com o qual você trabalhará.

  1. Você trabalha apenas no sistema operacional Windows, mas não precisa ser de nível baixo e ter muita memória e outros recursos?

    Escolha .NET como estrutura no Windows e use C #.

  2. Você vai trabalhar apenas para Windows, mas não precisa ser de nível baixo, MAS, não possui muitos recursos?

    Escolha o Delphi Framework (e a linguagem de programação Object Pascal Delphi ou a linguagem de programação Lazarus Object Pascal)

  3. É o seu aplicativo. necessário para suportar várias plataformas, como um jogo, em diferentes celulares?

    Escolha o Java Framework e a linguagem de programação Java.

  4. É o Linux com o KDE como interface gráfica?

    Escolha a estrutura QT, com C ++

  5. É o Linux com o Gnome como interface gráfica?

    Escolha a estrutura GObject / GLib, com C ++

  6. Você vai trabalhar com muitas operações de baixo nível, como desenvolver drivers?

    C ou C ++ simples é usado para vários sistemas operacionais, com bibliotecas padrão, como estrutura.

Apenas meus 2 centavos.

umlcat
fonte
1
Não tenho certeza sobre 3. Os smartphones são muito populares hoje em dia e o AFAIK, todos eles suportam C # de alguma forma, mas apenas o Android suporta Java.
svick
Delphi não está morto? :)
jsrjaker
@ šljaker Não, mas não é muito popular nos dias de hoje.
umlcat
1
@ Rick: Isso é uma mentira. Além do Android, o Java também existe de alguma forma no iOS, Symbian, WinMo, Blackberry, Maemo e WebOS (ou seja, tudo o que importa ou ainda importa; não me inicie com plataformas ainda menores). Android, Blackberry e Symbian suportam oficialmente o Java como opção de desenvolvimento; A Sun costumava suportar Java no iOS, mesmo que a Apple não gostasse. Java é a principal linguagem de desenvolvimento no telefone Android e Blackberry. Não posso dizer o mesmo com C #, AFAICT é oficialmente suportado apenas no WinMo.
Lie Ryan
1

Se você fizer uma pesquisa, provavelmente encontrará discussões sobre as principais linguagens de programação. Aqui está um dos resultados da pesquisa - http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - Java ainda parece ser a linguagem mais popular.

O Java tentou remover algumas das deficiências do C ++ (e tornar a vida dos programadores mais simples para aplicativos não em tempo real e não críticos). Sendo o C # o mais atrasado para a festa, evitou algumas das deficiências da linguagem Java. O C # fez muito progresso (já que a Microsoft tem muito controle sobre ele), enquanto os avanços em Java foram bloqueados por um período considerável de tempo devido a conflitos entre seus stakeholders.

Satyajit
fonte
1

Algumas coisas que ainda não foram mencionadas:

C # é melhor que C ++ porque:

Ele acaba com os arquivos de cabeçalho, o que se traduz em grande simplicidade.

C # é melhor que Java porque:

Ele suporta os tipos definidos pelo usuário do tipo de referência (classe) e do tipo de valor (struct) que, se você souber o que está fazendo, podem gerar benefícios significativos de desempenho.

Ele suporta delegados, que são como interfaces de método único, simplificando muito a codificação de construções que ocorrem com frequência e que envolvem objetos de método único.

Mike Nakis
fonte
Você pode explicar de que maneira os tipos de referência e de valor podem gerar benefícios de desempenho em C #?
Giorgio
Por exemplo, se você deseja ter uma matriz de registros, em Java, você não tem outra opção a não ser descrever seu registro usando uma classe; portanto, sua matriz será uma matriz de referências a uma infinidade de objetos alocados separadamente. Em C # você pode descrever seu registro usando uma struct, então sua matriz será apenas uma única área contínua de memória que contém suas estruturas uma após a outra, como em C.
Mike Nakis
Como outro exemplo, se você deseja definir um novo tipo pequeno (um tipo que se encaixe em uma palavra de máquina), não é necessário definir uma nova classe para ele; você pode simplesmente transformá-lo em uma estrutura, para que ele obedeça à semântica dos valores. Passar tais estruturas não será mais caro do que passar referências a objetos, mas você terá o benefício de não alocar, construir e coletar objetos.
Mike Nakis 01/01
Compreendo. Assim, as aulas são instanciado na pilha e acessado através de referências enquanto estruturas são instanciado na pilha (?)
Giorgio
Quase correto. A única imprecisão nesta declaração é que uma estrutura será encontrada no heap se estiver incorporada dentro de outro objeto ou se estiver dentro de uma matriz de estruturas. E ele também será encontrado no heap, se algum dia for encaixotado, exatamente da mesma maneira que os tipos de valor estão encaixotados em Java.
quer
1

Você deve escolher o melhor idioma para o seu ambiente esperado e seus conhecimentos.

Escolha C # se você estiver trabalhando em um ambiente exclusivo da Microsoft. Enquanto o C # é padronizado pela ISO / IEC 23270: 2003, a versão da Microsoft continua sendo a única implementação completa. Várias partes principais do idioma não são cobertas pelo padrão e, portanto, estão sujeitas às patentes da Microsoft. Ninguém mais implementará uma versão completamente compatível do idioma para outros sistemas; portanto, você estará bloqueado pelo fornecedor do Microsoft Windows e do .Net enquanto você usar o idioma. Se você está procurando habilidades para usar no mercado móvel, é melhor procurar outro idioma.

O Java funciona, mas possui uma grande sobrecarga, em parte devido a recursos como coleta de lixo. O Java também não é padronizado pela ISO / IEC; portanto, você não tem garantias se alternar entre plataformas e versões do Java, apenas as melhores intenções da Sun / Oracle. Se você planeja trabalhar com o Android, esse é definitivamente o caminho a percorrer. A programação do Android é basicamente Java, com algumas alterações.

O C ++ é padronizado e quase todos os compiladores seguem o padrão internacional; portanto, você tem comportamento garantido, mas a linguagem não o protege de si mesmo. Você deve executar a verificação de limpeza e estouro por conta própria. Isto não é difícil. Os programadores de C / C ++ fazem isso há muitos anos. A Apple usa o Objective C para tudo, portanto, se você deseja apontar para a Apple, recomendo que tente isso.

Se você se vê deixando o Windows para trás em algum momento, sugiro aprender C / C ++ e Java - ambos comercializáveis ​​no momento.

TJ
fonte
0

Em relação ao C ++ vs C # (como não sou proficiente o suficiente em Java), o que estou perdendo aqui é a capacidade de acessar coisas de baixo nível no Windows. Por exemplo, você não pode desenvolver um driver de vídeo nativo em C # (ainda), mas pode fazê-lo com C ++. Isso não melhora o C ++. Vejo C ++ versus C # como Assembly versus C.

C # é, na minha opinião, muito mais eficiente se você observar o tempo necessário para realmente implementar um recurso. A penalidade de desempenho do tempo de execução .Net é insignificante para 99% dos aplicativos desenvolvidos. Pode ser importante se você estiver executando um loop apertado, sim, por todos os meios, mas na maioria das vezes um aplicativo está ocioso, aguardando qualquer tipo de entrada, sinal ou interrupção (IO do disco, clique no botão, rede, conclusão da animação) .

A biblioteca CLR com todas as suas funções tem outro grande benefício. Quando eu estava treinando C # para desenvolvedores juniores, a maioria deles disse que gostava da convenção de nomes lógicos de classes, membros e espaços para nome. Encontrar um recurso do método era lógico no SDK, algo em que o Visual Basic 5 era seriamente falho. Isso os ajudou tremendamente na adoção da biblioteca. Depois de aprender a sintaxe de um idioma, aprender uma nova biblioteca é importante para obter uma boa compreensão de qualquer SDK. Isso evita que você reinvente a roda.

Rob van der Veer
fonte