LINUX.ORG.RU
решено ФорумTalks

О трансляции в примитивные языки

 


0

2

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

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

Перемещено tailgunner из development



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

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

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

Твои мучения дают мне овермиллион к ЧСВ

может начнешь понимать хоть что-то в программировании

ЧСВ - это единственное, что у тебя есть. Ладно, развлекайся.

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

давай серьезно, ответь хоть раз по-существу, не виляй. Мне просто интересно, как ты думаешь. встречается тебе код fu = function(){myVar = eval(foo)}, как ты его оттранслируешь, если fu вызывается в рантайме?

filequest
() автор топика

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

Это элементарнейшее соображение почему-то не доходит до наших лоровских школьников.

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

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

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

Тут не понимаешь только ты. Трансляция на уровне синтаксиса между двумя языками программирования невозможна для подавляющего числа языков, потому что язык — это не только синтаксис. В target-языке всегда придется делать какой-то дополнительный рантайм для обслуживания особенностей исходного языка. Это ОК, это обычное дело.

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

staseg ★★★★★
()
Ответ на: комментарий от ya-betmen

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

filequest
() автор топика

Поскольку без исполнения части кода просто нет, нечего транслировать.

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

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

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

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

Хм, eval. Нет, мы безусловно можем реализовать это, но в общем случае - не вижу выхода, кроме (раз уж речь о компилируемом языке) вызове компилятора и запуска собранного им кода, а это уже не очень вписывается, да. И тем не менее - вероятно, возможно с применением средств нашего языка.

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

Это как раз не штука. Если компилятор присутствует в рантайме как библиотека, то всё хорошо.

Хуже другое: Perl не поддаётся синтаксическому разбору без выполнения. Вот это действительно просто так не оттранслируешь.

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

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

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

Причем тут трансляция из другого языка?

Ты совсем не читаешь то что пишешь, или забываешь, или пишешь не то что хочешь?

Интерпертируемый язык невозможно оттранслировать в си, по одной простой причине — он транслируется частично в рантайме.

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

ya-betmen ★★★★★
()
Ответ на: комментарий от filequest

Я, конечно не Miguel, но вопрос задам

Так ведь, приведенное выражение тоже не поддается синтаксическому разбору без выполнения

eval и содержимое? Нет. Мы можем иметь в рантайме условную

Variant eval(String code, Environment env)
которая на различных этапах своего функционирования :

- запустит трансляцию и компиляцию

- выполнит собранный код.

И да - eval-ы внутри переданного eval кода будут выполнены также.

Где здесь невозможность разбора без выполнения?

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

то есть ты предлагаешь написать, фактически, интерпретатор языка, и называешь это «просто трансляцией». Ок.

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

проанализировать то что там написано ты можешь конечно. Но что такое *просто функция eval*? это и есть интерпретатор языка. То есть, то о чем ты говоришь, означает то, что ты пишешь на си интерпретатор, и вызываешь его в рантайме. Это не совсем обычный транслятор, мягко говоря.

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

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

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

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

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

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

В данном случае скорее ближе к JIT-компиляторам

На мой взгляд, JIT-компилятор ничем принципиально не отличается от интерпретатора.

мы ведь используем уже написанный транслятор и компилятор

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

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

все чем хваляться обычно лисперы — это лисп написанный на лиспе. Это какая-то бессмысленная ахинея:) Простейший, вырожденный случай метациклического интерпретатора — (define my-eval (expression) (eval expression)). Это, на самом деле тавтология. Тут фишка в том, что внося изменения в этот my-eval мы можем легко менять поведение, и в то же время наследовать основную его часть. Это как две капли похоже на концепцию наследования в ООП, типа смоллтока. Там фактически, любой объект является интерпретатором.

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

то есть ты предлагаешь написать, фактически, интерпретатор языка, и называешь это «просто трансляцией». Ок.

Границу между интерпретатором и трансляцией определяешь ты в каждом конкретном случае? Объективных критериев нет?

i-rinat ★★★★★
()
Ответ на: комментарий от filequest

Ты в данном случае как раз пишешь заново язык

Скорее юзаю уже написанное. Я о следующем :

- предположим, у нас есть

String translate(String src)

- также, предположим что наш компилятор доступен как

NativeCode compile(String source)

- тогда мы, грубо говоря - при первичной трансляции проводим (грубо говоря)

compile(translate(source)).save()
и получаем исполняемый файл, в котором среди прочего - добавлен наш рантайм с eval

- eval же - также вызывает translate и compile

Т.е. написания «заново» - нет, есть использование транслятора и компилятора в 2 местах.

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

Какая такая виртуальная машина (или я неверно понимаю тебя? Тут же никакой эмуляции)? Мы ведь собираем вложенный код в нативный, которому скармливаем определенное окружение и запускаем.

Читай :

1. у нас есть (условно) глобальная переменная Environment с данными о текущем состоянии программы.

2. вызовы eval-а подменяются на Variant result = eval(Code, Environment)

3. при вызове нативного eval-а - мы :

3.1. транслируем код в наш язык

3.2. компилим в (условно) нативную Variant evaluable(Environment)

3.3. запускаем код собранной функции.

Вроде как мы не эмулируем на какой-то стадии другое окружение.

alex4321
()
Ответ на: комментарий от i-rinat

тут все просто, трансляция — это просто переписывание кода, это в тч часть процесса интерпретации. Даже обычный репл, это более чем просто транслятор, он транслирует и исполняет. В CS большая путаница с этим, хомячки не понимают процесс, но хотят строчить *научные труды*, отсюда все идет.

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

Окей. Значит программа, которая из file.js делает file.c с содержимым

#include <JSEngine.h>
int main(void) {
  JSEngineRunFile("file.js");
}

это трансляция в Си. Исполнение же к трансляции не относится, как ты сам сказал.

i-rinat ★★★★★
()
Ответ на: комментарий от filequest

И почему ты считаешь их левыми? Потому что не видишь связи с твоим постом?

ya-betmen ★★★★★
()

А ведь так красиво самоликвидировался...

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

то есть ты предлагаешь написать, фактически, интерпретатор языка, и называешь это «просто трансляцией». Ок.

Если интерпретатор языка является одной из конструкций этого языка, то, естественно, трансляция должна также его содержать.

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

да легко:

fu = function(){myVar = system("/bin/gcc foo");}

кстати, интерпретируемые языки ровно так, по сути, и поступают

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

Я не стремлюсь забанить этих двух клоунов только потому, что сейчас их можно заигнорить и жить спокойно. А когда они зарегистрируются снова (или будут проповедовать из-под анонимусов)...

Бан по ДНК решает проблему, но не реализован.

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

JSEngineRunFile(«file.js»);

Это язык си? Тогда лучше сразу goTo("/mylky-way/solar-system/mars")

хотел тебя разбанить, но видимо рановато еще.

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