Языки программирования

Разработка сложных систем программного обеспечения, таких как операционные системы, программное обеспечение для сетей и огромное количество прикладных программ, доступных сегодня, была бы невозможна, если бы люди были вынуждены представлять алгоритмы непосредственно на машинном языке. Сказать, что работать с такими языками при создании сложной системы было бы чрезвычайно трудно, значит ничего не сказать. Следовательно, языки программирования, подобные нашему псевдокоду, были разработаны так, чтобы они позволяли записать алгоритм в форме, понятной человеку и легко преобразуемой в команды машинного языка. Языки программирования позволяют избежать лабиринта регистров, адресов памяти и машинных циклов в процессе разработки программы и сосредоточиться на решаемой задаче. В этой главе мы и познакомимся с языками программирования.

Исторический обзор

Начнем обсуждение языков программирования с рассмотрения их истории.

Ранние поколения

В основе ранних компьютеров лежал принцип хранимой программы, и в процессе программирования программист записывал все алгоритмы на машинном языке. Это еще более усложняло и без того трудную задачу построения алгоритма и почти всегда приводило к ошибкам, которые приходилось искать и исправлять (этот процесс называется отладкой).

Первым шагом в устранении этих сложностей из процесса программирования был отказ от использования чисел для представления кода операции и операнда, используемых в машинном языке. С этой целью кодам операции стали назначать мнемонические имена и использовать их вместо шестнадцатеричного представления. Например, вместо кода операции загрузки программист мог написать LD (от Load) или, чтобы сохранить содержимое регистра, можно было использовать ST (от Story). Для операндов были созданы правила, по которым можно было присваивать описательные имена (идентификаторы) ячейкам памяти и использовать их вместо адресов памяти в командах. Частным случаем этой идеи является назначение имен, таких как RO, Rl, R2 и т. д., регистрам центрального процессора.

Присвоив описательные имена ячейкам памяти и используя мнемонические имена для представления кодов операций, программисты могли значительно повысить удобочитаемость последовательности машинных команд. Например, вернемся к записанной на машинном языке программе (см. табл. 2.1), которая суммирует содержимое ячеек памяти с адресами 6С и 6D и помещает результат в ячейку 6Е. Команды в шестнадцатеричном представлении выглядят следующим образом:

156С 1660 5056 306Е

сооо.

Если мы присвоим имя Price (цена) ячейке памяти 6С, имя ShippingCharge (расходы по погрузке) ячейке 6D и Total Cost (полная стоимость) ячейке 6Е, то можно записать эту программу следующим образом1:

LD R5. Price

LD R6. ShippingCharge

ADDI RO. R5 R6

ST RO. Total Cost

HLT

Большинство согласится, что вторая запись, хотя и недостаточно, но все-таки более наглядно, чем первая, представляет назначение программы. (Обратите внимание на то, что для кода операции сложения целых чисел используется мнемоническое имя ADDI, чтобы отличать его от кода операции сложения чисел с плавающей точкой ADDF.)

Когда этот метод был только введен, программисты использовали такое представление, разрабатывая программу на бумаге, а затем переводили его на машинный язык. Однако скоро заметили, что этот процесс машина может осуществлять сама. Для этого были созданы программы, транслирующие программу, записанную в мнемонической форме, в машинный код. Такие программы называются ассемблерами. Название ассемблер (assembler — сборщик) происходит от основной функции этих программ — собирать машинные команды, переводя мнемонические имена операций и идентификаторы операндов в коды команд и коды операндов (это могут быть адреса и/или непосредственные операнды). Мнемонические системы для представления программ были признаны языками программирования и названы языками ассемблера.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: