Ngôn ngữ máy là. A. Bất cứ ngôn ngữ lập trình nào mà có thể diễn đạt thuật toán để giao cho máy tính thực hiện. B. Ngôn ngữ để viết các chương trình mà mỗi chương trình là một dãy lệnh máy trong hệ nhị phân. C. Các ngôn ngữ mà chương trình viết trên chúng sau khi D. Tạm dùng chương trinh Câu 17: Từ khóa dùng để khai báo hằng trong ngôn ngữ lập trình Pascal là: A. Const B. Var C. Real D. End Câu 40: Cấu trúc chung hợp lý của một chương trình Pascal là: A. Begin -> Program -> End. B. Program -> End -> Begin. C. End -> Program -> Begin. 1NGUYấN Lí NGễN NGỮ LẬP TRèNH Giảng viờn: Nguyễn Văn Hũa Khoa KT-CN-MT - ðH An Giang 2Thụng tin cần thiết ðịa chỉ email: nvhoa@agu.edu.vn Chỉ liờn lạc qua ủiện thoại nếu thật cần thiết Tài liệu của mụn học: Qui ủịnh trong lớp: 3Mục tiờu của mụn họ Tóm tắt Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 7: Ngôn ngữ lập trình hàm - Nguyễn Văn Hòa: một phộp toỏn ỏp dụng hàm và cỏc cấu trỳc lưu trữ dữ liệu Ngụn ngữ hàm ủược thiết kế tốt là LISP 17 NN biờn dịch vs NN thụng dịch 18 LISP: giới thiệu éược John McCarthy ủề xuất vào năm 1958 Trỡnh Cấu trúᴄ môn họᴄ Lập trình C ᴄơ bản ѕẽ gồm 4 phần, đó là: - Giới thiệu ᴠề lập trình ᴠà ngôn ngữ lập trình C. - Cú pháp ᴄơ bản. - Quản lý bộ nhớ ᴠà dữ liệu. - Pуthon ᴄho Khoa họᴄ dữ liệu. Cáᴄ bài họᴄ ѕẽ tập trung những nội dung quan trọng cash. Kho Tài Liệu Toán Toán THCS ĐH Bách Khoa HCM ĐH Bách Khoa HN ĐH Khoa Học Tự Nhiên HCM ĐH Kinh Tế - ĐHQG Hà Nội Đại Học Ngoại Thương Đại Học Kinh Tế Quốc Dân HV Công Nghệ BCVT Việc làm/thực tập Bộ sưu tập Bài viết Ủng hộ admin Giáo trình Nguyên Lý Ngôn Ngữ Lập Trình Chia sẻ Xem dạng ảnh Bài 1. Xong1. *Tại sao nói C tỏ ra thích hợp với lập trình hệ thống, có tính tương thích cao, tốc độ cao, nhưng hệthống kiểu không chặt chẽ và khó kiểm soát chương trình lời C là ngôn ngữ lập trình có cấu trúc. Nhưng nói chặt chẽ về mặt kỹ thuật thì C không phải làngôn ngữ lập trình có câu trúc chính cống vì trong C không cho phép các khối giống nhau chẳng hạnbạn không thể khai báo hàm này trong hàm khác.C là ngôn ngữ cấp trung vì nó cho phép thao tác trên các bit, byte, và địa chỉ. C kết hợp các yếu tố mềmdẻo của ngôn ngữ bậc cao và khả năng điều khiển mạnh của ASSEMBLER. Do vậy, C tỏ ra thích hợpvới lập trình hệ đặc điểm nổi bật của C là C có tính tương thích cao. Chương trình viết bằng C cho một loại máyhoặc hệ điều hành này có thể chuyển dễ dàng sang loại máy hoặc hệ điều hành thể nạp nhanh vàtương thích cho các loại chip vi xử lý Hiện nay hầu hết các loại máy tính đều có trình biên dịch chương trình được viết bằng ngôn ngữ lập trình C sẽ tối tối ưu, chạy với tốc độ cao và tiết kiệm ngữ lập trình C có tính mềm dẻo rất cao từ cach khai báo biến có thể trùng lặp trinh cũng mộtchương trình do C có con trỏ nên có thể can thiệp sâu vào các hệ điều hành, các phân vùng dữ liệu quantrọng. do C có tính mềm dẻo như trên lên C cũng có nhược điểm của nó. Khi chạy những chương trìnhlớn cần các thuật toán phức vậy, ngôn ngữ lập trình C chỉ thích hợp với những chương trình hệ thống hoặc những chương trìnhđòi hỏi tốc độ. Còn với những bài toán lớn và phức tạp thì cũng như PASCAL, C rất khó kiểm soátchương *Tại sao nói C++ không phải hướng đối tượng hoàn toàn, mà là đa hướng và C++ là ngôn ngữthích hợp cho việc xây dựng những chương trình lớn nhưng phức tạp và khó kiểm lời C++ không phải là ngôn ngữ hướng đối tượng hoàn toàn mà là ngôn ngữ "đa hướng". Vì C++hỗ trợ cả lập trình hướng hành động và lập trình hướng đối kết hợp những ý tưởng hay nhất của lập trình có cấu trúc với việc phân chia một bài toán thành cácnhóm nhỏ có quan hệ với nhau, mỗi nhóm con đó là một đối tượng chứa các lệnh và dữ liệu riêng đưa vào các khái niệm hàm ảo, quá tải hàm, quá tải toán tử cho phép tạo ra các kiểu dữ liệu trừutượng, hỗ trợ thừa kế tiêu của C++ là tiếp cận những ý tưởng của phương pháp luận hướng đối tượng và trừu tượng đặc tính của C ++ cho phép người lập trình xây dựng những thư viện phần mềm có chất lượng caophục vụ những đề án là ngôn ngữ thích hợp cho việc xây dựng những chương trình lớn như các hệ soạn thảo, chươngtrình dịch, các hệ quản trị cơ sở dữ liệu, các hệ truyền *Tại sao nói Java là ngôn ngữ hướng đối tượng hoàn toàn, đơn giản, độc lập với cấu trúc máy, dễchuyển mang, an toàn. Lý do chương trình Java chậm, các cách khắc phục để tăng tốc lời Hướng đối tượng trong Java tương tự như C++ nhưng Java là một ngôn ngữ lập trình hướng đốitượng hoàn toàn. Tất cả mọi thứ đề cập đến trong Java đều liên quan đến các đối tượng được định nghĩatrước, thậm chí hàm chính của một chương trình viết bằng Java đó là hàm main cũng phải đặt bêntrong một lớp. Hướng đối tượng trong Java không có tính đa kế thừa multi inheritance như trong C++mà thay vào đó Java đưa ra khái niệm interface để hỗ trợ tính đa kế đơn giản java đơn giản vì, mặc dù dựa trên cơ sở C++ nhưng Sun đã cẩn thận lược bỏ các tính năng khó nhất củaC++ để làm cho ngôn ngữ này dễ sử dụng hơn. Là một ngôn ngữ lập trình hoàn toàn mới, nó buộc phảicó dáng vẻ và sự cảm nhận tương tự như các ngôn ngữ phổ biến hiện hành đồng thời đòi hỏi khoảng thờigian huấn luyện lại tối thiểu và thân thiện hơn với người giản, ngôn ngữ này cũng rất nhỏ - nên nhớ rằng từ đầu nó đã được xây dựng để dùng cho điện tửdân dụng như đầu chạy bằng video và hộp điều khiển từ xa, những thiết bị có không gian lưu trữ rất lập với cấu trúc máy Đây là thuộc tính đặc sắc nhất của Java. Java được tạo ra với tiêu chí "Viếtcode một lần, thực thi khắp nơi" "Write Once, Run Anywhere" WORA. Tính năng biên dịch mộtlần và chạy nhiều nền có thể đạt được nhờ just-in-time compiler JIT, chuyển mã bytecode của Javasang mã máy khi chương trình đang chạy. Chương trình phần mềm viết bằng Java có thể chạy trên mọinền tảng platform khác nhau thông qua một môi trường thực thi với điều kiện có máy ảo java thích hợphỗ trợ nền tảng đó. Môi trường thực thi của Sun Microsystems hiện hỗ trợ Sun Solaris, Linux, Mac OS,FreeBSD, Windows và nhiều hệ thống cài đặt trên các thiết bị di độngDễ chuyển mạng Java được lập ra để hoạt động trên mạng và có các thủ tục để có thể quản lý các giaothức mạng như TCP/IP, FTP và HTTP. Nói cách khác, Java được xây dựng để thực hiện hoàn toàn thíchhợp trên Internet. Chương trình Java thậm chí có thể xâm nhập vào các đối thượng khác thông quaInternet bằng cách sử dụng URL địa chỉ Web để định vị Toàn Khả năng hướng mạng của Java tự động đưa ra yêu cầu về an toàn. Đặc tính an toàn của ngônngữ lập trình này bắt nguồn từ việc nó có những phần hạn chế được cài sẵn nhằm đề phòng các chươngtrình Java thực hiện những chức năng như ghi vào ổ cứng của người dùng hay cho phép virus từ mạnghoặc từ môi trường phân tán thâm nhập do chương trình java chậm Do phải hoạt động thông qua máy tính ảo JVM nên tốc độ thực hiệnứng dụng của Java khá chậm. Điều này lý giải tại sao Java vẫn chưa thực sự được sử dụng như một ngônngữ lập trình chính hiện *Họ các ngôn ngữ dot net có ưu nhược điểm gì có nhiều công cụ hỗ trợ, có dễ dàng tích hợp vớinhau được không, vai trò của CRL như thế nào, có phụ thuộc nền tảng lời Ưu điểm ngôn ngữ lập trình .NETMã nguồn rõ ràng, trong .NET mã nguồn tách biệt với giao diện nhanh hơn PHP?!Visual Studio có thể sinh mã, tiết kiệm thời gian viết thể dùng C, VB hoặc Managed C++.Đi cặp MSSQL, điểm ngôn ngữ lập trình .NETKo thể chạy trên Linux mặc dù đã có thể nhưng thiết nghĩ ứng dụng lớn sẽ có sơ xuất?!Nếu ko có Visual Studio thì khó viết code!Ứng dụng tìm kiếm, tuy nhiên vẫn ko có cơ sở chắc chắn!5. *Bạn cho ví dụ truyền tham số hàm trong setFocustf{var element = eval *Bạn cho ví dụ trả về hàm trong lời gọi hàm trong hamCha{var bCha='Biến của cha';//Khai báo inner-fuctionfunction hamCon{alertbCha; //->'Biến của cha'}//trả về hàm con chứ không gọi hàm conreturn hamCon;}//ham sẽ tham chiếu đến hamCon inner-functionvar ham = hamCha;ham;Bài 2. XongCâu 2 *Một đặc tính là C có khả năng khắc phục lỗi kiểu. Cho ví dụ minh họa. Đây là ưu điểm hay nhượcđiểm của được tạo ra từ các ngôn ngữ không có tương thích ngược với code C đã tồn tại đã ngăn cản cáchạn chế kiểu mạnh. hầu hết lập trình viên C đều coi việc kiểm tra kiểu yếu của nhiều chương trình dịch C làmột nhược điểm. Trên thực tế, một trong những ưu điểm của C++ đối với C là C++ cung cấp việc kiểm trakiểu tốt dù có những đặc điểm nêu trên, nhưng C hiển nhiên đáp ứng yêu cầu là ngôn ngữ cài đặt hệ thống đủhiệu quả để thay thế ngôn ngữ Assembly, cũng khá khái quát và uyển chuyển để thể hiện các thuật toán vàtương tác trong nhiều môi trường khác từng trường hợp mà có thể xét đấy là ưu hay nhược điểm của Ccâu 4. *Bạn cho biết đặc tính của ngôn ngữ lập trình ML. Tại sao nói nó là ngôn ngữ lập trình có thể gọi gần như là ngôn ngữ lập trình hàm với các đặc trưng mệnh lệnh hoặc có thể là ngôn ngữmệnh lệnh hướng hàm số. ML có các đặc trưng hàm linh hoạt, tương tự như LISP, cho phép tạo hàm trên cùnghàng như một phần của biểu thức, hàm số được truyền như đối số cho hàm và trả về như kết quả hàm số. MLcũng được mở rộng song song, làm cho nó phù hợp với việc phát triển các hệ thống song song và có cả mở rộnghướng đối trong những đặc tính quan trọng của ML là hệ thống kiểu của nó được mở rộng từ hệ thống kiểu rấtthành công của Pascal. Không giống như C mà có nhiều kẽ hở, hệ thống kiểu ML là được chứng minh theonghĩa toán học chính biệt, nếu bộ kiểm tra kiểu của ML xác định biểu thức có một kiểu nào đó, thì mọi tính toán của biểuthức sẽ đảm bảo rằng sẽ tạo ra giá trị hợp lệ của kiểu đó. Chẳng hạn, biểu thức có kiểu con trỏ đến xâu’, thì giátrị của biểu thức đó được đảm bảo là con trỏ đến bộ nhớ được cấp phát cho xâu. Nó không thể là con trỏ đuđưa’ đến vị trđược cấp để lưu một giá trị nào khác ngoài 5. *Cho biết khai báo kiểu danh sách trong ML như thế nào. Cho ví dụ hàm trên danh danh sách là một tập hợp có thứ tự các giá trị cùng cách để tạo một danh sách là một chuỗi những giá trị trong những dấu móc sách các số nguyên[1, 2, 3];val it = [1,2,3] int listDanh sách chuỗi- ["just", "a", "test"];val it = ["just","a","test"] string list6*Cho biết khai báo hàm trong ML như thế nào? Sử dụng mẫu ra sao, cho ví có thể được khai báo với từ khóa fun thay cho val. Dạng tổng quát của đầu vào người sử dụng vàđầu ra của chương trình dịch làNó khai báo hàm có tên là identifier. Kiểu đối được xác định bởi dạng và kiểu kết quảđược xác định bởi dạng của .Sau đây là ví dụ Khai báo này gắn giá trị hàm với định danh f. Giá trị của f là một hàm số từ số nguyên vào số hàm đó có thể khai báo bởi khai báo val như sau Bài 3. xong1. *Thế nào là an toàn kiểu. Bạn có thể nói gì về an toàn kiểu của C, C++, ML và toàn kiểuMột ngôn ngữ lập trình là an toàn kiểu nếu không có chương trình nào được cho phép vi phạm sựkhác biệt kiểu của nó. Đôi khi điều này là không rõ ràng hiểu khác biệt kiểu là gì trong một ngôn ngữlập trình cụ thể nào đó. Tuy nhiên, có một số sự khác biệt kiểu mà có ý nghĩa và quan trọng trong tấtcả các ngôn ngữ. Chẳng hạn, hàm có kiểu khác với số nguyên. Như vậy, bất cứ ngôn ngữ nào mà chophép số nguyên được sử dụng như hàm là không an toàn kiểu. Một hành động khác mà chúng ta luônxem xét là lỗi kiểu là truy cập bộ nhớ mà không cấp cho chương *Kiểm tra kiểu thời gian dịch và kiểm tra kiểu thời gian chạy khác nhau như thế nào, ưu nhượcđiểm của chúng. Cho ví dụ minh tra thời gian các ngôn ngữ lập trình có kiểm tra kiểu trong thời gian chạy, chương trình dịch sinh ra mã sao chokhi mã được thực hiện, sẽ kiểm tra để tin tưởng rằng các toán hạng có kiểu đúng điểm của kiểm tra kiểu thời gian chạy là nó bắt được lỗi điểm là thời gian chạy dành cho các kiểm tra tra thời gian dịch. Nhiều ngôn ngữ lập trình hiện đại được thiết kế sao cho có khả năng kiểm tra các biểuthức có tiềm năng lỗi kiểu. Trong các ngôn ngữ này, nói chung là từ chối các chương trình không qua đượckiểm tra kiểu thời gian điểm của kiểm tra kiểu thời gian dịch là nó bắt lỗi sớm hơn so với kiểm tra kiểu thời gian chạy người pháttriển chương trình được cảnh báo về lỗi trước khi chương trình được đưa cho người khác hoặc chuyển giao nhưsản phẩm. Vì kiểm tra kiểu trong thời gian chạy có thể loại bỏ sự cần thiết để kiểm tra một số lỗi trong thời gianchạy, kiểm tra thời gian dịch làm cho nó tạo mã hiệu quả hơn. Chẳng hạn, mã dịch ML là nhanh hơn Lisp từ haiđến bốn lần. Lý do chính tăng tốc độ này là kiểm tra kiểu tĩnh của chương trình ML giảm đáng kể sự cần thiếtphải kiểm tra thời gian thận trọng của Kiểm tra kiểu thời gian dịch. Tính chất của kiểm tra kiểu thời gian dịch là chương trìnhdịch cần thận trọng. Điều đó có nghĩa là kiểm tra kiểu thời gian dịch sẽ tìm mọi câu lệnh và biểu thức mà sinhra lỗi thời gian chạy, nhưng nó cũng đánh dấu các lệnh và biểu thức có lỗi ngay cả nếu chúng không gây ra lỗithời gian chạy. Cụ thể hơn, đa số bộ kiểm tra đề sound và conservative. Bộ kiểm tra được gọi là sound, nếukhông có chương trình nào có lỗi được xem là đúng đắn. Bộ kiểm tra được gọi là conservative, nếu có một sốchương trình không có lỗi vẫn được coi là có lý do cho việc đa số bộ kiểm tra là conservative Đối với mọi ngôn ngữ lập trình Turing - đầy đủ, tập cácchương trình có thể gây ra lỗi thời gian chạy là không giải được. Điều đó suy ra từ tính không giải được của bàitoán dừng. Để xem tại sao, xét đoạn chương trình sauKhông giải được bài toán, biểu thức này có sinh ra lỗi thời gian chạy hay không, vì chỉ có một cách cho biểuthức có lỗi kiểu được tính toán là biểu thức phức tạp mà có thể chạy mãi mãi’ phải dừng. Do đó, việc giảiquyết biểu thức có gây ra lỗi thời gian chạy không’ bao gồm cả việc giải quyết biểu thức phức tạp có thể chạymãi mãi’ có dừng hay tập các chương trình có lỗi thời gian chạy là không giải được, nên không có bộ kiểm tra kiểu thời gian dịchcó thể tìm được lỗi kiểu một cách chính xác. Vì mục đích của kiểm tra kiểu là ngăn chặn lỗi, nên các bộ kiểmtra kiểu của ngôn ngữ có kiểu an toàn là conservative. Sẽ có ích nếu kiểm tra kiểu tìm ra lỗi kiểu, và như hệ quảcủa việc không giải được bài toán dừng’ một số chương trình mà có thể được thực hiện không có lỗi thời gianchạy sẽ không vượt qua được kiểm tra kiểu thời gian dịch3. *ML có thuật toán suy luận kiểu dựa trên cơ sở nào? Cho ví dụ suy luận kiểu của hàm trong MLSuy luận kiểu là quá trình xác định kiểu của biểu thức dựa trên các kiểu đã biết của các ký hiệu xuất hiện trongcác biểu thức đó. Sự khác nhau giữa suy luận kiểu và kiểm tra kiểu thời gian dịch là ở mức độ. Thuật toán kiểmtra kiểu duyệt qua chương trình kiểm tra các kiểu khai báo bởi lập trình viên có phù hợp với các yêu cầu củangôn ngữ không. Trong suy luận kiểu, ý tưởng đưa ra là một số thông tin không cần đặc tả, và một số dạng suydiễn logic sẽ được dùng để xác định kiểu của các biến dựa theo cách chúng được sử dụng. Suy diễn kiểu đượcphát triển bới Robin Milner cho ngôn ngữ lập trình ML. Các ý tưởng tương tự được phát triển độc lập bởi Curryvà Hindley trong khi nghiên cứu tính toán dù các suy diễn kiểu thực tế đã được phát triển cho ML, nhưng suy diễn kiểu có thể được áp dụng cho rấtnhiều ngôn ngữ lập trình. Chẳng hạn, về mặt nguyên tắc suy diễn kiểu có thể áp dụng cho C hoặc cho các ngônngữ khác. Chúng ta tìm hiểu suy diễn kiểu tương đối chi tiết, vì nó thể hiện các vấn đề trọng tâm của kiểm trakiểu và vì suy diễn kiểu cũng thể hiện một số vấn đề quan trọng của thuật toán tìm các kiểu lỗi của vào đó, để cung cấp dạng kiểm tra kiểu thời gian dịch linh hoạt, suy diễn kiểu ML cũng hỗ trợ đa chúng ta đã thấy, khi xem xét kỹ thuật toán suy diễn kiểu, thuật toán này sẽ nhận biết mọi kiểu của cácbiến và xác định chúng cần phải bằng một kiểu chuyên biệt nào đó như int, bool hoặc string. Trong trường hợpkhác, kiểu của một hàm nào đó có thể chứa các biến kiểu mà không ràng buộc theo cách mà hàm được địnhnghĩa. Trong các trường hợp này, hàm đó có thể được áp dụng cho các đối số mà kiểu của chúng sánh với dạngđược cho bởi biểu thức kiểu chứa các biến dù suy diễn kiểu và đa hình là các khái niệm độc lập, chúng ta sẽ bàn về đa hình trong bối cảnh suy diễnkiểu, vì đa hình được nảy sinh một cách tự nhiên theo cách các biến kiểu được sử dụng trong suy diễn kiểu. Vídụ Hàm f1 cộng 2 cho đối số của nó. Trong ML, 2 là hằng nguyên; số thực 2 cần phải viết dạng Phép toán +được tải đè; nó có thể là phép cộng nguyên hoặc phép cộng thực. Trong hàm này, tuy nhiên, phép cộng cầnphải là cộng nguyên, vì 2 là số nguyên. Do đó, đối số của hàm x cần phải là số nguyên. Tập hợp tất cả cácquan sát này, chúng ta nhận được f1 cần phải có kiểu int -> int4. *Nêu cách sử dụng đa hình tham số kiểu trong ML. Cho ví dụ cài đặt swap trong trưng chính của đa hình tham số là tập các kiểu gắn kết với hàm hoặc một giá trị khác được cho trước bởibiểu thức kiểu mà chứa biến kiểu. Chẳng hạn, hàm ML mà sắp xếp các danh sách có thể có kiểu MLDiễn tả bằng lời, sắp xếp có thể áp dụng cho một cặp bất kỳ bao gồm một hàm và một danh sách, hàm có kiểua * a -> bool, trong đó kiểu a cần phải là kiểu của các phần tử của danh sách. Đối số hàm là thao tác nhỏ hơnđược sử dụng để xác định thứ tự trên danh sách được sắp đa hình tham số, hàm có thể có vô hạn kiểu, sẽ có vô hạn cách thay các biến kiểu bằng các biến thực hạn, hàm sắp xếp có thể được dùng để sắp xếp danh sách số nguyên, danh sách các danh sách số nguyênhoặc danh sách các danh sách các danh sách số nguyên, ...Đa hình tham số có thể là ẩn hoặc tường minh. Trong đa hình tham số tường minh, văn bản chương trình chứacác biến kiểu mà xác định cách hàm hoặc các gía trị khác có thể được coi như đa hình. Thêm vào đó, đa hìnhtường minh thường bao gồm việc khởi tạo tường minh hoặc áp dụng kiểu để chỉ ra biến kiểu được thay thế nhưthế nào vào các kiểu nào đó trong khi dùng giá trị đa hình. Các templates C++ là các ví dụ phổ cập về đa hìnhtường minh. Đa hình ML được gọi là đa hình ẩn, vì chương trình mà khai báo và sử dụng hàm đa hình khôngcần chứa kiểu – thuật toán kiểm tra kiểu tính toán khi hàm là đa hình và tính toán khởi tạo biến kiểu nếu cầnVí dụ5. *Thế nào là đa hình ghi đè. Cho ví dụ trong cách khai báo kiểu và nhiều cách đồng nhất kiểu đã có trong các ngôn ngữ lập trình trước đây. Nguyênnhân tại sao khai báo kiểu và đồng nhất kiểu lại liên quan đến nhau là, khi tên kiểu được khai báo, điều quantrọng là quyết định xem đây có phải là kiểu mới không, nó có khác mọi kiểu khác không hoặc tên mới nhưngvề ý nghĩa nó đồng nhất với một kiểu nào đó mà đã được sử dụng ở đau đó trong chương số ngôn ngữ lập trình đã dùng một số dạng đồng nhất kiểu tương đối phức tạp dẫn đến một số dạng khaibáo kiểu không rõ *Sắp xếp đa hình là gì? Cho ví dụ cài đặt sắp xếp đa hình trong ML. Chúng ta có thể thấy nó làm việc như thế nào bằng việc xem xét hàm sắp xếp ML sort mà tương tự với hàmsắp xếp C++ sort khai báo trước đâyĐể sort là đa hình, thao tác nhỏ hơn cần phải được truyền như đối số của hàm cho sort. Các kiểu của insert vàsort được suy ra bằng thuật toán suy luận kiểu như các kiểu trên, biến kiểu a có thể được khởi tạo là kiểu bất kỳ, nếu cần thiết. Kết quả, các hàm nàyđược coi như chúng là các “templates”. Bằng việc sử dụng kết hợp template C++, các hàm ML, cú phápkiểu, các hàm được định nghĩa trước đây có thể được viết như sauCác khai báo trên là các phương án khai báo kiểu tường minh của các hàm ML đa hình ẩn. Nói cách khác,thuật toán suy luận kiểu ML có thể được hiểu chương trình tiền xử lý mà chuyển biểu thức ML không cóthông tin kiểu về biểu thức trong ngôn ngữ trung gian nào đó có kiểu tường minh với các templates. Từ gócđộ này, sự khác biệt giữa đa hình tường minh và ẩn là chương trình tiền xử lý của ngôn ngữ lập trình nhưchương trình dịch ML dùng cú pháp ẩn đơn giản hơn và tự động chèn các thông tin kiểu tường minh,chuyển từ dạng ẩn sang tường minh, trước khi chương trình được dịch và thực thúc ví dụ này, giả sử ta khai báo hàm nhỏ hơn cho số nguyênTrong áp dụng sau của hàm sắp xếp đa hình, sort template được tự động khởi tạo thành kiểu int, như vậy sortcó thể được dùng để sắp xếp danh sách 4. Thiếu câu Xong1. *Hãy trình bày mô hình máy tính đơn giản. Nêu cách thức hoạt động của nó, khi thực thi mộtchương ta sử dụng mô hình máy tính đơn giản trên Hình sau để xem xét việc quản trị bộ nhớ trong cácngôn ngữ cấu trúc vẽ Ngăn xếp chương trìnhMô hình máy trên Hình tách bộ nhớ code khỏi bộ nhớ dữ liệu. Bộ đếm chương trình lưu trữ địa chỉ củachỉ lệnh hiện tại của chương trình và được tăng một cách bình thường sau mỗi chỉ lệnh. Khi chương trìnhvào một block mới, một bản ghi kích hoạt activation record chứa bộ nhớ cho các biến cục bộ khai báo trongblock được bổ sung thêm vào ngăn xếp thời gian chạy run-time stack – được vẽ trên đỉnh bộ nhớ dữ liệu,và con trỏ môi trường được thiết lập đến bản ghi mới này. Khi chương trình thoát khỏi khối, bản ghi kíchhoạt đó được xóa khỏi ngăn xếp và con trỏ môi trường sẽ được đặt lại vị trí cũ. Chương trình có thể lưu lạidữ liệu, mà có thể tồn tại lâu hơn sau khi thực hiện khối hiện thời, trên đống heap. Trên thực tế, bản ghi kíchhoạt được cấp mới nhất là cái đầu tiên sẽ bị thu hồi, thường được gọi là stack discipline. Mặc dù hầu hết cácngôn ngữ cấu trúc khối được cài đặt bởi ngăn xếp, các hàm bậc cao có thể làm cho stack discipline bị lỗi2. *Nêu cấu tạo của bản ghi kích hoạt. Lấy ví dụ bản ghi kích hoạt của các chương trình đang chạy đến khối in-line, không gian cần được cấp cho các biến khai báo trong khối. Chúngta làm điều đó bằng cách cấp bộ nhớ được gọi là bản ghi kích hoạt activation record trên ngăn xếp thời gianchạy. Bản ghi kích hoạt đôi khi được gọi là khung ngăn xếp stack frame.Để thấy rõ nó làm việc như thế nào, xét ví dụ đoạn code sau. Nếu code này là một phần của chương trình lớnhơn, ngăn xếp này có thể chứa không gian cho các biến khác, trước khi khối này được thực hiện. Khi bắt đầuvào khối ngoài, bản ghi kích hoạt chứa không gian cho x và y được đẩy vào ngăn xếp. Khi các lệnh đặt giá trịcho x và y sẽ được thực hiện, làm cho các giá trị của x và y được lưu trên thanh ghi kích hoạt. Khi bắt đầu vàokhối trong, bản ghi kích hoạt khác chứa không gian cho z được bổ sung vào ngăn xếp. Sau khi giá trị của z gán,bản ghi kích hoạt chứa giá trị này sẽ được lấy ra khỏi ngăn xếp. Cuối cùng, khi thoát khỏi khối ngoài, bản ghikích chứa không gian cho x và y được lấy ra khỏi ngăn *Nêu khái niệm phạm vi và thời gian sống của các biến. Cho ví dụ chỉ rõ sự khác biệt của trọng là cần phân biệt phạm vi khai báo và thời gian sống của vị trí cấp.•Phạm vi vùng văn bản mà ở đó khai báo được nhìn thấy.•Thời gian sống là quãng thời gian trong khi chạy chương trình, ở đó vị trí bộ nhớ được cấpnhư kết quả của một khai báo nào ta có thể so sánh thời gian sống và phạm vi qua ví dụ sau, các gạch dọc được sử dụng để chỉra điểm vào và điểm ra của từng ví dụ này, khai báo bên trong của x giấu khai báo bên ngoài của nó. Khối bên trong được gọilà lỗ hổng trong phạm vi của khai báo bên ngoài của x, vì x bên ngoài không thể truy cập được ởtrong khối bên trong. Ví dụ này chỉ ra rằng thời gian sống không trùng với phạm vi, vì thời gian sốngcủa c bên ngoài bao gồm cả thời gian khi khối bên trong được thực hiện, nhưng phạm vi của x bênngoài không bao gồm phạm vi của cái bên 5 Hai cơ chế truyền tham số cho lời gọi hàm là truyền tham trị và truyền tham chiếu khác nhau nhưthế nào. Cho ví dụ minh họa. Lợi thế của mỗi cơ tham số được sử dụng trong khai báo hàm được gọi là tham số hình thức. Khi hàm được gọi, biểu thức gọitham số thực tế được sử dụng để tính giá trị tham số cho lời gọi đó. Sự khác biệt giữa tham số hình thức vàthực tế được mô tả trong đoạn code định danh x và y là các tham số hình thức của thủ tục p. Các tham số thực tế trong lời gọi đến p là z và4*z+ mà các tham số thực tế được tính toán và truyền cho hàm phụ thuộc vào ngôn ngữ lập trình và cơ chếtruyền tham số mà nó sử dụng. Sự khác biệt chính giữa các cơ chế truyền tham số là•Thời điểm mà tham số thực tế được tính toán•Vị trí được sử dụng để lưu giá trị tham sốHầu hết các ngôn ngữ lập trình tính toán các tham số thực tế trước khi thực hiện thân hàm, nhưng cũng có mộtsố ngoại lệ. Một nguyên nhân là tối ưu ngôn ngữ hoặc chương trình có thể muốn trì hoãn việc tính toán tham sốhình thức, vì việc tính toán này có thể lâu và có thể không được sử dụng trong một số lời gọi. Trong số các cơchế mà tính toán các tham số thực tế trước khi thực hiện thân hàm, thông thường là•Truyền tham chiếu truyền L-giá trị địa chỉ của tham số thực tế•Truyền tham trị truyền R-giá trị nội dung của địa chỉ của tham số thực tếNhắc lại là chúng ta đã bàn luận về L-giá trị và R-giá trị trong mục phần liên quan đến ô tham chiếu MLvị trí gán được và phép gán. Chúng ta sẽ bàn truyền tham chiếu và truyền tham trị làm việc như thế nào chitiết hơn dưới đây. Một cơ chế khác là truyền kết quả giá trị pass-by-value-result được xét đến trong phần khác nhau giữa truyền tham trị và truyền tham chiếu là rất quan trọng đối với người lập trình bởi một số lýdo sau• Tác động phụ việc gán bên trong thân hàm có thể thể có các tác động phụ khác nhau khi truyền tham trịhay truyền tham chiếu•Bí danh bí danh xảy ra khi hai tên tham chiếu đến cùng một đối tượng hoặc cùng một vị trí. Bí danh cóthể xảy ra khi hai tham số được truyền tham chiếu hoặc một tham số được truyền tham chiếu có cùng vị trínhư biến tổng thể của thủ tục.• Tính hiệu quả Truyền tham trị có thể không hiệu quả đối với các cấu trúc lớn, nếu giá trị của cấu trúclớn cần sao lưu. Truyền tham chiếu có thể kém hiệu quả hơn truyền tham trị đối với các cấu trúc nhỏ mà có thểđẩy trực tiếp vào ngăn xếp, vì khi tham số truyền tham chiếu, chúng ta cần lần theo con trỏ để lấy giá trị đây có hai cách giải thích ngữ nghĩa của lời gọi theo tham chiếu và theo tham trị. Một là vẽ ra bức tranh bộnhớ máy tính và ngăn xếp chương trình thời gian chạy, chỉ ra ngăn xếp có chứa bản sao của tham số thực tếhay tham chiếu đến nó. Cách giải thích khác thể hiện bằng cách dịch mã sang ngôn ngữ mà phân biệt giữa Lgiá trị và R-giá trị. Chúng ta sẽ dùng cách thứ hai ở đây, vì vậy phần còn lại của chương sẽ cho bạn cơ hội làmviệc với một số hình ảnh về ngăn xếp thời gian dụ đây là ví dụ, viết trên ngôn ngữ tựa Algol, mà kết hợp truyền tham chiếu và truyền tham đoạn mã trên sang ML ta cóCâu 6 Thế nào là phạm vi tĩnh và phạm vi động. Cho ví dụ nêu sự khác biệt giữa hai loại phạm vi.•Phạm vi tĩnh định danh tổng thể tham chiếu đến tên đó mà được khai báo trong phạm vi đóng gần nhấtcủa văn bản chương trình.•Phạm vi động định danh tổng thể tham chiếu đến định danh đó được gắn kết với bản ghi kích hoạt mớinhất+ Ví dụSự khác biệt giữa phạm vi tĩnh và động được thể hiện qua đoạn mã sau, mà chứa hai khai báo của gọi f3 dẫn đến lời gọi g12 bên trong hàm f. Điều này buộc biểu thức x+z trong thân của g cầnđược tính toán. Sau khi gọi đến g, ngăn xếp thời gian chạy sẽ chứa các bản ghi kích hoạt cho các khaibáo bên ngoài của x, khởi tạo của f, và khởi tạo của g, như chỉ ra trong thể hiện điểm này, hai số nguyên tên x được lưu trên ngăn xếp, một của khối ngoài và một của khai báo xở bên trong f. Trong phạm vi động, định danh x trong biểu thức x+z sẽ được biên dịch như một biếntừ trong bản ghi kích hoạt tạo mới nhất, ở đó x = 4. Trong phạm vi tĩnh, đinh danh x+4 sẽ tham chiếuđến khai báo x từ khối chương trình gần nhất, tìm trở lên từ chỗ x+z xuất hiện trong văn bản chươngtrình. Trong phạm vi tĩnh, khai báo liên quan đó của x là khai báo của khối ngoài, với x = 9Thế nào là đệ qui đuôi. Đối với đệ qui đuôi việc tái sử dụng ngăn xếp được thực hiện như thếnào cho ví dụ minh họaKhái niệm ngôn ngữ lập trình chính mà chúng ta cần, là khái niệm lời gọi đuôi. Giả sử hàm f gọi hàm g. Hàm fvà g có thể là các hàm khác nhau hoặc f và g có thể là cùng một hàm. Lời gọi hàm f trong thân hàm g được gọilà gọi đuôi tail call nếu g trả về kết quả của lời gọi f mà không cần bất cứ tính toán nào nữa. Chẳng hạn,trong hàmLời gọi thứ nhất của f trong g là lời gọi đuôi, vì nó trả về giá trị của g chính bằng giá trị của lời gọi f. Lời gọithứ hai đến f trong thân của g không phải là lời gọi đuôi, vì g thực hiện tính toán gồm giá trị trả về của f trướckhi g trả về kết f được gọi là đệ qui đuôi, nếu mọi lời gọi đệ qui trong thân hàm f đều là lời gọi đuôi đến dụ đây là hàm đệ qui đuôi tính toán giai thừaCụ thể hơn, đối với mọi số nguyên n, tlfactn,a trả về n!. Chúng ta có thể thấy tlfact là hàm đệ qui đuôi, vì lờigọi duy nhất trong thân hàm tlfact đó là lời gọi điểm của đệ qui đuôi là chúng ta có thể sử dụng cùng bản ghi kích hoạt cho mọi lời gọi đệ qui. Xét lời gọitlfact3,1. Hình chỉ ra các phần liên quan đén tính toán nói bên trênHình Ba lời gọi đệ qui đuôi đến tlfact chưa tối lời gọi thứ ba kết thúc, nó truyền kết quả trả lại lời gọi thứ hai, mà sau đó truyền kết quả trả lại lời gọi thứnhất. Chúng ta đơn giản hóa quá trình bằng cách cho lời gọi thứ ba trả kết quả về bản ghi kích hoạt mà tạo nênlời gọi từ đầu, tlfact3,1. Khi thực hiện phương án này, lời gọi thứ ba kết thúc, ta có thể gỡ bản ghi kích hoạtcho lời gọi thứ hai, vì ta không cần nó nữa. Trên thực tế vì bản ghi kích hoạt cho lời gọi thứ nhất không cầnnữa khi lời gọi thứ hai bắt đầu, ta có thể gỡ bỏ bản ghi kích hoạt thư nhất ra khỏi ngăn xếp trước khi cấp bảnghi thứ hai. Sẽ tốt hơn, thay vì thu hồi bản ghi thứ nhất và sau đó cấp bản ghi thứ hai đồng nhất với bản ghithứ nhất, ta sử dụng một bản ghi kích hoạt cho cả ba lời chỉ ra cùng một bản ghi kích hoạt có thể được sử dụng ba lần cho ba lời gọi liên tiếp đến tlfact đệ quiđuôi như thế nào. Hình vẽ này chỉ ra nội dung bản ghi kích hoạt cho từng lời gọi. Khi lời gọi thứ nhất,tlfact3,1 bắt đầu, bản ghi kích hoạt với tham số 1,3 được tạo ra. Khi lời gọi thứ hai tlfact2,3 bắt đầu, giátrị tham số thay đổi sang 2,3. Khử đệ qui đuôi tái sử dụng bản ghi kích hoạt duy nhất cho mọi lời gọi hàm, sửdụng phép gán thay đổi giá trị các tham số của hàm cho mỗi lời Ba lời gọi đến tlfact đệ qui đuôi có tối ưu11. *Thế nào là truyền tham số hàm. Cho ví dụ trong MLTrả lờiTên tham số được sử dụng trong khai báo hàm được gọi là tham số hình thức. Khi hàm được gọi, biểu thức gọitham số thực tế được sử dụng để tính giá trị tham số cho lời gọi đó. Sự khác biệt giữa tham số hình thức vàthực tế được mô tả trong đoạn code định danh x và y là các tham số hình thức của thủ tục p. Các tham số thực tế trong lời gọi đến p là z và4*z+ mà các tham số thực tế được tính toán và truyền cho hàm phụ thuộc vào ngôn ngữ lập trình và cơ chếtruyền tham số mà nó sử dụng. Sự khác biệt chính giữa các cơ chế truyền tham số là• Thời điểm mà tham số thực tế được tính toán• Vị trí được sử dụng để lưu giá trị tham số12. *Thế nào là trả về hàm trong lời gọi hàm. Cho ví dụ trong ML. Theo bạn nghĩ nó đem lại nhữnglợi ích gì?Trả lờiMột vấn đề liên quan nhưng phức tạp hơn là đôi khi được gọi là upward funnarg problem, mặc dù có thể gọichính xác hơn là vấn đề kết quả - hàm phía trên, vì nó xảy ra khi trả về giá trị hàm từ phạm vi lồng nhau, nóichung như giá trị trả về của hàm dụ đơn giản của hàm mà trả về hàm là mã ML sau cho việc hợp hàmCho hai đối số hàm số f và g, phép hợp hàm trả về hàm hợp của f và g. Thân của phép hợp là mã yêu cầu thamsố hàm x và sau đó tính toán gfx. Mã này có ích chỉ khi nó gắn kết với cơ chế nào đó để tìm giá trị của f vàg. Do đó, bao đóng được sử dụng để thể hiện phép hợp hàm f,g. Con trỏ mã của bao đóng này trỏ tới mã dịch“để nhận tham số x của hàm và sau đó tính toán gfx” và con trỏ bản ghi kích hoạt của bao đóng này trỏ đếnbản ghi kích hoạt của phép hợp lời gọi f,g vì vậy bản ghi kích hoạt này cho mã để tìm các hàm thực tế f và gcần thiết để tính hợp hàm của *Cho ví dụ hàm map trên danh sách trong ML hàm tác động đến từng phần tử của danh sách.Trả lờiĐây là ví dụ hàm ML mà yêu cầu một đối số hàmHàm map nhận hàm f và danh sách m như các đối số, áp dụng f lần lượt cho mỗi phần tử của m. Kết quả củamapf, m là danh sách các kết quả fx cho các phần tử x trong danh sách m. Hàm này được sử dụng trongnhiều tình huống lập trình ở đó danh sách được sử dụng. Chẳng hạn, ta có danh sách các thời gian hết hạn củacác sựu kiện và ta muốn tăng mỗi thời gian hết hạn, chúng ta có thể áp dụng hàm tăng cho ta sẽ thấy tại sao bao đóng là cần thiết bằng cách xét tương tác giữa phạm vi tĩnh và các đối số của hàmvà giá trị trả về. C và C++ không hỗ trợ bao đóng vì nó kèm theo trả giá cài đặt. Tuy nhiên, việc cài đặt các đốitượng trong C++ và các ngôn ngữ khác liên quan đến cài đặt các giá trị hàm sẽ được bàn trong chương này. Lýdo là bao đóng và đối tượng cả hai đều kết hợp dữ liệu với mã của 5. xong5* Nêu cách sử dụng C++ function templates. Cho ví dụ dùng template như tham số kiểu trong C++. sử dụng C++ function là khai báo một tên kiểu T thông qua từ khóa “template”, một kiểu tổng quát để thay thế và khi sử dụngcùng một hàm hàm có thể truyền tham số dùng cho một kiểu cụ thể nào đó như “int, float, double,..”Templates C++ được khởi tạo khi link chương trình. Cụ thể hơn, giả sử template hàm swap được lưu ở mộtfile và được dịch, và một chương trình gọi swap được lưu trong file khác và được dịch riêng rẽ. Các tệp đượcgọi là đối tượng tái định vị được tạo ra khi chương trình gọi được dịch sẽ bao gồm cả thông tin chỉ ra rằngcode được dịch gọi hàm swap của một kiểu nào đó. Chương trình linker được thiết kế để kết nối hai phầnchương trình bằng việc gắn kết lời gọi hàm swap trong chương trình gọi đến định nghĩa của swap trong phầndịch riêng. Nó thực hiện như vậy bằng việc khởi tạo code được dịch cho swap ở dạng mà tạo ra code phù hợpvới lời gọi đến swap. Nếu chương trình gọi swap với một số kiểu khác nhau, thì một số bản sao khởi tạo khácnhau sẽ được tạo ra. Mỗi bản sao khác nhau cần cho mỗi kiểu của lời gọi vì swap khai báo biến cục bộ tmpkiểu T. Không gian cho tmp cần được cấp trên bản ghi kích hoạt của swap. Do đó code dịch đối với swap cầnđược chỉnh sửa cho phù hợp với kích thước của biến kiểu T. Chẳng hạn, nếu T là cấu trúc hoặc đối tượng, thìkích thước là tương đối lớn. Mặt khác, nếu t là int, thì kích thước sẽ nhỏ. Trong mọi trường hợp, code dịch cầnbiết kích thước của dữ liệu để việc tham chiếu đến bản ghi kích hoạt được thực hiện Ví dụ 1 sử dụng template cho hàm hoán vịVí dụ 2 sử dụng template cho hàm so sánh tìm giá trị lớn nhấtTemplate T GetMax T a, T b{Return a >b ? ab;}6*.Nêu sự khác biệt giữa cơ chế tham số kiểu trong C++ và trong ML. Cho ví dụ minh ví dụ với C++Hàm swap là hàm tổng quát mà làm việc tốt đối với nhiều kiểu của các đối số. Templates cho phép ta coi swaplà hàm với đối số kiểu. Khi thực hiệnNhư vậy với cơ chế tham số kiểu trong C++ ta có thể định nghĩa nó là bất cứ loại đối tượng nào. Khi sử dụngta chỉ cần khai báo kiểu tương ứng khi đó đối tượng Template hàm đã định nghĩa tự động gán tham số kiểutương với MLTrong đa hình ML, thuật toán suy luận kiểu đưa ra kết luận kiểu của hàm và kiểu áp dụng hàm. Khi hàm là đahình, các hành động của thuật toán suy luận kiểu có thể được hiểu như việc chèn tự động khai báo template“template declarations” và khởi tạo template “template installation” vào chương trìnhNhư vậy ta có thể hình dung rằng với ML , chương trình suy luận tự động gán và khai dụ hàm sắp xếp Để sort là đa hình, thao tác nhỏ hơn cần phải được truyền như đối số của hàm cho sort. Các kiểu của insert vàsort được suy ra bằng thuật toán suy luận kiểu như các kiểu trên, biến kiểu a có thể được khởi tạo là kiểu bất kỳ, nếu cần thiết. giống việc định nghĩatemplate trong c++ Kết quả, các hàm này được coi như chúng là các “templates”. Bằng việc sử dụng kết hợptemplate C++, các hàm ML, cú pháp kiểu, các hàm được định nghĩa trước đây có thể được viết như sauCác khai báo trên là các phương án khai báo kiểu tường minh của các hàm ML đa hình ẩn. Nói cáchkhác, thuật toán suy luận kiểu ML có thể được hiểu chương trình tiền xử lý mà chuyển biểu thức MLkhông có thông tin kiểu về biểu thức trong ngôn ngữ trung gian nào đó có kiểu tường minh với vậy sự khác nhau chính là việc ngôn ngữ ML có cơ chế tự động suy luận kiểu,tự động thực hiệnđịnh nghĩa các hàm như ví dụ mô tả sự định nghĩa tường minh việc suy luận kiểu bên trên thay cho vìphải định nghãi tường minh trên C++7*.Nêu đặc trưng và cho ví dụ dùng thư viện template chuẩn C++ STL. Cho ví dụ minh họa. C++Standard Template Library được viết tắt là STL••••••Thư viện chuẩn C++ dùng lại thư viện chuẩn C với một số điều chỉnh nhỏ để giúp nó hoạt động tốt hơn vớingôn ngữ C++. Một bộ phận lớn khác của thư viện C++ dựa trên Thư viện tiêu bản chuẩn hay còn gọi là STL- viết tắt từ chữ Standard Template Library. Thư viện này có nhiều công cụ hữu dụng như là các thùngchứa thí dụ như vector, danh sách liên kết và biến lặp tổng quát hóa từ khái niệm con trỏ để cung cấp nhữngthùng chứa này sự truy cập giống như là truy cập mảng. Xa hơn nữa, bảng đa ánh xạ mảng kết hợp và đatập, tất cả được cung cấp để có thể xuất ra các giao diện tương thích. Do đó, có thể dùng tiêu bản để viết cácthuật toán tổng quát mà chúng làm việc được với bất kì thùng chứa nào hay với bất kì dãy nào được địnhnghĩa bởi biến lặp. Giống như C, các tính năng của thư viện này thì được truy cập bởi việc sử dụng lệnh dẫnhướnginclude để bao gồm một tập tin tiêu đề chuẩn. C++ cung ứng 69 tiêu đề chuẩn, trong đó có 19 tiêu đềkhông còn hiệu lực đặc trưng ấn tượng của STL là tính hiệu quả thời gian chạy của mã được tạo ra. STL không chỉ làmcho dễ dàng viết một chương trình bằng việc cung cấp các cấu trúc hữu dụng, mà STL còn làm cho có thể viếtcode dựa trên thư viện mà chạy nhanh hoặc nhanh hơn so với code mà bạn có thể viết, nếu bạn bỏ ra nhiềucông sức hơn và không sử dụng STL. Một lý do để STL hiệu quả là templates C++ được triển khai trong thờigian dịch/link, với các code riêng biệt được sinh và tối ưu cho mỗi khởi tạo. Lý do khác là việc sử dụng tảichồng, mà được hóa giải trong thời gian dịch, cũng cho phép compiler tối ưu code mà được chọn chính xáccho kiểu dữ liệu được sử dụng trong chương trình. Mặt khác, vì việc lặp code là kết quả của việc triển khaitemplate, mã dịch của chương trình sử dụng STL có thể rất sáu loại thực thể trong STLContainers, mỗi cái là một họ các đối tượng mà cho truy cập đến các đối tượng trong container. Về trực quan, iterator là khái quát của con trỏhoặc cho địa chỉ đến một vị trí nào đó trong mà cho chuyển đổi giữa một dạng của thực thể và dạng khác. Ví dụ là iterator ngược, mà duyệtngược hướng của một tượng hàm Function objects mà là dạng closure mã hàm và môi trường gắn kết. Chúng được sử dụngnhiều dưới dạng cho phép các đối số hàm cho template ở dạng in-line. Cụ thể hơn, đối tượng hàm được truyềnnhư hai đối số riêng biệt, đối số template mang code và đối số run-time mang trạng thái của hàm. Hệ thốngkiểu được sử dụng để tin tưởng rằng code và trạng thái phù hợp với mà đóng gói vùng bộ nhớ. Các allocators khác nhau có thể cung cấp bộ nhớ có khả năng dọn rác,bộ nhớ tham chiếu đếm, bộ nhớ bền,…Ví DụSử dụng template vecter, để làm việc với vector, chúng ta sử dụng một class đã được định nghĩa sẵn cótên cũng là "vector". Class này nằm trong namespace std nên chúng ta cần có câu lệnh sử dụng namespace nàyhoặc gọi trực tiếp stdvector mỗi khi cần thiết. Ngoài ra, các thao tác xử lý vector được định nghĩa trong thưviện của C++ nên chúng ta phải khai báo trước khi sử dụnginclude using namespace std;//Bây giờ chúng ta sẽ khai báo một vector, và chỉ rõ là vector đó dùng để lưu trữ các đối tượng loạigìvector name_of_vector;//Để thêm một phần tử vào vị trí sau cùng của vector bỏ đi phần tử cuối cùng của vector bỏ đi tất cả các phần tử của vector lấy ra phần tử đầu tiên của vector lấy ra phần tử cuối cùng của vector lấy ra phần tử vị trí thứ n của vector đếm từ 0 biết số lượng phần tử của vector biết vector có phần tử hay không duyệt vector bằng iterator//Khai báo con trỏ để duyệtvectoriterator iter_name;for iter_name = iter_name != iter_name++{cout methodparametersThuộc tính orptr->field Ngày đăng 15/05/2015, 1556 Câu 1 Khái niệm và Các yếu tố cấu thành của Ngôn ngữ lập trình Ngôn ngữ lập trình là một hệ thống được kí hiệu hóa để miểu tả những tính toán qua máy tính trong một dạng mà cả con người và máy tính đều có thể đọc và hiểu được. Ngôn ngữ lập trình = Kí hiệu + quy tắc kết hợp • Các yếu tố cấu thành của ngôn ngữ lập trình o Cú pháp Sự kết hợp của các kí hiệu Dạng của biểu thức, các phát triển, các đơn vị nhỏ của chương trình o Ngữ nghĩa Ý nghĩa cuả sự kết hợp. o Ngữ dụng Mối quan hệ của cú pháp,ngữ nghĩa với thế giới bên ngoài Câu 2 Phải có ngôn ngữ lập trình mà k dùng ngôn ngữ máy hay ngôn ngữ tự nhiên để lập trình vì • Ngôn ngữ máy là ngôn ngữ trong đó các lệnh được viết bằng các số nhị phân 0 và 1. Nếu một chương trình được viết bằng ngôn ngữ máy thì chương trình đó sẽ rất dài. Các dòng số này không gợi nên ý nghĩa của lệnh. Người dùng muốn hiểu và sử dụng chương trình thì phải ghi nhớ một cách máy móc các dòng lệnh. • Ngôn ngữ tự nhiên là ngôn ngữ đa nghĩa, giàu cảm xúc biểu đạt, đóng về ngữ nghĩa. Nếu dùng ngôn ngữ tự nhiên để vết chương trình thì máy tính không thể xác định được khả năng biểu đạt của ngôn ngữ.  Phải dùng ngôn ngữ lập trình để làm phương tiện giao tiếp giữa người và máy tính. Câu 3 Lịch sử phát triển của ngôn ngữ lập trình • Ngôn ngữ lập trình đầu tiên là ngôn ngữ máy tính mã nhị phân. Ngôn ngữ máy phụ thuộc toàn bộ vào kiến trúc phần cứng và những quy ước khắt khe của nhà chế tạo → Không có tính khả chuyển • Từ những năm 1950 hợp ngữ assembly ra đời → là những ngôn ngữ bậc thấp. • Từ năm 1957 ngôn ngữ bậc cao đầu tiên ra đời. Đây là sản phẩm của IBM đưa ra. Đó là ngôn ngữ Fortran Formula Translator. Là ngôn ngữ gần gũi với ngôn ngữ tự nhiên, với cách diễn đạt toán học Điều kiện, vòng lặp. • Đầu những năm 1960 COBOL xử lý dữ liệu. Algol 60 có cấu trúc điều khiển hiện đại Lisp Ngôn ngữ lập trình hàm đầu tiên, ngôn ngữ xử lí danh sách • Giữa những năm 1960 PL/1 Kết hợp giữa ngôn ngữ tính toán số học và ngôn ngữ xử lí dữ liệu. Simula Hướng đối tượng • Từ năm 1970 – 1990 Các ngôn ngữ hướng đối tượng C++ Lập trình Logic 1972 Lập trình hàm ML.,miranda Ada • Từ năm 1990 đến nay Hướng đối tượng + WWW C,java Ngôn ngữ kịch bản + Hướng đối tượng + WWWPHP XML Ngôn ngữ kịch bản phía Client Java Script Câu 4 Các xu hướng phát triển & nghiên cứu chính of các ngôn ngữ lập trình trong giai đoạn hiện nay • Moodul hóa, hướng đối tượng. • Mã nguồn mở, framework. • Phát hiện lỗi tự động • Phát triển trình dịch biên. • Bảo mật • Lập trình cho di động • Web điện toán cho đám mây • Lập trình trí tuệ nhân tạo Câu 5 Anh chị hãy cho biết tên của 3 ngôn ngữ lập trình được sử dụng phổ biến hiện nay trên thế giới, và theo anh chị thì vì sao nó lại được sử dụng phổ biến ngữ lập trình C C là một ngôn ngữ lập trình hướng đối tượng được phát triển bởi Microsoft, là phần khởi đầu cho kế hoạch .NET của họ. Tên của ngôn ngữ bao gồm ký tự thăng theo Microsoft nhưng theo ECMA là C, chỉ bao gồm dấu số thường. Microsoft phát triển C dựa trên C++ và Java. C được miêu tả là ngôn ngữ có được sự cân bằng giữa C++, Visual Basic, Delphi và Java. C được thiết kế chủ yếu bởi Anders Hejlsberg kiến trúc sư phần mềm nổi tiếng với các sản phẩm Turbo Pascal, Delphi, J++, WFC. C, theo một hướng nào đó, là ngôn ngữ lập trình phản ánh trực tiếp nhất đến .NET Framework mà tất cả các chương trình .NET chạy, và nó phụ thuộc mạnh mẽ vào Framework này. Mọi dữ liệu cơ sở đều là đối tượng, được cấp phát và hủy bỏ bởi trình dọn rác Garbage-Collector GC, và nhiều kiểu trừu tượng khác chẳng hạn như class, delegate, interface, exception, phản ánh rõ ràng những đặc trưng của .NET runtime. 4. Ngôn ngữ lập trình Java Java đọc như "Gia-va" là một ngôn ngữ lập trình dạng lập trình hướng đối tượng OOP. Khác với phần lớn ngôn ngữ lập trình thông thường, thay vì biên dịch mã nguồn thành mã máy hoặc thông dịch mã nguồn khi chạy, Java được thiết kế để biên dịch mã nguồn thành bytecode, bytecode sau đó sẽ được môi trường thực thi runtime environment chạy. Bằng cách này, Java thường chạy nhanh hơn những ngôn ngữ lập trình thông dịch khác như Python, Perl, PHP, Cú pháp Java được vay mượn nhiều từ C & C++ nhưng có cú pháp hướng đối tượng đơn giản hơn và ít tính năng xử lý cấp thấp hơn. dự định ngôn ngữ Java thay cho C++, nhưng các tính năng giống Objective C. Không nên lẫn lộn Java với JavaScript, hai ngôn ngữ đó chỉ giống tên và loại cú pháp như C. Công ty Sun Microsystems đang giữ bản quyền và phát triển Java thường xuyên. 3. Ngôn ngữ lập trình PHP PHP viết tắt hồi quy "PHP Hypertext Preprocessor" là một ngôn ngữ lập trình kịch bản hay một loại mã lệnh chủ yếu được dùng để phát triển các ứng dụng viết cho máy chủ, mã nguồn mở, dùng cho mục đích tổng quát. Nó rất thích hợp với web và có thể dễ dàng nhúng vào trang HTML. Do được tối ưu hóa cho các ứng dụng web, tốc độ nhanh, nhỏ gọn, cú pháp giống C và Java, dễ học và thời gian xây dựng sản phẩm tương đối ngắn hơn so với các ngôn ngữ khác nên PHP đã nhanh chóng trở thành một ngôn ngữ lập trình web phổ biến nhất thế giới. Ngôn ngữ, các thư viện, tài liệu gốc của PHP được xây dựng bởi cộng đồng và có sự đóng góp rất lớn của Zend Inc., công ty do các nhà phát triển cốt lõi của PHP lập nên nhằm tạo ra một môi trường chuyên nghiệp để đưa PHP phát triển ở quy mô doanh nghiệp. Câu 6 Phân biệt NNLT bậc thấp và NNLT bậc cao - Ngôn ngữ lập trình bậc thấp là một ngôn ngữ lập trình liên quan chặt chẽ đến phần cứng máy tính và không có tính khả chuyển. Từ "thấp" không có nghĩa là ngôn ngữ này kém hơn các ngôn ngữ lập trình bậc cao mà điều này nghĩa là các lệnh của nó rất gần ngôn ngữ máy. Phụ thuộc rất nhiều vào loại máy. Các ngôn ngữ lập trình bậc thấp thường được chia thành hai loại thế hệ thứ nhất và thế hệ thứ hai. + Ngôn ngữ lập trình thế hệ thứ nhất, hay 1GL, là mã máy. Nó là ngôn ngữ duy nhất mà bộ vi xử lý có thể hiểu. Hiện nay các lập trình viên hầu như không bao giờ viết chương trình trực tiếp bằng ngôn ngữ máy vì nó không chỉ yêu cầu chú ý nhiều đến các chi tiết mà một ngôn ngữ bậc cao xử lý một cách tự động mà còn yêu cầu ghi nhớ và tìm những mã lệnh bằng số cho mỗi chỉ thị được sử dụng. + Ngôn ngữ lập trình thế hệ thứ hai, hay 2GL, là ngôn ngữ assembly. Nó được xem là ngôn ngữ thế hệ thứ hai vì mặc dù nó không phải là ngôn ngữ máy nhưng lập trình viên vẫn phải hiểu về kiến trúc của bộ vi xử lý như các thanh ghi và các lệnh của bộ vi xử lý. Những câu lệnh đơn giản được dịch trực tiếp ra mã máy. - Ngôn ngữ lập trình bậc cao Là ngôn ngữ gần với ngôn ngữ tự nhiên nhất. ít phụ thuộc vào loại máy, có tính độc lập cao và phải có chương trình dịch để dịch sang mã máy thì máy tính mới có thể thực hiện được. - Cho ví dụ + Ngôn ngữ bậc thấp Ngôn ngữ máy, Assembly, … + Ngôn ngữ lập trình bậc cao fortran, pascal, C, Cobol…. Câu 7 Họ ngôn ngữ lập trình phổ biến là - Ngôn ngữ máy và ngôn ngữ ASSEMBLY Ngôn ngữ máy là đối tượng thi hành trực tiếp của vi xử lý. Hợp ngữ Assembly 1950s chương trình viết bằng hợp ngữ ngắn hơn, chiếm ít bộ nhớ hơn và chạy nhanh hơn so với ngôn ngữ lập trình bậc cao. Ngôn ngữ Assembly thích hợp cho lập trinh các vi điều khiển VD vi điều khiển trên ô tô - Họ ngôn ngữ cổ điển ngôn ngữ cấp cao loại ngôn ngữ thủ tục gắn chặt với mô hình máy tính cổ điển Von Neumann Kiến trúc Von Neumann có 2 đặc điểm đáng chú ý + Các lệnh được xử lý tuần tự theo thứ tự sắp xếp trong bộ nhớ + Chỉ cho phép đọc ghi mỗi lần 1 từ nhớ Word Memory\ VD Fortran, Pascal, Basic, C, … - Họ ngôn ngữ hàm Chương trình của ngôn ngữ hàm bao gồm các đối tượng dữ liệu, các hàm và các phép áp dụng hàm trên các đối tượng dữ liệu. Sử dụng định nghĩa hàm đệ qui. VD Lisp, ML, Haskell,… - Họ ngôn ngữ hướng đối tượng Chương trình của ngôn ngữ hướng đối tượng là một kịch bản hoạt động của các đối tượng trong chương trình. Các đối tượng gửi các thông điệp qua lại lẫn nhau. VD Smalltalk, Eiffel, C+ +, Java,… - Họ ngôn ngữ lôgic Chương trình viết trên ngôn ngữ lôgic là tập hợp các quy tắc và các sự kiện, được diễn đạt bằng các mệnh đề, liên quan đến vấn đề cần giải quyết. Người lập trình chỉ cần đặc tả lôgic của vấn đề, còn cơ chế giải quyết vấn đề theo đặc tả đó được cài sẵn trong chương trình dịch. VD Prolog, VisiCalc,… Câu 8 Đặc trưng cơ bản của ngôn ngữ lập trình hướng đối tượng - Là kĩ thuật lập trình hỗ trợ công nghệ đối tượng. OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn. Ngoài ra, nhiều người còn cho rằng OOP dễ tiếp thu hơn cho những người mới học về lập trình hơn là các phương pháp trước đó. - Chương trình của ngôn ngữ hướng đối tượng là một kịch bản hoạt động của các đối tượng trong chương trình. Các đối tượng gửi các thông điệp qua lại lẫn nhau - Đặc trưng cơ bản - Tính trừu tượng Đây là khả năng của chương trình bỏ qua hay không chú ý đến một số khía cạnh của thông tin mà nó đang trực tiếp làm việc lên, nghĩa là nó có khả năng tập trung vào những cốt lõi cần thiết. Mỗi đối tượng phục vụ như là một "động tử" có thể hoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các đối tượng khác mà không cần cho biết làm cách nào đối tượng tiến hành được các thao tác. Tính chất này thường được gọi là sự trừu tượng của dữ liệu. Tính trừu tượng còn thể hiện qua việc một đối tượng ban đầu có thể có một số đặc điểm chung cho nhiều đối tượng khác như là sự mở rộng của nó nhưng bản thân đối tượng ban đầu này có thể không có các biện pháp thi hành. Tính trừu tượng này thường được xác định trong khái niệm gọi là lớp trừu tượng hay lớp cơ sở trừu tượng + Đóng gói dữ liệu dữ liệu luôn được tổ chức thành các thuộc tính của lớp đối tượng. Việc truy nhập đến dữ liệu phải thông qua các phương thức của đối tượng lớp. + Sử dụng lại mã nguồn việc sử dụng lại mã nguồn được thể hiện thông qua cơ chế kế thừa. Cơ chế này cho phép các lớp đối tượng có thể kế thừa từ các lớp đối tượng khác. Khi đó, trong các lớp kế thừa, có thể sử dụng các phương thức mã nguồn của các lớp bị kế thừa, mà không cần phải định nghĩa lại. VD Smalltalk, Eiffel, C++, Java,… Câu 9 Phân tích 3 yêu cầu của một ngôn ngữ lập trình - Tính dễ viết + Ngôn ngữ lập trình phải có tính diễn đạt cao Cung cấp cho người lập trình những công cụ để có thể nghĩ sao viết vậy kỹ thuật đệ qui. + Ngôn ngữ phải đơn giản để dễ đọc, dễ nhớ và dễ nắm vững không nên có quá nhiều khái niệm. VD ngôn ngữ C có quá nhiều toán tử, các toán tử gần giống nhau. + Ngôn ngữ phải linh hoạt. VD C linh hoạt hơn Pascal với phát biểu Break, Return - Tính dễ đọc + GOTO Pascal làm chương trình khó đọc + Dấu gạch dưới “_” trong danh hiệu làm chương trình dễ đọc hơn - Tính tin cậy xác suất chạy đúng cao trong quá trình sử dụng + Ngôn ngữ cần hạn chế sự xuất hiện của các lỗi không thể ngờ được. VD phát biểu trong FORTRAN SUMI,J= I + J; + Hiệu ứng lề side effect cũng là một nguồn gây lỗi + Ngôn ngữ cần kiểm tra chặt chẽ sự tương hợp kiểu của các biến trong biểu thức và phép gán, sự tương hợp của danh sách thông số của chương trình con ở nơi gọi và nơi định nghĩa. + Các bộ phận của chương trình cần có tính độc lập đối với nhau cao. + Tính tin cậy còn phụ thuộc vào chất lượng của chương trình dịch Câu 10 Tiêu chuẩn để đánh giá một ngôn ngữ lập trình tốt - Tính rõ ràng clarity, đơn giản simplicity, nhất quán unity của các khái niệm - Tính rõ ràng của cú pháp chương trình clarity of program syntax. Khả năng định nghĩa và sử đụng các cấu trúc hoặc các phép toán phức tạp cho phép bỏ qua các cho tiết. - Tính tự nhiên đối với các ứng dụng naturalness for the application - Hỗ trợ tính trừu tượng hóa support for abstraction - Khả năng của ngôn ngữ lập trình hỗ trợ người lập trình tạo ra các chương trình đúng đắn. Phát hiện và sửa lỗi và thực hiện tiếp tục mà không cần dừng lại. - Dễ dàng kiểm tra chương trình - Môi trường lập trình đơn giản - Tính khả chuyển của chương trình - Chi phí sử dụng thấp chi phí thực thi, dịch, viết, kiểm tra, sử dụng, bảo trì chương trình. Câu 11. Các thành tố cuả một ngôn ngữ lập trình hiện đại -Các dạng câu lệnh định nghĩa, khai báo, gán giá trị, kết hợp, điều kiện, vòng lặp, gọi hàm, thủ tục, macro, các chỉ thị tiền xử lý ifndef MY_LIB include " endif trong C/C++, chú giải • Chương trình con và macro một khối lệnh được dùng lại nhiều lần • Biến, hằng, tham số và đối số • Từ vựng qui ước từ khóa, các tên chuẩn hay tên cho trước, các ký hiệu • Các luật cấm ngoại lệ lỗi cú pháp, lỗi ý nghĩa • Ngoài ra còn 1 số thành tố khác như - Giao diện đồ họa - Điều khiển theo sự kiện - Thời gian thực - Hỗ trợ hệ điều hành Câu 12 Trình bày khái niệm siêu ngôn ngữ meta language, và cho biết vai trò của siêu ngôn ngữ trong quá trình thiết kế ngôn ngữ lập trình, lấy ví dụ một vài siêu ngôn ngữ. - Khái niệm Ngôn ngữ dùng để xác định cú pháp hoặc ngữ nghĩa của một ngôn ngữ lập trình gọi là siêu ngôn ngữ Meta language 777 Khái niệm ngôn ngữ học của GS. Nguyễn Thiện Giáp - Vai trò Nó có vai trò quan trọng trong quá trình thiết kế ngôn ngữ lập trình Cú pháp quy định sự kết hợp giữa các kí hiệu trong bộ từ vựng. Ngữ nghĩa qui định ý nghĩa của mỗi sự kết hợp trong việc thiết kế ngôn ngữ, ngữ nghĩa hình thức cho phép các nhà thiết kế mô tả rõ ràng và chính xác ngữ nghĩa cũng như các đặc tả của ngôn ngữ. Cú pháp là thành phần quan trọng nhất trong một ngôn ngữ. Cú pháp được biểu diễn bởi một bộ luật cú pháp. Bộ luật này dùng để mô tả cấu trúc của chương trình, câu lệnh. Để lập trình, người lập trình phải nắm được bộ luật cú pháp của ngôn ngữ mà mình định xây dựng chương trình, để lập trình đúng. VD Văn phạm phi ngữ cảnh, BNF,… Câu 13. Đặc tả từ vựng trong NNLT - Ngôn ngữ là tập hợp chuỗi các ký tự từ alphabet A…Z, a…z, $,,0 9, +,_,*,/,=,… - Token Một token là một tập hợp các xâu kí tự có một nghĩa xác định. Ví dụ Các từ khoá, định danh, toán tử, hằng, xâu kí tự, … - Pattern Pattern của một token là các qui tắc kết hợp các kí tự để tạo nên token đó - Lexeme Là một chuỗi các kí tự thoả mãn pattern của một token Câu 14. Biểu thức chính quy - Để biểu diễn các token người ta dùng biểu thức chính quy. - Một biểu thức chính quy là một chuỗi miêu tả một bộ các chuỗi khác, theo những quy tắc cú pháp nhất định - BTCQ có thể hiểu như là một ngôn ngữ nhỏ dùng cho mục đích để tìm một chuỗi con trong biểu thức chuỗi lớn. Câu 15 Anh/chị hãy cho biết vì sao cần đặc tả cú pháp ngôn ngữ lập trình. Đầu vào và đầu ra của công việc đặc tả cú pháp là gì ? Phân tích cú pháp có mục đích duyệt chương trình nguồn để phát hiện và thông báo các lỗi không đúng với quy ước của ngôn ngữ. Các lỗi này làm cho nghĩa của chương trình không rõ và do đó không thể dịch đúng được. Ví dụ trong ngôn ngũ PASCAL ta viết dòng lệnh d = a+ b/e-f+g. Khi đọc đến dấu ngoặc đóng thứ 2 sau f, ta sẽ không hiểu được nguời viết muốn tính gì và đương nhiên cũng không thể dịch được. Lý do làm cho dòng lệnh không rõ nghĩa ở đây là thiếu một dấu ngoặc "" ở phía trước, có thể là trước chữ e, cũng có thể trước chữ a. Những lỗi sai với quy ước của ngôn ngữ gọi là lỗi cú pháp. Quá trình phân tích cú pháp cũng tạo ra các thông tin cần thiết về cấu trúc của chương trình và các đối tượng sẽ dùng trong công việc dịch được mô ta tiếp theo đây. Trong quá trình phân tích cú pháp, danh mục các đối tượng cũng được xây dựng để còn sinh mã chương trình trong giai đoạn tiếp theo. Công việc này gọi là phân tích từ vựng. - Đầu vào là chương trình nguồn - Đầu ra là + Những lỗi cú pháp cần sửa + Thông tin cần thiết về cấu trúc của chương trình Câu 16 Trình bày các đặc điểm của cú pháp cụ thể Trả lời * Cú pháp của ngôn ngữ được định nghĩa bởi bộ 4 Văn phạm phi ngữ cảnh Context – Free Grammar - Ký hiệu bắt đầu S ∈ NStart symbol - Tập các ký hiệu không kết thúc N Non-terminals - Tập các ký hiệu kết thúc Terminals - Tập các luật sinh P Production có dạng A → a Với A ∈ N và a là chuỗi các ký hiệu kết thúc và không kết thúc Câu hợp lệ của ngôn ngữ là chuỗi kí hiệu kết thúc được dẫn ra từ kí hiệu khởi đầu S thông qua các luật sinh trong tập luật sinh P * BNF là một siêu ngôn ngữ phổ biến để xây dựng cú pháp cụ thể * Ví dụ Cú pháp cụ thể dạng BNF cho biểu thức trong PASCAL - = - = - = - = a b c,….z - = 0 1 2,…9 - = +, -, or - * / div mod and Cú pháp cụ thể còn được gọi là cú pháp phi ngữ cảnh context-free syntax, trong đó vế trái của mỗi luật sinh chỉ có duy nhất một ký hiệu không kết thúc. Cú pháp phi ngữ cảnh biểu diễn được cú pháp của mọi ngôn ngữ lập trình cấp cao hiện nay. Câu 17 Anh/chị hãy phân tích vai trò của đặc tả ngữ nghĩa ngôn ngữ lập trình. Đầu vào, đầu ra của công việc đặc tả ngữ nghĩa là gì ? - Đặc tả ngữ nghĩa hình thức cho phép + Chứng minh tính đúng đắn của chương trình + Kiểm tra tính đúng đắn của chương trình dịch - Cú pháp và ngữ nghĩa hình thức được dùng để hiện thực và thiết kê ngôn ngữ lập trình. + Cú pháp hình thức được sử dụng để tạo ra bộ phân tích cú pháp của ngôn ngữ + Ngữ nghĩa hình thức giúp cho quá trình sinh tự động các trình thông dịch và biên dịch của ngôn ngữ. + Trong việc thiết kế ngôn ngữ, ngữ nghĩa hình thức cho phép nhà thiết kế mô tả rõ ràng và chính xác ngữ nghĩa cũng như các đặc tính của ngôn ngữ. - Đặc tả ngữ nghĩa hình thức thông qua bộ phân tích ngữ nghĩa. - Bộ phân tích ngữ nghĩa BPTNN thực hiện + Kiểm tra lỗi ngữ nghĩa kiểm tra kiểu; kiểm tra phạm vi của hằng, biến; kiểm tra việc sử dụng tên + Thu nhận thông tin thuộc tính cho các từ tố token, ví dụ như thông tin về giá trị, thông tin về loại hằng, biến hay hàm cho tên. + BPTNN phân tích ý nghĩa của các cấu trúc cú pháp tạo nên chương trình nguồn. VD trong biểu thức gán c=a+b*7, BPTNN xác định ý nghĩa của các tác vụ =, +, *, kiểm tra xem các tác vụ có nhận các đối số thuộc các kiểu thích hợp hay không dựa vào bảng ký hiệu. Câu 18 Anh/chị hãy cho biết đặc điểm của quá trình biên dịch lấy VD về các ngôn ngữ biên dịch mà anh/chị biết Trả lời * Đặc điểm của quá trình biên dịch Chương trình nguồn được trình biên dịch chuyển sang chương trình đích, thường ở dạng mã máy hoặc assembly, sau đó chương trình đích mới được thực thi. Trong hệ thống biên dịch dữ liệu và chương trình nguồn được xử lý ở hai thời điểm khác nhau. Trong đó - Chương trình nguồn viết bằng ngôn ngữ nguồn - Chương trình đối tượng được thể hiện trên ngôn ngữ đối tượng - Thời gian chuyển đổi từ chương trình nguồn sang chương trình đối tượng goi là thời gian dịch compile time - Thời gian diễn ra sự thực thi chương trình đối tượng trên máy tính gọi là thời gian thực thi execution time hoăc run time * Ví dụ về ngôn ngữ biên dịch Ngôn ngữ biên dịch là ngôn ngữ mà chương trình dịch cho nó là chương trình biên dịch. Ví dụ như Fortran , Pascal, C, C++… Câu 19 - Thay vì chuyển đổi toàn bộ chương trình nguồn như trình biên dịch, trình thông dịch chỉ chuyển đổi một mệnh đề của chương trình và thực hiện đoạn mã kết quả ngay, sau đó nó tiếp tục chuyển đổi mệnh đề thứ 2 rồi thi hành đoạn mã kết quả thứ 2 và cứ thế. - Khi sử dụng trình thông dịch, mỗi lần chạy chương trình là mỗi lần chương trình nguồn được thông dịch sang ngôn ngữ máy. Không có chương trình đối tượng nào được tạo ra. Ưu điểm - có thể chạy một chương trình vẫn còn lỗi cú pháp. Chỉ đến lúc thông dịch đến câu lệnh có lỗi cú pháp, quá trình thi hành chương trình mới bị ngừng lại và trình thông dịch sẽ thông báo lỗi. - Do không có chường trình đối tượng nào được tao ra ==> tốn ít dung lượng đĩa - Có thể chạy trên mọi hệ điều hành Nhược điểm - Trong thông dịch thì chương trình đích không được lưu lại nên mỗi lần thực hiện phải dịch lại từ đầu. ngược lại với trình biên dịch • Một số ngôn ngữ thông dịch vbscript, javascript, shell script, sql script. Câu 20 Anh chị hãy liệt kê các giai đoạn của trình biên dịch, đầu vào đầu ra của các giai đoạn? Trả lời Chương trình dịch chia làm 6 giai đoạn - Phân tích từ vựng - Phân tích cúa pháp - Phân tích ngữ nghĩa - Sinh mã trung gian - Tối ưu mã - Sinh mã đích * Phân tích từ vựng - Đầu vào chương trình nguồn là 1 chuỗi các kí hiệu - Đầu ra các kí hiệu trong chuỗi chương trình nguồn được gom lại thành các nhóm kí hiệu có ý nghĩa gọi là các token, như từ khóa, tên biến, hằng, kí hiệu tác vụ. * Phân tích cú pháp - Đầu vào chuỗi các token do bộ phân tích từ vựng cung cấp - Đầu ra cấu trúc phức tạp hơn của chương trình nguồn như biểu thức, phát biểu, chương trình con. Các cấu trúc được thể hiện dưới dạng cây cú pháp với nút lá là các token. * Phân tích ngữ nghĩa - Đầu vào Các cấu trúc cú pháp tạo nên chương trình nguồn - Đầu ra phát hiện các lỗi ngữ nghĩa, thông tin thuộc tính cho các từ tố token cho ra chương trình nguồn đã sửa lỗi * Sinh mã trung gian - Đầu vào Chương trình nguồn có ở bước trên - Đầu ra dạng biểu diễn mã trung gian mã bộ tứ, mã 3 địa chỉ của chương trình nguồn * Tối ưu mã Đầu vào Mã trung gian vừa được sinh ra ở bước trên - Đầu ra chương trình đích tối ưu về tốc độ thực thi và bộ nhớ sử dụng * Sinh mã đích - Đầu vào mã trung gian đã được tối ưu - Đầu ra mã đích thông thường ở dạng mã máy hay mã Assembly Phân tích Tổng hợp Câu 21 Anh/chị hãy trình bày nội dung của quá trình phân tích từ vựng. 1. Source program Chương trình nguồn đối với chương trình dịch chỉ là một chuỗi kí hiệu 2. Lexical analyzer Bộ phân tích từ vựng dò các kí hiệu trong chuỗi kí hiệu chương trình nguồn, và gom chúng lại thành các nhóm kí hiệu có ý nghĩa gọi là các Token như từ khóa, tên biến, hằng, kí hiệu tác vụ. 3. VD phân tích từ vựng phép gán c=a+b*7 thu được c identđịnh danh b identđịnh danh = becomeskí hiệu tác vụ gán * times kí hiệu tác vụ nhân a identđịnh danh 7 number số/hằng + pluskí hiệu tác vụ cộng Chuỗi tokens thu được id1=id2+id3*7 ident, c becomes ident, a plus ident, b times number, 7 4. Parser Bộ phân tích cú pháp nhận các kí hiệu có ý nghĩa gọi là các Token trong chuỗi kí hiệu từ bộ phân tích từ vựng, sau đó bộ phân tích từ vựng lấy token kế Get next token từ bộ phân tích cú pháp. 5. Bảng danh hiệu symbol table Câu 22 Anh chị hãy cho biết bảng danh hiệu Symbol table dùng để làm gì? Và vai trò của nó trong quá trình biên dịch chương trình? * Bảng danh hiệu symbol table là một cấu trúc dữ liệu dùng để lưu trữ tất cả định danh bao gồm các trường lưu giữ ký hiệu và các thuộc tính của nó là thông tin của chương trình Các thông tin này được tập hợp từ các giai đoạn phân tích của trình biên dịch và được sử dụng bởi giai đoạn tổng hợp để sinh mã đích * Vai trò của bảng danh hiệu Symbol table trong quá trình biên dịch chương trình là Source program Lexical analyzer Get next token Token Parser Symbol table c …. a …. b … Danh hiệu Thuộc tính - Là cơ sở dữ liệu cho toàn bộ hệ thống biên dịch - Trong quá trình chạy chương trình chỉ cần lấy lại thông tin từ bảng Symbol table mà không cần kiểm tra lại thông tin - Khi chạy chương trình lần thứ 2 mà dữ liệu nguồn không có gì thay đổi thì nó sẽ chạy trực tiếp trên file đích đã chứa sẵn bảng Symbol table1 lần biên dịch mà thực thi được nhiều lầnthời gian chạy chương trình nhanh Câu 23 Anh chị hãy trình bày nội dung của quá trình phân tích cú pháp - Bộ phân tích cú pháp phân tích chuỗi các token do bộ phân tích từ vựng cung cấp, để thu được các cấu trúc phức tạp hơn của chương trình nguồn như biểu thức, phát biểu, chương trình con. Các cấu trúc được thể hiện dưới dạng cây cú pháp với nút lá là các token. - Ví dụ cây cú pháp thu được của phát biểu gán “c=a+b*7“ Câu 24 Anh chị hãy trình bày nội dung của quá trình phân tích ngữ nghĩa -Bộ phân tích ngữ nghĩa BPTNN thực hiện – Kiểm tra lỗi ngữ nghĩa kiểm tra kiểu; kiểm tra phạm vi của hằng, biến; kiểm tra việc sử dụng tên – Thu nhận thông tin thuộc tính cho các từ tố token, ví dụ như thông tin về giá trị, thông tin về loại hằng, biến hay hàm cho tên. -BPTNN phân tích ý nghĩa của các cấu trúc cú pháp tạo nên chương trình nguồn. VD trong biểu thức gán c=a+b*7, BPTNN xác định ý nghĩa của các tác vụ =, +, *, kiểm tra xem các tác vụ có nhận các đối số thuộc các kiểu thích hợp hay không dựa vào bảng ký hiệu. -Việc phân tích ngữ nghĩa phải dựa vào các luật ngữ nghĩa đi kèm với từng luật cú pháp để thực hiện chức năng sinh thuộc tính cho các từ tố và kiểm tra lỗi ngữ nghĩa. Câu 25 Anh chị hãy cho biết các lỗi của chương trình được phát hiện như thế nào trong quá trình biên dịch chương trình */ Xử lý lỗi cú pháp Chương trình nguồn có thể chứa các lỗi ở nhiều mức độ khác nhau - Lỗi từ vựng như danh biểu, từ khóa, toán tử viết không đúng. - Lỗi cú pháp như ghi một biểu thức toán học với các dấu ngoặc đóng và mở không cân bằng. - Lỗi ngữ nghĩa như một toán tử áp dụng vào một toán hạng không tương thích. - Lỗi logic như thực hiện một lời gọi đệ qui không thể kết thúc. Phần lớn việc phát hiện và phục hồi lỗi trong một trình biện dịch tập trung vào giai đọan phân tích cú pháp. Vì thế, bộ xử lý lỗi error handler trong quá trình phân tích cú pháp phải đạt mục đích sau ™ Ghi nhận và thông báo lỗi một cách rõ ràng và chính xác. ™ Phục hồi lỗi một cách nhanh chóng để có thể xác định các lỗi tiếp theo. ™ Không làm chậm tiến trình của một chương trình đúng. */ Các chiến lược phục hồi lỗi Phục hồi lỗi là kỹ thuật vượt qua các lỗi để tiếp tục quá trình dịch. Nhiều chiến lược phục hồi lỗi có thể dùng trong bộ phân tích cú pháp. Mặc dù không có chiến lược nào được chấp nhận hoàn toàn, nhưng một số trong chúng đã được áp dụng rộng rãi. Ởđây, chúng ta giới thiệu một số chiến lược [...]... chương trình vào trong bảng danh biểu symbol table nơi chứa thông tin về kiểu của các biến và chương trình con - Ưu điểm tất cả các nhánh chương trình, các phép toán đều được kiểm tra nên không bỏ sót các lỗi về kiểu Mặt khác thông tin về kiểu không gắn với ĐTDL tại thời điểm thực thi chương trình nên tiết kiệm bộ nhớ và tăng tốc độ chạy chương trình - Nhược điểm không mềm dẻo, cụ thể người lập trình. .. -Ưu điểm mềm dẻo khi viết chương trình, không cần khai báo kiểu dữ liệu và kiểu của ĐTDL có thể thay đổi trong quá trình thực thi chương trình -Nhược điểm có khả năng bỏ sót lỗi về kiểu; yêu cầu bộ nhớ lớn do phải lưu trữ thông tin kiểu dữ liệu trong quá trình thực hiện chương trình; làm chậm quá trình thực thi do vừa phải tính toán vừa phải kiểm tra kiểu -Các ngôn ngữ kiểm tra kiểu động SNOBOL4,... toán quan hệ so sánh hai giá trị dữ liệu đối số và trả về kết quả là một đối tượng dữ liệu logic đúng hoặc sai - Gán trị Cũng như phép gán tổng quát, phép gán của số nguyên có thể trả về hoặc không trả về một giá trị Sự cài đặt Kiểu dữ liệu nguyên hầu hết được cài đặt một cách trực tiếp bằng cách dùng sự biểu diễn bộ nhớ được xác định bởi phần cứng và tập hợp các phép tính số học, các phép toán... trị “NULL” Tùy thuộc vào kiểu của biến mà giá trị NULL này sẽ có một giá trị cụ thể, ví dụ nếu là biến số thì NULL là 0, nếu là biến chuỗi kí tự thì NULL là chuỗi rỗng, nếu biến là logic thì NULL là FALSE - Khởi tạo biến ngay sau khi nó vừa được tạo ra là một cách lập trình tốt và trong một số ngôn ngữ mới đều cung cấp phương tiện để làm điều này một cách dễ dàng Trong ngôn ngữ Pascal một biến được... phẩy lạ hoặc thêm vào một dấu chấm phẩy c Chiến lược dùng các luật sinh sửa lỗi error production Thêm vào văn phạm của ngôn ngữ những luật sinh lỗi và sử dụng văn phạm này để xây dựng bộ phân tích cú pháp, chúng ta có thể sinh ra bộ đoán lỗi thích hợp để chỉ ra cấu trúc lỗi được nhận biết trong dòng nhập d Chiến lược hiệu chỉnh toàn cục global correction Một cách lý tưởng là trình biên dịch tạo... chương trình con - Khi chương trình được thực thi, chương trình chính được thực hiện đầu tiên Trong thời gian thực thi, chương trình chính có thể gọi các CTC thực hiện Và mỗi CTC này, đến lượt nó, lại có thể gọi các chương trình con khác thực hiện - CTC không được đệ qui - Cần có các phát biểu gọi tường minh - CTC phải được hoàn thành ở mỗi lần gọi - Điều khiển được chuyển ngay tức thời ở điểm gọi - Trình. .. này gọi là giá trị rác iều nguy hiểm là giá trị rác này vẫn là một giá trị hợp lệ Vì thế chương trình có thể xử lý trên giá trị rác này một cách bình thường và chúng ta không thể kiểm sóat được kết quả xử lý đó • Vì tính chất nghiêm trọng như đã nói trên của biến chưa được khởi tạo, các ngôn ngữ lập trình có thể sử dụng các giải pháp sau để khắc phục - Nếu biến chưa được khởi tạo thì sẽ có giá trị... quá trình sống - Các biến tĩnh có một định danh được kết nối với địa chỉ vùng nhớ lưu trữ biến và được truy xuất trực tiếp thông qua định danh đó • Ưu điểm - Khai báo tường minh - Biến tĩnh tồn tại trong suốt thời gian thực thi chương trình - Kích thước của biến không thay đổi trong suốt quá trình sống • Nhược điểm - Cấp phát ô nhớ dư, gây ra lãng phí ô nhớ - Cấp phát ô nhớ thi u, chương trình thực thi. .. lẫn số thực và số nguyên thì số nguyên được chuyển đổi tự động sang kiểu số thực Câu 30 Anh chị hãy phân biệt các loại phép gán khác nhau - Là tác vụ cơ bản để thay đổi giá trị của đối tượng dữ liệu - Đặc tả tác vụ gán = type1 x type2 → void = type1 x type2 → type3 Z = X + Y Z = X + Y = W ƒ 2 A=B=C Ngôn ngữ Pascal Ngôn ngữ C - Các NNLT khác nhau thì có phép gán khác nhau -Khác nhau về cú pháp... hằng MaxInt Miền giá trị của kiểu số nguyên là tập các số nguyên từ - MaxInt đến MaxInt Giá trị MaxInt được lựa chọn phản ánh giá trị nguyên lớn nhất có thể biểu diễn được trong phần cứng 3ặc tả các phép toán - Các phép tính số học cộng +, trừ -, nhân *, chia / hoặc DIV, lấy phần dư MOD hoặc một số phép toán tương tự khác âm -, dương + - Các phép toán quan hệ bằng, khác, nhỏ hơn, lớn . dụ + Ngôn ngữ bậc thấp Ngôn ngữ máy, Assembly, … + Ngôn ngữ lập trình bậc cao fortran, pascal, C, Cobol…. Câu 7 Họ ngôn ngữ lập trình phổ biến là - Ngôn ngữ máy và ngôn ngữ ASSEMBLY Ngôn ngữ. 12 Trình bày khái niệm siêu ngôn ngữ meta language, và cho biết vai trò của siêu ngôn ngữ trong quá trình thi t kế ngôn ngữ lập trình, lấy ví dụ một vài siêu ngôn ngữ. - Khái niệm Ngôn ngữ. Lịch sử phát triển của ngôn ngữ lập trình • Ngôn ngữ lập trình đầu tiên là ngôn ngữ máy tính mã nhị phân. Ngôn ngữ máy phụ thuộc toàn bộ vào kiến trúc phần cứng và những quy ước khắt khe của - Xem thêm -Xem thêm Đề thi và đáp án môn Nguyên lý những ngôn ngữ lập trình, Đề thi và đáp án môn Nguyên lý những ngôn ngữ lập trình,

nguyen ly ngon ngu lap trinh