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?
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?
Câu trả lời:
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ầ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ế.
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!
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.
Để 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:
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.
Hệ quả của câu trả lời sùng bái hàng hóa ở trên:
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 và Mac và Linux.
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).
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ì?
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.
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
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.
(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:
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à.
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).
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 đó."
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:
cùng với những lợi thế của OOP:
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.
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:
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.
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.
gets
là 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.
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.
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.
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.