# Ngôn ngữ lập trình bậc cao

Cbmain
Trong khoa học máy tính, một **ngôn ngữ lập trình bậc cao** (tiếng Anh: *high-level programming language*) là một ngôn ngữ lập trình có sự trừu tượng hóa mạnh mẽ khỏi các chi tiết của máy tính. So với các ngôn ngữ lập trình bậc thấp (low-level programming language), nó có thể sử dụng các yếu tố ngôn ngữ tự nhiên, dễ sử dụng hơn, hoặc có thể tự động (hoặc thậm chí che giấu hoàn toàn) các khu vực quan trọng của các hệ thống điện toán (ví dụ, quản lí bộ nhớ (memory management)), làm quá trình phát triển chương trình đơn giản hơn và tương đối dễ hiểu hơn so với một ngôn ngữ bậc thấp. Lượng trừu tượng hóa được cung cấp định nghĩa một ngôn ngữ lập trình có *bậc cao* tới mức nào.

Vào thập niên 1960, các ngôn ngữ lập trình bậc cao sử dụng một compiler (trình biên dịch) thường được gọi là **autocode** (mã tự động).
Ví dụ của autocode là COBOL và Fortran.

Ngôn ngữ lập trình cấp cao đầu tiên được thiết kế cho máy tính là Plankalkül, được tạo ra bởi Konrad Zuse. Tuy nhiên, nó đã không được thực hiện trong thời đại của ông, và những đóng góp ban đầu của ông phần lớn bị cô lập với những phát triển khác do Thế chiến thứ hai, ngoài ảnh hưởng của ngôn ngữ đối với ngôn ngữ " Superplan " của Heinz Rutishauser và ở một mức độ nào đó của Algol. Ngôn ngữ cấp cao đầu tiên trên diện rộng đáng kể là Fortran, một sự phát triển máy độc lập trước đó của IBM Autocode hệ thống. Algol, được xác định vào năm 1958 và 1960 bởi các ủy ban gồm các nhà khoa học máy tính châu Âu và Mỹ, đã giới thiệu phép đệ quy cũng như các hàm lồng nhau dưới phạm vi từ vựng. Nó cũng là ngôn ngữ đầu tiên có sự phân biệt rõ ràng giữa giá trị và tên-các tham số và ngữ nghĩa tương ứng của chúng. Algol cũng giới thiệu một số khái niệm lập trình có cấu trúc, chẳng hạn như cấu trúc **while-do** và **if-then-else** và cú pháp của nó là cấu trúc đầu tiên được mô tả bằng ký hiệu chính thức - " Backus – Naur form " (BNF). Trong cùng khoảng thời gian đó, Cobol đã giới thiệu các bản ghi (còn gọi là cấu trúc) và Lisp lần đầu tiên giới thiệu một trừu tượng lambda tổng quát đầy đủ trong một ngôn ngữ lập trình.

## Các đặc điểm

"Ngôn ngữ cấp cao" đề cập đến cấp độ trừu tượng cao hơn từ ngôn ngữ máy. Thay vì xử lý các thanh ghi, địa chỉ bộ nhớ và ngăn xếp cuộc gọi, ngôn ngữ cấp cao xử lý các biến, mảng, đối tượng, biểu thức số học hoặc boolean phức tạp, chương trình con và hàm, vòng lặp, luồng, khóa và các khái niệm khoa học máy tính trừu tượng khác, với trọng tâm về khả năng sử dụng so với hiệu quả chương trình tối ưu. Không giống như các ngôn ngữ hợp ngữ cấp thấp, các ngôn ngữ cấp cao có rất ít, nếu có, các phần tử ngôn ngữ có thể dịch trực tiếp sang các mã opcodes gốc của máy. Các tính năng khác, chẳng hạn như quy trình xử lý chuỗi, các tính năng ngôn ngữ hướng đối tượng và đầu vào / đầu ra tệp, cũng có thể có mặt. Một điều cần lưu ý về các ngôn ngữ lập trình bậc cao là các ngôn ngữ này cho phép lập trình viên được tách rời và tách rời khỏi máy. Nghĩa là, không giống như các ngôn ngữ cấp thấp như hợp ngữ hoặc ngôn ngữ máy, lập trình cấp cao có thể khuếch đại các lệnh của lập trình viên và kích hoạt rất nhiều chuyển động dữ liệu trong nền mà họ không biết. Trách nhiệm và quyền lực thực hiện các lệnh đã được giao cho máy từ lập trình viên.

## Giá phải trả cho việc trừu tượng hóa

Các ngôn ngữ cấp cao có ý định cung cấp các tính năng chuẩn hóa các tác vụ phổ biến, cho phép gỡ lỗi phong phú và duy trì thuyết bất khả tri kiến trúc; trong khi các ngôn ngữ cấp thấp thường tạo ra mã hiệu quả hơn thông qua việc tối ưu hóa cho một kiến trúc hệ thống cụ thể. *Hình phạt trừu tượng* là chi phí mà các kỹ thuật lập trình cấp cao phải trả cho việc không thể tối ưu hóa hiệu suất hoặc sử dụng một số phần cứng nhất định vì chúng không tận dụng được một số tài nguyên kiến trúc cấp thấp nhất định. Lập trình cấp cao thể hiện các tính năng như cấu trúc và hoạt động dữ liệu chung hơn, diễn giải thời gian chạy và tệp mã trung gian; thường dẫn đến việc thực hiện nhiều hoạt động hơn mức cần thiết, tiêu thụ bộ nhớ cao hơn và kích thước chương trình nhị phân lớn hơn. Vì lý do này, mã cần chạy đặc biệt nhanh chóng và hiệu quả có thể yêu cầu sử dụng ngôn ngữ cấp thấp hơn, ngay cả khi ngôn ngữ cấp cao hơn sẽ làm cho việc viết mã dễ dàng hơn. Trong nhiều trường hợp, các phần quan trọng của chương trình chủ yếu bằng ngôn ngữ cấp cao có thể được mã hóa thủ công bằng hợp ngữ, dẫn đến một chương trình được tối ưu hóa hoạt động nhanh hơn, hiệu quả hơn hoặc đơn giản là hoạt động đáng tin cậy.

Tuy nhiên, với sự phức tạp ngày càng tăng của các kiến trúc vi xử lý hiện đại, các trình biên dịch được thiết kế tốt cho các ngôn ngữ cấp cao thường tạo ra mã hiệu quả tương đương với những gì mà hầu hết các lập trình viên cấp thấp có thể tạo ra bằng tay và độ trừu tượng cao hơn có thể cho phép các kỹ thuật mạnh mẽ hơn cung cấp tốt hơn kết quả tổng thể hơn so với các đối tác cấp thấp của chúng trong các cài đặt cụ thể. Các ngôn ngữ cấp cao được thiết kế độc lập với một kiến trúc hệ thống máy tính cụ thể. Điều này tạo điều kiện thuận lợi cho việc thực thi một chương trình được viết bằng ngôn ngữ như vậy trên bất kỳ hệ thống máy tính nào có hỗ trợ tương thích cho chương trình Được thông dịch hoặc JIT. Các ngôn ngữ cấp cao có thể được cải thiện khi các nhà thiết kế của họ phát triển các cải tiến. Trong các trường hợp khác, các ngôn ngữ cấp cao mới phát triển từ một hoặc nhiều ngôn ngữ khác với mục tiêu tổng hợp các cấu trúc phổ biến nhất với các tính năng mới hoặc cải tiến. Một ví dụ về điều này là Scala duy trì khả năng tương thích ngược với Java có nghĩa là các chương trình và thư viện được viết bằng Java sẽ tiếp tục sử dụng được ngay cả khi một cửa hàng lập trình chuyển sang Scala; điều này làm cho quá trình chuyển đổi dễ dàng hơn và tuổi thọ của mã hóa cấp cao như vậy là vô thời hạn. Ngược lại, các chương trình cấp thấp hiếm khi tồn tại ngoài kiến trúc hệ thống mà chúng được viết cho mà không cần sửa đổi lớn. Đây là kỹ thuật 'đánh đổi' cho 'Hình phạt vì việc trừu tượng hóa'.

## Ý nghĩa tương đối

Ví dụ về các ngôn ngữ lập trình cấp cao đang được sử dụng hiện nay bao gồm Python, Visual Basic, Delphi, Perl, PHP, ECMAScript, Ruby, C #, Java và nhiều ngôn ngữ khác.

Các thuật ngữ *cấp cao và cấp* *thấp* vốn là tương đối. Vài thập kỷ trước, ngôn ngữ C và các ngôn ngữ tương tự thường được coi là "cấp cao", vì nó hỗ trợ các khái niệm như đánh giá biểu thức, các hàm đệ quy được tham số hóa, các kiểu dữ liệu và cấu trúc, trong khi hợp ngữ được coi là "cấp thấp ". Ngày nay, nhiều lập trình viên có thể coi C là cấp thấp, vì nó thiếu hệ thống thời gian chạy lớn (không có bộ thu gom rác, v.v.), về cơ bản chỉ hỗ trợ các hoạt động vô hướng và cung cấp địa chỉ bộ nhớ trực tiếp. Do đó, nó dễ dàng kết hợp với hợp ngữ và cấp độ máy của CPU và vi điều khiển.

Bản thân ngôn ngữ hợp ngữ có thể được coi là một biểu diễn cấp cao hơn (nhưng thường vẫn là một đối một nếu được sử dụng không có macro) của mã máy, vì nó hỗ trợ các khái niệm như hằng số và biểu thức (giới hạn), đôi khi thậm chí cả biến, thủ tục và dữ liệu cấu trúc. Đổi lại, mã máy vốn ở cấp độ cao hơn một chút so với mã vi mô hoặc các hoạt động vi mô được sử dụng nội bộ trong nhiều bộ vi xử lý.

## Chế độ thực thi

Có ba phương thức thực thi chung cho các ngôn ngữ cấp cao hiện đại:

Thông dịch
Khi mã viết bằng một ngôn ngữ được thông dịch, cú pháp của nó được đọc và sau đó được thực thi trực tiếp, không có giai đoạn biên dịch. Một chương trình được gọi là trình *thông dịch* đọc từng câu lệnh của chương trình, theo dòng chương trình, sau đó quyết định phải làm gì và thực hiện nó. Sự kết hợp giữa trình thông dịch và trình biên dịch sẽ biên dịch câu lệnh thành mã máy và thực thi điều đó; mã máy sau đó sẽ bị loại bỏ, sẽ được giải thích lại nếu dòng được thực thi lại. Thông dịch viên thường là cách triển khai đơn giản nhất của hành vi của một ngôn ngữ, so với hai biến thể khác được liệt kê ở đây.
Tổng hợp
Khi mã được viết bằng một ngôn ngữ được biên dịch, cú pháp của nó sẽ được chuyển đổi thành một dạng thực thi trước khi chạy. Có hai kiểu biên dịch:
Tạo mã máy
Một số trình biên dịch biên dịch mã nguồn trực tiếp thành mã máy. Đây là phương thức biên dịch ban đầu và các ngôn ngữ được chuyển đổi trực tiếp và hoàn toàn sang mã gốc máy theo cách này có thể được gọi là các ngôn ngữ *được biên dịch thực sự*. Xem hợp ngữ.
Đại diện trung gian
Khi mã viết bằng một ngôn ngữ được biên dịch sang một biểu diễn trung gian, biểu diễn đó có thể được tối ưu hóa hoặc lưu để thực thi sau này mà không cần đọc lại tệp nguồn. Khi biểu diễn trung gian được lưu, nó có thể ở một dạng chẳng hạn như bytecode. Biểu diễn trung gian sau đó phải được giải thích hoặc biên dịch thêm để thực thi nó. Các máy ảo thực thi bytecode trực tiếp hoặc biến đổi nó thành mã máy đã xóa mờ sự phân biệt rõ ràng từng có giữa các biểu diễn trung gian và các ngôn ngữ được biên dịch thực sự.
Dịch hoặc biên dịch từ nguồn sang nguồn
Mã được viết bằng một ngôn ngữ có thể được dịch sang các thuật ngữ của ngôn ngữ cấp thấp hơn mà các trình biên dịch mã gốc đã phổ biến. JavaScript và ngôn ngữ C là những mục tiêu chung cho những người dịch như vậy. Xem CoffeeScript, Chicken Scheme và Eiffel làm ví dụ. Cụ thể, có thể thấy mã C và C ++ được tạo (như được tạo từ ngôn ngữ Eiffel khi sử dụng EiffelStudio IDE) trong thư mục EIFGENs của bất kỳ dự án Eiffel đã biên dịch nào. Trong Eiffel, quy trình đã *dịch* được gọi là biên dịch hoặc biên dịch, và trình biên dịch Eiffel là trình biên dịch hoặc trình biên dịch từ nguồn sang nguồn.
Lưu ý rằng các ngôn ngữ không phải là ngôn ngữ thuần *thông dịch* hoặc ngôn ngữ thuần *biên dịch*. Đúng hơn, việc triển khai hành vi ngôn ngữ sử dụng thông dịch hoặc biên dịch. Ví dụ: ALGOL 60 và Fortran đều đã được thông dịch (mặc dù chúng được biên dịch thường xuyên hơn). Tương tự, Java cho thấy khó khăn khi cố gắng áp dụng các nhãn này cho các ngôn ngữ, thay vì cho các triển khai; Java được biên dịch thành bytecode, sau đó được thực thi bằng cách thông dịch (trong máy ảo Java (JVM)) hoặc biên dịch (thường là với một trình biên dịch chỉ trong thời gian như HotSpot, một lần nữa trong JVM). Hơn nữa, biên dịch, biên dịch và thông dịch không hoàn toàn giới hạn ở chỉ một mô tả của tạo tác trình biên dịch (thực thi nhị phân hoặc hợp ngữ IL).

### Kiến trúc máy tính ngôn ngữ cấp cao

Ngoài ra, một ngôn ngữ cấp cao có thể được thực hiện trực tiếp bởi máy tính - máy tính trực tiếp thực thi mã HLL. Đây được gọi là *kiến trúc máy tính ngôn ngữ cấp cao* - bản thân kiến trúc máy tính được thiết kế để nhắm mục tiêu theo một ngôn ngữ cấp cao cụ thể. Ví dụ, các hệ thống lớn của Burroughs là máy đích cho ALGOL 60.

## Liên kết ngoài

*  - The WikiWikiWeb's article on high-level programming languages

## Tham khảo