Rust for iOS: Status Update

It’s been a while since last status update, but I hope it was worth waiting. Rust is now completely ported to iOS: all architectures for device/simulator are supported. Since green threads were removed, adding support of arm64 was actually almost straightforward. Special thanks this time goes to Will Glozer who was debugging remotely. Fortunately for our sanity, there were just a couple of minor issues.

Although all changes have been landed to master, cross-compiled libraries aren’t distributed with nightly, so in case you’re interested in trying it out, you can either build it from source (instructions) or use a pre-built dist.

As earlier, the main usage sample is located here. It still uses makefile based approach and I hope to update for cargo a little bit later.

Rust Docsets for Dash

Since I’m tracking Rust nightly and documentation from the last release was quite outdated, I’ve wrote a quite simple (at least I think so) docset generator for Dash (wonderful piece of software).

Here is the link to feed which is updated once new nightly released.

Once it was complete, I’ve understood that I’d like to see docs for my libraries in Dash as well and here is what I’ve got: rust-docset – it is a Python script which allows to generate Dash docsets and feed from any Rust docs.

It requires a pretty simple TOML manifest to be available, like this one:

 1 [docset]
 2 name = "Piston"
 3 bundle_id = "piston"
 4 version = "0.0.1"
 5 type = "docset.rust"
 6 doc_dir = "../doc"
 7 out_dir = "doc_out"
 9 [feed]
10 base_url = ""
11 upload_cmd = "./"

and might look like this:


s3cmd put -P $1 s3://net.vhbit.rust-doc
s3cmd put -P $2 s3://net.vhbit.rust-doc

While it started as Rust only project, I believe it could be relatively easily programmed to work with documentation generated by other tools.

Rust for iOS: Merged Into Master

Current state

About a week ago it was finally merged into Rust master branch which is really great as it is much easier to work on smaller changes now.

Here are instructions on how to build it. So far there is no official iOS buildbot and therefore it might broke at any moment, in this case I recommend to use a original fork which could be considered a “stable” branch, tested to compile and work both on device and simulator. It might lag a bit from the master but not that much.

There is still one issue in LLVM which sometimes crashes compilation process. Patch was submitted but considering previous experience I wouldn’t expect it to be landed in less than a month.

I’ve started work on Arm64 port but it definitely will take much more time considering I have no test device.

Rust for iOS: Progress Report

Although there is no public indication, work on porting Rust to iOS continues, moreover it is going to the final stage. So far I’ve got all required pieces working:

  • fixed issue with mutexes crashing libgreen/rustuv runtime
  • got a working patch for LLVM to support segmented stacks
  • got working unwinding (another patch to LLVM compiler-rt)

In general, all major features are working now, providing first-class support of all Rust safety. There definitely might be small hiccups here and there but I believe they could be solved step-by-step, once the major part will be upstreamed to Rust master branch.

I need some time to clean up the code (as it has a lot of experimenting branches) and once patches to LLVM and compiler-rt landed – the last step will be rebase on current master and issue an PR.

I hope it will be finished this week.

Rust on iOS

Porting process

Finally got working Rust cross-compiler for iOS so now it is possible to create static libraries which could be used from Objective C. For now only armv7 architecture is supported (although there are upcoming commits in “try” branch which will update LLVM version with ARM64 support right from Apple).

These were main pain points:

  • Slow full rebuild… Yep, I know, I know, 3 stage bootstrapping to be extremely optimized but still… it was especially painful on initial stage while experimenting with built options and LLVM patching.

  • TLS isn’t supported on armv7 so it should be emulated. Initially I’ve started adding it to LLVM and with help from Tim Northover and Dan Olson even got it working. (BTW, Dan knows a lot about this topic as he got a working D compiler for iOS, so if you’re interested in modern compiled language for iOS – you can try it too). Just to discover that actually Rust has built-in TLS “emulation” support (actually using the same technique as in LLVM patches)… Grr, hate myself for not checking this before messing with LLVM.

  • There were absolutely crazy crashes hard to debug because some kind linker errors/misconfiguration when functions were resolved correctly but all the data was relocated incorrectly and contained garbage.

  • There were mystical crashes in hash function which automagically disappeared once I’ve increased optimization level.

  • The final show-stopper was happening in runtime finalization routine – it always crashed on misaligned data during mutex locking. The reason was that mutex opaque data was copied as a plain data. It wasn’t the case on desktop OSes but seemed to be a big difference on iOS. There is a simple fix for native runtime and should be similar fix for green/rustuv.

What works

  • armv7 only (ARM64 port should be quite easy to introduce)

  • it is possible to compile standard libraries and use them

  • “native”-based runtime

  • creating static libraries which could be used from iOS applications

Known issues

  • green/rustuv runtime crashes because of incorrect mutex implementation

  • segmented stacks aren’t working

  • it might require additional manual linking

  • no support for simulator yet

  • it only works on common compiler flags. It is critical to have exactly —opt-level 2 (or -O) as both decreasing and increasing opt level may cause a lot of unexplainable issues

Shut up and take my money Build instructions

clone and create build dir

git clone
cd rust
git checkout ios
mkdir build_ios
cd build_ios


../configure --target=arm-apple-ios



or (for 4 core CPU)

make -j4

There is a sample project with instructions on how to integrate.


Special thanks to Tim Northover (ARM TLS), Dan Olson (ARM TLS), Alex Crichton (Rust internals) and my wife for being patient.

Joe Armstrong об ООП, Concurrency

Две части замечательной беседы с Джо Армстронгом (создателем erlang’а) об объектно-ориентированном программировании и почему оно скоро упрется и вынуждено будет смещаться в сторону функционального.

Один из интересных тезисов – это то, что сейчас нас начинает поджимать железо, если раньше мощности росли в количестве гигагерц, то сейчас все идет за счет увеличения числа ядер. А это провоцирует на переход к concurrent-based программированию (есть, кстати, нормальный русский термин для этого?), где императивщина в чистом виде начинает загибаться из-за возрастающей сложности разнообразных локов и защит.

Материал 2007 года и этим вдвойне интересней, т.к. тренды, о которых говорит Джо, из гипотетических становятся все более и более ощутимыми.

Переопределяем метод класса в рантайме

В кои-то веки потребовалось в рантайме переопределять методы класса. В документации сразу нашлась подходящая функция:

BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

единственный аргумент, который может смутить – это types, который задает типы аргументов и возвращаемого значения в закодированном текстовом виде. Нужные значения можно посмотреть либо в документации, либо исппользовать @encode.

Вторая тонкость оказалась в том, что эта функция добавляет (или переопределяет) метод экземпляра, а что же делать если нужно заменить метод самого класса?

Правильно, получить метакласс с помощью object_getClass(ourClass) и заменить его метод как обычно :)

Замена цветов с помощью CIColorCube

Несмотря на то, что фильтр достаточно простой и эффективный, найти примеры кода с его использованием удалось чисто случайно уже после того, как все заработало :–)

Куб предназначен для замены множества цветов. R, G, B компоненты исходного цвета являются трехмерными координатами нового цвета, который задается в виде 4 float’ов (RGBA).

В приведенном примере происходит хитрая замена цвета со всеми оттенками. Для удобства используется работа с цветом в формате HSV, т.к. в этом случае гораздо легче выцеплять схожие цвета – они будут попадать в сектор.

Dash - последний штрих документации

Во время испытания AppCode (это вообще отдельная тема для разговора) столкнулся с тем, что неудобно держать открытым еще и xCode для просмотра документации. Когда-то давно пробовал Ingredients, но как-то не зацепило + были проблемы со стабильностью. Набрел на Dash – утилитку, без которой уже не представляю свою ежедневную работу. Недавно как раз обновилась до 1.3 и появилась в Mac AppStore

Итоги 2011 года на встрече RADUG

К сожалению, сам не попаду, но всячески рекомендую подвести итоги 2011 года в компании Russian Apple Developer’ов.

Дата: 7 декабря Начало: 19.00 Место проведения: Москва, Digital October

Мы традиционно завершаем год встречей в формате блиц-докладов. Приглашаем девелоперов, дизайнеров, менеджеров и всех энтузиастов iOS и Mac OS X. Регистрация на встречу. Участие во встрече как всегда бесплатное.

Ключевые люди российской индустрии расскажут, чем запомнился 2011 год, что было важными событиями и кто были главные люди и какие планы на следующий год. Мы ждем, что Вы также поделитесь с сообществом своим опытом, достижениями и открытиями.

Предновогодняя встреча RADUG – самое правильное место, чтобы оставаться в курсе происходящего, заявить о себе и завязать контакты. После встречи как всегда After Party – планируйте свое время!

Обратите внимание, что в Digital October, перед встречей RADUG пройдет еще одно мероприятие, посвященное мобильной разработке – Mobile Developer Day. Конференция платная, но в ее рамках есть бесплатная секция Developer Garage, включающая два мастер-класса по разработке приложений под iOS. Если есть желание – перед встречей RADUG можно заглянуть также и туда.