Câu hỏi của bạn thú vị theo nhiều cách, vì nó đòi hỏi sự phân biệt cẩn thận cho một số vấn đề. Nhưng tầm nhìn của bạn đối với tôi về cơ bản là chính xác. Tôi đã không đọc tài liệu tham khảo của bạn trước khi viết hầu hết câu trả lời này để tránh thiên vị câu trả lời của tôi.
Đầu tiên, tuyên bố của bạn Variables are symbolic names for memory
addresses
, nó gần như đúng, nhưng nhầm lẫn giữa khái niệm và cách thực hiện thông thường của nó. Một biến thực sự chỉ là một thùng chứa có thể chứa một giá trị có thể thay đổi. Thông thường, bộ chứa này được triển khai trên máy tính như một bock của không gian bộ nhớ, được đặc trưng bởi và địa chỉ và kích thước do các biến có thể chứa đối tượng yêu cầu biểu diễn với nhiều thông tin hơn hoặc ít hơn.
Nhưng tôi sẽ xem xét chủ yếu là một quan điểm trừu tượng hơn về ngữ nghĩa của các ngôn ngữ, độc lập với các kỹ thuật thực hiện.
Vì vậy, các biến chỉ là container từ một quan điểm trừu tượng. Một container như vậy không cần phải có tên. Tuy nhiên, các ngôn ngữ thường có các biến được đặt tên bằng cách liên kết với nó một định danh, do đó việc sử dụng biến có thể được biểu thị bằng mã định danh. Một biến thực sự có thể có một số định danh thông qua cơ chế răng cưa khác nhau. Một biến cũng có thể là một phần con của một biến lớn hơn: một ví dụ là một ô của một biến mảng, có thể được đặt tên bằng cách chỉ định biến mảng và chỉ mục của ô, nhưng cũng có thể được liên kết với các định danh thông qua bí danh.
Tôi đang cố tình sử dụng bộ chứa từ có phần trung tính, để tránh gọi các từ khác có thể được tải về mặt kỹ thuật. Nó thực sự gần với khái niệm tham chiếu được mô tả trong wilipedia , thường bị nhầm lẫn với một địa chỉ bộ nhớ. Bản thân con trỏ từ thường được hiểu là một địa chỉ bộ nhớ, nhưng tôi không nghĩ nó có ý nghĩa khi xem xét hầu hết các ngôn ngữ cấp cao và có thể không phù hợp trong tài liệu thảo luận mà bạn đề cập (mặc dù địa chỉ có thể được sử dụng), vì nó không phù hợp đề cập đến một thực hiện cụ thể. Tuy nhiên, nó phù hợp với một ngôn ngữ như C, được cho là gần gũi hơn nhiều với các khái niệm triển khai và kiến trúc máy.
Trên thực tế, nếu bạn xem xét các biến hoặc giá trị ở cấp độ triển khai, có thể có một số hệ thống gián tiếp phức tạp, "con trỏ cấp độ máy", nhưng đó là (và nên) vô hình đối với người dùng, do đó, quan điểm trừu tượng Tôi phát triển có thể hợp lệ. Đối với hầu hết các ngôn ngữ lập trình, người dùng không cần phải lo lắng, hoặc thậm chí biết về việc triển khai, vì việc triển khai có thể thay đổi rất nhiều đối với một ngôn ngữ nhất định. Điều này có thể không đúng với một số ngôn ngữ, chẳng hạn như C, có chủ ý gần với kiến trúc máy, như một sự thay thế nâng cao cho các ngôn ngữ lắp ráp có liên quan gần như trực tiếp đến mã hóa nhị phân rõ ràng, nhưng mức độ quá thấp để sử dụng thuận tiện trong hầu hết tình huống.
Những gì người sử dụng ngôn ngữ nên biết, và đôi khi nó thậm chí còn ít hơn thế, đó là giá trị và các hoạt động liên quan, nơi chúng có thể được chứa, cách chúng có thể được liên kết với tên, cách hệ thống đặt tên hoạt động, làm thế nào mới các loại giá trị được xác định, vv
Vì vậy, một khái niệm quan trọng khác là định danh và đặt tên. Việc đặt tên một thực thể (một giá trị) có thể được thực hiện bằng cách liên kết một định danh với một giá trị (thường là trong một khai báo). Nhưng một giá trị cũng có thể đạt được bằng cách áp dụng các hoạt động cho các giá trị được đặt tên khác. Tên có thể được sử dụng lại và có các quy tắc (quy tắc phạm vi) để xác định những gì được liên kết với một định danh nhất định, theo bối cảnh sử dụng. Ngoài ra còn có các tên đặc biệt, được gọi là lứa, để đặt tên cho các giá trị của một số tên miền, chẳng hạn như số nguyên (ví dụ ) hoặc boolean (ví dụ: true ).612
Sự kết hợp của một giá trị không thay đổi với một định danh thường được gọi là hằng số. Litterals là hằng số theo nghĩa đó.
"Các thùng chứa giá trị" cũng có thể được coi là các giá trị và liên kết của chúng với một mã định danh là một biến theo nghĩa "ngây thơ" thông thường mà bạn đang sử dụng. Vì vậy, bạn có thể nói rằng một biến là "hằng số chứa".
Bây giờ bạn có thể tự hỏi sự khác biệt giữa việc liên kết một định danh với một giá trị (khai báo không đổi) hoặc gán một giá trị cho một biến, tức là lưu trữ giá trị trong vùng chứa được xác định là hằng số chứa. Về cơ bản, khai báo có thể được xem như là một hoạt động xác định ký hiệu, liên kết một định danh là một thực thể cú pháp với một giá trị nào đó là một thực thể ngữ nghĩa. Chuyển nhượng là một hoạt động ngữ nghĩa thuần túy sửa đổi một trạng thái, tức là sửa đổi giá trị của một container. Theo một nghĩa nào đó, khai báo là một khái niệm meta không có hiệu ứng ngữ nghĩa, ngoài việc cung cấp một cơ chế đặt tên (tức là cú pháp) cho các thực thể ngữ nghĩa.
Trên thực tế, các bài tập là các hoạt động ngữ nghĩa diễn ra linh hoạt khi chương trình được thực thi, trong khi các khai báo có tính chất cú pháp hơn và thường được diễn giải trong văn bản của chương trình, độc lập với thực thi. Đây là lý do tại sao phạm vi tĩnh (tức là phạm vi văn bản) thường là cách tự nhiên để hiểu ý nghĩa của định danh.
Sau tất cả những điều này, tôi có thể nói rằng một giá trị con trỏ chỉ là một tên khác cho một container và một biến con trỏ là một biến chứa, tức là một container (hằng số) có thể chứa một container khác (với những hạn chế có thể có trong trò chơi chứa bởi một số loại hệ thống).
Về mã, bạn nêu [pointers] might indicate the entry point
to a section of code and can be used to call that code
. Thật ra điều này không hoàn toàn đúng. Một phần của mã thường là vô nghĩa một mình (từ quan điểm cấp cao hoặc triển khai). Từ quan điểm cấp cao, mã thường chứa các định danh và bạn phải diễn giải các định danh này trong ngữ cảnh tĩnh nơi chúng được khai báo. Nhưng thực sự có một sự trùng lặp có thể có của cùng một bối cảnh tĩnh, về cơ bản là do đệ quy là hiện tượng động (thời gian chạy) và mã chỉ có thể được thực thi trong một thể hiện động thích hợp của bối cảnh tĩnh. Điều này hơi phức tạp, nhưng hậu quả là khái niệm đúng là một bao đóng liên kết một đoạn mã và môi trường nơi các định danh sẽ được giải thích. Việc đóng cửa là khái niệm ngữ nghĩa thích hợp, nghĩa là một giá trị ngữ nghĩa có thể xác định đúng. Sau đó, bạn có thể có hằng số đóng, biến đóng,
Hàm là một bao đóng, thường có một số tham số để xác định hoặc khởi tạo một số thực thể của nó (hằng và biến).
Tôi đang bỏ qua nhiều biến thể về việc sử dụng các cơ chế này.
Đóng có thể được sử dụng để xác định cấu trúc OO trong các ngôn ngữ bắt buộc hoặc chức năng. Trên thực tế, công việc ban đầu về phong cách OO (có thể là trước tên) đã được thực hiện theo cách đó.
Bài viết mà bạn tham khảo, mà tôi đọc lướt qua nhanh chóng, dường như là một bài thú vị, được viết bởi một người có thẩm quyền, nhưng có thể không dễ đọc nếu bạn không có kinh nghiệm đáng kể với nhiều ngôn ngữ và mô hình tính toán cơ bản của họ.
Nhưng hãy nhớ rằng: nhiều điều nằm trong mắt của kẻ si tình, miễn là anh ta giữ được quan điểm nhất quán. Quan điểm có thể khác nhau.
Điều này có trả lời câu hỏi của bạn không?
PS: Đây là một câu trả lời dài. Nếu bạn xem xét một số phần của nó không đầy đủ, xin vui lòng rõ ràng về nó là gì. Cảm ơn bạn.