All streams
Search
Write a publication
Pull to refresh
34
0
Антон Гуща @NCrashed

User

Send message
На самом деле синтаксических средств для такой маркировки возвращаемого типа в D не существует, а структуры не могут реализовывать интерфейсы.
Если только в этих структурах нет замыканий, иначе будет ошибка компиляции. В посте было про этот «хак».
В 99% случаев использования, возвращается тип, реализующий range, пользователь не должен задумываться какой именно это range, почти все функции в Phobos работают с range'ами. В остальных экзотических случаях, да, придется явно описать в документации какой интерфейс реализует скрытый тип. Идея с шаблонами — статическими интерфейсами очень интересна, думаю можно реализовать это с помощью рефлексии как library solution.

Также можно поизвращаться и через рефлексию считать все поля и методы Voldemort типа и сконструировать свой (через mixin), а заодно функцию, которая превращает экземпляр Voldemort типа в кастомный. В общем, огромное поле для ненормального программирования.
При публикации очередной записи с DConf 2013 (День 2. Выступление 4) стали доступны результаты более детальных бенчмарков. Посмотреть их можно на слайдах и в документе.
Node.js имеет JIT компиляцию, поэтому сравнить стоило.
Vibe не собрался с последним gdc, ldc не пробовал. На гитхабе есть тикет, в котором люди добивались большего быстродействия vibe перед node.js: github.com/rejectedsoftware/vibe.d/issues/38
Бенчмарк проводил с помощью:
ab -r -n 100000 -c 100 http://127.0.0.1:8080/


Проц: AMD Athlon(tm) 64 X2 Dual Core Processor 3800+

Сравнивал helloword для vibe и node.js:
vibe dmd:  4183.49 #/sec
node.js helloworld: 3695.95 #/sec 
Итого к этому и пришли, rdmd скрипт в /etc/init, но все же приятнее, когда в сервере есть встроенный daemon режим, так как не нужно придумывать своих config файлов и способов логирования ошибок.
Редис только пробовали, пока искали альтернативу сломанному монго драйверу. Вся суть:
1. import vibe.db.redis.redis;
2. создать RedisClient,
3. У полученного объекта есть все методы, которые описаны в офф. списке комманд

В репе vibe есть пример: github.com/rejectedsoftware/vibe.d/blob/master/examples/redis/source/app.d
Согласен, в данной реализации это совсем не безопасно. Лучше заменить на встроенный вариант без этой дыры:
   auto router = new URLRouter;
    router.get("/:r",&index_req);
    router.get("/",&index);
    router.get("*", serveStaticFiles("./public/"));
    ...

*Промахнулся, это ответ для ветки чуть выше*
Давно использую vibe.d, но у него есть один большой недостаток: отсутствие daemon режима, который необходим при доступе через ssh. Пришлось писать костыльную обертку, форкающую процесс с vibe.

Очень важно: vibe еще не достиг production состояния (хотя сам язык близок к этому). Если решите использовать, готовьтесь столкнутся с сотнями багов и необходимостью допиливания напильником исходников фреймворка.
Причём оборудование требует сверхчистый воздух, обычные компрессоры не пойдут.


Можно пояснить этот момент подробнее? Понятно, что пыль на плате при нанесении пасты нежелательна, но зачем присоскам в СМД станке сверх чистый воздух? Как я представляю себе механизм работы этих присосок, сам поршень, создающий отрицательное давление, находится далеко от рабочей зоны.
Год назад все эти фреймворки были в альфа версиях. Постоянно пользуюсь GtkD, он пару месяцев назад релизнулся, и последняя версия точно собирается с dmd v2.062.
Double-spending атака возможна и при владении меньшей долей вычислительных ресурсов. При 20% и 3х подтверждениях атака пройдет в 10 случаях из ста. Чем меньше доля у плохих парней и чем больше подтверждений транзакции, тем меньше вероятность успеха атаки.

Источник: btcsec.com/double-spending/
Думаю, именно из-за такого безобразия в метапрограммировании на шаблонах Александреску и сбежал в D.
Compile-time аналог на D (используя цепную дробь):
module ecompute;

import std.stdio;

// Вариант 1, используя CTFE
static double computeE1(int n)
{
	double innerCompute(int i, int m)
	{
		if(m <= 0)
		{
			return 0.0;
		}
		return 1.0/(
			    1.0 + 1.0/(
			      i + 1.0/(
			    1.0 + innerCompute(i + 2, m - 1))));
	}
	return 2.0 + innerCompute(2, n);
}

// Вариант 2, олдскул
template computeE2(int n)
{
	private template innerCompute(int i, int m)
	{
		static if(m <= 0)
		{
			enum innerCompute = 0.0;
		} else
		{
			enum innerCompute = 1.0/(
					1.0 + 1.0/(
					  i + 1.0/(
					1.0 + innerCompute!(i + 2, m - 1))));
		}
	}
	enum computeE2 = 2.0 + innerCompute!(2, n);
}

void main()
{
	// Вариант 1
	static immutable e1 = computeE1(20);
	pragma(msg, e1);
	printf("Case 1, e = %1.20f \n",e1);

	// Вариант 2
	static immutable e2 = computeE2!(20);
	pragma(msg, e2);
	printf("Case 2, e = %1.20f \n",e2);
}

D упрощает compile-time программирование, а люди идут в своих извращениях дальше: compile-time raytracer.
Очень похоже на урезанные функторы (которые Александреску), почему бы не воспользоваться ими?
А шифрование и обусфикация может быть отключена (настроена), чтобы если я и так open-source, не получать замеделение из-за шифрования и выполнения обусфицированного кода?
Честно, когда писал свой коммент, коммента выше не было.
С интерпретатором получается нечестно, задача интересней выглядит для компилируемых языков. Сможет ли какой-нибудь компилятор лиспа переварить эту программу? Получается, что с собой надо таскать компилятор и специальный «загрузчик» который будет заменять обновленные части программы в dll/so модулях. Мало того, такая программа будет вынужденно open-source, так как в памяти придется держать все исходники.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity