«Все программы интерпретируются». Как? - PullRequest
14 голосов
/ 16 июля 2011

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

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

Ответы [ 5 ]

19 голосов
/ 16 июля 2011

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

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

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

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

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


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


РЕДАКТИРОВАТЬ / ДОБАВИТЬ : Я знаюВышеприведенное выглядит немного ненормально, поэтому позвольте мне добавить немного менее глупое дополнение:

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

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

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

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

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

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

$ perl foo.pl
$ interpreted-c foo.c
6 голосов
/ 16 июля 2011

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

EDIT:

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

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

5 голосов
/ 16 июля 2011

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

Описание процессора высокого уровня:

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

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

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

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

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

Это просто показывает, насколько бесполезно классифицировать что-либо, интерпретировать или нет.1013 *


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

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

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

0 голосов
/ 17 июля 2011

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

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

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

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

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

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

0 голосов
/ 16 июля 2011

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

2: язык выполнения (CLR, среда выполнения Java ...) и язык сценариев (Python, Ruby ...)

1: сборки

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

Редактировать: Я изменил уровень языков сценариев на тот же уровень языков времени выполнения. Спасибо за подсказку. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...