É aconselhável que um desenvolvedor de alto nível gaste tempo estudando montagem? [fechadas]

33

É claro que o conhecimento de coisas de baixo nível é muito importante em nosso trabalho.

Mas em uma situação em que você já está desenvolvendo software comercial em alto nível, e quando você já tem uma direção escolhida, mas não possui nenhuma habilidade de montagem, não é mais razoável se concentrar em estudar coisas relacionadas à sua direção? Ou existe algum motivo para você dedicar algum tempo para aprender o básico de baixo nível?

Quando é tarde demais e quando não é? E se é não tarde demais, então como é que um vá sobre a aprendizagem de forma ideal (no sentido de não gastar tempo excessivo para obter alguma profundidade e entender)?

zkaje
fonte
Muitas perguntas em um post :)
Shamim Hafiz
Gostei da linguagem Assembly passo a passo. Muitas coisas de programação noobie-ish no começo, mas o autor é muito divertido. Descobri que ter uma ideia geral é útil e escrevo principalmente JavaScript.
Erik Reppen
Minha primeira língua (ensinada) foi um dialeto de montagem. Eu posso ver como isso seria útil (na infinidade de maneiras que outras pessoas apontaram), e isso ajuda você a fornecer informações diferentes para o restante da equipe.
21312 Jamie Taylor

Respostas:

43

Não posso acreditar que ninguém tenha mencionado a depuração ...

Não escrevo uma linha de código de montagem há muitos anos. Mas eu li com bastante frequência. A depuração de alto nível é excelente quando você tem as informações de origem e símbolo, mas quando sua biblioteca sofisticada está lançando uma exceção sem tratamento nas máquinas dos clientes, é tarde demais para exigir que isso seja incluído na licença ...

Mas ainda posso abrir o desmontador e ver o que sua lógica de alto nível acabou fazendo , rastrear dados ruins de volta à sua origem, descobrir quem alterou o registro de controle da FPU ...

Isso salvou meu bacon mais frequentemente do que eu gostaria de pensar. E nunca é tarde para aprender - existem muitas ótimas referências e tutoriais na Internet, e praticamente qualquer programa em execução em sua máquina pode fornecer um ambiente prático.

Shog9
fonte
10
+1 e eu votaria mais se pudesse. Todo desenvolvedor sério precisa ser capaz de ler o ASM por esse motivo, se não houver outro motivo.
Mason Wheeler
3
O corolário disso é a otimização. Saber como o complier traduz seu código em assembly pode ajudá-lo a torná-lo drasticamente mais rápido!
lambacck
3
O Assembly +1 é um dos únicos idiomas que o forçam a entender como um processador realmente funciona. Ajuda você no seu desenvolvimento com linguagem de alto nível. Deve ler: blogs.msdn.com/b/ericlippert/archive/2010/09/30/…
Conhecer o computador subjacente é MUITO ÚTIL , seja para depuração, otimização ou pura curiosidade. Sério, aprenda a ler pelo menos uma ou duas famílias da linguagem assembly. Mesmo que você nunca leia ou escreva depois de aprender, isso afetará a maneira como você entenderá as coisas no futuro. Agora, se você prefere escrever em nenhuma outra língua, que pode ser um pouco demais ...
Michael Trausch
1
@Mason: Eu não sei se "todo desenvolvedor sério" precisa ser capaz de ler o ASM. Se você estiver escrevendo JavaScript ou usando uma linguagem de programação criada sobre uma estrutura espessa (como .NET ou Java), eu não consideraria capaz de ler o ASM como essencial para ser um desenvolvedor sério. Dito isto, entender como o computador executa instruções em um nível muito baixo pode ser bastante útil, mesmo em linguagens e ambientes de programação de ordem superior.
Scott Mitchell
15

Você não precisa aprender a linguagem assembly, apenas precisa entender como ela funciona. Você precisa saber o que é XOR e contar em binário enquanto dorme, etc. Mas nunca precisei de código de montagem em meu trabalho.

Então, como você diz, o conhecimento de coisas de baixo nível é importante, mas o conhecimento prático em montagem não é.

Lennart Regebro
fonte
1
Eu segundo. Você pode ganhar uma boa programação de vida e nunca precisa ler / escrever ASM. Existem algumas posições que exigem isso. A leitura de um despejo após uma condição de corrida no seu código interrompeu o processo. Ou se você escreve programas muito intensivos em perf (como paralelismo de GPU / OpenCL). A porcentagem de tarefas de desenvolvimento nas quais você será solicitado a executar essas tarefas é muito pequena.
yzorg 18/12/10
11

Se você realmente não tem habilidades de programação de baixo nível, eu altamente recomendo aprender alguns em seu tempo livre. Você não precisa se tornar um especialista nisso; basta atingir algum nível de proficiência. Você precisa fazer muito trabalho matemático, em vez de depender do compilador ou das bibliotecas para fazer isso por você. Isso ajudará você a entender a legibilidade na programação, pois a maioria das instruções de montagem corresponde a uma instrução do processador. Você precisa gerenciar a complexidade em programas um pouco maiores, sem o benefício de coisas como essa if...else. Isso o ajudará a escrever programas mais simples de alto nível, porque a experiência em montagem ensinaria a você como é mais fácil ler.

Lembre-se também de que o assembly não é um idioma! É um termo genérico, que basicamente significa o conjunto de instruções de um processador que foi abstraído para uma linguagem simbólica. Processadores diferentes têm conjuntos de instruções diferentes e, portanto, linguagens de montagem diferentes. Quando você aprende 'montagem', aprende um processo, não um idioma.

Michael K
fonte
8

Você sempre se beneficiará de olhar por baixo das cobertas e entender um pouco mais sobre o que está por baixo da abstração em que você está. Como um professor universitário afirmou uma vez: "Todos os bons programadores entendem o hardware" - você não precisa criar e manipular circuitos, mas deve ter alguma noção do que está acontecendo lá em baixo - isso só fará com que você é melhor.

Experimente a organização e o design do computador

Watson
fonte
1

Sim - o aprendizado contínuo e ao longo da vida é um componente essencial de uma carreira no desenvolvimento de software. Se você estiver interessado em continuar aprendendo sobre programação e como melhorar seu ofício, sim, em algum momento você deve aprender montagem, pois isso o exporá a uma linguagem completamente nova e à maneira de escrever código. Pelo mesmo motivo, recomendo experimentar várias linguagens / estilos de programação, incluindo Ruby / Python (linguagem dinâmica), Haskell / F # (linguagem funcional pura), Lisp / Scheme (linguagem funcional), etc.

Eu diria que é tarde demais se você não estiver mais interessado em aprender mais sobre o ofício da programação. Por exemplo, se você alcançou o ponto de sua carreira, em breve poderá passar da programação para outra área, como Gerenciamento, Engenharia de Sistemas, Vendas / Marketing, etc. Se você acha que pode querer mudar para uma nova área em Nos próximos anos, eu me concentraria mais nas habilidades necessárias para desenvolver nessa área, em vez de na arte da programação.

Justin Ethier
fonte
1

Você deve saber o que é e o que o computador está fazendo. Aprender algo como o MIX de Knuth o ajudará. Principalmente poder julgar a eficiência do seu código. Vá pegar a arte da programação de computadores e leia-a. Isso fará de você um programador mais inteligente.

Theo Belaire
fonte
1

Não é mais razoável se concentrar em estudar coisas relacionadas à sua direção? Ou existe algum motivo para você dedicar algum tempo para aprender o básico de baixo nível?

Responda:

  1. Se você não planeja mudar sua direção para programar o sistema incorporado, não há razão para aprender a montar. Mesmo pensando que a montagem depende da CPU, você pode aprender algumas noções básicas, mas seu conhecimento será baseado na arquitetura e no conjunto de instruções da CPU.
  2. Digamos que você codifique para Windows. Se você quiser aprender um idioma de nível inferior ao de alto nível que possa beneficiar sua direção atual, recomendo que você aprenda o Windows I deep, API do Windows, gerenciamento de memória do Windows etc. Simplesmente aprenda o SO / plataforma que você está codificando.
  3. Melhore suas habilidades no seu idioma atual de alto nível, como gerenciamento de memória, coleta de lixo, etc. Se você deseja diminuir o nível.
Amir Rezaei
fonte
0

Eu acho que você alcança um ponto de retornos decrescentes à medida que sua carreira avança. Ou seja, você deve aprender a linguagem assembly mais cedo, pois isso leva a uma melhor compreensão fundamental de tudo o que vem depois. No entanto, se você já faz parte da força de trabalho e tem alguns anos de experiência, já terá uma ideia do modo como as coisas funcionam, portanto, aprender os detalhes reais dos parafusos e porcas pode não fornecer muitas informações .

TMN
fonte
0

Não sei o quanto seria útil estudar a montagem. Mas pelo menos fazer alguma programação em uma linguagem como C seria benéfico. Recentemente, tive que fazer alguma programação em C e achei isso bastante esclarecedor. C remove grande parte da abstração presente em idiomas de nível superior. Essas abstrações não vêm sem custo. Você precisa gerenciar mais detalhes de nível inferior em C, onde, em um idioma de nível superior, esses detalhes estão sendo gerenciados por você. Ao fazer alguma programação em C, você precisará conhecer esses detalhes. Portanto, quando você voltar à sua linguagem cotidiana, ainda terá essa consciência e apreciará melhor o que realmente está acontecendo. Isso deve ajudar a torná-lo um programador melhor.

Ross Goddard
fonte
0

Na profissão de professor, pelo menos aqui no Reino Unido, os professores precisam ser qualificados muito além do que ensinam. Espera-se que um professor do ensino médio tenha um diploma na matéria que lecionou, e os professores do ensino fundamental também têm diploma e devem ser proficientes em todas as disciplinas principais até um bom nível GCSE (ensino médio) exames de saída ?, nenhum equivalente real nos EUA).

Por quê? Porque para ensinar algo bem, ou de fato usar algo bem, você precisa entender. Isso requer a compreensão da estrutura subjacente, a cadeia de decisões antes da que você está trabalhando e que levou a ela. Para entender adequadamente o código de alto nível, você deve entender a camada sobre a qual ele é construído, como ele opera, onde estão seus pontos fortes e fracos. Isso é recursivo, para entender a camada abaixo, você também deve entender a camada abaixo.

No final, é por isso que os cursos decentes de universidades / faculdades em Computação pedem boa habilidade matemática antes de tudo, pois esse é efetivamente o nível mais baixo.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Se você não tiver conhecimento nessas áreas, seu entendimento ficará comprometido. Quanto mais próximo do nível em que você opera outra camada, mais importante é ter uma base nela.

Então: Você precisa conhecer o assembler como um codificador de alto nível?  Isso vai ajudar.

Orbling
fonte
0

Tinha sido muito importante na minha vida anterior como um guru do supercomputador. Naquela época, senti que você não entendia uma máquina até escrever pelo menos várias centenas de linhas de montador e mexer com ela tentando reduzir o desempenho. Como poucos programadores queriam ir tão fundo, isso me tornou realmente indispensável. E ainda tenho um idioma comum ao conversar com os tipos de designer de HW.

Mas, na verdade, a necessidade / benefício disso ocorre quase duas décadas atrás. Entre os avanços do compilador e a execução avançada fora de ordem do HW, há muito pouco espaço para ser capaz de interpretar o herói, escrevendo mais o assembler. Embora eu ache útil entender como as coisas funcionam. Eu pretendo ensinar meus filhos (calouros de nível superior em CS) a programar em um montador muito simplificado em uma máquina virtual simples, para que eles tenham uma ideia do que acontece. Espero que possamos brincar com coisas como desenrolamento, pipelining de software, caches e pré-buscas, carregamento inferior etc. Então, pelo menos, eles saberão que em algum nível essas coisas estão acontecendo.

Omega Centauri
fonte