Компьютер может немедленно выполнить программу, если она

Обновлено: 24.11.2024

Машинный язык, в котором код дополнения цифры является дополнением кода цифры.

Связанные термины:

Скачать в формате PDF

Об этой странице

Что такое сборка?

МАЙКЛ Л. ШМИТ, процессор Pentium™, 1995 г.

Машинный язык

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

Обзор исследования поддерживаемого инструментами тестирования проектов, основанных на требованиях, на основе моделей

Ралука Маринеску, . Пол Петтерссон, Достижения в области компьютеров, 2015 г.

6.4 АсмЛ

Затем мы выбираем репрезентативный инструмент категории записи до/после и применяем его к нашему рабочему примеру.

Архитектура

Сара Л. Харрис, Дэвид Харрис, в Digital Design and Computer Architecture, 2022

6.4.7 Интерпретация кода машинного языка

Для интерпретации машинного языка необходимо расшифровать поля каждого 32-битного командного слова. В разных инструкциях используются разные форматы, но все форматы имеют общее 7-битное поле кода операции. Таким образом, лучше всего начать с просмотра кода операции, чтобы определить, является ли это инструкцией типа R, I, S/B или U/J.

Перевод машинного языка на язык ассемблера

Переведите следующий код машинного языка на язык ассемблера.

Решение

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

0100 0001 1111 1110 1000 0011 1011 0011 (0x41FE83B3)

1111 1101 1010 0100 1000 0010 1001 0011 (0xFDA48293)

Код операции определяет, как интерпретировать остальные биты. Код операции первой инструкции — 01100112 ; Итак, согласно Таблице B.1 в Приложении B, это инструкция R-типа, и мы можем разделить остальные биты на поля R-типа, как показано в верхней части рисунка 6.28. Код операции второй инструкции — 00100112 , что означает, что это инструкция I-типа. Мы группируем оставшиеся биты в формате I-типа, как показано на рис. 6.28, где показан ассемблерный код, эквивалентный двум машинным инструкциям.

Рисунок 6.28. Преобразование машинного кода в ассемблерный код

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

ХАРВИ М. ДЕЙТЕЛЬ, БАРБАРА ДЕЙТЕЛЬ, Введение в обработку информации, 1986 г.

Язык ассемблера

Сегодня программисты редко пишут программы на машинном языке. Вместо этого они используют более понятные языки ассемблера или языки высокого уровня. Эти языки частично ответственны за широкое использование компьютеров в настоящее время.

Программисты, обремененные программированием на машинном языке, начали использовать сокращения, похожие на английские, для различных инструкций машинного языка. Эти аббревиатуры, называемые мнемоникой (вспомогательные средства запоминания), относятся к действию, которое необходимо предпринять, и имеют больше смысла для программиста. Например, вместо того, чтобы писать «+ 20» для обозначения сложения, программист может написать мнемоническое «ДОБАВИТЬ»; «SUB» может использоваться для вычитания, «DIV» — для деления и т.п. Даже местам хранения были даны имена. Если бы ячейка 92 содержала сумму, ее можно было бы назвать «ИТОГО» или «СУММА» вместо 92. Получившиеся в результате программы было намного легче понять и модифицировать. Например, в программе начисления заработной платы, которая вычитает общие вычеты из валовой заработной платы для расчета чистой заработной платы, могут появиться следующие инструкции на ассемблере:

К сожалению, компьютеры не могли понять эти программы, поэтому мнемоники все равно приходилось переводить на машинный язык для обработки. В профессии программиста возникла аристократия. «Высший класс» состоял из программистов, которые писали программы с использованием англоподобной мнемотехники. Затем «простолюдины», которых называли ассемблерами, брали эти программы и вручную переводили их на машинный язык — довольно механическая работа. В 1950-х годах программисты поняли, что этот перевод может быть выполнен компьютерами быстрее и точнее, чем люди, и поэтому была написана первая программа на ассемблере, или программа-переводчик (рис. 9-1). Программа инструкций, написанная на языке ассемблера, известна как исходная программа; программа на ассемблере переводит ее в программу на машинном языке, называемую объектной программой.

Рисунок 9-1.Программа на ассемблере переводит программу на языке ассемблера (исходную программу) в программу на машинном языке (объектную программу).

Программы можно было писать быстрее на языке ассемблера, чем на машинном языке, хотя их все равно приходилось переводить на машинный язык, прежде чем они могли быть выполнены (см. рис. 9-2). Работа по переводу была более чем оправдана благодаря увеличению скорости программирования и уменьшению количества ошибок.

Рисунок 9-2. Пример мнемоники на языке ассемблера, используемой в некоторых мейнфреймах IBM. Полный набор инструкций предлагает около 200 мнемонических кодов. Коды операций показаны в шестнадцатеричной системе счисления (с основанием 16).

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

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

Макроинструкции

Следующим шагом в процессе эволюции стало введение макрокоманд . Макроинструкция — это одна инструкция, которая транслируется в несколько инструкций машинного языка. С помощью одной макрокоманды программист может указать действие, для которого обычно требуется несколько инструкций на языке ассемблера. Например, простой макрос SUM A, B, C может использоваться для добавления A к B и сохранения результатов в C.

Всякий раз, когда программа на ассемблере сталкивается с макрокомандой, она сначала выполняет раскрытие макроса. Он создает серию инструкций на языке ассемблера для выполнения функции макроса. Например, СУММА A, B, C может быть расширена до

а затем ассемблер переводил эти инструкции на машинный язык.

Изучение вычислительного языка (обновление главы 15)

Менно ван Заанен, Коллин де ла Игуэра, Справочник по логике и языку (второе издание), 2011 г.

16.1 Введение

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

Голд (1967) чуть позже предложил объединяющую парадигму под названием идентификация в пределе, а термин грамматический вывод, по-видимому, появился в докторской диссертации Хорнинга (1969).

Вне области лингвистики исследователи и инженеры, занимающиеся распознаванием образов, под влиянием Фу (1974) изобрели алгоритмы и изучали подклассы языков и грамматик с точки зрения того, что можно или нельзя изучить ( Фу и Бут, 1975 г.).

Исследователи в области машинного обучения занимались смежными проблемами (самой известной из них была задача вывода детерминированного конечного автомата на основе примеров и контрпримеров строк). Angluin (1981, 1987) ввел важную настройку активного обучения или обучения на основе запросов, в то время как Питт и Вармут (1993) и Питт (1989) дали несколько результатов, вдохновленных сложностью. , показывая сложность различных проблем обучения.

В более прикладных областях, таких как вычислительная биология, исследователи также работали над изучением грамматик или автоматов из строк, например Brazma et al. (1998) . Точно так же, исходя из компьютерной лингвистики, можно указать на работы, связанные с изучением языка с более сложными грамматическими формализмами (Канадзава, 1998), более статистическими подходами, основанными на построении языковых моделей, или различными системами, введенными для автоматического построения грамматик из предложений (Адриаанс , 1992; ван Заанен, 2000). Обзоры связанных работ в конкретных областях можно найти у Сакакибара (1997 г.), де ла Хигера (2005 г.) и Вольф (2006 г.) .

При рассмотрении истории теории формального обучения можно выделить несколько тенденций. Из «интуитивных» подходов, описанных в ранних исследованиях, возникли более фундаментальные идеи. Основываясь на этих идеях и более широком доступе данных, больше исследований было направлено на прикладное изучение языков.В последнее время наблюдается тенденция требовать более теоретически обоснованных доказательств в прикладной области, в основном из-за увеличения размера проблем и важности наличия гарантий на результаты. Эти тенденции привели к междисциплинарному характеру формального изучения языка. Здесь можно найти аспекты изучения естественного языка (как области применения), машинного обучения и теории информации.

При попытке найти общие черты работы в области изучения языков следует учитывать как минимум два аспекта. Обучение происходит в обстановке. Проблемы в этом измерении — это свойства обучающих данных, такие как положительные/отрицательные экземпляры, количество или уровень шума, а также мера успеха. Другое измерение связано с парадигмами в отношении обобщения обучающих данных. Цель изучения языка состоит в том, чтобы найти язык, который используется для генерации обучающих данных. Этот язык обычно более общий, чем обучающие данные, и требует подхода к обобщению.

Эта глава организована по параметрам обучения и парадигм. Во-первых, мы рассмотрим различные настройки обучения и их параметры. Во-вторых, обсуждаются различные парадигмы обучения, после чего делается вывод.

Компьютер представляет собой сложную систему, состоящую из множества различных компонентов. Но в сердце — или, если хотите, в мозгу — компьютера находится единственный компонент, который выполняет фактические вычисления. Это центральный процессор или центральный процессор. В современном настольном компьютере ЦП представляет собой один «чип» размером порядка одного квадратного дюйма. Работа процессора заключается в выполнении программ.

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

Когда ЦП выполняет программу, эта программа сохраняется в основной памяти компьютера (также называемой ОЗУ или оперативной памятью). В дополнение к программе в памяти также могут храниться данные, которые используются или обрабатываются программой. Основная память состоит из последовательности ячеек. Эти местоположения пронумерованы, а порядковый номер местоположения называется его адресом. Адрес обеспечивает способ выбора одной конкретной части информации из миллионов, хранящихся в памяти. Когда ЦП необходимо получить доступ к программной инструкции или данным в определенном месте, он отправляет адрес этой информации в качестве сигнала в память; память отвечает, отправляя обратно данные, содержащиеся в указанном месте. ЦП также может хранить информацию в памяти, указав информацию, которая должна быть сохранена, и адрес места, где она должна быть сохранена.

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

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

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

Инструкции машинного языка выражаются в виде двоичных чисел. Двоичное число состоит всего из двух возможных цифр, нуля и единицы. Итак, инструкция машинного языка — это просто последовательность нулей и единиц. Каждая конкретная последовательность кодирует определенную инструкцию. Данные, которыми манипулирует компьютер, также кодируются в виде двоичных чисел. Компьютер может работать напрямую с двоичными числами, потому что переключатели могут легко представлять такие числа: включите переключатель, чтобы представить единицу; выключите его, чтобы представить ноль. Инструкции на машинном языке хранятся в памяти в виде комбинаций включенных и выключенных переключателей. Когда инструкция на машинном языке загружается в ЦП, все, что происходит, это то, что определенные переключатели включаются или выключаются в шаблоне, кодирующем эту конкретную инструкцию. ЦП устроен так, чтобы реагировать на этот шаблон, выполняя закодированную им инструкцию; он делает это просто из-за того, что все остальные переключатели в ЦП соединены вместе.

Итак, вы должны понимать, как работают компьютеры: основная память содержит программы и данные на машинном языке. Они кодируются как двоичные числа. ЦП извлекает инструкции машинного языка из памяти одну за другой и выполняет их. Он делает это механически, не задумываясь и не понимая, что он делает, и поэтому исполняемая им программа должна быть совершенной, завершенной во всех деталях и однозначной, потому что центральный процессор не может ничего сделать, кроме как выполнить ее точно так, как она написана. Вот схематическое изображение этого первого этапа понимания компьютера:

Как ваш компьютер узнает, как запускать программы? Как он переводит код из приложения в действие? Вот как это работает.

Изображение предоставлено: Марчин Вичари/Flickr

Общеизвестно, что код пишется разработчиком и как люди взаимодействуют с компьютерами. Однако задумывались ли вы когда-нибудь о том, как программное обеспечение, такое как код, взаимодействует с компьютерным оборудованием, таким как ЦП (центральный процессор)? Если да, то вы попали по адресу.

Чтобы понять, как код выполняется на компьютере, вы должны понимать, что заставляет компьютер работать и как им можно манипулировать. Во-первых, давайте сначала поговорим об основных принципах компьютерного оборудования, прежде чем переходить к программному обеспечению.

Что такое двоичный файл?

Двоичная система — это система счисления с основанием 2, которую процессоры и память используют для выполнения кода. Двоичные числа могут быть только 1 или 0, отсюда и их название. Если вы сгруппируете восемь двоичных чисел (00000000), вы получите то, что известно как байт, а одно двоичное число (0) называется битом.

Как простой переключатель формирует бинарные сигналы

Все логичное, связанное с компьютерными вычислениями, начинается с простого переключателя. Простой выключатель имеет два проводника и соединительно-разъединительный механизм. Соединение обоих проводников позволяет течь току, который создает сигнал на другом конце проводника. С другой стороны, если проводники отсоединены, ток не будет течь, а значит, и сигнала не будет.

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

Когда вы щелкаете переключателем, он генерирует сигнал или один бит данных. Обычная фотография, сделанная со смартфона, будет содержать около пяти мегабайт данных, что соответствует 40 000 000 битам. Это означает, что вам придется щелкать переключателем десятки миллионов раз, чтобы получить достаточно данных для одной фотографии, сделанной со смартфона.

Учитывая механические ограничения переключателя, инженерам требовалось устройство, не имеющее движущихся частей и обеспечивающее более высокую скорость переключения.

Транзисторы, используемые в качестве переключателя

Изображение транзистора: Эван-Амос/Викимедиа, изображение прямоугольной волны: Sponk/Викимедиа

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

Что такое архитектура процессора?

Транзисторы затем искусно скомпонованы для создания логических вентилей, полусумматоров, сумматоров, триггеров, мультиплексоров, регистров и различных компонентов, обеспечивающих функционирование ЦП. То, как эти компоненты расположены друг над другом, определяет так называемую архитектуру ЦП.

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

Вот пример набора инструкций:

Каждая инструкция в наборе инструкций имеет собственный двоичный адрес, известный как код операции. Код операции будет первыми несколькими двоичными битами, которые сообщают, какую операцию из набора инструкций использовать.

За кодом операции следует операнд. Операнд содержит значения и адреса, по которым будет использоваться код операции.

Ассемблер

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

Например, если наш ассемблер использует стандарт ASCII (американский стандартный код для обмена информацией), наш ассемблер возьмет заданный машинный код и интерпретирует его так же, как из ASCII в таблице ниже.

< td>Y < td>00111101 < td>W
00101001 A 00101111 G 00110101 M 00111011 S 01000001
00101010 B 00110000 H 00110110 N 00111100 T 01000010 Z
00101011 C 00110001 I 00110111 0 U
00101100 D 00110010 J 00111000 P 00111110 V
00101101 E 00110011 K 00111001 Q 00111111
00101110 F 00110100 L 00111010 R 0100000 X

Понимание языка ассемблера

Язык ассемблера – это удобочитаемый язык программирования низкого уровня, который напрямую управляет кодами операций и операндами архитектуры ЦП.

Вот пример простого ассемблерного кода, использующего показанный ранее набор инструкций:

Этот блок кода хранится в ОЗУ до тех пор, пока ЦП не выберет каждую строку кода одну за другой.

Цикл выборки, декодирования и выполнения ЦП

ЦП выполняет код в цикле, известном как выборка, декодирование и выполнение. Эта последовательность показывает, как ЦП обрабатывает каждую строку кода.

Выборка. Счетчик инструкций внутри ЦП берет одну строку инструкции из ОЗУ, чтобы сообщить ЦП, какую инструкцию выполнять следующей.

Декодирование: Ассемблер декодирует удобочитаемый блок кода и собирает его в правильно отформатированные двоичные файлы для понимания компьютером.

Выполнение: ЦП затем выполняет двоичные файлы, применяя инструкции, указанные кодом операции, к предоставленным операндам.

Компьютер выполнит его следующим образом:

  1. Загрузить первый регистр со значением 5
  2. Загрузить второй регистр со значением 7
  3. 5 + 7 = 12, сохранить 12 в третьем регистре
  4. Сохраните значение третьего регистра по адресу RAM M12

Компьютер успешно сложил два числа и сохранил значение по указанному адресу ОЗУ.

Отлично! Теперь вы знаете, как компьютер выполняет код. Однако это не останавливается на достигнутом.

Дальше

При наличии надлежащего оборудования, ассемблера и языка ассемблера люди могли выполнять код с достаточной легкостью. Однако по мере того, как и программы, и компьютерное оборудование становились все более сложными, инженеры и программисты должны были придумать способ сделать программирование менее утомительным и обеспечить совместимость с различными типами архитектуры ЦП. Таким образом, создание компиляторов и интерпретаторов.

Что такое компилятор и интерпретатор?

Компилятор и интерпретатор — это трансляционные программы, которые берут исходный код (программы, созданные на языках программирования высокого уровня) и переводят их на язык ассемблера, который затем ассемблер декодирует в двоичный код.

Интерпретатор возьмет одну строку кода и немедленно выполнит ее. Обычно это используется на терминалах, таких как терминал Linux Bash Shell и терминал Windows PowerShell. Отлично подходит для выполнения простых разовых задач.

Изображение предоставлено: Rlistmedia/Wikimedia Common

Напротив, компилятор берет несколько строк кода и компилирует их для создания программы. Примерами таких программ могут быть Microsoft Word, Photoshop, Google Chrome, Safari и Steam.

С созданием компиляторов и интерпретаторов были созданы языки программирования высокого уровня.

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

Языки программирования высокого уровня — это любой язык после ассемблерного кода. Некоторые из этих языков, с которыми вы, возможно, знакомы, — это C, Python, Java и Swift. Эти языки программирования сделали программирование более понятным и простым, чем язык ассемблера.

В этом параллельном сравнении показано, насколько сложнее программировать на ассемблере, чем на таком высокоуровневом языке программирования, как Python:

Оба кода будут печатать "Hello World".

С помощью этих языков программирования разработчики могут программировать игры, веб-сайты, приложения и драйверы с разумными затратами времени.

Компьютеры могут выполнять любой код

Компьютер — это устройство, которое может читать только двоичные файлы. Эти двоичные файлы создаются более чем миллиардом транзисторов микроскопических размеров, упакованных внутри процессора. Расположение транзисторов диктует ISA ЦП (архитектура набора инструкций), которая предоставляет сотни инструкций, которые ЦП может легко выполнить, как только его код операции вызывается через код. Разработчики последовательно смешивают и сопоставляют эти инструкции, в результате чего создается целая программа, включающая игровые движки, веб-браузеры, приложения и драйверы.

ЦП выполняет код в последовательности, известной как цикл выборки, декодирования, выполнения. Как только фрагмент кода загружается в ОЗУ, ЦП извлекает его содержимое один за другим, декодирует содержимое в двоичный файл с помощью ассемблера, а затем выполняет код.

Поскольку ассемблер может преобразовывать только код, специально созданный для архитектуры ЦП, компиляторы и интерпретаторы были созданы на основе ассемблера (во многом как адаптер) для работы с различными типами архитектуры ЦП. Интерпретатор возьмет одну команду и немедленно выполнит ее. Напротив, компилятор возьмет все ваши команды и скомпилирует их в программу многократного использования.

Языки программирования высокого уровня, такие как Python, C и Java, были созданы, чтобы сделать программирование проще, быстрее и удобнее. Подавляющему большинству программистов больше не нужно кодировать на ассемблере, поскольку их простые в использовании языки программирования высокого уровня можно преобразовать в ассемблере с помощью компилятора.

Надеюсь, теперь вы лучше понимаете основы работы компьютеров и то, как они выполняют код.

Жаждущий узнать, как все устроено, Джейрик Манинг начал возиться со всеми видами электронных и аналоговых устройств еще в подростковом возрасте. Он занялся криминалистикой в ​​Университете Багио, где познакомился с компьютерной криминалистикой и кибербезопасностью. В настоящее время он много занимается самообразованием и экспериментирует с технологиями, выясняя, как они работают и как мы можем использовать их, чтобы сделать жизнь проще (или, по крайней мере, круче!).

Подпишитесь на нашу рассылку

Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!

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

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

Компилируемые языки (например, C, C++)

Следующее иллюстрирует процесс программирования для скомпилированного языка программирования.

Компилятор берет программный код (исходный код) и преобразует исходный код в модуль машинного языка (называемый объектным файлом). Другая специализированная программа, называемая компоновщиком, объединяет этот объектный файл с другими ранее скомпилированными объектными файлами (в частности, модулями времени выполнения) для создания исполняемого файла. Этот процесс изображен на схеме ниже. Нажмите Начальная сборка, чтобы увидеть анимацию создания исполняемого файла. Щелкните Запустить исполняемый файл, чтобы имитировать запуск уже созданного исполняемого файла. Нажмите «Перестроить», чтобы имитировать перестроение исполняемого файла.

Исходная сборка Запустить исполняемый файл Rebuild

Таким образом, для скомпилированного языка преобразование исходного кода в исполняемый код происходит до запуска программы. Этот процесс сильно отличается от того, что происходит в интерпретируемом языке программирования.

Это несколько упрощено, так как многие современные программы, созданные с использованием скомпилированных языков, используют динамически подключаемые библиотеки или общие библиотеки.Поэтому для запуска исполняемого файла могут потребоваться эти динамические связанные библиотеки (Windows) или общие библиотеки (Linux, Unix).

Интерпретируемые языки программирования (например, Python, Perl)

Для интерпретируемого языка этот процесс отличается. Вместо перевода исходного кода на машинный язык до создания исполняемого файла интерпретатор преобразует исходный код на машинный язык во время работы программы. Это показано ниже:

В интерпретируемых языках используется специальная программа, называемая интерпретатором, которая преобразует исходный код, объединяется с библиотеками времени выполнения и выполняет полученные машинные инструкции во время выполнения. В отличие от скомпилированного языка, здесь нет предварительно скомпилированной программы для запуска. Процесс преобразования и объединение с библиотеками времени выполнения происходит каждый раз, когда запускается программа на интерпретируемом языке. Вот почему программы, написанные на скомпилированных языках, работают быстрее, чем аналогичные программы, написанные на интерпретируемых языках. Нажмите Start, чтобы запустить симуляцию интерпретируемой программы. Нажмите «Перезапустить», если хотите снова запустить симуляцию.

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

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

А теперь кое-что другое. Java

Язык программирования Java не вписывается ни в модели компилируемого языка, ни в модели интерпретируемого языка. Это показано на рисунке ниже.

Компилятор Java (javac) преобразует исходный код в байт-код. Байт-код — это своего рода средний машинный язык. Этот файл байт-кода (файл .class) можно запустить в любой операционной системе с помощью интерпретатора Java (java) для этой платформы. Интерпретатор называется виртуальной машиной. Таким образом, Java является примером языка программирования для виртуальных машин.

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

Способ, которым языки программирования виртуальных машин получают часть скорости компилируемых языков, заключается в том, что исходный код пропускается через компилятор для создания байт-кода. Это преобразование происходит до запуска программы. Способ, которым языки виртуальных машин достигают своей переносимости (независимости от платформы), заключается в наличии разных интерпретаторов для каждой поддерживаемой операционной системы. Этот интерпретатор связывает правильные библиотеки времени выполнения для каждой операционной системы. Скомпилированный байт-код представляет собой средний машинный язык, который будет работать без изменений с любым интерпретатором виртуальной машины для этого языка. Этот процесс проиллюстрирован далее. У нас есть компилятор, который преобразует исходный код в байт-код. Это можно смоделировать, нажав кнопку Compile. После создания байт-кода этот же байт-код можно использовать без каких-либо изменений в любой операционной системе, имеющей интерпретатор виртуальной машины для языка программирования. Обратите внимание, что каждый интерпретатор виртуальной машины имеет разный код библиотеки времени выполнения, потому что каждая операционная система имеет разные библиотеки времени выполнения. Вот как язык виртуальной машины решает проблемы зависимости от платформы. Нажмите «Запустить Windows», «Запустить Mac OSX» или «Запустить Linux», чтобы имитировать запуск программы в любой из этих операционных систем.

Читайте также: