"Все программы интерпретируются". Как?

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

Как интерпретируются все программы?

Ответы

Ответ 1

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

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

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

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

Физики в настоящее время разрабатывают, что делает эти правила и как они интерпретируются.


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


EDIT/ADDED: я знаю, что это немного немного вскользь, поэтому позвольте мне добавить немного меньше глупого дополнения:

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

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

Последнее легко легко превратить в первое простым преобразованием:

Сделайте программу под названием interpreted-c, которая может принимать один или несколько файлов C и может запускать программу, которая не принимает никаких аргументов:

#!/bin/sh
MYEXEC=/tmp/myexec.$$
gcc -o $MYEXEC ${1+"[email protected]"} && $MYEXEC
rm -f $MYEXEC

Теперь, в какое определение входит ваша программа C? Сравните и сравните:

$ perl foo.pl
$ interpreted-c foo.c

Ответ 2

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

EDIT:

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

Пример: многие дистрибутивы Linux выпущены только как 686, несмотря на то, что это в семействе x86. Это связано с использованием новых инструкций.

Ответ 3

Моя первая мысль была слишком заглянуть внутрь CPU — см. ниже. но это не так. Ответ намного проще, чем это.

Высокоуровневое описание CPU:

1. execute the current op
2. grab the next op
3. goto 1

Сравните его с интерпретатором Perl:

while ((PL_op = op = op->op_ppaddr(aTHX))) {
}

(Да, это все.)

Не может быть никаких сомнений в том, что ЦП является интерпретатором.

Он просто показывает, как бесполезно классифицировать что-то интерпретируется или нет.


Оригинальный ответ:

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

Еще глубже каждая инструкция считается собственной программой, которая маршрутизирует электронные сигналы. См. Микрокод.

Ответ 4

Уровни интерпретаций очень легко объяснить:

2: Runtimelanguage (CLR, Java Runtime...) и Scriptlanguage (Python, Ruby...)

1: Ассембли

0: двоичный код

Изменить: я изменил уровень Scriptinglanguages ​​на тот же уровень Runtimelanguages. Спасибо за подсказку.: -)

Ответ 5

Я могу написать интерпретатор Game Boy, который работает аналогично тому, как работает виртуальная машина Java, рассматривая машинные инструкции z80 как байтовый код. Предполагая, что оригинал был написан в C 1 означает ли это, что C внезапно стал интерпретированным языком только потому, что я использовал его как один?

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

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

Когда вы начнете думать по этим строкам, вы получите много энергии.

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

1 Я думаю, что большинство игр Boy Boy были ручной кодировкой ASM, но принцип остается.