Законный вопрос — зачем изучать программирование в машинных кодах, когда существует столько разнообразных языков программирования, рассчитанных на любые вкусы и интересы? Разве это не возврат на тридцать пять лет назад, когда программировали только в кодах, и языков программирования еще не существовало? Разве писать программу в машинном коде это не то же самое, что высекать дом в скале с помощью напильника? Чтобы ответить на эти вопросы, надо рассмотреть, что же такое языки программирования и как они обеспечивают общение человека с компьютером.
Процессор — это микросхема, которая не понимает никаких языков программирования, воспринимает только машинные коды, поскольку они представлены электрическими импульсами. Поэтому, когда мы запускаем программу в машинных кодах, то работаем с процессором напрямую, без каких-либо посредников, какими являются языки программирования. Для компьютера язык программирования сам по себе ничего не говорит. Ему нужна системная программа, которая прочитает операторы Вашей программы и переведет их (транслирует) в машинный код. Такие программы существуют, их называют трансляторами.
Классификация языков программирования по поколениям и уровням. Что такое машинный код и ассемблер
Трансляторы бывают двух типов — Интерпретаторы и Компиляторы.
Интерпретатор переводит Вашу программу с языка высокого уровня (например, БЕЙСИКа) в машинный код последовательно строку за строкой. Он работает примерно так: прочитал строку, проверил, нет ли в ней ошибок, перевел ее в машинный код, выполнил команды машинного кода, запомнил, где нужно результат и перешел к следующей строке. Чтобы сделать, например, операцию
интерпретатор обращается к процессору несколько сот раз. Вам этого не видно, все равно результат появится на экране через доли секунды, но это так.
Если же Вам позже придется вернуться к этой строке (например, с помощью GO TO 10), то все эти действия будут повторены.
А ведь многие операции выполняются в циклах.
Таким образом, интерпретатор работает крайне медленно. Зато имеется возможность работы в диалоговом режиме. Так, на Бейсике, когда Вы набираете программу, каждая строка сразу же и проверяется на правильность синтаксиса и, если Вы сделаете ошибку, то строка не будет введена в программу нажатием клавиши ENTER до тех пор, пока Вы эту ошибку не устраните.
Вы всегда можете прервать работу программы, внести изменения и стартовать опять, причем с той строки, с какой хотите. Работать с интерпретатором БЕЙСИКа настолько удобно для начинающих, что на многих моделях персональных ЭВМ, в том числе и на «ZX-Spectrum`е», он уже «зашит» в постоянное запоминающее устройство (ПЗУ) и служит не только языком программирования, но и выполняет функции операционной системы компьютера. При включении компьютера в сеть он сразу готов к выполнению команд БЕЙСИКа.
В отличие от интерпретатора, компилятор переводит Вашу программу с языка высокого уровня (например, Паскаля или Фортрана) в машинные коды всю целиком. После того, как программа написана, она компилируется в машинный код. Программа, написанная Вами на языке, называется исходным текстом (исходным модулем, исходным блоком, исходным файлом).
Надо ли знать программисту: историю ЭВМ, машинный код, уметь работать с низкоуровневыми языками?
То, что Вы получаете в результате компиляции, называется объектным кодом (модулем). Вы можете выгрузить объектный код на ленту, а потом снова загрузить. Можете запустить его на исполнение, но здесь у Вас уже нет возможности во время работы программы ее остановить, внести изменения и снова запустить с произвольно взятого места. Если такая необходимость возникает, надо заново загрузить исходный текст программы, внести изменения, а потом опять откомпилировать его в машинный код.
Поскольку здесь компиляция выполняется для каждой строки только один раз, а потом полученный машинный код можно использовать хоть всю жизнь, то здесь скорость работы программы гораздо выше и лишь немного уступает скорости программ, сразу написанных на Ассемблере. Те все же быстрее, т.к. как бы хорош компилятор ни был, он все же не в состоянии сделать объектный код оптимальным по быстродействию и по объему занимаемой памяти.
К недостаткам компиляторов относится и то, что здесь процесс составления и отладки программ более трудоемкий и менее очевидный, т.к. между внесением изменений в программу и результатом запуска есть еще промежуточный процесс — компиляция. Кроме того, компиляторы часто накладывают ограничения на применение тех или иных операторов языка программирования.
Итак, программирование в машинном коде (на Ассемблере) позволяет повысить скорость работы программы по сравнению с работой через интерпретатор в 50…200 раз и в 1,5…3 раза по сравнению с кодом, прошедшим компиляцию. Это бывает чрезвычайно важно, если в программе есть многочисленные вложенные друг в друга циклы, если многократно выполняются поиск и выбор данных из обширных областей памяти. Много времени занимают операции, связанные с обработкой графических изображений на экране. Эффект плавного и быстрого перемещения (и изменения формы) объектов в компьютерных видеоиграх практически всегда создается программированием в машинном коде.
Второй важный момент состоит в сокращении объема занимаемой памяти. Казалось бы, что 48 килобайтов в «ZX-Spectrum`е» — это немало. Тем не менее, если учесть, что почти 7К занимает экранная область памяти, то при создании красочных программ, содержащих несколько десятков экранов, на их хранение даже и в компрессированном виде уходит несколько десятков килобайт, а надо еще выделить место для хранения таблиц данных, переменных, текстов сообщений и т.п. Поэтому в лучших программах на сам машинный код, по которому они работают, остается всего 4…8К. Здесь и проявляется мастерство программиста, сумевшего обеспечить в столь малом объеме богатое многообразие вариаций игры, палитру цветов и гамму звуков.
Сравним расход памяти при работе на БЕЙСИКе и в машинных кодах. Программа на БЕЙСИКе размером в 30 строк занимает примерно 1К памяти.
Аналогичная ей, выполняющая те же задачи, программа в машинных кодах будет иметь примерно 150 строк (команд), но занимают они всего 200…250 байтов оперативной памяти.
В нашей стране есть еще две объективные причины, вызывающие повышенный интерес к программированию в машинных кодах.
Дело в том, что наибольшее число пользователей этого класса компьютеров у нас составляют радиолюбители и специалисты по электронике, самостоятельно собравшие компьютер. Обычно они не останавливаются на достигнутом результате.
А развивают свое хобби дальше, ищут пути усовершенствования машины, пути подключения дополнительных устройств: интерфейсов принтера, дисковода, джойстика, светового пера, программатора, контроллеров бытовой аппаратуры, бытовых систем, систем управления различными моделями и т.д. Вплоть до систем управления технологическими процессами промышленных предприятий.
В конце 80-х годов в Душанбе на базе этого компьютера была сделана система голосования республиканского парламента. Работают под управлением «Спектрума» и очень интересные системы управления сельскохозяйственными предприятиями (фермами и птицефермами). Интересны автоматизированные системы диагностирования автомобиля, системы контроля состояния спортсменов и многое другое. Поскольку процедуры, управляющие работой всех этих устройств (их называют драйверами), обычно пишутся в машинных кодах, то их надо знать и уметь с ними работать.
Другая особенность состоит в том, что основная масса программ для Синклер-компьютеров написана в Англии на английском языке. Желание адаптировать эти программы на русский язык во многих случаях упирается в необходимость понимания структуры программы, а большинство лучших программ написано именно в машинных кодах.
«ИНФОРКОМ» получает множество писем с вопросами по поводу переделки системы загрузки фирменных программ. Мы так понимаем, что многие уже обзавелись дисководом с Бета-диск интерфейсом, и теперь перед ними стоит задача переписывания программ на диск.
При этом пользоваться «магической кнопкой» они не хотят, т.к. при этом любая, даже самая короткая программа будет занимать на диске 48К, а хотят ее переписать на диск блок за блоком и сопроводить загрузчиком с диска. На все эти вопросы ответ может быть только один.
Поскольку разные фирмы в своих программах применяют разные системы загрузки, универсального решения здесь не существует. К каждой программе нужен индивидуальный подход. Надо прочитать загрузчик программы, понять куда какой блок загружается и в каком порядке они стартуют, а затем, если надо, внести в него свои изменения. Поскольку лучшие программы имеют при себе загрузчик в машинных кодах (обычно он следует после БЕЙСИК-загрузчика или организован внутри него в строке после оператора REM), то умение работать с машинным кодом Вам пригодится и здесь. Вот в основном те причины, которые могут побудить Вас к освоению программирования в машинных кодах или хотя бы их пониманию (что достигается гораздо быстрее, чем способность активного программирования, но имеет не меньше значения), хотя хотелось бы отметить еще два важных, на наш взгляд, обстоятельства.
Во-первых, «Спектрум» имеет ПЗУ объемом 16К. Эта память буквально насыщена множеством очень полезных системных процедур. Все они записаны в машинных кодах. Их можно смело применять в собственных программах, обращаясь к ним по мере необходимости. Это дает колоссальный выигрыш в расходе памяти и вообще очень упрощает программирование.
Поскольку все содержимое ПЗУ записано в машинном коде, умение разбираться в нем является необходимым. Для использования системных программ, содержащихся в ПЗУ, Вам необходимо ознакомиться с основами программирования в машинных кодах.
Во-вторых, изучение программирования в машинном коде процессора Z-80 хоть и трудоемкий, но очень полезный шаг для Вашего будущего. Компьютерная техника непрерывно прогрессирует. Широко внедряются IBM-совместимые машины с процессорами 8088, 8086, 80286, 80386, 80486. Процессор Z-80 — «двоюродный брат» процессора 8088 и имеет определенные черты сходства со всей этой серией. Те из Вас, кто свяжут свою судьбу с профессиональной вычислительной техникой, еще не раз вспомнят добром свои первые шаги в освоении машинного кода Z-80.
Что же касается особой трудоемкости работ по программированию в машинных кодах, то и здесь есть ряд возражений.
· Нет необходимости сразу программировать. На первом этапе Вы уже сможете многого достичь, если будете просто разбираться в программах, а дальше все придет с набором опыта.
· Существуют ассемблирующие программы, которые имеют достаточный набор средств, чтобы освободить Вас от самой рутинной работы и снизить трудоемкость программирования.
· Как правило, нет никакой необходимости всю программу писать в машинных кодах. Всегда в ней можно выделить блок, который решающим образом влияет на быстродействие. Он может быть очень маленьким по размеру. Вот его-то и надо записать в машинных кодах, а остальную часть программы оставить, например, на БЕЙСИКе.
Если Вы создаете программу «русско-английский словарь», то она вполне может быть написана на БЕЙСИКе и только процедура поиска перевода слова, занимающая много времени, должна быть записана в машинных кодах. Если же Вы создаете русско-китайский словарь, то еще одним узким местом станет рисование на экране иероглифов. Вам придется записать несколько процедур, которые смогут делать это быстро. Диалог с пользователем программа может вести и из БЕЙСИКа.
· И, наконец, последнее. Ни один программист, работающий в машинных кодах, не пишет большую программу от начала и до конца с чистого листа. Программа представляет хитроумное сплетение больших и малых подпрограмм (процедур), из которых до 80% стали для этого программиста стандартными, т.е. он применяет их регулярно во всех своих программах без особых перемен, а Вы никогда об этом и не догадаетесь. Это могут быть арифметических и логических вычислений, обработки изображений, опроса внешних устройств (например, джойстика), вывода текста на экран, звуковых эффектов и т.д. и т.п.
Конечно, если Вы делаете только первые шаги в машинных кодах, то у Вас нет еще такой библиотеки, но прочитав эту книгу, Вы уже можете покопаться в машинном коде некрупных фирменных программ. Там Вы найдете множество открытий. В этом Вам очень поможет какая-либо дисассемблирующая программа, например MONITOR 16/48. Для Вас открыты и другие книги «ИНФОРКОМа» и, самое главное, наши выпуски «ZX-РЕВЮ».
Источник: zxpress.ru
Два вопроса насчет машинного кода
Не всегда программа выглядит одинаково для разных процессоров. Это зависит от архитектуры набора команд (ISA). На этом уровне определяются все инструкции, которые может выполнять CPU, набор регистров, прерывания, модель памяти, модель адресации и так далее.
Таким образом, если два CPU имеют одинаковую ISA, то и программа в машинном коде выглядит для них одинаково. Например, и у Intel и у AMD есть процессоры, реализующие x86 ISA, таким образом, программа будет переносима между такими процессорами.
2
Совсем не обязательно. Поймите, что в конце концов любая программа будет выполнена на CPU как набор инструкций. Поэтому производительность зависит от того, насколько оптимально программа в этот набор инструкций переведена.
Для примера рассмотрим какой-нибудь язык ассемблера и какой-нибудь компилируемый язык высокого уровня, например, C++. Если вы на языке ассемблера сможете написать код более оптимальный, чем тот, что будет сгенерирован компилятором C++, то ваш код будет работать быстрее. Если же компилятор сгенерирует более оптимальный код (что более вероятно), то быстрее будет работать скомпилированная программа.
Существуют так же интерпретируемые языки. Программы на таком языке не компилируются в машинный код, выполняемый непосредственно на CPU, а интерпретируются специальной программой интерпретатором. Опять же ваша программа предстанет перед CPU как набор инструкций, только сделает это через посредника — интерпретатора. Распространено мнение, что интерпретируемые языки медленнее, чем компилируемые, однако это не совсем так.
Таким образом, нельзя сказать, что программы на языке низкого уровня быстрее, чем программы на языке высокого уровня. Производительность будет зависеть от того, насколько оптимально компилятор или интерпретатор «переводят» программу для того, чтобы CPU мог ее понять и исполнить.
Источник: ru.stackoverflow.com
Что такое программирование: как символы превращаются в сайты и программы, чем различаются языки?
Чтобы понять, как исходный код превращается в программу, нужно начать с того, как компьютер исполняет программы. Два основных компонента компьютера – это процессор и оперативная память. Процессор содержит набор инструкций и набор регистров.
Для запуска программы операционная система загружает ее текст (машинный код) в оперативную память, устанавливает счетчик команд на адрес точки входа (например, в языке C это функция main), инициалзирует стек, выполняет другие подготовительные работы. После этого процессор начинает выполнение. Он считывает инструкцию, на которую указывает счетчик команд, выполняет ее, возможно записывает результат в один или несколько регистров (зависит от конкретной инструкции) и увеличивает счетчик команд. Затем повторяет эту процедуру до тех пор, пока программа не завершится. Это в двух словах.
Инструкции процессора представляют собой простейшие действия: загрузить ячейку памяти из ОЗУ в регистр (mov), сложить значения из двух регистров (add), установить счетчик команд (jmp) и т.п. Писать программы на уровне инстукций процессора (машинного кода) не то, чтобы невозможно, но в большинстве случаев экономически нецелесообразно. Такой код получается непереносимым (запустить его на процессоре с другой архитектурой будет невозможно) и совершенно нечитаемым (от слова «совсем»).
Здесь на сцену выходят языки программирования высокого уровня (такие как C) и компиляторы. Компилятор – это программа, которая умеет преобразовывать текст программы, написанный на языке высокого уровня, в машинный код для определенной архитектуры и операционной системы. При компиляции, программа проходит несколько стадий:
- лексический + синтаксический анализ — на этом этапе компилятор разбивает текст на отдельные лексемы, лексемы преобразует в токены, из последовательности токенов в соответствии с грамматикой языка он пытается восстановить ситаксическое дерево программы. Если у него это не получается, то пользователю сообщается о синтаксической ошибке;
- генерация промежуточного представления — на этом этапе генерируется код, очень похожий на машинный, но являющийся аппаратно-независимым (например, трехадресный код);
- оптимизация — упрощение конструкций или перегруппировка инструкций с целью более эффективного их выполнения;
- генерация машинного кода для конкретной архитектуры.
Существует также класс компиляторов, которые преобразуют программу не в машинный код, а в так называемый байт-код, предназначенный для исполнения на виртуальной машине (например, виртуальная машина java). Виртуальная машина – это программа, которая симулирует некий абстрактный процессор со своим набором инструкций и регистров, управляет памятью и взаимодействует с операционной системой, на которой она запущена. Плюс такого подхода в том, что виртуальная машина может быть реализована под различные платформы и операционные системы и иметь единый интерфейс. Т.е. программа, скомпилированная для виртуальной машины, будет исполнятся на всех платформах, для которых эта виртуальная машина реализована.
Третий вариант, когда программа не компилируется в какой-то выходной файл, а сразу исполняется интерпретатором. К этой категории относятся, например, perl, php и многие скриптовые языки.
Что касается сайтов, то это более высокоуровневая штука и вообще говоря отдельная тема для разговора. Но вкратце попробую обобщить. Сайты обслуживаются специальной программой, называемой веб-сервером.
Он принимает сетевые соединения, ожидает специально сформированный запрос (формат определен протоколом HTTP), формирует специальный ответ, в заголовке которого сообщает пользователю тип ответа (веб-страница, файл и т.п.) и отправляет пользователю. Минимальный сайт может состоять из веб-сервера и единственной статической странички в формате html. В более сложных случаях, когда нужно генерировать ответ на основе параметров запроса пользователя, веб-сервер передает запрос на обработку другой программе, которая генерирует ответ (эта программа может быть написана на любом языке, использовать базы данных или какие-либо другие сетевые сервисы и т.п.) и возвращает его веб-серверу, который в свою очередь пересылает ответ пользователю. Высоконагруженные сайты могут использовать очень сложные конфигурации, включающие десятки и сотни компьютеров, распределенные базы данных, распределенные файловые хранилища, различные балансировщики нагрузки на всех уровнях и т.п.
Надеюсь, смог чем-то помочь : )
Источник: yandex.ru