GNU Lightning üzerinde çalışıldı

This commit is contained in:
abdussamedulutas 2026-01-11 21:34:23 +03:00
parent b0ff0ef841
commit 0c9ac1c876
4 changed files with 147 additions and 40 deletions

View File

@ -3,7 +3,8 @@
{ {
"name": "linux-gcc-x64", "name": "linux-gcc-x64",
"includePath": [ "includePath": [
"${workspaceFolder}/**" "${workspaceFolder}/**",
"${workspaceFolder}/lightning/include"
], ],
"compilerPath": "/usr/bin/gcc", "compilerPath": "/usr/bin/gcc",
"cStandard": "${default}", "cStandard": "${default}",

44
.vscode/tasks.json vendored
View File

@ -1,16 +1,32 @@
{ {
"version": "2.0.0", "version": "2.0.0",
"tasks": [ "tasks": [
{ {
"label": "build saqut", "type": "cppbuild",
"type": "shell", "label": "build saqut",
"command": "g++", "command": "/usr/bin/g++",
"args": ["-g", "-O0", "Parsing.cpp", "-o", "saqut"], "args": [
"group": { "-g", // Debug sembolleri açık kalsın
"kind": "build", "-O0", // Debug sırasında optimizasyonu kapat (kodun satırları karışmasın)
"isDefault": true "./Parsing.cpp",
}, "${workspaceFolder}/lightning/lib/.libs/liblightning.a",
"problemMatcher": ["$gcc"] "-I${workspaceFolder}/lightning/include",
} "-D_GNU_SOURCE",
] "-ldl",
"-o",
"saqut" // Çıktı ismi sabit olsun (saqut)
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "saQut için özel JIT derleme görevi"
}
]
} }

View File

@ -1,34 +1,90 @@
extern "C" {
#include "lightning.h"
}
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <sstream> #include <sys/mman.h>
#include <string> #include <unistd.h>
#include <stdlib.h> #include <chrono>
#include "./core/Tokenizer.cpp"
#include "./core/Parser/Parser.cpp"
#include "./core/IR/IR.cpp"
int main() extern "C" int saqut_print(int value) {
{ return value + 1;
std::ifstream dosyaOku("source.sqt", std::ios::in | std::ios::binary); }
std::string icerik;
if (dosyaOku.is_open()) { int main() {
std::stringstream buffer; init_jit("saqut");
buffer << dosyaOku.rdbuf(); // Dosya içeriğini buffer'a boşalt jit_state_t *_jit = jit_new_state();
icerik = buffer.str();
dosyaOku.close(); jit_prolog();
jit_movi(JIT_V0, 0); // sum = 0 (V0 kayıısı sum olsun)
jit_movi(JIT_V1, 1); // a = 1 (V1 kayıısı a olsun)
jit_node_t *loop_start = jit_label();
// sum += a (Kayııdan kayııya toplama - Işık hızında)
jit_addr(JIT_V0, JIT_V0, JIT_V1);
// a++
jit_addi(JIT_V1, JIT_V1, 1);
// a++
jit_addi(JIT_V1, JIT_V1, 1);
// a++
jit_addi(JIT_V1, JIT_V1, 1);
// a++
jit_addi(JIT_V1, JIT_V1, 1);
// a < 15000 kontrolü
jit_movi(JIT_R1, 15000);
jit_node_t *if_node = jit_bltr(JIT_V1, JIT_R1); // a < 15000 ise loop_start'a zıpla
jit_patch_at(if_node, loop_start);
jit_movr(JIT_R0, JIT_V0); // sonucu döndür
jit_retr(JIT_R0);
jit_epilog();
// --- ÇALIŞTIRMA VE KAYDETME ---
jit_realize();
jit_word_t size;
void* final_code = jit_emit();
jit_get_code(&size);
void (*func)() = (void (*)())final_code;
std::cout << "--- saQut Programı Başlıyor ---" << std::endl;
if (final_code) {
auto start = std::chrono::high_resolution_clock::now();
func();
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::micro> elapsed = end - start;
std::cout << "Süre: " << elapsed.count() << " mikrosaniye." << std::endl;
} }
Tokenizer tokenizer;
Parser parser;
CodeGenerator codeGenerator;
auto tokens = tokenizer.scan(icerik); if (final_code) {
ASTNode * ast = parser.parse(tokens); volatile int prevent_optimization = 0;
auto start = std::chrono::high_resolution_clock::now();
int sum = 0;
for(int a = 0; a < 15000; a++) {
sum += saqut_print(a);
}
prevent_optimization = sum;
codeGenerator.parse(ast); auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::micro> elapsed = end - start;
std::cout << "Süre: " << elapsed.count() << " mikrosaniye." << prevent_optimization << std::endl;
}
codeGenerator.IROpDatas; std::cout << "--- saQut Programı Bitti ---" << std::endl;
std::cout << "Kod üretildi. Boyut: " << static_cast<signed long>(size) << " bayt." << std::endl;
std::ofstream outfile("calc.bin", std::ios::binary);
outfile.write(reinterpret_cast<const char*>(final_code), size);
outfile.close();
jit_destroy_state();
finish_jit();
return 0; return 0;
} }

34
Parsing1.cpp Normal file
View File

@ -0,0 +1,34 @@
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <stdlib.h>
#include "./core/Tokenizer.cpp"
#include "./core/Parser/Parser.cpp"
#include "./core/IR/IR.cpp"
int main()
{
std::ifstream dosyaOku("source.sqt", std::ios::in | std::ios::binary);
std::string icerik;
if (dosyaOku.is_open()) {
std::stringstream buffer;
buffer << dosyaOku.rdbuf(); // Dosya içeriğini buffer'a boşalt
icerik = buffer.str();
dosyaOku.close();
}
Tokenizer tokenizer;
Parser parser;
CodeGenerator codeGenerator;
auto tokens = tokenizer.scan(icerik);
ASTNode * ast = parser.parse(tokens);
codeGenerator.parse(ast);
codeGenerator.IROpDatas;
return 0;
}