View Programare
Programarea în Mac OS X
Apple livreaza odata cu sistemul de operare un set de unelte de dezvoltare care pot fi instalate optional, reunite sub denumirea generica Xcode.
Xcode contine:
- Xcode, un IDE pentru dezvoltare de proiecte care produc binare Mac OS X
- InterfaceBuilder, un IDE pentru editarea de NIB-uri (fisiere de resurse grafice)
- gcc, compilatorul de C de la GNU (3.3 si 4.0)
- gdb, debugger-ul de la gnu
- un set de utilitare intre care FileMerge, PackageMaker, Icon Composer
- o multitudine de exemple de programare folosind API-urile Mac OS X
Xcode poate fi de asemenea download-at (descarcat) gratuit de la connect.apple.com, dar numai dupa inregistrarea ca dezvoltator. Aceasta inregistrare este gratuita si nu presupune decat completarea unui formular online.
Apple ofera de asemenea un set de unelte pentru analiza executiei binarelor grupate sub denumirea CHUD (Computer Hardware Understanding Development).
CHUD contine:
Shark
Shark permite samplarea executiei urmata de analiza referitor la timpul de procesor consumat de fiecare functie C folosita de programul analizat. Utilitarul ofera sugestii referitoare la optimizarea aplicatiei, de exemplu prin semnalizarea acelor functii care ar fi avantajate de compliarea inline. http://developer.apple.com/tools/shark_optimize.html
Saturn
Saturn este un analizor la nivel de functie. Spre deosebire de Shark, Saturn necesita compilarea speciala pentru profiling (gen gprof) prin utilizare optiunii gcc “-finstrument-functions” si link-area cu lib-ul “libSaturn.dylib”
C/C++/Objective C Compilatoare, debuggere ...
PHP +Apache +MySQL ...
Despre API-urile native Mac OS X
Mai degraba traditional decat revolutionar, Mac OS X a fost si este unul din putinele sisteme comerciale fondat pe o multitudine de tehnologii existente la conceptia lui. In consecinta stratificarea in Mac OS X este evidenta, cu tehnologii care functioneaza armonios impreuna, desi au catusi de putin in comun cum ar fi Carbon, Cocoa si stratul BSD.
Stratificarea din OS X este vizibila la nivelul API-urilor care sunt expuse dezoltatorilor:
- BSD este imprumutat din FreeBSD si ofera functionalitatati caracteristice sistemelor Unix si in mare masura Linux
- IOKit este specific Mac-ului (trebuie verificat in carti, nu sunt foare sigur ca asta-i corect) si ofera un API de IO in userspace (spatiul utilizator?)
- Carbon este probabil cel mai vast API si contine o colectie vasta de functionalitati, de la echivalentul STL-ului C++ cu dictionare, array-uri, la interactiune cu managerul de ferestre si Quartz, primitive grafice, un strat audio extrem de complet si complex deopotriva, functii de aces la sistemul de fisiere care pastreaza compatibilitatea cu vechile sisteme (alias, resource fork).
- Cocoa este cel mai nou API din OS X, care dispune de avantajul Objective-C-ului, un limbaj de programare derivat din C si totusi diferit complet de C++.
Toate aceste straturi au in comun limbajul de programare (C sau variante ale C-ului, Objective-C si C++) ceea ce permite dezvoltatorului sa traverseze cu usurinta granita dintre API-uri si sa foloseasca API-ul potrivit pentru problema care necesita rezolvare.
Mai mult decat atat - mare parte din structurile de data din Carbon sunt toll-free-bridged (no traduceti voi asta, inseamna ca trecerea de la o structura la alta se realizeaza fara cost - i.e. doar facand cast din C) permitand trecerea foarte comoda dintr-un API in celalalt.
Exemplul de mai jos arata integrarea intre IOKit (care face accesul la hardware), Carbon (care este folosit de IOKit pentru modelarea structurilor de date) si Cocoa pe care il folosim ca sa facem toll-free-bridging intre CFMutableDictionaryRef, dictionarul din Carbon si NSDictionary, dictionarul din Cocoa.
cristi:~/Programming/test diciu$ cat applebattery.m
#include <IOKit/IOKitLib.h>
#include <CoreFoundation/CoreFoundation.h>
#include <Cocoa/Cocoa.h>
/*
Wiki macuser.ro - exemplu de amestec de tehnologii - arata datele din registrii IO despre baterie pe MacBook.
Probabil ca merge si pe alte Mac-uri.
If you've Googled your way here and can't read Romanian, feel free to use the code below.
(c) 2007, diciu
*/
int main()
{
kern_return_t kr;
io_iterator_t io_objects;
io_service_t io_service;
CFMutableDictionaryRef classToMatch;
CFMutableDictionaryRef service_properties;
kr = IOServiceGetMatchingServices(kIOMasterPortDefault,
IOServiceNameMatching("AppleSmartBattery"), &io_objects);
if(kr != KERN_SUCCESS)
{
printf("Error
");
}
while((io_service= IOIteratorNext(io_objects)))
{
kr = IORegistryEntryCreateCFProperties(io_service, &service_properties,
kCFAllocatorDefault, kNilOptions);
if(kr == KERN_SUCCESS)
{
NSDictionary * m = (NSDictionary *)service_properties;
NSLog(@"%@", m);
}
CFRelease(service_properties);
IOObjectRelease(io_service);
}
IOObjectRelease(io_objects);
}
Compilarea se face cu GCC, la care Apple a contribuit code pentru partea de Objective-C.
cristi:~/Programming/test diciu$ gcc -o battery applebattery.m -framework IOKit -framework CoreFoundation -framework Cocoa
OS X permite rularea binarelor ca orice alt Unix, din linie de comanda.
cristi:~/Programming/test diciu$ ./battery
2007-03-28 08:44:59.824 battery[317] {
AdapterInfo = 0;
Amperage = 2666;
AvgTimeToEmpty = 65535;
AvgTimeToFull = 122;
BatteryInstalled = 1;
BatteryInvalidWakeSeconds = 30;
CurrentCapacity = 2869;
CycleCount = 36;
DesignCapacity = 5020;
DeviceName = ASMB013;
ExternalChargeCapable = 1;
ExternalConnected = 1;
[..]