Является ли ассемблер переносимым между дистрибутивами Linux? - PullRequest
3 голосов
/ 28 января 2010

Является ли программа, поставляемая в формате ассемблера, переносимой между дистрибутивами Linux (различия в архитектуре процессора по модулю)?

Вот предыстория моего вопроса: я работаю над новым языком программирования (по имени Aklo), чей modus operandi будет классической компиляцией в .s и передачей результата в ассемблер GNU.

Очевидно, что в конечном итоге было бы неплохо, чтобы реализация была написана сама по себе, но я смирился с тем, что поддерживаю ее на C ++, чтобы решить проблему с курицей и яйцами: предположим, что вы загружаете компилятор впервые, а он сам написан на Акло, как ты это компилируешь? Насколько я понимаю, разные дистрибутивы Linux и другие UNIX-подобные системы имеют разные соглашения для двоичных форматов.

Но мне пришло в голову, что решение может состоять в том, чтобы отправить файл .s (ну, по одному на архитектуру процессора): справедливо предположить, что у вас есть или можно установить ассемблер GNU. Конечно, мне все еще нужен загрузочный компилятор, но это не обязательно должно быть быстро; Я могу написать это на Python.

Является ли ассемблер переносимым в отличие от двоичных файлов? Есть ли другие камни преткновения, о которых я не думал?

Добавлено в ответ на один ответ:

Я с тоской смотрел на LLVM, там наверняка есть много хорошего, и это облегчит мою жизнь, за исключением того, что это повлечет за собой зависимость от правильной устанавливаемой версии LLVM. Было бы не так плохо иметь такую ​​зависимость от машин для разработки, но в мире, где распространяются программы в качестве исходного кода, такая же зависимость возникнет для каждого пользователя каждой программы, когда-либо написанной в Aklo, и я решил, что это слишком высокая цена, чтобы заплатить.

Но если решение доставки откомпилированных программ в качестве ассемблера работает ... тогда это решит эту проблему, и я все-таки смогу использовать LLVM, что было бы большой победой.

Таким образом, вопрос о переносимости ассемблера гораздо важнее, чем я предполагал.

Вывод: из ответов здесь и в списке рассылки LLVM http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-January/028991.html кажется плохой новостью является то, что проблема неразрешима, но хорошая новость заключается в том, что использование LLVM делает ее не хуже, поэтому я свободен сделать это и получить все преимущества.

Ответы [ 3 ]

4 голосов
/ 28 января 2010

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

2 голосов
/ 29 января 2010

На очень высоком уровне ABI состоит из {набора команд, системных вызовов, двоичного формата, библиотек}.

Распространение как .s может освободить вас от двоичного формата. Это все еще довольно бессмысленно, потому что вы привязаны к определенному ISA и вам все еще нужно использовать библиотеки и / или делать системные вызовы. Библиотеки варьируются от дистрибутива к дистрибуции (хотя это не так уж и плохо, особенно если вы просто используете libc), а системные вызовы варьируются от ОС к ОС.

1 голос
/ 29 января 2010

Прошло 20 лет с тех пор, как я последний раз запускал компилятор Си. На уровне компиляторов различия между дистрибутивами Linux минимальны.

Гораздо более важной причиной перехода на LLVM является кроссплатформенность; если вы не пишете какой-либо промежуточный язык, ваш компилятор будет чрезвычайно трудно перенастроить для разных процессоров. И, учитывая, что на моем ноутбуке у меня есть компиляторы для x86, x86_64, двух видов MIPS, PowerPC, ARM и AVR ... вы видите, куда я иду? Я могу также скомпилировать несколько языков для большинства из этих целей (только C для AVR).

...