Trong lĩnh vực khoa học máy tính, một ngôn ngữ lập trình cấp cao (tiếng Anh: high-level programming language) là loại ngôn ngữ lập trình được trừu tượng hóa mạnh mẽ khỏi các chi tiết phần cứng của máy tính. So với các ngôn ngữ lập trình cấp thấp (low-level programming language), ngôn ngữ cấp cao có thể sử dụng các yếu tố ngôn ngữ gần gũi với con người hơn, dễ sử dụng hơn, và có khả năng tự động hóa hoặc che giấu hoàn toàn những khía cạnh quan trọng của hệ thống điện toán (như quản lý bộ nhớ), giúp đơn giản hóa và làm cho quá trình phát triển phần mềm trở nên dễ hiểu hơn so với ngôn ngữ bậc thấp. Mức độ trừu tượng hóa xác định mức độ cao của một ngôn ngữ lập trình.
Trong thập niên 1960, các ngôn ngữ lập trình cấp cao sử dụng trình biên dịch thường được gọi là autocode (mã tự động). Một số ví dụ về 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, do Konrad Zuse phát triển. Mặc dù nó không được thực hiện trong thời kỳ của ông và đóng góp của ông phần lớn bị ảnh hưởng bởi Thế chiến thứ hai, nó đã ảnh hưởng đến ngôn ngữ 'Superplan' của Heinz Rutishauser và một phần đến Algol. Ngôn ngữ cấp cao đầu tiên có ảnh hưởng rộng rãi là Fortran, phát triển từ hệ thống Autocode của IBM. Algol, được định nghĩa vào năm 1958 và 1960 bởi các ủy ban của các nhà khoa học máy tính châu Âu và Mỹ, đã giới thiệu khái niệm đệ quy và các hàm lồng nhau trong phạm vi từ vựng. Đây cũng là ngôn ngữ đầu tiên phân biệt rõ ràng giữa giá trị và tên của tham số cùng với ngữ nghĩa tương ứng. Algol cũng giới thiệu các khái niệm lập trình cấu trúc 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). Cùng thời kỳ đó, Cobol giới thiệu các bản ghi (hay còn gọi là cấu trúc) và Lisp là ngôn ngữ đầu tiên đưa ra khái niệm trừu tượng lambda tổng quát đầy đủ.
Đặc điểm chính
'Ngôn ngữ lập trình cấp cao' đề cập đến mức độ trừu tượng cao hơn so với ngôn ngữ máy. Thay vì phải làm việc trực tiếp với các thanh ghi, địa chỉ bộ nhớ và ngăn xếp cuộc gọi, các ngôn ngữ cấp cao cho phép 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 trừu tượng khác trong khoa học máy tính. Chúng tập trung vào sự thuận tiện và dễ sử dụng hơn là hiệu quả tối ưu của chương trình. Khác với các ngôn ngữ hợp ngữ cấp thấp, ngôn ngữ cấp cao thường không có các phần tử có thể dịch trực tiếp sang mã opcodes của máy. Chúng có thể bao gồm các tính năng như xử lý chuỗi, hướng đối tượng và đầu vào/đầu ra tệp. Các ngôn ngữ lập trình bậc cao giúp lập trình viên làm việc mà không cần quan tâm nhiều đến máy tính, cho phép máy thực hiện nhiều công việc tốn công sức mà lập trình viên không cần phải biết.
Chi phí của sự trừu tượng hóa
Các ngôn ngữ lập trình cấp cao được thiết kế để chuẩn hóa các nhiệm vụ phổ biến, cung cấp khả năng gỡ lỗi phong phú và duy trì sự không phụ thuộc vào kiến trúc cụ thể. Ngược lại, các ngôn ngữ cấp thấp thường tạo ra mã hiệu quả hơn bằng cách tối ưu hóa cho một kiến trúc hệ thống cụ thể. Chi phí của sự trừu tượng hóa là giá phải trả khi các kỹ thuật lập trình cấp cao không thể tối ưu hóa hiệu suất hoặc tận dụng một số phần cứng cụ thể vì chúng không khai thác được các tài nguyên cấp thấp. Lập trình cấp cao có thể làm tăng số lượng hoạt động cần thiết, tiêu tốn nhiều bộ nhớ hơn và làm cho kích thước chương trình lớn hơn. Do đó, mã cần hiệu suất cao có thể yêu cầu sử dụng ngôn ngữ cấp thấp hơn, dù rằng ngôn ngữ cấp cao giúp việc lập trình 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 bằng ngôn ngữ cấp cao có thể được viết bằng hợp ngữ để tối ưu hóa hiệu suất.
Tuy nhiên, với sự phát triển của các kiến trúc vi xử lý hiện đại, các trình biên dịch cho ngôn ngữ cấp cao ngày nay có thể tạo ra mã hiệu quả tương đương với những gì lập trình viên cấp thấp có thể làm bằng tay. Mức độ trừu tượng cao hơn cũng có thể cho phép sử dụng các kỹ thuật mạnh mẽ hơn để đạt được kết quả tổng thể tốt hơn so với các ngôn ngữ cấp thấp trong một số tình huống cụ thể. Các ngôn ngữ cấp cao được thiết kế để hoạt động độc lập với kiến trúc máy tính cụ thể, giúp chúng có thể chạy trên bất kỳ hệ thống máy tính nào hỗ trợ tương thích với chương trình thông qua thông dịch hoặc JIT. Các ngôn ngữ này có thể được cải tiến qua thời gian nhờ vào sự phát triển của các nhà thiết kế. Một số 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 và thêm các tính năng mới hoặc cải tiến. Ví dụ, Scala duy trì sự tương thích ngược với Java, cho phép các chương trình và thư viện Java vẫn hoạt động khi chuyển sang Scala, làm cho quá trình chuyển đổi dễ dàng và kéo dài tuổi thọ của mã. 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 điều chỉnh lớn.
Ý nghĩa tương đối
Một số ngôn ngữ lập trình cấp cao phổ biến 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à khái niệm 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ì chúng hỗ trợ các khái niệm như biểu thức, hàm đệ quy với tham số, kiểu dữ liệu và cấu trúc, trong khi hợp ngữ được coi là 'cấp thấp'. Hiện nay, nhiều lập trình viên có thể xem C là cấp thấp hơn vì nó thiếu hệ thống thời gian chạy phức tạp (không có bộ thu gom rác, v.v.), chỉ hỗ trợ các hoạt động vô hướng và cung cấp địa chỉ bộ nhớ trực tiếp, khiến nó dễ dàng kết hợp với hợp ngữ và các cấp độ máy tính khác.
Ngôn ngữ hợp ngữ có thể được xem là một dạng biểu diễn cấp cao hơn (nhưng thường là một-một nếu không dùng 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 (với một số giới hạn), đôi khi cả biến, thủ tục và dữ liệu cấu trúc. Ngược lại, mã máy thường nằm ở mức 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
Hiện nay, có ba phương pháp phổ biến để thực thi các ngôn ngữ cấp cao:
- 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ó sẽ được đọc và thực thi trực tiếp mà không qua giai đoạn biên dịch. Trình thông dịch sẽ đọc từng câu lệnh theo thứ tự, quyết định hành động cần thực hiện và thực thi ngay lập tức. Kết hợp giữa trình thông dịch và trình biên dịch có thể biến câu lệnh thành mã máy và thực thi, sau đó mã máy có thể bị loại bỏ và cần được giải thích lại nếu câu lệnh đó được thực hiện lại. Phương pháp thông dịch thường đơn giản hơn so với các phương pháp biên dịch khác.
- 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ó đượ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 chuyển mã nguồn trực tiếp thành mã máy. Đây là phương pháp biên dịch ban đầu và các ngôn ngữ chuyển trực tiếp sang mã máy có thể được gọi là các ngôn ngữ được biên dịch thực sự. Xem hợp ngữ để biết thêm chi tiết.
- Đại diện trung gian
- Khi mã được biên dịch sang một biểu diễn trung gian, 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 mã nguồn. Biểu diễn trung gian có thể ở dạng bytecode, và nó cần được giải thích hoặc biên dịch thêm để thực thi. Máy ảo có thể thực thi bytecode trực tiếp hoặc chuyển đổi nó thành mã máy, làm mờ sự phân biệt giữa các biểu diễn trung gian và các ngôn ngữ biên dịch thực sự.
Lưu ý rằng không có ngôn ngữ nào hoàn toàn là thông dịch hay biên dịch. Thay vào đó, hành vi của ngôn ngữ có thể được triển khai bằng cách sử dụng thông dịch hoặc biên dịch. Ví dụ, ALGOL 60 và Fortran đã từng được thông dịch, mặc dù hiện tại chúng thường được biên dịch. Java cũng gặp khó khăn khi áp dụng các nhãn này cho ngôn ngữ, thay vì cho các triển khai; Java được biên dịch thành bytecode, sau đó có thể đượ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 trình biên dịch chỉ trong thời gian như HotSpot, 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 bị giới hạn trong một mô tả duy nhất của các tác phẩm trình biên dịch.
Một ngôn ngữ cấp cao có thể được thực thi trực tiếp bởi máy tính mà không cần qua trung gian - máy tính có thể trực tiếp thực hiện mã HLL. Điều này được gọi là kiến trúc máy tính ngôn ngữ cấp cao, tức là kiến trúc máy tính được thiết kế để hỗ trợ một ngôn ngữ cấp cao cụ thể. Ví dụ, các hệ thống lớn của Burroughs là những máy tính được thiết kế để chạy ALGOL 60.
Liên kết ngoài
- http://c2.com/cgi/wiki?HighLevelLanguage - Bài viết của WikiWikiWeb về các ngôn ngữ lập trình cấp cao
Mẫu hình lập trình | |
---|---|
Paradigm |
|
Cấp độ |
|
Có liên quan |
|