Facebook이 PHP 코드를 C ++로 변환하는 이유는 무엇입니까? [닫은]


42

Facebook에서 PHP로 시작한 다음 속도를 높이기 위해 PHP를 C ++ 코드로 컴파일했습니다. 그렇다면 왜 그렇지 않습니까?

  1. C ++로 프로그래밍 만 하시겠습니까? PHP를 c ++ 코드로 포팅하는 매직 컴파일러 버튼을 눌렀을 때 반드시 몇 가지 오류 / 버그가 있어야합니까?

  2. 이 인상적인 변환기가 제대로 작동한다면 왜 PHP를 고수해야합니까? 왜 루비 나 파이썬 같은 것을 사용하지 않습니까? 참고-나는이 두 가지를 무작위로 고르지 만, 거의 모든 사람들 이 그 언어로 코딩하는 것이 "기쁨"이라고 말했기 때문입니다. 그렇다면 훌륭한 언어로 개발 한 다음 마술 C ++ 컴파일 버튼을 누르십시오.


12
두 대안 모두 이미 존재하고 처음부터 시작하는 모든 PHP 코드, PHP 관련 도구 및 전문 지식, 지원 인프라의 절반 등을 버리는 것을 의미합니다.

왜? 코드를 C ++로 변환 할 수 있다면 누구나 누구나 좋아하는 언어를 사용하고 변환 버튼을 눌러 C ++ 코드베이스에 전념 할 수 있습니다. 아니?
user72245

7
컴파일러는 대체로 작동하지만 추악하고 부 자연스러운 코드를 생성하며 모든 종류의 추상화를 언급하지 않고 변수 이름, 주석 등을 제거합니다. 대체로 이것은 불가피합니다. 실제로 다른 언어로 유지 관리 가능한 코드베이스로 번역하려는 일부 프로젝트가 있지만 특히 언어가 다른 경우에는 문제가 훨씬 더 어렵습니다. 또한 완벽하게 관용적 인 C ++이 나온다고 가정하더라도 코드베이스에서 작업하는 모든 사람은 C ++을 배우거나 C ++을 아는 사람들로 대체되어야합니다. 그리고 여전히 툴링 문제를 해결하지 못했습니다.

1
또한 (방금 나 자신을 발견했지만 내 직감과 다른 동적 언어 구현에 대한 경험과 일치합니다) PHP-C ++ 컴파일러는 단계적으로 중단되고 HHVM이라는 바이트 코드 인터프리터 + JIT로 대체됩니다. 나중에 동일한 우산 프로젝트의 일부로 개발되었습니다). 참조 github.com/facebook/hiphop-php/wiki

@Delnan : 나쁜 컴파일러는 추악하고 부 자연스러운 코드를 생성합니다. 그러나 그것은 불가피한 일이 아닙니다. JavaScript로 컴파일되는 Smart를 살펴보십시오 . 난독 화 및 / 또는 축소를 설정하지 않으면 출력을 매우 읽을 수 있습니다. <snark>(JS가 "판독 가능"하다고 할 수있는 한)</snark>
Mason Wheeler

답변:


65

그들은하지 않습니다. 적어도 더 이상은 아닙니다. 재 컴파일 할 필요없이 변경 스크립트 수있는 - - 그래서 그런 식으로 배포 두통을 포함하고 처음에 스크립트 언어를 사용하여의 주요 장점 중 하나를 무효로 너무 많은 문제를 일으키는 그 일을 밝혀 그들이에 힙합 시스템을 개조 투명한 JIT 단계를 가진 VM 아키텍처이며 C ++ 컴파일러는 더 이상 사용되지 않습니다.

흥미롭게도,이 방법을 사용하는 것은 원래 C ++ 트랜스 컴파일 방식보다 약 2 배 빠릅니다 (성능 에서처럼).


4
내가 얻는 것은 Facebook이 비즈니스 요구와 개발자 기능의 균형을 맞추는 데 어려움을 겪고 있다는 것입니다. JIT 솔루션에서 기본 솔루션보다 더 나은 성능을 얻는 것은 PHP-> C ++ jiggerypokery가 실제로 중요하다는 것을 의미한다고 덧붙였습니다.
James

7
@James 필자는 "HipHopc"가 가장 최적화 된 컴파일러라고 의심하지만, 특정 결과는 컴파일러 작성에 짜증을내는 것이 아니라 동적 언어의 정적 컴파일이 동적 컴파일보다 훨씬 덜 효과적이라는 것을 보여줍니다. 최적화 컴파일러를 작성하는 방법을 확실히 알고있는 사람들에 의해 반복적으로 사실로 밝혀졌습니다. JIT 컴파일러는 다양한 최적화를 쉽게 수행 할 수 있습니다. AOT 컴파일러 (고가의 전체 프로그램 분석없이)는 실제로 동 적성을 제거하지 않고 해석 자체의 오버 헤드를 제거하는 것 이상을 거의 수행 할 수 없습니다.

2
@delnan 글쎄요, 예, AOT 컴파일러의 전체 요점을 지적함으로써 (전체 프로그램 분석) AOT 컴파일러 (전체 프로그램 분석)의 주요 이점을 무너 뜨린다면 (분석 할 시간이 많이 있습니다), 확실히, 비교하지 않습니다 JIT가 잘하는 일을하는 JIT에게 (빠른 엿보기 최적화). 그러나 그것은 거의 공평하지 않습니다. 지금입니까?
Alice

2
@delnan 이것은 단순히 사실이 아니거나 적어도 지적 적으로 부정직합니다. JIT는 최적화를 수행하기 위해 AOT에 비해 시간이 극히 제한되어 있습니다. Java는 레지스터 할당 자에 대한 논문을 작성했지만 이상적이지는 않지만 JIT 사용에 충분히 빠릅니다. SSA를 사용하면 대부분의 JIT가 따라야 할 많은 양의 최적화 가 무료로 허용 됩니다. AOT는 복잡하지 않은 입증 된 형식 유추 알고리즘 (Hindley–Milner 및 알고리즘 W)을 사용할 수 있지만 JIT는 메모리 측면에서 비용을 지불하지 않으면 서 무료로 얻을 수 없습니다. JIT는 일부 최적화를 더 잘 수행 할 수 있으며 AOT도 더 잘 수행 할 수 있습니다.
Alice

1
@Alice 우리는 매우 역동적 인 언어에 대해 이야기하고 있습니다. Python 또는 JavaScript와 같은 언어에 대한 간단하고 효과적인 AOT (즉, 정적) 유형 추론 알고리즘은 없습니다. 효과적인 온라인 / 런타임 알고리즘 (예 : SpiderMonkey에서 사용)이 효과적이며, 지금까지 스스로 효과적인 것으로 입증하지 못한 복잡한 AOT 알고리즘 (예 : Starkiller)이 있습니다. 알고리즘 W는 동적 언어의 복잡성을 다루기 시작하지도 않습니다.

34

Facebook의 수석 엔지니어 인 Haiping Zhao가 귀하의 질문에 가장 잘 대답 할 것입니다 .

  1. HipHop은 프로그래밍 방식으로 PHP 소스 코드를 고도로 최적화 된 C ++로 변환 한 다음 g ++를 사용하여 컴파일합니다. HipHop은 의미 적으로 동등한 방식으로 소스 코드를 실행하고 성능 향상을 위해 eval ()과 같이 거의 사용되지 않는 일부 기능을 희생합니다.

  2. 이러한 비 효율성을 해결하는 한 가지 일반적인 방법은 PHP 응용 프로그램의 복잡한 부분을 C ++에서 직접 PHP 확장으로 다시 작성하는 것입니다. 이렇게하면 PHP가 프론트 엔드 HTML과 C ++의 응용 프로그램 논리 사이에서 풀 언어로 변형됩니다. 기술적 인 관점에서 이것은 잘 작동하지만 전체 응용 프로그램에서 작업 할 수있는 엔지니어 수를 크게 줄입니다.

블로그 게시물의 나머지 부분은 잘 읽었으며 권장합니다. Facebook이 다루는 프로그래밍 문제와 이러한 문제를 해결하는 방법에 대한 통찰력을 제공합니다.


7
이것은 더 이상 사용되지 않습니다. 그것은 첫 번째 시도 였지만 Facebook은 더 이상 이런 식으로하지 않습니다. 아래 답변을 참조하십시오.
메이슨 휠러

@MasonWheeler-훌륭한 링크 및 업데이트.

19

C ++로 프로그래밍 만 하시겠습니까? PHP를 c ++ 코드로 포팅하는 매직 컴파일러 버튼을 눌렀을 때 반드시 몇 가지 오류 / 버그가 있어야합니까?

그렇습니다. 그러나 C ++로 프로그래밍하는 것은 기존의 전체 코드베이스를 대체하는 것입니다. 완전히 바보 같고 파괴적인 것으로 세계적으로 유명한 아이디어입니다.

이 인상적인 변환기가 제대로 작동한다면 왜 PHP를 고수해야합니까? 왜 루비 나 파이썬 같은 것을 사용하지 않습니까? 참고-나는이 두 가지를 무작위로 고르지 만, 거의 모든 사람들이 그 언어로 코딩하는 것이 "기쁨"이라고 말했기 때문입니다. 그렇다면 훌륭한 언어로 개발 한 다음 마술 C ++ 컴파일 버튼을 누르십시오.

다시 말해 기존 PHP 코드베이스를 대체해야하기 때문입니다.

이상적인 세상에서는 처음부터 C ++로 코딩하기 만하면됩니다. 불행히도 PHP에는 기존 코드가 포함되어 있기 때문에 불가능합니다. 대신, 그들은 문제를 해킹합니다. 너무 저렴합니다.


2
+1 : "대신 문제를 해킹합니다. 훨씬 저렴합니다." 사실-제품에 3500 명의 엔지니어가 근무하고 있다면 5-50 명으로 구성된 소규모 팀을 구성하는 것이 훨씬 저렴합니다. 전체 엔지니어링 팀이 6 년 분량의 코드를 다시 작성하는 것보다 좋은 PHP-> C ++ 컴파일러 작성에 집중했습니다. .
Suman

죄송합니다. 혼란 스럽습니다. 왜 그들이해야 할 것입니다 그것을 다시 . 당신은 방금 자신에게 말했다-HipHop은 모든 코드를 C ++로 변환합니다. 따라서 변환 한 다음 C ++에 충실하십시오.
user72245

16
@ user72245가 C ++로 변환되었다고해서 읽거나 유지 관리 가능한 C ++로 변환한다는 의미는 아닙니다.
Mr.Mindor

왜 이런 they hack around the problem가요? C ++ 또는 어셈블리를 사용하여 코드를 최적화하는 것은 전혀 새로운 것이 아니며 PC가 있기 전부터 수행되었습니다.
Steve

또한 페이스 북 프로그래머는 PHP 프로그래머임을 명심하십시오. 물론 C ++로 변환하고 C ++로 프로그래밍을 시작할 수 있지만 기존 프로그래머는이 언어에 대한 경험이 없습니다. 개발을 계속하려면 재교육을 받거나 새로운 프로그래머를 고용해야합니다.
Gavin Coates

8

"실제로 C ++ 코드가 궁극적으로 머신 코드 명령어로 변환되기 때문에 어셈블리에서 직접 작동하지 않는 이유는 무엇입니까?"

– 본질적으로, 주장이 줄어드는 것입니다. 그리고 이것이 왜 이것이 끝나지 않았는지 분명히 알 수 있습니다.

  • C ++ (PHP)에서와 같이 어셈블리 (C ++)에서 프로그래밍하려면 (대략!) 다른 기술 세트가 필요합니다.
  • 여러 가지 이유로 프로그래밍하기가 훨씬 어렵습니다.
  • 처음부터 어셈블리 (C ++)로 읽을 수있는 프로그램을 작성할 수 있지만 어셈블러 / 컴파일러가 생성 한 코드는 사람이 읽을 수있는 (말할 수 있음 : 말하기 가능하지 않을) 수 있습니다 .

2
한때 1970 년대에 고안된 집회에서 작성된 보험 신청서를 유지했습니다. 10 월에 나는 "Happy Holidays"와 같은 말을하기 위해 "레터"의 인사말을 바꾸는 임무를 맡았습니다. 복잡성으로 인해 내년 2 월에 완료되었습니다. 어셈블리에 능숙 해져서 수만 줄을 넘지 않는다면 최적의 코드를 작성할 수있었습니다. 그러나 COBOL 및 C 컴파일러는 제 엉덩이를 걷어 차고 우리가 실행중인 플랫폼, 특히 1m 라인을 초과하는 시스템의 경우보다 최적의 코드를 생성했습니다. 사업 적으로 이해가되지 않습니다.
bloudraak

5

저는 Facebook에 없지만 동기에 대한 최선의 추측은 "심각한 위험을 피하는 것"입니다. 이 시점에서 다른 언어로 전환하는 것은 더 이상 기술 결정이 아닙니다. 무엇보다도 비즈니스 결정입니다.

FB 규모로 유기적으로 성장한 대기업 인 경우 프로그래밍 플랫폼 (FB의 경우에는 PHP)에 대한 전문 지식을 얻는 사람들을 천천히 끌어들입니다. PHP를 통해 전문 지식을 갖춘 수천 명의 직원을 한 명씩 얻게됩니다. 이 시점에서 다른 언어로 전환하는 것은 매우 위험합니다. 엔지니어는 새로운 생태계에 적응할 수 없으며 기술을 향상시키는 것은 물론 현재 작업에 필요한 전문 지식 수준을 달성하는 데 상당한 시간이 필요할 수 있습니다.

PHP와 대체 언어의 상대적인 장점을 제외하고 FB가 PHP 기술에 투자 한 금액이 많으면 스위치가 고통스럽지 않고 시도하기 어려울 것이라고 생각하기에는 너무 거만합니다. 비즈니스에서 기술은 끝나는 수단이므로 프로그래밍의 "기쁨"은 토론에 들어 가지 않습니다.


4

C ++로 구현 된 하나의 주요 웹 사이트 만 생각할 수 있습니다. H2G2

그럼에도 불구하고 현재 구현 이온은 실제로 많은 텍스트 및 데이터베이스 조작 기능이 내장 된 인터프리터입니다 (약간 PHP와 비슷하지는 않습니다 :-)).

Facebook은 웹 사이트의 기능에 매우 만족합니다. 그들은 바닐라 PHP가 처리하는 볼륨을 지원할 수없는 수준으로 성장했습니다. 따라서 PHP를 C ++ 이후 머신 코드로 컴파일합니다. PHP를위한 완전한 컴파일러를 작성할 수 있었지만, gcc 컴파일러 스택에 들어간 20 년 동안의 미묘한 최적화를 놓쳤을 것입니다. 요점은 "C ++"코드는 사람이 읽을 수 있거나 코드를 가공하는 과정의 중간 단계에 불과한 것이 아닙니다.

이 사이트의 많은 프로그래머와 마찬가지로 기존 응용 프로그램에 포함 된 비즈니스 논리 및 기능에 투자 한 작업량과 자체 가치 코드를 과소 평가한다고 생각합니다.


나는 WT가 성공 했으므로 수십 명을 생각할 수 있습니다.
Alice

@ 앨리스-흥미 롭습니다! 그러나 대량 사이트에 이것을 사용하는 사람을 찾을 수 없습니다. 또한 hello world 30 코드 라인으로 5 라인의 PHP 코드를 수행합니다.
James Anderson

"hello world"예제를 비교하는 것은 말도 안됩니다. 100 줄 미만으로 웹 소켓 활성화, 긴 폴 폴백, 최적의 SEO로 점진적으로 향상 된 위젯, AJAX를 사용하여 전체 페이지로드가없는 자동 클린 URL 및 작은 CPU / RAM 풋 프린트를 설정할 수 있습니다. 최소한 일반적인 구성에서는 PHP가 웹 소켓, 긴 폴링, 도움말없이 URL 정리, AJAX로 URL 정리를 수행 할 수 없으며 엄청나게 (비교적으로) 많은 양의 RAM / CPU를 사용합니다. 간단한 예제가 아닌 웹 응용 프로그램의 경우 WT 및 C ++는 상당히 우수하며 C ++ 11의 경우 길이가 비슷합니다.
Alice
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.