Ответы пользователя по тегу Assembler
  • Как встроить в OS компилятор C++?

    @safinaskar
    Странный у вас вопрос. Если вы всерьёз пишите ОС и уже настолько продвинулись, то столь абстрактно сформулированных вопросов у вас возникать не должно. Столь абстрактный вопрос просто заставляет усомниться в вашей компетенции писать ОС.

    Начну с азов (в изложении я буду немного упрощать некоторые моменты). Есть машинный код. Нули и единицы. У каждой архитектуры (x86, arm и так далее) он свой. Существует семейство языков программирования, находящихся максимально близко к машинному коду: языки ассемблера (часто вместо "язык ассемблера" говорят просто "ассемблер"). По одному языку ассемблера для каждой архитектуры. Они находятся к машинному коду настолько близко, что часто понятия "язык ассемблера" и "машинный код" смешивают, и это нормально. В частности, так сделал Top_Pudge в соседнем ответе, это нормально, это обычный IT-сленг.

    Языки программирования (C++, python и т. д.) делятся на компилируемые и интерпретируемые. C++ - компилируемый язык. Это значит, что для того, чтобы выполнить программу на C++, её нужно сперва скомпилировать, т. е. сконвертировать в машинный код специальной программой, называемой компилятором. Затем полученный машинный код просто выполняют на целевом процессоре. (На самом деле ничто не мешает интерпретировать компилируемый язык, но, как я обещал, я буду упрощать.)

    "Портировать" означает сделать так, чтобы некая программа, работающая в одной ОС, стала работать в другой ОС.

    Теперь по поводу того, как же "встроить" C++ в ОС. Сказанное будет относится как к ядру вашей ОС (если, допустим, вы решите переписать его на C++), так и к остальным программам в вашей ОС. Т. е. под словом "программа" далее можно понимать в том числе ядро. Итак, существует понятие кросскомпиляции и нативной компиляции. Кросскомпиляция - это когда компилятор, работающий на одной архитектуре/ОС, создаёт программу, предназначенную для другой архитектуры/ОС. Нативная компиляция - когда для той же. Компилятор, который осуществляет кросскомпиляцию, называется кросскомпилятором. Нативную - нативным компилятором.

    В вашем случае кросскомпиляция - это когда вы берёте некий компилятор (желательно уже существующий, т. е. gcc, clang, MSVC++ и т. д.), запускаете его в обычной ОС, той, которую вы используете для разработки (Windows, Linux и т. д.) и он создаёт бинарник, пригодный для запуска в вашей ОС.

    Ну а нативная компиляция в вашем случае - это когда у вас уже существует компилятор (ваш собственный либо портированный на вашу ОС существующий, такой как gcc, clang и т. д.), работающий в вашей ОС, и с его помощью вы внутри вашей ОС создаёте бинарники для вашей ОС.

    Так вот, даю 99% того, что вам в любом случае нужно будет начать с кросскомпиляции, чуть позже объясню почему.

    Итак, кросскомпиляция. С чего начать? Начнём с того, что создавать свой компилятор C++ я вам категорически не советую. C++ - это очень сложный язык, создание компилятора для него - нереально сложная задача. Вам нужно взять существующий компилятор и заставить его генерировать код для вашей ОС. Чтобы заголовки бинарников совпадали с принятыми в вашей ОС и чтоб системные вызовы правильно компилировались. Пишите - могу подробнее попытаться рассказать.

    Когда будет готов кросскомпилятор, можно с его помощью собирать программы на C++ для вашей ОС. Всё, готово.

    Что дальше? Дальше можно сделать нативную компиляцию. Делать ли её, зависит от того, для чего предназначена ваша ОС. Если это ОС для автоматов с газировкой и т. д., понятное дело, делать её не нужно. Зачем автомату с газировкой уметь самому компилировать C++? Не нужно. Просто кросскомпилятором компилируете все нужные программы для вашего автомата и заливаете в прошивку. Всё. Но если вы пишите ОС общего назначения, то нативный компилятор рано или поздно должен там появиться. Окей, как его сделать? Что ж, допустим, что ваш кросскомпилятор сделан на основе gcc. Ну окей, тогда берёте gcc и компилируете его при помощи вашего кросскомпилятора gcc. И вы получите нативный для вашей ОС gcc. Готово. На практике, конечно, всё может быть немного сложнее.

    Я обещал рассказать, почему надо в любом случае начать с кросскомпиляции. Потому что, чтобы сразу начать с нативной, вам придётся самому писать на ассемблере свой нативный компилятор языка C++. Что нереально. Если же вы начнёте с кросскомпиляции, вы сможете потом кросскомпилировать, скажем, gcc и получить таким образом нативный компилятор для вашей ОС.

    Теперь вопрос. Вы работаете на некоего заказчика/владельца за деньги или вы просто некоей командой пишите свой проект (неважно, коммерческий или нет)?

    Если первое, и если при этом этот ваш вопрос на toster.ru выражает мнение всей вашей команды (т. е. у вас в команде реально никто не знает, даже с чего начать поддержку C++ в ОС), то передайте заказчику/владельцу, чтоб уволнял всю команду и искал другую. Реально. Этот вопрос на toster.ru показывает вашу полную некомпетентность. Люди, которые пишут ОС, должны как минимум знать, что есть C++, что он компилируемый, что есть машинный код, есть языки ассемблера, есть кросскомпиляция, в общем всё, что я выше написал. Даже я справлюсь с написанием ОС лучше. И это при том, что я вобщем-то, не умею этого делать, и никогда не доходил до написания своей ОС с поддержкой своих кастомных бинарников. Максимум, до чего я доходил: пара попыток написания ОС, см. мой гитхаб github.com/safinaskar , проекты duo и gavin. Если вам совсем некого взять в проект, возьмите уж лучше меня. Я хотя бы примерно знаю, что нужно сделать, и в конце концов напишу вам ОС, пускай даже это займёт нереально много времени. Я серьёзно, я щас нигде не работаю, моё резюме здесь: safinaskar.com/resume.pdf .

    Если же верно второе, т. е. вы просто пишите проект (ещё раз говорю, не важно, коммерческий или нет) своей командой, никуда не торопитесь, хотите научиться это делать, что ж, дерзайте, написание своей ОС - это очень интересное и поучительное дело, wiki.osdev.org вам в помощь.

    Top_Pudge в соседнем ответе предлагает совершенно нереальную вещь: писать свой компилятор C++ (что само по себе сложно), да ещё и на ассемблере (кошмар! такого, видимо, вообще никто никогда не делал, даже Страуструп). Бред.

    Советую в любом случае обязательно прочитать вот эту замечательную статью: www.interstron.ru/upload/images/pubs/Redkaya_profe... . Интересный текст про написание своего компилятора C++. Про то, насколько это сложно. Чтоб у вас не возникало мыслей написать свой компилятор C++. Хотя, с другой стороны (если, разумеется, вы работаете не на заказчика, который ждёт за разумное время результат), если хотите, можете попытаться написать свой компилятор C++. Это отличный самообразовательный проект. Но очень долгий.

    Если остались вопросы, пишите тут ответ, либо в личку на Хабре ( habrahabr.ru/users/safinaskar ) либо на почту ( safinaskar@mail.ru ). Я с радостью отвечу. Я написал тут не всё, что думаю по вопросу, могу написать ещё. Вообще, в любом случае напишите, что прочитали, я старался, мне важно узнать, что меня прочитали.
    Ответ написан
    Комментировать