Tại sao Objective-C không được sử dụng rộng rãi ngoài môi trường Ca cao?


24

Objective-C có tính năng định hướng đối tượng đẹp, đơn giản, thanh lịch và (như một siêu sao của C), khả năng ở mức độ thấp. Nó có vẻ giống như sự thay thế đơn giản, hiện đại cho C ++ mà nhiều người tìm kiếm và cố gắng tìm trong Go. Nhưng nó chỉ được sử dụng trong môi trường Ca cao và sau NextSTEP, và thậm chí trong trường hợp này được coi là gánh nặng vì lý do lịch sử hơn là một lựa chọn tối ưu.

Tại sao nó không được sử dụng rộng rãi hơn sau đó? Vấn đề của nó là gì?


5
"Lý do lịch sử" có nghĩa là "rất nhiều thư viện"

@vartec bạn không bị buộc phải làm điều đó. Xem MonoTouch chẳng hạn, đó là C #. Ồ và sau đó bạn có quy tắc của Apple về Objective-C, C và C ++, phải không? Họ đã từ bỏ điều đó.
đúng

Câu trả lời:


28

IMO, vấn đề với Objective-C không có quá nhiều thiếu sót lớn, vì những thiếu sót nhỏ (đặc biệt là sớm) và thiếu các lợi thế nhận thức.

Objective-C là một superset thuần túy của C, vì vậy C có thể dễ dàng chuyển sang Objective-C. Tuy nhiên, tư duy sử dụng Objective-C khác với tư duy C rất nhiều . Việc chuyển đổi từ C sang Objective-C dễ dàng cho mã nhưng không dễ dàng đối với nhiều lập trình viên. Lập trình viên AC không thể dễ dàng chọn một vài tính năng tiện lợi mới trong Objective-C và có năng suất tốt hơn gần như ngay lập tức - anh ta cần học nhiều "công cụ" mới trước khi có thể đi đến bất cứ đâu.

C ++ làm cho việc chuyển đổi cho một số mã khó khăn hơn một chút, nhưng quá trình chuyển đổi đối với hầu hết các lập trình viên dễ dàng hơn nhiều. Các lập trình viên C đã quen với việc xử lý mọi chi tiết mã của họ vẫn có thể làm như vậy trong C ++ đến chính xác mức độ họ muốn. C ++ cũng giúp bạn dễ dàng sử dụng một số tính năng mới (ví dụ: thêm một ctor để tự động khởi tạo các thành viên trong cấu trúc của bạn) mà không thực sự thay đổi cách suy nghĩ của bạn. Rất nhiều người theo chủ nghĩa thuần túy OO đã thúc đẩy những thay đổi căn bản trong suy nghĩ, nhưng rất nhiều lập trình viên C đã chuyển sang C ++ mà không làm bất cứ điều gì tương tự (ít nhất là ngay lập tức - và thường là, từ vẻ bề ngoài của mọi thứ).

C ++ cũng trông quen thuộc hơn nhiều đối với hầu hết các lập trình viên C. Nó đã thêm một vài từ khóa mới, nhưng (đặc biệt là từ rất sớm), mã vẫn chủ yếu trông khá quen thuộc. Mặc dù có trạng thái "superset thuần túy", hầu hết mã Objective-C trông khá xa lạ với hầu hết các lập trình viên C. Rất nhiều C ++ cũng khá dễ giải thích và hiểu theo cách mọi thứ hoạt động trong C. Chuyển sang Objective-C có nhiều nơi hơn mà tất cả những gì bạn có thể nói là "hãy tin tôi và quên mọi thứ bạn nghĩ. "

Nhiều quyết định thiết kế trong Objective-C cũng khiến nó (phần nào) chậm hơn C ++, đặc biệt là trên các máy tương đối cũ với bộ xử lý chậm, bộ nhớ hạn chế, v.v ... Đúng hay sai, nó cũng được xem chủ yếu là một sản phẩm của một công ty, trong đó C ++ được cung cấp miễn phí cho bất kỳ ai và mọi người thực hiện.

Tất cả những điều này dẫn đến việc C ++ được thông qua đủ nhanh vì nó đã đạt được "khối lượng quan trọng" khá nhanh, vì vậy (trong số những thứ khác), nó trở thành lựa chọn rõ ràng cho rất nhiều dự án chỉ vì nó đã được sử dụng rộng rãi, nổi tiếng số lượng.

Mục tiêu-C chưa bao giờ đạt đến điểm đó. Trên thực tế, nó đang trên đường mờ dần đi khi bị che khuất khi Apple hồi sinh nó bằng cách buộc nó vào bất cứ ai muốn phát triển cho hệ thống của họ. Mặc dù vậy, thị phần của Apple không đủ lớn để thực sự mang lại cho nó khối lượng quan trọng - chỉ là một phân khúc lớn hơn. Đây chỉ là lựa chọn "mặc định" trong trường hợp / vì Apple làm cho nó trở nên như vậy.

Tôi cũng nói thêm rằng ít nhất theo ý kiến ​​của tôi, mô hình đối tượng giống như Smalltalk của Objective-C có nghĩa là về mặt hiệu quả, nó là đối thủ cạnh tranh trực tiếp với Java nhiều hơn C ++. Vâng, nó vẫn có nền tảng C và có, bạn vẫn có thể viết mã cấp thấp mà không cần sử dụng ngôn ngữ riêng - nhưng C thuần túy và Objective-C thực sự khác nhau đến nỗi nó giống một ngôn ngữ đơn hơn hai ngôn ngữ hoàn toàn khác nhau xảy ra với cả hai được xử lý bởi một trình biên dịch duy nhất (mặc dù thật tiện lợi khi cả hai có thể nói chuyện với nhau mà không cần một cái gì đó như JNI để tham gia cùng họ).


Một đánh giá lịch sử xuất sắc. Lần đầu tiên tôi mã hóa trong Objective-C trên hộp trắng Máy NextSTEP vào những năm 90 và đã được dạy C ++ ở trường đại học, ghét cú pháp kỳ quái của Objective-C. Như vậy tôi có thể đánh giá cao nhiều điều bạn nói ở đây.
Đánh dấu gian hàng

cảm ơn, đó rõ ràng là câu trả lời tôi đang tìm kiếm. ritchie làm C để làm cho tinh thần đồng đội có thể; "C là một khiếm khuyết kỳ quặc và một thành công to lớn"; trích dẫn này PHƯƠNG TIỆN bạn phải tạo ra một ngôn ngữ đơn giản, bằng phẳng để nhiều người có thể hiểu nó, và điều đó không có nghĩa nó phải là một ngôn ngữ "tuyệt vời". Không ai muốn phàn nàn về objc, vì không ai thích nó. "Có những người phàn nàn về ngôn ngữ, và ngôn ngữ không ai sử dụng" bjarne stroustup. Ít nhất các cửa sổ đã có thể làm cho ngành công nghiệp máy tính phát triển ngay cả với một cụm công ty và tôi hy vọng apple thất bại vì họ không quan tâm đến các nhà phát triển.
jokoon

Xin lỗi vì những lời tán tỉnh, nhưng ngay cả khi là một nhà phát triển có nghĩa là bạn phải học những điều mới, điều đó không có nghĩa là bạn phải quên mọi thứ bạn đã biết. Tôi nghe nói chức năng nhắn tin của objc được tạo bằng một số mã ASM được tối ưu hóa. Thật là một mớ hỗn độn, làm thế nào bạn có thể nói với các nhà phát triển để hiểu điều đó? Làm thế nào về trình điều khiển và hạt nhân devs? Máy Mac chỉ là những chiếc Cadillac bạn sử dụng để lái, chúng chỉ là những đồ vật đắt tiền ưa thích để bạn có thể kiểm tra email, xem một đĩa DVD. Bạn muốn thêm một số phần mềm cho điều đó? chúc may mắn quên tất cả các phần mềm hiện có, và làm theo cách táo TM.
jokoon

+1, giải thích tuyệt vời!
Chân

11

Về cơ bản, Apple là động lực thúc đẩy Objective-C từ trước đến nay:

  • Mặc dù phiên bản cuối cùng gần như bị bỏ rơi, Objective-C 2.0 thực sự bắt đầu ngày càng bị ràng buộc với một số lớp / giao thức nền tảng cốt lõi, có nghĩa là, có một liên kết cố hữu giữa các tính năng ngôn ngữ và khung, NSFastEnumutions xuất hiện trong tâm trí tôi , cần thiết cho các đối tượng để đáp ứng đúng cho các vòng lặp. Điều này có nghĩa, có một liên kết ngày càng tăng giữa ngôn ngữ và nền tảng.
  • Hầu như không có sự thay thế thực sự cho ca cao. Và lần lượt Cacao bắt đầu phụ thuộc vào ngày càng nhiều tính năng OSX. Về mặt kỹ thuật, bạn có thể có một triển khai Objective-C chạy trên bất kỳ HĐH nào với bất kỳ khung cốt lõi nào, thực sự không có nhiều thứ gần đây cho bất kỳ nền tảng nào khác.

Như hiện tại, Apple có toàn quyền kiểm soát Objective-C và điều khiển ngôn ngữ theo nhu cầu của mình, trong khi không có tổ chức nào trên hành tinh này quan tâm đến việc chạy Objective-C trên một thiết bị không phải của Apple, đủ lớn để cung cấp thư viện và bộ công cụ tiêu chuẩn để bắt đầu, thậm chí có thể cạnh tranh từ xa các hệ sinh thái được trình bày bởi .NET / Mono, C ++ hoặc Java.


3
Có GNUStep. Họ cố gắng theo kịp Apple, mặc dù tôi đã không kiểm tra xem họ đang làm tốt như thế nào.
Per Johansson

1
Và có Cocotron nữa.
ysdx

1
Tại thời điểm của câu trả lời này được viết, thực sự không có gì có thể chạy Objective-C 2.0 trên nền tảng không phải của Apple. Dù sao, rất nhiều nỗ lực đã được thực hiện sau đó, và bây giờ chúng ta có thể mong đợi chạy Objective-C 2.0 trên FreeBSD bằng GNUstep khá trơn tru.
Eonil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.