LINUX.ORG.RU

Избранные сообщения one_more_hokum

Кисий язык

Форум — Development

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

Доброе слово про раст

Кто не читал, лучше почитать по ссылке, там общая идея и идеология. Потому что «кисий язык» это не язык программирования. Ну просто названия другого не придумал, а звучит красиво.

Собственно, есть ряд орг.вопросов, которые возможно помогут решить силы добра на ЛОРе.

Отдельно обращусь к растаманам. я хоть и ругался с вами, но я ругался потому, что мне не нравится то КАК вы решаете проблему и ноете на С++, как будто он является воодушевленным существом типа люфицера. Это тупо, поэтому я вас ругал разными словами. Но само стремление решать проблему похвально. Мне ваше мнение, как ни странно, интересно. Возможно, в итоге вы возьмете мои наработки с сделаете Rust++ который реально убьёт С++.

1) в КЯ предусмотрены переменные как в верилоге:

int a = 5;
int b = 4;
always int c = a + b; //c = 5+4 = 9
a = 2; //c = 2+4 = 6

этот момент уже решенный, прошу не спрашивать как будет дело с оптимизацией. будет точно также как с unused variable в Си - вжух и нету.

Однако, вопрос есть такой: мы можем добавить режим «функционального программирования»:

var foo = {
   код с returnами; в целом это как лямбда, только без аргументов
}
Годна ли идея? Погодите отвечать на этот вопрос, его надо понять в сумме и только если вы тред по ссылке выше читали.

2) 2 разных thisа. Есть this - это класс, к которому применен оператор прямо вот сейчас. а есть например that: это контекст. мы исходим из того, что описывать поведение сложных finite state machine будем в виде отдельных сценариев, которые потом машина сама соптимизирует. так вот каждый сценарий - он как класс. и в нем есть «параметры»:

int calculate(int a, int b) {
   parameter int k;
   return a*k+b;
}
....
case A {
   int k = 2;
   int x = calculcate(3,4);
}
...
case B {
   int k = 2;
   int lol = calculcate(6,8);
}
parameter присасываются к переменным в текущем контексте. Этакая лямбда-наоборот. Возможно я не прав, но вдруг это хорошая идея?

3) Улучшители конкструкций if-elif-else-for-while.

Исходный пример:

bool predicate = ....
while(predicate) {
   stmt1;

   stmt2;

   stmt3;

}
С использованием always можно сделать predicate автовычисляемым. Удобно чтоб не забыть где-то что-то. Но я предлагаю ширше использовать это слово:
bool predicate = ....
always while(predicate) {
   stmt1;
   ####if (!predicate) break;
   stmt2;
   ####if (!predicate) break;
   stmt3;
   ####if (!predicate) break;
}
код после #### - вставляется «автоматически», то есть его не надо писать. он как бы всегда есть.

Годна ли идея?

4) блоки кода можно не только «оборачивать» в {} как в С и С++, но и называть:

for(int x in (0,5)) {//не спрашивайте почему это похоже на питон
    step сделать_раз {
     ....
    }
    step сделать_два {
     ....
    }
    step сделать_три {
     ....
    }
}

если вам не интересно смотреть внутрь кода этих блоков, IDE покажет вам только названия. это удобно, и те, кто лопатил сотни кода, поймут меня.

Годно ли? Добавить ли что-то?

5) Finite-state machines и короутины. В принципе это одно и то же.

Тут на самом деле вопрос как записывать. Еще вмешивается нюанс реализации. Дело в том, что в итоге код будет генериться «жуткий»: в каждом потоке будет что-то типа futexа, маски прерываний, маски разрешения прерываний, и времени максимальной обработки. не спрашивайте зачем такое - когда пишешь гуй, который должен рендерить и паралелльно что-то считать сложное и исходник для сложного могут при этом редактировать - вот так и приходится. код IDE придется с C++ еще переписать потом на кисий язык.

Так вот, при чем тут корутины? А при том, что у вас будет 1 главный поток и N вспомогательных, и туда будут сигналиться все эвенты как прерывания. код будет исполняться «блоками», в конце каждого блока будет проверяться равенство маски «отсигналенных прерываний» маске «уже виденых». корутина в этот момент может unlikely(префикс 0x2E + jxx) уступить место другой или вообще умереть с исключением.

Вопрос, как это всё записывать? Пока идея такова:

case A(expression_which_can_be_cast_to_bool) {
   case A1(expression_which_can_be_cast_to_bool) {
   }
   case A2(expression_which_can_be_cast_to_bool) {
   }
   case LOLWAT(expression_which_can_be_cast_to_bool) {
   }
}
case B(expression_which_can_be_cast_to_bool) {
   ...
}
case C(expression_which_can_be_cast_to_bool) {
   ...
}
код вообще не знает когда его прервут, но он будет выполняться так, как будто его не прерывают. можно запретить «прерывания»(автоматически при вызове внешних функций). Собственно сюда и смотрят parameterы.

6) UB: UB разрешено, если оно не влияет на control flow. а именно: ряд операторов в выражениях могут быть неоптимизируемыми в определённых условиях.

int a = x < x+1; //UB
int a = x < x+1; //UB
if (a) ... //warning! 
if (x < x+1) ... //UB нет, "<" не оптимизируется

* * *

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

 

ckotinko ()

Кто-нибудь читал/читает это?

Форум — Talks

http://kniganews.org/navi-g/navi-sm/
Стоит ли тратить время?

 ,

e1nste1n ()

Linux Device Drivers, 4th Edition ...soon

Форум — Development

Уже вроде как собираются выпускать новое издание незаменимой классики:

Linux Device Drivers, 4th Edition

Но что делать до октября, а потом еще пару месяцев пока книга физически дойдет?
Другими словами «есть че почитать по теме кодинга для кернела из более-менее не протухшего?».

И сразу сюда еще, раз уже начал писать: что курить для вливания в железяки и ембеддед, тоже лучше посвежее cast Eddy_Em, некромансер и кто тут еще с железяками воюет.

upd: кстати, может сделать раздел для тех. литературы?

 ,

unt1tled ()

Самые необычные произведения

Форум — Talks

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

для затравки: «Котлован» Платонова и «Толстая тетрадь» Аготы Криштоф

 ,

Alyssa ()

помогите с настройкой системой контроля версий

Форум — Development

В общем есть задача:

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

В общем пара вопросов:

1)какую систему лучше использовать для такой работы, git или mercurial? 2)допустим некто «А» работает над своей веткой и хочет слить свою и master, но некто «Б» за час до этого уже слил свою ветку с master и получилось, что у «А» устаревшая копия, как в таком случае стоит поступать? может сделать какой-нибудь скрипт, кторый перед merge переключается на главную, делает pull, и сливает ветки? где легче это разрулить в git or mercurial? 3)они работают с Yii2, как там с поддержкой git, просто ли все это настроить без всяких уродливых костылей? 4) кто-нибудь переносил проект с mercurial на git, можете что-то посоветовать?

В общем любые советы, идеи и т.д. принимаются охотно и с радостью :)

Спасибо.

 ,

IvanR ()

Ликбез - как выполняется программа в линуксе

Форум — Development

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

 

dizza ()

Опубликованы исходные коды HElib

Новости — Open Source
Группа Open Source

HElib — библиотека, предоставляющая функции гомоморфного шифрования. На данный момент она включает реализацию криптосистемы Brakerski-Gentry-Vaikuntanathan (BGV), оптимизированной по быстродействию, в том числе за счёт эффективного использования техники упаковки зашифрованного текста Smart-Vercauteren и оптимизаций Gentry-Halevi-Smart.

Над библиотекой работают сотрудники IBM Watson Research Center Виктор Шоуп (Victor Shoup) и Шаи Халеви (Shai Halevi).

Гомоморфное шифрование позволяет производить операции с данными (такие, как, например, сложение и умножение чисел) без их расшифровки. Идея создания таких систем была впервые высказана во второй половине XX века одним из создателей RSA, Рональдом Ривестом, но была ошибочно оценена как нереализуемая. Первая гомоморфная система, позволяющая одновременно выполнять операции и сложения и умножения, была изобретена сотрудником IBM Крейгом Гентри (Craig Gentry) в 2009 году.

HElib написана на C++ с использованием математической библиотеки NTL. Исходный код распространяется согласно GPL.

>>> Подробности

 , , ,

prozium ()

PID регулятор

Форум — Development

Накидал простенький ПИД-регулятор для того чтобы поддерживать заданную скорость робота с двумя ведущими колесами. Формулы брал тут. Он вроде бы и работает, но я не могу его никак подобрать ему коэффициенты, постоянно то с места сдвинуться не может, то едет рывками, то разгоняется за несколько секунд до максимальных оборотов. Гляньте пожалуйста, мб я где нибудь глупую ошибку допустил в коде.

// main.c
#include "asuro.h"
#include "def.h"
#include "pid.h"

extern uint16_t left_speed = 16;
extern uint16_t right_speed = 16;
extern uint8_t pid_enable = 1;

int main(void)
{
    Init();
    
    EncoderInit();
    EncoderStart();
    
    // main loop
	while(1) {
		process_pid();
	}
    
    return 0;
}
// def.h
#ifndef DEF_H
#define DEF_H

// PID regulator coefficients
#define kP 		5
#define kI		0
#define kD		0

// PID regulator settings
#define PID_INTERVAL 		100
#define MOTOR_MAX_SPEED 	255
#define MOTOR_MIN_SPEED 	0

#endif // DEF_H
// pid.h
#ifndef PID_H
#define PID_H

#include "asuro.h"
#include "def.h"

uint16_t left_speed = 0;
uint16_t right_speed = 0;

uint8_t pid_enable = 0;
static uint32_t prev_pid_time = 0;

static uint16_t left_prev_error = 1;
static uint16_t right_prev_error = 1;
static float left_prev_i = 1;
static float right_prev_i = 1;

void process_pid(void);
static uint8_t pid_compute(int current, int must_be, uint16_t *prev_error, float *prev_i);

#endif	// PID_H
// pid.c
#include "pid.h"

void process_pid(void)
{
	if(!pid_enable) return;
	
	if(Gettime() > prev_pid_time){
		if(Gettime() - prev_pid_time >= PID_INTERVAL){
			uint8_t l_pwm = pid_compute(encoder[LEFT], left_speed, &left_prev_error, &left_prev_i);
			uint8_t r_pwm = pid_compute(encoder[RIGHT], right_speed, &right_prev_error, &right_prev_i);
			MotorSpeed(l_pwm, r_pwm);
			encoder[LEFT] = 0;
			encoder[RIGHT] = 0;
			prev_pid_time = Gettime();
		}
	} else {
		if(0xFF - prev_pid_time + Gettime() + 1 >= PID_INTERVAL){
			uint8_t l_pwm = pid_compute(encoder[LEFT], left_speed, &left_prev_error, &left_prev_i);
			uint8_t r_pwm = pid_compute(encoder[RIGHT], right_speed, &right_prev_error, &right_prev_i);
			MotorSpeed(l_pwm, r_pwm);
			encoder[LEFT] = 0;
			encoder[RIGHT] = 0;
			prev_pid_time = Gettime();
		}
	}
}

static uint8_t pid_compute(int current, int must_be, uint16_t *prev_error, float *prev_i)
{
	float p, i, d;
	uint8_t output;
	int16_t error = must_be - current;
	
	p = kP * error;
	
	i = *prev_i + (kI * error);
	
	d = kD * (current - *prev_error);
	
	output = p + i + d;
	
	if(output > MOTOR_MAX_SPEED) output = MOTOR_MAX_SPEED;
	if(output < MOTOR_MIN_SPEED) output = MOTOR_MIN_SPEED;
	
	*prev_i = i;
	*prev_error = error;
	
	return output;
}

 ,

WRG ()

qt4-qt5 веб-интерфейс

Форум — Development

Всех приветствую. Возник срочный вопрос принципиального характера. Есть некая гуи-прога написанная на qt4 (ну или 5). Есть там некоторый интерфейс на базе стандартных виджетов. Есть ли какая-то возможность ко всему это прикрутить веб-морду с минимальными усилиями? Веб-морда должна просто копировать интерфейс и все.

Есть конечно вариант пробросить интерфейс через ssh -XC, но это будет запасной вариант.

 ,

yax123 ()

Cнова преобразование Фурье - откуда магия?

Форум — Development

День добрый, уже был пост о понимании fft, вот он:

Понимание преобразования Фурье

Все работает, частоты находятся. Но в процессе работы обнаружилась одна интересная особенность, о которой я и хочу спросить.

Пусть есть поток steam, который возвращает 512 целых чисел с частотой 44100

CHUNK = 512
RATE = 44100
freqs=np.fft.fftfreq(CHUNK)
while True:
    data = stream.read(CHUNK)
    data=struct.unpack('%dh'%CHUNK, data)
    w = np.fft.fft(data)
    amp=np.array([np.absolute(x) for x in w])
    idx=np.argmax(amp)
    max_freq=freqs[idx]
    freq_in_hertz=abs(max_freq*RATE)
    print(freq_in_hertz)

Полный код

http://pastebin.com/e091BBc7

Для перевода частоты в герцы мы умножаем частоты, которые вернула fft на частоту дискретизации. Но такой подход несет в себе очевидные минусы, точность хромает. Теперь будем считывать по 4 чанка за раз

CHUNK = 512
RATE = 44100
num_chunks=4
freqs=np.fft.fftfreq(CHUNK*num_chunks)
while True:
    data=list(itertools.chain.from_iterable(struct.unpack('%dh'% CHUNK, stream.read(CHUNK)) for _ in range(num_chunks)))
    after_fft=np.fft.fft(data)
    amp=np.array([np.absolute(x) for x in after_fft])
    idx=np.argmax(amp)
    #print(idx)
    max_freq=freqs[idx]
    freq_in_hertz=abs(max_freq*RATE)
    print (freq_in_hertz)

Все работает, но когда мы переводим в герцы,то просто снова умножаем на частоту дискретизации. Но это же бред, для fft она должна быть в 4 раза меньше,ведь мы кормим ей по 4 чанка за раз. Плюс на вычисление всей этой ерунды время тратится, но как то работает

Почему?

 ,

helium ()

Понимание преобразования Фурье

Форум — Development

Привет, нужно получить спектр частот с микрофона, и для этого разобраться с FFT.

Ряд Фурье http://rghost.ru/53785377/image.png

В другой форме http://rghost.ru/53785428/image.png

Так как все функции уже написанны, юзаю готовую библитотеку для питона numpy

>>> np.fft.fft([1, 2, 1, 0, 1, 2, 1, 0])
array([ 8.+0.j,  0.+0.j,  0.-4.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+4.j,
        0.+0.j])
скормил fft 8 точек искомой функции, получил 8 комплексных чисел вида a + b*j, те можно получить амплитуду для каждой составляющей

A = sqrt(a^2+b^2) (вторая пикча)

А теперь эти амплитуды нужно сопоставить каким-то частотам. Тут я и застрял. По логике вещей частота должна соотвествоать ее индексу в массиве (ω,2ω,3ω)

Но нашлась функция fft.fftfreq, на вход получающая количество точек.

>>> np.fft.fftfreq(8)
array([ 0.   ,  0.125,  0.25 ,  0.375, -0.5  , -0.375, -0.25 , -0.125])
Откуда эти цифры? ЯННП.

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

Доки http://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.fft.html#numpy....

 ,

helium ()

А что у нас есть свободного для работы с OBD2?

Форум — Development

Нарыл на ибее OBD2-сканер. Стоит недорого, судя по роликам на тытрубе, в линуксе работает (он просто эмулирует последовательный порт и можно хоть в сессии screen, хоть в com каком-нибудь «пообщаться» с ним в бинарных кодах).

Немного погуглив, нашел какие-то бородатые страшилы (на пхытоне, например, или на жабе). Еще видел что-то на плюсах, но там расшифровки кодов не было.

Вопрос: есть ли в природе нормальный «родной» для линукса свободный софт для работы с этой железякой? Обязательно с поддержкой Hyundai. Если нет — то хотя бы оформленные в виде заголовочных файлов коды ошибок/расшифровки где-нибудь на просторах интернета валяются?

В принципе, судя по протоколу, с OBD2 работать просто. Неохота лишь эти тонны диагностических сообщений для расшифровки кодов вручную прописывать. Хочу консольную утилитку, которая бы мне писала ошибки + текущее состояние системы. А еще в планах — купить дочке игрушку (планшет на 10"), чтобы мультики в машине смотрела. Так можно было бы и туда что-нибудь прифигачить. Вроде как программировать под ондроед не сильно сложно? А в наполеоновских планах — реализовать это дело на STM32 (кстати, есть свободный проект — надо будет покопаться, но он коды не расшифровывает), чтобы на экранчике текст выводился.

 ,

Anon ()

Софт для диагностики ЭБУ автомобилей (Linux)

Форум — Talks

Доброго времени суток, обращаюсь к автолюбителям LORа. Суть такова: существуют ли под Linux программы для диагностики электронных блоков управления (BOSCH, Январь, etc), то бишь аналоги Мотор-Тестер под оффтопиком?

PaRuSoft ()

Подскажите как правильно оргнизовать замыкания в LLVM

Форум — Development

Нужен простой пример.
Спасибо.

 , ,

deterok ()

[Toolchain][ARM] Как собрать?

Форум — Development

Вот скрипт который собирает тулчейн для arm-linux-gnueabi- архитектуры из последних версий гнутых инструментов. Как не странно все не так сложно, потребовалось тако три небольших костылика на уровне скрипта сборки, в остальном НИКАКИХ патчей на ванильные утилиты. Собираются С и С++ кросс компиляторы + кросс отладчик и отладочный сервер для целевой архитектуры. Для работы скрипта нужно чтобы в системе стоял набор пакетов разработчика достаточный для компиляции GCC 4.5 версии, а именно GMP + MPFR + MPC + PPL + CLOOG (версии можно уточнитьв мурзилке по сборке gcc). В OpenSUSE 11.3 все необходимое есть из коробки (если поставить через YAST или zypper).

Скрипт можно взять здесь:
http://www.antario.org.ru/downloads/build-toolchain

Использование:
./build-toolchain <директория установки тулчена> [get]

в директорию установки вы должны уметь писать, не в какие переменные среды её прописывать не надо. Указав вторым параметром слово get скрипт сам скочает сырцы если у вас из нет. Логи сборки с ошибками записываются в файлы build.log в соответствующих директориях. Перед сборкой никаких подкаталогов build существовать не должно!

Адаптация под другие версии утилит возможны путем замены соответствующих циферок в скрипте, если версии не сильно отличаются то скорее всего все пройдет успешно. Я тестировал на:
linux-2.6.36
binutils-2.20.1
gcc-4.5.1
glibc-2.11.2 (для 2.12 нету портов пока :( )
gdb-7.2
Возможно заменить и саму целевую архитектуру arm-none-linux-gnueabi на что-нибудь другое что поддерживает glibc. Однако для архитектуры отличной от arm возмоно придется поправить спецификацию (переменная TARGET_SPECS, ато штука служит для прямого указания скриптам configure от glibc на наличие/отсутствие некоторых возможностей на целевой архитектуре, так как пока не собрана финальная вермися самой glibc компилер не может проверить их наличие напрямую - тесовые программы не слинкуются!)

ЗЫ: Вся эта деятельность навеяна тем что crosstool-ng 4.4 версию gcc собирают через откровенную жопу - например работоспособный busybox она собрать не в силах. 4.5 вообще пока не знают. Правды ради нужно сказать что 4.3 версия работает нормально, но старовата (не некоторых фишек от плюсов). И еще crosstool-ng занимается фигней собирая (часто через задницу) вспомогательные либы для gcc которые прекрасно можно найти и в самой системе.

ЗЫЫ: Скрипт написан без применения вертолетостроительного шел программирования так что потенциально его понять может любой желающий.

mskmsk1985 ()

Посоветуйте годной научной фантастики

Форум — Talks

Сабж. Прочитал «Древний» Тармашева. Прочитал «Эпоху мертвых» Круза. Очень понравилось.

И вообще, есть же классика научной фантастики. Посоветуйте.

 ,

ekzotech ()

10 причин почему программист на С++ может выбить много денег

Форум — Development

Список в конце поста написан Лавсаном 2 года назад. (2011-03-23 19:56:00) (источник)
Надеюсь, автор не подаст жалобу в Роспатент за перепечатку :-)
Кстати, sudo cast lovesan.

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

Временное резюме: С++ всё еще актуален по историческим причинам. Еще есть мобилки (sudo cast mono), гиперкластеры для шиндовс 3.11 (sudo cast vromanov) и базы данных. Т.к. он актуален, но не предназначен ни для чего (см. выводы в конце списка) новых специалистов по нему должно быть мало. Маленькая конкуренция на огромной области применения — огромное лавэ $$$. Вот это и есть истинная причина использовать кресты — возможность срубить €€€.

Честно говоря, «хитрый план» мне уже очень надоел, поэтому пора открыть карты.

Заодним, крестопоклонники смогут выйти на последний и решительный бой, т.к. сегодня пятница и вечером будет время пообщаться. Поклонникам мамкиного борща тоже наверняка есть что добавить, конструктивно и аргументированно.

Вот этот список:

  1. Вырвиглазный синтаксис и контекстно-зависимая грамматика
    • медленная компиляция
    • частые «internal error» в компиляторах
    • код плохо читается и его сложно поддерживать
    • разбор кода различными инструментами, вроде IDE, и его генерация - сильно затруднены
  2. ручное управление памятью
    • неудобства при работе с динамической памятью
    • утечки памяти
    • висячие ссылки
    • сегфолты
    • стандартные средства, как то malloc/new, работают медленно
    • фрагментация кучи
    • велосипедные аллокаторы на каждом шагу
      • которые далеко не факт что эффективнее malloc/new

    • велосипедные счетчики ссылок на каждом шагу, опять же
      • медленная работа
      • перерасход по памяти

    • отладка затруднена
    • написание GC, по факту, невозможно, отчасти из-за (5), (7) и (8)
  3. Никакого ABI
  4. Нестандартизированный и непредсказумый name mangling
  5. Дублирование функционала Си
    • сами фичи из Си никуда не деваются при этом
      • отчасти из-за того, что по функционалу превосходят аналоги из C++

    • запутывает новичков
    • malloc - new/new[], free - delete/delete[]
    • препроцессор - шаблоны
    • указатели - ссылки
      • ссылка не может быть NULL, что способствует появлению висячих ссылок и сегфолтов

    • структуры - классы
    • stdio - iostream
  6. Стандартная библиотека убога
    • Отсутствует даже такой функционал, как вменяемая работа со строками и многомерные массивы
      • Юникод?

  7. Слабая типизация
    • способствует ошибкам
    • затрудняет отладку
    • const не дает абсолютно никаких гарантий
    • при этом система типов невероятно переусложенена
      • в основном из-за пунктов (2), (5) и (9)
      • медленная компиляция
      • частые внутренние ошибки в компиляторах

  8. объектая система убога
    • практически никакой интроспекции
      • отладка затруднена
    • передача объектов по значению
      • понятие идентичности объекта теряет смысл
      • добавляет сложностей в управлении памятью
      • добавляет сложностей при отладке
      • используется часто, по причине (2)
        • перерасход по памяти
        • медленная работа

    • множественное наследование неудобно в использовании
      • проблема ромба по дефолту не разрешается никак

    • исключения в конструкторах гарантированно влекут утечку памяти
      • исключения в деструкторах тоже, и просто утечку - еще в лучшем случае
        • коды ошибок деструкторы и конструкторы возвращать не могут
          • ошибки в них не обработать никак
            • поэтому ими стараются не пользоваться
              • раздувание кода

    • деструктор можно вызывать до выхода из блока кода, или до delete
      • гарантированная утечка ресурсов/сегфлот
      • это не предотвратить никак, деструктор обязан быть public

    • одиночная диспетчеризация
      • виртуальные методы в конструкторах не работают
      • реализована убого
        • pure virtual function call
        • сложности в случае с множественным наследованием
        • деструкторы обязаны быть виртуальными
          • по дефолту - не виртуальные

        • никаких интерфейсов, только классы

    • порядок инициализации статических членов классов не определен
    • private, public и protected не дают никаких гарантий сокрытия данных
      • к инкапсуляции же не относятся совершенно никак

    • отсутствие «свойств»
      • вынуждает городить getter'ы и setter'ы
        • раздувание кода
        • размывание интерфейса класса

    • неявно генерирумые конструкторы, деструкторы и операторы присваивания
    • «friend» нарушают инкапсуляцию
  9. шаблоны
    • очень сильно замедляют компиляцию
    • раздувание кода
    • обфускация кода
    • результат раскрытия плохо предсказуем
    • сложности в отладке
      • километровые и плохо читаемые сообщения об ошибках при компиляции

    • нарушают инкапсуляцию
      • обязаны содержать реализацию в заголовочных файлах

    • позволяют генерировать некорректный код
  10. исключения
    • отсутствие finally/unwind-protect
      • заставляет городить классы ради одних деструкторов
        • раздувание кода
        • медленная компиляция
        • медленная работа

    • конфликтуют с другими возможностями языка
      • конструкторы/деструкторы
      • ручное управление памятью

    • работают медленно
    • малофункциональны (ср. CL condition system)

По причинам 3, 4, 5, 9 и 10 C++ совершенно неприменим для системного и низкоуровневого программирования. А по причинами 1, 2, 5, 6, 7, 8, и, опять же, 9 и 10 - и для прикладного.

У C++ нет области применения.

stevejobs ()

Увидел свет Antares 0.2-rc1

Новости — Open Source
Группа Open Source

После двух лет тихой, незаметной и неторопливой (очень) разработки вышел первый релиз Antares. Antares — это открытая и свободная (GPLv2) реализация системы сборки и набор библиотечного кода, ориентированные на разработку под «голое железо».

( читать дальше... )

>>> Страница проекта на GitHub

 , ,

ncrmnt ()

О хвостовой рекурсии

Форум — Development

Или с чем ее едят и как ее готовят? Набрел на статью в Википедии, ознакомился, сделал сравнительный замер времени выполнения для приведенного там примера. Результаты впечатлили, особенно если учесть, что тестировал я это для Scala с включенной оптимизацией.пиляторы

Собственно вопросов два.

1. Хотелось бы получше разобраться в устройстве хвосто-рекурсивных функций и их вызовов, дабы объяснить человеку, далекому от этой темы - в чем там магия?

2. Какие еще популярные ЯП и компиляторы поддерживают оптимизацию данного вида рекурсии?

Всем спасибо.

 

LongLiveUbuntu ()

Аналоги монад Haskell

Форум — Development

1. Какие есть аналоги монад Haskell?
2. Что почитать не слишком заумное (но философское) по монадам на русском? Теорию категорий мне не осилить, я это понял ещё в универе, 15 лет назад.

 

pacify ()