Programação de baixo nível - o que há para mim? [fechadas]


32

Durante anos, considerei cavar o que considero linguagens de "baixo nível". Para mim, isso significa C e montagem. No entanto, eu não tinha tempo para isso ainda, nem nunca foi necessário.

Agora, porque não vejo nenhuma necessidade, sinto que devo apenas agendar algum momento no qual estudei o assunto ou desistirei do plano para sempre.

Minha posição

Nos últimos 4 anos, concentrei-me em "tecnologias da web", que podem mudar, e sou desenvolvedor de aplicativos, que dificilmente mudará.

No desenvolvimento de aplicativos, acho que a usabilidade é a coisa mais importante. Você escreve aplicativos para serem "consumidos" pelos usuários. Quanto mais utilizáveis ​​forem esses aplicativos, mais valor você terá produzido.

Para alcançar uma boa usabilidade, acredito que as seguintes coisas são viáveis

  • Bom design : recursos bem pensados ​​acessíveis por meio de uma interface de usuário bem pensada.
  • Correção : o melhor design não vale nada, se não for implementado corretamente.
  • Flexibilidade : um aplicativo A deve evoluir constantemente, para que seus usuários não precisem mudar para um aplicativo B diferente, com novos recursos, que A possa implementar. Os aplicativos que abordam o mesmo problema não devem diferir nos recursos, mas na filosofia.
  • Desempenho : O desempenho contribui para uma boa experiência do usuário. Idealmente, um aplicativo é sempre responsivo e executa suas tarefas razoavelmente rápido (com base em sua frequência). O valor da otimização do desempenho além do ponto em que é perceptível pelo usuário é questionável.

Acho que a programação de baixo nível não vai me ajudar com isso, exceto pelo desempenho. Mas escrever um aplicativo inteiro em um idioma de baixo nível por uma questão de desempenho é uma otimização prematura.

Minha pergunta

O que a programação de baixo nível poderia me ensinar, que outras línguas não me ensinariam? Estou faltando alguma coisa, ou é apenas uma habilidade, que é muito pouco útil para o desenvolvimento de aplicativos? Por favor, entenda que eu não estou questionando o valor de C e montagem. É que, na minha vida cotidiana, estou muito feliz que todos os meandros desse mundo sejam abstraídos e gerenciados para mim (principalmente por camadas escritas em C / C ++ e pela própria montagem). Eu simplesmente não vejo nenhum conceito que possa ser novo para mim, apenas detalhes com os quais eu teria que encher minha cabeça. Então, o que há para mim?

Minha Conclusão

Obrigado a todos por suas respostas. Devo dizer que ninguém realmente me surpreendeu, mas pelo menos agora tenho certeza de que abandonarei essa área de interesse até que seja necessário.
Para mim, escrever a montagem hoje em dia para processadores como eles estão em uso nas CPUs de hoje não é apenas desnecessariamente complicado, mas também corre o risco de resultar em desempenho de tempo de execução menor do que um equivalente em C. A otimização manual é quase impossível devido ao OOE, enquanto você não obtém todos os tipos de otimizações que um compilador pode fazer automaticamente. Além disso, o código é portátil, porque usa um pequeno subconjunto de comandos disponíveis ou é otimizado, mas provavelmente funciona apenas em uma arquitetura.
Escrever C não é mais tão necessário, como era no passado. Se eu escrevesse um aplicativo em C, usaria tanto bibliotecas e estruturas testadas quanto estabelecidas, o que me pouparia na implementação de rotinas de cópia de seqüência de caracteres, algoritmos de classificação e outros tipos de coisas que servem como exercício na universidade. Meu próprio código seria executado mais rapidamente com o custo da segurança do tipo. Não estou interessado em reinventar a roda no curso do desenvolvimento normal de aplicativos, nem em tentar depurar olhando os dumps principais: D
Atualmente, estou experimentando idiomas e intérpretes; portanto, se houver algo que eu gostaria de publicar, suponho que portaria um conceito funcional para C, embora C ++ possa fazer o mesmo.
Mais uma vez, obrigado a todos por suas respostas e informações.


6
@ TheLQ: minha pergunta não é por que usá- lo, mas o que posso aprender com ele .
back2dos

1
Exemplo: Voltar ao básico .
rwong

Respostas:


9

A programação de baixo nível é para os casos de canto em que existe um requisito que não está presente imediatamente em computadores desktop normais. Pode ser um gargalo de velocidade, ou um gargalo de memória ou algo completamente diferente, e muitas vezes é muito interessante ver o que pode ser feito, considerando esses requisitos.

Pense nisso como Haikus ou Limericks, onde as restrições o tornam interessante.

Para ter uma idéia do que é possível no que parece impossível hoje, aqui está um dos maiores hacks de todos os tempos. Xadrez em 1 Kb de RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/


1
Eu acho que vou realmente "restrições tornam isso interessante". De todas as coisas mencionadas aqui, este é provavelmente o melhor. De volta à escola, tenho programado jogos na minha calculadora com 32kB de memória e uma CPU de 8Mhz. Foi divertido, mas eu não aprendi muito do que poderia me beneficiar agora.
back2dos

Downvoter, por favor mencione por quê?

29

Eu estava pensando nisso recentemente. Atualmente, eu me considero um desenvolvedor de C # - o que é perfeitamente bom para minha carreira.

No entanto, de vez em quando eu perco as coisas de nível realmente baixo (essencialmente 'sujando minhas mãos' fazendo assembler ou drivers de dispositivo em C). Só sinto falta da programação. Não espero que isso me ajude maciçamente em minha carreira. Se você gosta de drivers de dispositivo ou sistemas embarcados, isso pode ajudar bastante.

Quanto mais eu programo nas linguagens abstraídas, mais sinto falta do que me levou aos computadores: bisbilhotar o computador e ver o que se mexe. Assembler e C são muito adequados para cutucar :)

Ao usar os idiomas mais antigos, acho que você é forçado a fazer praticamente tudo sozinho. Em C # eu posso fazer algo parecido myArray.SortBy(x=>x.Name). De jeito nenhum eu seria capaz de fazer isso em C. Estou aceitando que o idioma fará a melhor classificação para mim. Se eu fizesse isso em C, seria capaz de voltar aos dias dos meus módulos da universidade e revisar meus diferentes algoritmos de classificação e pesquisa.

Então, acho que as linguagens de nível inferior o ajudariam a revisar qualquer parte esquecida que foi toda abstraída. Mais um desafio pessoal do que uma carreira em progresso.


15
+1 para expressar o amor de picar sobre no hardware e vendo o que contrai - um verdadeiro nerd
Gary Rowe

2
Você pode escrever a função de classificação em C #, se desejar. Você também pode usar uma função de biblioteca para classificar em C, se desejar: gnu.org/s/libc/manual/html_node/Array-Sort-Function.html. Eu diria que, usando idiomas mais antigos, você tem que fazer menos coisas sozinho. Porque a maioria dos problemas já foi resolvida. Isso não impede que as pessoas reiniciem a roda de qualquer maneira:
back2dos

15

Minha sugestão é brincar com C como uma curiosidade intelectual. Não faça um investimento de tempo pesado, porque não vale a pena.

Objetivos sugeridos:

  • Atualize sua memória sobre as estruturas de dados e algoritmos básicos.
    • É apenas uma coisa boa de saber, como álgebra e geometria.
    • Tente fazer alguns exercícios didáticos da faculdade ou programar quebra-cabeças em C.
  • Uma melhor apreciação da hierarquia de memória (largura de banda) , desde o cache da CPU até a latência da rede transoceânica. Isso ajudará suas habilidades de desenvolvimento de aplicativos em todos os níveis.
    • Mais importante ainda, é bom aprender sobre cenários em que um pequeno rearranjo discreto de código de alto nível pode resultar em uma melhoria drástica da velocidade .
      • Às vezes, o motivo só pode ser entendido na implementação de baixo nível no contexto da hierarquia de memória.
      • Não entender a causa natural dessa possibilidade leva à ignorância , ao medo e, eventualmente, à negação , pensando que é errado os desenvolvedores de alto nível aproveitarem esse tipo de otimização. Na realidade, não há nada de errado nisso.
  • Aprecie a estética dos sistemas de software baseados em componentes , o que permite que os componentes de baixo nível desenvolvidos em C / C ++ / Assembly sejam usados ​​por sistemas de alto nível.
    • A estética é exatamente igual à usabilidade do software:
      • Bom design (poderoso, fácil de usar, bem pensado)
      • Correção
      • Flexibilidade (extensões e novos comportamentos por meio da composição de peças existentes, cada uma com uma finalidade claramente definida)
      • Desempenho (sem complicar a usabilidade)
    • Embora você não possa projetar seus próprios componentes de baixo nível, seu entendimento o ajudará a avaliar e escolher bons componentes para usar em seus projetos de alto nível.
  • Por fim, entenda que os componentes de baixo nível são quase sempre mais complicados em suas implementações , longe de serem fatificáveis ​​apenas olhando a interface.
    • O nível baixo é sempre complicado. Uma boa biblioteca oculta a complexidade sem diminuir seu poder.
    • Aprenda a ler as "notas técnicas" escritas pelos desenvolvedores de componentes, que são sugestões para os usuários de componentes de nível superior sobre a melhor forma de usar os componentes.

8

se você quiser entender como a máquina funciona, e não apenas a máquina virtual da qual seu idioma de alto nível depende, o Assembly ensinará isso a você

se você não tiver motivos para se preocupar - e a maioria dos programadores atualmente não se importa - não se preocupe.

melhorará sua base, mas provavelmente não melhorará seus aplicativos da web


6
C funciona quase tão bem. A maioria dos conceitos de C é facilmente traduzível para linguagem de máquina. Aprenda C e dê uma olhada rápida no montador, e você está em boa forma.
precisa

Eu estava prestes a postar uma resposta semelhante. Eu argumentaria que C também fornece uma apreciação de como a máquina funciona, especialmente quando se trata de gerenciar memória. Além disso, muitas línguas que a complexidade abstrato máquina são escritos em C. Pelo menos, a pessoa teria uma compreensão real de quão mimado eles são :)
Tim Publicar

1
@ Jorg: interessante. e quantas dessas CPUs estão em uso comercial ativo, em comparação com, digamos, Intel x86 ou 6502s?
Steven A. Lowe

1
@ Jörg, onde você encontra essas CPUs?

1
@ Thor: velocidade não é a questão aqui, a educação é.
Steven A. Lowe

8

Toda linguagem de programação muda um pouco sobre como você pensa sobre programação em geral. Um exemplo concreto que posso dar é quando comecei a aprender haskell e, de repente, os bits funcionais de javascript, ruby ​​e python fizeram muito mais sentido. Eu nunca tinha usado foldl em nenhum código, mas depois do haskell, praticamente o vejo em todos os lugares em que vejo matrizes. Então, há grandes chances de que, se você aprender um pouco de C, fique muito mais ciente das características de desempenho relativas de várias construções em seu idioma favorito. Alguns minutos atrás, eu estava ouvindo uma palestra sobre como escrever javascript rápido e otimizado, e o palestrante disse: "Se for difícil fazer em C, será muito lento em javascript". Sua intenção é que o javascript seja uma linguagem interpretada e o intérprete seja escrito em C ou C ++.


2
+1 para a noção de como cada idioma muda a maneira como você pensa.
31512 Sean

7

Se você não fizer isso apenas por diversão, porque os nerds realmente gostam de ter controle total sobre o hardware deles, poderá pelo menos ter uma sensação melhor de quão rápido um programa pode se tornar quando escrito em C, em vez de, digamos, em Java. Você também pode aprender a realmente apreciar os recursos de idiomas de nível superior, como coleta de lixo.


1
+1 para a diversão geek. Embora eu deva dizer, eu não sou muito geek. E eu odeio hardware :)
back2dos

1
A diferença de velocidade é geralmente irrelevante. Isso é especialmente verdadeiro para aplicativos da Web, onde o processamento no servidor geralmente não é o gargalo.
David Thornley

David: Concordo totalmente com os aplicativos da Web comuns com pão e manteiga. Em outros domínios, a diferença pode ser muito relevante.
user281377

1
@ back2dos, se a ideia de programar próximo ao hardware não agrada a você, então eu diria que não se preocupe. Seria como se forçar a aprender latim apenas porque foi a base para muitas das línguas românicas posteriores.
tcrosley

2
dada memória suficiente Java é tão ou mais rápido do que C.

5

Viva a curiosidade!

É muito bom ter uma noção do que realmente está acontecendo nos níveis mais baixos de um sistema complexo, mesmo que não haja uma necessidade lógica de saber para os deveres diários. De longe, a melhor maneira de grok coisas no nível de bits é construir sua própria CPU. Você precisa pensar nos códigos de código no nível da linguagem de máquina, entender por que os conjuntos de instruções ortogonais são tão bons, complicações do manuseio de interrupções, trocas entre circuitos complexos versus microcódigo (por exemplo, em unidades de multiplicação) e muito mais divertido!

Mas isso, obviamente, requer conhecimento de eletrônica e consome muito tempo; portanto, o melhor a fazer é brincar com uma CPU de 8 bits no estilo antigo. Microcontroladores como o 8051 ainda estão em uso generalizado e estão disponíveis para entusiastas. Isso ainda requer algum conhecimento em reunir produtos eletrônicos e fazer os LEDs brilharem sem fumar, além de custar US $ se você ainda não estiver equipado para produtos eletrônicos.

A melhor coisa depois disso: brincar em um simulador de CPU (emulador? Eu confundo esses termos) - eles existem para Z80, 6502, 8086 ... todos os antigos 8-bitters. Isso pode ser o mais educativo e divertido para um programador de aplicativos que não sabe qual extremidade do ferro de soldar deve conter (embora se aprenda muito rápido :) Como o texto é gravado na memória de vídeo, como os truques do código de montagem ajudam no desempenho. .. há muitas coisas divertidas para explorar neste nível.

Não tenho tanta certeza de aprender C como apenas outro idioma, sem um entendimento inicial do funcionamento interno da CPU. Saber como os bits são enviados entre os registros da CPU e como a memória é acessada ajuda muito na obtenção de indicadores e outros conceitos da linguagem C.


+1 porque esta foi a única resposta que mencionou indicadores. Eu pensei que seria a resposta número 1 e aceito.
Erik

4

Em uma palavra, divertido. Quando eu costumava brincar com o assembler (depois de trabalhar de VB para C ++, C etc), era incrível mover dados de uma parte do processador para outra. Foi uma ótima sensação saber exatamente o que estava acontecendo dentro da CPU, sem preocupações com o que estava acontecendo por baixo do qual você não sabia. Além de uma grande sensação de liberdade - você pode fazer praticamente qualquer coisa, porque não há limitações embutidas encontradas em idiomas de nível superior.

Além disso, ser capaz de se virar para qualquer um que tenha programado em qualquer outro idioma e dizer 'bem, se você não for suficientemente hardcore ...' foi divertido infantil e infantil.


4
Na verdade, há muita coisa acontecendo dentro da CPU que você não vê no assembler. Coisas como execução fora de ordem, hyperthreading e cache de memória estão sendo feitas automaticamente pela CPU. Você sempre pode dar um passo abaixo, até alcançar as partículas fundamentais da matéria. Ou a matéria é apenas energia?
Kevin Panko

Pode-se evitar qualquer mistério oculto construindo sua própria CPU a partir de transistores e chips lógicos: D (Uma das minhas fantasias tecnológicas favoritas!) De qualquer forma, +1 para obter uma ótima resposta.
DarenW

Ponto justo! Embora a última vez que usei realmente o hyperthreading do assembler tenha sido provavelmente mais usado como referência à costura rápida, em vez de CPUs ... #
1155 Dan O

2

Existe algum bom motivo para aprender / praticar programação de baixo nível. Eu tenho várias respostas, dependendo do contexto.

Primeiro, estou ensinando programação C (mas também OCaml e Java), motivar os alunos a aprender programação do lado difícil é provavelmente a parte mais difícil da tarefa. O melhor argumento que encontrei até agora é o "entendimento": linguagens de nível superior ocultam muitos mecanismos subjacentes e, às vezes, não para sempre, elas também pressionam você a permanecer no nível superior, mesmo quando alguns truques de baixo nível podem realmente ser úteis ( para desempenho, na maioria das vezes.) Entender o que você está usando pode realmente ajudar a usá-lo melhor. Minha experiência de ensino me prova que os alunos que aprendem programação de nível inferior (e outros compiladores não orientados ao usuário) são mais adaptáveis ​​e aprendem mais rapidamente novos conceitos ou ferramentas de nível superior.

Segundo, como você afirma, o desempenho faz parte da experiência do usuário. Na maioria das vezes, o desempenho é visto como uma questão de escrever complexo e próximo ao código da máquina. Nem sempre é esse o caso, o desempenho é muito mais uma questão de algoritmos e estruturas de dados, mas também de interação entre algo e dados. Eu uso um projeto especial sobre o assunto, basicamente, é um caminho simples, mas a questão real é o tamanho dos dados: o gráfico é infinito. A única maneira de obter desempenhos de descida e ajustar-se à memória é escrever um alocador de memória dedicado (na verdade, dois, um alocador de pool e alocador de reciclagem). Isso é algo que você não pode fazer na maioria dos idiomas de nível superior. De fato, a maioria dos idiomas coletados pelo lixo apresenta problemas de desempenho e memória.

Provavelmente há muito mais argumentos, como a estabilidade (no sentido de história e longevidade) de linguagens de nível inferior contra linguagens de "hype" (o fato de que uma linguagem considerada como referência futura para programação possa desaparecer em alguns anos é muito longa. história, não se pode prever a longevidade de um material novo, mas esse argumento permanece verdadeiro para idiomas mais antigos ...), é claro que também há uma questão de gosto ou o fato de que o que pode ser feito na maioria dos idiomas de alto nível também pode ser feito em linguagens de nível inferior, mas não o contrário (mas considerando isso, todos devemos codificar somente em assembly ...)

Sou eu mesmo armadilha no mundo (de maneira bem diferente), passo vários anos trabalhando no conceito teórico de programação, no design e na prova de sistemas de sistemas e, assim, só uso e estudo linguagens de alto nível (principalmente funcional, mas também pura). orientado a objetos.) Recentemente, voltei para o outro lado (principalmente programação de sistemas e kernel) e me senti bastante à vontade nessa área. Estou me divertindo muito! Para mim, o próximo passo é encontrar o ponto comum: recursos de linguagem de nível superior para programação de nível inferior! Até agora, não há linguagem para isso (talvez o Google vá para a programação do sistema da terra do usuário) e estou considerando a ideia de criar minha própria linguagem, mas essa é outra história.


1

Eu diria que não há muitas razões no seu domínio, no entanto, se você fizer computação de alto desempenho (por exemplo, jogos, ciências etc.), isso seria justificado.


1
Não tenho tanta certeza de que ainda existem muitas áreas de alto desempenho. O jogo certamente não requer idiomas de baixo nível. Para jogos, você costuma usar mecanismos ou pelo menos começa com o OpenGL ou algo assim. E, para a ciência, a paralelização é muito importante e a correção. Suponho que você estaria melhor com OCaml ou algo assim. As áreas críticas de desempenho não são mais aquelas que processam muitos números, mas são usadas com muita frequência, como kernels, drivers, mecanismos de armazenamento e outros. Acho que menos de 1% de todos os desenvolvedores realmente tocam neles.
back2dos

4
@ back2dos, os mecanismos de jogo não aparecem do nada - alguém precisa escrevê-los. E no que você acha que o OpenGL está escrito? Não c#. Atualmente, não é necessário usar linguagens de baixo nível para a maioria dos aplicativos ... mas muitas pessoas trabalham em outras áreas que o exigem.
GrandmasterB

1

Hoje em dia, acho que a programação de baixo e alto nível pode ser bastante separada. Basicamente, isso significa que você poderia viver toda a sua vida profissional sem conhecer C e assembler sem problemas. Dito isto, a linguagem de programação C não pode lhe ensinar muito do ponto de vista de programação e design.

Por curiosidade, você pode aprender como as coisas funcionam em um nível mais baixo. Quando eu estava na Universidade, por exemplo, gostei de usar o gcc para gerar código assembler a partir do C ++. Foi útil compreender como o polimorfismo e a exceção são implementados. Mas além disso, as únicas coisas que você pode aprender com o C atualmente são:

1) truques de memória sujos. C é a melhor maneira de entender que não há fundo na loucura dos programadores :)

2) GOTOs são realmente usados ​​(e úteis) para erros de reversão

3) aprenda melhor como a alocação de memória funciona (diferença entre heap e empilhar alguém?).

Então, basicamente, minha tese é: se você já terminou a Universidade e ainda não precisa de C, então não aprende :)


2
Conhecer C para saber como as coisas funcionam em um nível baixo pode ajudar a entender por que as coisas estão dando errado quando você tem uma abstração com vazamento.
Michael Shaw

1

Você não precisa entender idiomas de baixo nível, mas deve entender o que está acontecendo sob as capas do idioma de alto nível escolhido. Usar uma linguagem de baixo nível ensinará isso a você, mas não é o único caminho.

Aqui estão alguns exemplos de conceitos de baixo nível que podem impactar linguagens de alto nível.

Ponteiros:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Cordas:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

Listas:

Quando você usa uma lista versus uma lista vinculada? (Quase impossível saber isso sem entender em um nível bastante baixo de como uma lista funciona)

-

É necessário conhecer todas essas coisas? Não, mas isso pode ter um impacto e, se você deseja dominar uma linguagem de alto nível, precisa ter uma boa idéia do funcionamento interno.


1

O que a programação de baixo nível poderia me ensinar, que outras línguas não me ensinariam?

Mais notavelmente, ele ensinará como os computadores realmente funcionam. Não há outra maneira de aprender isso a não ser através da programação de baixo nível. Independentemente do tipo de aplicativo que você programa, isso sempre ajudará. Você realmente entenderá o que está acontecendo no fundo de todas essas coisas da web. E se você estiver trabalhando com o Windows, toda a API será escrita em C, portanto, sabendo que o idioma permitirá que você se comunique diretamente com o sistema operacional, sempre que precisar usar um recurso que não possui os idiomas atuais e suas bibliotecas.

É claro que a programação de baixo nível permitirá que você trabalhe com coisas totalmente diferentes, como programação incorporada e programação em tempo real, onde o asm / C / C ++ é obrigatório. Se você não tem interesse nesse tipo de aplicativo, não há muita necessidade de aprender asm / C / C ++.

Além disso, você aprenderá bits e bytes. Manipulações de bits, hexadecimal, etc. Essas coisas você pode encontrar de vez em quando, mesmo ao fazer programação na Web / área de trabalho. Algoritmos de criptografia é um exemplo em que é usado.

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.