HHVMBLOG DOCS GITHUB HACKThe Journey of a Thousand BytecodesPosted on  dịch - HHVMBLOG DOCS GITHUB HACKThe Journey of a Thousand BytecodesPosted on  Việt làm thế nào để nói

HHVMBLOG DOCS GITHUB HACKThe Journe

HHVM
BLOG DOCS GITHUB HACK
The Journey of a Thousand Bytecodes

Posted on October 3, 2014 by Sara Golemon

Compilers are fun. They take nice, human readable languages like PHP or Hack and turn them into lean, mean, CPU executin’ turing machines. Some of these are simple enough a CS student can write one up in a weekend, some are the products of decades of fine tuning and careful architecting. Somewhere in that proud tradition stands HHVM; In fact it’s several compilers stacked in an ever-growing chain of logic manipulation and abstractions. This article will attempt to take the reader through the HHVM compilation process from PHP-script to x86 machine code, one step at a time.

Step One: Lexing

The first step of our journey should be familiar to many PHP users since it’s actually exposed to user space as the token_get_all() function. In this phase, we reduce a human-readable PHP script to a series of tokens; Numeric identifiers which the compiler will be able to recognize as having some intrinsic meaning. For this, HHVM uses a tool called Flex to generate a program from a meta definition at hphp/parser/hphp.ll.

The several rules in this file describe the how to recognize token-words. For example, encountering “echo” inside of a
0/5000
Từ: -
Sang: -
Kết quả (Việt) 1: [Sao chép]
Sao chép!
HHVMBLOG TÀI LIỆU GITHUB HACKCuộc hành trình của một nghìn BytecodesĐược đăng trên 3 tháng 10 năm 2014 bởi Sara GolemonTrình biên dịch là vui vẻ. Họ có tốt đẹp, con người có thể đọc được ngôn ngữ như PHP hoặc Hack và biến chúng thành nạc, có nghĩa là, CPU executin' máy turing. Một số người trong số này rất đơn giản đủ là một sinh viên CS có thể viết một lên trong một ngày cuối tuần, một số là các sản phẩm của thập kỷ tinh chỉnh và cẩn thận architecting. Một nơi nào đó trong đó truyền thống tự hào là viết tắt của HHVM; Trong thực tế nó là trình biên dịch một số xếp chồng lên nhau trong một chuỗi ngày càng phát triển của logic thao tác và abstractions. Bài viết này sẽ cố gắng để có người đọc thông qua quá trình biên soạn HHVM từ kịch bản PHP để x 86 máy mã, một bước tại một thời điểm.Bước một: LexingBước đầu tiên của cuộc hành trình của chúng tôi nên quen thuộc với nhiều người sử dụng PHP kể từ khi nó được thực sự tiếp xúc với người sử dụng không gian như chức năng token_get_all(). Trong giai đoạn này, chúng tôi giảm một kịch bản PHP có thể đọc được con người đến một loạt các thẻ; Số định danh mà trình biên dịch sẽ có thể nhận ra là có một số ý nghĩa nội tại. Đối với điều này, HHVM sử dụng một công cụ gọi là Flex để tạo ra một chương trình từ một định nghĩa meta lúc hphp/parser/hphp.ll.Một số quy tắc trong tập tin này mô tả làm thế nào để nhận ra mã thông báo-từ. Ví dụ, gặp phải "echo" bên trong của một echo $a + $b;Nếu chúng tôi chạy này thông qua token_get_all(), chúng tôi sẽ nhận được theo trình tự sau của thẻ:T_OPEN_TAG / / điều này đại diện cho các "T_WHITESPACE("N")T_ECHOT_WHITESPACE("")T_VARIABLE("$a")T_WHITESPACE("")'+'T_WHITESPACE("")T_VARIABLE("$b")';'Chú ý rằng nhân vật duy nhất, đơn giản thẻ không được đặt tên, họ đang chỉ đơn giản là đi qua như là nhân vật mà họ. Bây giờ chúng tôi có một bộ máy có thể đọc thẻ, chúng tôi có thể bắt đầu xây dựng các biểu thức từ họ.Bước hai: phân tích cú phápQuy tắc tìm thấy trong hphp/parser/hphp.y được sử dụng bởi Bison để tạo ra một công cụ phân tích cú pháp. Đoạn này của trình biên dịch đọc trong thẻ, ăn cho nó bởi lexer, để xây dựng một cú pháp trừu tượng Tree (AST); Một đại diện của các biểu thức chứa trong kịch bản PHP của bạn.Xem xét một đoạn phức tạp hơn một chút của kịch bản:echo "Hiện 1 + 2 bằng 3?";Nếu ((1+2) == 3) {} echo "Có nó không!";} {} khác echo "Không có nó không...";}Chúng tôi tạo ra một AST mà trông giống như sau:EchoStatement ConstantExpression ("hiện 1 + 2 bằng 3?")IfBranchStatement BinaryOpExpression(EQUAL) BinaryOpExpression(ADD) ConstantExpression(1) ConstantExpression(2) ConstantExpression(3) EchoStatement ConstantExpression ("có nó!") EchoStatement ConstantExpression ("không có CNTT không...")Ở đây chúng tôi có thể thấy rằng chúng tôi thẻ vô tổ chức đã được gộp nhóm cùng nhau như vậy mà biểu thức hợp lý được lồng nhau thành nhóm cách chúng ta, như con người, mong đợi để làm cho tinh thần của họ. Đây là trung tâm của định nghĩa của ngôn ngữ và đó là những gì xác định tất cả mọi thứ từ đơn đặt hàng của hoạt động (ưu tiên) để các Hiệp hội của một tuyên bố vào nhau.Bước hai và một nửa: tối ưu hóaTôi gọi này hai và một nửa, bởi vì chúng tôi không thực sự đang thay đổi các đại diện của kịch bản gốc Mã tại thời điểm này. Thay vào đó, chúng tôi đang giảm biểu thức mà có thể được đơn giản hóa trước khi các mã là bao giờ chạy (ngoài ra, một số trong những điều này xảy ra trong bước 3). Ví dụ, chúng tôi có thể đánh giá "1 + 2 đến 3, và chúng tôi AST trở thành:EchoStatement ConstantExpression ("hiện 1 + 2 bằng 3?")IfBranchStatement BinaryOpExpression(EQUAL) ConstantExpression(3) ConstantExpression(3) EchoStatement ConstantExpression ("có nó!") EchoStatement ConstantExpression ("không có CNTT không...")Sau đó đánh giá "3 ==" 3 "để"đúng":EchoStatement ConstantExpression ("hiện 1 + 2 bằng 3?")IfBranchStatement ConstantExpression(true) EchoStatement ConstantExpression ("có nó!") EchoStatement ConstantExpression ("không có CNTT không...")Bây giờ chúng tôi biết rằng chúng tôi sẽ luôn luôn có các chi nhánh thật và không bao giờ có các chi nhánh sai, do đó:EchoStatement ConstantExpression ("hiện 1 + 2 bằng 3?")EchoStatement ConstantExpression ("có nó!")Mà tất nhiên có thể được giảm đến một EchoStatement duy nhất. Kịch bản này rõ ràng là một chút contrived để hiển thị ra sân khấu trình tối ưu hóa này, nhưng nó là giá trị nhìn thấy những gì có thể.Hỏi: Sự khác biệt giữa một tuyên bố và một biểu hiện là gì?Trả lời: Báo cáo là thiết bị đầu cuối, họ đã không có giá trị sản lượng để được tiêu thụ bởi nút sau này trong AST, và phải xuất hiện do chỉ như là quốc gia Anh chị em trong một AST HHVM. Biểu thức sản xuất một giá trị như là một kết quả, và như vậy, có thể, được sử dụng như đầu vào để các biểu thức hoặc báo cáo.Bước 3: Biên soạn để BytecodeGiai đoạn cuối của trình biên dịch của chúng tôi "kết thúc của trước" mang lại cho chúng tôi thông qua hphp/compiler/analysis/emitter.cpp nơi chúng tôi bật đó AST vào bytecodes mà có thể được thực hiện bởi HHVM của thông dịch viên. Chúng tôi làm điều này bằng "thăm" biểu hiện mỗi từ các cơ sở của cây trở lên, với mỗi biểu hiện mô tả chính nó như là một loạt các bytecodes.Ví dụ, một tuyên bố echo có một hoặc nhiều trẻ em đó, bởi Đức hạnh của là biểu hiện bản thân, lần lượt có thể tạo ra từ các biểu thức khác. Cho mỗi trẻ em biểu hiện của một EchoStatement chúng tôi lần đầu tiên ghé thăm các biểu hiện, sẽ sản xuất một số bytecodes kết quả là một giá trị duy nhất có được đẩy lên "chồng". Chúng tôi sau đó phát ra bytecode "Print" sẽ bật giá trị, outputting nội dung của nó, sau đó đẩy giá trị kết quả của nó là của riêng của int(1). Bởi vì Echo là một tuyên bố, Tuy nhiên, và do đó phải không có một giá trị sản lượng, chúng tôi ngay lập tức pop nó quay trở lại bằng cách sử dụng PopC.Câu hỏi: Tại sao đẩy một giá trị để ngăn xếp nếu Echo là một tuyên bố, và không phải là một biểu hiện?Trả lời: Bởi vì Echo gian lận bằng cách sử dụng lại cùng bytecode có nghĩa là để biểu hiện print(), nếu bạn sẽ nhớ lại, có một giá trị trả lại. Hướng dẫn PopC ném mà đó là không cần thiết.Câu hỏi: Không phải là những gì không hiệu quả?Trả lời: Có, nhưng chỉ trong chế độ interp, điều này biến mất khi chúng tôi tiếp cận JIT.Chúng ta hãy xem rằng trong thực hành:echo "Xin chào", $name, "
";Sản xuất một AST cho một EchoStatement với ba trẻ em biểu hiện:EchoStatement ConstantExpression ("Hello") VariableExpression($name) ConstantExpression("
")Mà truy cập EchoStatement, những người lần lượt truy cập mỗi đứa trẻ:Chuỗi "Hello" / / đẩy "Xin chào" vào ngăn xếpIn / / tiêu thụ "Hello" từ ngăn xếp, và đẩy int(1)PopC / / tiêu thụ int(1) và vứt nó điCGetL 0 / / lấy địa phương #0 ($name) từ biểu tượng bàn và đẩy nó vào ngăn xếpIn / / etc... vv... vv...PopCChuỗi "
"InPopCTạo ra Bytecode bãiĐể xem mã byte cho một tập lệnh nhất định, tương tự như cách PHP cho phép bạn xem mã thông qua VLD, bạn có hai lựa chọn. Đầu tiên là để chạy nó thông qua HHVM như bình thường với-tùy chọn vEval.DumpBytecode=1. Định dạng này được thiết kế cho dễ đọc của con người và có nghĩa là chủ yếu cho thời gian phát triển và gỡ lỗi. Ví dụ, một thế giới Xin chào chương trình đơn giản:echo "Chào World
";Trở thành:$ hhvm-vEval.DumpBytecode=1 /tmp/hello-world.phpGiả chính tại 0maxStackCells: 1numLocals: 0numIterators: 0dòng 20: chuỗi "Xin chào World
"5: in6: PopC7: Int 116: RetCGiả chính tại 0maxStackCells: 1numLocals: 0numIterators: 0Nếu bạn đang tự hỏi về Int 1/RetC lúc kết thúc, đó là tiềm ẩn "trở lại 1;" mà đi kèm ở cuối của mỗi tập tin (có rõ ràng không trở về một cái gì đó) để biểu hiện bao gồm có một giá trị trả lại. Hãy nhớ rằng, phạm vi toàn cầu"" hoạt động như một chức năng vô danh mà gọi ngầm khi khởi động, và chia sẻ phạm vi của nó thay đổi với tất cả các chức năng khác psuedo-chính cấp cao nhất.Tùy chọn thứ hai là gần như giống hệt nhau trong invocation, nhưng tạo ra sản lượng đáng chú ý khác nhau:$ hhvm-vEval.DumpHhas=1 /tmp/hello.php.filepath "/ tmp/hello.php";.Main {} Chuỗi "Hello World
" In PopC Int 1 RetC}Điều này là thực sự của HHVM thứ ba ngôn ngữ (PHP và Hack là hai lần đầu tiên), lắp ráp HipHop. Ngôn ngữ ẩn này, đó là bình thường chỉ được công nhận trong các tập tin Systemlib, cho phép nhà phát triển để vượt qua những bước đầu tiên hai của trình biên dịch và tạo ra nguyên bytecodes. Bạn có thể tìm thấy một ví dụ hiện tại của này (hphp/system/php/array_map.hhas) trong việc thực hiện của array_map() nơi HHVM sử dụng một bytecode tùy chỉnh một cách rõ ràng được thiết kế để thực hiện các chức năng hiệu quả hơn.Để biết thêm về ý nghĩa và sử dụng của tất cả các HHVM bytecodes, xem hphp/doc/bytecode.specification.Lưu ý: Bạn nên không phát triển ứng dụng hoặc thư viện ở HHAS. Cú pháp của HHAS và hành vi của bytecodes cụ thể không được đảm bảo giữa các phiên bản của HHVM và chỗ ở này gần như không bao giờ có bất kỳ lợi ích để có được qua viết kịch bản trong PHP bình thường. Phạm vi bảo hiểm trong bài viết này là có nghĩa là cho các mục đích thông tin.Bước 3.5: Tối ưu hóa công HHBBCTối ưu hóa chúng tôi thực hiện trong bước 2.5 đã là tốt đẹp nhanh chóng, rõ ràng những điều chúng tôi có thể bắt trong quá trình biên soạn on-the-fly mã, bình thường, nhưng họ không có cải tiến duy nhất chúng tôi có thể làm cho. Khi xây dựng trong chế độ RepoAuthoritative, nó có thể để xem xét chương trình một chút sâu hơn và cắt ra làm việc không cần thiết thậm chí nhiều hơn. Xem xét kịch bản này:define ('FOO', "Xin chào World
");echo FOO;$x = 1 + 2;Nếu ($x == 3) {} echo "X là three
";} {} khác echo "X là không three
";}Một lần nữa, một con người có thể nhìn vào điều này và biết rằng một phiên bản đơn giản của kịch bản này có thể được giảm bớt rất nhiều, nhưng giữ theo dõi của tiểu bang đó là quá phức tạp đối với trình biên dịch đầu tiên vượt qua để làm. Vì vậy, chúng tôi thấy bytecode tìm kiếm như thế này:$ hhvm-vEval.DumpBytecode=1 /tmp/three.phpdòng 3 0: chuỗi "Xin chào World
" 5: DefCns "FOO" 10: PopC dòng 4 11: thần kinh trung ương "FOO" 16: in 17: PopCdòng 6 18: Int 3 27: SetL 0 29: PopCdòng 7 30: Int 3 39: CGetL2 0 41: Eq 42: JmpZ 17 (59)dòng 8 47: string "X là three
" 52:
đang được dịch, vui lòng đợi..
Kết quả (Việt) 2:[Sao chép]
Sao chép!
HHVM
BLOG DOCS GitHub HACK
The Journey of a Thousand bytecode đăng vào 03 Tháng 10 2014 bởi Sara Golemon Trình biên dịch là vui vẻ. Họ mất đẹp, ngôn ngữ có thể đọc được con người như PHP hoặc Hack và biến chúng thành nạc, trung bình, CPU executin 'Turing máy. Một số trong số này là đơn giản, đủ một sinh viên CS có thể viết lên trong một ngày cuối tuần, một số là những sản phẩm của thập kỷ điều chỉnh và architecting cẩn thận. Một nơi nào đó trong đó truyền thống tự hào đứng HHVM; Trong thực tế, nó là một số trình biên dịch xếp chồng lên nhau trong một chuỗi ngày càng tăng của các thao tác logic và trừu tượng. Bài viết này sẽ cố gắng để đưa người đọc thông qua quá trình biên dịch HHVM từ PHP-script để mã máy x86, một bước tại một thời điểm. Bước Một: Lexing Các bước đầu tiên của cuộc hành trình của chúng tôi nên quen thuộc với nhiều người sử dụng PHP vì nó thực sự tiếp xúc với không gian sử dụng như các token_get_all () chức năng. Trong giai đoạn này, chúng tôi giảm một PHP script của con người có thể đọc được một loạt các thẻ; Nhận dạng số mà các trình biên dịch sẽ có thể nhận ra là có một số ý nghĩa nội tại. Đối với điều này, HHVM sử dụng một công cụ gọi là Flex để tạo ra một chương trình từ một định nghĩa meta tại hphp / phân tích cú pháp / hphp.ll. Việc một số quy định trong tập tin này mô tả làm thế nào để nhận token-từ. Ví dụ, gặp phải "tiếng vang" bên trong của một echo $ a + $ b; Nếu chúng ta chạy này qua token_get_all (), chúng tôi nhận được các trình tự sau của thẻ: // T_OPEN_TAG này đại diện cho " T_WHITESPACE (" n") T_ECHO T_WHITESPACE ("") T_VARIABLE ("USD") T_WHITESPACE ("") '+' T_WHITESPACE ("") T_VARIABLE ("$ b") ';' Chú ý rằng đơn giản, thẻ nhân vật duy nhất không được đặt một cái tên, họ chỉ đơn giản là đi qua như các nhân vật mà họ đang Bây giờ chúng ta có một tập hợp các thẻ máy có thể đọc được, chúng ta có thể bắt đầu xây dựng biểu thức từ họ.. Bước Hai: Phân tích cú pháp Các quy tắc tìm thấy trong hphp / phân tích cú pháp / hphp.y là . được sử dụng bởi Bison để tạo ra một công cụ phân tích cú pháp này phần của các trình biên dịch hiện đọc thẻ, thức ăn cho nó bằng các lexer, để xây dựng một Abstract Syntax Tree (AST); Một đại diện của các biểu thức chứa trong kịch bản PHP của bạn. Xem xét một chút nhiều hơn đoạn phức tạp của kịch bản: echo "? Có 1 + 2 bằng 3"; if ((1 + 2) == 3) { echo "! Có nó"; } else { echo "Không có nó không ..." ; } Chúng tôi tạo ra một AST mà trông giống như sau: EchoStatement ConstantExpression ("Có 1 + 2 bằng nó! ") EchoStatement ConstantExpression ("Không có nó không ...") Ở đây chúng ta có thể thấy rằng thẻ vô tổ chức của chúng tôi đã được nhóm lại với nhau như vậy mà các biểu thức logic được lồng nhau thành các nhóm theo cách chúng ta, những con người, sẽ mong đợi để làm . cảm giác của họ này là trung tâm của các định nghĩa của ngôn ngữ và đó là những gì sẽ quyết định tất cả mọi thứ từ đơn đặt hàng của hoạt động (được ưu tiên) sự kết hợp của một tuyên bố thành khác. Bước Two and a Half: Tối ưu hóa tôi gọi hai này và một nửa , bởi vì chúng ta không thực sự thay đổi đại diện của mã kịch bản gốc tại thời điểm này. Thay vào đó, chúng tôi đang giảm hiện nào có thể được đơn giản hóa trước khi mã là bao giờ chạy (cũng được, một số điều này xảy ra ở bước 3). Ví dụ , chúng ta có thể đánh giá "1 + 2" đến 3, và AST của chúng tôi trở thành: EchoStatement ConstantExpression ("Có 1 + 2 bằng nó ")! EchoStatement ConstantExpression ("Không có nó không ...") Sau đó đánh giá "3 == 3" thành "true": EchoStatement ConstantExpression ("? Có 1 + 2 bằng 3") IfBranchStatement ConstantExpression (true) EchoStatement ConstantExpression ("Có nó!") EchoStatement ConstantExpression ("Không có nó không ...") Bây giờ chúng ta biết rằng chúng ta sẽ luôn có những chi nhánh thật và không bao giờ chi nhánh giả, vì vậy: EchoStatement ConstantExpression ("Liệu 1 + 2 bằng 3? ") EchoStatement ConstantExpression ("Có nó!") Trong đó tất nhiên có thể được giảm đến một EchoStatement duy nhất. Kịch bản này rõ ràng là một chút giả tạo để thể hiện giai đoạn tối ưu này, nhưng nó có giá trị nhìn thấy những gì có thể. Câu hỏi: Sự khác nhau giữa một Tuyên bố và một biểu thức là gì? Trả lời:. báo cáo là thiết bị đầu cuối, họ không có giá trị sản lượng được tiêu thụ bởi các nút sau trong AST, và do phải xuất hiện chỉ như là anh chị em ruột cấp cao nhất trong một HHVM AST Expressions sản xuất một giá trị như vậy, và có thể, như vậy, được sử dụng như là đầu vào cho các biểu thức khác hoặc báo cáo. Bước 3: Lập để bytecode Các giai đoạn cuối cùng của "mặt trước" trình biên dịch của chúng tôi mang đến cho chúng ta qua hphp / biên dịch / phân tích / emitter.cpp nơi chúng tôi quay AST đó vào bytecode mà có thể được thực hiện bằng cách thông dịch viên của HHVM. Chúng tôi làm điều này bằng cách "thăm" mỗi biểu từ các cơ sở của các cây trở lên, với mỗi biểu thức mô tả chính nó như là một loạt các bytecode. Ví dụ, một echo tuyên bố có một hoặc nhiều trẻ em trong đó, nhờ được biểu hiện bản thân, có thể trong lần lượt được tạo thành từ các biểu thức khác. Đối với mỗi biểu thức con của một EchoStatement chúng tôi lần đầu đến biểu thức, trong đó sẽ sản xuất một số bytecode dẫn đến một giá trị duy nhất đã được đẩy lên "stack". Chúng tôi sau đó phát ra một "Print" bytecode sẽ bật giá trị đó, xuất ra nội dung của nó, sau đó đẩy nó giá trị kết quả riêng của int (1). Bởi vì Echo là một tuyên bố, tuy nhiên, và do đó không có giá trị sản lượng, chúng tôi ngay lập tức bật nó trở lại bằng cách sử dụng PopC. Câu hỏi: Tại sao đẩy một giá trị vào stack nếu Echo là một tuyên bố, và không phải là một biểu thức trả lời: Bởi vì Echo lận bằng cách dùng lại các bytecode cùng ý nghĩa cho các print () biểu hiện, mà nếu bạn sẽ nhớ lại, không có một giá trị trả về. Các hướng dẫn PopC ném mà đi như không cần thiết. Câu hỏi: Không phải là không hiệu quả? trả lời:. Có, nhưng chỉ trong chế độ interp, điều này sẽ biến mất khi chúng ta đạt đến JIT Chúng ta hãy nhìn vào mà trong thực tế: echo "Hello" , $ name, " n"; Tạo một AST cho một EchoStatement với ba biểu thức con: EchoStatement ConstantExpression ("Hello") VariableExpression ($ name) ConstantExpression (" n") Mà thăm EchoStatement, người trong lượt thăm mỗi con : String "Hello" // Push "Hello" vào stack Print // Tiêu thụ "Hello" từ stack, và push int (1) Tiêu thụ PopC // int (1) và ném nó đi CGetL 0 // Lấy địa phương # 0 ($ name) từ bảng ký hiệu và đẩy nó vào stack Print // vv ... vv ... vv ... PopC String " n" In PopC Tạo Bytecode Dumps Để xem mã số byte cho một kịch bản nhất định, tương tự như cách PHP cho phép bạn xem Opcodes qua VLD, bạn có hai lựa chọn. Đầu tiên là để chạy nó thông qua HHVM như thường lệ với -vEval.DumpBytecode = 1 tùy chọn. Định dạng này được thiết kế cho khả năng đọc của con người và có ý nghĩa chính cho sự phát triển thời gian chạy và gỡ lỗi. Ví dụ, một chương trình Hello World đơn giản: echo "Hello World n"; trở thành: $ hhvm -vEval.DumpBytecode = 1 /tmp/hello-world.php Pseudo-chính tại 0 maxStackCells: 1 numLocals: 0 numIterators: 0 / / line 2 0: String "Hello World n" 5: In 6: PopC 7: Int 1 16: RetC Pseudo-chính tại 0 maxStackCells: 1 numLocals: 0 numIterators: 0 Nếu bạn đang tự hỏi về Int 1 / RetC lúc kết thúc, đó là tiềm ẩn "return 1;" mà đi kèm ở cuối của mỗi tập tin (mà không trả lại một cái gì đó một cách rõ ràng) để bao gồm biểu có giá trị trả. Hãy nhớ rằng, các "phạm vi toàn cầu" hoạt động như một hàm không tên mà được gọi ngầm khi khởi động, và chia sẻ phạm vi biến của nó với tất cả các chức năng psuedo-chính cấp cao khác. Lựa chọn thứ hai là gần như giống hệt nhau trong invocation, nhưng sản lượng sản xuất đáng chú ý khác: $ hhvm -vEval.DumpHhas = 1 /tmp/hello.php .filepath "/tmp/hello.php"; .main { String "Hello World n" In PopC Int 1 RetC } Điều này thực sự là ngôn ngữ thứ ba của HHVM (PHP và Hack là lần đầu tiên hai), HipHop hội. Ngôn ngữ này ẩn, mà thường chỉ được công nhận trong các tập tin Systemlib, cho phép các nhà phát triển để vượt qua hai bước đầu tiên của việc biên dịch và tạo ra bytecode liệu. Bạn có thể tìm thấy một ví dụ hiện điều này (hphp / hệ thống / php / array_map.hhas) trong việc thực hiện array_map () nơi HHVM sử dụng một bytecode tùy chỉnh thiết kế rõ ràng để thực hiện các chức năng hiệu quả hơn. Để biết thêm về ý nghĩa và mục đích sử dụng của tất cả các của HHVM bytecode, xem hphp / doc / bytecode.specification. Lưu ý: Bạn không nên phát triển các ứng dụng hoặc các thư viện trong HHAS. Cú pháp của HHAS và hành vi của bytecode cụ thể không được đảm bảo giữa các phiên bản của HHVM và hầu như không bao giờ bất kỳ lợi ích để có được qua viết kịch bản trong PHP bình thường. Phạm vi bảo hiểm trong bài viết này là có nghĩa là cho mục đích thông tin. Bước 3.5: HHBBC Optimization Các tối ưu, chúng tôi thực hiện trong bước 2.5 đã nhanh chóng, mọi thứ rõ ràng tốt đẹp chúng tôi có thể lắc ra ngoài trong quá trình bình thường của on-the-fly đang biên soạn, nhưng chúng lại không phải là cải tiến duy nhất chúng ta có thể làm. Khi xây dựng trong chế độ RepoAuthoritative, nó có thể nhìn vào chương trình một chút sâu hơn và cắt ra, ngay cả việc không cần thiết nữa. Hãy xem xét kịch bản này: define ('FOO "," Hello World n "); vang FOO; $ x = 1 + 2; if ($ x == 3) { echo "X là ba n"; } else { vang "X không phải là ba n"; } Một lần nữa, một con người có thể nhìn vào điều này và biết rằng một phiên bản đơn giản hóa của kịch bản này có thể giảm rất nhiều, nhưng theo dõi các trạng thái đó là quá phức tạp cho các trình biên dịch đầu tiên vượt qua để làm. Vì vậy, chúng ta thấy bytecode tìm kiếm như thế này: $ hhvm -vEval.DumpBytecode = 1 /tmp/three.php // dòng 3 0: String "Hello World n" 5: DefCns "FOO" 10: PopC // dòng 4 11: thần kinh trung ương "FOO" 16: In 17: PopC // dòng 6 18: Int 3 27: SETL 0 29: PopC // dòng 7 30: Int 3 39: CGetL2 0 41: Eq 42: JmpZ 17 (59) // dòng 8 47: String "X là ba n" 52:










































































































































































































đang được dịch, vui lòng đợi..
 
Các ngôn ngữ khác
Hỗ trợ công cụ dịch thuật: Albania, Amharic, Anh, Armenia, Azerbaijan, Ba Lan, Ba Tư, Bantu, Basque, Belarus, Bengal, Bosnia, Bulgaria, Bồ Đào Nha, Catalan, Cebuano, Chichewa, Corsi, Creole (Haiti), Croatia, Do Thái, Estonia, Filipino, Frisia, Gael Scotland, Galicia, George, Gujarat, Hausa, Hawaii, Hindi, Hmong, Hungary, Hy Lạp, Hà Lan, Hà Lan (Nam Phi), Hàn, Iceland, Igbo, Ireland, Java, Kannada, Kazakh, Khmer, Kinyarwanda, Klingon, Kurd, Kyrgyz, Latinh, Latvia, Litva, Luxembourg, Lào, Macedonia, Malagasy, Malayalam, Malta, Maori, Marathi, Myanmar, Mã Lai, Mông Cổ, Na Uy, Nepal, Nga, Nhật, Odia (Oriya), Pashto, Pháp, Phát hiện ngôn ngữ, Phần Lan, Punjab, Quốc tế ngữ, Rumani, Samoa, Serbia, Sesotho, Shona, Sindhi, Sinhala, Slovak, Slovenia, Somali, Sunda, Swahili, Séc, Tajik, Tamil, Tatar, Telugu, Thái, Thổ Nhĩ Kỳ, Thụy Điển, Tiếng Indonesia, Tiếng Ý, Trung, Trung (Phồn thể), Turkmen, Tây Ban Nha, Ukraina, Urdu, Uyghur, Uzbek, Việt, Xứ Wales, Yiddish, Yoruba, Zulu, Đan Mạch, Đức, Ả Rập, dịch ngôn ngữ.

Copyright ©2024 I Love Translation. All reserved.

E-mail: