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

Обновлено: 07.07.2024

    Напомним, что память компьютера содержит кучу двоичных цифр (= битов):

    <УЛ> Часть байтов памяти содержит коды инструкций компьютерной программы

    <УЛ> Все, что хранится внутри компьютера (в памяти), представлено:

    В CS170/CS171 вы пишете программу на языке программирования высокого уровня, таком как Java

    <УЛ> Компьютер не может выполнять инструкции на языке программирования высокого уровня .

    <УЛ> Компилятор (например: javac) преобразует операторы (команды), написанные на языке программирования высокого уровня, в последовательность машинных инструкций, которая обеспечивает эффект (= результат) операторов.

Например: когда вы запускаете javac в исходной программе Java, он создает выходной файл (с расширением .class ), содержащий машинные инструкции:

    Компилятор Java создает машинные инструкции с помощью одной единственной команды (например, javac )

Как правило, перевод программы состоит из двух (2) шагов:

    На первом этапе компилятор транслирует программные конструкции высокого уровня в эквивалентную программу, написанную на языке ассемблера

Эта программа называется программой на ассемблере

<УЛ> <УЛ>
  • Язык ассемблера – это язык программирования низкого уровня, состоящий из nmonics, используемых для представления двоичных кодов машинных инструкций (поэтому вместо запоминания двоичных чисел, таких как 10101010101010101010 , вы можете написать его nmonics, добавив R0, R1, R2 )
  • Этот двухэтапный процесс является результатом исторического развития:

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

    Этот процесс был очень подвержен ошибкам!!

    Программирование в двоичном коде машинных инструкций было названо: язык программирования 1st Generate

      <УЛ> Существует взаимно однозначное соответствие между nmonics ассемблера и кодами двоичных машинных инструкций

    Теперь программисты могут писать nmonics (например, добавлять R0,R1,R2 ) вместо двоичных кодов машинных инструкций

      <УЛ> Поскольку между nmonics ассемблера и двоичными кодами машинных инструкций существует однозначное соответствие, программы на ассемблере сильно зависят от машины.

    Язык ассемблера называется языком программирования 2-го поколения, и программа транслируется ассемблером

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

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

      <УЛ> Стандартизация языков программирования высокого уровня также позволяет «переносить» программу, написанную на языке программирования высокого уровня, на различные типы компьютеров.

    Я уже писал об эволюции языков программирования и сохранил веб-страницу здесь — вы можете прочитать ее для получения дополнительной информации: нажмите здесь

      <УЛ> Программа на C (C очень похож на Java) переводится следующим образом:

    Сначала компилятор C транслирует исходную программу C в эквивалентную программу, написанную на языке программирования на ассемблере (немонике)

    Я проиллюстрирую этот процесс в классе, используя приведенную ниже команду

      <УЛ> Взгляните на следующую программу C: /home/cs255000/demo/c-asm/main.c

    cc255 (компилятор C для 255) создаст программу на ассемблере main.s :

    Есть много вещей, которые вам не нужно понимать; но суть такова:

    <УЛ> <УЛ>
  • В этом примере показано, как компилятор преобразует операторы программы высокого уровня (C) в инструкции ассемблера, которые выполняют ту же операцию (добавить!), что и операторы программы высокого уровня
  • Значит, Java/C — это искусственный язык для компьютера.

    Язык, который использует компьютер: язык ассемблера.

    Компилятор C вызовет ассемблер для создания машинного (объектного) программного кода main.o

    Вы можете просмотреть содержимое (двоичного) объектного файла с помощью этой команды:

    Вы увидите этот вывод:

    Список шестнадцатеричных чисел, выделенных красным, представляет собой двоичные коды машинных инструкций.

    (Синий текст содержит исходные инструкции ассемблера ).

      <УЛ> Язык программирования на ассемблере = машинно-зависимый язык программирования, тесно связанный с машинным языком компьютера

    <УЛ> <УЛ>
  • Каждая инструкция на языке ассемблера соответствует (уникально) одной инструкции на машинном языке.
    • Большинство профессионалов компьютерных технологий никогда не будут писать программы на ассемблере.

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

    Синтаксис относится к правописанию и грамматике языка программирования. Компьютер — это программируемая машина.

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

    2. Как мы переводим решения для компьютерных программ? Каковы ограничения?

    В информатике решения записываются в виде программ.

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

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

    Язык высокого уровня (HLL) – это язык программирования, такой как C, FORTRAN или Pascal, который позволяет программисту писать программы, более или менее независимые от конкретного типа компьютера.

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

    3. Сколько существует языков программирования? О чем вам говорит это число?

    Существует много языков программирования — C, C++, Pascal, BASIC, FORTRAN, COBOL и LISP — это лишь некоторые из них. Все это языки высокого уровня.

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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


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

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

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

    ЭТА СТРАНИЦА СОДЕРЖИТ ПРИМЕРЫ ОТВЕТОВ на викторину по главе 1 этого интерактивного учебника по Java. Обратите внимание, что во многих случаях существует множество правильных ответов на заданный вопрос.

    Вопрос 1. Одним из компонентов компьютера является его ЦП. Что такое ЦП и какую роль он играет в компьютере?

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

    Вопрос 2. Объясните, что подразумевается под "асинхронным событием". Приведите несколько примеров.

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

    Вопрос 3: В чем разница между «компилятором» и «интерпретатором»?

    Ответ: У компиляторов и интерпретаторов схожие функции: они берут программу, написанную на некотором языке программирования, и переводят ее на машинный язык. Компилятор выполняет перевод сразу. Он создает полную программу на машинном языке, которую затем можно выполнить. Интерпретатор, с другой стороны, просто переводит одну инструкцию за раз, а затем немедленно выполняет эту инструкцию. (Java использует компилятор для преобразования программ Java в байт-код Java, который является машинным языком для воображаемой виртуальной машины Java. Затем программы байт-кода Java выполняются интерпретатором.)

    Вопрос 4. Объясните разницу между языки высокого уровня и машинный язык.

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

    Вопрос 5 : Если у вас есть исходный код программы Java и вы хотите запустить эту программу, вам потребуются как компилятор, так и интерпретатор. Что делает компилятор Java , и что делает интерпретатор Java?

    Ответ: Компилятор Java переводит программы Java в язык, называемый байт-кодом Java. Хотя байт-код похож на машинный язык, он не является машинным языком реального компьютера. Интерпретатор Java используется для запуска скомпилированной программы байт-кода Java. (Каждому типу компьютеров требуется свой собственный интерпретатор байт-кода Java, но все эти интерпретаторы интерпретируют один и тот же язык байт-кода.)

    Вопрос 6: Что такое подпрограмма?

    < p> Ответ: Подпрограмма — это набор инструкций для выполнения какой-либо задачи, которые были сгруппированы вместе и получили имя. Позже, когда эта задача должна быть выполнена, достаточно вызвать подпрограмму, указав ее имя, а не повторять всю последовательность инструкций.

    Вопрос 7: Java — это объектно-ориентированный язык программирования. . Что такое объект?

    Ответ: Объект состоит из некоторых данных вместе с набором подпрограмм, которые манипулируют этими данными. (Объект — это своего рода «модуль» или автономный объект, который взаимодействует с остальным миром через четко определенный интерфейс. Объект должен представлять некоторую связную концепцию или объект реального мира.)

    < p> Вопрос 8: Что такое переменная? (Есть четыре разных понятия, связанных с переменными в Java. Постарайтесь упомянуть в своем ответе все четыре аспекта. Подсказка: один из аспектов — это имя переменной. )

    Ответ: Переменная — это ячейка памяти, которой присвоено имя, чтобы на нее можно было легко ссылаться в программе. Переменная содержит значение, которое должно быть определенного типа. Значение может быть изменено в процессе выполнения программы.

    Вопрос 9: Java является "платформенно-независимым языком". Что это значит?

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

    Вопрос 10: Что такое "Интернет"? Приведите несколько примеров его использования. (Какие услуги он предоставляет?)

    Ответ: Интернет — это сеть, соединяющая миллионы компьютеров по всему миру. Компьютеры, подключенные к Интернету, могут взаимодействовать друг с другом. Интернет можно использовать для Telnet (который позволяет пользователю одного компьютера удаленно подключаться к другому компьютеру), FTP (который используется для копирования файлов между компьютерами) и World Wide Web (который позволяет просматривать «страницы» информации). опубликовано на компьютерах по всему миру.

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