Tại sao hầu hết các trình duyệt được phát triển trong C ++ [đã đóng]


99

Có vẻ như hầu hết các trình duyệt web phổ biến (Firefox, Chrome, Safari) được phát triển bằng C ++. Ai vậy?


28
Firefox được viết bằng C ++ và Javascript, không chỉ C ++.
Jesse Millikan

1
Câu hỏi này có thể có một vài câu trả lời vỗ về, giả sử rằng nó chính xác (lưu ý nhận xét của Jesse về Firefox và có rất nhiều trình duyệt bên cạnh ba và IE). Tôi không nghĩ nó là một sản phẩm hiệu quả.
David Thornley

1
Đây có phải là nhóm chính xác cho câu hỏi này?
Martin York

6
@Jlie không phải là trình thông dịch js được viết bằng C ++? Điều đó sẽ làm cho tất cả C ++, không? (Tôi có thể sai ..)
cambraca

5
@cambraca, với logic đó, mọi thứ đều là mã lắp ráp!
Juan Mendes

Câu trả lời:


165

Một cách khác để đặt câu hỏi là trình duyệt cần loại hỗ trợ nào? Danh sách ngắn là:

  • Hỗ trợ phân tích cú pháp (cần thiết để hiểu về [X] HTML, CSS và [ECMA / Java] Script)
  • Các tính năng thông dịch / đi bộ trên cây (một phần của phân tích cú pháp và xây dựng giao diện người dùng)
  • Hỗ trợ đồ họa tăng tốc
  • Kết nối mạng nhanh
  • Đối với các trình duyệt nâng cao hơn: kiểm soát các quá trình và cách ly bộ nhớ giữa các trang
  • Phải hoạt động trên tất cả các nền tảng được hỗ trợ

Hầu hết các ngôn ngữ có một số loại hỗ trợ phân tích cú pháp. Bạn có trình tạo trình phân tích cú pháp cho C, C ++, C #, Java, v.v. Tuy nhiên, C và C ++ có một vài năm bắt đầu với phần còn lại của các lựa chọn thay thế để các thuật toán và triển khai được hoàn thiện hơn. Truy cập đồ họa được tăng tốc trong Java là điều không nên, trừ khi bạn có một số tiện ích mở rộng riêng để làm cho nó hoạt động. WPF trên C # cung cấp quyền truy cập vào đồ họa được tăng tốc, nhưng còn quá mới để có một trình duyệt nghiêm túc được xây dựng với công nghệ.

Mạng thực sự là lý do ít nhất để chọn C ++ qua Java hoặc C #. Lý do là giao tiếp chậm hơn nhiều lần so với phần còn lại của quá trình xử lý tiếp tục hiển thị trang. Tốc độ thô của dây là yếu tố giới hạn. Cả Java và C # đều có hỗ trợ IO không chặn, cũng như C ++. Vì vậy, thực sự không có người chiến thắng rõ ràng trong lĩnh vực này.

Tại sao không phải là Java? Bạn đã bao giờ thử xây dựng một UI với Java chưa? Nó cảm thấy cồng kềnh và chậm chạp so với bất cứ điều gì khác ngoài đó, bởi vì nó là. Không có đồ họa tăng tốc cũng là một tiêu cực lớn ở đây. Hộp cát của Java thực sự tốt và có thể giúp cải thiện tính bảo mật của trình duyệt nếu nó được sử dụng đúng cách, nhưng thật khó để cấu hình và làm cho công việc. Chưa kể định dạng đồ họa hỗ trợ tụt hậu so với hầu hết các trình duyệt hiện đại.

Tại sao không phải là C #? Nếu mục tiêu duy nhất của bạn là Windows, C # thực sự có thể tạo ra một đại diện tốt. Vấn đề xảy ra khi bạn muốn hỗ trợ bất cứ điều gì khác. Mono đã không bắt kịp đủ để được coi là đủ nền tảng cho nhiệm vụ này - đặc biệt là với hỗ trợ đồ họa được tăng tốc và WPF. Ai biết sẽ mất bao lâu để thay đổi.

Tại sao không phải là C? Có một trình biên dịch C cho mọi nền tảng ngoài kia (bao gồm cả các thiết bị nhúng). Tuy nhiên, có rất nhiều điều mà C không làm cho bạn mà bạn sẽ phải hết sức cảnh giác. Bạn có quyền truy cập vào tất cả các cấp API thấp nhất, nhưng phần lớn các nhà phát triển C không làm GUI. Ngay cả các thư viện GUI C cũng được viết theo cách hướng đối tượng. Ngay khi bạn bắt đầu nói UI, một ngôn ngữ hướng đối tượng bắt đầu có ý nghĩa tốt hơn.

Tại sao không khách quan C? Nếu mục tiêu duy nhất của bạn là Apple, nó có rất nhiều ý nghĩa. Tuy nhiên, hầu hết các nhà phát triển không biết Objective-C và lý do duy nhất để tìm hiểu nó là hoạt động trên các hộp NeXT hoặc Apple. Chắc chắn bạn có thể sử dụng bất kỳ thư viện C nào với Objective-C và có các trình biên dịch cho nhiều nền tảng, nhưng việc tìm người để làm việc trên nó sẽ khó khăn hơn. Ai biết? Có lẽ Apple có thể biến sự thiếu hụt nhận thức này xung quanh.

Tại sao lại là C ++? Có một trình biên dịch C ++ cho mọi nền tảng ngoài kia. Hầu như mọi thư viện GUI đều có giao diện C ++, đôi khi nó tốt hơn và đôi khi nó chỉ khác nhau. Ví dụ, ATL của Microsoft tốt hơn rất nhiều so với các lệnh gọi hàm win32 C hoặc thậm chí là thư viện MFC. Có các trình bao bọc C ++ cho GTK trên Unix và tôi rất ngạc nhiên nếu ai đó không có trình bao bọc C ++ xung quanh thư viện GUI Objective-C của Apple. Quản lý quy trình dễ dàng hơn trong C ++ so với Java hoặc C # (những chi tiết đó được trừu tượng hóa cho bạn). Tốc độ cảm nhận của nó đến nhiều hơn từ việc tăng tốc phần cứng so với hiệu năng thô. C ++ không chăm sóc nhiều thứ cho bạn hơn C thô (chẳng hạn như chuỗi bị ràng buộc), nhưng vẫn cho phép bạn tự do điều chỉnh mọi thứ.

Hiện tại, C ++ không đưa ra các giải pháp thay thế.


4
Đối với các nền tảng không phải của Apple và không phải NeXT, có bộ sưu tập GNUStep. Nó chủ yếu tương thích với Ca cao và chạy gần như mọi nơi.
greyfade

5
Hãy nhớ rằng Java không được sử dụng Swing (là một thư viện crappy) cho GUI. Ví dụ, chúng ta có các ràng buộc Qt.
Anto


2
Tôi chưa bao giờ nói Opera dựa trên Qt. Tôi muốn nói rằng một trình duyệt không miễn phí thực sự khó bán khi có rất nhiều tùy chọn miễn phí tuyệt vời.
Berin Loritsch

7
Tính khả dụng của trình tạo trình phân tích cú pháp không thực sự phù hợp - trong tất cả các trình duyệt, trình phân tích cú pháp HTML, XML và JS được viết bằng tay và CSS có trong một số trình duyệt.
gsnedder

89

Tôi đã quyết định viết một cuốn tiểu thuyết về điều này với hy vọng mọi người sẽ che đậy nó và nâng đỡ tôi. Không, không, đùa thôi! Tôi đau khổ hơn từng lời. Mỗi từ, tôi nói với bạn!

Hỏi 'khi nào' trước 'tại sao'

Tất cả các trình duyệt web chính có thể theo dõi nguồn gốc của chúng từ những năm 90. Konqueror trở thành Safari và Chrome; Netscape trở thành Firefox; IE và Opera vẫn là IE và Opera. Các trình duyệt này đều có khởi đầu 15 năm đối với những người đương nhiệm.

Tôi đề nghị bạn thậm chí cố gắng đặt tên cho một ngôn ngữ đa nền tảng (Windows / Mac / Unix và thậm chí tệ hơn) có thể chấp nhận được vào khoảng năm 1995 khi các trình duyệt hiện đại bắt nguồn. Để xây dựng cốt lõi trong bất cứ thứ gì trừ C / C ++, có lẽ bạn đã phải xây dựng hoặc mua và sửa đổi trình biên dịch và thư viện nền tảng.

Hôm nay thế nào? Các lựa chọn thay thế là gì?

Để cho vui, chúng ta hãy nghĩ về vấn đề ngày hôm nay. Vâng, có những lựa chọn thay thế, nhưng vẫn còn những vấn đề lớn.

Lựa chọn ngôn ngữ trình bày ít nhất những vấn đề này:

  1. Vấn đề về kiến ​​thức - Tuyển dụng / đào tạo nhà phát triển hoặc thu hút cộng tác viên
  2. Vấn đề tổ chức / xã hội - Chấp nhận ngôn ngữ
  3. Ngôn ngữ thực hiện: Tốc độ, hỗ trợ nền tảng, dụng cụ
  4. Sức mạnh ngôn ngữ

1: Vấn đề kiến ​​thức

Nơi nào bạn có được những người biết ngôn ngữ hoặc có thể học nó? Đây là một trở ngại đối với các ngôn ngữ như OCaml, F #, Haskell, Common Lisp và D đủ nhanh và cao để viết trình duyệt một cách độc đáo, nhưng có ít người theo dõi (trong phạm vi 10k-100k, có thể) ngay cả khi bạn tự do đếm tất cả những người có sở thích và học thuật.

2: Vấn đề xã hội / tổ chức

Hệ quả của câu trả lời sùng bái hàng hóa ở trên:

  • Một trình duyệt mã nguồn mở không sử dụng C, C ++, C # hoặc Java sẽ được cho là gặp khó khăn với những người đóng góp.
  • Một trình duyệt độc quyền không sử dụng C, C ++, C # hoặc Java sẽ khiến các nhà quản lý dự án bị mắng nghiêm trọng trong hầu hết các tổ chức.

3. Sự cố kỹ thuật

Ngay cả trong thời hiện đại, bạn cần một ngôn ngữ khá nhanh cho các phần chuyên sâu tính toán của các trang kết xuất và chạy Javascript. Bạn có thể chọn bổ sung ngôn ngữ cấp cao để xây dựng các thành phần GUI, v.v. (ví dụ: cách tiếp cận Firefox của C ++ và Javascript) nhưng bạn phải tích hợp chặt chẽ giữa các ngôn ngữ; bạn không thể chỉ nói "Được rồi, C # và Lua." Có lẽ bạn sẽ phải tự xây dựng và gỡ lỗi cây cầu đó trừ khi bạn chọn C hoặc C ++ làm ngôn ngữ cơ bản.

Phát triển đa nền tảng là một túi giun khác. Bạn có thể sử dụng C # hoặc F # và bắt chéo ngón tay của bạn trên GTK # và Mono vẫn còn sống và tốt trong tương lai. Bạn có thể dùng thử Common Lisp, Haskell, OCaml ... Chúc may mắn khi mọi thứ hoạt động trên Windows Mac Linux.

4. Sức mạnh ngôn ngữ

Sau tất cả những điều đó, bạn phải xây dựng một số lượng lớn chức năng, vì vậy nếu bạn chọn một ngôn ngữ cấp thấp, bạn cần một đội ngũ lập trình viên thậm chí còn ôm đồm hơn trước. Lưu ý rằng không ai thực sự xây dựng một trình duyệt từ đầu trong khoảng mười lăm năm. Đó là một phần bởi vì (bất ngờ!) Thật khó.

Cụ thể, có một trình thông dịch Javascript là vấn đề 3 (có được một) hoặc vấn đề 4 (xây dựng một).

Phần kết luận:

Nếu bạn đã phát triển trình duyệt ba nền tảng (Windows / Mac / * nix) ngày hôm nay (đầu năm 2011), một số lựa chọn là gì?

  • C: Xem (2). Mọi người sẽ kêu gọi C ++. Vui vẻ chọn bộ công cụ đa nền tảng hoặc xây dựng một (1, 2, 3 và 4). Xem thêm (4); vui vẻ xây dựng một trình duyệt ổn định, an toàn trong đó.
  • C ++: Vui khi chọn bộ công cụ đa nền tảng hoặc xây dựng một (1, 2, 3 và 4). Hãy vui vẻ (4) xây dựng trình duyệt ổn định, an toàn trong đó.
  • C hoặc C ++ và HLL: Đặt cược tốt nhất của bạn. Chọn chất độc của bạn trên ngôn ngữ năng động; Xem (1) và (2). Quá nhiều ngôn ngữ tốt, quá ít người theo dõi. (1, 2, 3 và 4) trên bộ công cụ.
  • Java: Đặt cược tốt thứ hai, nếu bạn phải làm hài lòng quản lý cấp trung. Xem (4); xây dựng những thứ khổng lồ trong Java cần nhiều mã hơn bất kỳ thứ gì khác trong danh sách này nhưng có lẽ C.
  • Scala: Đánh bại Java trên (4); (1) và (2) nhưng nó đang gây chú ý.
  • C và Javascript: Trong trường hợp đặc biệt, điều này rất hấp dẫn bởi vì bạn đã phải xây dựng hoặc thu nhận và đồng hóa trình thông dịch Javascript. (Do đó Firefox.) (1, 2, 3 và 4) trên bộ công cụ; người Mozilla đã xây dựng IIRC của riêng họ.
  • C #: Hãy vui vẻ trên (3). Bạn có thể bị mắc kẹt với GTK #, tuy nhiên, đó là tốt, hoặc xây dựng lớp và trình kết xuất của riêng bạn trên GTK # và Windows Forms.
  • Ruby / Python / Perl / Vợt / Lua / Erlange, v.v .: Bạn đã có (3) về tốc độ và thư viện widget đa nền tảng. Định luật Moore là với bạn về (4); nhu cầu ngày càng tăng trên các trình duyệt là chống lại bạn.
  • OCaml, Haskell, Lisp thông thường, Smalltalk: (1) và (2) trong các spades. Không có vấn đề về tốc độ, có lẽ, nhưng (3) để phát triển đa nền tảng và bạn sẽ phải xây dựng mọi thứ của riêng mình hoặc làm cầu nối với các thư viện C / C ++ bằng cách nào đó.
  • Mục tiêu-C: (3) Tôi không chắc cách phát triển đa nền tảng sẽ hoạt động ở đây.

Nếu chúng ta thấy một trình duyệt lớn khác tăng lên trong vài năm tới, tôi sẽ cá rằng nó sẽ được viết bằng C hoặc C ++ và một ngôn ngữ động (như Firefox), cho dù là nguồn mở hay độc quyền.

Chỉnh sửa (ngày 31 tháng 7 năm 2013) : Những người bình luận trên Hacker News dường như đang đề cập đến Rust and Go (không liên quan cụ thể đến câu trả lời của tôi), điều này mơ hồ rơi vào nhóm "linh tinh nhanh". Cố gắng giữ danh sách các ngôn ngữ này là bình đẳng và cập nhật sẽ là một trận thua, vì vậy thay vào đó tôi gọi nó là một mẫu đại diện cho đến thời điểm viết và để nó một mình.


4
+1 để lưu ý rằng KHI một trình duyệt cụ thể được phát triển lần đầu tiên cũng đóng một vai trò quan trọng.
Sparky

3
Điều đáng chú ý là mặc dù IE có thể không phải là đa nền tảng ngày nay , nhưng chắc chắn nó đã có lúc và thị phần hiện tại của nó gần như chắc chắn xuất phát (ít nhất là một phần) từ khả năng đa nền tảng đó.
Jerry Coffin

2
Lưu ý rằng IE nền tảng chéo một lần xung quanh IE4.
JasonFnut

2
+1 khi nào. Đó là lý do duy nhất. Nếu ai đó bắt đầu một dự án trình duyệt ngày hôm nay, rất có thể họ sẽ không sử dụng C ++
Henry

4
@Henry, không chắc là họ sẽ loại trừ khi sử dụng C ++. Câu trả lời lưu ý rằng C ++ vẫn sẽ là một phần của câu đố.
Loại ẩn danh

36

Tốc độ

Dù xấu xí như vậy, C ++ vẫn là thứ bạn sử dụng khi bạn muốn có một ứng dụng nhanh và toàn quyền kiểm soát mã.

Đây là lý do tại sao các trò chơi, các phần không cốt lõi (như trình nhập tệp) của Office và hơn thế nữa vẫn được viết bằng C ++.

Đã chỉnh sửa để bao gồm phản hồi từ MSalters


3
Khác với các trò chơi, tôi không tin rằng những lý do này là lý do tại sao những ứng dụng đó được viết bằng C ++. Mặc dù nếu bạn có kiến ​​thức đầu tay, tôi rất vui khi được chứng minh là sai.
Henry

2
kiến thức đầu tay? VS 2010, Office 2010 đều là những bộ ứng dụng khổng lồ nhưng chúng cực kỳ nhanh chóng với những gì chúng làm. Mặc dù cả hai đều có một di sản COM khá lớn và di sản MS, hiệu suất vẫn là điều quan trọng nhất đối với người dùng.
Loại ẩn danh

8
Những gì khác văn phòng sẽ được viết trong? VB? C và C ++ là các tùy chọn duy nhất để Microsoft viết các ứng dụng lớn. Đừng nói C # làm ơn
Toby Allen

4
@Victor: Tôi chưa thấy nguồn cho VS2010, vì vậy rất có thể nó được viết hoàn toàn bằng C #.
Ryan Hayes

3
Nếu văn phòng là một ứng dụng C #, tại sao Ribbon ban đầu lại là điều khiển MFC và chúng tôi phải đợi độ tuổi để một C # được phát triển? không có ứng dụng khổng lồ nào trong số này sẽ được viết lại bằng C #, chúng sẽ được gói trong gui WPF (như VS2010) và phần lớn mã cũ sẽ được sử dụng lại. Ngay cả MS cũng không có tài nguyên để viết lại hoàn toàn các ứng dụng lớn nhất của họ - không phải nếu họ muốn dành thời gian thêm các tính năng cho chúng.
gbjbaanb

17

Tính di động

Tôi chỉ có thể đoán, nhưng bạn đang đề cập đến các sản phẩm phần mềm nhắm mục tiêu nhiều nền tảng và C ++ có thể được biên dịch sang bất kỳ nền tảng nào.


+10 - Khác với hiệu năng thô, tôi nghĩ đây là lý do THỰC SỰ hầu hết các trình duyệt đều ở C ++ ngoại trừ IE. Hầu hết các trình duyệt hoạt động trên nhiều nền tảng và có một số ngôn ngữ / khung có thể thực hiện ở cùng cấp VÀ tương thích đa nền tảng.
Jordan Parmer

Tôi cũng nghĩ điều này lúc đầu, nhưng đối với một ứng dụng trung tâm GUI như trình duyệt web. C ++ có thực sự dễ mang theo nhiều hệ điều hành khác hơn Java không?
JohnFx

1
Là một trình duyệt thực sự là GUI trung tâm?
Kris Van Bael

@JohnFx - Chính xác, phần GUI có lẽ không phải là di động. Nhưng cốt lõi của một ứng dụng trình duyệt là về việc xử lý HTML, tạo cây DOM, phân tích cú pháp javascript và thực thi nó đủ nhanh. Một ứng dụng được thiết kế tốt có thể dễ dàng chia sẻ cùng một lõi và có mã UI khác nhau cho mỗi nền tảng. Và vâng, C ++ dễ mang theo hơn Java (nhưng không có GUI), vì đối với C ++, bạn chỉ cần một trình biên dịch nhắm mục tiêu vào CPU. Đối với Java, bạn cần khung đầy đủ.
Pete

Theo hiểu biết của tôi, hầu hết mọi can đảm của việc xử lý HTML đều được thực hiện bởi một vài công cụ cốt lõi như WebKit. Có lẽ bởi vì những người trong C ++ mà toàn bộ trình duyệt là?
JohnFx

13

(Tôi đã làm việc trên Firefox được khoảng năm năm.)

Người hỏi có đúng rằng rất nhiều mã của Firefox là C ++ và trên thực tế C ++ chiếm đa số nếu bạn tính theo dòng mã (mặc dù điều đó không nói lên toàn bộ câu chuyện, vì chúng ta có rất nhiều JavaScript và còn hơn thế nữa. súc tích hơn C ++).

Nhưng trong thực tế, Firefox được viết bằng rất nhiều ngôn ngữ khác nhau:

  • C ++
  • C (NSS, NSPR, các thư viện khác nhau mà chúng tôi đã nhập)
  • lắp ráp x86 và ARM
  • JavaScript
  • XUL (ngôn ngữ đánh dấu giống như HTML) và CSS
  • Mục tiêu C (mã chỉ dành cho MacOS)
  • Java (mã chỉ dành cho Android)
  • Nhiều ngôn ngữ định nghĩa giao diện tùy chỉnh (XPIDL, IPDL)
  • WebIDL (ngôn ngữ định nghĩa giao diện khác, nhưng ngôn ngữ này không phải là tùy chỉnh, mặc dù trình tạo mã là)
  • Python (trình tạo mã)

Tôi chắc chắn đang quên một số.

Danh sách này rất quan trọng vì nó gợi ý về sự phức tạp đáng kinh ngạc nằm đằng sau một trình duyệt web.

Vâng, Firefox có rất nhiều mã C ++, và vâng, điều đó có liên quan đến thực tế rằng C ++ là ngôn ngữ tốt nhất cho loại điều này khi Netscape được thành lập. Nhưng tôi cũng cho rằng ngày nay không có ngôn ngữ nào tốt hơn cho nhiều thứ chúng ta làm.

Không có ngôn ngữ nào khác có hệ sinh thái mạnh mẽ của các thư viện (chúng tôi phụ thuộc rất nhiều vào mã bên ngoài). Rất ít ngôn ngữ khác cung cấp cho bạn quyền kiểm soát toàn bộ ngăn xếp như C ++ (chúng tôi thường xuyên điều chỉnh bộ cấp phát heap tùy chỉnh của mình và thực hiện tất cả các loại bộ nhớ không an toàn để nhanh hơn hoặc sử dụng ít bộ nhớ hơn). Vài ngôn ngữ khác cho phép bạn triển khai lại hầu hết thư viện chuẩn theo cách lành mạnh (chúng tôi có các chuỗi triển khai và bộ sưu tập riêng, điều chỉnh theo nhu cầu của chúng tôi). Vài ngôn ngữ khác cho phép bạn thực hiện trình thu gom rác của riêng bạn. Và như vậy.

Mặc dù C ++ là sự lựa chọn rõ ràng cho rất nhiều việc chúng tôi làm, nhưng những người đề xuất rằng chúng tôi có thể viết trình duyệt bằng Java và viết JVM của riêng chúng tôi nếu cần thiết là một cái gì đó. Đây thực chất là những gì chúng ta làm, nhưng với JavaScript thay vì Java. Tất nhiên, phần lớn trình duyệt không được viết bằng JavaScript. Nhưng một số tiền đáng ngạc nhiên là.


Là những hành động không an toàn bộ nhớ nguồn của vấn đề bảo mật?
Demi

12

Vâng, bạn phải hỏi các nhà phát triển những sản phẩm trực tiếp để có được những câu trả lời, nhưng tôi nghi ngờ đó là một sự kết hợp của sự quen thuộc (đó là những gì những nhà phát triển biết tốt nhất), hiệu suất (biên soạn để một nhị phân tự nhiên như trái ngược với bytecode), và các công cụ (so với các ngôn ngữ như C, C ++ có đầy đủ các tiện ích tiết kiệm lao động đẹp như STL).


10

Lịch sử

Mỗi trình duyệt có một số lịch sử ảnh hưởng đến sự lựa chọn ngôn ngữ.

Ví dụ: cả Chrome và Safari đều dựa trên WebKit, có nguồn gốc từ phần KHTML của dự án KDE. KDE ban đầu được tạo ra (một phần) như là một minh chứng cho bộ công cụ GUI Qt, do đó, KDE nói chung, là một dự án C ++. Tất cả các dự án KDE mới, vào thời điểm đó, được viết hoàn toàn bằng C ++, vì vậy đó là một lựa chọn hợp lý cho KHTML. Nó đã được chuyển sang sử dụng các bộ công cụ GUI khác.

Công cụ Presto của Opera được viết với hiệu suất và kích thước nhị phân nhỏ trong tâm trí: C ++ là lựa chọn hợp lý.

IE của Microsoft được viết dưới dạng tập hợp các thành phần ActiveX, có thể được viết bằng bất kỳ ngôn ngữ nào có ràng buộc COM, nhưng có thể được viết bằng tập con của C ++, vì phần lớn cơ sở mã của họ đã được viết bằng ngôn ngữ đó.

Mozilla của Netscape được viết bằng C ++ vì tính di động là mối quan tâm chính của họ. Trình biên dịch C và C ++ (hầu như) có mặt khắp nơi, và vì vậy nó là một lựa chọn hợp lý.

Không có lý do kỹ thuật vốn có cho những lựa chọn này. Nó chỉ "có vẻ như là một ý tưởng tốt vào thời điểm đó."


8

Mạng trong C và C ++ rất dễ tối ưu hóa, vì bạn không phải sử dụng các thư viện nếu bạn không muốn. Tôi nghi ngờ rằng C ++ là ngôn ngữ được lựa chọn vì nó cho phép những lợi thế của C:

  • Tốc độ
  • Tối ưu hóa
  • Một lượng di động nhất định
  • Ngôn ngữ biên dịch, không được giải thích

cùng với những lợi thế của OOP:

  • Khả năng mở rộng
  • Hình dung dễ dàng hơn
  • Hỗ trợ thư viện tốt hơn cho các tác vụ không quan trọng như xử lý chuỗi và cấu trúc dữ liệu

Không Java hay C # có những lợi thế đó?
Nipuna

5
Tôi đã phát triển ứng dụng ở cả hai và tôi nói rằng đối với chức năng mạng hạn chế thì chúng vẫn ổn. Tuy nhiên, tôi không muốn xây dựng bất cứ thứ gì tập trung vào phần mạng như trình duyệt. Tôi muốn kiểm soát nhiều hơn những gì đang xảy ra và tôi muốn có một ngôn ngữ được biên dịch .
Michael K

Java và C # cũng được biên dịch. C # sẽ có lợi thế hơn Java khi xây dựng GUI - một phần quan trọng của bất kỳ trình duyệt nào. Java sẽ có lợi thế với tính di động. Cả Java và C # đều được biên dịch lại trên nền tảng đích - để cải thiện tốc độ tốt hơn nhiều.
Berin Loritsch

5
Không, chúng được giải thích. Họ biên dịch thành mã byte và chạy trên máy ảo. VM đó không có sự tương ứng một-một từ hướng dẫn của nó được đặt thành bản gốc.
Michael K

1
Bạn không thể có điều này ngược hơn! Mạng; bạn có thể trình bày để cuộn tròn và trình duyệt sẽ nhanh như vậy. CODE mạng không phải là bit chậm. Và ổ cắm là gì nếu nó không phải là một thư viện? Xử lý chuỗi; Đây là cốt lõi của bất kỳ trình duyệt html nào, nó KHÔNG quan trọng và tôi không thể nghĩ ra một ngôn ngữ nào có khả năng xử lý chuỗi kém hơn C ++ ngoài C.
Henry

4

Khi các dòng mã đầu tiên cho vòng trình duyệt đầu tiên được viết, C # và Java đã không tồn tại. Ruby cũng vậy. Python có thể đã xuất hiện, nhưng nó vẫn là một dự án homebrew nhỏ vào thời điểm đó.

Về cơ bản, thực sự không có bất kỳ lựa chọn nào khác ngoài C ++ cho phép một người xây dựng một trình duyệt nhanh và chạy trên nhiều nền tảng khác nhau.

Vậy tại sao chúng được viết bằng C ++? Bởi vì đó là ngôn ngữ duy nhất có sẵn mà họ có thể được viết bằng.


1
Không chắc chắn ý của bạn về 'vòng mới'. Nhưng FF và IE có các cơ sở mã quay trở lại giữa những năm 90 và hầu hết các trình duyệt mới sử dụng một trong các công cụ kết xuất (ví dụ: Chrome sử dụng WebKit)
GrandmasterB

2
FF đã loại bỏ mã Netscape kế thừa (tức là vào giữa những năm 90) và thực hiện công cụ kết xuất của riêng họ. WebKit cũng là một công cụ kết xuất tương đối mới (được Chrome và Safari sử dụng). IE vẫn còn phình to mà tiếp tục cân nhắc nó. Vì vậy, tôi sẽ không đồng ý ở đây.
Berin Loritsch

2
Theo wikipedia ít nhất, cả tắc kè và webkit bắt đầu vào khoảng năm 1998. C # không tồn tại vào thời điểm đó, và java mới xuất hiện (và siêu chậm chạp và thực sự khủng khiếp ở gui lúc đó), vì vậy đó sẽ không phải là một lựa chọn khả thi. Vì vậy, tôi không biết những ngôn ngữ khác sẽ phù hợp. Có lẽ là Pascal.
GrandmasterB

1
@Berin Loritsch: Vâng, nhưng không có lúc nào họ chỉ đơn giản là vứt bỏ tất cả các mã hiện có và bắt đầu lại (trên tất cả mọi thứ) ngay từ đầu, đó là những gì họ đã phải làm để chuyển đổi sang ngôn ngữ khác. Ngoài ra, những người biết / biết C ++ đủ tốt để quyết định của họ về FF sẽ gắn bó sẽ có khả năng chuyển sang một ngôn ngữ khác.
Jerry Coffin

2
@Berin Loritsch Rác. FF vẫn dựa trên Gecko (1997) và Webkit dựa trên khtml (1998).
Henry

4

Bởi vì các trình duyệt (ví dụ, HotJava, rõ ràng được viết bằng Java) được viết bằng các ngôn ngữ khác chưa bao giờ đạt được bất kỳ mức độ chấp nhận / thâm nhập thị trường đáng kể nào.

Tôi không thể nói bất cứ điều gì về việc lặp lại hiện tại (hoặc gần đây nhất - chưa được cập nhật trong một thời gian dài) của HotJava, nhưng khi tôi thử nó, sự thiếu thâm nhập thị trường (ít nhất là đối với tôi) rất dễ hiểu - nó xấu, chậm và không tương thích với khá nhiều trang web. Cuối cùng, nó dường như dựa trên một tiền đề không bao giờ được đưa ra: rằng web sẽ bao gồm chủ yếu các applet Java, với HTML không chỉ là một trình bao bọc cho biết các applet nào sẽ hiển thị ở đâu.

Một phần của nó có lẽ cũng mang tính lịch sử: hầu hết các trình duyệt web lớn đã xuất hiện từ lâu. Khi chúng lần đầu tiên được viết, phong cảnh đã khác đi nhiều: C ++ là một ngôn ngữ mới "nóng", vì vậy nó được sử dụng cho rất nhiều sự phát triển mới. Các trình duyệt đã trở thành một số phần mềm được sử dụng nhiều nhất xung quanh, trong khi nhiều phần mềm khác từ thời gian đã dần chìm vào quên lãng.

Tôi nghĩ rằng "thái độ" hiển thị của ngôn ngữ cũng có ảnh hưởng: C ++ (giống như C trước đó) luôn nhấn mạnh tính thực tiễn và tính thực dụng. Thái độ cơ bản đó có xu hướng thu hút các lập trình viên cũng thực dụng. Nhiều ngôn ngữ khác chú trọng nhiều hơn vào những thứ như sự thanh lịch - và khi làm như vậy, chúng thu hút các lập trình viên có cùng suy nghĩ. Vấn đề với điều đó là cái mà tôi gọi là "hiệu ứng Lisp". Các triệu chứng bao gồm:

  1. Tranh luận bất tận về việc thực hiện thanh lịch nhất của những điều tầm thường nhất.
  2. Không có khả năng đóng băng các tính năng và hoàn thành một cái gì đó có thể được vận chuyển (ngay cả với lỗi)
  3. Không có khả năng thỏa hiệp. Bất cứ ai không đồng ý với tôi không chỉ sai, mà phải là ngu ngốc hoặc xấu xa.

Có nhiều hơn, nhưng bạn có được ý tưởng chung (và vâng, tôi đang phóng đại ở một mức độ nào đó - nhưng chỉ ở một mức độ). Vâng, một số mã bạn nhận được sẽ đẹp đến mức đáng kinh ngạc - nhưng rất có thể là nó trễ sáu tháng và hầu như không tương thích với mọi mã khác trong (hệ thống được cho là) ​​và vào thời điểm bạn nhận được nó. một cơ hội khá công bằng, một cái gì đó khác đã thay đổi đủ để bạn không thể sử dụng nó.

Cũng có những ngôn ngữ chắc chắn sẽ hoạt động tốt, nhưng (đúng hoặc sai) đơn giản là không có (hoặc vào thời điểm quan trọng, không có) thị phần cho bất kỳ ai đã từng viết trình duyệt trong đó. Với kích thước và độ phức tạp của một trình duyệt hoàn chỉnh, phải mất rất nhiều người và khá nhiều thời gian để phát triển một trình duyệt. Với loại đầu tư đó, nhiều người có được sự bảo thủ tương đối về những thứ như các công cụ phát triển.


1
WRT điểm 3, tôi chắc chắn sẽ khẳng định, nếu không đủ điều kiện, việc viết phần mềm đối mặt với mạng trong gia đình C ngu ngốc hoặc xấu xa, bởi vì nó vô tình (ngu ngốc) hoặc vô tình (ác) làm việc với một hệ thống được biết đến rộng rãi để giới thiệu bảo mật lỗ hổng sẽ gây hại cho người dùng của bạn. Nó tương đương về mặt đạo đức với việc cho một bộ giáp cơ thể người lính với một mục tiêu được vẽ trên đó.
Mason Wheeler

9
@Mason: Màn hình hiển thị chính xác của bạn trong câu hỏi chắc chắn được đánh giá cao.
Jerry Coffin

2
@Mason: Vô nghĩa. Một lỗ hổng bảo mật (đã được sửa, nhưng nhiều hệ thống đã không cài đặt mã cập nhật) thậm chí không gần với bằng chứng rằng tất cả các mã được viết bằng cùng một ngôn ngữ "sẽ gây hại" hoặc bất cứ thứ gì thuộc loại này. OpenBSD (ví dụ) có một lịch sử bảo mật tốt hơn đáng kể so với phiên bản MacOS dựa trên Pascal thậm chí còn mong muốn.
Jerry Coffin

5
@Mason: Không, bạn có. Đầu tiên, sâu Morris đã khai thác một proram được sử dụng gets, đây là một chức năng khủng khiếp, nhưng hầu như không thể tránh khỏi (và chắc chắn không "cơ bản" đối với ngôn ngữ, hoặc bất cứ điều gì tương tự). Thứ hai, C ++ không phải là ngôn ngữ giống như C trong mọi trường hợp. Thứ ba, OpenBSD chứng minh khá độc đáo rằng phần mềm bảo mật có thể và được viết bằng C. Không có "lỗ hổng ngôn ngữ cơ bản" nào ngăn việc viết phần mềm bảo mật, vững chắc trong C. Thị phần nhỏ của OpenBSD cho thấy bảo mật không phải là mối quan tâm lớn đối với hầu hết Mọi người.
Jerry Coffin

6
@Mason: lỗi tràn bộ đệm getslà hậu quả đơn giản của thực tế là bạn không vượt qua được độ dài của bộ đệm bạn đang sử dụng. Không có gì cơ bản cho ngôn ngữ về nó - bạn có thể làm điều tương tự trong Pascal (và tôi có). Viết phần mềm bảo mật chống lại kẻ tấn công thông minh không dễ dàng bất kể ngôn ngữ. Dựa trên kinh nghiệm ở cả ba người, C dễ dàng hơn một chút so với Pascal và dễ dàng hơn nhiều so với C ++ so với C.
Jerry Coffin

3

Lập trình vận chuyển hàng hóa. Nhận thức rằng "C ++ rất nhanh" vẫn còn tồn tại, (mặc dù các tính năng ở cấp độ ngôn ngữ kém suy nghĩ như mô hình đối tượng bị hỏng nặng của nó làm mọi thứ chậm lại) và mọi người muốn trình duyệt của họ nhanh, vì vậy họ viết bằng C ++ .

Trong một thế giới lành mạnh, những người viết phần mềm đối mặt với mạng sẽ kinh hoàng khi nghĩ đến việc sử dụng một ngôn ngữ đi kèm với tất cả các vấn đề bảo mật vốn có của C, và thực sự làm như vậy sẽ là một hành động bất cẩn hình sự. (Chỉ cần xem có bao nhiêu khai thác tràn bộ đệm đã được tìm thấy đối với các trình duyệt khác nhau trong 15 năm qua hoặc lâu hơn! Những lập trình viên này chịu trách nhiệm về bao nhiêu triệu đô la?

Có các ngôn ngữ được biên dịch khác có khả năng tạo nhị phân nhanh. Vấn đề là họ không có sự tiếp xúc như gia đình C và tất cả chúng ta phải chịu đựng điều đó.

Sự thật thú vị: Vào thời điểm sâu bọ Morris xuất hiện trên Internet vào năm 1988, đã chứng minh một cách thuyết phục các vấn đề khi viết hệ điều hành và phần mềm đối mặt với mạng bằng C, (vẫn chưa được giải quyết cho đến ngày nay, vì chúng là lỗi ngôn ngữ cố hữu ,) Apple đã phát hành hệ điều hành tiên tiến nhất mà thế giới đã thấy cho đến nay, trong vài năm, được viết bằng Pascal.


15
Huh? Tôi thích hệ điều hành Mac tốt, nhưng để gọi nó là hệ điều hành tiên tiến nhất mà thế giới từng thấy là ngớ ngẩn. Nó thậm chí không ở trong cùng một công viên bóng như UNIX và VMS, chứ đừng nói đến các hệ thống sắt lớn của IBM: người dùng đơn lẻ, không có bộ nhớ ảo, quản lý quy trình hạn chế. Để chắc chắn rằng nó có một hệ thống cửa sổ rất đẹp, nhưng thậm chí đó là phái sinh từ Xerox Parc, và một loạt các dự án học thuật. Tôi cũng nghĩ rằng phần lớn hệ điều hành Mac thực sự được viết bằng cụm M68k. Các thư viện đã sử dụng các tiêu chuẩn gọi hàm Pascal vì dự kiến ​​Pascal sẽ là ngôn ngữ ứng dụng chính.
Charles E. Grant

5
Các hệ điều hành trước những năm 2000 của Apple không ổn định hơn MS tương đương. Khi tôi đang làm việc hai dự án vào những năm 90, một với Mac OS và một với NT tôi có cùng số lần gặp sự cố và khởi động lại. Bây giờ tất cả chúng là một số loại ngôn ngữ dựa trên C. (Apple sử dụng Objective-C cho công cụ hiện tại của mình). Bảo mật có thể khó khăn hơn trong các ngôn ngữ dựa trên C, nhưng sử dụng một ngôn ngữ khác không làm cho nó đột nhiên an toàn hơn.
Berin Loritsch

13
@Mason, thực tế là Mac không cần những tính năng đó vào thời điểm đó không có nghĩa là những tính năng này không đáng kể. Bạn đã đưa ra một tuyên bố không đủ tiêu chuẩn rằng hệ điều hành Apple là tiên tiến nhất trên thế giới, nhưng rõ ràng điều bạn thực sự muốn nói là nó có giao diện người dùng tinh vi nhất. Đó là một tuyên bố phòng thủ, nhưng ít hơn so với những gì bạn đã viết. Viết một GUI có thể sử dụng là khó. Viết một hệ thống bộ nhớ phân trang đáng tin cậy là khó. Nói rằng cái này có ý nghĩa hơn thì cái kia thật ngớ ngẩn. Điện toán cấp độ người tiêu dùng như chúng ta biết bây giờ không thể tồn tại mà không có cả hai.
Charles E. Grant

5
@Mason: trải nghiệm của bạn rõ ràng khác biệt (rất nhiều) với bất kỳ ai và mọi người khác - ở nhiều khía cạnh. :-)
Jerry Coffin

3
@Mason: LOL khi đề cập đến OSX tiền Mac là "nâng cao". Hệ điều hành Apple là một nguồn liên tục gặp sự cố, không chỉ bởi hệ thống tệp cực kỳ thô sơ của nó.
Loại ẩn danh

2

Truy cập API cấp hệ thống

Tất cả các trình duyệt phải giao tiếp với HĐH tại một số điểm và hầu hết các HĐH chính đều có các thư viện và API C và C ++ được thiết lập tốt. Việc làm việc với các API đó trong C hoặc C ++ thường dễ dàng hơn thay vì viết các hàm bao.


0

Kiểm soát và tính di động

hầu hết các đối số tốc độ có thể đi theo bất kỳ cách nào, nhưng trong bất cứ điều gì mà bạn cần kiểm soát chính xác về cách thực hiện điều gì đó, nhiều ngôn ngữ cấp cao hơn sẽ xuất hiện trong cuộc diễu hành của bạn. Có những trường hợp ngoại lệ cho điều này, nhưng hầu hết trong số chúng không đủ nền tảng để tính vào một cái gì đó giống như một trình duyệt.


0

Khả năng tương thích - không thể vứt bỏ mã cũ

Nó không liên quan gì đến giá trị của C ++ so với các ngôn ngữ khác. Bạn chắc chắn có thể viết một trình duyệt tốt hơn từ đầu bằng một ngôn ngữ như Haskell; một dự án quan trọng này thậm chí có thể thực hiện JVM của riêng họ nếu họ cần đảm bảo một số đặc tính hiệu năng. Giống như cách Facebook viết trình biên dịch / trình tối ưu hóa PHP của riêng họ.

Một trình duyệt vi phạm đánh dấu không chuẩn sẽ tệ hơn là vô dụng. Di sản compat rất quan trọng và phức tạp đến mức viết lại không chỉ là một lựa chọn. Rất nhiều tiền và thời gian được đầu tư vào bảo mật được thử nghiệm trong trận chiến, v.v., bạn không thể vứt bỏ khoản đầu tư đó. Một lần nữa, giống như cách Facebook vẫn được viết bằng PHP.


Tôi có thể hiểu tại sao mọi người có thể không đánh giá cao điều này ... nhưng bị đánh giá thấp? Lạ nhỉ. Đây là +1 cho bạn.
Thomas Eding

Bạn có một điểm (nhỏ), nhưng câu đầu tiên của bạn ném nó đi. Tất nhiên nó cũng có liên quan đến giá trị của C ++ so với các ngôn ngữ khác.
Chiel ten Brinke
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.