{{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]