{{Stub}} {{Vorlage:Sprache |Name = Objective-C |Inlineassembler = Nein |Compiler = gobjc, Cocoa |Plattformen = Mac OS X, [[Linux]] |Kernel = Siehe unten |Homepage = [http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/index.html Apple's Developer-Center] }} '''Objective-C''' ist eine imperative und objektorientierte Programmiersprache, welche in den 80er-Jahren von Brad Cox und Tom Love als Basis für NextStep, einem Betriebssystem auf Basis von 4.3BSD und dem Mach2-Kernel, entwickelt wurde. == Spracheigenschaften == Primär hat Objective-C als Grundlage [[C]], welches es um objektorientierte Eigenschaften und Syntax erweitert. Die Syntax ist dabei stark an Smalltalk angelehnt und hebt sich bewusst von den C-Sprachelementen ab. Objective-C implementiert dabei bekannte Elemente der Objektorientierung wie: * Klassen * Methoden * Instanzen * Delegierte == Objective-C als Sprache für ein Betriebssystem == Objective-C eignet sich genauso wie C für die Entwicklung von Betriebssystemen bzw. Kerneln, verfügt allerdings nicht, anders als C, über einen Inline-[[Assembler]], weshalb etwaige Assembler-Arbeiten extern erledigt werden müssen. Um die objektorientierten Eigenschaften von Objective-C zu nutzen bedarf es allerdings einiger Vorarbeiten (TODO ;-). == Kernel in Objective-C == Hier ein Objective-C-Kernel ohne Objektorientierung: === init.m === int init(int argc, const char *argv[]) { // Pointer zum Videospeicher char *video = (char*)0xB8000; // String zum Ausgeben char *hello = "Hello World"; // Zuerst den Speicher leeren for(video+=4000; video !=(char*)0xB8000 ;video--) *video=0; // String ausgeben while (*hello) { *video = *hello; video++; *video = 0x07; video++; hello++; } while (1); return 0; } Findige Leser des Wikis haben wahrscheinlich gemerkt: Das ist der gleiche Kernel wie im Artikel zu [[C]]; Objective-C hat als Basis C und somit ist (fast) jedes C-Programm auch ein gültiges Objective-C-Programm. Einzig wird aus #include folgendes: #import === start.S === Hier die Assembler-Startdatei samt [[Multiboot]]-Header, welche von [[GRUB]] aufgerufen wird und durch welche wir in den Objective-C-Kernel springen: .section .text .extern init .global _start _start: mov $_kernel_stack, %esp push 0 push 0 mov %esp, %ebp push %ebx call init jmp . .section multiboot #define MB_MAGIC 0x1BADB002 #define MB_FLAGS 0x0 #define MB_CHECKSUM -(MB_MAGIC + MB_FLAGS) .align 4 .int MB_MAGIC .int MB_FLAGS .int MB_CHECKSUM // 16 KB Stack werden hier reserviert .section .bss .space 16384 _kernel_stack: === link.ld === Dazu noch das [[Linker]]-Script: ENTRY(_start) SECTIONS { . = 0x100000; kernel_start = .; .text : { *(multiboot) *(.text) } .data ALIGN(4096) : { *(.data) } .rodata ALIGN(4096) : { *(.rodata) } .bss ALIGN(4096) : { *(.bss) } . = ALIGN(4096); kernel_end = .; } === Kernel erstellen === Gebaut wird der Kernel nun wie folgt: $ gcc -g -c -m32 -Wall -fno-stack-protector -fno-builtin -nostdlib -nodefaultlibs -c start.S $ gcc -g -c -m32 -Wall -fno-stack-protector -fno-builtin -nostdlib -nodefaultlibs -c init.m $ ld -melf_i386 -Tlink.ld start.o init.o -o objckernel Dieser kann dann mit [[QEMU|qemu]] direkt aufgerufen werden (ab Version 0.11.0): $ qemu -kernel objkernel == Compiler == * [http://gcc.gnu.org/ GCC] - Unterstützung auch für Objective-C (gobjc) == Weblinks == * [http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/index.html Apple's Developer-Center] * [http://www.otierney.net/objective-c.html Kleines Tutorial über die Spracheigenschaften]