Можно ли перевести язык сценариев на другие языки?
Можно ли перевести язык сценариев на C, C++ или Java, чтобы его можно было запустить в IDE без переписывания кода?
6 ответов
Теоретически, да, можно перевести любой язык сценариев в код C, C++ или Java. Теоретически верный способ сделать это - взять исходный код для интерпретатора, а затем жестко закодировать в сценарии, который он будет выполнять. Результирующий код будет затем "запускать интерпретатор, написанный на C/C++/Java, по указанному исходному коду".
На практике обычно не существует хорошего способа перевода с языка сценариев на какой-либо другой целевой язык таким образом, чтобы сохранить оригинальный стиль кодирования. Каждый язык имеет свои собственные конструкции, идиомы и идиосинкразии, и при переводе с исходного языка сценариев на целевой язык большая часть исходной структуры теряется. Тем не менее, есть много проектов, которые делают это преобразование по соображениям производительности. Например, компилятор HipHop Facebook переводит PHP в C++ по соображениям эффективности. Однако полученный код не предназначен для чтения людьми.
Короче говоря, да, это может быть сделано, но не так, чтобы это приводило к хорошему коду.
Взгляните на shedskin для примера переводчика с Python на C++. Это не идеально. У него есть некоторые ограничения на то, что код может быть переведен. Но в целом это работает.
Основной причиной для этого в этом случае является скорость и простота интеграции с другим существующим программным обеспечением C++.
В теории да, это возможно. В зависимости от языка сценариев и его поддержки "виртуальной машины", существуют инструменты для этого (полу) автоматически. Чем интенсивнее интерпретируется язык, тем меньше вероятность того, что вы сможете перевести код (например, перевод веб-страницы HTML на нативный C довольно нелепый, в отличие от перевода кода matlab на C или C++). В общем, универсальные инструменты для перевода кода редко бывают достаточно хорошими, чтобы вы могли скомпилировать и запустить созданный код, очень часто они выполняют большую часть преобразования синтаксиса (в основном операции поиска и замены) и, возможно, некоторые более сложные вещи. Но в большинстве случаев вам все еще предстоит проделать значительную работу (например, использование переводчика Google для перевода веб-страницы с одного языка на другой, она никогда не бывает идеальной и зависит от того, насколько близки эти два языка).
Однако, по моему мнению, я бы сказал, что перевод кода - очень опасное дело. Намного легче делать опечатки или другие ошибки, когда вы вручную переписываете код, о котором вы очень мало знаете. Инструмент автоматического перевода не будет работать намного лучше и в этом направлении. А потом, после того как вы перевели код, что делать, если есть ошибки? Как ты должен их найти? и исправить их? когда вы очень мало знаете о реальном коде. Это может очень быстро стать кошмарным опытом. Я делал это в прошлом, и больше не делаю!
Кстати: если вы хотите использовать код, написанный на языке сценариев внутри проекта, написанного на другом языке, то вы можете рассмотреть возможность взаимодействия языков вместо перевода одного кода на другой язык. Большинство языков программирования и языков сценариев имеют средства для взаимодействия с другими языками (например, DLL или компоненты COM/ActiveX). Всегда лучше сохранить код на том языке, на котором он был изначально написан, если это вообще возможно.
Существует язык программирования Haxe, который можно перевести на C++, Java, Javascript, C# и ряд других языков. Этот язык появился сравнительно недавно и предназначен для перевода на максимально возможное количество целевых языков.
Для C есть несколько скриптовых языков, которые немного похожи на C. Может быть, это отправная точка. Луа приходит мне в голову.
Для java существует язык сценариев beanshell/bsh, который запускает упрощенный код java в виде сценария. Но вам придется переписать его, чтобы сделать из него Javacode, и я не знаю, насколько простым будет процесс, чтобы это произошло автоматически.
Другой подход может быть следующим: написать интерпретатор C, чтобы вы могли использовать C-код для написания сценариев и просто скомпилировать его, когда вам нужно.
Зависит от того, чего вы хотите. В общем, вы можете построить синтаксическое дерево из любого языка и создать эквивалентные конструкции в C / C++ /Java / что угодно. Не ожидайте, что код будет очень быстрым, просто потому, что теперь он скомпилирован, в некоторых случаях он может быть еще медленнее.
Вот некоторые проекты, которые делают исходный код для выполнения или исходный код для выполнения:
Java Byte code based: даст вам Java-классы, и вы сможете вызывать их из Java. Вы также можете декомпилировать их, чтобы получить исходный код, но это не влияет на производительность.
- JRUBY http://jruby.org/
- JYTHON http://www.jython.org/
C++:
- компилятор с Python на C++: http://shed-skin.blogspot.co.at/
- Вы можете скомпилировать все, что создает llvm-байтный код, в C++, потому что llvm может генерировать исходный код C++. http://llvm.org/
- php to C++: https://github.com/facebook/hiphop-php
- также обратите внимание, что промежуточные проекты, такие как ice ( http://zeroc.com/), имеют мало языков описания, которые генерируют код C /Java
- или генераторы синтаксического анализатора переводят что-то под названием LALR на C / C++: http://www.gnu.org/software/bison/ или Java: http://javacc.java.net/
- также есть возможность скомпилировать мозговую шутку на C: http://esolangs.org/wiki/C2BF