Tại sao Facebook chuyển đổi mã PHP sang C ++? [đóng cửa]


42

Tôi đọc được rằng Facebook bắt đầu bằng PHP và sau đó để tăng tốc, giờ họ biên dịch PHP dưới dạng mã C ++. Nếu đó là lý do tại sao họ không:

  1. Chỉ cần lập trình trong c ++? Chắc chắn phải có MỘT SỐ lỗi / lỗi khi nhấn nút trình biên dịch ma thuật chuyển PHP sang mã c ++, phải không?

  2. Nếu trình chuyển đổi ấn tượng này hoạt động độc đáo như vậy, tại sao lại dính vào PHP? Tại sao không sử dụng một cái gì đó như Ruby hoặc Python? Lưu ý - Tôi đã chọn hai thứ này một cách ngẫu nhiên, nhưng chủ yếu là vì gần như mọi người đều nói mã hóa trong các ngôn ngữ đó là một "niềm vui". Vậy tại sao không phát triển bằng một ngôn ngữ siêu tuyệt vời và sau đó nhấn nút biên dịch ma thuật c ++?


12
Cả hai lựa chọn thay thế của bạn có thể có nghĩa là loại bỏ tất cả các mã PHP, các công cụ và chuyên môn cụ thể về PHP, một nửa cơ sở hạ tầng hỗ trợ, v.v. đã có sẵn và bắt đầu từ đầu.

Tại sao? Nếu bạn có thể chuyển đổi mã sang C ++, chắc chắn bất kỳ ai cũng có thể sử dụng ngôn ngữ yêu thích của họ, nhấn nút chuyển đổi và để nó được cam kết với C ++ Codebase. Không?
dùng72245

7
Không. Trình biên dịch, nói chung, tạo ra mã làm việc nhưng xấu và không tự nhiên, và loại bỏ những thứ như tên biến, nhận xét, không đề cập đến tất cả các loại trừu tượng. Ở một mức độ lớn, điều này là không thể tránh khỏi. Mặc dù có một số dự án nhằm thực sự chuyển thành một cơ sở mã có thể duy trì bằng ngôn ngữ khác, vấn đề khó khăn hơn nhiều, đặc biệt là với các ngôn ngữ khác nhau. Ngoài ra, ngay cả khi giả sử C ++ hoàn toàn thành ngữ, mọi người làm việc trên codebase sẽ phải học C ++ hoặc bị sa thải và thay thế bằng những người biết C ++. Và sau đó bạn vẫn chưa giải quyết công cụ.

1
Ngoài ra (tôi chỉ tự mình phát hiện ra điều này, nhưng nó phù hợp với cảm giác ruột thịt và kinh nghiệm của tôi với các triển khai ngôn ngữ động khác), lưu ý rằng trình biên dịch PHP-to-C ++ đang được loại bỏ và thay thế bằng trình thông dịch mã byte + JIT được gọi là HHVM ( được phát triển sau này như là một phần của cùng một dự án ô) mà ồ ạt vượt trội hơn nó và có ít hạn chế hơn. Xem github.com/facebook/hiphop-php/wiki

@Delnan: Xấu trình biên dịch tạo ra mã xấu xí và không tự nhiên. Nhưng nó hầu như không thể tránh khỏi. Hãy xem Smart , trình biên dịch thành JavaScript. Đầu ra rất dễ đọc, trừ khi bạn bật obfuscation và / hoặc minifying tất nhiên. <snark>(Trong chừng mực mà JS có thể được gọi là "có thể đọc được", nghĩa là vậy.)</snark>
Mason Wheeler

Câu trả lời:


65

Họ không. Không còn nữa, ít nhất. Hóa ra làm theo cách đó gây ra quá nhiều vấn đề, bao gồm đau đầu triển khai và vô hiệu hóa một trong những lợi thế chính của việc sử dụng ngôn ngữ kịch bản ngay từ đầu - có thể thay đổi tập lệnh mà không cần biên dịch lại - vì vậy họ đã cải tiến hệ thống HipHop thành một kiến ​​trúc VM với pha JIT trong suốt và không dùng trình biên dịch C ++.

Thật thú vị, rõ ràng làm theo cách này cũng nhanh gấp khoảng hai lần (như trong trình diễn) so với phương pháp biên dịch C ++ ban đầu.


4
Tất cả những gì tôi nhận được từ điều này là Facebook đang gặp khó khăn trong việc cân bằng nhu cầu kinh doanh với khả năng của nhà phát triển. Thú vị như nhau, mặc dù tôi nói thêm rằng việc đạt được hiệu suất tốt hơn từ giải pháp JIT so với bản địa chỉ có nghĩa là trò đùa của PHP-> C ++ trên thực tế là quần.
James

7
@James Mặc dù tôi nghi ngờ "HipHopc" là trình biên dịch tối ưu hóa lớn nhất từ ​​trước đến nay, nhưng kết quả cụ thể đó không cho thấy rằng chúng hút các trình biên dịch viết, nó chỉ cho thấy việc biên dịch tĩnh các ngôn ngữ động kém hiệu quả hơn nhiều so với biên dịch động. Điều này đã được tìm thấy là đúng nhiều lần, bởi những người chắc chắn biết cách tối ưu hóa trình biên dịch. Trình biên dịch JIT có thể thực hiện vô số tối ưu hóa một cách dễ dàng. Một trình biên dịch AOT (không có phân tích toàn bộ chương trình rất tốn kém) hiếm khi có thể làm được nhiều hơn ngoài việc loại bỏ chi phí giải thích mà không thực sự loại bỏ tính năng động.

2
@delnan Vâng, vâng, nếu bạn làm tê liệt lợi ích chính của trình biên dịch AOT (phân tích toàn bộ chương trình) bằng cách chỉ ra toàn bộ điểm của trình biên dịch AOT (có nhiều thời gian để phân tích), thì chắc chắn, nó sẽ không so sánh để một JIT làm những gì mà một JIT giỏi (tối ưu hóa lỗ hổng nhanh). Nhưng nó không công bằng, bây giờ phải không?
Alice

2
@delnan Điều này đơn giản là không đúng sự thật, hoặc ít nhất là không trung thực về mặt trí tuệ. Một JIT có thời gian cực kỳ hạn chế so với AOT để thực hiện tối ưu hóa; Java đã viết các bài báo về các cấp phát đăng ký ít hơn lý tưởng, nhưng đủ nhanh để sử dụng JIT. Sử dụng SSA cho phép số lượng tối ưu hóa khổng lồ miễn phí mà hầu hết các cuộc đấu tranh của JIT theo kịp. AOT có thể sử dụng các thuật toán suy luận kiểu đã được chứng minh (Hindley micro Milner và thuật toán W) không phức tạp, trong khi JIT hoàn toàn không có được điều đó miễn phí, trả chi phí về bộ nhớ. Một JIT có thể thực hiện một số tối ưu hóa tốt hơn và AOT cũng vậy.
Alice

1
@ Alice Chúng ta đang nói về các ngôn ngữ rất năng động. Không có thuật toán suy luận kiểu AOT (tức là tĩnh) đơn giản và hiệu quả cho các ngôn ngữ như Python hoặc JavaScript. Có các thuật toán trực tuyến / thời gian chạy phức tạp (ví dụ như được sử dụng trong SpiderMonkey) có hiệu quả và có các thuật toán AOT phức tạp (ví dụ Starkiller) mà cho đến nay không chứng minh được hiệu quả. Thuật toán W thậm chí không bắt đầu giải quyết sự phức tạp của các ngôn ngữ động.

34

Kỹ sư cao cấp của Facebook Haiping Zhao có thể trả lời câu hỏi của bạn tốt nhất.

  1. HipHop lập trình chuyển đổi mã nguồn PHP của bạn thành C ++ được tối ưu hóa cao và sau đó sử dụng g ++ để biên dịch nó. HipHop thực thi mã nguồn theo cách tương đương về mặt ngữ nghĩa và hy sinh một số tính năng hiếm khi được sử dụng - như eval () - để đổi lấy hiệu suất được cải thiện.

  2. Một cách phổ biến để giải quyết những sự thiếu hiệu quả này là viết lại các phần phức tạp hơn của ứng dụng PHP của bạn trực tiếp trong C ++ dưới dạng Phần mở rộng PHP. Điều này phần lớn biến PHP thành ngôn ngữ kết dính giữa HTML ứng dụng và logic ứng dụng trong C ++. Từ góc độ kỹ thuật, nó hoạt động tốt, nhưng làm giảm đáng kể số lượng kỹ sư có khả năng làm việc trên toàn bộ ứng dụng của bạn.

Phần còn lại của bài viết trên blog là một bài đọc tốt, và tôi khuyên bạn nên đọc nó. Nó cung cấp một số cái nhìn sâu sắc về các thách thức lập trình mà Facebook giải quyết và cách họ đang cố gắng giải quyết những vấn đề đó.


7
Lưu ý rằng điều này đã lỗi thời; đó là lần thử đầu tiên của họ, nhưng Facebook không còn làm theo cách này nữa. Xem câu trả lời của tôi, dưới đây.
Mason Wheeler

@MasonWheeler - liên kết và cập nhật tuyệt vời.

19

Chỉ cần lập trình trong c ++? Chắc chắn phải có MỘT SỐ lỗi / lỗi khi nhấn nút trình biên dịch ma thuật chuyển PHP sang mã c ++, phải không?

Đúng, nhưng lập trình trong C ++ sẽ đòi hỏi phải thay thế toàn bộ cơ sở mã hiện tại của họ - một ý tưởng nổi tiếng thế giới vì hoàn toàn ngu ngốc và tàn phá.

Nếu trình chuyển đổi ấn tượng này hoạt động độc đáo như vậy, tại sao lại dính vào PHP? Tại sao không sử dụng một cái gì đó như Ruby hoặc Python? Lưu ý - Tôi đã chọn hai thứ này một cách ngẫu nhiên, nhưng chủ yếu là vì gần như mọi người đều nói mã hóa trong các ngôn ngữ đó là một "niềm vui". Vậy tại sao không phát triển bằng một ngôn ngữ siêu tuyệt vời và sau đó nhấn nút biên dịch ma thuật c ++?

Bởi vì điều đó, một lần nữa, đòi hỏi phải thay thế cơ sở mã PHP hiện có của họ.

Trong một thế giới lý tưởng, họ chỉ đơn giản là viết mã bằng C ++ từ đầu. Thật không may, vì họ có một khối lượng mã hiện có trong PHP, điều đó là không thể. Vì vậy, thay vào đó, họ hack xung quanh vấn đề. Nó rẻ hơn rất nhiều.


2
+1 cho điều này: "Vì vậy, thay vào đó, họ hack xung quanh vấn đề. Nó rẻ hơn rất nhiều." Đó là sự thật - nếu họ có 3500 kỹ sư làm việc trên sản phẩm của họ, thì sẽ rẻ hơn khi có được một nhóm nhỏ 5-50 người tập trung vào việc viết một trình biên dịch PHP-> C ++ tốt, hơn là để toàn bộ nhóm kỹ thuật viết lại mã có giá trị 6 năm .
Suman

Xin lỗi, tôi bối rối. Tại sao họ phải viết lại nó . Bạn chỉ cần nói điều đó theo ý mình - HipHop chuyển đổi tất cả mã thành C ++. Vì vậy, chỉ cần chuyển đổi nó, sau đó gắn bó trong C ++.
dùng72245

16
@ user72245 chỉ vì nó chuyển đổi thành C ++ không có nghĩa là nó chuyển đổi nó thành C ++ có thể đọc hoặc duy trì được
Mr.Mindor

Tại sao lại thế này they hack around the problem? Tối ưu hóa mã bằng C ++ hoặc thậm chí lắp ráp hoàn toàn không mới, đã thực hiện nó từ trước khi có PC.
Steve

cũng lưu ý các lập trình viên Facebook là lập trình viên PHP. Chắc chắn bạn có thể chuyển đổi tất cả sang C ++ và bắt đầu lập trình trong C ++, nhưng các lập trình viên hiện tại của bạn không có kinh nghiệm về ngôn ngữ này. Bạn sẽ cần phải đào tạo lại họ, hoặc thuê các lập trình viên mới để tiếp tục phát triển.
Gavin Coates

8

Thật vậy, tại sao không làm việc trực tiếp trong quá trình lắp ráp, vì mã C ++ cuối cùng được dịch thành các hướng dẫn mã máy?

- Đó, về bản chất, là những gì đối số giảm xuống. Và hy vọng điều này làm cho nó rõ ràng tại sao nó không được thực hiện:

  • Một bộ kỹ năng khác nhau (rất lớn!) Được yêu cầu để lập trình trong lắp ráp (C ++) so với C ++ (PHP).
  • Nó có khả năng khó hơn nhiều để lập trình, vì nhiều lý do
  • Mã được tạo bởi trình biên dịch / trình biên dịch có thể không đọc được bằng con người (nói: có thể duy trì), mặc dù bạn có thể , từ đầu, có thể viết các chương trình có thể đọc được trong assembly (C ++).

2
Tôi đã từng duy trì một ứng dụng bảo hiểm được viết trong hội đồng được hình thành vào những năm 1970. Vào tháng 10, tôi được giao nhiệm vụ thay đổi lời chào trên một "bức thư" để nói tương đương với "Ngày lễ vui vẻ". Nó chỉ được hoàn thành vào tháng Hai năm sau do sự phức tạp. Tôi đã trở nên rất thành thạo trong việc lắp ráp và có thể viết mã tối ưu, miễn là nó không quá vài ngàn dòng. Tuy nhiên, trình biên dịch COBOL và C đã đá vào mông tôi và tạo ra mã tối ưu hơn cho nền tảng mà chúng tôi đang chạy, đặc biệt là đối với các hệ thống vượt quá 1m dây chuyền lắp ráp. Nó làm cho không có ý nghĩa kinh doanh.
bloudraak

5

Tôi không ở Facebook, nhưng dự đoán tốt nhất của tôi về động cơ sẽ là "để tránh những rủi ro đáng kể". Tại thời điểm này, chuyển sang một ngôn ngữ khác không còn là một quyết định công nghệ: trên hết, đó là một quyết định kinh doanh.

Khi bạn là một công ty lớn phát triển hữu cơ theo quy mô FB, bạn sẽ dần thu hút những người sau đó có chuyên môn về nền tảng lập trình của bạn (trong trường hợp của FB, đó là PHP). Từng người một, bạn có được một vài ngàn nhân viên có chuyên môn tuyệt vời về PHP. Tại thời điểm này, việc chuyển sang bất kỳ ngôn ngữ nào khác trở nên rất nguy hiểm: các kỹ sư của bạn sẽ không theo kịp hệ sinh thái mới và có thể cần một thời gian đáng kể để đạt được trình độ chuyên môn theo yêu cầu của công việc hiện tại, chứ đừng nói đến việc cải thiện kỹ năng của họ.

Bỏ qua những ưu điểm tương đối của PHP và các ngôn ngữ thay thế, với số tiền đầu tư mà FB tạo ra cho công nghệ PHP, sẽ quá kiêu ngạo khi nghĩ rằng một công tắc sẽ không gây đau đớn và quá ngu ngốc khi thử nó. Trong kinh doanh, công nghệ có nghĩa là chấm dứt, vì vậy "niềm vui" của lập trình thậm chí không tham gia vào các cuộc thảo luận.


4

Tôi chỉ có thể nghĩ về một trang web lớn được triển khai trong C ++. H2G2

Ngay cả sau đó, ion hiện tại thực sự là một trình thông dịch với một số lượng lớn các hàm thao tác văn bản và cơ sở dữ liệu được tích hợp (điều này nghe không giống một chút và PHP ban đầu :-)).

Facebook khá hài lòng với chức năng của trang web của họ. Họ đã phát triển đến mức mà vanilla PHP không thể hỗ trợ khối lượng họ xử lý. Do đó việc biên dịch PHP thành mã máy C ++. Họ có thể đã viết một trình biên dịch đầy đủ cho PHP, nhưng họ đã bỏ lỡ 20 năm tối ưu hóa tinh tế đã đi vào ngăn xếp trình biên dịch gcc. Vấn đề là mã "C ++" không có nghĩa là con người có thể đọc hoặc duy trì được, nó chỉ là một bước trung gian trên con đường tìm mã máy.

Giống như nhiều lập trình viên trên trang web này, tôi cảm thấy bạn đánh giá thấp khối lượng công việc đầu tư vào logic kinh doanh hte và chức năng được nhúng trong các ứng dụng hiện có và mã giá trị cho riêng nó.


Tôi có thể nghĩ về hàng tá, bây giờ WT thành công.
Alice

@ Alice - thú vị! Nhưng tôi không thể tìm thấy bất cứ ai sử dụng điều này cho một trang web khối lượng lớn. Ngoài ra xin chào thế giới 30 dòng mã để làm 5 dòng mã PHP.
James Anderson

So sánh một ví dụ "xin chào thế giới" là một điều vô lý. Trong chưa đầy 100 dòng, tôi có thể thiết lập một websockets được bật, cuộc thăm dò dài trở lại, tiện ích được tăng cường dần dần với SEO tối ưu, URL sạch tự động mà không cần tải toàn bộ trang bằng AJAX và dấu chân CPU / RAM nhỏ. PHP, ít nhất là trong các cấu hình thông thường, không thể thực hiện các websockets, thăm dò ý kiến ​​dài, làm sạch URL mà không cần trợ giúp, làm sạch URL bằng AJAX và chắc chắn nó sẽ sử dụng một lượng RAM / CPU rất lớn (tương đối). Đối với các ứng dụng web và các ví dụ không đơn giản, WT và C ++ vượt trội hoàn toàn và với C ++ 11, có thể so sánh về chiều dài.
Alice
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.