Warum wird Objective-C außerhalb von Cocoa-Umgebungen nicht häufig eingesetzt?


24

Objective-C zeichnet sich durch gute Objektorientierung, Einfachheit, Eleganz und (als Obermenge von C) niedrige Fähigkeiten aus. Es könnte wie die einfache, moderne Alternative zu C ++ aussehen, die viele Leute in Go suchen und zu finden versuchen. Es wird jedoch nur in Cocoa- und Post-NextSTEP-Umgebungen verwendet und wird auch in diesem Fall aus historischen Gründen eher als Belastung als als optimale Wahl angesehen.

Warum ist es dann nicht weiter verbreitet? Was sind ihre Probleme?


5
"historische Gründe" bedeuten "viele Bibliotheken"

@vartec dazu bist du nicht gezwungen. Siehe MonoTouch, es ist beispielsweise C #. Oh und dann haben Sie Apples Regel über Objective-C, C und C ++, oder? Das haben sie schon aufgegeben.
Rightfold

Antworten:


28

IMO, das Problem mit Objective-C ist nicht so sehr ein massiver Mangel, sondern eher ein kleiner Mangel (besonders am Anfang) und ein Mangel an wahrgenommenen Vorteilen.

Objective-C war eine reine Obermenge von C, sodass C- Code leicht zu Objective-C übergehen konnte. Die Einstellung zu verwenden , Objective-C, jedoch von der C - Mentalität ein unterschied sich viel . Der Übergang von C zu Objective-C ist für Code einfach, für viele Programmierer jedoch überhaupt nicht. AC-Programmierer können nicht einfach ein paar neue Komfortfunktionen in Objective-C auswählen und erhalten fast sofort eine bessere Produktivität - er muss eine Menge neuer "Dinge" lernen, bevor er überhaupt irgendwohin gelangen kann.

C ++ machte den Übergang für einige Codes etwas schwieriger, aber für die meisten Programmierer viel einfacher. C-Programmierer, die es gewohnt sind, mit jedem Detail ihres Codes umzugehen, könnten dies in C ++ immer noch genau so tun, wie sie es wollten. C ++ machte es auch einfach, einige neue Funktionen zu verwenden (z. B. das Hinzufügen eines ctor, um Mitglieder Ihrer Struktur automatisch zu initialisieren), ohne Ihre Denkweise wirklich zu ändern. Viele OO-Puristen drängten auf radikale Änderungen im Denken, aber viele C-Programmierer wechselten zu C ++, ohne etwas Ähnliches zu tun (zumindest sofort - und oft auch immer, wenn es so aussieht).

C ++ auch sah viel besser vertraut zu den meisten C - Programmierer. Es wurden ein paar neue Schlüsselwörter hinzugefügt, aber (besonders zu Beginn) sah der Code immer noch ziemlich vertraut aus. Trotz seiner „reinen Obermenge“ -Status, die meisten Objective-C - Code sieht ziemlich fremd die meisten C - Programmierer. Vieles in C ++ ist auch ziemlich einfach zu erklären und zu verstehen, was die Funktionsweise von C angeht. Bei einem Wechsel zu Objective-C gibt es noch viel mehr Stellen, die Sie als "Vertrau mir einfach und vergiss alles, was du zu wissen glaubst" bezeichnen können. "

Viele der Entwurfsentscheidungen in Objective-C haben es auch (etwas) langsamer als C ++ gemacht, insbesondere auf relativ alten Computern mit langsamen Prozessoren, begrenztem Arbeitsspeicher usw. Zu Recht oder zu Unrecht wurde es auch größtenteils als Einzelprodukt angesehen C ++ war für jedermann frei verfügbar und konnte von jedermann implementiert werden.

All dies führte dazu, dass C ++ früh genug eingeführt wurde, so dass es ziemlich schnell eine "kritische Masse" erreichte, so dass es (unter anderem) die offensichtliche Wahl für viele Projekte wurde, nur weil es bereits weit verbreitet und bekannt war Menge.

Objective-C hat diesen Punkt nie erreicht. Tatsächlich war es auf dem besten Weg, in Vergessenheit zu geraten, als Apple es wiederbelebte, indem es fast jedem aufgezwungen wurde, der für seine Systeme entwickeln wollte. Der Marktanteil von Apple ist jedoch nicht groß genug, um ihm wirklich eine kritische Masse zu verleihen - nur eine größere Nische. Es ist eine "Standard" Wahl, nur wo / weil Apple es so macht.

Ich möchte auch hinzufügen, dass das Smalltalk-ähnliche Objektmodell von Objective-C meiner Meinung nach in Wirklichkeit eine viel stärkere Konkurrenz zu Java darstellt als C ++. Ja, es hat immer noch die C-Basis und Sie können immer noch Code auf niedriger Ebene schreiben, ohne eine separate Sprache zu verwenden - aber reines C und reales Objective-C sind genug verschieden, dass es weniger wie eine einzelne Sprache als zwei völlig verschiedene Sprachen ist zufällig werden beide von einem einzigen Compiler verarbeitet (obwohl es praktisch ist, dass die beiden miteinander kommunizieren können, ohne dass sich JNI ihnen anschließt).


Ein ausgezeichneter historischer Rückblick. Ich habe zum ersten Mal in den 90er Jahren in Objective-C auf NextSTEP-Maschinen mit weißer Box programmiert und hatte an der Universität bereits C ++ gelernt. Als solches kann ich viele der Dinge schätzen, die Sie hier sagen.
Mark Booth

danke, das ist offensichtlich die Antwort, nach der ich gesucht habe. ritchie machte C, um Teamarbeit zu ermöglichen; "C ist schrullig fehlerhaft und ein enormer Erfolg"; Dieses Zitat BEDEUTET, dass Sie eine flache, einfache Sprache erstellen müssen, damit viele Leute es verstehen können, und das bedeutet nicht, dass es eine "großartige" Sprache sein muss. Niemand will sich über objc beschweren, weil es niemandem gefällt. "es gibt sprachen, über die sich leute beschweren, und sprache, die niemand benutzt" bjarne stroustup. Zumindest konnte Windows die Computerindustrie mit einem Clusterfick in Unternehmen wachsen lassen, und ich hoffe, Apple scheitert, weil sie sich nicht um Entwickler kümmern.
jokoon

Tut mir leid, aber selbst wenn Sie als Entwickler neue Dinge lernen müssen, heißt das nicht, dass Sie alles vergessen müssen, was Sie bereits wissen. Ich habe gehört, dass die Messenger-Funktionalität von objc mit einem optimierten ASM-Code erstellt wurde. Was für ein Durcheinander, wie kannst du den Entwicklern sagen, dass sie das verstehen sollen? Wie wäre es mit Treibern und Kernel-Entwicklern? Macs sind nur Cadillacs, mit denen Sie fahren. Es handelt sich nur um teure Objekte, die verkauft werden. Sie können also einfach E-Mails abrufen und eine DVD ansehen. Möchten Sie diesem Ding Software hinzufügen? Viel Glück Kumpel. Vergessen Sie alle vorhandenen weichen und machen Sie den Apfel Weg TM.
jokoon

+1, sehr gute Erklärung!
Chan

11

Im Grunde genommen ist Apple seit einiger Zeit die treibende Kraft hinter Objective-C:

  • Während die letzte Version praktisch aufgegeben wird, Objective-C 2.0 beginnt eigentlich immer zu einige der Kernklassen Stiftung gebunden zu werden / Protokolle, das heißt, es ist eine inhärente Verbindung zwischen den Sprachfunktionen und Rahmen, NSFastEnumeration Federungs- meiner Meinung nach , das benötigt wird, damit Objekte in Schleifen richtig reagieren können. Dies bedeutet, dass eine wachsende Verbindung zwischen der Sprache und der Plattform besteht.
  • Es gibt praktisch keine echte Alternative zu Kakao. Und Cocoa wiederum fängt an, von immer mehr OSX-Funktionen abhängig zu sein. Obwohl technisch gesehen eine Objective-C-Implementierung auf jedem Betriebssystem mit jedem Kernframework ausgeführt werden kann, gibt es für keine andere Plattform wirklich viel Neues.

Gegenwärtig hat Apple die volle Kontrolle über Objective-C und steuert die Sprache gemäß seinen Anforderungen. Es gibt jedoch keine Organisation auf diesem Planeten, die Objective-C auf einem Gerät ausführen möchte, das nicht von Apple stammt und groß genug wäre, um eine zu bieten Zunächst eine Standardbibliothek und ein Toolkit, die es sogar mit den Ökosystemen von .NET / Mono, C ++ oder Java aufnehmen können.


3
Es gibt GNUStep. Sie versuchen, mit Apple Schritt zu halten, obwohl ich eine Weile nicht überprüft habe, wie gut sie sind.
Per Johansson

1
Und es gibt auch Cocotron.
ysdx

1
Zum Zeitpunkt dieser Antwort war es wirklich nicht möglich, Objective-C 2.0 auf einer Nicht-Apple-Plattform auszuführen. Wie auch immer, danach wurden viele Anstrengungen unternommen, und jetzt können wir davon ausgehen, dass Objective-C 2.0 unter FreeBSD mit GNUstep ziemlich reibungslos läuft.
Eonil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.