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, очень интересного языка программирования.
+24
25 июня 2009, 23:46
6
farcaller 57,4

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

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

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

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

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

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

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

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

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

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