"Все программы интерпретируются". Как?
Ученый-компьютер правильно объяснит, что все программы интерпретируется и что единственный вопрос - на каком уровне. - 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, но принцип остается.