2015-07-02 4 views
4

Я понимаю, что исходные коды java можно скомпилировать с помощью JavaCompiler. С длинной строкой, содержащей мой код java, я могу проверить, компилируется ли мой код.Могу ли я скомпилировать исходный код C++ через строку?

Источник: http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html

Пример: http://www.java2s.com/Code/Java/JDK-6/CompileaJavafilewithJavaCompiler.htm

Мой вопрос: У меня есть длинная строка, которая содержит компилируемый C++ код. Могу ли я сделать что-то подобное, используя какую-то форму java-библиотеки, или это просто невозможно?

Благодаря

Edit 1: В соответствии с просьбой, строка может быть пользователями (набран в GUI - JTextArea) или читать из файла .cpp ..

+1

Вкратце: нет, нет встроенного компилятора в среде выполнения C++. Вы можете, конечно, написать код, который приводит к некоторому выходу из вашей программы, скомпилированному в другую программу, запустив компилятор над этим выходом [и, по крайней мере, некоторые компиляторы могут сделать это с помощью 'stdout' из вашей программы в качестве входных данных для компилятора, поэтому вам действительно не нужно создавать файл как таковой] –

+0

Aww .. спасибо за ответ ... Моя реальная цель - когда моя программа (с использованием java) должна читать либо в C++ исходных кодов Java, и проверить, исходный код ввода компилируется. Поскольку я не могу сделать это, я думаю, мне нужно отказаться от этой функции :(.. Спасибо за ваше понимание. – user3188291

+0

Вы можете перенаправить строку в 'gcc' [через командную строку ...] (http: // stackoverflow .com/questions/1003644/is-it-possible-to-get-gcc-to-read-from-a-pipe) (используя вызов 'system') – scohe001

ответ

0

Если вы используете VisualStudio вы можете используйте событие pre-build для вызова компилятора C++ и скомпилируйте файл. Если у вас возникла ошибка, ваш проект Java не будет создан. Идея здесь в том, что вы делаете событие до сборки. Вы можете сделать это событие, что вы хотите, как, например, проверка, если файл компилируется,

Вот учебник: https://dillieodigital.wordpress.com/2012/11/27/quick-tip-aborting-builds-in-visual-studio-based-on-file-contents/

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

Если вы используете Windows, которая была бы, если вы используете VisualStudio, это будет полезно.

Компиляция программы Native C++ из командной строки: https://msdn.microsoft.com/en-us/library/ms235639.aspx

Так в основном, вы делаете проект VisualStudio сделать событие до сборки, которое является вызов в командной строке в C++ компилятор для проверки ваш файл перед созданием вашего Java-проекта.

Надеюсь, что это поможет.

+1

Если вы используете Linux, я просто Убедитесь, что вы можете написать файл make для компиляции программ Java и C++. Если вы на MacOS, я не знаю, что делать. –

0

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

Но будьте осторожны, что LLVM не предоставляет стабильный API, поэтому трудно построить примеры, которые продолжают работать. Даже используя C API (который по-прежнему требует обновления SONAME), у меня был разрыв с каждым выпуском LLVM.

+1

На самом деле это, вероятно, 'libclang' не' libllvm' –

0

Мой вопрос: у меня длинная строка, которая содержит компилируемый код на C++.

В стандарте C++ 11 не упоминается какая-либо функция, способная это сделать (скомпилируйте код C++ в некоторой строке). И я не знаю библиотеки (кроме, возможно, libclang, но я не знаю, смогу ли она скомпилировать строку), способную это сделать.

На самом деле компилятору C++ практически необходимо сделать много optimizations (если вы хотите, чтобы код работал не слишком медленно), поэтому потратит значительное время (относительно скорости компьютера, например, несколько десятых секунд даже для небольшой исходный код на C++) для компиляции сгенерированного кода на C++. И сильно templatized C++-код может занять много времени (даже бесконечное количество в патологических случаях, начиная с C++ templates are accidentally Turing Complete) для компиляции.

Практически говоря, вы не получаете преимущества, чтобы не писать исходный файл на C++. Некоторые компиляторы (например, GCC на Linux с g++ -x c++ /dev/stdin) могут компилировать код C++ со своего стандартного ввода, поэтому вы можете использовать (в системах POSIX) popen для их комбинирования.

Просто написать C++ код в какой-нибудь временный C++ исходный файл (возможно, в какой-то tmpfs файловой системы, если вы хотите, чтобы избежать диск IO) или, возможно, pipe(7) или fifo(7) ... и вилкой сборник. В системах Linux и Posix вы можете скомпилировать (например, с g++ -Wall -fPIC -O -shared /tmp/temporary1234.cc -o /tmp/temporary1234.so) этот код в «плагин» или общий объект, который может быть позже у вашей основной программы dlopen

Если вы создаете код на C++, вы можете рассмотреть возможность использования (вместо генерируя исходный код C++, затем компилируя его), некоторая Just-In-Time compilation библиотека, подобная gccjit, LLVM, libjit, lightning, asmjit и т. д. Затем вы создадите некоторое внутреннее представление (специфичное для библиотеки JIT!) кода AST.

Смежные вопросы