{"id":25184390,"url":"https://github.com/futureg-lab/fgvm-cpp","last_synced_at":"2025-10-24T17:30:49.886Z","repository":{"id":188555633,"uuid":"561729367","full_name":"futureg-lab/fgvm-cpp","owner":"futureg-lab","description":"FutureG-lab Virtual Machine : LLVM wannabe programming language parser/compiler generator (IR code generation, JIT compilation, sepcific target compilation)","archived":false,"fork":false,"pushed_at":"2022-12-13T17:27:07.000Z","size":139,"stargazers_count":0,"open_issues_count":4,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2023-08-15T21:40:17.709Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/futureg-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-11-04T11:05:59.000Z","updated_at":"2023-08-15T21:40:23.571Z","dependencies_parsed_at":"2023-08-15T21:40:23.006Z","dependency_job_id":null,"html_url":"https://github.com/futureg-lab/fgvm-cpp","commit_stats":null,"previous_names":["futureg-lab/fgvm-cpp"],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futureg-lab%2Ffgvm-cpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futureg-lab%2Ffgvm-cpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futureg-lab%2Ffgvm-cpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futureg-lab%2Ffgvm-cpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/futureg-lab","download_url":"https://codeload.github.com/futureg-lab/fgvm-cpp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238008739,"owners_count":19401303,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-09T19:32:03.235Z","updated_at":"2025-10-24T17:30:49.480Z","avatar_url":"https://github.com/futureg-lab.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fgvm-cpp\nFutureG-lab Virtual Machine : LLVM wannabe programming language parser/compiler generator (IR code generation, JIT compilation, specific target compilation)\n* Main goal is to build a easy to use compiler builder with a better developer experience.\n\n# Creating a programming language with fgvm \n```\nSource code ---\u003e Lexer/Tokenizer ---\u003e Parser ---\u003e Intermediate code compilation (fgvm IR) ---\u003e Linking ---\u003e Interpret / JIT or Compilation to a specific target assembly : x86, ARM, WASM\n```\n\n# fgvm IR v1\n\n## Description\n1. fgvm IR is designed so that each line of code represents a single atomic assignement (literal assignement or function call) that holds a strongly typed value, a bloc definition or a function definition.\n2. Any generated fgvm IR code is designed for parsers and compilers, not for humans !\n3. The current spec supports external symbols for linking purposes and prebuilt functions, the syntax is also very minimalistic, `%var_name`, `func_name`, `@some_keyword`.\n\n## IR Code example\nExample fgvm IR code generated from the Brainf_ck program `+++[\u003e+++++[\u003e+++++\u003c-]\u003c-]\u003e\u003e----------.+++++.+++++++.----.++.----------.` :\n```c\n%mem_size = u32 255\n%main_ptr = u32 alloc %mem_size\n%curr_val = u8 get_val_addr %main_ptr\n%curr_val = u8 incr %curr_val\n%set_curr_val = u32 set_val_addr %main_ptr %curr_val\n%curr_val2 = u8 get_val_addr %main_ptr\n%curr_val2 = u8 incr %curr_val2\n%set_curr_val2 = u32 set_val_addr %main_ptr %curr_val2\n%curr_val3 = u8 get_val_addr %main_ptr\n%curr_val3 = u8 incr %curr_val3\n%set_curr_val3 = u32 set_val_addr %main_ptr %curr_val3\n%curr_val4 = u8 get_val_addr %main_ptr\n%zero = u8 0\n%comp = bool eq %curr_val4 %zero\n@loop %comp loop_bloc\n@bloc loop_bloc: {\n    %main_ptr = u32 incr %main_ptr\n    %curr_val5 = u8 get_val_addr %main_ptr\n    %curr_val5 = u8 incr %curr_val5\n    %set_curr_val4 = u32 set_val_addr %main_ptr %curr_val5\n    %curr_val6 = u8 get_val_addr %main_ptr\n    %curr_val6 = u8 incr %curr_val6\n    %set_curr_val5 = u32 set_val_addr %main_ptr %curr_val6\n    %curr_val7 = u8 get_val_addr %main_ptr\n    %curr_val7 = u8 incr %curr_val7\n    %set_curr_val6 = u32 set_val_addr %main_ptr %curr_val7\n    %curr_val8 = u8 get_val_addr %main_ptr\n    %curr_val8 = u8 incr %curr_val8\n    %set_curr_val7 = u32 set_val_addr %main_ptr %curr_val8\n    %curr_val9 = u8 get_val_addr %main_ptr\n    %curr_val9 = u8 incr %curr_val9\n    %set_curr_val8 = u32 set_val_addr %main_ptr %curr_val9\n    %curr_val10 = u8 get_val_addr %main_ptr\n    %zero2 = u8 0\n    %comp2 = bool eq %curr_val10 %zero2\n    @loop %comp2 loop_bloc2\n    @bloc loop_bloc2: {\n        %main_ptr = u32 incr %main_ptr\n        %curr_val11 = u8 get_val_addr %main_ptr\n        %curr_val11 = u8 incr %curr_val11\n        %set_curr_val9 = u32 set_val_addr %main_ptr %curr_val11\n        %curr_val12 = u8 get_val_addr %main_ptr\n        %curr_val12 = u8 incr %curr_val12\n        %set_curr_val10 = u32 set_val_addr %main_ptr %curr_val12\n        %curr_val13 = u8 get_val_addr %main_ptr\n        %curr_val13 = u8 incr %curr_val13\n        %set_curr_val11 = u32 set_val_addr %main_ptr %curr_val13\n        %curr_val14 = u8 get_val_addr %main_ptr\n        %curr_val14 = u8 incr %curr_val14\n        %set_curr_val12 = u32 set_val_addr %main_ptr %curr_val14\n        %curr_val15 = u8 get_val_addr %main_ptr\n        %curr_val15 = u8 incr %curr_val15\n        %set_curr_val13 = u32 set_val_addr %main_ptr %curr_val15\n        %main_ptr = u32 decr %main_ptr\n        %curr_val16 = u8 get_val_addr %main_ptr\n        %curr_val16 = u8 decr %curr_val16\n        %set_curr_val14 = u32 set_val_addr %main_ptr %curr_val16\n    }\n    %main_ptr = u32 decr %main_ptr\n    %curr_val17 = u8 get_val_addr %main_ptr\n\n/* ... truncated ... */\n\n%curr_val60 = u8 get_val_addr %main_ptr\n%curr_val60 = u8 decr %curr_val60\n%set_curr_val53 = u32 set_val_addr %main_ptr %curr_val60\n%curr_val61 = u8 get_val_addr %main_ptr\n%print6 = bool stdout_print %curr_val61\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffutureg-lab%2Ffgvm-cpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffutureg-lab%2Ffgvm-cpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffutureg-lab%2Ffgvm-cpp/lists"}