среда, 20 января 2010 г.

Язык D

В поисках С-подобного языка с нативной поддержкой строк решил попробовать язык D. Цель состоит в оптимизации строковых операций в небольших сишных утилитах, в остальном С меня вполне устраивает.

Быстродействие циклов и арифметики оказывается полностью идентично сишному варианту:

$ cat hello.d
int main(char[][] args){
int i;
double x;
for (i=0,x=0;i<100000000;i++)
x+=1.1*i;
printf("i=%d; x=%.2f\n",i,x);
return 0;
}

$ gdc-4.1 hello.d -o hello
$ time ./hello
i=100000000; x=5499999945475522.00

real 0m0.535s
user 0m0.528s
sys 0m0.000s


$ cat hello.c
#include "stdio.h"
main(){
int i;
double x;
for (i=0,x=0;i<100000000;i++)
x+=1.1*i;
printf("i=%d; x=%.2f\n",i,x);
}

$ gcc hello.c -o hello
$ time ./hello
i=100000000; x=5499999945475522.00

real 0m0.563s
user 0m0.524s
sys 0m0.004s

А теперь рассмотрим более жизненный пример, на примере работы с SQLite базой данных. Элементарный пример взят отсюда, плюс добавлен код для выполнения sql-запроса.

$cat sqlite.d
import sqlite3;

int main()
{
sqlite3* db;
int code;
sqlite3_stmt *stmt;
char *sql="select sqlite_version();";

code = sqlite3_open("file.db", &db);
if(SQLITE_OK != code)
{
printf("DB create error: %s\n", sqlite3_errmsg(db));
return 1;
}
printf("DB open.\n");

int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, cast(char**)0);
if( rc ){
printf("SQL error: %d : %s\n", rc, sqlite3_errmsg(db));
}else{
rc = sqlite3_step(stmt);
if( SQLITE_ROW == rc ) {
printf("%s = %s\n", sqlite3_column_name(stmt,0),.
sqlite3_column_text(stmt,0));
}
rc = sqlite3_finalize(stmt);
}
if (rc != SQLITE_OK) {
printf("SQL error: %d : %s\n", rc, sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
printf("DB closed.\n");

return 0;
}

$ gdc-4.1 -lsqlite3 sqlite.d -o sqlite
$ time ./sqlite
DB open.
sqlite_version() = 3.6.21
DB closed.

real 0m0.010s
user 0m0.004s
sys 0m0.004s

Замечу, что SQLite у меня собран с libICU, а в более простой конфигурации быстродействие будет выше.

Необходимый для сборки sqlite3.d был найден здесь:
http://prowiki.org/wiki4d/wiki.cgi?DatabaseBindings Указана версия SQLite 3.5.1, но у меня без проблем заработал с версией 3.6.21 моей сборки. Оно и правильно, поскольку SQLite API стабилен и обеспечивает обратную совместимость, так что только добавились некоторые новые функции, которые нас пока не интересуют.

Есть две реализации D, см.
http://www.digitalmars.com
D Programming Language

4 комментария:

Avenger комментирует...

Алексей, подскажите как с вами связаться. Отсылал письмо на pechnikov@mobigroup.ru, но ответа так и не дождался. Есть несколько вопросов по sqlite/spatialite.

Bion комментирует...

Так что скажете про сам язык? Каковы впечатления, каковы перспективы по вашему мнению?

Сам не так давно поупражнялся, понравилось. Но к сожалению, его разработка в данный момент как-бы на перепутье между D1 и D2, обратной совместимости никакой, D2 сырой. Так что ждемс.

Печников Алексей комментирует...

Мои контакты здесь: http://pechnikov.tel/

Ящик pechnikov@mobigroup.ru живой, вероятно, ваше письмо в спам угодило, попробуйте на другой адрес написать или в джаббере меня найти.

Печников Алексей комментирует...

На мой вкус, язык D излишне усложнен возможностями C++. Было бы замечательно разделить его на две ветки - D и D++.

По результатам моих экспериментов получается, что особого смысла для небольших проектов в D нет, т.к. обработку строк я в основном делаю в SQLite (там хороший набор соответствующих функций), так что разница между версиями на C и на D минимальна. Сейчас пробую newlisp, на котором код оказывается намного компактнее, а скорость запуска отстает незначительно.


(C) Alexey Pechnikov aka MBG, mobigroup.ru