Поддержка замыканий в C/C++/Objective-C в Snow Leopard
Угадайте, что это такое:
Скоро подобные конструкции будут все чаще встречаться в приложениях для Mac OS и, возможно, iPhone OS.
Еще в конце лета 2008 года Apple объявила, что работает над расширениями к C/C++/Obj-C под условным названием «блоки» (Blocks), которые представляют из себя ни что иное, как замыкания (closure).
Использование замыканий зачастую позволяет сделать код чище и понятнее, но это не единственная причина действий Apple.
Как угадал еще год назад сайт macresearch.com, это также связано с «войной за многоядерность», что и было подтверждено в июне 2009-го года: компания Apple выпустила «технологический» бриф, посвященный работе Grand Central Dispatch (одного из ключевых элементов Mac OS X 10.6 Snow Leopard).
Grand Central Dispatch позволяет с легкостью манипулировать различными очередями с блоками кода (об этом очень интересно написано в брифе), позволяя более эффективно использовать ресурсы многоядерных систем.
Понять это могут разработчики, имеющие доступ к XCode из Snow Leopard… а также все, кто установит PLBlocks toolchain/runtime для Mac OS X 10.5. Данный проект содержит в себе «расширенный» GCC, плагин к XCode и необходимые фреймворки. Откуда взялся этот код? Автор PLBlocks фактически портировал на 10.5 патчи к GCC от самой Apple. Установка описана на странице проекта и сложностей не представляет.
Пример кода, написанного мною за 15 минут:
Результат выполнения:
Пример очень простой; безусловно, тема блоков кода в C/Obj-C и использования Grand Central Dispatch гораздо шире и глубже.
Специально отобранные материалы для дальнейшего чтения (англ.):
Ждем релиза Snow Leopard и нового XCode. Вместе с тем, пока нет никаких подтверждений тому, что блоки появятся также и в iPhone OS (если не считать упомянутой реализации PLBlocks).
В общем, это прекрасно.
testblock = ^(char *s) { printf("String is %s\n", s); };
testblock("TEST!");
* This source code was highlighted with Source Code Highlighter.Скоро подобные конструкции будут все чаще встречаться в приложениях для Mac OS и, возможно, iPhone OS.
Еще в конце лета 2008 года Apple объявила, что работает над расширениями к C/C++/Obj-C под условным названием «блоки» (Blocks), которые представляют из себя ни что иное, как замыкания (closure).
Зачем все это?
Использование замыканий зачастую позволяет сделать код чище и понятнее, но это не единственная причина действий Apple.
Как угадал еще год назад сайт macresearch.com, это также связано с «войной за многоядерность», что и было подтверждено в июне 2009-го года: компания Apple выпустила «технологический» бриф, посвященный работе Grand Central Dispatch (одного из ключевых элементов Mac OS X 10.6 Snow Leopard).
Grand Central Dispatch позволяет с легкостью манипулировать различными очередями с блоками кода (об этом очень интересно написано в брифе), позволяя более эффективно использовать ресурсы многоядерных систем.
Как это выглядит со стороны программиста?
Понять это могут разработчики, имеющие доступ к XCode из Snow Leopard… а также все, кто установит PLBlocks toolchain/runtime для Mac OS X 10.5. Данный проект содержит в себе «расширенный» GCC, плагин к XCode и необходимые фреймворки. Откуда взялся этот код? Автор PLBlocks фактически портировал на 10.5 патчи к GCC от самой Apple. Установка описана на странице проекта и сложностей не представляет.
Пример кода, написанного мною за 15 минут:
#include <stdio.h>
#include <string.h>
void run_callback(char *s, void (^callback)(int len)) {
printf(" %s:", s);
callback(strlen(s));
}
void print_numbers(int *array, size_t array_size, int (^chooser)(int)) {
int i;
for (i = 0; i < array_size; i++)
if (chooser(array[i]))
printf("%4d", array[i]);
printf("\n");
}
int main (int argc, const char * argv[]) {
void (^testblock)(char *);
testblock = ^(char *s) { printf("String is %s\n", s); };
testblock("TEST!");
int test[] = { -1, 5, 91, -45, 0, 4, -43, 42 };
int len = sizeof(test)/sizeof(int);
printf("all numbers:\n ");
print_numbers(test, len, ^(int n) {
return 1;
});
printf("positive only:\n ");
print_numbers(test, len, ^(int n) {
return n > 0;
});
int factor = 2;
printf("another demo..\n");
run_callback("hello", ^(int len) {
int i;
for (i = 1; i <= len*factor; i++) printf("%3d", i);
printf("\n");
});
return 0;
}
* This source code was highlighted with Source Code Highlighter. Результат выполнения:
String is TEST!
all numbers:
-1 5 91 -45 0 4 -43 42
positive only:
5 91 4 42
another demo…
hello: 1 2 3 4 5 6 7 8 9 10
Пример очень простой; безусловно, тема блоков кода в C/Obj-C и использования Grand Central Dispatch гораздо шире и глубже.
Что еще почитать?
Специально отобранные материалы для дальнейшего чтения (англ.):
- Grand Central Dispatch Technology Brief (Apple)
- Friday Q&A on Blocks.
- Blocks Examples: NSOperationQueue and UIActionSheet
- Using Blocks: Understanding the Memory Management Rules
- Blocks, episode 1
- Blocks, episode 2: Life Cycles
- Block Implementation Specification (Apple, LLVM)
Ждем релиза Snow Leopard и нового XCode. Вместе с тем, пока нет никаких подтверждений тому, что блоки появятся также и в iPhone OS (если не считать упомянутой реализации PLBlocks).
В общем, это прекрасно.



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