JavaRush /Blog Java /Random-VI /Các cấp độ của ngôn ngữ lập trình
Marat Sadykov
Mức độ

Các cấp độ của ngôn ngữ lập trình

Xuất bản trong nhóm

Giới thiệu

Các ngôn ngữ lập trình khác nhau là gì? Những loại khái niệm nào được nhúng trong chúng? Họ đã phát triển như thế nào? Trong bài viết này, chúng ta sẽ xem xét các loại ngôn ngữ lập trình dựa trên cái gọi là cấp độ - từ mã máy (cấp thấp, gần với phần cứng máy tính) đến các ngôn ngữ như Java hay C# (cấp cao). Danh sách văn bản của chương trình càng trải qua ít biến đổi trong quá trình chuyển thành tập hợp các số 0 và số 1 thì cấp độ càng thấp.
Các cấp độ của ngôn ngữ lập trình - 1
Tiếp theo chúng ta sẽ xem xét:
  1. Ngôn ngữ cấp thấp (mã máy và hợp ngữ)
  2. Trình độ trung cấp (C, Fortran….)
  3. Trình độ cao (C++, Java, Python, Ruby, JavaScript...)
Cấp độ này cũng đặc trưng cho mức độ chi tiết của danh sách chương trình trong tương lai cần phải chi tiết để triển khai thực hiện. Quá trình này đơn giản như thế nào đối với con người? Trình độ của một ngôn ngữ không nên được coi là một chỉ số rõ ràng về khả năng của nó. Ngôn ngữ lập trình là một công cụ có hiệu quả trong một lĩnh vực và ít hữu ích hơn trong các lĩnh vực khác. Cả thợ mộc và thợ mộc đều làm việc với gỗ. Cái đầu tiên có một công cụ chính - một bộ đục, cái thứ hai - một cái rìu. Tuy nhiên, thợ mộc sẽ làm cho chiếc tủ chạm khắc trở nên trang nhã hơn, còn thợ mộc sẽ xây nhà nhanh hơn. Mặc dù mỗi người có khả năng làm công việc của người kia nhưng họ sẽ làm việc đó kém hiệu quả hơn nhiều. Nhiều dữ liệu khác nhau trong máy tính được biểu diễn dưới dạng tập hợp số 0 và số 1. Các lệnh điều khiển để xử lý nó là cùng một dữ liệu chứa các hướng dẫn xác định vị trí của thông tin cần thiết và phương pháp sửa đổi.

Ngôn ngữ máy (Mức thấp nhất)

Chúng ta sẽ phải thực hiện một chuyến tham quan ngắn từ khu vực Phần mềm đến khu vực Phần cứng. Hãy nhìn vào nó ở dạng đơn giản. Bộ xử lý là “bộ não” chính của máy tính. Bo mạch chủ nơi nó được cài đặt chứa các bộ điều khiển được sử dụng để tương tác với các thiết bị khác thông qua bus (kênh dữ liệu để liên lạc).
Cấp độ ngôn ngữ lập trình - 2
Một số hoạt động ở tốc độ cao (mũi tên màu đỏ): bộ xử lý rút lệnh từ bộ nhớ và thao tác dữ liệu, card màn hình, đặc biệt là trong các trò chơi 3D, tiêu thụ một lượng lớn kết cấu, hình dạng, tọa độ pixel và các đối tượng khác để tạo hình ảnh trên màn hình điều khiển . Những người khác (do hạn chế về tốc độ trao đổi thông tin) không cần chỉ số cao như vậy. Nhiều thiết bị bên trong và bên ngoài khác nhau được kết nối trong sơ đồ bằng mũi tên màu xanh lá cây.

Thế giới bên trong bộ xử lý

Tất cả các lệnh của bộ xử lý đều đến từ bộ nhớ để thực thi ở dạng nhị phân. Định dạng, số lượng, tập hợp con của lệnh phụ thuộc vào kiến ​​trúc của nó. Hầu hết trong số họ không tương thích với nhau và theo những hệ tư tưởng khác nhau. Và loại lệnh cũng phụ thuộc nhiều vào chế độ (8/16/32... độ sâu bit) và nguồn dữ liệu (bộ nhớ, thanh ghi, ngăn xếp...) mà bộ xử lý hoạt động. Hành động tương tự có thể được thể hiện bằng các hướng dẫn khác nhau. Bộ xử lý có hướng dẫn để thêm hai toán hạng (ADD X,Y) và thêm một toán hạng vào toán hạng đã chỉ định (INC X). Việc thêm bộ ba vào toán hạng có thể được thực hiện dưới dạng ADD X,3 hoặc bằng cách gọi INC X ba lần. Và đối với các bộ xử lý khác nhau, không thể dự đoán phương pháp nào trong số này sẽ tối ưu về tốc độ hoặc dung lượng bộ nhớ. Để thuận tiện, thông tin nhị phân được viết ở dạng thập lục phân. Hãy xem xét một phần của chương trình quen thuộc (ngôn ngữ C, cú pháp tương tự như Java)
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
Mã thực hiện các hành động tương tự dưới dạng một chuỗi hướng dẫn cho bộ xử lý: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... Đây thực tế là ngôn ngữ lập trình cấp thấp dành cho bộ xử lý Intel. Một đoạn gọi một phương thức có đối số và trả về kết quả tăng thêm một. Đây là ngôn ngữ máy (mã), được truyền trực tiếp, không cần biến đổi, tới bộ xử lý để thực thi. Ưu điểm:
  • Chúng tôi hoàn toàn làm chủ được tình hình, chúng tôi có nhiều khả năng sử dụng bộ xử lý và phần cứng máy tính nhất.
  • Tất cả các tùy chọn để tổ chức và tối ưu hóa mã đều có sẵn cho chúng tôi.
Nhược điểm:
  • Cần phải có kiến ​​thức sâu rộng về hoạt động của bộ xử lý và tính đến một số lượng lớn các yếu tố phần cứng khi thực thi mã.
  • Việc tạo các chương trình phức tạp hơn một chút so với ví dụ đã cho sẽ làm tăng đáng kể thời gian dành cho việc viết mã và gỡ lỗi.
  • Sự phụ thuộc vào nền tảng: một chương trình được tạo cho một bộ xử lý thường sẽ không hoạt động trên các bộ xử lý khác. Có thể đối với bộ xử lý này, ở các chế độ hoạt động khác, việc chỉnh sửa mã sẽ được yêu cầu.
Mã máy được sử dụng rộng rãi vào buổi bình minh của máy tính; không có phương pháp lập trình nào khác trong thời đại của những người tiên phong về máy tính. Hiện tại, chúng đôi khi được các kỹ sư trong lĩnh vực vi điện tử sử dụng khi phát triển hoặc thử nghiệm bộ xử lý ở mức độ thấp.

Hợp ngữ (trình độ thấp)

Không giống như máy tính, bạn và tôi tiếp nhận thông tin tốt hơn ở dạng văn bản/ngữ nghĩa hơn là ở dạng kỹ thuật số. Bạn có thể dễ dàng gọi tên năm mươi tên liên lạc trên điện thoại thông minh của mình, nhưng bạn khó có thể viết thuộc lòng số điện thoại tương ứng của họ. Lập trình cũng vậy. Chúng tôi tiến lên bậc thang loại bằng cách thực hiện ba bước cơ bản:
  • Chúng ta hãy liên kết một lệnh tượng trưng với các nhóm lệnh của bộ xử lý kỹ thuật số thực hiện các hành động tương ứng.
  • Hãy làm nổi bật các đối số của hướng dẫn bộ xử lý một cách riêng biệt.
  • Hãy giới thiệu khả năng đặt tên vùng bộ nhớ, biến và vị trí của từng lệnh.
Hãy so sánh các đoạn của chương trình trước đó bằng mã máy (ở giữa) và bằng hợp ngữ (phải):
2004b0     48 83 ec 08      sub    $0x8,%rsp
2004b4     bf bc 05 20 00   mov    $0x2005bc,%edi
2004b9     31 c0            xor    %eax,%eax
2004bb     e8 e8 fe ff ff   callq  getData
2004c0     48 83 c4 08      add    $0x8,%rsp
2004c4     83 c0 01         add    $0x1,%eax
Như bạn có thể thấy, quy trình viết chương trình đã được đơn giản hóa: không cần sử dụng sách tham khảo để tạo các giá trị lệnh kỹ thuật số, tính toán độ dài chuyển tiếp, phân phối dữ liệu trong bộ nhớ trên các ô của nó và các tính năng bộ xử lý khác. Chúng tôi mô tả hành động cần thiết từ một tập hợp các lệnh tượng trưng và các đối số cần thiết cho logic thực thi, sau đó chương trình dịch sẽ dịch tệp văn bản thành một tập hợp các số 0 và các số mà bộ xử lý có thể hiểu được. Ưu điểm:
  • Quá trình viết và sửa đổi mã đã được đơn giản hóa.
  • Kiểm soát tất cả các tài nguyên phần cứng được duy trì.
  • Việc chuyển chương trình sang các nền tảng khác tương đối dễ dàng hơn nhưng chúng yêu cầu sửa đổi tùy thuộc vào khả năng tương thích của phần cứng.
Nhược điểm:
  • Hợp ngữ là ngôn ngữ lập trình cấp thấp. Việc tạo ra những phần mã nhỏ cũng khó khăn. Ngoài ra, cũng cần tính đến hoạt động cụ thể của thiết bị.
  • Sự phụ thuộc vào nền tảng.
Ví dụ demo Java phổ biến nhất:
public static void main(String[] args) {
    System.out.println("Hello World!");
}
sẽ xem xét (cú pháp NASM, sử dụng Windows API và kernel32.lib) như sau:
global _main
	extern  _GetStdHandle@4
	extern  _WriteFile@20
	extern  _ExitProcess@4

	section .text
_main:
	; DWORD  bytes;
	mov 	ebp, esp
	sub 	esp, 4

	; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
	push	-11
	call	_GetStdHandle@4
	mov 	ebx, eax

	; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push	0
	lea 	eax, [ebp-4]
	push	eax
	push	(message_end - message)
	push	message
	push	ebx
	call	_WriteFile@20

	; ExitProcess(0)
	push	0
	call	_ExitProcess@4

	; never here
	hlt
message:
	db  	'Hello, World', 10
message_end:
Giống như mã máy, hợp ngữ thường được các kỹ sư và lập trình viên hệ thống sử dụng nhiều hơn. Nó được sử dụng để ghi các phần phụ thuộc vào phần cứng của nhân hệ điều hành quan trọng về mặt thời gian hoặc quan trọng đối với các tính năng triển khai của trình điều khiển cho các thiết bị ngoại vi khác nhau. Nhưng gần đây họ ngày càng ít sử dụng đến nó hơn, vì việc sử dụng nó làm giảm đáng kể khả năng di chuyển của các chương trình sang các nền tảng khác. Đôi khi, họ sử dụng quy trình tháo gỡ - họ tạo danh sách trình biên dịch chương trình từ các mã kỹ thuật số để phân tích logic nhằm thực thi các đoạn nhỏ. Trong một số trường hợp hiếm hoi, nếu không có mã cấp cao ban đầu: phân tích vi-rút để chống lại chúng hoặc mất mã nguồn. Hợp ngữ được coi là thế hệ thứ nhất/thứ hai (chúng tôi sẽ không xem xét các mã giả riêng biệt trước khi xuất hiện trình biên dịch mã và sự khác biệt của chúng với các lệnh tượng trưng). Tôi muốn nhấn mạnh việc sử dụng trình biên dịch mã trong Cảnh demo: sự kết hợp giữa nghệ thuật, toán học và mã hóa cấp độ thấp, thể hiện ý tưởng nghệ thuật của người tạo ra chúng dưới dạng chương trình tạo ra các video clip có giới hạn về tài nguyên. Thường thì tổng kích thước của tệp chương trình và dữ liệu không được vượt quá 256 byte (định dạng 4/64 kilobyte cũng phổ biến). Dưới đây là ví dụ về chương trình 4 KB:

Nhóm ngôn ngữ C/Fortran (trung cấp/cao cấp)

Với sự phát triển về khả năng của công nghệ máy tính, số lượng chức năng và thời gian thực hiện mã trong trình biên dịch mã không còn thỏa đáng nữa. Chi phí viết, kiểm tra và bảo trì chương trình tăng nhanh hơn rất nhiều so với khả năng của chúng. Cần phải giảm bớt các yêu cầu đối với người lập trình về kiến ​​​​thức về hoạt động của thiết bị, cung cấp cho anh ta một công cụ cho phép anh ta viết bằng các ngôn ngữ gần với logic của con người. Chuyển sang một cấp độ mới của các loại ngôn ngữ lập trình. Cung cấp khả năng chia thành các mô-đun khác nhau với khả năng gọi tuần tự hơn nữa (mô hình lập trình thủ tục), cung cấp nhiều loại dữ liệu khác nhau với khả năng xây dựng chúng, v.v. Ngoài ra, các biện pháp này đã mang lại khả năng di chuyển mã được cải thiện sang các nền tảng khác, tổ chức thoải mái hơn làm việc nhóm. Một trong những ngôn ngữ đầu tiên hỗ trợ tất cả những điều trên là Fortran, được phát triển vào những năm 50 của thế kỷ trước . Khả năng tạo ở dạng văn bản với mô tả logic thực thi bằng cách sử dụng các vòng lặp, nhánh, chương trình con và thao tác với mảng cũng như trình bày dữ liệu dưới dạng số thực, số nguyên và số phức khiến các kỹ sư và nhà khoa học hài lòng. Trong một thời gian ngắn, các “khuôn khổ” và thư viện khoa học đã được tạo ra. Tất cả điều này là hệ quả của việc Fortran vẫn còn phù hợp cho đến ngày nay, mặc dù trong một môi trường khoa học hạn hẹp và đang phát triển, vì khối lượng phát triển là rất lớn, chỉ riêng thư viện IMSL đã tích cực phát triển kể từ năm 1970 (!), làm thế nào bạn có nhớ được nhiều phần mềm liên quan tương tự không? -old-timers? Một nhánh phát triển ngôn ngữ khác ở cấp độ này là C. Nếu Fortran trở thành công cụ dành cho các nhà khoa học thì C được tạo ra để giúp các lập trình viên tạo ra phần mềm ứng dụng: hệ điều hành, trình điều khiển, v.v. Ngôn ngữ cho phép bạn kiểm soát việc phân bổ bộ nhớ theo cách thủ công và cấp quyền truy cập trực tiếp vào tài nguyên phần cứng. Lập trình viên C phải điều khiển các thực thể cấp thấp nên nhiều người cho rằng C là ngôn ngữ hợp ngữ nâng cao và thường được gọi là ngôn ngữ “cấp trung”. Sau khi đưa dữ liệu vào trình biên dịch chương trình, các thành phần của lập trình thủ tục và mô-đun, ngôn ngữ C vẫn là một trong những ngôn ngữ chính để lập trình hệ thống, điều này cũng được tạo điều kiện thuận lợi bởi sự phát triển nhanh chóng của vi điện tử trong những năm gần đây. Tất cả các loại tiện ích, bộ điều khiển, mạng và các thiết bị khác đều cần trình điều khiển, triển khai các giao thức cộng tác và phần mềm cấp tương đối thấp khác để thực hiện tương tác với thiết bị. Tất cả những điều trên góp phần tạo nên nhu cầu về ngôn ngữ ngày nay. Các nguyên tắc chức năng và hướng đối tượng được phát triển sâu hơn dưới dạng C++, C#, Java, lấy nhiều từ cú pháp C.
  • Đơn giản hóa quá trình tạo mã: giới thiệu các loại, phân chia thành các mô-đun, giảm bớt danh sách chương trình.
  • Прозрачная логика заложенного алгоритма вследствие ухода от машинных codeов к более понятным для человека командам в семантически описательном стиле.
  • Переносимость. Стало достаточно перекомпorровать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
  • Скорость откомпorрованных программ.
Минусы:
  • Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
  • Отсутствие реализации концепций an objectно-ориентированного и функционального программирования.

Развитие языков высокого уровня

Các ngôn ngữ lập trình cấp cao, về mặt tạo ra phần mềm, ngày càng bắt đầu rời xa mã máy và triển khai các mô hình lập trình khác nhau bên cạnh các mô hình thủ tục. Chúng cũng bao gồm việc thực hiện các nguyên tắc hướng đối tượng. C++, Java, Python, JavaScript, Ruby... - các ngôn ngữ thuộc loại này là phổ biến nhất và có nhu cầu hiện nay. Chúng mang lại nhiều cơ hội hơn để triển khai nhiều loại phần mềm và không thể xác định rõ ràng “chuyên môn” của từng phần mềm. Nhưng sự phổ biến của ứng dụng trong các lĩnh vực liên quan là do các thư viện/framework để làm việc với chúng, ví dụ: JavaScript - Frontend. Ngôn ngữ được thiết kế để tương tác giữa trình duyệt web của khách hàng với người dùng và máy chủ từ xa. Các thư viện phổ biến nhất là Angular, React và VUE. Hiện tại, nó được sử dụng tương đối tích cực trên web và các máy chủ (phụ trợ) khác, Node.js đặc biệt phổ biến. Ruby - Phần cuối. Nó được sử dụng để tạo tập lệnh (tệp dịch vụ) và trên máy chủ web. Khung chính là Ruby On Rails. Python là lĩnh vực khoa học và kỹ thuật (bên cạnh lĩnh vực web). Nó là một giải pháp thay thế cho các gói toán học và tính toán tiêu chuẩn (Mathematica, Octave, MatLab...), nhưng có ngữ nghĩa thông thường của ngôn ngữ và một số lượng lớn các thư viện. Có nhiều người hâm mộ trong lĩnh vực hệ thống máy học, thống kê và trí tuệ nhân tạo. Các thư viện được sử dụng thường xuyên bao gồm django, numpy, pandas và tensorflow. C++ – Sự phát triển mang tính tiến hóa, phổ biến của ngôn ngữ C. Cung cấp khả năng lập trình hướng đối tượng và chức năng mà không làm mất khả năng tương tác với phần cứng cấp thấp. Do đó, năng suất và tính linh hoạt được hiện thực hóa khi tạo phần mềm, nhưng giá cả cũng tương ứng: rào cản gia nhập cao do đặc điểm kỹ thuật phức tạp của ngôn ngữ, nhu cầu kiểm soát độc lập các tài nguyên khi thực hiện chương trình. Nhiều phần mềm hệ thống và người dùng đơn được viết bằng nó: mô-đun hệ điều hành (Windows, Symbian...), trò chơi, trình soạn thảo (Adobe Photoshop, Autodesk Maya...), cơ sở dữ liệu (MSSQL, Oracle...), trình phát ( WinAmp...), v.v. Cần lưu ý rằng phần mềm hiện đại là một sản phẩm phức tạp, việc phát triển phần mềm này sử dụng nhiều ngôn ngữ lập trình cùng một lúc và có thể rất khó xác định mức độ tham gia của từng ngôn ngữ đó vào kết quả chung.

Tiến bộ hơn nữa

Gần đây, một loại lập trình khác đang trở nên phổ biến - chức năng (phát triển hơn nữa về trình độ ngôn ngữ) . Đây là một kiểu trừu tượng khác cho các phép tính - các hàm lấy một tập hợp các hàm làm đối số và trả về một hàm khác. Vai trò của các biến được thực hiện bởi các hàm giống nhau (các biến quen thuộc với chúng ta chỉ đơn giản là các biểu thức hằng, tương tự như biến cuối cùng trước khi khai báo kiểu trong Java). Bản thân hàm này được đóng trong phạm vi của nó, kết quả hoạt động của nó chỉ phụ thuộc vào các đối số được truyền. Hai đặc tính đáng chú ý theo sau:
  • Để kiểm tra, chúng ta chỉ cần các đối số hàm (kết quả của công việc không phụ thuộc vào các biến bên ngoài, v.v.).
  • Một chương trình kiểu chức năng sẵn sàng đồng thời một cách kỳ diệu: các lệnh gọi hàm tuần tự có thể được thực hiện trong các luồng lân cận (vì chúng không bị ảnh hưởng bởi các yếu tố bên ngoài) và không yêu cầu khóa (nghĩa là không có vấn đề đồng bộ hóa). Một động lực tốt để dành thời gian cho chủ đề này nhờ việc áp dụng rộng rãi bộ xử lý đa lõi.
Tuy nhiên, ngưỡng đầu vào cao hơn so với OOP: để mã hiệu quả cần phải xây dựng một chương trình, mô tả thuật toán thực thi dưới dạng hàm. Nhưng đối với phong cách chức năng thuần túy, sẽ rất tốt nếu biết những điều cơ bản về logic và lý thuyết phạm trù. Phổ biến nhất là Haskell, Scala, F#. Nhưng đừng sợ, các phần tử của lập trình hàm đã xuất hiện trong Java (cũng như trong các ngôn ngữ thế hệ thứ ba hiện đại khác) và chúng có thể được kết hợp với OOP. Bạn sẽ biết tất cả những chi tiết này một cách chi tiết hơn tại chương trình thực tập trực tuyến JavaRush. Lĩnh vực lập trình logic (cấp độ tiếp theo của ngôn ngữ) vẫn chưa có ứng dụng thực tế rộng rãi do nhu cầu thấp. Xây dựng chương trình đòi hỏi kiến ​​thức về các nguyên tắc cơ bản của toán học rời rạc, logic vị từ, các công cụ ràng buộc và các nhánh khác của logic toán học. Ngôn ngữ hoạt động phổ biến nhất là Prolog.

Phần kết luận

Hiện nay, ngôn ngữ phổ biến nhất là OOP. Java, kể từ khi ra đời đến nay luôn đứng trong top đầu, thường nằm trong top 3 ngôn ngữ phổ biến nhất. Ngoài OOP, nó còn chứa các yếu tố lập trình chức năng và bạn có thể kết hợp các phong cách viết chương trình khác nhau của mình. Phạm vi ứng dụng của Java rất rộng - đây là các nhiệm vụ kinh doanh, triển khai máy chủ web (phụ trợ), ngôn ngữ chính để tạo ứng dụng Android, môi trường lập trình đa nền tảng và nơi làm việc (IDE/AWM) và mô hình hóa, v.v. . Vị trí của Java đặc biệt mạnh mẽ trong lĩnh vực Doanh nghiệp - một lĩnh vực phần mềm doanh nghiệp yêu cầu mã chất lượng cao và tồn tại lâu dài cũng như việc triển khai logic nghiệp vụ phức tạp nhất.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION