Lý thuyết số lượng đăng ký tối thiểu cho một máy tính hiện đại?


10

Tôi đã tham gia một khóa học về trình biên dịch trong các nghiên cứu đại học của mình, trong đó chúng tôi đã viết một trình biên dịch biên dịch các chương trình nguồn bằng ngôn ngữ giống như đồ chơi Java thành ngôn ngữ lắp ráp đồ chơi (chúng tôi có một trình thông dịch). Trong dự án, chúng tôi đã đưa ra một số giả định về máy mục tiêu liên quan chặt chẽ với các tệp thực thi gốc "thực", bao gồm:

  • ngăn xếp thời gian chạy, được theo dõi bởi một thanh ghi con trỏ ngăn xếp chuyên dụng ("SP")
  • một đống để phân bổ đối tượng động, được theo dõi bởi một thanh ghi con trỏ heap chuyên dụng ("HP")
  • một thanh ghi bộ đếm chương trình chuyên dụng ("PC")
  • máy đích có 16 thanh ghi
  • các hoạt động trên dữ liệu (trái ngược với, ví dụ, nhảy) là các hoạt động đăng ký để đăng ký

Khi chúng tôi đến đơn vị sử dụng phân bổ đăng ký như một tối ưu hóa, nó làm tôi tự hỏi: số lượng đăng ký tối thiểu theo lý thuyết cho một máy như vậy là gì? Bạn có thể thấy các giả định của chúng tôi rằng chúng tôi đã sử dụng năm thanh ghi (SP, HP, PC, cộng với hai để sử dụng làm bộ lưu trữ cho các hoạt động nhị phân) trong trình biên dịch của chúng tôi. Trong khi tối ưu hóa như phân bổ đăng ký chắc chắn có thể sử dụng nhiều thanh ghi hơn , có cách nào để có được ít hơn trong khi vẫn giữ các cấu trúc như stack và heap không? Tôi cho rằng với địa chỉ đăng ký (hoạt động đăng ký để đăng ký) chúng ta cần ít nhất hai thanh ghi, nhưng chúng ta có cần nhiều hơn hai không?


Một "con trỏ heap" có vẻ là một ý tưởng kỳ lạ. Bởi vì trái ngược với stack, heap không phải là LIFO và không giảm theo ngữ nghĩa đẩy / pop. Bạn nên xem phân bổ bộ nhớ động như các cuộc gọi đến malloc / thói quen miễn phí.
Yves Daoust

Câu trả lời:


14

Nếu bạn cho phép truy cập bộ nhớ trực tiếp theo địa chỉ bộ nhớ, thì bạn không cần bất kỳ "thanh ghi" nào vì bạn có thể sử dụng các vị trí bộ nhớ thay thế. Ví dụ, bộ nhớ tại vị trí 0 có thể là bộ đếm chương trình, tại vị trí 1 chúng ta có con trỏ ngăn xếp, v.v ... Nhưng đó là gian lận.

Vì vậy, để ngăn chặn bản thân khỏi gian lận, chúng ta hãy giả sử không có quyền truy cập bộ nhớ trực tiếp, bởi vì chúng ta có thể sử dụng các vị trí bộ nhớ cố định làm thanh ghi. Sau đó, chúng ta có thể thoát khỏi hai thanh ghi, bộ đếm chương trình và con trỏ ngăn xếp, như được giải thích trong bài viết Wikipedia trên máy stack . Ngăn xếp chỉ có thể truy cập thông qua con trỏ ngăn xếp và chương trình chỉ có thể truy cập thông qua bộ đếm chương trình.

Một khả năng khác là sử dụng máy đếm. Một máy hai quầy đã hoàn thành Turing, tức là nó có thể tính toán bất cứ thứ gì máy Turing có thể. Điều này một lần nữa được giải thích độc đáo trong bài viết Wikipedia về máy đếm .


Cảm ơn bạn đã trả lời! Tuy nhiên, bài viết về máy stack đề cập rằng máy có khả năng truy cập bộ nhớ trực tiếp (để thực hiện các thao tác trên các phần tử ngăn xếp trên cùng và đẩy kết quả trở lại), vì vậy vẫn còn gian lận, phải không? Đối với máy truy cập, tôi đọc bài viết đó. Tôi cũng đã đọc một bằng chứng tương tự về TC 2-CM, nhưng cả hai đều có hiệu quả liên quan đến việc lưu trữ tất cả RAM trong hai thanh ghi, điều này có vẻ giống như gian lận hơn đối với tôi.
BlueBomber

Chà, đến một lúc nào đó nó không còn gian lận nữa. Các hoạt động ngăn xếp không gian lận, miễn là chúng không cho phép truy cập trực tiếp vào một vị trí cố định trong bộ nhớ. Có thể nói, xoay ba phần tử trên cùng của ngăn xếp là ổn. Dù sao, câu hỏi của bạn hơi lạ, vì vậy không cần phải ám ảnh về những gì đang và không lừa dối.
Andrej Bauer

Cảm ơn một lần nữa vì đã hồi âm. Bất cứ khi nào chủ đề liên quan đến giới hạn lý thuyết, gian lận thậm chí còn ít được chấp nhận! Điều đó không có nghĩa là nó không mang tính hướng dẫn. Điểm không phải là gian lận là khi nào, tốt, không có gian lận, tôi đoán vậy. Tôi đã tìm thấy câu trả lời ban đầu của bạn nhiều thông tin, nhưng vấn đề là mô hình của chúng tôi chồng chéo tất cả các mô hình Turing Machine, Counter Machine và Stack Machine, và đưa ra các giả định của chúng tôi (bao gồm nhiều thanh ghi hữu hạn và không có quyền truy cập bộ nhớ trực tiếp), chúng tôi có thể nhận được chỉ với hai thanh ghi?
BlueBomber

1
Tôi thấy câu hỏi này lạ vì khó có thể xác định được các khái niệm trong thế giới thực như bộ xử lý, đăng ký, truy cập bộ nhớ, v.v., nhưng bạn cần những thứ được ghim xuống để có thể chứng minh bất cứ điều gì. Vì vậy, kết quả cuối cùng sẽ là bất cứ điều gì bạn chứng minh đều dễ chứng minh, nhưng nó phụ thuộc rất nhiều vào cách bạn chính thức hóa câu hỏi (khái niệm lý thuyết của bạn về "bộ xử lý", "đăng ký", "bộ nhớ", v.v.) là gì.
Andrej Bauer

1
Sách giáo khoa biên dịch không cho phép chúng tôi chứng minh nhiều, ít nhất là không theo nghĩa toán học của từ "chứng minh". Bạn cần phải tiến thêm một bước trong việc chính thức hóa phần cứng để đi đến một cái gì đó sẽ cho phép bằng chứng . Nhưng dù sao, chúng tôi đang chia tóc, và tôi đã cho bạn câu trả lời tốt nhất của tôi.
Andrej Bauer

1

Kiến trúc PIC được giới thiệu bởi General Cụ vào những năm 1970 và vẫn còn được sử dụng cho đến ngày nay có các thanh ghi sau:

W register (not addressible)
01    Timer/Counter
02    Program Counter
03    Status
04    File-Select Register
05-07 One register for each I/O port
08-1F General-purpose registers/"memory"

Một lệnh thông thường sẽ đọc một thanh ghi, thực hiện tính toán bằng cách sử dụng giá trị đọc và W, sau đó lưu kết quả tính toán vào W hoặc vào thanh ghi đã đọc. Một trong những tính toán có sẵn mang lại "giá trị đọc, bỏ qua W"; khác là "lấy W, bỏ qua giá trị đọc". Các mẫu bit tương ứng với "đọc XX, sau đó lấy W, bỏ qua giá trị đọc và lưu kết quả trong W" được sử dụng cho NOP cũng như một loạt các hướng dẫn đặc biệt.

Để cho phép tính toán địa chỉ, đơn vị thực thi của bộ xử lý sẽ xem các hướng dẫn mã hóa địa chỉ 00 và thay thế nội dung của Tệp Chọn Đăng ký cho địa chỉ.

Mặc dù phải cung cấp tất cả các giá trị thông qua thanh ghi W có thể là một nút cổ chai, kiến ​​trúc PIC có một bộ làm việc lớn hơn so với các kiến ​​trúc khác sử dụng cùng một từ lệnh có độ dài. Trên PIC16C54 (vẫn được thực hiện ngày nay và rất giống với hướng dẫn PIC của 1970) dài 12 bit. Trên nhiều phần 16Cxx hoặc 16Fxx khác, các lệnh dài 14 bit và có thể truy cập trực tiếp vào không gian địa chỉ 128 byte. Nếu tập làm việc của chương trình phù hợp với tập làm việc của tập lệnh, một câu lệnh như "Total + = value", trong đó "tổng" và "value" có kiểu unsigned char, sẽ biên dịch thành:

movf  value,w
addwf total,f

Trên một cái gì đó giống như ARM, ngay cả khi một người có đăng ký được tải sẵn địa chỉ cơ sở của các biến của một người, mã sẽ giống như sau:

ldr    r0,[r7+value]
ldr    r1,[r7+total]
add    r1,r1,r0
str    r1,[r7+total]

Trong nhiều trường hợp, trình biên dịch sẽ có thể tránh thực hiện tải và lưu trữ với mọi thao tác, nhưng trên một cái gì đó như PIC, lợi ích của bộ làm việc lớn hơn đôi khi có thể vượt quá giới hạn của việc phải đi qua W mọi lúc.

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.