Кросс-компиляция против виртуальных машин - PullRequest
1 голос
/ 21 ноября 2010

Разъяснение

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

Фон

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

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

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

Вопрос

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

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

Ответы [ 2 ]

2 голосов
/ 30 декабря 2010

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

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

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

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

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

2 голосов
/ 21 ноября 2010

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

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

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

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

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

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

...