25 июня 2009 в 23:46

Cocotron, свежие новости с фронта Objective-C

Cocotron — это реализация runtime для Objective-C, похожего на рантайм Apple — Cocoa. Он достаточно сильно отличается от другого популярного открытого рантайма — GNUstep, как в целях, так и в реализации.

Cocotron отлично подходит для портирования кода с платформы OSX на Win32. Конечно реализация API далека до идеала, но, как показывает практика, разработчики всегда быстро решают проблемы.

Изначально Cocotron использовался только при кросс-сборке на базе XCode и mingw-toolchain. При кросс-сборке доступно развертывание на Windows, Linux и Solaris.

Конечно такой подход оставлял в цепочке разработки самый сложный и дорогой этап — OSX (оптимально — на оригинальном железе). Возможность Cocotron, как платформы, не могла быть полностью раскрыта из-за этой зависимости.


Cocotron не может работать с оригинальным GCC, где используется другой runtime Objective-C. По этой причине GCC необходимо собрать с патчами Apple, которые, помимо всего прочего, немного расширяют язык от того, что есть в vanilla GCC.

Процесс установки GCC вполне традиционен, для начала необходимо скачать дерево исходных кодов:
svn checkout http://cocotron-tools-gpl3.googlecode.com/svn/trunk/gcc cocotron-gcc

и потом скомпилировать его:
mkdir gcc-build
cd gcc-build
../cocotron-gcc/configure --prefix=/opt/objc --with-gnu-as --with-gnu-ld --without-newlib --disable-multilib \
    --disable-libssp --disable-nls --disable-libobjc --enable-libffi --enable-objc-gc \
    --enable-languages=c,objc,c++,obj-c++  --enable-checking=release
make -j2
sudo make install

здесь я испльзую префикс /opt/objc для GCC и Cocotron.

Как вариант — можно использовать собранный deb пакет, который любезно предоставил новоприбывший хабровчанин pfactum.

Теперь можно перейти к конкретно сборке Cocotron. На данный момент нативная сборка поддерживается для Linux, OpenBSD (и, вероятно, FreeBSD) и Darwin (т.е. OSX). Для сборки необходимо забрать форк официального дерева с github:
git clone git://github.com/farcaller/cocotron.git
cd cocotron
git checkout origin/native-build -b native-build

(кстати ветка master автоматически синхронизируется с официальным svn, так что если кто-то хочет «поковырять» исходники и предпочитает git — милости прошу).

Система сборки основана на CMake, причем не моложе 2.6:
mkdir build
cd build
cmake -DCMAKE_C_COMPILER=/opt/objc/bin/gcc \
    -DCMAKE_CXX_COMPILER=/opt/objc/bin/g++ \
    -DCMAKE_INSTALL_PREFIX=/opt/objc ..
make
sudo make install

пока что она собирает только Foundation, работа над скриптами сборки AppKit в процессе.

Собранную библиотеку можно протестировать:
cat > test.m <<EOF
#import <Foundation/Foundation.h>

int main(int argc, char *argv[])
{
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSLog(@"Hello, Objective-C World!");

        [pool drain];
        return 0;
}
EOF

/opt/objc/bin/gcc test.m -o test -I/opt/objc/include -L/opt/objc/lib \
  -lFoundation -lpthread -ldl


Я надеюсь, что развитие Cocotron привлечет к нему новых разработчиков и повысит популярность Objective-C, очень интересного языка программирования.
Владимир Пузанов @farcaller
карма
181,7
рейтинг 0,2
Похожие публикации
Самое читаемое Разработка

Комментарии (29)

  • 0
    Поясните пожалуйста что такое в данном контексте «рантайм».
    • +1
      окружение для запуска и выполнения кода
      • 0
        Все равно не понятно. Что за окружение кроме системных вызовов ОС нужно для запуска и выполнения кода?
        • 0
          К примеру методы для работы с классами непосредственно во-время выполнения программы — добавление\удаление методов, получения информации о аргументах сообщений и т.д.
          • –3
            Этот функционал не присутствует в самом языке?
            А почему нужен новый «рантайм»? Разве работа с «классами» и «добавление\удаление» методов это платформо-зависимые вещи?
            • +2
              Видимо я не совсем понял, про какой «рантайм» вы говорите.
              Может стоит внимательно почитать википедию? Возможно большинство вопросов отпадет.
              • 0
                Так я тоже не понял. В статье говорят о реализации какого-то «рантайма» для языка. А я не знаю что такое этот «рантайм». Вот пытаюсь узнать.

                А статьи на какую тему вы мне предлагаете прочитать в википедии? Objective-C?
                • +1
                  в данном контексте, runtime Objective-C — это его «стандартная библиотека», набор базовых классов.
                  • 0
                    Теперь понятно. Аналог libc для языка C.
                    • 0
                      Забыл добавить «спасибо».

                      Скажите, а почему уже существующие «рантаймы» не удовлетворяют?

                      Cocoa я так понимаю сильно привязана к MacOS?
                      • 0
                        Cocoa есть только под OSX (закрытый код, жестко привязанный к darwin).

                        Cocotron можно использовать на более широком наборе платформ, или портировать на новую.
                        • 0
                          Вы знаете какие-нибудь примеры кроссплатформенных приложений, написанных на Objective-С или хотя бы приложений не для MacOS?
                          • 0
                            desktop-клиент для одного из приложений в ифоновом AppStore (FileMagnet, если мне не изменяет память).

                            Мой недобитый веб-фреймворк, так и не завершен, но objc на сервере вполне применим.

                            А так, спросите лучше в рассылке
                    • 0
                      Да, что-то в этом духе. Естественно libc в objc коде тоже можно использовать, а для полной фееричности — можно и C++ добавить, будет код с двумя разными ООП реализациями :)
        • 0
          Прежде всего — реализация API
          • 0
            API для чего?
            • 0
              Точнее «к чему» правильнее, т.к. API = интерфейс.
  • 0
    Можете рассказать, чем интересен ObjC лично вам, в сравнении с другими языками?
    • 0
      Могу я рассказать чем он интересен лично мне?
      Для меня ObjC это скорость приближающаяся к С и ООП реализованный на мой взгляд лучше чем в С++
      • 0
        тк сам недавно сел за ObjC, очень интересуют отличия 1.0 и 2.0 версий. Можете пояснить вкратце или ссылкой ткнуть?
        • 0
          Я и сам не очень большой специалист, но из того что могу сказать навскидку это —
          2.0 работает только в OS X > 10.5,
          возможность автоматической сборки мусора,
          возможность использовать «точечный» синтаксис, место скобок (box.width вместо [box width]), с
          войства (гетеры\сетеры),
          новый for (for… in ..)
          может еще что-то…
          • 0
            спасибо, честно больше всего напрягают квадратные скобки в синтаксисе
            • +1
              Ну это не более чем вопрос привычки — пару тысяч строк кода со скобками и неприязнь пропадает ,)
        • +1
          Objective-C guide for C++ programmers. — книжка в .PDF (708 Кб).

          N.B. ступил, думал нужны отличия ObjC от Cpp =) ну да ладно, пусть тут полежит ^_^
    • 0
      Он позволяет опускатся на уровень С без малейших проблем, и, в тоже время, так же динамичен как питон.
      • 0
        Эх, ему бы ipython… Без REPL'a так что-то стало напряжно начать пользоваться новыми языками. ;)
        • 0
          биндинги на Cocoa, PyObjC — вполне работоспособны.
          • 0
            Та ну… Меня методы вида doIt_withThat_() угнетают слишком, совсем неинтересно. Вот другое дело с самим objc покопаться. Это можно и без REPL'a, но хочется же. :)
  • 0
    Хотелось бы увидеть примеры каких-то более менее больших приложений. ;)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.