• Как встроить в 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 ). Я с радостью отвечу. Я написал тут не всё, что думаю по вопросу, могу написать ещё. Вообще, в любом случае напишите, что прочитали, я старался, мне важно узнать, что меня прочитали.
    Ответ написан
    Комментировать
  • ".deb" пакеты обязательно собирать бинарными файлами?

    @safinaskar
    существуют специальные сорцевые (т. е. с исходными текстами) пакеты debian. это просто архивы .tar.xz, .tar.gz и т. д., например: mirror.yandex.ru/debian/pool/main/d/dpkg/dpkg_1.16... . Или, скажем, другой пример: mirror.yandex.ru/debian/pool/main/b/binutils/binut... + mirror.yandex.ru/debian/pool/main/b/binutils/binut... . в последнем примере нужно сперва скачать .orig.tar.gz, распаковать, затем распаковать diff.gz и применить этот diff к этому архиву.

    так вот, в любом случае вы получите сорцевой пакет дебиан. это специальные такие сорцы (исходники), в которых лежит папка debian специального формата. командой debian/rules с какими-то там аргументами этот пакет можно собрать. пишите комменты к этому ответу, если есть вопросы
    Ответ написан
    Комментировать
  • Самая быстрая система linux?

    @safinaskar
    Во-первых, не слушайте советы ставить Gentoo :) В Gentoo ускорение достигается за счёт сборки пакетов конкретно под ваш процессор, но реальное получаемое от этого ускорение ничтожно, оно не чувствуется.

    В реальности скорость вашего компьютера зависит от того, какие именно приложения вы используете (например, какую вы используете DE (desktop environment), т. е. Gnome или KDE или Unity или что там ещё).

    Так вот, не надо ничего переустанавливать, просто установите на вашу убунту какой-нибудь легковесный DE и юзайте его.

    Что касается установки программ - устанавливайте их через консоль (apt-get в *buntu и Debian), будет не так тяжеловесно. Также, тормоза могут быть вызываны тем, что apt-get/dpkg делает fsync после установки каждого пакета. Попробуйте установить eatmydata (apt-get install eatmydata). И затем запускайте apt-get так: eatmydata apt-get ... (если с sudo, то sudo eatmydata apt-get ...). Но при использовании eatmydata нельзя, чтобы система резко выключилась во время установки пакетов.

    Юзать нужно (особенно новичкам) простые популярные дистибутивы. Те, у которых много юзеров (которые вам помогут на том же тостере), которые популярны, и поэтому все проблемы в них оперативно фиксятся. Сюда относятся Debian, Ubuntu, Fedora, может ещё OpenSuse и Mint. И вроде на этом всё. Arch (арч, арчлинукс), Gentoo (генту), Slackware (слакварь, слака) сюда не относятся, не слушайте советы их ставить, это сложные дистрибутивы, там замучаетесь с настройкой. Manjaro сюда не относится, впервые слышу о таком дистибутиве :) CentOS не относится, она для серверов.

    Lubuntu и Xubuntu - это Ubuntu, у которых в качестве DE стоит, если я не путаю, LXDE и XFCE, соответственно, легковесные DE такие. Можно попробовать их. Или просто поставить LXDE или XFCE себе на Ubuntu, результат тот же будет
    Ответ написан
    Комментировать
  • Какая альтернатива сервису Dropbox для Мак и Линукс?

    @safinaskar
    Да, кстати, btsync . Как я понял, там абсолютно неограниченное место, хоть тыщу гигабайтов, и совершенно бесплатно. Фишка в том, что никаких центральных серверов, где бы хранилась копия ваших данных, нет. Т. е. btsync лишь синхронизирует данные между вашими устройствами, но не хранит у себя бекапа. Если вы утопите в луже любой из ваших устройств - всё будет ок, данные будут в порядке. Но вот если утопите сразу все - данные пропали
    Ответ написан
    3 комментария
  • Как это называется?

    @safinaskar
    конкретно в случае контакта - всё просто. контакт предоставляет api ( vk.com/dev ), это проще остальных методов. многие сайты дают api. если нет - тогда да, нужно автоматизировать браузер, использовать selenium и т. д. или можно по-другому - с помощью фичи "inspect element" выяснить, какие именно, скажем, POST запросы отправляются при отправке формы и далее отправлять их самому
    Ответ написан
    1 комментарий
  • На чем писать web приложение обвертку над консолью (bash)?

    @safinaskar
    Такая программа уже есть, shellinabox называется
    Ответ написан
    Комментировать
  • Что делать, если твои коллеги(и ты сам) только что освоили git, и каммитят все подряд?

    @safinaskar
    Коммитят, а не каммитят
    Ответ написан
    Комментировать
  • Почему в функции bash не видно переменную "$#" ?

    @safinaskar
    Чтобы передать функции в точности все исходные аргументы, можно написать так: my_func "$@"
    Ответ написан
    Комментировать