Codificadores gerenciados x codificadores nativos


19

Sou codificador e tenho experiência com código nativo e gerenciado. Comecei com Pascal e C, depois mudei para C ++ e, eventualmente, para C #.

Durante o último ano, estive codificando quase exclusivamente em C # e perdi muito do que costumava acontecer naturalmente quando eu era um codificador C ++.

Algumas semanas atrás, quando me sentei para escrever algum código C ++ nativo, me peguei remexendo quando lentamente me familiarizei com as complexidades, peculiaridades e idiossincrasias de tudo isso. Estou quase com vergonha de dizer que tinha esquecido completamente que passar uma matriz alocada dinamicamente para uma função sem também passar seu tamanho significaria que a função de recebimento não teria como saber quanto tempo a matriz é.

Existem inúmeros artigos e documentos que comparam e contrastam código gerenciado versus código não gerenciado. Todos sabemos que o código nativo, se bem otimizado, pode executar significativamente mais rápido e mais leve que o código gerenciado. Por outro lado, o código gerenciado possui coletores de lixo e otimização específica da CPU e do SO em tempo de execução, o que pode dar ao código nativo uma execução pelo seu dinheiro.

Puramente do ponto de vista técnico, não há um vencedor claro.

Não há dúvida de que o código gerenciado é de ordem de magnitude mais simples de codificar e entender. Veja a diferença no número de linhas necessárias para construir uma GUI simples no Win32 C ++ vs C #.

Nos meus dias de codificação nativa, escrevia principalmente simulações matemáticas que rodavam em supercomputadores. Eles tinham CLIs feias e eram principalmente focados em algoritmos. Atualmente, escrevo em C # e produzo belos aplicativos GUI, mas ficaria perdido se eu precisasse criar um calibre semelhante em um idioma nativo. Mesmo com uma estrutura como QT, ainda levaria o dobro do tempo para produzir algo em C ++ / QT do que em C #.

Sempre que vejo alguém que escreveu um aplicativo GUI completo e em grande escala em C / C ++, não posso deixar de sentir uma sensação de reverência e uma pitada de ciúmes.

Estou curioso para saber como outros codificadores experientes veem idiomas gerenciados e não gerenciados. Você vê o código gerenciado como amador ? Você vê codificadores nativos como mais hardcore ?

java  .net 

Respostas:


26

Atualmente, meu trabalho diário é em C ++, mas já programei em várias línguas o suficiente para que eu quase não perceba mais a diferença. Aqui estão minhas observações:

  • Muitas das alegadas ineficiências com outros idiomas são frequentemente reimplementadas pelos programadores de C ++ como práticas recomendadas. Adicionamos verificações nulas suficientes, verificação de limites de matriz, verificação de tipo, validação de entrada etc. para negar em grande parte qualquer vantagem de velocidade de execução obtida pelo idioma que não faz essas coisas automaticamente, pelo menos para códigos que não exigem muito processamento de dados.
  • Esse clichê extra se torna um hábito arraigado depois de um tempo, para que realmente não pareça um trabalho extra e se destaca como um dedão dolorido quando está faltando.
  • Quando programa em uma linguagem "gerenciada", ainda penso na alocação de memória, para garantir que não crie um vazamento de memória. Talvez eu não esteja explicitando delete, mas ainda estou ciente do ponto em que o coletor de lixo considera elegível para exclusão. Eu tive mais dificuldade em resolver problemas de pouca memória começando em Java do que em C ++, provavelmente porque em C ++ eles são muito mais difíceis de ignorar por muito tempo.
  • O mesmo vale para a digitação dinâmica. Ainda tenho que acompanhar se um parâmetro de função é uma matriz, um int ou uma string. De fato, requer mais esforço mental, porque o tipo não está claramente listado ali para mim.
  • O estilo C ++ moderno é muito diferente da era anterior ao C #. Em vez de mudar a linguagem, as pessoas "descobriram" como usar os recursos C ++ existentes de maneiras exclusivas para evitar grande parte do gerenciamento de memória servil do passado. Padrões de design que liberam memória automaticamente são muito comuns agora.
  • Até onde eu sei, mesmo que seja possível criar aplicativos GUI apenas escrevendo código, designers gráficos como QT designer são o método amplamente preferido, com código usado principalmente apenas para manipuladores de eventos ou personalização de tempo de execução.
  • Os idiomas que você não usa extensivamente há algum tempo sempre parecem um pouco desajeitados, mesmo que você se lembre da sintaxe. Se eu não escrevo python há um ano, há muitas idiossincrasias que esqueci, e parece mais estranho que o C ++ por um tempo, mesmo que objetivamente a maioria das pessoas considere o python a linguagem "mais fácil".

Com a combinação de todos esses fatores, meu modelo mental permanece bastante consistente entre quando eu programa em C ++ e outras linguagens, e as diferenças parecem principalmente meramente sintáticas. É verdade que muito disso é resultado de treinamento, hábito, padrões de codificação e padrões de design modernos, em vez de recursos intrínsecos à própria linguagem C ++, mas a comparação ainda permanece.

Acho que o que estou tentando dizer é que, na minha experiência, o treinamento do programador faz muito mais diferença do que o idioma que ele está usando.


20

Você vê o código gerenciado como amador? Você vê codificadores nativos como mais hardcore?

Não.

Eu vejo as diferenças entre um engenheiro e um programador. O engenheiro hardcore sempre escolhe a pilha de idiomas / tecnologia apropriada para realizar o trabalho no menor tempo possível, com um padrão de tempo de execução aceitável.

Com a potência do processador atualmente, a frequência de realmente precisar obter o máximo possível de uma máquina usando idiomas nativos de nível inferior está ficando cada vez menor. Geralmente, não há realmente um caso comercial para isso. A produtividade sempre supera a diferença de alguns milissegundos no tempo de execução.


+1 mas tenha em mente que este é um efeito económico - se um ciclo de computação custo de US $ 1 milhão, em seguida, otimização extrema iria governar - ou nós não iria se preocupar com computadores em tudo ...
Gary Rowe

10
exceto pelo fato de termos um desempenho geral mais baixo - o Word6 funciona como iluminação em hardware moderno, o Word2010 leva um minuto apenas para carregar. Hoje precisamos desse hardware super rápido para acompanhar os programadores!
Gbjbaanb

2
@gbjbaanb: Não importa o que os programadores escolherem, qualquer base de código suficientemente grande será lenta. IIRC, o Word ainda está escrito em C ++ (e eu gostaria de apostar que uma parte significativa de todo o código legado do Word 6 ainda está lá).
Steven Evers

2
@gbjbaanb, o Word 2010 não é uma reescrita direta do Word 6 no .NET. Ele adiciona muito mais recursos e precisa lidar com muitos outros cenários de uso. É um muito, muito maior aplicação do Word 6.
Mircea Chirea

6

Infelizmente, a Microsoft nos levou a confundir o "Código gerenciado" com as bibliotecas de classe C # / .net.

Há duas coisas separadas e quase não relacionadas em jogo aqui.

  1. Bibliotecas .Net legais.

  2. Código gerenciado.

O C # oferece um pacote organizado, com suporte e fácil de usar por um preço.

O C ++ possui inúmeras bibliotecas legais que fazem quase tudo o que o .Net faz. Em vez de culpar o código "C ++ nativo" por ter mais "complexidades, peculiaridades e idiossincrasias" do que o código C # / .net, você pode procurar por melhores bibliotecas C ++.

Bibliotecas melhores também permitem que você escreva um bom código C ++.

Sempre que vejo alguém que escreveu um aplicativo GUI completo e em grande escala em C / C ++, não posso deixar de sentir uma sensação de reverência e uma pitada de ciúmes

Política ruim. Em vez disso, você deve descobrir quais bibliotecas de definições de classe elas usaram. Você também pode usar essas bibliotecas.

É tudo sobre as ferramentas. Sem ferramentas, somos apenas animais de calça.

"C ++ nativo" não significa que você deve jogar fora todas as suas ferramentas. Isso significa que você precisa encontrar boas ferramentas. A Microsoft não está mais ajudando você, então você precisa gastar tempo encontrando a combinação certa de ferramentas.


+1 para o "vá descobrir o que eles estão usando", mas, francamente, acho que isso não é muito bom para animais que usam ferramentas, ou animais que ocasionalmente usam calças.
Ian Pugsley

@Ian Pugsley: Os animais que usam calças, mas não usam ferramentas, provavelmente estão bem com seu status de animais. Mas você está certo de que os animais que usam ferramentas sem calças podem ficar chateados. Minha esposa, por exemplo, prefere não usar calças e usa ferramentas. Talvez ela não leia esta pergunta.
S.Lott 10/05

Só podemos esperar (e apostar nas chances razoavelmente altas). Só estou dizendo que não vou menosprezar um animal inteligente o suficiente para vestir uma calça ... só por precaução.
Ian Pugsley

Sim, diferentemente da biblioteca padrão do C #, o C ++ é antigo e carece de necessidades modernas (GUI, interface de rede legal, etc.).
Moshe Revah

A Microsoft está novamente ajudando você com C ++ no Windows 8 (toda a superfície de desenvolvimento do Windows 8 é código nativo e C ++ é um cidadão de primeira classe, juntamente com C # e JavaScript): msdn.microsoft.com/en-us/library/windows/ apps /…
Zach

5

A questão aqui não é sobre programação hardcore ou algo assim, é sobre controle. O fato é que o C # oferece produtividade a um custo de controle. Se você estiver escrevendo um programa que precisa de uma grande quantidade de controle (essa memória está desalocada exatamente agora), não terá outra opção a não ser usar C ++. Se você precisar fazer isso rapidamente, pode ser necessário usar o C #. O problema é que as bibliotecas de suporte para C # são muito melhores e mais recentes que as fornecidas para C ++. Por exemplo, o MFC é muito, muito antigo e suas práticas são conhecidas por serem terríveis; ele foi escrito muito antes da padronização. Se a Microsoft se esforçar para fornecer novas bibliotecas C ++, por exemplo, confira o novo PPL no Visual Studio 2010 e, estranhamente, essa tarefa se torna fácil no C ++. E acho que eles estão migrando dessa maneira,

Por outro lado, o código gerenciado possui coletores de lixo e otimização específica da CPU e do SO em tempo de execução, o que pode dar ao código nativo uma execução por seu dinheiro.

Já ouvi muitos defensores da linguagem gerenciada dizerem isso, mas na verdade nunca vi isso verdade. O fato é que as novas instruções de CPU disponíveis em CPUs mais novas simplesmente não oferecem muita vantagem, a menos que você esteja praticando matemática muito pesada; nesse caso, você não pode se dar ao luxo de precisar compilar ou interpretar em execução -time e você pode usar o compilador C ++ da Intel para usar o mais recente e o melhor no SSE de qualquer maneira. O escopo das otimizações do compilador do C ++ é enorme comparado ao que o JIT pode fazer, porque o JIT precisa ser executado em uma fração do tempo enquanto o programa está sendo executado, enquanto os compiladores do C ++ são bastante lendários por levar o tempo necessário para compilar.

A coleta de lixo não é um tipo de coisa mágica ou algo parecido - é uma escolha de algoritmo. É apropriado para todas as situações? Nem por um momento, observe a confusão IDisposable em C # e como o Java nem se deu ao trabalho de tentar resolver esse problema, enquanto os destruidores do C ++ fecharão seus arquivos e liberarão sua memória e seus soquetes etc. O GC é ótimo para alguns programas. , e não para alguns outros.


Há mais diferenças entre processadores do que SIMD - embora seu compilador C ++ esteja provavelmente levando em consideração o pipeline tanto quanto o seu JIT.
22411 Peter Pan em

Um ambiente de tempo de execução em que é possível examinar o estado do sistema e identificar todas as referências de objetos não fixados que possam ser alcançados pode amortizar muitos custos relacionados ao GC de maneiras que não são possíveis no C ++. Em Java ou C #, String foo,bar;a instrução foo=bar;executará duas instruções - uma carga de registro e um armazenamento de registro. Tempo de execução constante, independentemente do comprimento da string. C ++ pode chegar perto?
supercat

2

Na minha opinião, o C / C ++ nativo, comparado ao C #, parece um assembler para o próprio C / C ++. Outra camada complexa de abstração (não totalmente verdadeira, mas digamos assim) como sempre, oferece um desenvolvimento mais fácil, mas com certa redução de velocidade e uso excessivo de memória. Então, a meu ver, é apenas dividido em categorias diferentes, criando assim novos subtipos de programadores.

Btw por seu nível de abstração C # é incrivelmente rápido, a Microsoft fez um excelente trabalho.


2

Existem programadores amadores, não idiomas amadores. Idiomas que eles têm todos (bem, a maioria deles pelo menos) seus propósitos.

Atualmente, estou trabalhando em um mecanismo de cálculo de seguro usado para testar o sistema de produção. O sistema de produção foi fabricado em C, nosso mecanismo é feito em Java e, desde há mais tempo, superamos o mecanismo C, sendo ao mesmo tempo muito mais produtivo. Não porque o Java em si seja mais rápido que o C, é rápido o suficiente e nossos algoritmos são melhores, nós os implementamos mais facilmente, poderíamos testar mais rapidamente e melhor e refatorar nosso código.

Também escrevi código de teste para comparar os resultados do cálculo com o conteúdo do banco de dados de produção: não em C, não em Java, mas em Ruby. Novamente, é rápido o suficiente e precisa de muito menos código, por isso é mais fácil de implementar, mais fácil de testar e mais fácil de expandir.

E não me sinto amador, não importa qual idioma eu use, me sinto assim apenas se eu fizer um bug estúpido que não deveria ter acontecido.


1

No ano passado, a empresa em que trabalho trabalhava na engenharia reversa de um código CRC de comunicações por força bruta (finalmente conseguimos). 3 Cada desenvolvedor tinha sua própria versão, Borland C, C # .Net 2008, VB6. O VB6 era obviamente lento, o Borland C foi rápido, mas o C # .net o açoitou 12 vezes a velocidade. Não era o que esperávamos.


1
Eles estão usando o mesmo algoritmo passo a passo? Eles poderiam estar computando a mesma saída, mas as etapas matemáticas elementares usadas para chegar à saída podem ser diferentes, e o desempenho é determinado pela contagem bruta de etapas elementares, que por sua vez é determinada pela forma como a "fórmula" é decomposta nelas.
rwong 10/05

Um compilador C mais velha não pode estar usando as instruções mais recente processador (ou seja, SSE2 e posterior)
GrandmasterB

1
Todos os três idiomas são compilados para código nativo otimizado (VB6 / C ++ durante a compilação, .NET durante o JIT). Então você provavelmente está medindo diferenças entre seus programadores e não entre as linguagens de programação.
Nikie

@nikie JIT! = compilação. E a qualidade dos compiladores é diferente. Eu vi exatamente o mesmo algoritmo executar muito mais rápido quando escrito em C ++ (sem chamadas de API, apenas referências de matriz, loops e aritmética simples) do que em Java, apesar de toda a conversa sobre JIT.
Quant_dev 10/05

1
@quant_dev: Na minha experiência lá é nenhuma bala de prata ;-) Minha experiência com o .NET JIT é que a diferença entre o JIT e MSVC ++ é muito pequena. Duvido muito 12x de qualquer maneira para o mesmo código.
Nikie

1

Depende de uma mistura de coisas, mas basicamente, tudo o mais é igual, sim, o código nativo é mais "hardcore" do que o código gerenciado.

Acho que isso geralmente é uma coisa ruim para um aplicativo comercial normal, porque significa que o desenvolvedor médio deve colocar mais energia mental nos aspectos não comerciais do código.


1

Meu programa é o que poderia ser melhor descrito como C ++ como Java. Minha opinião é que você pode obter a mesma programação de baixo nível em Java, mas é muito mais difícil que a programação de baixo nível em C ++. No entanto, você geralmente precisa dessa programação de baixo nível em uma pequena fração do seu código e, onde não é necessário, uma linguagem gerenciada é mais produtiva.


1

Os desenvolvedores nativos geralmente obtêm a reputação de serem mais hardcore, porque se sentem mais hardcore e agem dessa maneira. Os desenvolvedores nativos são treinados em um sistema que não tolera erros, porque inevitavelmente levam a falhas graves ou vazamentos ilimitados de memória. Em particular, o .NET permite hacks preguiçosos, como colocar try / catch em torno de tudo, evitando que o desenvolvedor pense que eles precisam entender o problema principal (" às vezes, apenas lança InvalidOperationException. Não sei explicar, vamos pegar tudo. Isso código é crítico! "). Isso não é totalmente preto e branco, mas minhas observações cresceram no mundo não gerenciado e agora trabalham em código gerenciado em período integral.

Além disso, os desenvolvedores gerenciados também tendem a ter acesso a BCLs muito mais limpos e organizados. Isso geralmente os incentiva a explorar o que realmente acontece debaixo das cobertas. É verdade que o mesmo pode ser dito para, digamos, STL ou Boost, mas a biblioteca de classes .NET geralmente é boa o suficiente para nos tornar intelectualmente preguiçosos às vezes.

Dito isto, escrever um programa gerenciado bom e entregável exige muito trabalho. Isso significa fazer perfis de memória e CPU, testes de unidade e análise de código de maneiras semelhantes às que os desenvolvedores não gerenciados fazem. Desenvolvedores não gerenciados tendem a entender isso, e desenvolvedores gerenciados tendem a incluir mais daqueles que não o fazem.

Novamente, não preto e branco. Existem muitos desenvolvedores não gerenciados intelectualmente preguiçosos e desenvolvedores gerenciados hardcore. Nem por definição é mais elite que o outro.


0

Você vê o código gerenciado como amador? Você vê codificadores nativos como mais hardcore?

Há uma lacuna entre os dois países, e não consigo entender o porquê: os sistemas gerenciados estão escritos em algum lugar no código nativo (como final, tudo é executado "em assembly"). O que eu quero ver (ainda na minha vida) é um sistema de construção de aplicativos, no qual toda a subtarefa do aplicativo será escrita no tipo de idioma correto.


Um sistema de construção de aplicativos, como você descreve, é apenas outra (e espero que melhor) linguagem de programação.
David Thornley

Não estou familiarizado com o .NET, mas o AFAIK é um sistema de linguagem mista, que tem um formato executável comum executado por uma VM e uma enorme biblioteca que pode ser usada com qualquer idioma do .NET. Um mesmo sistema seria bom no mundo nativo / compilado. Independente da plataforma, é claro.
ern0

0

O código nativo ficou mais fácil desde que o Go foi lançado. Acho mais fácil ler e escrever do que Java e C #. Embora a programação da GUI com o Go, a partir de agora, não seja muito agradável (dei uma olhada rápida nas opções).
Tente não julgá-lo por sua falta de comunidade grande e variedade de bibliotecas em comparação com o C # (por exemplo), porque ainda é considerado novo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.