Assembly como uma primeira linguagem de programação? [fechadas]

12

Como você acha que seria bom ensinar às pessoas a montagem (alguma variante) como a primeira linguagem de programação? Seria necessário muito mais esforço do que aprender, por exemplo, Java ou Python, mas teríamos um bom entendimento da máquina mais ou menos desde o "primeiro dia de programação" (em comparação com muitas linguagens de nível superior, pelo menos). O que você acha? É uma ideia realista, pelo menos para aqueles que estão prontos para fazer um esforço extra? Vantagens e desvantagens?

Nota: eu não sou professor, apenas curioso

Anto
fonte
5
Eu acho que é mais adequado para pessoas estudando ciência da computação e não engenharia de software / desenvolvimento
Imran Omar Bukhsh
1
@Imran Eu concordo em princípio, mas todos os programas de nível universitário em que posso pensar têm diplomas em Ciência da Computação, que são obtidos por pessoas que passam a trabalhar principalmente em Engenharia de Software. (Estou assumindo esta pergunta é sobre uma base séria para uma carreira de programação, e não, por exemplo, um curso de pesquisa-ensino médio)
G__
7
@Imran - achei isso um pouco surpreendente. A ciência da computação certamente está mais inclinada à matemática e à teoria? Mais interessado em conjuntos, álgebras abstratas e notação assintótica do que em brincar e escrever repetições sem fim de mover-blá-a-blá.
91311 Steve314
2
A Ciência da Computação certamente tem assuntos abstratos, mas também é muito "próxima ao hardware" em alguns aspectos. Uma vez participei do LICS, uma conferência de Ciência da Computação. Lembro-me de que havia documentos sobre a localização dos dados de vários algoritmos de classificação que, imagino, fornecem fundamentos teóricos ao estudo da eficiência prática de algoritmos. Em relação à montagem, eu pessoalmente acho que tem alguma semelhança com alguns modelos de computação teóricas (máquinas de Turing, máquinas de balcão ...)
Joh
1
Todo programador deve pelo menos ler sobre como funciona a montagem, IMO. Isso me deu muitas informações e eu sou o mais próximo do cromo que você pode obter. A linguagem de montagem passo a passo de Jeff Duntemann é uma leitura divertida para iniciantes.
Erik Reppen

Respostas:

14

Seria difícil inspirar um novo programador com código de montagem. Um olá dinâmico, o site do usuário é muito mais bacana com menos esforço. Não estou dizendo que as lições fundamentais são as mesmas, mas um curso introdutório terá um grande conteúdo inspirador, caso contrário não haverá um segundo curso.

Lembro que meus primeiros cursos de programação foram ministrados em Scheme e fiquei frustrado por não conseguir compilar com facilidade um .exe e "executar" meu programa (pensei que o MS Visual Basic fosse o final de toda a programação). Não foi até anos depois que eu realmente entendi que ferramenta poderosa eu estava tocando. Acho que eu teria apreciado mais e retirado essas lições melhor se tivesse tido alguma experiência inicial em algo um pouco mais pragmático no começo.

G__
fonte
20
Eu já vi muitos estudantes que ficaram muito mais impressionados fazendo um LED piscar e um movimento do motor.
Whatsisname
1
O @Whatsisname +1, seria uma demonstração impressionante e agradável, desde que seja possível sem ser pego na eletrônica. Obviamente, isso também poderia ser feito com uma linguagem de nível superior, ou seja, com hackers Roomba, se o "motorista" fosse uma caixa preta fornecida pelo instrutor.
G__ 9/02
1
Muitos novos programadores foram inspirados pela montagem nas máquinas VIC20, C = 64 e similares.
Gaius
2
@ Gaio Não de início! Você liga essas máquinas e está em um intérprete básico. Assembleia vem em após uma boa quantidade de experiência e bater os limites do que básico pode fazer ...
G__
1
@whatsisname mas você pode usar algo como um Arduino para LEDs intermitentes e motores movimento sem ter que aprender assembly
Ken Liu
12

Eu acho que é uma péssima idéia para os estudantes de Engenharia de Software e CS, e geralmente para qualquer pessoa mais interessada em programação do que em eletrônica.

Isso pode ser feito, mas não significa que deva ser feito. No passado, a maneira de fazer coisas realmente legais com os computadores domésticos era aprender primeiro a montagem. Isso ocorreu devido às limitações iniciais de hardware - linguagens de nível superior simplesmente não eram poderosas e rápidas o suficiente. Atualmente, você pode fazer coisas muito mais legais, em menos tempo, com um idioma de nível superior.

O que parece mais interessante, escrever um protótipo rápido para um jogo simples e brincar com variações de um algoritmo, ou lutar com registros e coisas de baixo nível?

Andres F.
fonte
3
Como pianista, eu certamente teria achado mais interessante pular algumas músicas, mas para se tornar decente, você precisa praticar arpejos, escalas, etc. E depois fazer coisas realmente inovadoras (tocar com "pianos preparados" e você precisa saber como o piano funciona de dentro para fora. É tudo o que você quer saber sobre o seu ofício.
John
10
@ John na CashCommons: Má analogia. Começar com o assembler é como iniciar os martelos, o teclado, os pesos e os amortecedores. E, em seguida, passamos à teoria da música (círculo dos quintos) para explicar o negócio de teclas pretas e teclas brancas. Depois, passe para mais teoria musical antes de tocar uma escala.
S.Lott 9/02
3
@ S.Lott: Ehhhhh ... não compre isso. Eu posso escrever um programa do tipo "olá mundo" em montagem sem me preocupar com transistores. Não é preciso ser um designer de chips para ser um programador. O conhecimento do qual você está falando seria a base para construir ou reparar um piano, o que está relacionado apenas à execução de um piano.
John
3
@ John na CashCommons: "construindo ou reparando um piano". Essa é a analogia com o assembler. Um "olá mundo" trivial no assembler pode ser escrito, mas são apenas chamadas à API do SO - na verdade, ignorando todos os detalhes terríveis do assembler. Para escrever drivers de E / S, o assembler é essencial. Da mesma forma que os martelos e amortecedores são sobre construção e manutenção, não estão funcionando.
S.Lott 9/02
1
@ S.Lott: Hmmmm ... acho que o conjunto de instruções em particular depende do chip, não é? Bom ponto.
John
7

Não acho que seja uma péssima ideia, mas quão complexo é o programa que você vai dar a esses alunos? A montagem exige muito mais trabalho. Pode ser bom começar com coisas muito básicas e depois movê-las para algo mais fácil de trabalhar, uma vez que tenham apreciado o trabalho no nível mais baixo. Os alunos iniciantes às vezes têm idéias na cabeça que codificam o próximo Halo, MS Office ou AutoCAD ou algo assim, e quando vêem quanto trabalho entra em uma linguagem assembly simples , podem ficar assustados, então deixe claro que há coisas melhores do que montagem e, em seguida, mova-as para uma vez que tenham visto os conceitos. Você também pode tentar ensinar a montagem simultaneamente com outra coisa como C.

Além disso, qual linguagem assembly? Lembro-me de alguma forma que o MIPS era relativamente fácil de trabalhar, e acho que ele roda em um emulador, portanto não há perigo de causar problemas à máquina real , embora possa haver ferramentas melhores do que agora.

Isso pode funcionar bem, se for feito da maneira certa. Seja cuidadoso...

FrustratedWithFormsDesigner
fonte
+1 para a complexidade da coisa do problema. Meu voto seria contrastar algumas implementações de assembler contra implementações de linguagem de nível superior. E talvez use, por exemplo, o assembler 68000 em um emulador em vez do x86 - não sei como o assembler x86 / amd64 evoluiu, mas o 68000 era muito mais limpo e fácil de trabalhar do que o 8086 na época. Talvez também valha a pena considerar - um montador de máquina virtual como você pode obter com o LLVM. Não é o mesmo que montador real, mas compartilha muitos princípios semelhantes e provavelmente é mais relevante.
91111 Steve314
Ensinar ASM simultaneamente com C soa como uma boa idéia bastante
Anto
@ Steve314: Eu não sou-se em assembler x86, mas parece que é chegado mais complicado do que 8086.
David Thornley
@ David - Espero que sim, mas pode muito bem ter ficado mais simples em alguns aspectos. Nos 8086 dias, o intervalo de modos de endereço disponíveis dependia de qual registro específico você estava usando, bem como das instruções. No 68000, havia (para a maioria dos propósitos) registradores de dados e endereços, com cada tipo sendo usado de maneira bastante uniforme, sem aborrecimentos como esse é um índice ou uma base de ponteiro. Com o tempo, talvez isso tenha mudado? O 68000 também tinha mais registros, economizando na entrada e saída de memória. De qualquer forma, você não precisa aprender coisas sobre o SIMD para obter os princípios básicos do montador.
Steve314
@ David - Eu não posso acreditar que eu esqueci (reprimido) endereçamento segmentado. Isso já era ruim o suficiente em um idioma de alto nível. Agora há um endereçamento segmentado novamente, mas é uma coisa diferente, relacionada à memória virtual etc., com a qual os programadores no nível de aplicativos não precisam se preocupar.
Steve314
7

Assembléia foi a primeira língua que aprendemos na escola de eletrônica (em 1900) e parecia uma escolha natural. Percorremos nossos cursos, desde componentes discretos até lógica resistor-transistor, portas lógicas, circuitos integrados, processadores e programação em montagem. Muitos dos alunos nessas aulas nunca haviam programado em nenhum idioma antes e eles o pegaram.

Portanto, a montagem pode ser uma boa escolha para o primeiro idioma, se a base certa for estabelecida para o aluno. Para quem tem como objetivo ser um desenvolvedor de aplicativos ou Web, acho que a montagem é provavelmente um ponto de partida de nível muito baixo.

Bill the Lizard
fonte
7

Uma coisa é certa: se as pessoas, aprendendo primeiro a montagem, conseguirem, serão incríveis programadores.

Isso me lembra quando aprendi a dirigir. Minha mãe insistiu

Aprenda em um carro automático até ganhar confiança e, em seguida, você pode dirigir nossos carros manuais.

O raciocínio é que ela não queria que eu me distraísse com mais do que eu precisava, ao mesmo tempo.

Aplique isso a aprender a programar, é necessário jogar tudo no aluno de uma só vez? Eles aprendem o que é uma variável e ao mesmo tempo aprendem quantos dados podem armazenar em que tipo de registro?

Mais da metade da minha turma falhou em nossa turma de montagem, e este era um grupo de pessoas que, na época, se consideravam conhecedor de programação há mais de 2 anos.

Minha preferência pessoal, se eu tivesse que aprender tudo de novo, seria começar com uma linguagem que faça o máximo possível para mim. Então, como eu aprendo, volte para os idiomas de nível inferior.

CrazyPenguin
fonte
1
Eu acho que esse é um conselho bom e correto. Em algum momento, é importante estar ciente dos bits e bytes e o que o processador faz com eles, mas começar com eles é um esforço imensamente inútil, porque temos linguagens como ruby ​​e python que são perfeitas para iniciantes e incentivam excelentes princípios de engenharia de software.
Davidk01
1
Você já considerou a possibilidade de o instrutor ter feito um trabalho menos do que estelar no ensino da aula de linguagem assembly?
John R. Strohm
Eu acho que ele fez um trabalho incrível.
22711 CrazyPenguin
3

É uma ideia realista, pelo menos para aqueles que estão prontos para fazer um esforço extra?

Não

mas alguém teria um bom entendimento da máquina

Por que isso é vantajoso? Você pode fornecer um exemplo ou uma dica de como isso pode ter algum valor?

Vantagens e desvantagens?

Vantagens: Nenhuma.

Desvantagens:

  • Um monte de curiosidades aleatórias sobre sinalizadores, estados e registros, e esquemas complexos de endereçamento de memória e dispositivos de E / S e DMA, além de interrupções e ciclos de clock e outras coisas. Nada disso ajuda a entender linguagens e computação modernas baseadas em VM.

  • Uma desconexão da solução real de problemas na qual os computadores são realmente aplicados.

  • Um divórcio dos usuários finais e os dados práticos e os problemas de processamento que eles precisam resolver.

  • Uma série desnecessária de explicações sobre máquina e máquina virtual, compilador e intérprete e toda a pilha de tartarugas segurando o mundo.

  • Muitos detalhes "esta é a implementação física de um 'objeto'" na linguagem de nível superior à qual eles finalmente chegam.

  • Muitos detalhes "é assim que as funções do método são despachadas" na linguagem de nível superior a que elas finalmente chegam.

  • Muitas explicações "isso não se aplica ao 80386, mas ao chipset 80586".

  • Muitas chamadas de API de sistema operacional de baixo nível para fazer um programa ASM fazer qualquer coisa que pareça semelhante a ser útil por alguém.

O objetivo de uma primeira linguagem de programação não é dominar o chipset.

O objetivo de uma primeira linguagem de programação é

  1. Entenda como pensar sobre computação.

  2. Entenda como fazer um processamento de dados útil.

  3. Entenda como fazer algo. Projeto - código - teste.

S.Lott
fonte
1
@ S.Lott - Claro, esse não é o ponto da minha pergunta original, mas pode ser vantajoso tê-las antes de ir para os idiomas de nível superior. Não me interpretem mal, você faz um argumento válido.
Anto
3
-1 Muitas das suas desvantagens considero vantagens. É melhor saber como o nível baixo funciona, antes de usá-lo de cima. Fundações são importantes.
Orbling
1
O Assembler como uma linguagem de programação expõe você muito melhor à estrutura de dados, lógica e fundações de mais baixo nível do que as linguagens de nível superior. Ambos têm um lugar, o assembler pode ser mais simples de entender do que as linguagens de nível superior, desde que você não tente alcançar algo muito complicado. As pessoas não deveriam estar tentando fazer coisas complexas a princípio.
Orbling
4
A vantagem do assembler é que ele demonstra como um computador real funciona. Você sabe. A coisa em que tudo realmente funciona .
Paul Nathan
1
@ S.Lott - Não, mas isso significa que você pode muito bem usar a maior parte do conhecimento antigo que coletou e adicionar novos conhecimentos ao longo do tempo. Veja, linguagens de alto nível, como o Python, vêm com novas versões ao longo do tempo, mas o conhecimento antigo ainda é utilizável (e, na verdade, o Python quebrou a compatibilidade com a versão anterior)
Anto
3

Se eu tivesse a tarefa de elaborar um currículo, eu teria dois cursos em execução ao mesmo tempo no primeiro semestre: asm + organização / arquitetura básica de computadores e um curso baseado em SICP, fundado em Scheme. O segundo semestre seria orientado em torno de estruturas de dados e algoritmos elementares no esquema.

O segundo ano seria um projeto de um ano, usando Delphi, C ++ ou C #, focado no design moderno de software (design OO, design funcional, engenharia de software, controle de versão, etc.).

O efeito deve ser o de fornecer uma base intensa tanto no abstrato quanto no prático, levando a cursos aprofundados no terceiro e quarto anos.

Paul Nathan
fonte
3

Eu costumava fazer aulas de introdução à ciência da computação, e acho uma péssima ideia.

  1. O Assembly usa tanto a lógica (se for essa) como traduções muito difíceis entre conceitos e números. Os estudantes de Introdução ao CS geralmente lutam apenas com a lógica (loops, se / senão, expressões booleanas) e realmente precisam lidar com isso antes de se preocuparem com quais números significam quais expressões lógicas. O uso de linguagens de nível superior abstrai essa lógica para estudantes que não tiveram nenhum motivo para pensar dessa maneira antes.
  2. As aulas Intro de CS não estão necessariamente sendo realizadas apenas pelos alunos de CS que continuarão com o CS. Muitas vezes, eles também são aceitos por outros graduados em engenharia e não graduados que estão apenas "percorrendo" um assunto interessante para uma eletiva. A montagem é excelente para a fundação de alunos comprometidos e comprometidos com o ensino médio, mas não oferece uma visão geral muito boa do que é a programação para estudantes que consideram o curso principal ou que nunca vão cursar o curso, mas querem uma introdução ao campo. ; nem é terrivelmente útil por si só na maioria dos campos.
  3. Linguagens de nível superior tornam o núcleo da programação real mais transparente. A montagem aborda alguns tópicos fundamentais - conceitos básicos de memória, conceitos básicos de desempenho etc. -, mas realmente não cria um design legível e sustentável, o que é mais importante atualmente, IMO. Os alunos mais antigos parecem ter frequentemente as idéias antiquadas de "Programadores reais escrevem código que ninguém mais pode lidar" e ensinar uma linguagem de nível superior ajuda a ensinar que a codificação é uma tarefa colaborativa e não apenas brilhante.

Dito isto, acho que o hardware de montagem / computador deve ser uma classe muito precoce - idealmente, o primeiro trimestre da maior. Peça aos alunos que obtenham um idioma de alto nível em seus cintos e, em seguida, entrem imediatamente em itens de hardware de baixo nível antes de seguir para estruturas de dados - idealmente em um idioma que exija gerenciamento de memória.

Ethel Evans
fonte
Muito bem dito - eu concordo. O primeiro curso precisa ir direto ao ponto, mostrar a utilidade de ponta a ponta das habilidades aprendidas e despertar a imaginação: "Puxa! Posso programar? Agora, o que mais posso fazer com essa nova habilidade ..." Concorde também que o melhor momento para a linguagem assembly é após uma linguagem de nível superior. Isso motiva a olhar "por baixo do capô" sobre como o computador está realmente entendendo as coisas de nível superior. Vendo linguagem assembly, pela primeira vez depois de mais alto nível de folhas de linguagem Outro impacto poderoso: o aluno encontros eletrônicos, chips, sensores, etc.
Assad Ebrahim
3

Assembly era minha segunda língua, logo após o BASIC. No entanto, quando eu estava aprendendo, era um momento diferente. Meu Commodore 64 tinha outros idiomas disponíveis, mas se você queria que algo parecesse rápido, ou queria fazer mais de uma coisa por vez, precisava aprender a linguagem assembly e como trabalhar com interrupções. O sistema operacional de ambiente gráfico (GEOS), que deu ao Commodore um sistema de janelas, também foi montado. Foi em geral a melhor API de montagem que eu já vi. Também foi a única plataforma que usei onde você pode estilizar seu código. É isso mesmo, você pode usar itálico e tamanhos de fonte diferentes - algo que se mostrou útil para a leitura dos comentários.

Eu aprendi muito sobre como o Commodore funcionava, mas o chip Motorolla tinha um conjunto de códigos de operação muito simples. Não é muito difícil manter menos de 255 códigos de operação separados. I foi não capaz de apostar minha experiência na 6510 chip de Motorolla a programação para o Intel 8086. Os chips e arquiteturas de sistemas eram muito diferentes. Eu imagino que eu teria tido o mesmo problema ao passar para o chip Motorolla 68000 da Amiga também.

Em resumo, eu tenho que discordar totalmente de quem diz que a Assembléia deve ser uma boa primeira língua. Aqui está o porquê:

  • Você não tem estrutura inerente, nenhuma maneira comum de quebrar a funcionalidade em um aplicativo. É exatamente isso que torna as linguagens de nível superior tão úteis.
  • Você precisa conhecer coisas inúteis, como chamar um método corretamente em uma biblioteca. Quando a biblioteca foi criada por C, isso significa manipular a pilha (é melhor obter tudo na ordem certa), mas em outro idioma, isso pode significar configurar registros. Tudo isso é tratado por um compilador ou intérprete - e você não pode otimizá-los.
  • Seu código não pode ser usado em outro chip e, muito provavelmente, ocorrerá com uma plataforma de hardware diferente.

Atualmente, a linguagem assembly é usada para acelerar certas ações finitas, em que o assembly artesanal seria mais rápido que o assembly gerado pelo compilador. A estrutura principal do aplicativo é feita em uma linguagem de nível superior, como C, C ++, etc. É claro que a programação de montagem se tornaria muito importante se você começar a escrever compiladores. Quantos de nós fazem isso?

Berin Loritsch
fonte
1

Fiz assembléia no último ano do ensino médio. Eu já havia participado de aulas em Java, Pascal, C e C ++, e não era proficiente em nenhuma delas e realmente era péssima na Assembléia - era a única pessoa que participava da aula em um programa de ensino à distância na faculdade comunitária, me levou um um mês ou dois antes que alguém pudesse colocar o compilador trabalhando para mim.

Não acho que seja necessário ou sábio aprender a linguagem assembly primeiro, mas é inteligente aprender o que eles ensinam nas primeiras semanas de montagem, sobre como o processador funciona e alguns truques de depuração. Achei essas coisas muito interessantes e esclarecedoras como neófito.

Peter Turner
fonte
0

Não vejo por que isso não pôde ser feito, embora a idéia de que seja boa dependa totalmente da multidão que você a ensinaria. Alguém cujo objetivo final é ser um desenvolvedor web provavelmente ficaria entediado e poderia desistir, pois isso não lhes daria a satisfação imediata de criar algo que Python, Ruby etc. Se eles quiserem trabalhar em hardware ou em outros projetos de baixo nível, acho que seria um bom começo (desde que você forneça o suficiente da arquitetura de um computador para que faça sentido). Eu acho que isso poderia ajudar as pessoas a escrever um código melhor no futuro, embora eu ache que seria mais difícil do que aprender outros idiomas para começar.

Jetti
fonte
0

Eu acho que a linguagem assembly só fará sentido se você se concentrar em coisas como:

  • Técnicas de gerenciamento de memória
  • HW IO (especialmente desafios relacionados a tempo e desempenho)
  • Recursos da CPU - em particular, recursos de segurança

Sem um foco nessa área, é apenas uma linguagem simplista que tenderá a ensinar maus hábitos de organização. É bom ter a codificação no nível da máquina no kit de ferramentas para saber como as coisas funcionam, mas não é um bom primeiro idioma.

Gostaria de ter alguém interessado em um idioma de nível superior. Então ensine C ++; em seguida, montagem com foco em como os compiladores C ++ geram código de montagem. O entendimento de tabelas em V e outros recursos de linguagem de nível superior ajudará o desenvolvedor a pensar sobre como as linguagens realmente funcionam do que apenas arquivar as informações em 'magia'.

Jim Rush
fonte