Como é o conhecimento do LLP na ITMO University: o curso "Programação de baixo nível"

As linguagens de programação mais populares são de alto nível. Por exemplo, Java, Python ou C #. Obviamente, você pode programar neles e imaginar mal como os vários níveis de abstração realmente funcionam. Porém, para um bom especialista em TI, é importante entender como a plataforma com a qual ele interage é criada, como o ambiente de desenvolvimento, o compilador e o depurador funcionam. Isso nos leva a falar sobre programação de baixo nível.

O LLP (programação de baixo nível) é uma maneira conveniente de descobrir como escrever programas confiáveis, rápidos, compactos e eficientes. Nossos alunos aprendem assembler e C principalmente para ter uma ideia melhor de como o software funciona.

Foto Pablo BD CC BY-SA

Por que você precisa saber


O setor de TI está se desenvolvendo rapidamente e está sujeito a uma moda de tecnologia e idiomas. Conceitos fundamentais - por exemplo, modelos computacionais, memória virtual, compilação e montagem de programas - mudam com muito menos frequência. Compreender como os princípios básicos de tais conceitos são manifestados em uma linguagem de programação ajudará você a aprender rapidamente uma linguagem semelhante, se precisar trabalhar. Nesse caso, o LLP deixa claro como o programa do texto de origem se torna um conjunto de instruções da máquina e como elas são executadas no computador. Por sua vez, a familiaridade com os mecanismos de gerenciamento de memória e os princípios do compilador o ajudará a escrever um código menos exigente em recursos de computação.

Esclarecimento: Muitas vezes temos que nos deparar com a tese de que o LLP está apenas programando tarefas semelhantes e ferro. Isto não é verdade.

Onde posso encontrar o LLP na prática:

  • Negociação A negociação na bolsa cria programas com requisitos incrivelmente altos para o tempo de reação às flutuações do mercado. Devido ao "afastamento" das linguagens de alto nível do "ferro", é muito difícil prever o tempo de resposta de um programa a um evento externo. Portanto, o LLP está envolvido aqui para fornecer controle sobre a velocidade das transações.

  • Robótica . Os recursos de computação são limitados aqui, portanto, os requisitos de qualidade de software e compactação de código são altos. As abordagens geralmente aceitas para a criação de software aqui nem sempre funcionam, e geralmente o desenvolvimento pode ocorrer em C ou em outra linguagem do sistema.

  • Software do sistema . Estes são SO, compiladores (JIT, AOT), navegadores (hoje eles se tornaram uma plataforma para a criação de aplicativos complexos). Seu trabalho nem sempre é perceptível para o leigo, mas cria uma infraestrutura para o software aplicativo.

Como nos preparamos para isso?


Nossos alunos das instruções 09.03.01 "Engenharia informática e de computadores" e 09.03.04 "Engenharia de software" estudam várias disciplinas relacionadas à programação de baixo nível. São sistemas operacionais, software de sistema (inclusive no Unix), desenvolvimento de compiladores, tecnologias de virtualização etc.

Ponto de partida - curso "Programação de baixo nível". Aqui, os alunos aguardam trabalho com assembler e C. Em paralelo - eles estudam o processo de compilação e execução de programas. O curso está no formato "de definir a tarefa para o programa concluído". O principal objetivo do curso é ter uma idéia de como a apresentação do programa muda durante as transições entre:

  • escrever código;
  • pré-processamento e compilação;
  • vinculação
  • execução e depuração.


Foto hackNY.org CC BY-SA

Dos alunos que participam do curso, esperamos uma experiência mínima de programação em linguagens de alto nível (por exemplo, Java ou C #). Recomendamos os seguintes cursos online:


O curso "Programação de baixo nível" é ministrado principalmente a partir de um livro escrito especificamente para nossos alunos. O livro é publicado em inglês e traduzido para japonês e português. Também trabalhamos frequentemente com o manual do desenvolvedor de software Intel64 e o System V AMD64 ABI.

O que há dentro do curso


Em palavras simples, este curso pode ser detalhado da seguinte forma (com relação aos tópicos que foram identificados acima):

  • Código de ortografia . Assuma a linguagem assembly livre para Intel 64 (NASM, Linux) e C11. Aqui estudamos modelos computacionais, fornecemos recomendações avançadas sobre o estilo de escrever código.

  • Pré-processamento e compilação . Os pré-processadores NASM e C são estudados, gramáticas formais, otimizações comuns de código pelo compilador e a mecânica de uma implementação típica de construções de linguagem C no nível do assembler (em outras palavras, uma demonstração da idéia de "C é um assembler de alto nível") é abordada.

  • Vinculação (vinculação) . Estático e dinâmico. Na prática, o formato ELF está sendo estudado - os alunos estão explorando o que o vinculador e o carregador dinâmico fazem. A propósito, um minicurso separado foi dedicado a isso.

  • Executando e depurando um programa . Aqui, entendemos como essas tarefas estão relacionadas à arquitetura do computador, ao dispositivo de memória virtual e ao modo privilegiado, às interrupções e ao mecanismo de chamada do sistema. Além disso, consideramos como o gdb é usado (um depurador poderoso que permite "olhar sob o capô" de qualquer programa).

Nuances organizacionais importantes


Interrompemos as aulas co-escrevendo código e estudando arquivos compilados usando ferramentas de binutils (objdump, readelf) ou gdb. Durante a palestra (e não apenas), os alunos fazem perguntas verbalmente e no canal do curso em um mensageiro conhecido, e os professores as respondem o mais rápido possível.

Como lição prática, os alunos realizam trabalhos de laboratório. Às vezes, os alunos no processo de aprendizado desejam desenvolver algo próprio que seja pessoalmente interessante para eles (um jogo, um programa para controlar um robô, um compilador etc.).

Portanto, como substituto do exame, os alunos podem fazer um projeto individual sobre um tópico acordado com o professor. Após passar por uma revisão de código e postar no GitHub, eles gravam um vídeo demonstrando o projeto (este canal contém projetos implementados desde 2014, os links para o GitHub estão na descrição).

Um exemplo do trabalho de um aluno: levitron analógico (uma história detalhada sobre o projeto no Habr )

Alguns outros projetos concluídos no final do curso:



Sobre o professor


No curso, toda uma equipe de professores interage com os alunos que dão palestras, realizam trabalhos de laboratório e aconselham os alunos. Os alunos seniores participam de discussões e ajudam os alunos do curso atual a entender os meandros da programação de baixo nível.

O principal trabalho sobre a preparação de materiais para o curso foi realizado por Igor Zhirkov, autor de um livro sobre ele. Igor estudou na ITMO University e na Academic University, obteve um mestrado na ITMO em 2016. Sua área de interesse é teoria dos tipos, lógica matemática, linguagens de programação e programação de baixo nível. Seu principal projeto atual está relacionado à verificação formal da refatoração da linguagem C usando Coq e o compilador CompCert verificado para C.



Este curso ajuda você a aprender a analisar um problema a partir de um nível adequado de abstração e, digamos, condicionalmente, a não tentar "escrever aplicativos da Web no assembler". Estamos tentando abordar o estudo de C e assembler em termos de entendimento dos conceitos associados a essas "ferramentas" e seu ambiente - sistemas operacionais e CPUs.

A propósito, aqui você pode encontrar um livro, cuja redação foi inspirada no ensino deste curso (publicado em inglês, japonês e português).

Source: https://habr.com/ru/post/pt425249/


All Articles