Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi

54 13 0
Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Mai Thanh Minh XÂY DỰNG NGƠN NGỮ LẬP TRÌNH VÀ TRÌNH BIÊN DỊCH CHO MÁY ẢO XỬ LÝ DỮ LIỆU TRONG TẬP TIN LƯU TRỮ LUẬN VĂN THẠC SĨ Ngành: Công nghệ thông tin HÀ NỘI - 2021 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Mai Thanh Minh XÂY DỰNG NGƠN NGỮ LẬP TRÌNH VÀ TRÌNH BIÊN DỊCH CHO MÁY ẢO XỬ LÝ DỮ LIỆU TRONG TẬP TIN LƯU TRỮ LUẬN VĂN THẠC SĨ Ngành: Công nghệ thông tin Cán hướng dẫn: TS Võ Đình Hiếu HÀ NỘI - 2021 VIETNAM NATIONAL UNIVERSITY, HA NOI UNIVERSITY OF ENGINEERING AND TECHNOLOGY Mai Thanh Minh BOX: PROGRAMMING LANGUAGE FOR FORWARD–COMPATIBLE ARCHIVE FORMAT MASTER’S THESIS Major: Software Engineering Supervisor: Dr Vo Dinh Hieu HANOI - 2021 LỜI CẢM ƠN Đầu tiên, xin gửi lời cảm ơn chân thành sâu sắc tới thầy giáo TS Võ Đình Hiếu – người trực tiếp hướng dẫn tận tình đóng góp ý kiến q báu suốt q trình học tập, nghiên cứu tơi q trình tơi thực luận văn tốt nghiệp này, người cho nhiều lời động viên, kiến thức quý báu giúp trưởng thành sống Tôi xin gửi lời cảm ơn tới người bạn tập thể lớp – người đồng hành suốt bốn năm qua nẻo đường, giúp đỡ khó khăn, chia sẻ tơi chuyện học tập sống góp ý cho tơi lời khuyên chân thành giúp học tập tốt hồn thành khóa luận Tiếp theo tơi xin gửi lời cảm ơn đến thầy cô giảng viên Trường Đại học Công Nghệ - Đại Học Quốc Gia Hà Nội – người tận tâm truyền đạt kiến thức quý báu làm tảng để tiếp tục xa lĩnh vực công nghệ thông tin Tôi xin cảm ơn cha mẹ, anh chị người thân, người không quản khó khăn, vất vả ni ăn học để phấn đấu trở thành người có ích cho xã hội Tôi xin cảm ơn hỗ trợ từ đề tài CN21.01 Trường Đại học Công Nghệ - Đại Học Quốc Gia Hà Nội giúp tơi hồn thành luận văn i LỜI CAM ĐOAN Tôi xin cam đoan nghiên cứu ngôn ngữ cho máy ảo phục vụ xử lý liệu tập tin lưu trữ trình bày luận văn chưa nộp báo cáo luận văn trường Đại học Công Nghệ – Đại học quốc gia Hà Nội trường đại học khác Những tơi viết không chép từ tài liệu, không sử dụng kết người khác mà khơng trích dẫn cụ thể Tôi xin cam đoan công cụ trình bày luận văn tơi tự phát triển, không chép mã nguồn người khác Nếu sai tơi hồn tồn chịu trách nhiệm theo quy định trường Đại Học Công Nghệ - Đại Học Quốc Gia Hà Nội Hà Nội, ngày 24 tháng 12 năm 2021 Học viên Mai Thanh Minh ii Mục lục Danh sách bảng v Danh sách hình vẽ v Danh sách mã nguồn vi Chương Đặt vấn đề Chương Kiến thức sở 2.1 2.2 2.3 Một số tập tin lưu trữ phổ biến 2.1.1 ZIP 2.1.2 TAR 2.1.3 RAR 2.1.4 7z Các thuật toán xử lý liệu tập tin lưu trữ 10 2.2.1 Các thuật toán nén liệu 11 2.2.2 Các thuật tốn mã hóa liệu 12 2.2.3 Các thuật toán phát sửa lỗi liệu 13 Máy ảo thực thi 14 Chương Ngôn ngữ lập trình 3.1 Xây dựng yêu cầu ràng buộc thiết kế ngơn ngữ lập trình 3.1.1 Sự cần thiết yêu cầu định dạng iii 16 16 16 3.1.2 Yêu cầu định dạng ràng buộc liên quan ngơn ngữ lập trình đính kèm 18 Lựa chọn ngơn ngữ lập trình đính kèm 20 3.2 Ký pháp mô tả ngữ pháp ngôn ngữ 20 3.3 Các thành phần ngơn ngữ lập trình Box 21 3.4 Các kiểu liệu ngôn ngữ lập trình Box 23 3.5 Biểu thức ngôn ngữ lập trình Box 25 3.5.1 Các biểu thức 26 3.5.2 Các biểu thức số học đại số 28 3.5.3 Các biểu thức bit 29 3.5.4 Các biểu thức so sánh logic 29 3.6 Các định nghĩa ngơn ngữ lập trình Box 31 3.7 Các câu lệnh ngơn ngữ lập trình Box 32 3.1.3 Chương 4.1 Công cụ thử nghiệm Cài đặt trình biên dịch 4.2 Thử nghiệm ngơn ngữ sử dụng trình biên dịch 4.3 36 36 38 Ưu điểm nhược điểm ngôn ngữ Box 42 Chương Kết luận 43 Tài liệu tham khảo 44 iv Danh sách bảng 3.1 Giới hạn kiểu liệu 24 Danh sách hình vẽ 2.1 Cấu trúc tập tin ZIP 2.2 Cấu trúc tập tin TAR 3.1 Tương thích ngược tương thích xi 18 4.1 37 Giao diện dòng lệnh trình biên dịch v Danh sách mã nguồn 4.1 Mã nguồn ANTLR mô tả cú pháp định nghĩa Box 38 4.2 Mã nguồn Box hàm đệ quy tính tốn số Fibonacci 40 4.3 Mã nguồn Java hàm đệ quy tính tốn số Fibonacci 40 4.4 Mã nguồn Box hàm tính số Fibonacci sử dụng vịng lặp 40 4.5 Mã nguồn Java hàm tính số Fibonacci sử dụng vòng lặp 40 4.6 Mã nguồn Box hàm xếp nhanh 41 4.7 Mã nguồn Java hàm xếp nhanh 41 4.8 Mã nguồn Box hàm đánh mã số học nhị phân 42 4.9 Mã nguồn Java hàm đánh mã số học nhị phân 42 vi Chương Đặt vấn đề Trong thời đại kỹ thuật số, liệu nguồn tài nguyên vô quan trọng Việc lưu trữ vận chuyển liệu cách hiệu tối đa hóa khả khai thác nguồn tài ngun Một cơng cụ hỗ trợ đắc lực cho việc lưu trữ vận chuyển liệu tập tin lưu trữ Tập tin lưu trữ lớp định dạng tập tin thiết kế với khả đóng gói nhiều tập tin thông tin mô tả chúng thành tập tin lưu trữ nhất, nén, mã hố bổ sung thơng tin khơi phục cần thiết trường hợp tập tin lưu trữ không cịn tồn vẹn Việc sử dụng tập tin lưu trữ làm giảm dung lượng tập tin cần lưu trữ truyền tải đảm bảo tính bảo mật tính tồn vẹn thơng tin q trình lưu trữ truyền tải Có nhiều định dạng tập tin lưu trữ khác thiết kế, thực tế có số định dạng dùng phổ biến ZIP[6, 7], TAR[9], RAR[10, 11] 7z[12] Việc sinh nhiều định dạng lưu trữ khác gây khó khăn trình chia sẻ thơng tin, việc chia sẻ tập tin qua internet trở nên dễ dàng hơn, nhu cầu chia sẻ thông tin làm việc cao Nguyên nhân dẫn đến việc phát sinh định dạng thường định dạng sẵn có khơng hỗ trợ cho hệ điều hành hệ thông lưu trữ tập tin khác nhau, định dạng thiếu tính cần thiết mã hố hay sửa lỗi, định dạng không cập nhật hỗ trợ thuật tốn nén, mã hóa sửa lỗi tốt Để định dạng tập tin lưu trữ thay định dạng tập tin 3.6 Các định nghĩa ngôn ngữ lập trình Box memberDefinition ::= type MemberIdentifier tupleDefinition ::= TupleIdentifier ‘(’ ( memberDefinition ( ‘,’ memberDefinition )* )? ‘)’ ‘;’ Quy tắc tupleDefinition biểu diễn định nghĩa cho kiểu ghi mới, quy tắc memberDefinition biểu diễn định nghĩa thành phần kiểu ghi Một ghi có nhiều thành phần con, khơng có thành phần Các thành phần kiểu nào, kể kiểu ghi mà chứa variableDefinition ::= type VariableIdentifier ( ‘=’ expression )? ‘;’ Quy tắc variableDefinition biểu diễn định nghĩa cho biến Biến khởi tạo cách đưa vào biểu thức khởi tạo, giá trị biểu thức gán cho biến parameterDefinition ::= type ParameterIdentifier functionDefinition ::= type FunctionIdentifier ‘(’ ( parameterDefinition ( ‘,’ parameterDefinition )* )? ‘)’ blockStatement Quy tắc functionDefinition biểu diễn định nghĩa cho hàm mới, quy tắc parameterDefinition biểu diễn định nghĩa tham số hàm Một hàm có nhiều tham số, khơng có tham số Kiểu trả hàm ngồi kiểu thơng thường cịn có kiểu void để hàm khơng có kết trả Thân hàm câu lệnh thân hàm làm rõ phần sau 31 globalDefinition ::= tupleDefinition | variableDefinition | functionDefinition Quy tắc globalDefinition quy tắc biểu diễn định nghĩa tồn cục Chỉ có ba định nghĩa khai báo tồn cục, định nghĩa ghi, định nghĩa hàm định nghĩa biến labelDefinition ::= LabelIdentifier loopStatement Quy tắc labelDefinition biểu diễn định nghĩa cho nhãn Một nhãn đại diện cho vòng lặp định nghĩa sau Đây định nghĩa đặc biệt chúng sử dụng thân hàm đứng trước vòng lặp 3.7 Các câu lệnh ngơn ngữ lập trình Box statement ::= variableDefinition | labelDefinition | singleStatement singleStatement ::= functionCallStatement | returnStatement | breakStatement | continueStatement 10 | loopStatement 11 | assignmentStatement 12 | blockStatement 13 | ifStatement 14 blockStatement ::= ‘{’ ( ‘;’ | statement )* ‘}’ Quy tắc statement biểu diễn câu lệnh ngơn ngữ lập trình Một câu lệnh câu lệnh đơn, định nghĩa biến định 32 nghĩa nhãn Quy tắc singleStatement biểu diễn câu lệnh đơn Quy tắc blockStatement biểu diễn câu lệnh khối, kết hợp câu lệnh tạo thành khối Một câu lệnh xuất thân hàm functionCallStatement ::= functionCallExpression ‘;’ Quy tắc functionCallStatement biểu diễn câu lệnh gọi hàm Kết trả hàm gọi, có, bị bỏ qua returnStatement ::= ‘return’ expression? ‘;’ Quy tắc returnStatement biểu diễn câu lệnh thoát hàm trả kết Với hàm không trả kết quả, câu lệnh không nhận biểu thức truyền vào breakStatement ::= ‘break’ LabelIdentifier? ‘;’ continueStatement ::= ‘continue’ LabelIdentifier? ‘;’ loopStatement ::= ‘loop’ ( ‘;’ | singleStatement ) Quy tắc loopStatement biểu diễn câu lệnh lặp, quy tắc breakStatement continueStatement sử dụng để điều khiển luồng hoạt động vịng lặp Quy tắc breakStatement biểu diễn câu lệnh khỏi vịng lặp, quy tắccontinueStatement biểu diễn câu lệnh nhảy đầu vòng lặp Cả hai câu lệnh điều khiển luồng vòng lặp định thêm nhãn, đó, thay thực thi điều khiển luồng vịng lặp tại, chúng nhảy đầu thoát vịng lặp định nhãn Nhãn truyền vào phải đảm bảo vòng lặp mà hai câu lệnh điều khiển nằm bên ifSingleCase ::= ‘if’ ‘(’ expression ‘)’ ( ‘;’ | singleStatement ) ifStatement ::= ifSingleCase ( ‘else’ ifSingleCase )* ( ‘else’ ( ‘;’ | singleStatement ) )? Quy tắc ifStatement biểu diễn câu lệnh điều kiện Một câu lệnh điều kiện có nhiều nhánh khác nhau, tối đa nhánh thực thi 33 Ngoại trừ nhánh cuối cùng, nhánh có biểu thức điều kiện để kiểm tra xem nhánh có thực thi hay khơng Biểu thức điều kiện biểu thức trả kiểu bool Do việc kiểm tra thực thi thực từ xuống, nhánh phía trước thực thi, biểu thức điều kiện câu lệnh nhánh sau bị bỏ qua Nhánh vô điều kiện cuối cùng, có, thực thi tất điều kiện phía trước sai Quy tắc ifSingleCase quy tắc bổ trợ cho quy tắc biểu diễn câu lệnh điều kiện assignmentOperator ::= ‘=’ | ‘:=’ | ‘*=’ | ‘/=’ | ‘+=’ | ‘-=’ | ‘=’ | ‘&=’ | ‘&&=’ | ‘^^=’ | ‘||=’ | ‘^=’ | ‘%=’ | ‘|=’ assignmentStatement ::= assignableExpression assignmentOperator expression ‘;’ Quy tắc assignmentStatement biểu diễn câu lệnh gán Có nhiều dạng câu lệnh gán khác với chức khác Câu lệnh gán ‘=’ gán giá trị biểu thức vế phải cho biến vế trái Câu lệnh gán chép ‘:=’ sử dụng để chép nông mảng ghi Các câu lệnh gán có chứa tốn tử thực thi với biểu thức vế trái biểu thức vế phải, sau gán giá trị nhận cho biến vế trái Ví dụ, lệnh x *= y tương đương với x = x * y compilationUnit ::= ( ‘;’ | globalDefinition )* EOF Quy tắc compilationUnit biểu diễn toàn tập tin mã nguồn Một tập tin mã nguồn bao gồm danh sách khai báo toàn cục hết tập tin 34 Tiểu kết Chương Chương luận văn trình bày u cầu mơ tả ngôn ngữ đề xuất, bao gồm mô tả thành phần bản, kiểu liệu, biểu thức, định nghĩa câu lệnh ngôn ngữ Trong chương tiếp theo, luận văn xây dựng trình biên dịch thử nghiệm cho ngôn ngữ đề xuất 35 Chương Công cụ thử nghiệm Ở chương này, luận văn trình bày kiến trúc cài đặt trình biên dịch cho ngôn ngữ mới, triển khai mô tả ngôn ngữ nêu Chương Cùng với đó, chương đưa so sánh ngơn ngữ với ngơn ngữ lập trình thơng dụng khác để ưu điểm nhược điểm ngơn ngữ mục tiêu giải tốn ban đầu 4.1 Cài đặt trình biên dịch Để thử nghiệm tính khả dụng ngơn ngữ lập trình cho mục đích mơ tả cài đặt thuật toán sử dụng tập tin lưu trữ, cần phải xem xét mức độ phù hợp ngôn ngữ cho mục đích đề Điều thực thơng qua việc cài đặt trình biên dịch có khả dịch ngơn ngữ đề xuất sang ngơn ngữ bậc cao khác, từ so sánh làm bật ưu nhược điểm ngơn ngữ q trình cài đặt thuật toán xử lý liệu thường gặp tập tin lưu trữ nén hay mã hóa Trong luận văn này, trình biên dịch thử nghiệm xây dựng sử dụng ngôn ngữ Java chạy tảng Java Core phiên 11 Trình biên dịch nhận ngôn ngữ đầu vào ngôn ngữ lập trình đề xuất tiến hành phân tích từ vựng, cú pháp ngữ nghĩa mã nguồn đầu vào, sau xuất mã nguồn chương trình Java tương ứng Một giao diện dịng lệnh đơn giản tạo giúp trình sử dụng thử nghiệm công cụ thuận tiện 36 Ví dụ cách sử dụng giao diện dịng lệnh thể Hình 4.1 Để tạo phân tích ngữ pháp cho ngơn ngữ, thư viện ANTLR1 phiên sử dụng nhờ vào khả tạo trình phân tích ngữ pháp mạnh mẽ linh hoạt Mô tả ngữ pháp ngôn ngữ viết ngôn ngữ mô tả cú pháp riêng ANTLR, ngôn ngữ thiết kế dựa EBNF bổ sung thêm tính hữu dụng khác nhằm làm cho ngôn ngữ thuận tiện Ví dụ đoạn mã nguồn mơ tả cú pháp định nghĩa trích dẫn từ mã nguồn trình biên dịch xây dựng quan sát Mã nguồn 4.1 Mã nguồn tồn trình biên dịch xem https://github.com/thanhminhmr/box-lang Hình 4.1: Giao diện dịng lệnh trình biên dịch https://www.antlr.org/ 37 Mã nguồn 4.1: Mã nguồn ANTLR mô tả cú pháp định nghĩa Box memberDefinition: type MemberIdentifier; tupleDefinition: TupleIdentifier ’(’ ( memberDefinition (’,’ memberDefinition)* )? ’)’ ’;’; variableDefinition: type VariableIdentifier (’=’ expression)? ’;’; 10 11 parameterDefinition: type ParameterIdentifier; 12 13 functionDefinition: 14 type FunctionIdentifier ’(’ ( 15 parameterDefinition (’,’ parameterDefinition)* 16 )? ’)’ blockStatement; 17 18 globalDefinition: 19 tupleDefinition 20 | variableDefinition 21 | functionDefinition; 22 23 labelDefinition: LabelIdentifier loopStatement; 4.2 Thử nghiệm ngôn ngữ sử dụng trình biên dịch Để thử nghiệm ngơn ngữ Box, vài ví dụ đoạn chương trình nhỏ viết ngơn ngữ Box biên dịch trình biên dịch thử nghiệm, kết thu loạt cặp mã nguồn Box mã nguồn Java tương ứng với cấu trúc phương thức cài đặt thuật toán Các cặp mã nguồn sử dụng để so sánh điểm khác biệt mặt ngôn ngữ Box Java, qua nêu lên ưu điểm nhược điểm ngôn ngữ Box so với Java ngơn ngữ hệ C nói chung 38 Trong điều kiện thơng thường, ngơn ngữ đề xuất khơng có nhiều khác biệt với ngôn ngữ hệ C phổ biến C Java Có thể thấy điều qua ví dụ mã nguồn ngơn ngữ Mã nguồn 4.2 mã nguồn Java trình biên dịch xuất Mã nguồn 4.3 Một điểm khác biệt ngôn ngữ so với C Java số có kiểu (như 0i 1i , điều khiến cho việc lập trình ngơn ngữ khó khăn ảnh hưởng từ thói quen lập trình viên Nhược điểm khắc phục mơi trường lập trình tích hợp với cơng cụ soạn thảo mã nguồn thơng minh lỗi quên kiểu số lúc soạn thảo mã nguồn Với ví dụ cặp Mã nguồn 4.4 Mã nguồn 4.5, thấy, thay sử dụng vịng lặp có điều kiện (for while), ngơn ngữ sử dụng vịng lặp vơ điều kiện kết hợp với câu lệnh rẽ nhánh câu lệnh điều khiển để tạo vịng lặp có điều kiện Điều cho phép việc điều khiển vòng lặp cách cụ thể hơn, cho phép lập trình viên tối ưu hiệu thực thi mà ảnh hưởng đến khả tối ưu hóa tự động trình biên dịch Mặt khác, nhược điểm ngôn ngữ việc làm mã nguồn dài dịng nhiều có ảnh hưởng đến dễ hiểu mã nguồn Với ví dụ cặp Mã nguồn 4.6 Mã nguồn 4.7 mảng quản lý nhớ, ngôn ngữ sử dụng hệ thống quản lý nhớ tự thu dọn tương tự Java Việc sử dụng tham chiếu cho mảng ghi giảm thiểu phụ thuộc vào môi trường thực thi giảm thiểu độ phức tạp cho mã nguồn ngơn ngữ Ngồi ra, ngơn ngữ có khả chép mảng làm phép tính toàn mảng cho khả tối ưu tốt vi xử lý hỗ trợ đơn lệnh đa liệu (SIMD) Với ví dụ cặp Mã nguồn 4.8 Mã nguồn 4.9 tính tốn, ngơn ngữ sử dụng quản lý kiểu chặt, điều không cho phép hai tốn tử có kiểu khác tham gia vào phép tính (trừ số ngoại lệ phép dịch bit) Ngoài ra, quy tắc ngữ pháp ngôn ngữ yêu cầu chuỗi biểu thức khơng thể có phép tốn bit phép toán số học đại số, điều bắt buộc lập trình viên phải sử dụng cặp dấu ngoặc đơn để ngăn cách phép toán 39 Mã nguồn 4.2: Mã nguồn Box hàm Mã nguồn 4.3: Mã nguồn Java hàm đệ quy tính tốn số Fibonacci đệ quy tính tốn số Fibonacci 10 11 12 13 14 15 u32 _fibonacci(u32 $index) { return $index == 0i ? 0i : $index == 1i ? 1i : _fibonacci($index - 1i) + _fibonacci($index - 2i); } u32 _fibonacci2(u32 $index) { if ($index == 0i) return 0i; if ($index == 1i) return 1i; return _fibonacci2($index - 1i) + _fibonacci2($index - 2i); } 10 11 12 13 14 15 int _fibonacci(int index) { return (index == 0) ? : ((index == 1) ? : (_fibonacci(index - 1) + _fibonacci(index - 2))); } int _fibonacci2(int index) { if (index == 0) return 0; if (index == 1) return 1; return _fibonacci2(index - 1) + _fibonacci2(index - 2); } Mã nguồn 4.4: Mã nguồn Box hàm Mã nguồn 4.5: Mã nguồn Java hàm tính số Fibonacci sử dụng vịng lặp tính số Fibonacci sử dụng vịng lặp u32 _fibonacciLoop(u32 $index) { if ($index == 0i) return 0i; if ($index == 1i) return 1i; u32 i = 1i; u32 a = 0i; u32 b = 1i; loop { u32 c = a + b; a = b; 10 b = c; 11 i += 1i; 12 if (i == $index) return b; 13 } 14 } int _fibonacciLoop(int index) { if (index == 0) return 0; if (index == 1) return 1; int i = 1; int a = 0; int b = 1; while (true) { int c = a + b; a = b; 10 b = c; 11 i += 1; 12 if (i == index) return b; 13 } 14 } 40 Mã nguồn 4.6: Mã nguồn Box hàm Mã nguồn 4.7: Mã nguồn Java hàm xếp nhanh xếp nhanh u64[] _sort(u64[] $A, u32 $length) { u64[] clonedArray = u64:[$length]; clonedArray := $A; _quickSort(clonedArray, 0i, $length - 1i); return clonedArray; } void _quickSort(u64[] $A, u32 $m, u32 $n) { if ($m >= $n) return; u32 p = _partition($A, $m, $n); 10 _quickSort($A, $m, p - 1i); 11 _quickSort($A, p, $n); 12 } 13 u32 _partition(u64[] $A, u32 $m, u32 $n) { 14 u64 p = $A[$n]; 15 u32 i = $m - 1i; 16 u32 j = $n; 17 loop { 18 if ($A[j] $n) break; 26 } 27 u64 t = $A[i]; 28 $A[i] = $A[$n]; 29 $A[$n] = t; 30 return i; 31 } long[] _sort(long[] A, int length) { long[] clonedArray = new long[length]; clonedArray = A.clone(); _quickSort(clonedArray, 0, length - 1); return clonedArray; } void _quickSort(long[] A, int m, int n) { if (m >= n) return; int p = _partition(A, m, n); 10 _quickSort(A, m, p - 1); 11 _quickSort(A, p, n); 12 } 13 int _partition(long[] A, int m, int n) { 14 long p = A[n]; 15 int i = m - 1; 16 int j = n; 17 while (true) { 18 if (A[j] n) break; 26 } 27 long t = A[i]; 28 A[i] = A[n]; 29 A[n] = t; 30 return i; 31 } 41 Mã nguồn 4.8: Mã nguồn Box hàm Mã nguồn 4.9: Mã nguồn Java hàm đánh mã số học nhị phân đánh mã số học nhị phân Encoder( u32 lo, u32 hi, StateMap sm ); void _e_code(Encoder $e, StateMap $sm, u32 $cxt, bool $y) { i32 p = _sm_p($sm, $cxt); u32 mid = $e.lo + (($e.hi - $e.lo) >> 12i) * p; 10 if ($y) $e.hi = mid; 11 else $e.lo = mid + 1i; 12 _sm_update($sm, $cxt, $y); 13 loop { 14 if ((($e.lo ^ $e.hi) & 0xFF000000i) != 0i) break; 15 _writeByte(u8($e.hi >> 24i)); 16 $e.lo > 24)); 16 e.lo

Ngày đăng: 27/06/2022, 11:35

Hình ảnh liên quan

Hình 2.1: Cấu trúc tập tin ZIP - Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi

Hình 2.1.

Cấu trúc tập tin ZIP Xem tại trang 14 của tài liệu.
Hình 2.2: Cấu trúc tập tin TAR - Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi

Hình 2.2.

Cấu trúc tập tin TAR Xem tại trang 16 của tài liệu.
Hình 3.1: Tương thích ngược và tương thích xuôi - Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi

Hình 3.1.

Tương thích ngược và tương thích xuôi Xem tại trang 27 của tài liệu.
Bảng 3.1: Giới hạn của các kiểu dữ liệu cơ bản - Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi

Bảng 3.1.

Giới hạn của các kiểu dữ liệu cơ bản Xem tại trang 33 của tài liệu.
hơn. Ví dụ về cách sử dụng giao diện dòng lệnh này được thể hiện trong Hình 4.1. - Phân tích mã nguồn c++ phục vụ đánh giá ảnh hưởng của sự thay đổi

h.

ơn. Ví dụ về cách sử dụng giao diện dòng lệnh này được thể hiện trong Hình 4.1 Xem tại trang 46 của tài liệu.

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan