У меня грустная новость.

Я создатель языка программирования Tokype и я недавно начал разрабатывать версию 0.0.3. Я начал чинить AST, ведь раньше он выдавал такое дерево AST:

funct main(): n = 1000 start = get_time() sum = 0 for i = 1 to : for j = 1 to : if (((i + j) % 2) == 0): sum = (sum + i) else: sum = (sum + j) end end end end n = 1000 start = get_time() sum = 0 for i = 1 to : for j = 1 to : if (((i + j) % 2) == 0): sum = (sum + i) else: sum = (sum + j) end end end print(sum) stop = get_time() print(((stop - start) + " sec."))

При таком коде:

funct main(): n = 1000 start = get_time() sum = 0 for i = 1, n: for j = 1, n: if (i + j) % 2 == 0: sum = sum + i else: sum = sum + j end end end print(sum) stop = get_time() print(stop - start + " sec.") end main()

Я это исправил более-менее и теперь он выдаёт почти правильный AST:

funct main(): n = 1000 start = get_time() sum = 0 for i = 1, n: for j = 1, n: if (((i + j) % 2) == 0): sum = (sum + i) else: sum = (sum + j) end end end end n = 1000 start = get_time() sum = 0 for i = 1, n: for j = 1, n: if (((i + j) % 2) == 0): sum = (sum + i) else: sum = (sum + j) end end end print(sum) stop = get_time() print(((stop - start) + " sec."))

Это он с оптимизатором. Как видите инлайнинг работает, но почему-то parser не хочет брать в тело функции встроенные функции (а именно последние 3 строчки). Возможно, он просто не понимает, как их засовывать в блоки функций.

И главная грустная новость: оказывается те бенчмарки с 0 секундами из первого поста про мой интерпретатор - это всё неправда. Я устроил очень жёсткий тест для интерпретатора и он очень долго выполнялся, но в конце написал 0 секунд. Я посмотрел оптимизированный AST и понял, что мой оптимизатор, чтобы посчитать строки по типу "stop-start" с помощью функции evaluateConstant смог получить время и просто вставил его в вызовы функций....Поэтому мой оптимизатор читерил на бенчмарках. И теперь, я готов показать те бенчмарки, но с настоящей скоростью Tokype:

Бенчмарк 1

Код:

funct main(): n = 10000000 start = get_time() a = 1 b = 2 sum = 0 for i = 1, n: sum = sum + a * b + i end print(sum) stop = get_time() print("Time: " + (stop - start) + " sec") end main()

Терминал:

50000025000000 Time: 7.3919308 sec

(до исправления бага он показывал "0 sec")

Бенчмарк 2

Код:

funct main(): n = 1000000 start = get_time() sum = 0 for i = 1, n: sum = sum + i end print(sum) stop = get_time() print("Time: " + (stop - start) + " sec") end main()

Терминал:

500000500000 Time: 0.42086830000000003 sec

(до исправления бага он показывал "0 sec")

Бенчмарк 3

Код:

funct main(): n = 1000 start = get_time() sum = 0 for i = 1, n: for j = 1, n: sum = sum + i * j end end print(sum) stop = get_time() print("Time: " + (stop - start) + " sec") end main()

Терминал:

250500250000 Time: 0.48188689999999995 sec

(до исправления бага он показывал "0 sec")

Бенчмарк 4

Код:

funct main(): n = 1000 start = get_time() a = 0 b = 0 c = 0 for i = 1, n: for j = 1, n: a = i + j b = i * j c = a + b end end print(c) stop = get_time() print("Time: " + (stop - start) + " sec") end main()

Терминал:

1002000 Time: 0.7479086 sec

(до исправления бага он показывал "0 sec")

Но, если учитывать то, что мой интерпретатор обходит AST, то я думаю результат очень хороший, а также я сделал фибоначчи, чтобы проверить насколько интерпретатор справится с ним. И терминал меня удивил:

Код:

funct main(): n = 45 start = get_time() a = 0 b = 1 for i = 2, n: c = a + b a = b b = c end print(b) stop = get_time() print("Time: " + (stop - start) + " sec") end main()

Терминал:

1134903170 Time: 0 sec

Получается все-таки мой оптимизатор может оптимизировать код до 0 секунд. Но напоминаю, что это не мой язык быстрый, а это просто оптимизатор всё вырезал.

На этом у меня всё. Всем пока!
(ищите ссылки на GitHub - в моём первом посте про Tokype)

2