Как компьютер понимает язык программирования

Обновлено: 21.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 г.) .

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

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

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

Коды языков высокого уровня записываются в форме, понятной человеку. Компьютеры понимают только машинный код — они не понимают код языка высокого уровня.

Любой код языка программирования высокого уровня должен быть преобразован в исполняемый код. Исполняемый код, также известный как машинный код, представляет собой комбинацию двоичного кода 0 и 1.

Давайте посмотрим, как код высокого уровня преобразуется в машинный код.

Препроцессор

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

Компиляция предварительно обработанного файла

На этапе компиляции в действие вступает компилятор. Он принимает временный предварительно обработанный файл «filename.i», сгенерированный препроцессором, и выполняет некоторые задачи. Он проверяет любые синтаксические ошибки и переводит файл в файл языка ассемблера. После компиляции он генерирует промежуточный код на ассемблере и сохраняет его как файл «filename.s». Ниже приведен пример простой программы Hello World на C и ассемблере.

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

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

Язык ассемблера – это низкоуровневый язык программирования, зависящий от процессора или аппаратного обеспечения. Его можно создать путем компиляции языка высокого уровня, но программист может программировать непосредственно на языке ассемблера. Инструкции по сборке отличаются от аппаратного обеспечения к аппаратному, но в основном они одинаковы для разных процессоров и аппаратных средств. Ниже приведены некоторые инструкции по сборке процессора x86.

  • MOV – перемещение данных из одного места в другое.
  • ДОБАВИТЬ – добавить два значения
  • SUB – вычесть значение из другого значения
  • PUSH – поместить данные в стек.
  • POP – извлечь данные из стека.
  • JMP – перейти в другое место
  • INT — прервать процесс

Каждый процессор имеет свой набор инструкций, которые указаны в техническом описании процессора

Мнемоника

В языке ассемблера мнемоники используются для указания кода операции, часто называемого кодом операции, который представляет инструкцию на языке операционной машины. Затем мнемоники транслируются ассемблером для генерации объектного кода. Например, мнемоника SUB используется в ассемблере для вычитания одного операнда из другого в памяти.

Ассемблер

На этом этапе ассемблер переводит сборку в объектный код. Ассемблер — это инструмент, который переводит ассемблерный код в машинный код. Ассемблер преобразует ассемблерный код, созданный в процессе компиляции, в 0 и 1, которые могут быть распознаны процессором или оборудованием.

Линкер

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

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

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

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

Обычно программист пишет инструкции на выбранном языке более высокого уровня, в нашем случае на Java, и эти инструкции или исходный код хранятся в текстовом виде в файле. Затем этот исходный файл передается программе, называемой компилятором, которая переводит исходный язык в объектный код в двоичной форме и записывает его в другой файл, называемый программой. Примером может служить файл .exe в Windows. Может быть дополнительный шаг, называемый связыванием, который представляет собой процесс объединения инструкций программиста с библиотеками инструкций, созданными кем-то другим. Иногда файл программы может быть отправлен на другой компьютер для исполнения. Это называется развертыванием.

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

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

Как же на самом деле работает программирование? Короткий ответ: написание кода говорит компьютеру, что делать, но это не так просто.

Итак, вот более длинный ответ. Компьютер может понимать только два различных типа данных: включено и выключено. На самом деле компьютер — это просто набор переключателей (транзисторов). Все, что может сделать компьютер, — это не что иное, как уникальная комбинация некоторых включенных и выключенных транзисторов.

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

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

Здесь на помощь приходят языки программирования…

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

Вот простой пример кода:

Эта строка кода написана на языке программирования Python. Проще говоря, язык программирования (или кодирования) — это набор правил синтаксиса, которые определяют, как код должен быть написан и отформатирован.

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

Почему у нас так много языков?

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

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

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

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

Почти все основные используемые сегодня языки программирования являются языками высокого уровня.

Программы

Программа — это просто текстовый файл, написанный на определенном языке программирования. Код внутри файла программы называется исходным кодом. Каждый язык кодирования имеет собственное расширение файла для идентификации файлов кода, написанных на этом языке. Например, Python — это «.py».

Чтобы создать программу, вы пишете код в обычном текстовом редакторе, таком как Блокнот, и сохраняете файл на свой компьютер. Вот и все. Например, приведенная ниже строка кода может быть содержимым очень короткой программы на Python с именем hello.py:

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

Например, программный файл JavaScript будет запускаться веб-браузером, таким как Chrome. Программный файл PHP будет запускаться веб-сервером, таким как LAMP.

В случае с нашим файлом hello.py язык Python поставляется с командной строкой, которая будет отображать выходные данные программы — текст «Hello, world!». Если вы введете код в командную строку и нажмете Enter, программа запустится и команда будет выполнена.

Что происходит, когда вы запускаете программу

На самом деле компьютер не понимает фразу "Hello, world!" и не знает, как отобразить ее на экране. Он понимает только вкл и выкл. Таким образом, чтобы запустить команду типа print «Hello, world!» , он должен преобразовать весь код программы в ряд включений и выключений, которые он сможет понять.

Для этого происходит ряд вещей:

  1. Исходный код переведен на язык ассемблера.
  2. Код сборки переводится на машинный язык.
  3. Машинный язык выполняется непосредственно как двоичный код.

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

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

Заключение

Разве не удивительно думать, что что-то настолько обманчиво простое и примитивное, как двоичный код, может создавать такие же сложные вещи, как то, что происходит внутри компьютера?

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

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

Раскрытие существенной связи. Некоторые ссылки в сообщении выше являются «партнерскими ссылками». Это означает, что если вы нажмете на ссылку и купите товар, я получу партнерскую комиссию. Тем не менее, я рекомендую только те продукты или услуги, которыми пользуюсь лично и считаю, что они принесут пользу моим читателям.

Можем ли мы научить компьютер определенному языку программирования? Это работа в процессе, но пока нет четкого способа научить компьютер языку. Что было сделано, так это запрограммировать компьютер на понимание языка. На самом деле компьютер не изучает язык; вместо этого он анализирует язык и делает то, что ему говорят строки кода.

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

На один уровень выше

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

Высшие уровни

Тот же метод можно использовать для преобразования языков программирования более высокого уровня, таких как C, C++ и других, в машинный код. После языка ассемблера идут языки, которые были изобретены, чтобы быть похожими на английский естественный язык. Это упрощает изучение и поддержку этих языков и позволяет использовать их для совместной работы.

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

Другие языки, такие как Python, Perl и TKL, называются интерпретируемыми языками. Вместо того, чтобы быть переведенными компилятором, эти языки просто читаются, инструкция за инструкцией, чем-то, что называется интерпретатором.

Если вы хотите попробовать управлять компьютером, почему бы не изучить программирование? Зарегистрируйтесь сегодня бесплатно и присоединяйтесь к RoboGarden.

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