LINUX.ORG.RU

Emulek-style programming


2

1

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

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

Давайте оформим эту мысль вот так. Есть 2 ЯП l1 и l2. Есть транслятор с l1 в l2 — это компилятор, назовем его К, и есть транслятор с l1 в l1 — это интерпретатор — И.

Представим себе, что мы выполнили текст на языке l1 c помощью И

text(l1) --> И --> text(l1)
и с помощью K
text(l1) --> K --> text(l2)
Пока все вроде ок, все работает одинаково. А теперь представим себе такую ситуацию
(text(l1) --> И --> text(l1)) --> И --> text(l1)
Мы выполнили выходную строку текста как программу — подали ее вновь на вход транслятору. Иными словами мы выполнили сгенерированную в рантайме программу.

Может ли транслятор K сделать то же самое? Только с помощью костылей, типа макросов и препроцессоров. Но есть тонкий момент. Что если нам нужно сделать

((text(l1) --> И --> text(l1)) --> И --> text(l1)) --> И --> text(l1)
?

Тут у нас всплывает, ИМХО, суть того, что принято называть мощностью ЯП.

А Вы за Emulek-style или против?:)


Ответ на: комментарий от phill

Я что говорил что я решаю проблему останова?

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

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Это я к тому, что трансляция должна быть куда-то

В файл, например?

одновременно интерпретация

Что значит одновременно? Кто тебе запрещает интерпретатором записать в файл а УЖЕ ПОТОМ выполнить (например исполнителем асма, если targrt текст - программа на асме), выполнить выходной файл само-сабой, а не коня в вакууме? С чего ты взял, что интерпретатор будет переписывать из файла в файл бесконечно? Он закончит работу, передаст управление другому исполнителю. Это можно и из него же сделать.

phill
() автор топика
Ответ на: комментарий от arkhnchul

В какой нахрен язык? Ты переписываешь в текст на языке. Язык это набор правил, абстракция, епт.

phill
() автор топика
Ответ на: комментарий от phill

В какой нахрен язык? Ты переписываешь в текст на языке. Язык это набор правил, абстракция, епт.

да. И интерпретатор внезапно не «переписывает в текст на языке», а исполняет исходный текст. Является исполнителем исходного языка.

arkhnchul ★★★
()
Ответ на: комментарий от arkhnchul

да. И интерпретатор внезапно не «переписывает в текст на языке»

Он переписывает из текста в текст. В этом суть. если выходной текст не является текстом на языке транслятора, мы имеем компилятор.

phill
() автор топика
Ответ на: комментарий от phill

Вот возьмём

Есть 2 ЯП l1 и l2. Есть транслятор с l1 в l2 — это компилятор, назовем его К, и есть транслятор с l1 в l1 — это интерпретатор — И.

Компилятор (и транслятор) c -> asm? Ок. Можно дать программу на c и получить программу на asm.

asm -> asm интерпретатор, он же транслятор? Нет. Во-первых, не транслятор (просто потому что так выбрали (я, например) значение слова — ничего особенного), во-вторых, не asm -> asm, а просто выполнение asm (интерпретация машиной). Нельзя дать программу на asm и получить результатом программу на asm, результатом будет выполнение, то есть работа машины (его, т.е. asm-а, всё ещё идеализируем).

И про стрелочки — http://en.wikipedia.org/wiki/Function_(mathematics).

quasimoto ★★★★
()
Ответ на: комментарий от phill

ЛNСП слишком тяжёлым веществом оказался, видать :)

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

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

phill
() автор топика
Ответ на: комментарий от quasimoto

Я не знаю низкоуровщену, но если, как ты говоришь машкод-->машкод, то это интерпретатор, в чем проблема?

phill
() автор топика
Ответ на: комментарий от phill

Ну так я тебе даю машинный код — некий конкретный, а ты мне что даёшь? Должен дать какой-то другой машинный код как результат интерпретации, раз mc -> mc. Но такого кода нет, потому что выполнение (интерпретация машиной) это не трансляция.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Но такого кода нет

почему его нет? Вот было выражение 1111 в одном месте, что то произошло, появился 0101 в другом месте произошла запись, которую процессор считает и напишет что-то в 3-м месте. Я не хочу лезть в дебри, я в машкодах не смыслю. Давай возьмем реле. Допустим реле втянуто, другое реле может прочитать это положение (через вторичную цепь первого реле) и соответственно «записать» в следующее, включив его катушку. А это следующее может быть «считано» еще чем то. И тд.

phill
() автор топика
Ответ на: комментарий от quasimoto

Это ты тоже придумал

Что придумал? Что интерпретатор лиспа переписывает термы лиспа в термы лиспа?

phill
() автор топика
Ответ на: комментарий от quasimoto

Но это не так, выполнение языка это не трансляция L -> L, это просто выполнение L.

Можно как угодно называть, от этого суть не изменится.

phill
() автор топика
Ответ на: комментарий от quasimoto

Да и вообще, почему же тогда в CS упорно все называют интерпретатор транслятором, если ты утверждаешь, что никакой трансляции там нет, а есть только какое-то гребаное «выполнение»? Ты сам же настаиваешь на употреблении общепринятых терминов, а твоя терминология как-раз и противоречит общепринятой.

phill
() автор топика
Ответ на: комментарий от phill

почему его нет?

Потому что скомпилированный код в виде инструкций CPU для данной программы получается фиксированный, он размещается в text и больше не меняется (сам text read-only, self-modifying не берём), дальше его можно только выполнять — он может работать со своей остальной памятью как с памятью (чтение и запись данных), либо как с шиной (I/O).

Что придумал? Что интерпретатор лиспа переписывает термы лиспа в термы лиспа?

Он их выполняет, то есть местный eval это такая функция которая вычисляет структуру синтаксически воссоздающую основной язык путём простого вызова соответствующих вещей в основном языке, если выражение совпадает с '(from ...), то он делает (form% ...(eval ...)), с тем же успехом можно просто смотреть на выполнение основного языка любым другим вычислителем.

quasimoto ★★★★
()
Ответ на: комментарий от phill

Да и вообще, почему же тогда в CS упорно все называют интерпретатор транслятором

А где твои пруфы?

http://www.amazon.com/Compilers-Principles-Techniques-Tools-Edition/dp/032148...

http://www.amazon.com/Concepts-Techniques-Models-Computer-Programming/dp/0262...

http://www.amazon.com/Programming-Language-Pragmatics-Third-Edition/dp/012374...

http://www.amazon.com/Design-Concepts-Programming-Languages-Franklyn/dp/02622...

^ нифига не называют, разные вещи.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Потому что скомпилированный код в виде инструкций CPU для данной программы получается фиксированный

Да любой скомпилированный код будет фиксированным и будет лежать в файле. Он является предметом чтения, почему бы ему не лежать там. Он лежит, а кто-то его читает. Все, я пас.

phill
() автор топика
Ответ на: комментарий от quasimoto

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

phill
() автор топика
Ответ на: комментарий от phill

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

А ещё ты можешь не заказывать, а скачать бесплатно без смс :)

quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 1)
Ответ на: комментарий от phill

А как у тебя в лиспе записывается и интерпретируется лисп --> лисп факториал?

	testq	%rdi, %rdi
	movl	$1, %eax
	je	.E
.L:
	imulq	%rdi, %rax
	subq	$1, %rdi
	jne	.L
.E:

выполняется просто без всяких mc --> mc.

quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 1)
Ответ на: комментарий от phill

Признайся честно, ты действительно понимаешь, или делаешь вид, что понимаешь?

честно? думаю, что понимаю :)

лады, поместим рядом все три определения из http://ru.wikipedia.org и посмотрим на них:


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


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


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

Можно заметить, что

  • интерпретатор выполняет программу пооператорно, или покомандно, или построчно
  • ни транслятор, ни компилятор программу не выполняют, по определению
  • транслятор может преобразовать программу из высокоуровнего ЯП в высокоуровневый ЯП, компилятор - только в машинно-ориентированный
  • исторически, зачастую, компиляторы высокоуровневых ЯП сначала транслировали программу в язык Ассемблер, а затем уже, собственно, компилировали (в объектные файлы, которые после линковались)
  • скомпилированная программа выполняется на «низком» уровне (операционной системой, например), потому «быстрее»
  • при интепретации, интерпретатор тратит много ресурсов (и времени), собственно, на распознавание/трансляцию (определение выше) в своё некоторое «внутреннее» представление, которое сможет выполнять, потому и «медленный»
  • из предыдущего пункта ясно, что никто в здравом уме и трезвой памяти не будет делать «чисто интерпретируемый» ЯП сложным
  • некоторые ЯП (например, perl), заявленные как интепретируемые, в наше время, сначала целиком транслируют программу в своё внутреннее представление (байт-код, например), а затем выполняют
anonymous
()
Ответ на: комментарий от anonymous

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

а как же компиляция lisp→c?

скомпилированная программа выполняется на «низком» уровне (операционной системой, например), потому «быстрее»

любая программа выполняется процессором на одном «уровне». Других «уровней» нет.

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

php никто не хотел делать «сложным». Так получилось.

некоторые ЯП (например, perl), заявленные как интепретируемые, в наше время, сначала целиком транслируют программу в своё внутреннее представление (байт-код, например), а затем выполняют

это противоречит тому, что ты выше с викой пел.

emulek
()
Ответ на: комментарий от anonymous

некоторые ЯП (например, perl), заявленные как интепретируемые, в наше время, сначала целиком транслируют программу в своё внутреннее представление (байт-код, например), а затем выполняют

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

arkhnchul ★★★
()
Ответ на: комментарий от emulek

а как же компиляция lisp→c?

такое принято называть трансляцией.

php никто не хотел делать «сложным». Так получилось.

ну так он и не сложный. Как язык (лексемы+синтаксис+семантика) похапе весьма туп.

arkhnchul ★★★
()
Ответ на: комментарий от phill

Он переписывает из текста в текст. В этом суть. если выходной текст не является текстом на языке транслятора, мы имеем компилятор.

почитай уже определения штоле.

arkhnchul ★★★
()
Ответ на: комментарий от arkhnchul

а как же компиляция lisp→c?

такое принято называть трансляцией.

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

ну так он и не сложный. Как язык (лексемы+синтаксис+семантика) похапе весьма туп.

он так и задумывался, как простой ЯП. И тем не менее, на сегодняшний день оброс Over9000 разных костылей. И «туп» лишь на первый взгляд, если там ничего сложнее

<?php
echo "hello world";
?>

не писать.

emulek
()
Ответ на: комментарий от phill

Он переписывает из текста в текст.

этого достаточно, что-бы называться «компилятором» или «транслятором». Чем именно — вопрос сложный, разные авторы считают по разному. Мнение анонимных аналитегов ЛОРа тоже разделилось как обычно.

emulek
()
Ответ на: комментарий от arkhnchul

Он переписывает из текста в текст. В этом суть. если выходной текст не является текстом на языке транслятора, мы имеем компилятор.

почитай уже определения штоле.

ты про вику? Зря. Вика не может даже с термином «файл» определиться, история правок доставляет.

emulek
()
Ответ на: комментарий от emulek

ты про вику? Зря.

нет. Они много где есть. Виковские в целом соответствуют.

arkhnchul ★★★
()
Ответ на: комментарий от emulek

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

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

phill
() автор топика
Ответ на: комментарий от phill

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

почему именно «для другого»? Обычно это так, да, но почему обязательно?

emulek
()
Ответ на: комментарий от phill

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

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

anonymous
()
Ответ на: комментарий от emulek

хм... потому и говорил «принципиально одно и то же»

Напомнило:

«
— На самом деле самого дела нет. В самой деятельности заключена самость дела — и наоборот. Наоборот получим оборот на и таким образом перевернем образ. Я уже не говорю о природе говора в роде при уже. Ужи и узы… вы меня понимаете, мистер Андерсон?
— Конечно, я так и думал, агент Смит. Можно мне еще затянуться?…
» — Анекдот

anonymous
()
Ответ на: комментарий от anonymous

самость дела

Кантовская вещь в себе?

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

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

Напомнило Конечно, я так и думал, агент Смит. Можно мне еще затянуться?…

господа модераторы, откройте пожалуйста толксы анонимам! Зачем здесь их тупняк?

emulek
()
Ответ на: комментарий от quasimoto

Видишь что как называется, что трансляция это L1 -> L2, да, но интерпретация — просто выполнение L?

давай ты мне расскажешь, что такое «просто выполнение x86 кода»? И чем оно отличается от «просто выполнения C/PHP/Java/Python/BrainFuck/etc кода»?

emulek
()
Ответ на: комментарий от emulek

что такое «просто выполнение x86 кода»?

http://static.usenix.org/event/usenix05/tech/freenix/full_papers/bellard/bell...

The dynamic translator performs a runtime conversion of the target CPU instructions into the host instruction set. The resulting binary code is stored in a translation cache so that it can be reused. The advantage compared to an interpreter is that the target instructions are fetched and decoded only once.

http://bellard.org/jslinux/tech.html

Some of the code is inspired from my x86 dynamic translator present in QEMU, but there are important differences because here it is an interpreter.

В чистом интерпретирующем эмуляторе машинный код можно декодировать и выполнять просто на софтовом уровне (иначе — JITировать в местный машинный код который можно вызвать на выполнение).

Иначе «x86» это часть ISA выполнением которой занимается микроархитектура CPU.

И чем оно отличается от «просто выполнения C/PHP/Java/Python/BrainFuck/etc кода»?

Если ты их компилируешь в машинный код, то смотри выше, если в байткод — выполняет VM (как-то написанная и сама выполняемая), иначе, если совсем тупо, то обычный интерпретатор выполняет (тоже — как-то написанный и работающий, он тоже программа, так что к нему относятся те же вопросы, что ты задаёшь про target язык).

quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 1)
Ответ на: комментарий от quasimoto

http://static.usenix.org/event/usenix05/tech/freenix/full_papers/bellard/bell...

своими словами можно?

The dynamic translator performs a runtime conversion of the target CPU instructions into the host instruction set. The resulting binary code is stored in a translation cache so that it can be reused. The advantage compared to an interpreter is that the target instructions are fetched and decoded only once.

ну вот, ближе к телу. О чём я и говорил: «The resulting binary code is stored in a translation cache so that it can be reused». Т.о. современный интерпретатор можно с лёгкостью переделать в компилятор, ибо он является «динамическим транслятором».

Или ты считаешь, что интерпретатор не является динамическим транслятором? ИМХО на сегодня все интерпретаторы таковыми являются (из тех, чтто используются на практике)

В чистом интерпретирующем эмуляторе машинный код можно декодировать и выполнять просто на софтовом уровне (иначе — JITировать в местный машинный код который можно вызвать на выполнение).

да, но. На практике «чисто интерпретирующие эмуляторы» AFAIK никто уже давно не применяет. Даже bash не может просто взять, и эмулировать while true; do, ему надо ещё done для трансляции.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.