2013-08-15 66 views
7

Có phương ngữ nào của Lisp có ngữ nghĩa Lisp và thao tác ở mức độ thấp của C không? Một cái gì đó giống như lấy một địa chỉ bộ nhớ tùy ý (bộ nhớ ảo hoặc vật lý) và làm điều gì đó với nó; con trỏ vào thiết bị phần cứng ...Lisp không có Bộ thu gom rác để lập trình mức thấp

Ví dụ:

(defvar a '(1 2 3 4)) ;; I have a list 
(defvar b (cdr a)) ;; b is the cdr of a. But I want b to 
        ;; actually refer to the tail of a 
(setf b '(4 5 6)) ;; b now has new value, but a remains unchanged 

Những gì tôi muốn là sử dụng Lisp để diễn tả vấn đề ở mức độ thấp. Ví dụ, làm thế nào để kiểm soát các byte và bit riêng lẻ khi chạy Lisp trên kim loại trần? Trong C, tôi có thể nhận được một con trỏ và thực hiện số học con trỏ để trỏ đến bất cứ nơi nào tôi muốn trong một không gian bộ nhớ (ảo hoặc vật lý). Con trỏ cũng có thể trỏ đến các thiết bị và các địa chỉ được xác định tùy ý bởi nhà thiết kế phần cứng.

Tại sao tôi cần điều này? Vâng, tôi muốn tìm hiểu làm thế nào để sử dụng Lisp với lập trình cấp thấp. Về lâu dài, tôi muốn viết một hệ điều hành đơn giản cho việc học tập, nhưng trong Lisp. Tôi cũng sẽ viết một chữ C cho những hiểu biết ban đầu, nhưng nếu tôi chỉ có thể viết bằng C, làm thế nào tôi có thể chắc chắn và nói rằng tôi hiểu cách thực hiện một hệ điều hành? Tôi nghĩ rằng tôi chỉ thực sự hiểu làm thế nào để thực hiện một hệ điều hành nếu tôi có thể viết nó bằng ngôn ngữ khác hơn là C để đảm bảo.

Tôi không muốn viết một cái gì đó giống như lõi C cho hệ điều hành và Lisp cho mọi thứ khác.

+2

Không chắc chắn những gì bạn đang yêu cầu . GC và thao tác bộ nhớ mức thấp có thể cùng tồn tại. Triển khai Lisp thường gặp nhất có thể thực hiện điều đó. Xem chương về FFI trong các sách hướng dẫn tương ứng. Xem thêm các triển khai như ECL có thể dễ dàng được nhúng vào các chương trình C. –

+0

@RainerJoswig Tôi đã chỉnh sửa câu hỏi để làm rõ. Có giải pháp nào khác hơn là dựa vào C và hệ điều hành máy chủ cho các hoạt động cấp thấp không? – Amumu

Trả lời

5

Như tôi đã đề cập trong nhận xét của tôi, hầu hết các triển khai Lisp đều có thể thực hiện điều đó. Lisp thường đã có tất cả các loại chức năng tính toán bit. Tất cả các triển khai cung cấp giao diện cho các hoạt động cấp thấp.

Bạn có thể viết máy chủ web, trình biên dịch, trình quản lý cửa sổ, v.v. trong Lisp. Nhiều hệ thống Lisp được viết bằng Lisp và do đó cần các nguyên thủy để ghi/đọc vào/từ bộ nhớ.

Bạn chỉ cần thực hiện một số triển khai Lisp và đọc hướng dẫn. Đó là tất cả các tài liệu.

Ví dụ, xem lớp di động CFFI (Giao diện chức năng ngoại giao chung), chương trên pointers. CFFI hoạt động trên một số triển khai Common Lisp.

+0

Bạn nói đúng. CFFI là những gì tôi nên xem xét. – Amumu

3

Bạn có thể tạo hoặc thay đổi ngôn ngữ Lisp hiện tại bằng công cụ đòn bẩy thấp và API bạn cần chạy LISP mà không cần nhân hoặc người dùng và biên dịch chéo với blob không liên kết với bất kỳ thứ gì (tĩnh). SBCL có thể được bootstrapped với một CL người nước ngoài thực hiện và thậm chí qua biên dịch chính nó vì vậy nếu bạn muốn CL tôi đã có thể bắt đầu đọc mã và bài viết về SBCL cũng như thiết kế hệ điều hành.

Cách bạn đi từ đó tùy thuộc vào nội dung bạn muốn. LISP chạy có thể về lý thuyết có tất cả các tài nguyên và bạn có thể tạo tất cả các ứng dụng và hỗ trợ của bạn trong đó. Bạn thậm chí có một bộ thu gom rác cho mức thấp nhất của hệ điều hành của bạn :)

Cuối cùng bạn sẽ cần một cách để làm cho các ứng dụng và trình điều khiển thiết bị trở nên dễ dàng hơn. Bằng cách đó bạn có thể đi thuyền trên những nỗ lực của người khác. Hãy tưởng tượng nếu bạn cần phải viết trình duyệt của bạn hoặc trình điều khiển nvidia từ đầu ..

+0

Cảm ơn. Tôi nghĩ rằng tôi sẽ cần phải có thực hiện riêng của tôi mà không phụ thuộc vào hệ điều hành máy chủ và bootstrap SBCL. Hiện tại, kiến ​​thức của tôi về hệ điều hành chủ yếu là Linux. Mục tiêu của tôi là viết một hệ điều hành đơn giản với Lisp để làm cho CL trên kim loại trần xảy ra; Tôi sẽ xử lý các chất liệu cũ sau này. Con đường dài để đi mặc dù. – Amumu

+0

@Amumu Dự án riêng tư của tôi đang thay đổi (làm việc) [thông dịch viên LISP của tôi cho Brainf * ck] (http://sylwester.no/zozotez/) thành một phạm vi biên soạn và lexically scoped chứ không phải là giải thích và năng động. Tôi nghĩ rằng dự án của bạn có thể phức tạp hơn và tôi ước tính tôi sẽ sử dụng vài năm để có được thứ gì đó tự lưu trữ. – Sylwester

4

Có một dự án cũ mà bạn có thể quan tâm đến xem xét thông qua:

Giới thiệu

Hệ thống Movitz mong muốn là một triển khai của ANSI Common Lisp nhắm vào kiến ​​trúc PC x86 phổ biến "trên kim loại". Điều đó là, đang chạy mà không có bất kỳ hệ điều hành hoặc hình thức nào khác của phần mềm môi trường.Movitz là một nền tảng phát triển cho hệ điều hành hạt nhân, nhúng và các ứng dụng một mục đích. Có thể có thể là một số hệ điều hành hoàn toàn khác nhau được xây dựng bằng Movitz.

Movitz: a Common Lisp x86 development platform

4

Bạn có thể muốn nhìn vào PreScheme:

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.3.4031

PreScheme là một phương ngữ tĩnh đánh máy của Đề án cung cấp cho các lập trình viên cao hiệu quả và truy cập máy lowlevel của C trong khi vẫn giữ lại nhiều tính năng mong muốn của Đề án. Trình biên dịch PreScheme sử dụng suy luận kiểu, đánh giá từng phần và lược đồ và công nghệ biên dịch Lisp để biên dịch các tính năng có vấn đề của Đề án, chẳng hạn như đóng cửa, thành mã C mà không có chi phí thời gian chạy đáng kể. Việc sử dụng các tính năng như vậy trong các chương trình Pre-Scheme bị hạn chế đối với những trường hợp có thể được biên dịch thành mã hiệu quả. Loại tái thiết được thực hiện bằng cách sử dụng một thuật toán Hindley/Milner sửa đổi cho phép các hàm do người dùng định nghĩa quá tải. Tất cả các biểu mẫu cấp cao nhất trong các chương trình Pre-Scheme được đánh giá tại thời gian biên dịch, cho phép người dùng kiểm soát thêm phần đánh giá một phần của trình biên dịch của một chương trình. PreScheme đã được thực hiện và sử dụng để viết một interpeter byte-code và liên kết mã hỗ trợ cho việc thực hiện Đề án hoàn thiện

Tôi nghĩ Scheme48 vẫn sử dụng PreScheme trong việc thực hiện của nó: http://s48.org/