Компиляторы и спецификация языка/грамматики одинаковы?

StackOverflow https://stackoverflow.com/questions/4473305

Вопрос

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

т.е. вы всегда можете получить спецификацию языка от компилятора?

Допустим, я хочу собрать из ?? На какой -то язык, но я не хочу, чтобы люди, которые читали компилятор, могли читать и понимать ??

Лично у меня есть ощущение, что компиляторы и языковые спецификации являются изоморфными, но я заинтересован с академической точки зрения, является ли это неправильным.

Это было полезно?

Решение

Предполагая, что вы говорите, что у них есть только доступ к бинарному:

Краткий ответ: нет, если человек заботится достаточно.

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

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

Теперь, если вы никогда не давали компилятору человеку (представьте себе какую -то прокси -систему?), Было бы разумно сказать, что пользователю придется потребовать очень, очень много времени, чтобы принудительно принудительно принудиться языковые спецификации, если бы он мог Когда -либо генерируя что -то, что могло бы использовать это полностью.

Если вы подразумеваете, что они имеют доступ к исходному коду:

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

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

Другие советы

Я думаю, что компилятор всегда раскрывает спецификацию языка, который он компилирует (я знаю, что это супер ручная).

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

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

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

Кроме того, чтение источника компилятора было бы моим последним вариантом, если бы я хотел что -то узнать о языке (не о том, как он реализован, а о том, как он определяется на более абстрактном уровне) - я бы направился к спецификации или в какой -либо другой авторитетный источник ( Официальные документы и т. Д.), Поскольку это было бы намного проще, даже если код компилятора очень понятен.

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

В целом, если в коде есть информация о семантике (и всегда есть оперативная семантика, определенная в любом интерпретаторе или компиляторе), то всегда можно извлечь эту информацию. Единственный вопрос - сложность такой обратной инженерии. Таким образом, вам нужен запутанный язык и запутанный компилятор.

Взгляните на Malbolge "Decropiler", например.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top