LINUX.ORG.RU

Сообщения unsigned

 

Планы на C++17

Thoughts about C++17 by Bjarne Stroustrup. Список обсуждаемых фич большой, его часть:

So here is my top-ten list for C++17 (no order within the list):

  • Concepts (they allows us to precisely specify our generic programs and address the most vocal complaints about the quality of error messages)
  • Modules (provided they can demonstrate significant isolation from macros and a significant improvement in compile times)
  • Ranges and other key STL components using concepts (to improve error messages for mainstream users and improved the precision of the library specification “STL2”)
  • Uniform call syntax (to simplify the specification and use of template libraries)
  • Co-routines (should be very fast and simple)
  • Networking support (based on the asio in the TS)
  • Contracts (not necessarily used in the C++17 library specification)
  • SIMD vector and parallel algorithms
  • Co-routines
  • Library “vocabulary types”, such as optional, variant, string_view, and array_view

Еще предлагаются паттерн-матчинг, транзакционная память и operator.().

Надеются успеть к 17, и уже планируют корректирующий C++20.

 

unsigned
()

Мусорный вывод

Имеется самосборный git на очень старом линуксе с koi8-r. Он работает, но diff и log выдают мусор (escape-коды):

ESC[1mdiff --git a/include/rmd.h b/include/rmd.hESC[m 
ESC[1mindex 169f0bf..b6fe77f 100644ESC[m 
И так каждая строчка. Если конвеером прогнать через cat/less - мусор исчезает.

Можно ли вылечить?

 

unsigned
()

День борьбы с DRM

Сегодня Day Against DRM. O'Reilly на один день дает скидку 50% на все электронные книги.

http://shop.oreilly.com/category/deals/day-against-drm.do

 

unsigned
()

Что нужно добавить в C?

Расскажите, что бы вы хотели добавить в си? Только то, что реально можно добавить, не делая при этом новый язык. Просто фичи, которых не хватает.

Или покритикуйте мой список.

  • Константы. #define - препроцессор, const не работает полноценно в compile-time, enum только для целых и вообще для другого .
  • Лямбды (анонимные функции) - для удобства коллбеков. Можно без замыканий, т. к. они много скрывают.
  • Модули, если возможно. Для изоляции единиц трансляции.
  • Интроспекция (typeof, хотя бы) - для обобщенного программирования.
  • Более развитая макросистема - для того же. Например, возможность макросы раскрывать в директивы препроцессора.
  • Пространства имен, чистые функции, switch по составным типам, case с диапазоном - для сокращения кода.
  • Аналоги volatile и restrict с более точным контролем - для микрооптимизации.
  • Доступ к стеку вызовов, goto между функциями - для трюков типа трамплинов.
  • В стандартной библиотеке - строки, контейнеры, foreach, большие числа. Возможно, сокеты.

 

unsigned
()

0install переписан на OCaml

Немного дилетантское, зато беспристрастное и прагматичное сравнение нескольких ЯП. Автор 0install решил переписать свое творение с питона, поскольку ему надоело бороться с багами, вызванными динамичностью языка (многие из них возникли при переходе на тройку и всё еще продолжают вылезать), к тому же не всегда хватает скорости. Был проведен сравнительный анализ нескольких кандитатов:

http://roscidus.com/blog/blog/2013/06/09/choosing-a-python-replacement-for-0i...

http://roscidus.com/blog/blog/2013/06/20/replacing-python-round-2/

Коротко:

- Python - отличная выразительность, удобный деплой, популярность. Но медленный и никаких статических проверок.

- OCaml - победитель. Почти все возможности питона, но быстрый, с хорошим отловом ошибок. GUI пишется проще чем на питоне. http://roscidus.com/blog/blog/2014/02/13/ocaml-what-you-gain

- Rust - уверенный лидер. Отброшен из-за незрелости.

- Go - уверенный аутсайдер.

- ATS - потрясающая скорость, но слишком нечеловеческий язык.

- Haskell - хороший вариант, но идеологически далек от питона, извращеннее окамла, у библиотек нестабильный API.

- C# - неплох, но жирный и медленный.

Автор, до того не знавший окамла, теперь работает с ним за деньги.

 ,

unsigned
()

Кармак и хаскель

http://www.youtube.com/watch?v=1PhArSujR_A&list=PLqSz8wYk5VJTsadQnU9EId6G...

Кармак с энтузиазмом рассказывает, как с головой погрузился в Haskell и Scheme, объясняет, почему хаскель невероятно крут и почему сегодня он бы, вероятно, сделал QuakeScheme вместо QuakeC. Он пишет на хаскеле порт wolf3D.

Другие новости: SICP рулит; строгая статичная типизация рулит; сборка мусора рулит.

 

unsigned
()

Языковый базис

Интересно, какие ЯП могут составить наименьшее множество наиболее простых языков, хорошо реализующих все существующие концепции программирования. Так, чтобы любой другой язык являлся комбинацией этих языков, а сами базисные языки имели бы как можно меньше пересечений.

Другими словами, это оптимальный набор языков для обучения программированию.

Какие языки вы бы предложили?

unsigned
()

Простой отладочный вывод

Как лучше сделать сабж? Нужен обычный поток (или что-то на него похожее), который либо превратится в std::cerr, либо уйдёт из кода.

Я пробовал так:

// debug.hpp
#include <iostream>

static struct Debug {
	template <typename T> Debug& operator<<(T arg)
	{
		(void)arg;
#ifdef DEBUG
		std::cerr << arg;
#endif
		return *this;
	}
} dbg;

// main.cpp
#include "debug.hpp"
//#include <qapplication.h>

int main()
{
	dbg << "Hello" << std::endl;
}

Это почти работает, но не является потоком (что простительно) и не уживается толком с Qt:
test.cpp: In function `int main()':
main.cpp:6: no match for `Debug & << {unknown type}'
/usr/lib/qt-3.3.3/include/qcstring.h:135: candidates are: class QDataStream & operator <<(QDataStream &, const QByteArray &)
/usr/lib/qt-3.3.3/include/qcstring.h:243:                 class QDataStream & operator <<(QDataStream &, const QCString &)
/usr/lib/qt-3.3.3/include/qstring.h:828:                 class QDataStream & operator <<(QDataStream &, const QString &)
/usr/lib/qt-3.3.3/include/qpoint.h:103:                 class QDataStream & operator <<(QDataStream &, const QPoint &)
...
Проблема в endl. Если убрать шаблон и явно записать все варианты - то работает, но копипаста слишком много.

1. Почему не работает в таком виде?

2. Можно ли сделать лучше (но не сильно сложнее)?

 

unsigned
()

Планшет для программиста

Посоветуйте, что подойдёт для работы с кодом? Набирать код, собирать и отлаживать не планируется, в основном - разбираться в уже написанном. Т. е. нужны по большому счёту подсветка кода и удобная навигация. Языки разные, начиная с си.

Есть такое или я хочу странного?

unsigned
()

Надёжная проверка сигнала

Сервер большую часть времени проводит в msgrcv. Нужно, чтобы он корректно завершался по SIGTERM, поэтому в обработчике сигнала я устанавливаю глобальный флаг, который потом проверяю:

void sig(int)
{
    quit = 1;
}

int main()
{
    for(;;) {
        if(quit)
            throw SigException();
        // здесь может прийти сигнал
        msgrcv(...);
        if(quit)
            throw SigException();

        some_work();
        msgsnd(...);
    }
}
Всё бы хорошо, но если сигнал придёт в указанный момент, то обнаружится это только при поступлении очередного запроса, что создаёт впечатление потерянного сигнала. Можно ли избежать этого?

 

unsigned
()

Интерактивное обучение

Для тех, кто хочет освоить vim, но боится, что не сможет из него выйти:

http://www.openvim.com/

 ,

unsigned
()

Сборка мусора на умных указателях

Многие пользуются shared_ptr, немногие - Boehm GC, а почему не объединить их преимущества, сделав mark-n-sweep на умных указателях? Это бы решило проблемы обоих вариантов (вероятно, за счёт большего расхода памяти).

Или такой вариант применяется, просто я не встречал?

 

unsigned
()

Objective-C обошёл C++

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Объектный C, продолжая крутой подъём последних лет, впервые обошёл C++. Также за последний год:

  • C обошёл Java и вернул себе первое место (также сохраняя тенденцию);
  • резко поднялся VB.NET;
  • заметно опустились PHP и Lua;
  • Perl, Python и Lisp радуют стабильностью.

Tiobe index - рейтинг популярности ЯП, основанный на анализе поисковых запросов в Интернете.

 ,

unsigned
()

Линукс, подписанный ключом microsoft

Matthew Garrett из RedHat рассуждает об обеспечении UEFI Secure Boot в следующей федоре.

http://mjg59.dreamwidth.org/12368.html

Поскольку домохозяйка с отключением данной опции не справится, разработчики не нашли ничего лучше приобретения ключа майкрософт ($99 на счёт Verisign). Им будут подписаны загрузчик, ядро и модули ядра. Что делать со сторонними модулями ядра - пока не придумали.

Решение не окончательное, разработчикам оно не нравится, но других вариантов они пока не видят.

 ,

unsigned
()

Как жить без designated initializers?

Если инициализировать поля в порядке объявления, то будет нечитаемо, легко ошибиться и нельзя пропускать поля.

Если с помощью конструктора, то ему все равно надо передавать параметры, а они безымянные. К тому же это динамика.

Может есть еще способы?

designated initializers (не знаю, как по-русски) - это

struct A {
  int a, b, c;
} a = { .a = 1, .c = 2 }; /* a.b == 0 */

 

unsigned
()

[bug] white2 в опере расползся

От шапки до первого поста больше 50 пустых экранов, внизу еще столько же.

http://ompldr.org/vY296ZQ

Opera 9.50. В firefox и других темах все нормально. Появилось вчера/сегодня.

 

unsigned
()

[MIT][Учеба] Еще немного глобализации

http://web.mit.edu/newsoffice/2011/mitx-education-initiative-1219.html

MIT, похоже, пошел по пути Стэнфорда и весной 2012 собирается начать онлайн-обучение по ряду курсов (пока неизвестно, каких). Ожидаются онлайн-лабы и сертификаты для самых башковитых. Обучение бесплатно.

 ,

unsigned
()

[C] Изменение кода в рантайме

Допустим, при старте программы определяется, какая из множества возможных функций будет вызываться. Допустим, вызов происходит на критическом по производительности участке - тогда расходы на вызов по указателю нежелательны. Рождается трюк, идея:

#include <string.h>
#include <stdio.h>

typedef int (*Func)(void);

#ifdef PATCH
char buf[1024];
#define func   ((Func)buf)
#else
Func func;
#endif

int f1(void) { return 1; }
int f2(void) { return 2; }
int f_(void) { return 0; }

int main(void)
{
	int i, sum = 0;
#ifdef PATCH
	memcpy(buf, f2, (char *)f_ - (char *)f2);
#else
	func = f2;
#endif
	for(i = 0; i != 0xFFFFFFF; ++i)
		sum += func();
	printf("sum = %d\n", sum);
	return 0;
}
Действительно, разница значительна:
$ cc -O2 main.c && time ./a.out
sum = 536870910
 
real    0m1.353s
user    0m1.350s
sys     0m0.010s
$ cc -O2 -DPATCH main.c && time ./a.out
sum = 536870910
 
real    0m0.968s
user    0m0.960s
sys     0m0.000s
Сам вижу проблемы:

1. размер функции не определить в общем случае надежно;

2. buf может оказаться неисполняемым.

Можно как-нибудь обойти эти проблемы? Еще лучше, есть стандартные решения для подобных хаков?

 

unsigned
()

[C] Строгий алиасинг для структур

Проясните, пожалуйста, пункт стандарта 6.5/7:

An object shall have its stored value accessed only by an lvalue expression that has one of the following types:
...
— an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union)

1.

struct A;
struct B;

void f(struct A *a, struct B *b)
{
  assert(a == b);
}
Компилятор может посчитать, что a != b? В данном случае неизвестно, входит ли одна структура в другую.

Не для этого ли случая нужен атрибут may_alias?

2.

struct A { int a; }
struct B { int b; struct A a; }

void f(struct A *a, struct B *b);
Очевидно, что в этом случае a != b, но по стандарту получается, что это допустимо (и для указания обратного нужно добавить restrict). Я верно понимаю? Это ведь нелогично - для алиасинга нужно, чтобы одна структура была первым членом другой.

 

unsigned
()

[linux] Подлый хорек и саблезубая белка

  • Feisty Dunnart (сварливая сумчатая мышь);
  • Woozy Numbat (одурманенный муравьед);
  • Stable Penguin;
  • Jeff Thinks I Should Change This, But To What?
  • Holy Dancing Manatees, Batman!
  • Arr Matey! A Hairy Bilge Rat! (Карамба! Волосатая корабельная крыса!)
  • Funky Weasel is Jiggy wit it (вонючий горностай...)
  • Killer Bat of Doom
  • Man-Eating Seals of Antiquity (тюлени-людоеды древности)
  • Sheep on Meth (овца на амфетаминах?)

и прочее в том же духе.

Думаете, это предложения по наименованию ubuntu 12.04? Нет, это официальные названия релизов ядра. Пруф для примера

Кто-то еще думает, что canonical не вносит никакого вклада в ядро?*

* на самом деле, промасленный горностай появился еще в 1995.

 

unsigned
()

RSS подписка на новые темы