Tại sao một số lập trình viên phân loại C, Python, C ++ khác nhau? - về mức độ


15

Tôi đang tham gia một khóa học giới thiệu về python và người hướng dẫn nói rằng python là ngôn ngữ cấp cao và C và C ++ là ngôn ngữ cấp thấp. Nó thật khó hiểu. Tôi nghĩ rằng C, C ++, Python, Java, v.v đều là những ngôn ngữ cấp cao.

Tôi đã đọc các câu hỏi tại stackoverflow trên C, C ++, v.v. và tất cả chúng dường như đề cập đến các ngôn ngữ đó là cấp độ cao. Dường như với tôi rằng một số lập trình viên sử dụng các thuật ngữ này thay thế cho nhau.


1
Giống như nhiều thứ, mức cao so với mức thấp là một sự đơn giản hóa - hữu ích để hiểu, nhưng có khả năng gây hiểu lầm nếu bạn quên rằng đó là sự đơn giản hóa. Mức độ nào chắc chắn là tương đối, như những người khác đã nói. Nhưng nó không nhất thiết phải là một dòng - có những hướng khác nhau mà bạn có thể trừu tượng hóa (ví dụ: các mô hình khác nhau). Chỉ vì bạn đang di chuyển xa hơn từ sự trừu tượng của máy không nhất thiết có nghĩa là bạn đang tiến tới một sự trừu tượng hóa thích hợp cho ứng dụng của bạn.
Steve314

Ngay cả điểm bắt đầu có thể khác nhau. Ví dụ, IMO tính toán lambda là mức độ trừu tượng rất thấp - rất nhiều trừu tượng trong máy, nhưng đó là một sự trừu tượng rất đơn giản đóng vai trò là điểm khởi đầu cho các ngôn ngữ chức năng bắt đầu xây dựng trừu tượng trên đầu trang. Trong mọi trường hợp, phép tính lambda dường như không gần với sự trừu tượng lý tưởng cho bất kỳ ứng dụng cụ thể nào ngoài mã máy.
Steve314

Câu trả lời:


31

Cấp cao và cấp thấp là các thuật ngữ tương đối nên việc sử dụng đã thay đổi theo thời gian. Trong thập niên 70, UNIX đã tạo ra sóng vì nó cho thấy một hệ điều hành có thể được viết chủ yếu bằng ngôn ngữ cấp cao: C. Vào thời điểm đó, C được coi là cấp cao so với trình biên dịch.

Ngày nay, C được coi là ngôn ngữ cấp thấp vì cả ngôn ngữ lẫn thư viện tiêu chuẩn đều không cung cấp bất kỳ cấu trúc dữ liệu bánh mì và bơ nào như vectơ, từ điển, lặp, v.v. Bạn có thể có tất cả các cấu trúc đó trong một chương trình C, nhưng cuối cùng bạn sẽ tự viết chúng. Python, Java, v.v ... ở mức cao so với C vì nhiều cấu trúc dữ liệu tiêu chuẩn được tích hợp vào ngôn ngữ hoặc là một phần của các thư viện chuẩn. Có những quyền đó ngay lập tức giúp dễ dàng lập trình ở mức độ trừu tượng hơn.

C ở mức thấp theo nghĩa thứ 2: nó cho phép thao tác trực tiếp với phần cứng máy tính (ít nhất là trực tiếp như HĐH sẽ cho phép). Các triển khai phổ biến nhất của Python, Java, v.v ... ít nhất một bước nữa bị xóa khỏi phần cứng vì chúng chạy trong VM. Nếu bạn muốn thao tác phần cứng từ Python, bạn sẽ phải viết một phần mở rộng cho Python VM, thường là bằng C hoặc C ++.

C ++ là một trường hợp kỳ lạ. Nó cung cấp hàng tấn cấu trúc dữ liệu đẹp như một phần của thư viện tiêu chuẩn, nhưng nó cũng cho phép thao tác phần cứng ở mức độ thấp.


3
C ++ thực sự không phải là một trường hợp kỳ quặc, IMO - nó đơn giản là một ngôn ngữ hỗn hợp. Mức độ trừu tượng bạn nhận được phụ thuộc vào tính năng bạn sử dụng.
Steve314

1
@ Steve314: Có và không: sự trừu tượng thông thường đi kèm với việc ẩn thông tin, tức là ngôn ngữ hoặc thư viện giống như một hộp đen cung cấp giao diện và không ai muốn biết những gì bên trong hộp đen. C ++ hơi kỳ lạ ở chỗ này vì nó cung cấp các cấu trúc cấp cao hơn nhưng không ngăn lập trình viên truy cập vào biểu diễn của họ và phá vỡ chúng. C ++ là ngôn ngữ duy nhất tôi biết không tách biệt các lớp trừu tượng khác nhau (nhưng có thể có những ngôn ngữ khác mà tôi không biết).
Giorgio

1
@Giorgio - C ++ cho phép bạn ẩn bất kỳ chi tiết triển khai nào - ví dụ: biến nó thành một phần của nội bộ riêng của một lớp để cách chính thức duy nhất để sử dụng nó là thông qua giao diện chung của lớp đó. Tất nhiên bạn có thể phá vỡ các quy tắc và xáo trộn bộ nhớ của bạn tất cả những gì bạn muốn - nhưng trong thực tế, bạn có thể làm điều đó bằng bất kỳ ngôn ngữ nào hỗ trợ phát triển ứng dụng trong thế giới thực.
Steve314

@Giorgio - Lấy ví dụ Haskell. "Không an toàn" trong trường hợp đó có xu hướng có nghĩa là không minh bạch (như trong unsafePerformIO). Có nhiều IORefloại, nhưng không có tương đương với reinterpret_casttôi biết và không tương đương với số học con trỏ. Nhưng điều đó không có nghĩa là nó an toàn khỏi những người hack xung quanh với bộ nhớ. Để trở thành một ngôn ngữ thực tế, Haskell phải giao tiếp với các hệ điều hành và thư viện trong thế giới thực. Nó có một "giao diện chức năng nước ngoài". Nếu tôi thực sự muốn lật đổ nó, tất cả những gì tôi cần là sử dụng FFI để viết các hàm lật đổ nguyên thủy.
Steve314

@Giorgio - Tất nhiên tôi có thể gặp khó khăn khi tìm các giá trị tôi muốn hỏng trong bộ nhớ, nhưng điều tương tự có thể áp dụng trong C ++, tùy thuộc vào mức độ tôi đã giấu chúng. Ví dụ: tôi có thể sử dụng PIMPL . Nếu sau đó tôi chỉ cung cấp mã đối tượng và tiêu đề cho thư viện để hiểu những gì trỏ đến, thì kẻ lật đổ sẽ phải thiết kế ngược lại mã đối tượng đó để tìm ra cái gì để lật đổ và làm thế nào.
Steve314

8

Hãy nghĩ về điều này theo thang điểm trượt, từ các ngôn ngữ cấp độ thấp cho đến các ngôn ngữ cấp cao. Khi một ngôn ngữ chuyển lên thang đo, từ THẤP đến CAO, ngôn ngữ cung cấp ngày càng nhiều sự trừu tượng hóa từ giao diện cụ thể với máy tính.

Các ngôn ngữ cấp thấp được viết để định hướng rõ ràng cho máy tính - nghĩ mã máy và mã lắp ráp.

Các ngôn ngữ cấp cao cố gắng trừu tượng hóa các chi tiết khó chịu (đặc biệt là cấp phát bộ nhớ và giải phóng bộ nhớ). Ý tưởng là cung cấp một giao diện "tự nhiên" hơn cho lập trình và hy vọng cho phép lập trình viên tập trung vào thiết kế và sản xuất.

Ngày nay, C được coi là ngôn ngữ cấp thấp. Nó vẫn có một số trừu tượng đáng kể từ mã máy và mã lắp ráp, vì vậy về mặt kỹ thuật là 'cao hơn' so với những thứ này. Tuy nhiên, nó vẫn cung cấp địa chỉ bộ nhớ trực tiếp và không cung cấp bộ sưu tập rác. Vì vậy, đây là những chi tiết mà một lập trình viên phải thiết kế.

So sánh điều này với các ngôn ngữ khác như Python, Ruby hoặc Haskell và bạn có giao diện khó hiểu hơn nhiều. Các ngôn ngữ này có các thư viện mã lớn giúp loại bỏ hầu hết các lệnh máy tính. Bạn đã bao giờ tự hỏi điều gì xảy ra với một biến trong Python khi bạn rời khỏi phạm vi cục bộ của hàm hoặc xóa nó chưa? Có lẽ là không đúng? Và đó là bởi vì trong ngôn ngữ cấp cao, bạn không cần phải có! Họ chăm sóc việc cấp phát / giải phóng bộ nhớ cho bạn.

Ngôn ngữ cấp cao có lợi thế về chức năng. Chúng cho phép chúng tôi thiết kế và phát triển một cách tự do (và an toàn!).

Ngôn ngữ cấp thấp có lợi thế về tốc độ trong hầu hết các trường hợp. Có một chi phí để giải thích mã cấp cao. Thêm vào đó, thật tuyệt khi viết một cái gì đó trong 'máy tính speek'.

Hi vọng điêu nay co ich


5

Cấp cao so với cấp thấp không phải là một thứ đen trắng, mà là một quy mô liên tục. Các thuật ngữ được sử dụng để mô tả mức độ gần gũi của ngôn ngữ lập trình với phần cứng; cấp độ càng cao, nó càng trừu tượng hóa phần cứng.

Rõ ràng, mức thấp nhất là mã máy nhị phân - đó là biểu diễn chính xác mà HĐH tải và cung cấp cho CPU. Hội là mức độ trừu tượng đầu tiên được xây dựng trên nó: thay vì mã nhị phân, người ta viết mnemoics, mã biểu tượng có thể đọc được của con người đại diện cho các lệnh máy nhị phân. Đây là những gì mọi người đã sử dụng để lập trình hệ thống trước UNIX.

C là bước tiếp theo trong chuỗi trừu tượng, kết hợp các mẫu phổ biến vào các cấu trúc điều khiển luồng và trừu tượng hóa các hướng dẫn cụ thể của máy thành cú pháp bất khả tri của nền tảng, và sự trừu tượng cuối cùng này là một trong những yếu tố chính giúp UNIX trở nên cách mạng và rất thành công, bởi vì nó có nghĩa là cùng một mã có thể được biên dịch cho bất kỳ nền tảng nào mà không có bất kỳ thay đổi lớn nào.

C ++ cho biết thêm một lớp trừu tượng: nó bổ sung thêm các lớp học (vtables trừu tượng hóa và bối cảnh đi vào một cú pháp OOP), newdelete(bundling cấp phát bộ nhớ và khởi tạo biến thành một cấu trúc duy nhất), kiểm tra kiểu thời gian biên dịch, các mẫu (loại an toàn thời gian biên dịch siêu lập trình) và một loạt các tiện ích cú pháp thời gian biên dịch như không gian tên, nạp chồng hàm và toán tử, v.v.

Python có một bước tiến lớn khác từ phần cứng. C ++ vẫn cung cấp cho người lập trình toàn quyền kiểm soát việc cấp phát bộ nhớ và cho phép thao tác trực tiếp với RAM; Python chăm sóc quản lý bộ nhớ cho bạn. Ngoài ra, thay vì biên dịch mã của bạn thành các hướng dẫn máy hoàn toàn tự nhiên, nó chạy mã này với máy ảo; điều này mang đến một hình phạt về hiệu năng (đôi khi có thể rất nặng nề, nhưng thường không phải là điều đáng lo ngại), nhưng nó cũng cho phép những thứ gọn gàng trong C ++ và cực kỳ khó khăn trong C, như thao túng các chức năng và các lớp khi chạy thời gian, nhận được tên của các đối tượng tùy ý trong thời gian chạy, khởi tạo các lớp theo tên trong thời gian chạy, vá khỉ, v.v.

Vì vậy, khi mọi người chia ngôn ngữ thành "cấp độ cao" và "cấp độ thấp", họ sẽ vẽ một dòng tùy ý ở đâu đó và dòng đó không phải lúc nào cũng giống nhau. Năm 1970, dòng là giữa lắp ráp và C (trừu tượng hóa các hướng dẫn máy cụ thể nền tảng là yếu tố quyết định); vào năm 1987, nó có thể đã ở đâu đó giữa C và C ++; ngày nay, nó có thể nằm giữa C ++ và Java (với quản lý bộ nhớ tự động là yếu tố quyết định).

Câu chuyện dài: cấp độ cao là một thang trượt và đối với ba ngôn ngữ bạn đề cập đến đó là C <C ++ <Python.


Tôi muốn nói cấp cao so với cấp thấp không phải là một thang đo, mà thay vào đó là hai thang đo riêng biệt. Mức độ thấp liên quan đến mức độ ngôn ngữ liên quan đến hành vi của máy, trong khi mức độ cao liên quan đến khả năng cung cấp sự trừu tượng hóa của nó. C # là ngôn ngữ cấp cao hơn C99, nhưng cũng là ngôn ngữ cấp thấp hơn ngôn ngữ được xác định bởi Tiêu chuẩn C, do hành vi của ví dụ sử dụng con trỏ "int" để xử lý các giá trị "ngắn" trong một mảng hai tại một thời gian được xác định trong C #, nhưng không phải trong C99.
supercat

3

Dòng giữa ngôn ngữ "cấp thấp" và "cấp cao" thay đổi theo thời gian.
Ví dụ:
Quay lại thời của UNIX, C là ngôn ngữ cấp cao.
Ngày nay C không có các cấu trúc như các kiểu ánh xạ (từ điển), các trình lặp, v.v. mà các ngôn ngữ cấp cao ngày nay như Python có. Vì vậy, dòng đã thay đổi, và C bây giờ đã rơi vào nhóm cấp thấp.

Ngôn ngữ cấp thấp:
Các ngôn ngữ này "gần" với những gì máy có thể thực thi (cấp độ thấp nhất là: Mã hội!).
Khi làm việc với các ngôn ngữ này, lập trình viên phải suy nghĩ về những thứ cấp thấp nhất như quản lý bộ nhớ .. Bạn gần với nghĩa của phần cứng, rằng bạn phải trực tiếp làm việc với nó.

Ngôn ngữ cấp cao:
Những ngôn ngữ này đưa bạn ra khỏi phần cứng, vì chúng tự quản lý những thứ như bộ nhớ. Khi bạn làm việc với các ngôn ngữ này, bộ nhớ là một yếu tố (rõ ràng), nhưng bạn không làm việc trực tiếp với phần cứng. Thay vào đó, ngôn ngữ quản lý điều đó, khiến bạn tránh xa (có thể cao hơn) khỏi giao diện phần cứng thấp hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.