Fragen & Antworten: Mac, Unix, Programmierung

Manche Leserfragen sollte ich wohl besser öffentlich beantworten, weil sie vielleicht noch mehr Leute interessieren. Zum Beispiel diese.

Unix lernen

Eine Frage war sinngemäß:

Bei macOS ist die geniale Oberfläche mit Unix drunter klasse, aber wie kann ich mehr über Unix und diese kryptischen Befehle erfahren? Gibt es ein Buch über den historischen und technischen Hintergrund? Sind die Bash-Befehle identisch mit denen auf Linux? Reicht ein Linux-Buch oder gibt es ein spezielles Mac-Buch?

Linux-basierte Systeme verhalten sich nicht ganz wie macOS, weil macOS dem Unix-Standard entspricht, Linux jedoch mit der Linux-Standard-Base sein eigenes Ding macht und sich nur teilweise um Kompatibilität mit Unix schert. Ein Linux-Buch am Mac würde also stellenweise Verwirrung stiften.

Apple hat eine schöne Einführung zur Kommandozeile: The command line. Nicht vom Wort Server ablenken lassen, denn macOS unterscheidet sich aus User-Sicht von der Server-Version nur durch eine kostenlose Server.app, die die Server-Dienste in macOS leichter verwaltbar macht.

Ich habe damals zum Beispiel Learning Unix for Mac OS X gelesen. Und "Mac OS X Panther in a Nutshell", was eine komplett aussehende Referenz von Unix-Befehlen am Mac enthält, oder "Learning UNIX for Mac OS X Panther". Von diesen Büchern gibt es meines Wissens nicht viele aktualisierte Versionen, was aber nicht so schlimm ist, weil sich die grundlegenden Dinge nicht geändert haben. Heute würde ich bei Amazon nach "Unix Mac" suchen. Dort gibt es dann aktuellere Werke wie "Take Control of the Mac Command Line with Terminal". Grundsätzlich ist auch jedes Buch über die Bash-Shell hilfreich, aber dort wird nicht immer auch auf die Mac-typischen zusätzlichen Kommandos eingegangen.

Programmieren lernen

Eine andere Frage ging in diese Richtung:

Du sagst, Objective-C rockt, aber wenn man von Basic, Pascal oder C kommt, erscheint einem Objektorientierung irgendwie komisch. Lohnt sich Java? Das soll ja plattformunabhängig sein. Was sind die Unterschiede zwischen Java, Objective-C, C# und C++?

Objektorientierung kann man einfach als Zuordnung von Funktionen zu ihren Daten betrachten. Du hast bestimmte Daten und mit denen kann man bestimmte Dinge tun. Dann gibt es andere Daten, für die man andere Funktionen braucht. Die Funktionen heißen dann Methoden und zusammen mit den zugehörigen Daten sind sie Objekte. Man kann sich Code-Wiederholungen sparen, indem man Datentypen und Methoden von anderen Objekten übernimmt / erbt und evtl. verändert / überschreibt. Unterschiedliche Arten von Objekten und ihren Methoden nennt man eine Klasse. Eine lebende Instanz von einer Klasse ist dann wieder ein Objekt. Klingt etwas verwirrend, aber wenn man einfach mal damit rumspielt ergibt sich das alles von selbst.

Wenn man von Nicht-Objekt-Sprachen kommt und Structs und so kennt, dann ist der Einstieg in Swift wahrscheinlich leichter, da Swift ziemlich unterschiedliche Programmierstile unterstützt. Die Structs in Swift erinnern an prozedurale Programmierung wie in Pascal oder C, andererseits hat Swift einen klaren Objekt-Fokus, bietet aber auch funktionale Programmierung wie man sie von Haskell kennen könnte. Die Playgrounds von Swift sind eine große Erleichterung beim Lernen, weil man wie damals mit Basic einfach drauflos tippen kann und Ergebnisse sieht. Und zwar nicht nur Text, sondern auch Graphiken und Verhalten von Schleifendurchläufen.

Swift läuft auch auf Ubuntu Linux und ist nicht auf macOS beschränkt. Ansonsten sind auch alle C-Sprachen innerhalb von Unix vom Konzept her plattformunabhängig.

An Objective-C gefällt mir, daß man 100% normales C programmieren kann, aber gleichzeitig auch objektorientiertes Objective-C. Also High- und Low-Level, je nachdem, was man grade braucht. Im Gegensatz zu C++, was auch eine objektorientierte Weiterentwicklung von C ist, ist Objective-C 100% kompatibel zu C. C++ nicht ganz so. C++ hat im Gegensatz zu anderen objektorientierten Sprachen Mehrfachvererbung, was zu Problemen führen kann. Objective-C arbeitet mit Categories, die die Vorteile von Mehrfachvererbung bieten, aber die Nachteile vermeiden. Swift kann vergleichbares. Weiter finde ich an Objective-C gut, daß es eine dynamische Sprache ist, man also zur Laufzeit Dinge ändern kann und mit Key-Value-Coding mit Daten arbeiten kann, deren Klasse einem dadurch völlig egal sein kann. Objective-C ist dynamisch und tolerant, was sehr elegante Programmierung ermöglicht. Aufrufe auf nicht existierende Objekte werden zum Beispiel ignoriert und Auswertungen haben automatisch logisch sinnvolle Werte. Der boolsche Wert eines nicht existierenden Objektes ist zum Beispiel NO/false.

Die Unterschiede zwischen Objective-C und Swift behandele ich in Swift-Flight, Schwalbenflug, auf Crash-Kurs mit Swift und in Swift-Check. Java empfinde ich als zu streng typisiert, umständlich und zu aufwendig mit einem völlig übertriebenem Exception-Handling. Threading auf hohem komfortablem Niveau bieten nur Objective-C und Swift mit Operation Queues und Grand Central Dispatch. Multithreading in Java ist grauenhaft umständlich und fehlerträchtig. "Asynchrone" Downloads blockieren in Java immer einen Thread, was auf einen Programmierer von Objective-C oder Swift wie Steinzeit wirkt.

Auch die Weiterentwicklung von Java kann man nur als enttäuschend lahm beschreiben. Geplante Neuerungen wurden immer wieder auf Jahre hinaus verschoben. Da hat sich in den letzten Jahren bei Objective-C und seinen APIs und Xcode echt mehr getan. Und natürlich bei Swift auch. Wer Java macht, benutzt eine Art von Eclipse oder einen Ableger von IntelliJ. Beide sind im Vergleich zu Xcode super lahm und lassen den Lüfter im Dauerlauf ertönen. Die Plattformunabhängigkeit von Java ist in der Praxis auf allem, was nicht Server-Programmierung ist, ziemlich egal. Es gibt kaum User-Programme, die plattformübergreifend Java verwenden, weil jede Plattform ihre Eigenheiten und Stärken hat, die man mit Java nicht wirklich nutzen kann. Bei der Server-Programmierung mit Java muß man immer zusehen, kompatible SDKs und Libraries am Start zu haben für alle Plattformen. Aber die meisten machen das auch hier nicht. In der Regel entscheidet man sich für eine Plattform, auf der man Java macht und der Rest ist egal, man wird eh nicht die Plattform wechseln. Die Plattformunabhängigkeit von Java ist kein so großer Vorteil als der er früher verkauft wurde. Ich kann auch C, Swift und Objective-C etc. durch Neukompilieren auf eine andere Plattform bringen, wenn ich auf plattformspezifische Dinge, wie es Java tut, verzichte.

C# ist eine Microsoft-Sprache, die entstanden ist, weil Microsoft keine proprietären Änderungen an Java vornehmen durfte. Es ist also konzeptionell eine nicht plattformunabhängige Version von Java ohne Java zu sein.

Im Dev-Bereich meiner Seite habe ich eine Reihe von Buch-Empfehlungen für Apple-Entwickler.

Wer mit Programmierung auf dem Mac anfangen möchte, also kein erfahrener Objective-C Entwickler ist, dem empfehle ich Swift. Alle anderen Sprachen sind für sich betrachtet schon ziemlich uncool und nutzen außerdem die Mac-Plattform nicht gescheit aus.

Valid XHTML 1.0!

Besucherzähler


Latest Update: 14. May 2017 at 19:31h (german time)
Link: macmark.de/blog/osx_blog_2017-05-b.php