Cześć,
Ostatnio na L4 trochę się nudziłem i napisałem wspomniany w temacie projekt + artykuł o nim. Nie chcę tutaj się rozpisywać, jeżeli ktoś chce, to zapraszam do artykułu. Jest to mój pierwszy dłuższy art, więc wszelka konstruktywna krytyka oczywiście mile widziana.
Dla tych, którzy nie zajrzą do artykułu, o co chodzi chyba najlepiej wyjaśni przykład:
#include "string.hpp"
#include "execute.hpp"
using code = decltype(
"mov ebp , esp "
"push eax " // declare four variables
"push eax "
"push eax "
"push eax "
"mov DWORD PTR [ ebp + 8 ] , 0 "
"mov DWORD PTR [ ebp + 12 ] , 1 "
"mov DWORD PTR [ ebp + 16 ] , 1 "
"mov DWORD PTR [ ebp + 4 ] , 1 "
":loop_label "
"mov eax , DWORD PTR [ ebp + 4 ] "
"mov ebx , 15 " //we want to get 15th fibonacci element
"cmp eax , ebx "
"jge .end_label "
"mov edx , DWORD PTR [ ebp + 8 ] "
"mov eax , DWORD PTR [ ebp + 12 ] "
"add eax , edx "
"mov DWORD PTR [ ebp + 16 ] , eax "
"mov eax , DWORD PTR [ ebp + 12 ] "
"mov DWORD PTR [ ebp + 8 ] , eax "
"mov eax , DWORD PTR [ ebp + 16 ] "
"mov DWORD PTR [ ebp + 12 ] , eax "
"mov eax , DWORD PTR [ ebp + 4 ] "
"mov ebx , 1 "
"add eax , ebx "
"mov DWORD PTR [ ebp + 4 ] , eax "
"jmp .loop_label "
":end_label "
"mov eax , DWORD PTR [ ebp + 16 ] "
"exit"_s);
int main()
{
return cai::execute_code<code>;
}
cai::execute_code
, w czasie kompilacji, sparsuje kod asm, zamieni na opcody, wykona i zwróci to co było na końcu w eax, czyli piętnasty element ciągu Fibonacciego - 610.
Kod programu, który wygeneruje kompilator: (kompilowane clangiem 4.0)
main:
mov eax, 610
ret
(Fun fact: Jak zapomnimy o jednej spacji po "mov ebp , esp "
kompilator rzuci nam w twarz 70KB templejtowych błędów ^^)
All in one plik: https://github.com/stryku/ctai/blob/master/all_in_one_fibonacci.cpp
cały ctai v0.1 + powyższy przykład. Można się bawić na godbolcie.
Jeżeli ktoś, mimo wszystko, będzie chciał zaglądnąć do repo, to wspomnę tylko, że z perspektywy czasu widzę, że niektóre rzeczy można było inaczej/lepiej napisać. Wersja 2.0 będzie je uwzględniała. Na razie chciałem pokazać światu 1.0 (:
Repo: https://github.com/stryku/ctai
Art: http://stryku.pl/poetry/ctai.php
W artykule jest napisane co ctai może, a czego nie. Sam artykuł ma na celu wyjaśnienie jak ctai działa i co się dzieje pod spodem. Jeżeli znajdzie się ktoś kto arta przeczyta i dalej nie będzie wiedział WTF, to znak, że art jest do d**y. W takim wypadku byłbym wdzięczny o info co jest nie tak, co źle wyjaśniłem itp.