Bảng ký hiệu là gì?


88

Ai đó có thể mô tả bảng ký hiệu là gì trong ngữ cảnh của C và C ++ không?

Câu trả lời:


82

Có hai ý nghĩa phổ biến và liên quan của bảng biểu tượng ở đây.

Đầu tiên, có bảng ký hiệu trong các tệp đối tượng của bạn. Thông thường, trình biên dịch C hoặc C ++ biên dịch một tệp nguồn duy nhất thành một tệp đối tượng có đuôi .obj hoặc .o. Điều này chứa một bộ sưu tập mã thực thi và dữ liệu mà trình liên kết có thể xử lý thành một ứng dụng đang hoạt động hoặc thư viện được chia sẻ. Tệp đối tượng có cấu trúc dữ liệu được gọi là bảng ký hiệu, trong đó ánh xạ các mục khác nhau trong tệp đối tượng thành các tên mà trình liên kết có thể hiểu được. Nếu bạn gọi một hàm từ mã của mình, trình biên dịch sẽ không đưa địa chỉ cuối cùng của quy trình vào tệp đối tượng. Thay vào đó, nó đặt giá trị trình giữ chỗ vào mã và thêm ghi chú yêu cầu trình liên kết tra cứu tham chiếu trong các bảng ký hiệu khác nhau từ tất cả các tệp đối tượng mà nó đang xử lý và gắn vị trí cuối cùng ở đó.

Thứ hai, cũng có bảng ký hiệu trong thư viện được chia sẻ hoặc DLL. Điều này do trình liên kết tạo ra và dùng để đặt tên cho tất cả các chức năng và mục dữ liệu hiển thị cho người dùng của thư viện. Điều này cho phép hệ thống thực hiện liên kết trong thời gian chạy, giải quyết các tham chiếu mở đến những tên đó đến vị trí mà thư viện được tải trong bộ nhớ.

Nếu bạn muốn tìm hiểu thêm, tôi đề xuất cuốn sách xuất sắc của John Levine "Những kẻ liên kết và những kẻ xúc lật". văn bản liên kết


Chào Ben, trong trường hợp thứ hai, bạn đang đề cập đến bảng xuất khẩu? Tức là bảng xuất có phải là trường hợp đặc biệt của bảng ký hiệu không? Hay là những khái niệm không liên quan?
Pooven

Chào. Tôi tin rằng nó không có trong bất kỳ tệp đối tượng nào nhưng được giới thiệu từ chúng. Thứ hai, bạn có thể vui lòng giải thích thêm một chút ý của bạn về "vị trí cuối cùng" không? Địa chỉ vật lý hoặc địa chỉ tương đối được hoàn thiện trong mã nguồn.
stdout

Cái thứ hai bạn đề cập đến là tham chiếu đến nhánh, hoặc bảng gọi?
Nikos

26

Nói một cách ngắn gọn, đó là ánh xạ tên mà bạn gán một biến cho địa chỉ của nó trong bộ nhớ, bao gồm siêu dữ liệu như kiểu, phạm vi và kích thước. Nó được sử dụng bởi trình biên dịch.

Nói chung, không chỉ C [++] *. Về mặt kỹ thuật, nó không phải lúc nào cũng bao gồm địa chỉ bộ nhớ trực tiếp. Nó phụ thuộc vào ngôn ngữ, nền tảng, v.v. mà trình biên dịch đang nhắm mục tiêu.


Tôi nghĩ, điều rất quan trọng là bạn phải đề cập đến nội dung của địa chỉ bằng cách nói "nó không phải lúc nào cũng bao gồm địa chỉ bộ nhớ trực tiếp".
stdout

13

Trong Linux, bạn có thể sử dụng lệnh:

nm [tệp đối tượng]

để liệt kê bảng ký hiệu của tệp đối tượng đó. Từ bản in này, sau đó bạn có thể giải mã các ký hiệu trình liên kết đang được sử dụng từ tên bị lệch của chúng .


8

Bảng ký hiệu là danh sách các "ký hiệu" trong một chương trình / đơn vị. Các ký hiệu thường là tên của các biến hoặc hàm. Bảng ký hiệu có thể được sử dụng để xác định vị trí của các biến hoặc hàm trong bộ nhớ.



0

Bảng biểu tượng là một cấu trúc dữ liệu quan trọng được tạo và duy trì bởi trình biên dịch để lưu trữ thông tin về sự xuất hiện của các thực thể khác nhau như tên biến, tên hàm, đối tượng, lớp, giao diện, v.v.


Trình liên kết và trình lắp ráp cũng xử lý các bảng ký hiệu (thường đơn giản hơn so với trình biên dịch).
Basile Starynkevitch
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.