Ainda faz sentido aprender programação WinAPI de baixo nível?[fechado]

StackOverflow https://stackoverflow.com/questions/5507

  •  08-06-2019
  •  | 
  •  

Pergunta

Faz sentido, tendo toda a felicidade gerenciada pelo C #, voltar às janelas de programação da Petzold e tentar produzir código com WinAPI puro?

O que podemos aprender com isso?Não está muito desatualizado para ser útil?

Foi útil?

Solução

Esta questão beira o religioso :) Mas vou dar a minha opinião de qualquer maneira.

Eu vejo valor em aprender a API Win32.A maioria, senão todas, as bibliotecas GUI (gerenciadas ou não gerenciadas) resultam em chamadas para a API Win32.Mesmo as bibliotecas mais completas não cobrem 100% da API e, portanto, sempre há lacunas que precisam ser preenchidas por chamadas diretas de API ou invocação P/.Alguns dos nomes dos wrappers em torno das chamadas de API têm nomes semelhantes às chamadas de API subjacentes, mas esses nomes não são exatamente autodocumentados.Portanto, compreender a API subjacente e a terminologia nela usada ajudará a compreender as APIs do wrapper e o que elas realmente fazem.

Além disso, se você compreender a natureza das APIs subjacentes usadas pelas estruturas, fará escolhas melhores em relação a qual funcionalidade de biblioteca deve usar em um determinado cenário.

Saúde!

Outras dicas

Eu mantive o padrão C/C++ por anos antes de aprender a API Win32 e, para ser franco, a parte "aprender a API Win32" não é a melhor experiência técnica da minha vida.

Por um lado, a API Win32 é muito legal.É como uma extensão da API padrão C (quem precisa fopen quando você pode ter CreateFile.Mas acho que UNIX/Linux/WhateverOS têm as mesmas funções de gizmo.Enfim, no Unix/Linux, eles têm o "Tudo é um arquivo".No Windows, eles têm a opção "Tudo é um...Janela" (sem brincadeira!Ver CreateWindow!).

Por outro lado, esta é uma API legada.Você estará lidando com C bruto e com a loucura do C bruto.

  • É como dizer à estrutura qual é o seu próprio tamanho para passar por um void * ponteiro para alguma função Win32.
  • As mensagens também podem ser bastante confusas:A mistura de objetos C++ com janelas Win32 leva a exemplos muito interessantes de Frango ou Ovo problema (momentos engraçados quando você escreve uma espécie de delete this ; em um método de classe).
  • Ter que subclassificar um WinProc quando você está mais familiarizado com a herança de objetos é confuso e não é o ideal.
  • E claro, há a alegria de "Por que neste mundo de fraturamento hidráulico eles fizeram isso dessa maneira?"momentos em que você bate muitas vezes com a cabeça no teclado e volta para casa com as teclas gravadas na testa, só porque alguém achou mais lógico escrever uma API para permitir a mudança da cor de uma "janela", não por alterando uma de suas propriedades, mas solicitando sua janela pai.
  • etc.

Na última mão (três mãos ???), considere que algumas pessoas que trabalham com APIs legadas estão usando estilos de código legado.No momento em que você ouve "const é para manequins" ou "Eu não uso namespaces porque eles diminuem a velocidade do tempo de execução", ou melhor ainda"Ei, quem precisa de C++?Eu codifico em minha própria marca de C orientado a objetos!!!" (Sem brincadeiras...Em um ambiente profissional, e o resultado foi um espetáculo...), você sentirá o tipo de pavor que só os condenados sentem diante do guilhotina.

Então...Em suma, é um interessante experiência.

Editar

Depois de reler este post, vejo que ele pode ser visto como excessivamente negativo.Não é.

Às vezes é interessante (e também frustrante) saber como as coisas funcionam nos bastidores.Você entenderá que, apesar das enormes (impossíveis?) restrições, a equipe da API Win32 fez um trabalho maravilhoso para garantir que tudo, desde seu "antigo programa Win16" até seu "último aplicativo over-the-top Win64", possa funcionar em conjunto, no passado, agora e no futuro.

A questão é:Você realmente quer?

Porque passar semanas fazendo coisas que poderiam ser feitas (e feitas melhor) em outras APIs de mais alto nível e/ou orientadas a objetos pode ser bastante desmotivante (experiência da vida real:3 semanas para Win API, contra 4 horas em três outras linguagens e/ou bibliotecas).

De qualquer forma, você achará o Blog de Raymond Chen muito interessante por causa de sua visão privilegiada sobre a Win API e sua evolução ao longo dos anos:

https://blogs.msdn.microsoft.com/oldnewthing/

Absolutamente.Quando ninguém conhece o nível baixo, quem atualizará e escreverá as linguagens de alto nível?Além disso, quando você entende as coisas de baixo nível, você pode escrever código mais eficiente em uma linguagem de nível superior e também depurar com mais eficiência.

As APIs nativas são as APIs "reais" do sistema operacional.A biblioteca .NET (com poucas exceções) nada mais é do que um invólucro sofisticado em torno deles.Então, sim, eu diria que qualquer pessoa que consiga entender o .NET com toda a sua complexidade pode entender coisas relativamente mundanas, como conversar com a API, sem o benefício de um intermediário.

Apenas tente fazer injeção de DLL a partir de código gerenciado.Isso não pode ser feito.Você será forçado a escrever código nativo para isso, para ajustes de janelas, para subclasses reais e uma dúzia de outras coisas.

Então sim:você deve (deve) conhecer ambos.

Editar:mesmo se você planeja usar P/Invoke.

Supondo que você esteja criando aplicativos direcionados ao Windows:

  • certamente pode ser informativo entender os níveis inferiores do sistema - como eles funcionam, como seu código interage com eles (mesmo que apenas indiretamente) e onde você tem opções adicionais que não estão disponíveis nas abstrações de nível superior
  • há momentos em que seu código pode não ser tão eficiente, de alto desempenho ou preciso o suficiente para seus requisitos
  • No entanto, em cada vez mais casos, pessoas como nós (que nunca aprenderam "codificação não gerenciada") serão capazes de realizar a programação que estamos tentando fazer sem "aprender" o Win32.
  • Além disso, há muitos sites que fornecem amostras funcionais, fragmentos de código e até mesmo código-fonte totalmente funcional que você pode "aproveitar" (emprestar, plagiar - mas verifique se está cumprindo qualquer licença de reutilização ou direitos autorais!) para preencher em quaisquer lacunas que não sejam tratadas pelas bibliotecas de classes do .NET Framework (ou pelas bibliotecas que você pode baixar ou licenciar).
  • Se você consegue realizar os feitos necessários sem mexer no Win32, e está fazendo um bom trabalho no desenvolvimento de código gerenciado legível e bem formado, então eu diria que dominar o .NET seria uma escolha melhor do que se espalhar em dois ambientes muito diferentes.
  • Se você frequentemente precisa aproveitar os recursos do Windows que não receberam uma boa cobertura da biblioteca de classes do Framework, então, sem dúvida, aprenda as habilidades necessárias.
  • Pessoalmente, passei muito tempo me preocupando com as "outras áreas" da codificação que estou suposto entender para produzir "bons programas", mas há muitos masoquistas por aí que pensam que as necessidades e desejos de todos são iguais aos seus.A miséria adora companhia.:)

Supondo que você esteja criando aplicativos para o mundo "Web 2.0" ou que seriam igualmente úteis/benéficos para usuários *NIX e MacOS:

  • Atenha-se a linguagens e compiladores direcionados ao maior número possível de ambientes de plataforma cruzada.
  • O .NET puro no Visual Studio é melhor que o Win32, obviamente, mas desenvolver nas bibliotecas MONO, talvez usando o IDE Sharp Develop, é provavelmente uma abordagem ainda melhor.
  • você também poderia gastar seu tempo aprendendo Java, e essas habilidades seriam transferidas muito bem para a programação C# (além disso, o código Java teoricamente seria executado em qualquer plataforma com o JRE correspondente).Ouvi dizer que Java é mais como "escrever uma vez, depurar em qualquer lugar", mas isso é provavelmente tão verdadeiro quanto (ou até mais que) C#.

Analogia:Se você ganha a vida construindo carros (programação), então é muito pertinente saber como funciona o motor (Win32).

Resposta simples, SIM.

Esta é a resposta para qualquer pergunta do tipo .. "faz sentido aprender uma linguagem/api X de baixo nível mesmo quando uma linguagem/api Y de nível superior existe"

SIM

Você pode inicializar seu PC com Windows (ou qualquer outro sistema operacional) e fazer esta pergunta no SO porque alguns caras da Microsoft escreveram um código assembly de 16 bits que carrega seu sistema operacional.

Seu navegador funciona porque alguém escreveu um kernel do sistema operacional em C que atende a todas as solicitações do seu navegador.

Isso vai até as linguagens de script.

Grande ou pequeno, sempre há mercado e oportunidade para escrever algo em qualquer nível de abstração.Você só precisa gostar e se encaixar no trabalho certo.

Nenhuma API/linguagem em qualquer nível de abstração é irrelevante a menos que haja um melhor competindo no mesmo nível.

Outra maneira de ver isso:Um bom exemplo de um dos livros de Michael Abrash:Um programador C recebeu a tarefa de escrever uma função para limpar a tela.Como C era uma abstração melhor (de nível superior) em relação ao assembly e tudo mais, o programador só conhecia C e o conhecia bem.Ele fez o melhor que pôde - moveu o cursor para cada local da tela e apagou o caractere ali.Ele otimizou o loop e garantiu que ele funcionasse o mais rápido possível.Mas mesmo assim foi lento...até que um cara entrou e disse que havia alguma instrução BIOS/VGA ou algo que poderia limpar a tela instantaneamente.

Sempre ajuda saber no que você está caminhando.

Sim, por alguns motivos:

1) .net envolve o código Win32..net geralmente é um sistema superior para codificar, mas ter algum conhecimento da camada Win32 subjacente (ops, WinAPI agora que também existe código de 64 bits) reforça seu conhecimento do que realmente está acontecendo.

2) nesta economia é melhor ter algumas vantagens sobre o outro quando você está procurando emprego.Alguma experiência com WinAPI pode fornecer isso para você.

3) alguns aspectos do sistema ainda não estão disponíveis no framework .net, e se você quiser acessar esses recursos você precisará usar p/invoke (veja http://www.pinvoke.net para alguma ajuda lá).Ter pelo menos um pouco de experiência em WinAPI tornará seu esforço de desenvolvimento p/invoke muito mais eficiente.

4) (adicionado) Agora que o Win8 já existe há algum tempo, é ainda construído em cima do WinAPI.iOS, Android, OS/X e Linux estão todos disponíveis, mas o WinAPI ainda estará disponível por muitos anos.

Aprender uma nova linguagem de programação ou tecnologia ocorre por um destes três motivos:
1.Precisar:você está iniciando um projeto para construir uma aplicação web e não sabe nada sobre ASP.NET
2.Entusiasmo:você está muito entusiasmado com o ASP.NET MVC.por que não tentar isso?
3.Tempo livre:mas quem tem isso de qualquer maneira.

A melhor razão para aprender algo novo é a necessidade.Se você precisa fazer algo que o framework .NET não pode fazer (como desempenho, por exemplo), então o WinAPI é a sua solução.Até então, nos manteremos ocupados aprendendo sobre .NET

Para a maioria das necessidades no desktop você não precisará conhecer o Win32, porém há MUITO Win32 que não está no .NET, mas está no desembolso que pode acabar sendo menos de 1% da sua aplicação.

Suporte USB, suporte HID, Windows Media Foundation logo na minha cabeça.Existem muitas APIs interessantes do Vista disponíveis apenas no Win32.

Você fará um grande favor a si mesmo aprendendo como fazer interoperabilidade com uma API Win32, se fizer programação de desktop, porque quando precisar chamar o Win32, e você precisará, não passará semanas coçando a cabeça.

Pessoalmente, eu realmente não gosto da API Win32, mas há valor em aprendê-la, pois a API permitirá mais controle e eficiência usando a GUI do que uma linguagem como Visual Basic, e acredito que se você quiser ganhar a vida escrevendo software você deve conhecer a API mesmo que não a use diretamente.Isso ocorre por motivos semelhantes aos motivos pelos quais é bom aprender C, como como um strcpy leva mais tempo do que copiar um número inteiro ou por que você deve usar ponteiros para arrays como parâmetros de função em vez de arrays por valor.

Aprender C ou uma linguagem de nível inferior pode definitivamente ser útil.No entanto, não vejo nenhuma vantagem óbvia em usar o WinAPI não gerenciado.

Eu vi código API do Windows de baixo nível ...não é bonito...Eu gostaria de poder desaprender isso.Acho que é benéfico aprender em baixo nível, como em C, à medida que você entende melhor a arquitetura de hardware e como tudo isso funciona.Aprendendo a antiga API do Windows...Acho que essas coisas podem ser deixadas para as pessoas da Microsoft que podem precisar aprender para construir linguagens e APIs de nível superior...eles construíram, deixe-os sofrer com isso ;-)

No entanto, se acontecer de você encontrar uma situação em que sente que simplesmente não consegue fazer o que precisa em uma linguagem de nível superior (poucas e raras), então talvez comece o perigoso mergulho nesse mundo.

sim.dê uma olhada no uTorrent, uma incrível eficiência de software.Metade de seu tamanho pequeno se deve ao fato de que muitos de seus componentes principais foram reescritos para não usar bibliotecas gargatuianas.

Muito disso não poderia ser feito sem entender como essas bibliotecas interagem com as APIs de nível inferior

É importante saber o que está disponível na API do Windows.Não acho que você precise criar código com ele, mas você deve saber como funciona.O .NET Framework contém muitas funcionalidades, mas não fornece equivalentes de código gerenciado para toda a API do Windows.Às vezes você tem que chegar um pouco mais perto do metal, e saber o que está lá embaixo e como ele se comporta lhe dará uma melhor compreensão de como usá-lo.

Isso é realmente o mesmo que a pergunta: devo aprender uma linguagem de baixo nível como C (ou mesmo assembler).

Codificá-lo é certamente mais lento (embora, claro, o resultado seja muito mais rápido), mas sua verdadeira vantagem é que você obtém uma visão do que está acontecendo próximo ao nível do sistema, em vez de apenas entender a metáfora de outra pessoa sobre o que está acontecendo. .

Também pode ser melhor quando as coisas não funcionam bem, ou com rapidez suficiente ou com o tipo de granularidade que você precisa.(E faça pelo menos algumas subclasses e superclasses.)

Vou colocar desta forma.Não gosto de programar para a API Win32.Pode ser uma dor em comparação com o código gerenciado.MAS, estou feliz por saber disso porque posso escrever programas que de outra forma não seria capaz.Posso escrever programas que outras pessoas não conseguem.Além disso, oferece mais informações sobre o que seu código gerenciado está fazendo nos bastidores.

A quantidade de valor que você obtém ao aprender a API Win32 (além dos tipos de insights gerais que você obtém ao aprender sobre como os detalhes básicos da máquina se encaixam) depende do que você está tentando alcançar.Grande parte da API Win32 foi bem agrupada nas classes da biblioteca .NET, mas não toda.Se, por exemplo, você deseja fazer alguma programação de áudio séria, essa parte da API Win32 seria um excelente assunto de estudo porque apenas as operações mais básicas estão disponíveis nas classes .NET.A última vez que verifiquei até mesmo a biblioteca gerenciada do DirectX DirectSound era horrível.


Correndo o risco de uma autopromoção descarada....

Acabei de me deparar com uma situação em que a API Win32 era minha única opção.Quero ter dicas de ferramentas diferentes para cada item em uma caixa de listagem.Eu escrevi como fiz isso essa questão.

Mesmo em linguagens de nível muito alto você ainda faz uso da API.Por que?Bem, nem todos os aspectos da API foram replicados pelas várias bibliotecas, estruturas, etc.Você precisa aprender a API enquanto precisar dela para realizar o que está tentando fazer.(E não mais.)

Tirando alguns casos muito especiais em que você precisa de acesso direto às APIs, eu diria NÃO.

É necessário tempo e esforço consideráveis ​​para aprender a implementar corretamente as chamadas de API nativas e o valor retornado simplesmente não vale a pena.Prefiro passar o tempo aprendendo alguma nova tecnologia ou estrutura que tornará sua vida mais fácil e a programação menos dolorosa.Não são bibliotecas COM obsoletas com décadas de existência que ninguém mais usa (desculpe aos usuários do COM).

Por favor, não me apedreje por esta visão.Eu sei que muitos engenheiros aqui têm almas realmente curiosas e não há nada de errado em aprender como as coisas funcionam.A curiosidade é boa e realmente ajuda na compreensão.Mas do ponto de vista gerencial, prefiro passar uma semana aprendendo como desenvolver aplicativos Android do que como chamar OLEs ou COMs.

Se você planeja desenvolver um aplicativo multiplataforma, se usar win32, seu aplicativo poderá ser executado facilmente no Linux por meio do WINE.Isso resulta em um aplicativo altamente sustentável.Esta é uma das vantagens de aprender win32.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top