2010-11-20 4 views
1

РазъяснениеCross компилирование против виртуальных машин

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

фон

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

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

Например, если программист записывает графическое изображение на арабском языке программирования и компилирует его, он будет скомпилирован с кодом win32, если он скомпилирован под Windows, GTK + под Gnome, Qt под KDE и т. Д. Такой же подход будет для других библиотек.

Вопрос

Стоит ли идти через все эти проблемы, чтобы в конечном итоге с скомпилированный исполняемый файл или я лучше с Machine подход Virtual? Преимущества и недостатки выбора (с точки зрения разработчика языка, а не программиста, использующего язык)? Есть ли другие факторы, которые я должен учитывать?

Любые ссылки на ссылки для дальнейшего чтения было бы весьма признателен :)

+1

Обычно вы говорите: «Я разрабатываю компилятор для FooLang, который * задает * java или c», а не «кросс-компиляцию». – dmckee

+0

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

+0

Вы можете просто сказать «скомпилировать», поскольку его нормальное значение соответствует ситуации, и оно еще короче. знак равно – rakslice

ответ

2

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

Есть компиляторы, которые скомпилируют Java-код для native. Поэтому, если вы хотите, чтобы ваша программа запускалась изначально, вы можете использовать ее.

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

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

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

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

2

Мне нравится @Omnifarious ответ, но я хотел бы подчеркнуть вместо этого, что вы должны рассмотреть, какие компромиссы вы хотите сделать.Если вы хотите получить высокую производительность, вы можете перейти на компиляцию на C или C++, если вам нужна доступность библиотек, снова C или C++ - достойный выбор. Если вам нужна языковая совместимость, вы можете пойти с ассемблером LLVM или с ассемблером JVM или .NET.

Итак, ваш реальный вопрос: следует ли подключать бэкэнд? Я должен предупредить вас, что это действительно действительнодействительно трудно сделать. Давайте посмотрим на некоторые продукты, которые на самом деле это делают: экзамен, конечно, gcc. Он предназначен для поддержки не только широкого диапазона входных языков, но и генерации кода для широкого круга целевых ЦП: вы можете считать, что это кросс-компилятор, который генерирует различные языки ассемблера.

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

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

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