Ainda vale a pena estudar assembly?

[quote=assembler][quote=assembler][quote=entanglement]Estou aqui no meu departamento e meu chefe é formado engenheiro químico, eu sou engenheiro eletrônico, assim como o indiano que também está trabalhando aqui, e o outro carinha aqui do meu lado tem doutorado não lembro exatamente em quê - sei lá se engenheiro civil é “menos suficiente” que engenheiro da computação. Aliás, não tem muitos engenheiros de computação aqui.
O que é ‘mais suficiente’ é você procurar o seu caminho e estudar numa escola de nome - até para conseguir bons contatos (mais conhecidos como “Q.I.” - “quem indica”).
E para estudar numa escola de nome, se você não nasceu filhinho de papai, vai ter de ralar bastante. Não é fácil não. [/quote]

Nunca ouvi falar quais são essas escolas de nome? Entanglement, se você puder, me diga quais são essas escolas de nome?[/quote]

Eu não tenho nenhum contato!

Galera, Entanglemente, nunca ouvi falar quais são essas escolas de nome? Se puderem, me digam quais são essas escolas de nome?[/quote]

Galera, nunca ouvi falar quais são essas escolas de nome. Se puderem, me digam quais são essas escolas de nome!

[quote=assembler]É verdade que hoje em dia dificilmente o Assembly é usado fora do ambiente de faculdade, pois geralmente mesmo máquina são programadas usando linguagem C, que em ambiente de trabalho é 99% de chance que você nunca mais verá Assembly?

É verdade que hoje em dia, são pouquíssimos os casos onde não se usa C no lugar de assembly, mesmo no desenvolvimento de hardware? [/quote]

Olha só, assembly é usado por engenheiros de hardware, não por analistas de sistemas. Assembly é muito usado, mas hoje em dia é um padrão fabricantes de micros disponibilizarem um compilador de uma linguagem qualquer(que seja c ou pascal ou basic).

Dá uma olhada nos produtos da microship,

http://www.microchip.com/

Só para deixar claro:

  1. É possível controlar o código de baixo nível em C, embora geralmente não valha a pena (exceto para funções específicas);
  2. Geralmente, um programa feito com cuidado em C será mais legível, mais fácil de manter e mais otimizado do que um equivalente feito em assembly (compiladores nunca perdem oportunidades de otimizar o código, programadores sim);
  3. É uma falácia achar que programar em assembly diretamente gerará código mais otimizado do que fazer em C (também é uma falácia inferir o contrário);
  4. Até mesmo dispositivos muito pequenos, como PICs e DSPs, já estão vindo com compiladores C de boa qualidade.
  5. Estudar assembly ainda é importante caso você consiga um cargo de engenheiro eletrônico, mecatrônico ou da computação, em empresas que produzem hardware. Como essas empresas geralmente são de engenharia, seria muitíssimo bom que você cursasse a faculdade. Até porque, ela vai te ensinar muitos conceitos importantes para um programador assembly completo (organização de hardware, tipos de hardware, álgebra booleana, etc).

Se quiser um exemplo de programação que mistura muito C e assembly, dê uma lida no Black Book do Michael Abrash.

Ele ensina a fazer um Doom, escrevendo o motor gráfico “no braço” (sem OpenGL ou DirectX) e acelerado com assembly:

Alguns ganhos de performance que ele alega no livro que o assembly terá não são mais tão significativos. Os compiladores evoluíram muito desde então.

[quote=ViniGodoy]Só para deixar claro:

  1. É possível controlar o código de baixo nível em C, embora geralmente não valha a pena (exceto para funções específicas);
  2. Geralmente, um programa feito com cuidado em C será mais legível, mais fácil de manter e mais otimizado do que um equivalente feito em assembly (compiladores nunca perdem oportunidades de otimizar o código, programadores sim);
  3. É uma falácia achar que programar em assembly diretamente gerará código mais otimizado do que fazer em C (também é uma falácia inferir o contrário);
  4. Até mesmo dispositivos muito pequenos, como PICs e DSPs, já estão vindo com compiladores C de boa qualidade.
  5. Estudar assembly ainda é importante caso você consiga um cargo de engenheiro eletrônico, mecatrônico ou da computação, em empresas que produzem hardware. Como essas empresas geralmente são de engenharia, seria muitíssimo bom que você cursasse a faculdade. Até porque, ela vai te ensinar muitos conceitos importantes para um programador assembly completo (organização de hardware, tipos de hardware, álgebra booleana, etc).

Se quiser um exemplo de programação que mistura muito C e assembly, dê uma lida no Black Book do Michael Abrash.

Ele ensina a fazer um Doom, escrevendo o motor gráfico “no braço” (sem OpenGL ou DirectX) e acelerado com assembly:

Alguns ganhos de performance que ele alega no livro que o assembly terá não são mais tão significativos. Os compiladores evoluíram muito desde então.[/quote]

A questão é a qualidade do compilador. Existem compiladores ruins no mercado. Por exemplo tínhamos um problema com tamanho de um software, onde o dispositivo dispunha de pouca memória de programa e o compilador teimava em gerar o resultado maior. Tivemos que usar assembly. Mas eu concordo com você, fora alguns problemas específicos é muito mais vantajoso ter uma ferramenta como um compilador que usar um montador assembly.

Você tem que aprender um pouco de arquitetura de computadores junto com assembly. Sugiro que procure um livro sobre microprocessadores, baixe o manual de algum microprocessador (ou microcontrolador) e aí você pode estudar assembly. Para aprender assembly é preciso entender bem de hardware.

[quote=entanglement]Estou aqui no meu departamento e meu chefe é formado engenheiro químico, eu sou engenheiro eletrônico, assim como o indiano que também está trabalhando aqui, e o outro carinha aqui do meu lado tem doutorado não lembro exatamente em quê - sei lá se engenheiro civil é “menos suficiente” que engenheiro da computação. Aliás, não tem muitos engenheiros de computação aqui.
O que é ‘mais suficiente’ é você procurar o seu caminho e estudar numa escola de nome - até para conseguir bons contatos (mais conhecidos como “Q.I.” - “quem indica”).
E para estudar numa escola de nome, se você não nasceu filhinho de papai, vai ter de ralar bastante. Não é fácil não. [/quote]

Entanglement, nunca ouvi falar quais são essas escolas de nome? Por favor, se puder, me diga quais são essas escolas de nome, se não puder falar quais são todas elas, me fale o que puder.
Por favor, se não puder me dizer ou não me dizer não sei por quais motivos, me diga que não vai responder.

http://info.abril.com.br/professional/os-melhores-na-graduacao.html

o link acima é uma boa referência para faculdades de computação …

Mas de maneira geral, os cursos das públicas são os melhores, mas tem particulares muito boas como a PUC. O que você deve evitar são as UniEsquinas da vida, que aceitam qualquer um. Nessas faculdades geralmente o nível dos alunos é mais baixo, e como consequencia, o nivel do curso de maneira geral cai junto.

[quote=juliocbq][quote=rmendes08]

Cara, isso é aí é bobagem. Assembly É a linguagem de máquina, tanto que cada arquitetura de processador tem sua própria linguagem Assembly. Uma instrução Assembly nada mais é do que um código seguido por 1 ou 2 parâmetros. Esse código é numérico, sendo assim, ele pode ser representado em qualquer base numérica, a mais comum é a hexadecimal. Porém, pode-se representar esse código também através de mnemônicos, para facilitar a leitura das instruções. Mas o fato de representar uma instrução através de um mnemônico está longe de definir uma linguagem nova.[/quote]

Pessoal, seguinte:
Assembly não é linguagem de máquina. Assembly são mnemônicos que facilitam o entendimento dos conjuntos de instruções de uma plataforma(microcontrolador ou microprocessador), além de não ser linguagem de programação, mas de montagem.
Esses mnemônicos representam uma instrução. O código de máquina não tem segredo, é 0 ou 1. Portanto se alguém quiser escrever um programa nessa linguagem pode conseguir um teclado de 3 teclas, 0, 1 e enter criar um arquivo .com no win 98 e digitar instruções lá.

A parte sobre a linguagem c fazer praticamente tudo o que o assembly faz é real. Você pode otimizar partes do programa inserindo os mnemônicos inline. Mas é inviável usar c em um programa para um micro de 1kb de memória. O programa tem que ser muito enxuto então se opta pelo assembly. Mas a grande maioria das plataformas hoje usam c, pascal ou basic.

Sobre a parte rentável da coisa pode acreditar que ela existe e é muito boa. Mas você precisa trabalhar com engenharia elétrica.

No campo das aplicações você não usa linguagem de baixo nível, a não ser que você recaia em um problema de otimização que foi o meu a muito tempo atraz. Estávamos desenvolvendo um sistema de cftv e descobrimos que memcopy do windows 98 na época era muito lento para copiar a imagem da placa de captura para o programa. Para podermos montar um quadro do vídeo no tempo certo precisamos reescrever essa função e o fizemos em assembly. E resolveu.

reforçando o artigo aqui da wiki
http://pt.wikipedia.org/wiki/Assembly[/quote]

juliocbq, estou interesado só na sua resposta ao que pergunto agora. Você disse no GUJ no assunto Assembly Language - Programar em liguagem baixo nível [ajuda!] em 11/10/2009 respondendo ao luca moderador dizendo assim: vou discordar quanto ao conhecimento inútil. Muitos microcontroladores ainda são programados em assembly, e, para otimização, usar assembly inline em pascal ou c também.

Você diz agora que a parte sobre a linguagem c fazer praticamente tudo o que o assembly faz é real, que Assembly é muito usado. Se é verdade que a linguagem c é mais fácil que o Assembly, para que usar Assembly se é verdade que a linguagem c faz praticamente tudo o que o assembly faz?

[quote=rmendes08]http://info.abril.com.br/professional/os-melhores-na-graduacao.html

o link acima é uma boa referência para faculdades de computação …

Mas de maneira geral, os cursos das públicas são os melhores, mas tem particulares muito boas como a PUC. O que você deve evitar são as UniEsquinas da vida, que aceitam qualquer um. Nessas faculdades geralmente o nível dos alunos é mais baixo, e como consequencia, o nivel do curso de maneira geral cai junto.[/quote]

rmendes08, obrigado pela resposta.

Entanglement, estou interessado só na sua resposta ao que pergunto outra vez agora.Entanglement, nunca ouvi falar quais são essas escolas de nome. Por favor, se puder, me diga quais são essas escolas de nome, se não puder falar quais são todas elas, me fale o que puder.
Por favor, se não puder me dizer ou não me dizer não sei por quais motivos, me diga que não vai responder.

É verdade que o C substituiu muita coisa do assembly? Se o C ou não sei o quê substituir todo o assembly assim como o assembly substituiu a linguagem de máquina, não será necessário o assembly.[/quote]
Quando foi que assembly substituiu a linguagem de máquina?
Quando é que C vai sobrepor assembly?
Quando é que Java vai subjugar COBOL?
C pode fazer uma série de coisas (talvez tudo) que assembly faz. Mas uma coisa é fazer, a outra substituir.
Assembly não substituiu a linguagem de máquina. Elas ainda falam 0 e 1 e continuarão por muito tempo.
[/quote]

drsmachado, por favor, me responda, mas só você ao que pergunto agora!
Se é verdade que C pode fazer uma série de coisas(talvez tudo) que assembly faz e que o C é mais fácil que o Assembly, para que usar C?

Corrigindo a última pergunta: Se é verdade que C pode fazer uma série de coisas(talvez tudo) que assembly faz e que o C é mais fácil que o Assembly, para que usar Assembly?

Você perguntou quando é que C vai sobrepor assembly.
Veja este texto que consegui do PROGRAMAR EM ASSEMBLY (PARTE I) camarony.tripod.com/sitebuildercontent/sitebuilderfiles/assembler.doc

“Alguns autores classificam algumas linguagens, incluindo a
linguagem ‘C’, por linguagem de «médio nível». Sem discutir a
correcção do termo, com o qual pessoalmente concordamos,
confirmamos que na realidade as linguagens de médio nível
substituem em muitas situações o Assembly.”

Esse texto diz ou não que o C e as outras linguagens de médio nível substituem em muitas situações o Assembly? Você me diz que este texto está errado?

Não vou listar as “escolas de nome” até porque:

  • Há rankings disponíveis
  • Depende muito do tipo de coisa que você for fazer
  • Mudam bastante, de modo geral - e é por isso que há rankings anuais
  • Se você for fazer um curso no estrangeiro, o que é de “nome” lá pode ser completamente desconhecido aqui. Por exemplo, não tenho razões para duvidar que a Iran University of Science & Technology seja uma escola de nome lá no Irã (uma vez até houve uma pessoa de lá que se inscreveu no GUJ e tentou postar algumas coisas em inglês) - pela Wikipedia ela é uma das quatro grandes no Irã, mas aqui ela é completamente desconhecida.

De modo geral, muitas universidades e faculdades públicas aqui do Sudeste (como USP, Unicamp, ITA, IME etc.) sáo as tais “escolas de nome” que disse genericamente.
Eu disse que o “Q.I” é importante - por exemplo, há uns 30 anos atrás (não sei se hoje ainda é assim) a FAAP não era exatamente conhecida por ser uma escola “de renome” mas porque havia muita gente rica estudando lá e você poderia conseguir bons contatos - e como o pessoal costuma dizer, “o pior problema do pobre é que seus amigos também são pobres”. Não sei como isso ficou hoje em dia.

[quote=entanglement]Não vou listar as “escolas de nome” até porque:

  • Há rankings disponíveis
  • Depende muito do tipo de coisa que você for fazer
  • Mudam bastante, de modo geral - e é por isso que há rankings anuais
  • Se você for fazer um curso no estrangeiro, o que é de “nome” lá pode ser completamente desconhecido aqui. Por exemplo, não tenho razões para duvidar que a Iran University of Science & Technology seja uma escola de nome lá no Irã (uma vez até houve uma pessoa de lá que se inscreveu no GUJ e tentou postar algumas coisas em inglês) - pela Wikipedia ela é uma das quatro grandes no Irã, mas aqui ela é completamente desconhecida.

De modo geral, muitas universidades e faculdades públicas aqui do Sudeste (como USP, Unicamp, ITA, IME etc.) sáo as tais “escolas de nome” que disse genericamente.
Eu disse que o “Q.I” é importante - por exemplo, há uns 30 anos atrás (não sei se hoje ainda é assim) a FAAP não era exatamente conhecida por ser uma escola “de renome” mas porque havia muita gente rica estudando lá e você poderia conseguir bons contatos - e como o pessoal costuma dizer, “o pior problema do pobre é que seus amigos também são pobres”. Não sei como isso ficou hoje em dia.[/quote]

Entanglement, um grande abraço e um super obrigado para você!

[quote=assembler][quote=juliocbq][quote=rmendes08]

Cara, isso é aí é bobagem. Assembly É a linguagem de máquina, tanto que cada arquitetura de processador tem sua própria linguagem Assembly. Uma instrução Assembly nada mais é do que um código seguido por 1 ou 2 parâmetros. Esse código é numérico, sendo assim, ele pode ser representado em qualquer base numérica, a mais comum é a hexadecimal. Porém, pode-se representar esse código também através de mnemônicos, para facilitar a leitura das instruções. Mas o fato de representar uma instrução através de um mnemônico está longe de definir uma linguagem nova.[/quote]

Pessoal, seguinte:
Assembly não é linguagem de máquina. Assembly são mnemônicos que facilitam o entendimento dos conjuntos de instruções de uma plataforma(microcontrolador ou microprocessador), além de não ser linguagem de programação, mas de montagem.
Esses mnemônicos representam uma instrução. O código de máquina não tem segredo, é 0 ou 1. Portanto se alguém quiser escrever um programa nessa linguagem pode conseguir um teclado de 3 teclas, 0, 1 e enter criar um arquivo .com no win 98 e digitar instruções lá.

A parte sobre a linguagem c fazer praticamente tudo o que o assembly faz é real. Você pode otimizar partes do programa inserindo os mnemônicos inline. Mas é inviável usar c em um programa para um micro de 1kb de memória. O programa tem que ser muito enxuto então se opta pelo assembly. Mas a grande maioria das plataformas hoje usam c, pascal ou basic.

Sobre a parte rentável da coisa pode acreditar que ela existe e é muito boa. Mas você precisa trabalhar com engenharia elétrica.

No campo das aplicações você não usa linguagem de baixo nível, a não ser que você recaia em um problema de otimização que foi o meu a muito tempo atraz. Estávamos desenvolvendo um sistema de cftv e descobrimos que memcopy do windows 98 na época era muito lento para copiar a imagem da placa de captura para o programa. Para podermos montar um quadro do vídeo no tempo certo precisamos reescrever essa função e o fizemos em assembly. E resolveu.

reforçando o artigo aqui da wiki
http://pt.wikipedia.org/wiki/Assembly[/quote]

juliocbq, estou interesado só na sua resposta ao que pergunto agora. Você disse no GUJ no assunto Assembly Language - Programar em liguagem baixo nível [ajuda!] em 11/10/2009 respondendo ao luca moderador dizendo assim: vou discordar quanto ao conhecimento inútil. Muitos microcontroladores ainda são programados em assembly, e, para otimização, usar assembly inline em pascal ou c também.

Você diz agora que a parte sobre a linguagem c fazer praticamente tudo o que o assembly faz é real, que Assembly é muito usado. Se é verdade que a linguagem c é mais fácil que o Assembly, para que usar Assembly se é verdade que a linguagem c faz praticamente tudo o que o assembly faz?[/quote]

Mas é isso mesmo. Vou te dar um outro exemplo.
Os compiladores não suportam todos os sets de instruções de um processador ou microcontrolador. Para se poder usar alguns desses(escondidos de alguma forma) registradores você precisa do manual do micro e escrever a instrução diretamente:

imagine uma instrução que troca os valores de dois registradores x1 e y1;

swap x1, y1;

Porque eu deveria escrever um workaround enorme em c(copiar memória em um monte de variáveis) se eu posso apenas fazer isso acima?

você pode usar inline no programa escrito em c por exemplo:

[code]void swap_reg_x1y1(){

__asm{
swap x1, y1;
}
}[/code]

Existem muitos registradores que os compiladores “não enxergam”. Dá uma olhada lá no site da microship. Você vai ver nos datasheets.

Existem micros com memória de programa pequenas. Não dá pra usar um compilador nesses casos. Como o programa é pequeno, é preferível escrever diretamente em assembly.

Mas é fato que os compiladores otimizam melhor o código que nós mesmos na grande maioria dos casos. É muito difícil melhorar um código escrito por um compilador ainda mais quando o programa é muito extenso.

Isso não quer dizer que assembly é conhecimento inútil, aliás é justamente o contrário, é até essencial para quem trabalha com hardware.

[quote=assembler]
drsmachado, por favor, me responda, mas só você ao que pergunto agora!
Se é verdade que C pode fazer uma série de coisas(talvez tudo) que assembly faz e que o C é mais fácil que o Assembly, para que usar C?

Você perguntou quando é que C vai sobrepor assembly.
Veja este texto que consegui do PROGRAMAR EM ASSEMBLY (PARTE I) camarony.tripod.com/sitebuildercontent/sitebuilderfiles/assembler.doc

Esse texto diz ou não que o C e as outras linguagens de médio nível substituem em muitas situações o Assembly? Você me diz que este texto está errado?[/quote]

Como você deve saber, nada é preto ou branco (a vida tem vários tons de cinza).

Eu posso escrever um programa razoavelmente grande usando um “Macro Assembler”, que basicamente converte macros para conjuntos de instruções específicas.
Posso, usando alguns macro assemblers, criar automaticamente um loop “do while” ou um loop “while”, ou então ter “ifs” aninhados - como você deve ter percebido, qualquer programa com uma lógica um pouco mais complexa fica muito chato de escrever em assembler - se vocë náo fizer um fluxograma completo de seu programa antes de codificar qualquer instrução, você se perde - e isso é coisa para gente que é muito metódica, não para gente que quer programar só de sentar na frente do computador.
Outras macros permitem simular a passagem e a recuperação de parâmetros em funções, usando as convencoes (mais conhecidas como ABI, Application BInary Interface) da linguagem C ou alguma outra.

Houve uma vez, na faculdade, em que escrevi um driver de impressora usando um Macro Assembler com esses recursos. (Eu fiz antes um pseudo-código desse driver em Pascal :slight_smile: - naquele tempo, o Turbo Pascal era disparado a melhor linguagem em termos de rapidez de desenvolvimento, e é por isso que a primeira versão foi em Pascal e não em C. )

Hoje em dia, não usaria um Macro Assembler mas um compilador C que aceitasse blocos de instruçÕes em Assembler. Mas dependendo da qualidade do compilador para a arquitetura alvo, eu teria de usar um Macro Assembler mesmo :frowning:

Problema eh trabalhar nessa area. Parece que as empresas sempre consideram o Brasil cafe-com-leite e colocam o desenvolvimento pesado sempre nas maos dos gringos.

Eu estou sempre mexendo com assembly, nao por causa do trabalho eh mais hobby mesmo. Eu desenvolvo homebrews para Super Nintendo (SNES) e ele usa o Assembly 65816.

De qualquer forma eu acho valido aprender pelo menos um pouco, saber do que se trata porque eh sempre bom saber um pouco de programacao mais baixo-nivel do que nos estamos geralmente usando.

//Daniel

Eu diria que, para os processadores RISC modernos, é muito difícil escrever um programa Assembly que seja demonstravelmente mais rápido que um programa em C equivalente, isso porque é um pouco difícil para o ser humano levar em conta todas as interdependências entre os operandos necessárias para evitar algumas coisas esquisitas que ocorrem nos processadores RISC modernos.

Por exemplo, um compilador C normalmente reordena operações de modo que eventuais carregamentos de dados da memória tenham tempo de executar, enquanto são processadas outras coisas que não dependem desse valor da memória. Como você deve ter aprendido, a memória é um recurso muito lento e eventuais acessos a ela devem ser minimizados, além de você ter de acessá-la de modo que aproveite o máximo os valores que já estão (ou devem estar) no cache. Isso é algo que é muito difícil de fazer manualmente porque a sua capacidade cerebral de levar essas coisas em conta acaba antes :slight_smile: - mas o compilador usa alguns algoritmos para poder fazer essa reordenação sem problemas. Até o JIT da máquina virtual Java, para ter uma idéia, consegue fazer alguns desses truques (mas não todos os que o compilador C consegue fazer).

A coisa é que TI não tem nada a ver com engenharia elétrica. Tem um monte de gente aí que usa linguagem de alto nível no dia a dia trabalhando com TI e critica falando que assembly é coisa do passado, linguagem c está defasada. É uma área completamente diferente da outra.

Vou dar um exemplo bobo dos truques que um compilador C consegue fazer. Como você faz uma conversão de binário para decimal? Basicamente você pensaria em usar uma instrução que está disponível em vários processadores e que faz uma divisão e calcula o resto. Como vocës também devem saber, ou a divisão não é implementada no processador (em alguns processadores RISC ha’uma instrucao esquisita, que é “passo da divisão”, não a divisão completa), ou então é uma operacáo lenta.
Mas eu vi que o compilador da Microsoft pega a sequencia de código em C que tem uma divisão por 10 e cálculo de resto por 10 e transforma isso em apenas uma multiplicação simples por um numero cabalistico (nao lembro se era 0x66666666666666666 ou coisa parecida, e mais um shift. Ambas as operaçoes, em processadores Intel, costumam gastar muito menos tempo que uma unica divisão se não me engano, a multiplicacao costuma gastar um único ciclo em processadores mais modernos porque a multiplicacao é feita por um circuito lógico (“multiplicador por hardware”) específico para isso.

juliocbq, qual o significado da sigla TI?

Estou muito interessado em conseguir todo o conteúdo do assunto PROGRAMAR EM ASSEMBLY (texto recuperado por OCR a partir da revista Spooler).
Tentei conseguir todo esse conteúdo e só pude tentar pela Internet, o site é camarony.tripod.com/sitebuildercontent/sitebuilderfiles/assembler.doc, mas consegui só a parte 1 e gostei muito de lê-lo.

Mas se vocês acham ou sabem que não vale a pena ler esse conteúdo, me digam a opinião de vocês ou me mostrem porque não vale a pena ler esse conteúdo.
Mas se vale a pena ler esse conteúdo, me ajudem a conseguir o restante se puderem, ficarei muito contente.