2010-02-01 30 views
5

Giả sử trình thông dịch cho ngôn ngữ (Có thể là bất kỳ thứ gì từ PHP sang Ruby) được viết bằng C. Biến (hoặc nhiều cấu trúc dữ liệu phức tạp không chỉ có tên và giá trị), được xác định bởi tập lệnh hiện đang được thực hiện, lưu trữ và đọc?Làm thế nào để các ngôn ngữ kịch bản thiết lập/sửa đổi/đọc các biến?

Tôi, với kiến ​​thức khá kém của tôi về C, sẽ kết thúc với kết luận rằng điều này chỉ có thể được thực hiện với một mảng.

// Variable type definition would go here 
var* variables; 

Loại var sẽ chứa hai chuỗi namevalue.

OK. Vì vậy, một tập lệnh xác định ví dụ: 30 biến. Bây giờ, nếu một trong các biến phải được đọc, hàm getVar (hoặc một cái gì đó tương tự) sẽ phải đi qua tất cả 30 biến và so sánh name s của chúng với tên của biến được yêu cầu. Hãy tưởng tượng rằng với vòng lặp yêu cầu

  • Tôi có hoàn toàn sai không? Nếu có, các ngôn ngữ kịch bản (hiện đại?) Xử lý các biến như thế nào? Chúng được lưu trữ và đọc như thế nào?

  • Trong ngôn ngữ mà các biến được định nghĩa rõ ràng theo cú pháp (PHP: $myVar), trình thông dịch có thể thay thế tất cả các biến theo giá trị số trong quá trình phân tích cú pháp. (Tôi có đúng không?) Đây có phải là trường hợp không?

+0

@lamas - Chúc bạn may mắn với nó. Một số lần bạn sẽ muốn kéo tóc của bạn ra ... nhưng trình biên dịch và thông dịch viên là tuyệt vời. –

Trả lời

3

Hashtables, phạm vi liên kết danh sách, tài liệu tham khảo ... có rất nhiều để có nó.

Điều bạn đang yêu cầu là một nửa trừu tượng và việc triển khai có thể thay đổi.

Tùy thuộc vào việc thực hiện:

  1. định danh có thể được biên dịch thành địa chỉ bộ nhớ, hoặc địa chỉ bộ nhớ tương đối, hoặc các địa điểm không tên tham chiếu bởi bytecode.
  2. định danh có thể được xem xét-up tự động trong phạm vi trong thời gian chạy

Trong một ngôn ngữ kịch bản cơ bản, tên biến khi vải trên thị trường sẽ được đưa vào một cấu trúc phạm vi như một danh sách liên kết có chứa một Hashtable triển khai để tra cứu số nhận dạng trong phạm vi đó.

Khi biến được tham chiếu, mã thời gian chạy tra cứu trong hàm có thể bắt đầu và nhận được một số giá trị (địa chỉ bộ nhớ của cấu trúc chẳng hạn) liên quan đến giá trị đó. Struct có thể được sử dụng để thực hiện vô hướng biến:

enum stype = { INT, STRING, FLOAT, BOOL }; 
struct scalar { 
    enum stype type; 
    generic_blob_t *heap_blob; 
}; 

Hoặc một số biến thể của ví dụ nguồn nghèo của tôi.

Một số sách hay là "Modern Compiler Implementation in C" và Dragon Book. Đọc về chủ đề này là một ý tưởng hay; Tôi muốn giới thiệu nó cho bất kỳ lập trình viên nào.

2

Chúng gần như chắc chắn sử dụng cấu trúc dữ liệu tinh vi hơn.

struct Var 
{ 
    char *name; 
    int type; 
    union value; .... 
    }; 

và sau đó lưu trữ chúng trong một cái cây (băm hoặc nhị phân) để họ có thể được lấy theo tên

+1

Một bảng băm (chứ không phải là một cây) có thể xảy ra, vì việc truy cập các biến theo thứ tự sắp xếp là không cần thiết. – caf

2

Thông thường, triển khai ngôn ngữ kịch bản sẽ sử dụng cấu trúc dữ liệu C khá phức tạp để biểu diễn các biến trong ngôn ngữ kịch bản lệnh. Đối với ngôn ngữ mà phần mở rộng C được xác định rõ, các tài liệu hướng dẫn là có sẵn:

[SO biên tập: cảm thấy tự do để bổ sung thêm tài liệu tham khảo cho danh sách trên]

+0

+1 Ví dụ về nứt của tương tác C-to-type để liên kết. Tôi thích cách tiếp cận của Python. –

Các vấn đề liên quan