20/05/2005

Ретро-статья: про «уровни» языков программирования и assembler

Эта статья является вводной в курс языка программирования низкого уровня Assembler (далее — Asm). Так как эта статья вводная, мы ограничимся весьма поверхностной информацией и общими сведениями. 

Было бы логично начать с определения, что мы будем принимать за низкий уровень, а что — за высокий. Языки программирования делятся на низкоуровневые и высокоуровневые. В данном случае подразумевается степень приближённости языка программирования к языку человеческому (а так же отдалённость его от машинного языка). Дело в том, что процессор работает по своим принципам, и общаться с ним можно только на его языке. Следовательно, самый низкоуровневый язык — это язык машинного кода, так как он является родным для процессора и находится дальше всего от человеческого языка. Следующим по высоте является язык Asm, поскольку Asm представляет собою мнемонику, набор легко запоминаемых обозначений (легко запоминаемых, относительно самого машинного кода). То есть Asm оперирует напрямик с процессором и его командами. Дальше стоят языки высокого уровня, такие как BASIC, Pascal, C/C++, Fortran. И на последней ступени, на данный момент, стоят RAD системы (Rapid Application Development — быстрая разработка приложений). Такие как Visual BASIC, Visual С#, Delphi и прочие, как правило визуальные. Сейчас RAD системы принято называть «студиями», так как фирмы выпускают именно студии, визуальные, содержащие большинство распространенных языков. В наше время можно наблюдать две основные студии — Borland Developer Studio и Microsoft Visual Studio. Borland Developer Studio включает в себя Delphi (язык на основе Pascal, который в процессе эволюции получил название Delphi Language) и C#. Отдельно поставляется версия RAD системы на основе C++ — C++ Builder. Но есть вероятность что фирма Borland в ближайшем будущем совместит две эти студии в одну. Microsoft Visual Studio включает в себя Visual BASIC, Visual C++ и Visual C#. Работа в студии наиболее похожа на обычное межличностное человеческое общение, на языке напоминающем человеческий (а во многих случаях и вовсе прямо сводится к тырканью мышью по различным областям экрана). 

Не сложно предположить, что всякая программа в конечном счёте всё равно будет переведена на язык процессора. Процесс перевода с человеческого языка на машинный называется трансляцией. Процесс построения программы — это трансляция, — преобразование программы в набор объектных файлов, содержащих машинный код, и линковка — объединение объектных файлов в результирующий исполняемый файл под данную конкретную операционную систему. Если мы пишем на машинном языке, нам не требуется ничего компилировать, достаточно всего лишь сохранить в файл и можно запускать. Компиляция с Asm'а — это всего лишь последовательный перевод одной команды Asm'а в определённый набор команд процессора. Компиляция программы на Asm'е подобна переводу с Американского на Британский. В то время как компиляция с языка высокоуровневого напоминает скорее перевод с иероглифов, русского или иврита, на, допустим, тот же Британский. 

Уровень языка также отвечает за то, насколько процесс разработки, компиляции и сборки финальной программы контролируется разработчиком. То есть, программисты на машинном коде и на Asm'е полностью контролирует процесс работы своей программы. Конечно, они же говорят практически на Британском. В случае с высоким уровнем языка, и подавно с RAD системами, мы практически не можем контролировать работу процессора, в лучшем случае мы как-то можем повлиять на результат работы программы. Весь процесс перевода языков берёт на себя транслятор. Здесь можно упомянуть такое понятие, как оптимизация. Оптимизация это способ организации алгоритма, т.е. каким именно образом данный алгоритм (или задача, поставленная перед программистом) будет преобразована в машинный код. В случае с Asm'ом, всей оптимизацией занимается сам разработчик. В языках высокоуровневых, оптимизацию берёт на себя транслятор, и разработчик не знает, как будет оптимизирована его программа. Но нужно указать, что трансляторы пишут так же люди весьма умные и оптимизируют они очень и очень хорошо. Разработчику придётся немало потрудиться, дабы добиться такого уровня оптимизации вручную. 

На Asm'е можно писать как под платформу х86 (x86-based PC, те которые мы привыкли видеть, построенные на процессорах архитектуры x86, к этой платформе относятся компьютеры, начиная с IBM PC и заканчивая Pentium IV, а так же все, так называемые клоны), так и под любую технику с цифровым микроконтроллером, так как этот язык представляет собой некий стандарт. Стандарт языка, по которому принято строить языки интерпретации команд процессора. А процессор, как известно, есть и у микроволновой печки, и у стиральной машины, и у всеми любимых телефонов. То есть на Asm'е можно программировать всё, что поддаётся программированию. Но это конечно, если фирма-изготовитель позаботилась о реализации Asm'а под свою микросхему. В противном же случае нам придётся всё-таки иметь дело с машинным кодом, да ещё и со своеобразным. Изучить даже самый распространённый язык процессора, язык процессора x86, будет задачей весьма непростой. Да и не поможет это, так как при переходе на другой контроллер придётся всё переучивать, потому что у каждой микросхемы свой язык, своя система команд. То есть нам помимо Британского придётся изучить и Латиницу. А в следующий раз и Французский и так далее. Поэтому мы выбираем Asm в качестве базового языка. Тем более что Asm, будучи во много раз более удобным, чем язык машинного кода, не снижает быстродействия и не ограничивает разработчика от каких либо возможностей, предоставляемых ему микроконтроллером. Таков стандарт. 

Поскольку Asm полностью отражает структуру программируемого устройства, его реализации под различные платформы так же будут варьироваться, но сам принцип останется прежним. В связи с этим разработчику всё-таки придётся изучать и саму аппаратную часть, которая различается от процессора к процессору. То есть без наречий всё-таки не обойдётся. Здесь, во вводной статье, я не буду расписывать, как и в чём конкретно изменяется Asm внешне, в зависимости от платформы, но разработчики, знающие хотя бы архитектуру x86 уже могут представить, чем он может отличаться. Смею предположить, что их догадки будут верны. И так изучение Asm'а, как указано выше, начинается с изучения платформы под которую разработчик собирается писать и всегда связано с изучением операционной системы и её API. API — Application Programming Interface, интерфейс программирования приложений. Это некая спецификация, с которой так же придётся считаться. Всё это сразу резко отдаляет момент написания первой, пусть даже самой простейшей программы, на неопределённый срок, что очень часто отпугивает начинающих программистов, решивших перейти на Asm. 

Но мы будем работать преимущественно с платформой x86, об этом и будет дальнейшая беседа. Работу на других платформах, перенос с одной на другую, мы оставим специально обученным людям, называющим себя «Ембеддерами». Ембеддер, от слова Embedded — вложенный, встроенный. В нашем случае мы рассматриваем это слово как встроенный. Ембеддер — это человек, который занимается встраиваемыми микропроцессорными системами различного назначения, а конкретно их аппаратно-программной частью. Эти люди знают и радиотехнику, и микропроцессорную технику, и программирование. Ембеддеры знают платы на микросхемах, схемы с программируемыми контроллерами и программируют эти устройства под определённые цели. 

Что касается нас, мы можем изучать Asm не только для того чтобы писать на нём в чистом виде. Практически во всех языках высокого уровня и студиях осуществлена возможность вставки кусков кода Asmа в высокоуровневую программу. Это делается для достижения максимальной скорости выполнения отдельных участков кода, например в случаях, требующих особой скорости выполнения математических операций или прямого доступа к каким либо аппаратным ресурсам. Плюс само знание Asm'а, даже может без его использования, является неотъемлемой частью знаний настоящего специалиста в программировании и разработчика. Это нужно просто для понимания того, с чем мы работаем. 

Оригинал — 23.04.2005, здесь в редакции от 20.10.2022.

При редакции, некоторые технические и стилистические моменты были оставлены неизменными.

P.S.
Ещё пол года — и эта статья будет совершеннолетней!