Форум: "Прочее";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизКомпиляторы, интерпретаторы и трансляторы Найти похожие ветки
← →
Cyrax © (2006-11-20 13:44) [0]1. Трансляторы, компиляторы и интерпретаторы
Транслятор (в пер. с англ. - "переводчик") – это программа, принимающая на вход программу на одном языке и преобразующая её в программу на другом языке. Исходными и це-левыми языками могут быть как языки высокого уровня, так и низкого (промежуточный байт код или язык ассемблера), в том числе и машинный код.
Примеры трансляторов: assembler (язык ассемблера -> машинный код), дизассемблер (язык ассемблера -> машинный код), компиляторы и декомпиляторы языков высокого уровня, утилита, преобразующая pascal-код в C-код, javac (транслятор Java) и др.
Компилятор – это частный случай (разновидность) трансляторов. А именно, такой транслятор, который преобразует программу на некотором языке программирования в машинный код. В строгом понимании под машинным кодом следует понимать машинный код процессора. Именно такого понимания придерживаются авторы книги "PHP 5" Дмитрий Котеров и Алексей Костарев, рассматривающие процесс преобразования кода с языка высокого уровня на промежу-точный код (например, байт-код или p-код) как трансляцию (трансляцию в широком понимании, не относящейся к компиляции). С другой стороны, промежуточный код тоже можно рассматри-вать как машинный, только машиной уже является не процессор, а виртуальная машина (CLR для .NET и JVM для Java). Такая абстракция позволяет представить процесс преобразования кода с языка высокого уровня на промежуточный код как компиляцию (разновидность трансляции). Та-кой подход наиболее распространён. Универсальность первого подхода заключается в том, что он не противоречит второму подходу, поскольку компилятор – это транслятор.
Следует отметить, что процесс преобразования процессорного кода в промежуточ-ный нельзя рассматривать как компиляцию (это трансляция процессорного кода в промежуточ-ный), поскольку компиляция подразумевает обработку сверху вниз, т.е. от языка более высокого уровня к языку более низкого (тогда как трансляция может происходить в любом направлении, в том числе и на одном уровне (например, pascal -> С)).
Интерпретатор – это программа, "просматривающая" код на некотором языке про-граммирования и "выполняющая" одну его инструкцию за другой. Основной функцией про-грамм, транслирующих (в частности, компилирующих) и интерпретирующих код является та, ко-торая выполняется на последнем этапе работы таких программ. Поэтому программы, которые сначала транслируют (компилируют согласно второму подходу в понимании компиляторов) код на языке высокого уровня в промежуточный код, а затем его интерпретируют, называют интер-претаторами (с оптимизирующим транслятором (первый подход) или компилирующего типа (второй подход)).
Ключевые отличие интерпретаторов от компиляторов:
1. интерпретатор обнаруживает синтаксические ошибки только когда интерпретиру-ет данную инструкцию
2. интерпретируемые языки позволяют формировать и изменять команды в процессе выполнения программы (для компилируемых языков это возможно только на этапе работы пре-процессора с помощью макросов)
2. интерпретатор ещё и "выполняет" преобразуемый код (естественно, с помощью процессора)
В определении интерпретаторов также существует два подхода. Согласно первому подходу (авторы книги "PHP 5" Дмитрий Котеров и Алексей Костарев) интерпретаторы не явля-ются подмножеством трансляторов, поскольку интерпретаторы не выдают на выходе преобразо-ванного кода программы. Второй подход относит интерпретаторы к множеству трансляторов, по-скольку интерпретатор всё же транслирует инструкции в машинный код (которые сразу же вы-полняет процессор), хотя и не выдаёт преобразованный код программы.
Ниже приведена таблица, иллюстрирующая различия в подходах к пониманию трансляторов, компиляторов и интерпретаторов.
Строгий подход Абстрактный подход
Сторонники авторы книги "PHP 5" Дмитрий Ко-теров и Алексей Костарев Авторы большинства статей в Ин-тернете
Классификация программ, преобра-зующих программный код Трансляторы и интерпретаторы. Компиляторы – частный случай трансляторов Трансляторы.
Компиляторы и интерпретаторы – частные случаи трансляторов
Характеристика интерпретаторов, выполняющих предварительную трансляцию в промежуточный код Интерпретатор с оптимизирующим транслятором или интерпретирую-щий транслятор (с основной функци-ей интерпретации) Интерпретатор компилирующего типа
Чистые компиляторы: C, C++, Pascal, Assembler
Чистые интерпретаторы: Basic, JavaScript, JScript, командный язык DOS (выполняю-щий bat-файлы), shell (командный язык Unix), Python и его разновидности, JVM (виртуальная машина Java), PHP до версии 3, CLR (общеязыковая среда исполнения технологии .NET).
Интерпретаторы с оптимизирующей трансляцией: PHP с версии 4, Perl
Трансляторы в промежуточный код: .NET-языки (Visual C#, Visual J#, Visual Basic .NET, Visual C++ .NET), javac (транслятор Java).
______________________________________________________________
Зацените статью и, собственно, своё мнение (только не обо мне, а об изложенном)...
← →
Cyrax © (2006-11-20 13:46) [1]Так, с таблицеё чё-то не вышло. Сейчас будет...
← →
Александр Иванов © (2006-11-20 13:50) [2]Слишком много букв, причем о вещах, которые уже описаны в толстенных книгах.
← →
Игорь Шевченко © (2006-11-20 13:59) [3]
> Зацените статью
Графоманство
← →
Курдль © (2006-11-20 14:04) [4]Определение компилятора дано неточно (под это определение подходит и ассемблер).
Ключевые отличия интерпретатора от транслятора даны неправильно.
То, что они обнаруживают ошибки лишь во время выполнения - это вторично.
Кстати, интерпретаторы могут иметь в своем составе (или находиться в среде совместно с) анализаторами кода, выявляющими ошибки до выполнения.
← →
KilkennyCat © (2006-11-20 14:04) [5]ой.
← →
Cyrax © (2006-11-20 14:09) [6]Игорь Шевченко © (20.11.06 13:59) [3]
Зато всё по полочкам...
Александр Иванов © (20.11.06 13:50) [2]
Слишком много букв, причем о вещах, которые уже описаны в толстенных книгах.
В этих толстенных книгах везде написано по-разному. Причём об одних и тех же вещах - то копмилятор, то транслятор (или интерпретатор). Толковых разьяснений я ещё не встречал (только это, которое сам сочинил).
Я что -гений ?:))
← →
boriskb © (2006-11-20 14:10) [7]Cyrax © (20.11.06 13:44)
Дельная вещь.
Ты разобрался.
В голове улеглось
Чтобы лучше улеглось, все постарался систематизировано записать.
Я так часто делал.
Только на всеобщее обозрение не надо было выставлять.
:)
← →
KilkennyCat © (2006-11-20 14:11) [8]> Я что -гений ?:))
нет. ибо все гениальное - просто. а тут все слишком сложно. хотя можно было бы уложиться в два предложения.
← →
Джо © (2006-11-20 14:12) [9]Много ошибок и неточностей. Например:
Чистые интерпретаторы: ... JVM (виртуальная машина Java).
Ну, и см. [4] Курдль ©.
← →
Cyrax © (2006-11-20 14:14) [10]boriskb © (20.11.06 14:10) [7]
Возможно, выпендрёж...
Впрочем, я хотел обсудить детали. Чтоб не писать всё заново - копирнул.
Вот 4-й пост - вот это и нужно...
← →
click (2006-11-20 14:22) [11]с дефисами проблемы имхо...
а в остальном... чтош, мысли в слух тебе удалось весьма похвально отформатировать...
← →
Cyrax © (2006-11-20 14:27) [12]Курдль © (20.11.06 14:04) [4]
Определение компилятора дано неточно (под это определение подходит и ассемблер).
Ну так чем ассемблер (не язык, а транслятор) не компилятор ??
Кстати, интерпретаторы могут иметь в своем составе (или находиться в среде совместно с) анализаторами кода, выявляющими ошибки до выполнения.
Ну а это уже не чистые интерпретаторы...
Джо © (20.11.06 14:12) [9]
Много ошибок и неточностей. Например:
Чистые интерпретаторы: ... JVM (виртуальная машина Java).
Что - не чистый ?
← →
Vga © (2006-11-20 14:35) [13]> Джо © (20.11.06 14:12) [9]
> Много ошибок и неточностей. Например:
> Чистые интерпретаторы: ... JVM (виртуальная машина Java)
> .
>
> Что - не чистый ?
Это виртуальная машина. Причем, вполне может и сперва откомпилировать код, а потом запускать (JIT-компиляция).
← →
Джо © (2006-11-20 14:39) [14]> [12] Cyrax © (20.11.06 14:27)
> Что - не чистый ?
Совершенно верно. Равно как и технология .Net в которой также используется JIT-компиляция.
← →
Курдль © (2006-11-20 14:41) [15]
> Cyrax © (20.11.06 14:27) [12]
> Ну так чем ассемблер (не язык, а транслятор) не компилятор ??
Ассемблер отличается от компилятора тем, что он транслирует одно предложение ЯП строго в одну машинную команду.
Основным отличием интерпретатора является то, что он транслирует и сразу инициирует выполнение предложения за предложением.
← →
Курдль © (2006-11-20 14:43) [16]
> Джо © (20.11.06 14:39) [14]
> Vga © (20.11.06 14:35) [13]
Такие трансляторы называют Common-трансляторами.
← →
Vga © (2006-11-20 14:46) [17]> [16] Курдль © (20.11.06 14:43)
А как называют трансляторы вроде lua, которая сперва компилирует программу в байткод своей VM, потом выполняет на ней без фокусов типа JIT?
← →
Cyrax © (2006-11-20 15:00) [18]Курдль © (20.11.06 14:41) [15]
Ассемблер отличается от компилятора тем, что он транслирует одно предложение ЯП строго в одну машинную команду.
Одна команда asm -> одна команда процессора ? Это что - фокус ?
Но даже если взять какой-то гипотетический язык выше машкода, где
одна команда языка -> одна команда процессора, то это тоже будет компилятор...
Основным отличием интерпретатора является то, что он транслирует и сразу инициирует выполнение предложения за предложением.
Да, JVM - не чистый интерпретатор, т.к. компилит весь код в натив (JIT"ом), только потом его запускает...
Но вот JIT - чистый копмилятор...
← →
Anatoly Podgoretsky © (2006-11-20 15:04) [19]> Cyrax (20.11.2006 15:00:18) [18]
Компилятор/Интерпритарор к ассемблеру не имеют отношения, есть и интерпритирующие ассемблеры.
← →
Курдль © (2006-11-20 15:05) [20]
> Cyrax © (20.11.06 15:00) [18]
> Одна команда asm -> одна команда процессора ? Это что - фокус ?
А ты не задумывался, почему не бывает "чистого" ассемблера, а он всегда с какими-то мерзкими добавочками типа "Ассемблер 386" или "Ассемблер РС"?
Дальше ты начинаешь утомлять. Я дал тебе точное определение и отличия трансляторов (возможно, они устарели).
← →
Cyrax © (2006-11-20 15:38) [21]Anatoly Podgoretsky © (20.11.06 15:04) [19]
Компилятор/Интерпритарор к ассемблеру не имеют отношения, есть и интерпритирующие ассемблеры.
Интерпретирующий ассемблер - интерпретатор, компилирующий - компилятор (и транслятор)...
← →
oldman © (2006-11-20 18:39) [22]
> Транслятор (в пер. с англ. - "переводчик") – это программа,
> принимающая на вход программу на одном языке и преобразующая
> её в программу на другом языке.
Мдя...
← →
DrPass © (2006-11-20 18:44) [23]
> компилирующий - компилятор
А есть ли компилирующие ассемблеры? Компиляция подразумевает преобразование. Ассемблер по сути выполняет только подстановку - машинные коды вместо их символических обозначений
← →
oldman © (2006-11-20 18:46) [24]
> DrPass © (20.11.06 18:44) [23]
> Ассемблер по сути выполняет только подстановку - машинные коды вместо их символических обозначений
давно???
← →
Anatoly Podgoretsky © (2006-11-20 19:50) [25]> DrPass (20.11.2006 18:44:23) [23]
MacroAssembler
← →
DrPass © (2006-11-21 00:07) [26]
> oldman © (20.11.06 18:46) [24]
> давно???
Изначально
> Anatoly Podgoretsky © (20.11.06 19:50) [25]
Все то же самое, только перед сборкой прогоняет исходник через мощный препроцессор.
← →
MeF Dei Corvi © (2006-11-21 00:47) [27]
> Ассемблер по сути выполняет только подстановку - машинные
> коды вместо их символических обозначений
А подстановка не есть преобразование?
К тому же есть ассемблеры, анализирующие код на лишние недостижимые команды.
FASM, например, очень интересный ассемблер.
http://ru.wikipedia.org/wiki/FASM
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c