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.
Respostas:
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/
fonte
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.
fonte
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:
fonte
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
fonte
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 ++.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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 :)
fonte
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:
Cordas:
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.
fonte
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.
fonte