2013-08-13 31 views
7

Tôi đang viết trình biên dịch JIT bằng chứng trong C, mà tại thời điểm này là tạo ra các chuỗi mã lắp ráp. Các chức năng lắp ráp nội tuyến trong C chỉ đề với các chuỗi ký tự được biết đến tại thời gian biên dịch, vì vậy tôi không thể sử dụng nó để chạy mã được tạo lúc chạy của tôi.Chạy cụm được tạo động trong C (GNU/Linux)

Tôi đã đọc về cách sử dụng mmap() để thực thi mã máy khi chạy, nhưng tôi muốn tránh làm việc với mã máy nếu có thể.

Có ai biết về bất kỳ giải pháp nào không? Tôi đã nghĩ đến việc viết nó vào một tệp và gọi trình kết nối & liên kết trên tệp đã nói, nhưng điều đó sẽ lộn xộn và chậm chạp.

+1

Vì vậy, bạn đang nói rằng bạn tạo mã nguồn lắp ráp? Tại sao không chỉ tự tạo mã máy? –

+0

@DrewMcGowen Tôi không thích vì nó ít dễ đọc hơn, khó kiểm tra hơn và thời gian là bản chất vì vậy nếu tôi muốn tránh tái cấu trúc nếu có thể. Mặc dù có vẻ như tôi có thể phải làm vậy. – AlexJ136

+0

Có rất nhiều lib ở đó để phát ra lắp ráp. [gnu-lightning] (https://www.gnu.org/software/lightning/) [llvm] (http://llvm.org/), ... – mathk

Trả lời

2

Tôi nghĩ cuối cùng là "JIT" bạn cần phải nhạy cảm về thời gian có nghĩa là tạo mã máy. Bạn có thể thử đưa vào một số mã lỗi để tạo cả mã máy và mã lắp ráp để kiểm tra, chạy trình assembler so sánh mã máy từ ngôn ngữ assembly với mã máy bạn đã tạo trực tiếp và sử dụng nó để gỡ lỗi/xác nhận mã máy (nếu có thể, đôi khi những người lắp ráp muốn làm việc riêng của họ, không phải những gì bạn muốn họ làm).

+0

Tạo cả hai mã máy để chạy và lắp ráp để gỡ lỗi/kiểm tra chống lại, là một ý tưởng tuyệt vời. Tôi nghĩ rằng đây là những gì tôi sẽ làm. Cảm ơn nhiều. – AlexJ136

2

Điều tôi đã làm là tạo mã C/C++/Fortran, biên dịch nó một cách nhanh chóng, liên kết nó thành tệp DLL và tải động DLL, tất cả đều mất tối đa vài giây. Bạn có thể làm tương tự, ngoại trừ tạo ASM. Đó là một kỹ thuật rất hiệu quả khi bạn cần tốc độ của mã kết quả, cộng với sự linh hoạt của mã (và các thư viện thời gian chạy) của ngôn ngữ bạn đang tạo ra.

+0

Tôi đã quyết định đi với tùy chọn mã máy, nhưng tôi thấy đây là một ý tưởng rất thú vị, tôi sẽ xem xét nó cho các dự án trong tương lai. Bạn có biết bất kỳ bài viết/hướng dẫn liên quan nào không? – AlexJ136

+0

@ AlexJ136: Các bài viết? Những điều quan trọng cần tìm hiểu là 1) cách viết một DLL (bất kỳ ví dụ nào sẽ làm), 2) cách "bóc vỏ" để chạy trình biên dịch + liên kết dưới sự kiểm soát của chương trình của bạn, và 3) cách tải một DLL và nhận thủ tục giải quyết nó xuất khẩu. –

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