СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Новый интерпретируемый язык такой быстрый? — Язык loli в черновиках



Привет!

Сегодня я представлю вам мой любимый язык программирования loli.
Чем меня он так заинтересовал?

Новый язык программирования очень близок по скорости с C++, но интерпретируется.
Для начала немного расскажу про сам язык.

Loli — это встраиваемый объектно-ориентированный язык программирования, в последнее время набирающий популярность. Проще говоря, это скриптовой язык программирования.

Сразу покажу вам пример на loli:

import time

fn thread_function
{
   for i in 0...10000000: {
       var e = i * i
   }
}

import threads

var start_time = time.Time.clock()
var thread = threads.create(thread_function)

sayln(time.Time.clock() - start_time ++ " seconds")

Этот пример выполняет множественный перебор, присваивание и возведение в степень.
На выполнение ушло 41.8174 сек.

Тот же пример на языке C++:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdint.h>

static void * thread_fn() {
    double start_time = ((double)clock())/(double)CLOCKS_PER_SEC;
    for (uint64_t i = 0; i < 10000000; i++) {
        auto unsigned int _e =  i * i;
    }
    printf("%lf seconds\n", ((double)clock())/(double)CLOCKS_PER_SEC - start_time);
    return 0;
}

int main() {
    pthread_t pthread = NULL;
    pthread_create(&pthread, NULL, thread_fn, NULL)
    pthread_join(&pthread, NULL);
    return 0;
}

Скомпилированный с помощью GCC, выполняется на той же машине за 35.5917 сек.

Как мы можем заметить, разница в производительности двух довольно популярных языков составляет ~10%, что является отличным результатом для скриптового языка программирования.

Одно из особенностей интерпретатора этого языка в том, что все переменные строго типизированы, хотя это не так заметно, и хранятся в хеш-таблицах. Кроме того, сам код на loli предварительно анализируется, подгружаясь в ОЗУ в более понятном для интерпретатора виде, перед тем, выполнится.

Что происходит вокруг языка


На loli уже давно портированы различные фреймворки для мультимедиа, разработки видео-игр и обработки данных такие как FreeGLUT, LoliGL, Lurl, loli-json.

На данный момент портируются Cairo, Pango, Freetype и GTK+ для создания пользовательского интерфейса, а также OpenCV для машинного зрения.

Авторы планируют также портировать остальные наиболее популярные технологии машинного обучения.

Ну а мы уже можем начать писать на loli, либо ждать, когда язык созреет.

Ссылки:

–10
~10000

комментарии (48)

+12
farcaller ,  
Ну а мы уже можем начать писать на loli, либо ждать, когда язык созреет.

когда он созреет — его переименуют?

+5
fireSparrow ,  
Очевидно да, т.к. созревшая девушка — по определению уже не лоли.
0
ProRunner ,  
2 статьи опубликованы примерно в одно время, ссылка для связи:
habr.com/ru/post/441512
+10
DrPass ,   * (был изменён)
На этом языке нереально начать что-то писать хотя бы потому, что по нему нереально найти информацию в Интернете, с таким-то названием. Я вот просто хотел найти описание threads.create, т.к. у меня подозрение, что эта штука попутно производит распараллеливание итераций цикла между ядрами. Вместо этого нашел много вариантов секаса с маленькими девочками.
0
+1 –1
MWGuy ,  
Потоки в Loli реализуются с помощью этого расширения github.com/loli-foundation/loli-threads
+3
bogolt ,   * (был изменён)
Во-первых ваш код не компилируется, поэтому я не очень понимаю как вы получили возвращаемое значение.
Во-вторых на моем компе если исправить все ошибки он выдаст 0.021808 seconds
В третьих как известно оптимизатор выбросит ненужное, поэтому не уверен что код в цикле будет на самом деле выполняться.
Если все же сделать чтобы значение _e использовалось то время выполнения программы на си возросло у меня до 0.044946 секунд.

Еще один эксперимент я провел на самой слабой доступной мне виртуалке ( там АРМ какой-то ) и получил 0.167762 секунд на выполнение.
+1
yurrig ,  
А если еще uint64_t заменить на int (или не заменять, но собрать в 64бит моде), то и вовсе падает с 43 до 4 мс. Пробовал под VS2017.
–1
dev96 ,  
Ну как-бы правильнее юзать везде и всегда size_t.
+1
+2 –1
yurrig ,  
Ну как-бы правильнее юзать везде и всегда size_t.

Только если речь идет о количествах к-либо объектов.
0
dev96 ,  
Само собой)
0
TheDaemon ,  
Поглядите дизассемблер. Подозреваю, что при использовании _e у вас компилятор свернул цикл до одного присвоения заранее посчитанного значения переменной.
0
bogolt ,  
Я же написал об этом
как известно оптимизатор выбросит ненужное, поэтому не уверен что код в цикле будет на самом деле выполняться.
Если все же сделать чтобы значение _e использовалось то время выполнения программы на си возросло у меня до 0.044946 секунд.


сделал так чтобы значение _e выводилось в последнем принте, тот же который выводит время, и получил 0.04 секунды
+4
+5 –1
half-life ,  
В пайтоне есть import this
А здесь есть import desu?
0
+1 –1
MWGuy ,  
Нет, тут нельзя так сделать
0
AIshutin ,  
На чем запускались бенчмарки?
0
MWGuy ,   * (был изменён)
AMD FX-8300, Manjaro Linux Gnome
0
tuxi ,  
он сопоставим с Intel i5-2540M?
0
DrPass ,  
В одноядерном режиме примерно одинаковые по производительности. Но в 8300 ядер в два раза больше.
0
tuxi ,   * (был изменён)
Тогда я не понимаю, почему пример на этом новом языке так медленно работает. Речь в примере про умножение счетчика в цикле и присвоении результата переменной? Я сделал аналогичный тест на java 7, чтобы исключить оптимизацию, внутри цикла поставил присвоение результата переменной и второй строкой сохранял в массив Long.
6 секунд работал тест, точнее 6 537 093 784 nanoseconds
0
MWGuy ,   * (был изменён)
Он просто в статье написал цифры от работы с IO. А так если запустить этот код будет примерно 0.5 сек на loli, и 0.04 на C
0
tuxi ,  
без массива (то есть как в примере) получается 2688931 nanoseconds или грубо ~3ms
+8
wxmaper ,   * (был изменён)
разница в производительности двух довольно популярных языков

Эм. Нет слов.

+4
dev96 ,  
Зачем вы пишите такой ужасный НЕ C++ код и подписываете его, как C++?
Ведь люди потом ходят и рассказывают, что C++ страшное и не логичное дерьмо…

Зачем вы тут пишите результаты бенчмарков, когда код компилируется без оптимизаций?
0
MWGuy ,  
Я говорил автору то что это C, но для него что C что C++ одно и тоже…
+9
+14 –5
FlightBlaze ,  
Автор вообще дебил
0
Igor_O ,   * (был изменён)
НЛО сегодня в отпуске?..
Вы можете как-то обосновать свое утверждение? Ну, там, не знаю..., показать ошибки в коде?
Привести пример более корректно написанного кода?
Популярно объяснить, чем именно плох язык loli? (кроме проблем с поиском из-за того, что интернет — это про… про другое… Я однажды в 2010-м пытался найти Poron. Есть такой материал. Микропористый полиуретан. Удивительное свойство — после сжатия в течение многих лет восстанавливает форму. Идеальный материал для уплотнителей, которые не должны держать больших перепадов давления, но должны жить в условиях изменяющегося зазора… Я сломался на, кажется, 300-какой-то странице поисковой выдачи… Что забавно, гугль кто-то взломал. И вот прямо сейчас по запросу «poron» первые несколько страниц выдачи — про микропористый полиуретан. И никаких намеков на опечатку в слове «porn»… Но Яндекс — продолжает упорствовать… Только хардкор. Варианты с микропористой резиной — не расматриваются...)
+6
DrPass ,  
Вы можете как-то обосновать свое утверждение? Ну, там, не знаю..., показать ошибки в коде?

Я думаю, господин FlightBlaze с автором статьи сам договорится, без вашей помощи. Не вмешивайтесь в их диалог.
0
bogolt ,  
> показать ошибки в коде?
начать с того что код не си++ а чистый незамутненный си. И пусть вас не вводит в заблуждение 'auto'.

Итак раз. Этот код на си не компилируется. Ошибок несколько. Нет точки с запятой после pthread_create. pthread_join используется с неправильным параметром. Ну и конечно же _e и все внутренние циклы должны быть выброшены оптимизатором.
Итого у меня получилось так.

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdint.h>

static void * thread_fn() {
    double start_time = ((double)clock())/(double)CLOCKS_PER_SEC;
    unsigned int _e = 0;
    for (uint64_t i = 0; i < 10000000; i++) {
        _e *=  i * i;
    }
    printf("%lf seconds %d \n", ((double)clock())/(double)CLOCKS_PER_SEC - start_time, _e);
    return 0;
}

int main() {
    pthread_t pthread;
    pthread_create(&pthread, NULL, thread_fn, NULL);
    pthread_join(pthread, NULL);
    return 0;
}
// gcc a.c -pthread


Еще одна «ошибка» мне видится такой. В си++ коде мы зачем-то создаем поток выполняем все в нем и ждем его завершения. Зачем создавать поток когда можно все сделать напрямую мне неясно.

Дальше я могу ошибаться так как не знаю этого языка, поправьте меня если не прав.
В коде на скрипте — поток создается, начинает выполнять что-то, но главный скрипт судя по коду не ждет его завершения а сразу выводит сообщение. То есть внутренний цикл еще не завершился когда мы должны бы увидеть сообщение о прошедшем времени, что говорит нам о том что эти 30 секунд были потрачены скриптом на создание нового потока.
0
dev96 ,  
Попросили бы тогда кого-нибудь другого написать пример.
А этот — это просто…

Ощущение, будто пример на якобы C++ намеренно так грязно и тупо написан, когда в loli все так минималистично.

Плюс: есть ошибки.
И к чему здесь потоки? И время в loli замеряется с учетом создания потока.
0
+3 –3
0xf0a00 ,  
Я конечно очень извиняюсь, но кто то мультиков пересмотрел?
+3
+8 –5
MWGuy ,  
Аниме не мультики!
+6
zim32 ,  

Думаю этот язык займет свою нишу. А потом их всех посадят

+10
daiver19 ,  
Поздравляю, вы сравнили скорость записи в консоль на двух языках.
+6
Heian ,  
Вместо thrown нужно использовать ключевое слово baka, а вместо threads tentacles. Вместо parent sempai, и так далее. Замечательный язык будет, найдет свою нишу и будет самобытен.
+2
DrPass ,  
Да, а вместо исключений оно должно смущённо говорить «ня».
+2
MonkAlex ,  
Хм, а это довольно упорото и забавно.
Надо тогда ещё каких-нибудь типичных фраз надобавлять, которые будут компиляться.
Типа, baka hentai ~ yossya ~ iku zo ~ zettai yurusenai (контекст бы ещё придумать к этому :D)
+1
Sirikid ,  
Вместо segmentation violation будет «не туда, семпай»
+1
Nexon ,  

После чего переименовать язык в LOLi и всё встанет на свои места.

0
Misaka10032 ,  
Хм, а в C такое делается с помощью #define. Интересно, а тут есть препроцессор? Если нет — надо добавить :D
0
MWGuy ,  
он в планах
+3
Electrohedgehog ,  
Выполнил в консоли браузера:
var t = Date.now();
for (var i=0;  i<10000000; i ++){
  var e = i * i;
}
console.log('Cycle finished in ' + (Date.now()-t)  +' ms');


Судя по результатам, Javascript быстрее C++* примерно в 1600 раз. Шах и мат!

* — C++ автора статьи. Может отличаться от общепринятого С++. Возможны противопоказания. Перед применением проконсультируйтесь со специалистом.
+3
funny_falcon ,  

Очень жаль, что автор взял чужие исходники, и не упомянул откуда. Тем самым, он выдал их за полностью свои, тем самым, совершив акт плагиата: https://github.com/FascinatedBox/lily

+3
funny_falcon ,  
0
willmore ,  
За таким многообещающим заголовком надеялся найти обзор языка с примерами и разбором синтаксиса, а получил… это.
0
MWGuy ,  
0
willmore ,  
Спасибо.
0
zzzmmtt ,  
Да даже пэхапэ эту лоли уделывает, чо уж там.
work-machine:~/test$ cat loli_sucks.php 
<?php

$startTime = microtime();

for($i=1;$i<=10000000;++$i){
   $b = $i*$i;
}

echo microtime()-$startTime; echo PHP_EOL;

work-machine:~/test$ php loli_sucks.php 
0.105275
+1
Quarc ,  
8 тысячных секунды на С++.
> $ cat main.cpp
#include <iostream>
#include <chrono>
#include <thread>

using namespace std;

void thread_fn() {
    int s = 0;
    for (int i = 0; i < 1e6; ++i) {
        s += i * i;
    }
}

int main()
{
    chrono::high_resolution_clock::time_point t1 = chrono::high_resolution_clock::now();

    std::thread thr(thread_fn);
    thr.join();

    chrono::high_resolution_clock::time_point t2 = chrono::high_resolution_clock::now();
    chrono::duration<double> time_int = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
    cout << time_int.count() << "s elapsed\n";
    return 0;
}
> $ g++ -std=gnu++17 main.cpp

> $ ./a.out
0.008097s elapsed

А с О3 так и вообще меньше одной седьмой доли секунды
> $ g++ -std=gnu++17 -O3 main.cpp

> $ ./a.out
0.000131s elapsed