Tôi đang thiết kế ngôn ngữ kịch bản thử nghiệm của riêng mình cho mục đích nhúng biến đó vào ứng dụng lớn hơn của tôi.Cấu trúc dữ liệu để lưu các biến trong ngôn ngữ thông dịch
Hầu như mọi thứ tôi muốn làm đều được lập trình suôn sẻ, nhưng hành động lưu trữ đơn giản trong bộ nhớ dường như là phần khó nhất ở đây. Tôi không biết làm thế nào để lưu trữ chúng để cho phép tất cả các loại kiểm tra, biến toàn cầu và cờ đặc biệt trên chúng. Đầu tiên nhìn vào một mẫu mã:
a = 1
b = 2
someFunction()
print(a) --> This should read the global variable and print `1`
a = 3 --> Now `a` should become a local variable of this function
and the global `a` remain unchanged
x = 4 --> `x` should always be local of this function
end
tôi gọi là "địa bàn" của các biến họ level
s nên biến trong khối lồng nhau có một trình độ cao hơn. Trong đoạn mã trên, a
và b
là các biến cấp 1. Các biến cục bộ của hàm someFunction sẽ có cấp 2. Dòng đầu tiên của hàm cần đọc biến global a
(cấp 1) nhưng dòng thứ hai sẽ tạo biến một lần nữa được gọi là a
nhưng với cấp 2 che toàn cầu a
từ thời điểm đó trở đi. Dòng thứ ba sẽ tạo biến số x
với cấp 2. Làm thế nào để lưu trữ và theo dõi tất cả các bộ nhớ này?
gì tôi đã cố gắng cho đến nay:
Phương pháp 1: Lưu trữ bản đồ của variable=>value
trong mảng Vị trí tầng:
variables
{
level=1 //global variables
{
a => 1,
b => 2
},
level=2 //function variables
{
a => 3,
x => 4
}
}
Nhưng điều đó sẽ làm cho biến nhìn lên rất chậm kể từ khi người ta phải tìm kiếm tất cả các cấp cho một biến nhất định.
Cách 2: Lưu trữ các (biến, mức độ) cặp như phím của bản đồ:
variables
{
(a, 1) => 1, //global
(b, 1) => 2, //global
(a, 2) => 3, //function
(x, 2) => 3 //function
}
này có cùng một vấn đề như trước đây vì chúng ta phải cố gắng cặp (biến, mức độ) với tất cả khả năng mức cho một biến nhất định.
Tôi nên sử dụng phương pháp nào để sử dụng bộ nhớ tối ưu và thời gian truy cập nhanh nhất?
Ghi chú thêm:
tôi biết về cách biến được quản lý trên stack và heap trên các ngôn ngữ khác "thực", nhưng tôi thấy nó khó khăn để làm điều này trên một ngôn ngữ giải thích. "Đây không phải là cách Lua và Python làm điều đó," tôi luôn nghĩ. Đúng nếu tôi sai. Tôi đang cố gắng lưu trữ biến trong bản đồ và cấu trúc C++ bên trong.
Và cuối cùng, đây là cách tôi đại diện cho một biến. Bạn có nghĩ rằng nó lớn và có thể có nhiều biểu diễn hiệu quả về bộ nhớ hơn không? (Tôi cũng đã cố gắng để đưa các "Cấp" như một thành viên ở đây nhưng nó có cùng một vấn đề như người kia quá.)
struct Member
{
uchar type; //0=num, 1=str, 2=function, 3=array, etc
uchar flags; //0x80 = read-only, 0x40 = write-only, etc
union {
long double value_num;
char* value_str;
int value_func;
//etc
};
};
Tôi sẽ sử dụng bản đồ ánh xạ từng tên biến thành một chồng các biến thể. Khi bạn tạo biến mới ở cấp bạn đẩy biến trên ngăn xếp và phần tử trên cùng trên ngăn xếp giữ trường hợp biến có thể nhìn thấy hiện tại với tên này.Bạn cũng phải duy trì danh sách các biến được phân bổ cho mỗi cấp để bật các biến khỏi ngăn xếp khi rời khỏi cấp. – Nobody
Bạn chỉ cần sử dụng một chồng các mảng và một số dạng chỉ mục de Bruijn. lation "bước trước khi diễn dịch, bằng cách giải quyết tất cả các tên. –