操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    本項目只是一個實驗品,這點不必再強調。仁者見仁,智者見智。

    本程序的最終目標是虛擬出一套GUI(不是現在的黑框框),在這之上要做一些游戲、界面都是可以的(代碼可以跨平臺,暫時沒在linux上試過)。在這個過程中的一切操作都是實驗性的。

    命令行管道

    【更新】19/01/21

    由于在起步階段,讀文件的接口暫時還沒做(因此不能命令行直接解釋C文件了),打算先搞多任務系統以及類似動態鏈接那樣的東西,步驟是將C文件編譯成兩個段——代碼段和數據段,然后加載到內存空間中,那么不同的源代碼加載到不同的空間中即可,要鏈接的話,保存下函數簽名和地址就行。讀取二進制文件的步驟——利用虛擬文件系統加載文件內容到內存空間中然后執行。

    任務比較多,因此可能需一段時間才能顯露雛形。

    回答幾個問題——

    的控制流——自己水平不高,因此對call/cc要有研究才可實現(當然靠copy的沒意思了)。網上都是教你如何用call/cc,很少教你去實現它。我不是用lisp去做東西,而是做lisp本身。干嘛用的?——可以將其看作qemu,但不完全是。我是想仿個操作系統帶界面罷了,做語法分析屬于邊角料內容。不是會用工具就可以了,要去了解工具本身是如何運作的,也就是俗話說的造輪子。純屬toys(實驗性項目),有興趣就去了解,沒興趣就算了。

    【更新】19/01/20

    /

    由于有項目的代碼,因此直接移植UI代碼,瞬間搞定GUI。

    示例代碼(已經支持了超多語法!):

    enum INTR_TABLE {
        INTR_PUT_CHAR = 0,
        INTR_PUT_NUMBER = 1,
        INTR_SLEEP_RECORD = 100,
        INTR_SLEEP_REACH = 101,
    };
    int sleep(int ms) {
        ms;
        interrupt 100;
        interrupt 101;
    }
    int put_char(char c) {
        c;
        interrupt 0;
    }
    int put_string(char *text) {
        while (put_char(*text++));
    }
    int put_int(int number) {
        number;
        interrupt 1;
    }
    int fib(int i) {
        if (i > 2)
            return fib(i - 1) + fib(i - 2);
        else
            return 1;
    }
    int fib2(int i) {
        return i > 2 ? fib(i - 1) + fib(i - 2) : 1;
    }
    int sum(int i) {
        int s = 0;
        while (i > 0) {
            s += i--;
        }
    

    c++判斷是否在虛擬機中_c 判斷窗體是否打開_c++ 判斷是否為指數

    return s; } int sum2(int n) { int i, s; for (i = 1, s = 0; i <= n ; ++i) { s += i; } return s; } int sum3(int i) { int s = 0; do { s += i--; } while (i > 0); return s; } int welcome() { put_string(" ________ ________ ___ ________ ________ ________ \n"); put_string("|\\ __ \\|\\ __ \\ |\\ \\|\\ ___ \\|\\ ____\\|\\ ____\\ \n"); put_string("\\ \\ \\|\\ /\\ \\ \\|\\ \\ \\ \\ \\ \\ \\_|\\ \\ \\ \\___|\\ \\ \\___| \n"); put_string(" \\ \\ __ \\ \\ __ \\ ___\\ \\ \\ \\ \\ \\\\ \\ \\ \\ \\ \\ \\ \n"); put_string(" \\ \\ \\|\\ \\ \\ \\ \\ \\|\\ \\\\_\\ \\ \\ \\_\\\\ \\ \\ \\____\\ \\ \\_____\n"); put_string(" \\ \\_______\\ \\__\\ \\__\\ \\________\\ \\_______\\ \\_______\\ \\_______\\\n"); put_string(" \\|_______|\\|__|\\|__|\\|________|\\|_______|\\|_______|\\|_______|\n"); put_string("\n\n"); put_string("Welcome to @clibos system by bajdcc!"); put_string("\n\n"); } enum TEST { TEST_IF, TEST_TRIOP, TEST_WHILE, TEST_FOR, TEST_DO, }; int test(int i) { switch (i) { case TEST_IF: put_string("fib(10): "); put_int(fib2(10)); break; case TEST_TRIOP: put_string("fib2(10): "); put_int(fib(10)); break; case TEST_WHILE: put_string("sum(100): "); put_int(sum(100)); break; case TEST_FOR: put_string("sum2(100): "); put_int(sum2(100));

    c++判斷是否在虛擬機中_c 判斷窗體是否打開_c++ 判斷是否為指數

    break; case TEST_DO: put_string("sum3(100): "); put_int(sum3(100)); break; default: put_string("undefined task"); break; } put_string("\n"); sleep(1000); } int main(int argc, char **argv) { welcome(); int i; for (i = TEST_IF; i <= TEST_DO; ++i) test(i); return 0; }

    上述代碼沒有使用標準庫,與UI的交互通過實現(看作中斷)。

    參數:FPS=30,每幀虛擬機指令執行1000次。下1秒跑完。(其實并行也可以,但會有UI刷新的問題。)

    效果:

    UI抄了/。

    效果圖

    【本系列原本為系列,因語法分析部分已基本完成,因此后續的重點會放在虛擬機設計上。故此更名為虛擬機系列~】

    經過一番番的努力c++判斷是否在虛擬機中,制作的第一個C語言虛擬機誕生了!

    目前支持語法如下:

    支持的語法

    綜觀整個,那么其中我嚴重參考并感謝的有:

    LR分析核心代碼及思路——輪子哥的vczh-/VlppC語言寄存器式簡易虛擬機及前期指令設計——/write-a-C-

    自己的微小貢獻之處有:

    內存池:負責語法樹的內存管理虛頁管理:負責虛擬機中的地址轉換對LR分析的優化,解決其中的二義性問題其余的在詞法分析、語法分析、語義分析、AST生成、指令生成中涉及到的代碼

    當然,我的目標并不是做一個C語言虛擬機就好了,這個虛擬機可是拿來用的!

    先前的陳安:【Lisp系列】啟用LR文法!中嘗試了用lisp語言去做虛擬機,但會有一個問題:lisp中的循環難以實現,而循環作為控制流語句最關鍵的就是含有跳轉指令,而虛擬機是以函數指針為參數,進行式回調的,因此無法實現跳轉,所以我就棄了。。嘗試失敗。

    目前可以編譯并運行:

    int fib(int i) {
        if (i > 2)
            return fib(i - 1) + fib(i - 2);
        else
            return 1;
    }
    int sum(int i) {
        int s = 0;
        while (i > 0) {
            s += i--;
        }
        return s;
    

    c++判斷是否在虛擬機中_c++ 判斷是否為指數_c 判斷窗體是否打開

    } int sum2(int n) { int i, s; for (i = 1; i <= n; ++i) { s += i; } return s; } int sum3(int i) { int s = 0; do { s += i--; } while (i > 0); return s; } int main(int argc, char **argv){ fib(10); sum(100); sum2(100); sum3(100); }

    遞歸及基本的控制流語句毫無壓力c++判斷是否在虛擬機中,雖然指令生成部分代碼比較不美觀,但真的比我之前寫的任何一款指令生成器都好看。

    后續支持指針和結構體之后 ,會更加強大。

    調用方式

    #include 
    #include "cexception.h"
    #include "cparser.h"
    #include "cgen.h"
    
    extern int g_argc;
    extern char **g_argv;
    int main(int argc, char **argv) {
        g_argc = argc;
        g_argv = argv;
        using namespace clib;
        try {
            cparser p;
            cgen gen;
            auto root = p.parse(R"(
    int fib(int i) {
        if (i > 2)
            return fib(i - 1) + fib(i - 2);
        else
            return 1;
    }
    int sum(int i) {
    

    c++判斷是否在虛擬機中_c++ 判斷是否為指數_c 判斷窗體是否打開

    int s = 0; while (i > 0) { s += i--; } return s; } int sum2(int n) { int i, s; for (i = 1; i <= n; ++i) { s += i; } return s; } int sum3(int i) { int s = 0; do { s += i--; } while (i > 0); return s; } int main(int argc, char **argv){ fib(10); sum(100); sum2(100); sum3(100); } )", &gen); cast::print(root, 0, std::cout); gen.gen(root); gen.eval(); } catch (const cexception &e) { std::cout << "RUNTIME ERROR: " << e.msg << std::endl; } return 0; }

    要支持從文件讀取并運行的話很簡單,修改root的來源即可。

    虛擬機運行實況

    截取一段:

    0001> [C000009C] 08 ENT 0000001C(28)
    ---------------- STACK BEGIN <<<<
    AX: 00000000 BP: E0000FF0 SP: E0000FD4 PC: C00000A0
    [E0000FD4]> 00000000
    [E0000FD8]> 00000000
    [E0000FDC]> 00000000
    [E0000FE0]> 00000000
    [E0000FE4]> 00000000
    

    c 判斷窗體是否打開_c++判斷是否在虛擬機中_c++ 判斷是否為指數

    [E0000FE8]> 00000000 [E0000FEC]> 00000000 [E0000FF0]> 00000000 [E0000FF4]> E0000FF8 [E0000FF8]> 0000000D [E0000FFC]> 00000028 ---------------- STACK END >>>> 0002> [C00000A4] 01 LEA FFFFFFFC(-4) ---------------- STACK BEGIN <<<< AX: E0000FEC BP: E0000FF0 SP: E0000FD4 PC: C00000A8 [E0000FD4]> 00000000 [E0000FD8]> 00000000 [E0000FDC]> 00000000 [E0000FE0]> 00000000 [E0000FE4]> 00000000 [E0000FE8]> 00000000 [E0000FEC]> 00000000 [E0000FF0]> 00000000 [E0000FF4]> E0000FF8 [E0000FF8]> 0000000D [E0000FFC]> 00000028 ---------------- STACK END >>>> 0003> [C00000AC] 13 PUSH E0000FEC ---------------- STACK BEGIN <<<< AX: E0000FEC BP: E0000FF0 SP: E0000FD0 PC: C00000AC [E0000FD0]> E0000FEC [E0000FD4]> 00000000 [E0000FD8]> 00000000 [E0000FDC]> 00000000 [E0000FE0]> 00000000 [E0000FE4]> 00000000 [E0000FE8]> 00000000 [E0000FEC]> 00000000 [E0000FF0]> 00000000 [E0000FF4]> E0000FF8 [E0000FF8]> 0000000D [E0000FFC]> 00000028 ---------------- STACK END >>>>

    這里就要感謝VMM虛頁機制了,定義的四個段為:

    定義的段基址

    虛頁機制支持權限控制,目前還未使用起來。

    全局數據、字符串保存在數據段中,生成的指令保存在代碼段中,程序運行使用棧,堆的話在后面支持語法會用到(會以系統調用實現)。

    后續計劃

    在題圖上已有涉及:走模擬操作系統的老路,希望這次可以比/做得更好。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有