Линус про C++
Его бы к нам на форум. Отцы бы его быстро научили, как вести крупные проекты. А в той рассылке ламеры не смогли дать отпор.
недавно Луговский на форуме sql.ru отжигал про С++ примерно в таком же ключе.
Я достаточно часто пишу что-то на C++ и нахожу, что для ряда программ этот язык отлично подходит.
То есть, бывают конечно проблемы, типа утечек памяти или сегфолтов, но они ведь и в C точно такие же проблемы бывают.
В качестве примера могу привести транслятор DNA->RNA, который я писал совместно с . Вот его (надо переименовать в *.cpp после скачки). IMHO это очень типичный код на C++. IMHO для этой решения этой задачи C++ подходит лучше, чем C или более высокоуровневые языки типа C#, Java, ML. Если кто-то согласен с мнением Линуса — объясните, плз, чем плох C++ для решения этой задачи.
Мне C++ не нравится разве что некоей "среднеуровневостью", когда наряду с нормальным, вобщем-то, явлением ссылок существуют указатели на память. Зачем ОО-языку указатели-то?
Сырцы не смотрел. Документация, описание есть?
> Сырцы не смотрел. Документация, описание есть?
Описание задачи: http://www.icfpcontest.org/Endo.pdf
не заметил там ничего что бы не реализовывалось на С c 5% увеличением размера кода.
если использовать С++ просто как такой синтаксический сахар то зачем вся та остальная хренотень что накручена в нём? про ахтунг который творят в boost я вообще молчу. =)
вопрос поставлен шире
не заметил там ничего что бы не реализовывалось на С c 5% увеличением размера кода.+1
и тем более непонятно, почему это там джава не пойдет?
с точки зрения простоты и быстроты и даже синтаксиса в таких простых задачах она у с++ токо выигрывает
а заодно +1 к Ильдару
что хотел сказать Линус понятно
ответом ему могут быть только действительно огромные программы
а про это совсем недавно был тред
ответом ему могут быть только действительно огромные программыТипа ядра Linux?
а в профессиональных проектах, разрабатываемых профессионалами профессиональными инструментами, такого не должно быть
в ядре linux полно утечек и порчи памяти (в релизах)Время работы ядра теоретически превышает время работы процесса.
а в профессиональных проектах, разрабатываемых профессионалами профессиональными инструментами, такого не должно быть
Где утечки более страшны будут?
ход твоих мыслей слишком сложен для меня
C++ плох тем, что он очень сложный. Причем сложный не столько концептуально, сколько во всяких мелочах.
действительно огромные программычто это за звери такие?!
что это за звери такие?!openoffice.org
Eclipse
C++ нацелен на то, чтобы быть универсальным и позволять производить высокоэффективный код.
Не хочешь использовать C++ - не используй.
EclipseЧ_о? где там много C++?
> не заметил там ничего что бы не реализовывалось на С c 5% увеличением размера кода.
Плохо смотрел сырцы. Там интенсивная работа с std::string и std::vector. На C++ я могу спокойно писать string a = b; a += c; и не думать на тему кто, когда должен выделять и освобождать память. На C я бы заебался писать все время malloc/realloc/free и думать, а нужно ли копировать эту строку или можно менять in-place? Это отнюдь не 5% от объема — это гораздо больше.
Возможность человеческой работы со строками — это огромное преимущество C++ по сравнению с C, гораздо больше, чем просто синтаксический сахар.
Зато смог бы последовательность размеров соптимизировать под конкретную задачу.
Возможность человеческой работы со строками — это огромное преимущество C++ по сравнению с CЕстественно, когда дело не касается форматированного вывода числовых данных.
Полностью согласен. Когда читаешь описание правил разрешения перегрузки — сильно хочется застрелить авторов.
Но ведь с другой стороны, никто не заставляет все эти фичи использовать. Если, например, ты посмотришь код для ICFPC, который я запостил, то он достаточно простой. Там нет шаблонов, нет перегрузок, нет специализаций. Большинство функций написаны в top-level, без включения в классы. Почти нет наследования и виртуальных методов. IMHO так и надо писать на C++. IMHO если писать программы типа GIT в таком стиле, то все будет ок. Не вижу тут проблем.
Если же люди начинают в простых программах использовать какие-то зверские сложные фичи — это только от неумения программировать. Опытный программист будет стараться писать наиболее простой код.
Если же люди начинают в простых программах использовать какие-то зверские сложные фичи — это только от неумения программировать. Опытный программист будет стараться писать наиболее простой код.Может и так, но на собеседованиях требуется знать как раз зверские фичи.
> с точки зрения простоты и быстроты и даже синтаксиса в таких простых задачах она у с++ токо выигрывает
Ты тоже плохо смотрел код. Посмотри, там используются указатели, собственный аллокатор памяти, и даже некоторое подобие copying garbage collector. Как ты такое будешь на Java делать?
IMHO так и надо писать на C++.имхо это ЖЕСТЬ
Но ведь с другой стороны, никто не заставляет все эти фичи использовать. ...Тогда зачем в C++ всё остальное? Причём многие его всё же используют.
IMHO если писать программы типа GIT в таком стиле, то все будет ок. Не вижу тут проблем.
Если же люди начинают в простых программах использовать какие-то зверские сложные фичи — это только от неумения программировать. Опытный программист будет стараться писать наиболее простой код.
Да нет, просто он на самом деле программирует на C и не признаётся. От C++ ему только syntactic sugar нужен, который можно было бы заменить какими-нибудь библиотеками, но, правда, операторы перегрузить не получится.IMHO так и надо писать на C++.имхо это ЖЕСТЬ
> От C++ ему только syntactic sugar нужен, который можно было бы заменить какими-нибудь
> библиотеками, но, правда, операторы перегрузить не получится.
А std::string — это тоже syntactic sugar?
Почему? Если ты видишь, что применение каких-то модных C++-фич способно улучшить программу, которую я привел, — покажи, как именно.
Почему? Если ты видишь, что применение каких-то модных C++-фич способно улучшить программу, которую я привел, — покажи, как именно.нет
я считаю то что, эта прога прекрасно была бы написана на Си и на любом другом языке
я не говорю, что следовало бы писать на другом языке, каждый пускай пишет на том к чему привык, на чем ему удобно
речь про то, что ты неудачный пример привел, пример который не противореит тому о чем говорил линус
> вопрос поставлен шире
А что, разве система контроля версий — это большая программа? Это же не какой-нибудь там OpenOffice или Firefox.
Вот, вся фишка в том, что проект сложный. Поэтому языком и была выбрана Java, а не C++
Не согласен с тобой. Я считаю, что при написании ее на C был бы большой геморрой в выделением и освобождением памяти из-за отсутствия std::string.
Вот возьми, например, такую функцию:
static std::string protect(int l, const std::string& s)
{
std::string d = s;
while (l > 0) {
d = quote(d);
l--;
}
return d;
}
Как бы ты написал ее на C?
Как бы ты написал ее на C?я на си уже давно не пишу
потому вопрос не ко мне
ща попытаюсь обяснить
я могу написать это на си, получится наверна громоздко, я не знаю всяких удобных либ типа буста и так далее
человек который пишет на си, тот будет все это знать
у него код будет понятным и коротким
boost::format
Поэтому языком и была выбрана Java, а не C++Про Java:
10. The wrong people like it. The programmers I admire most are not, on the whole, captivated by Java. Who does like Java? Suits, who don't know one language from another, but know that they keep hearing about Java in the press; programmers at big companies, who are amazed to find that there is something even better than C++; and plug-and-chug undergrads, who are ready to like anything that might get them a job (will this be on the test?). These people's opinions change with every wind.
А статья эта - просто отражение мнения красноглазых фанатов Пёрла.
фанатов ПёрлаЛиспа. Учи матчасть :-)
Им там и пёрл нравился
где я писал, что систему контроля версий не стоит писать на C++?
> А std::string — это тоже syntactic sugar
перегрузка операций - это унифицированное средство создания syntactic sugar
вон в куче языков нет такой перегрузки, но ввели стандартные типы а-ля string, vector
и никто такую перегрузку не просит
overkill получается?
> Возможность человеческой работы со строками — это огромное преимущество C++ по сравнению с C
где ты там человеческую работу со строками увидел?
хинт: сравни с перлом
Если ты видишь, что применение каких-то модных C++-фич способно улучшить программу, которую я привел, — покажи, как именно.Я не знаю, как часто вызывается protect и quote в нём, а так же какая длина у строк. Поэтому пишу от балды. Добавим класс protector вместо функций. Тогда мы легко уменьшим количество new/delete/memcpy в программе и получим примерно 5-20% прибавки к производительности. Это не модные Си++ фичи, это просто фичи.
Хотя вся задача на самом деле счётная и в итоге порулит алгоритм, а не какие-то частные оптимизации. (Впрочем, при строках длиной 2кб и уровне защиты 10 разница уже весьма ощутима.)
На C я бы заебался писать все время malloc/realloc/free
#ifndef CONCAT
#define CONCAT(x, y) {(x) = realloc(length(x) + length(y) + 1); (x) = strcat(x, y);}
#endif
Такое использование препроцессора - зло.
Обоснуй! (c)
вместо макросов надо писать нагромождение языковых конструкций
Вот так: ?
Вот ищешь ты баг в огромной программе, и натыкаешься на использование функции concat. Такой стандартной функции нет. Где искать её определение - хз. Что она делает - хз. Что ей можно дать - хз. Что она вернёт - хз.
Или ищешь ты баг в огромной программе (например, выдалась при компиляции сообщение о синтаксической ошибке и натыкаешься на определение такой функции. Твой concat - это ещё хорошо, там определение короткое, а если там кода на несколько килобайт? Как в них искать синтаксическую ошибку?
вот так писать будет можно?
если нет, то как это быстро понять по коду?
CONCAT(CONCAT(x, "a" "b")
да, и остается та же проблема, что и для strcat, что и вот так - почему-то писать нельзя
CONCAT("a", "b")
Вообще, этот рассказ надо было стилизовать под хоррор.
программирование, сцуко, пиздец опасное занятие
да, и остается та же проблема, что и для strcat, что и вот так - почему-то писать нельзяАга, Петя написал этот макрос, Вася использует его как функцию - и никак не поймёт, почему у него ничего не компилируется. А может быть и хуже - что компилируется, но неправильно работает.
Ага, Петя написал этот макрос, Вася использует его как функцию - и никак не поймёт, почему у него ничего не компилируется. А может быть и хуже - что компилируется, но неправильно работает.Я что-то понять не могу: а почему то, что Вася использует в своей программе то, чего он не понимает, должно быть проблемой Пети?
reallocВ этой задаче и так хватает нагрузки на malloc. Тебе надо хотя бы добавить логарифмическое наращивание памяти. (Встроенное в std::string).
Где искать её определение - хз. Что она делает - хз. Что ей можно дать - хз. Что она вернёт - хз.глупости
CONCAT написано большими буквами
значит это макрос
где искать - в одм из заголовочных файлов
там же и смотреть что делает
Где искать её определение - хз. Что она делает - хз. Что ей можно дать - хз. Что она вернёт - хз.[Не для пацанов]grep 'define CONCAT' *[/не для пацанов]
а если там кода на несколько килобайт? Как в них искать синтаксическую ошибку?В MESE, кстати, бывают такие макросы, если меня не глючит. Хотя я бы посоветовал не писать многокилобайтный код в макросе.
2
char *concat(char *x, char *y) {
x = realloc(length(x) + length(y) + 1);
x = strcat(x, y);
return x;
}
В этой задаче и так хватает нагрузки на malloc. Тебе надо хотя бы добавить логарифмическое наращивание памяти. (Встроенное в std::string).Меня глючит, или те, кому нужна производительность, в цирке не сме... тьфу, в Си++ не ходят?
Вообще, потом можно поступить так:
#ifdef GEEK_ZONE
#ifdef CONCAT
#undef#CONCAT
#define CONCAT /* so it may work FASTER and EFFICIENTLY */
#endif
#endif
кстати в тру языке лиспе большие макросы обычное дело
Меня глючит, или те, кому нужна производительность, в цирке не сме... тьфу, в Си++ не ходят?Тебя глючит. На Си++ string+string отпипирит твою реализацию CONCAT по всем параметрам. (От безопасности по типам до скорости работы.)
кстати в тру языке лиспе большие макросы обычное делоИ я так понимаю, в сем языке макросы такие, что дай Бог каждому!
Потом я перепишу и отполирую свою реализацию. Перестанет ли от этого меня глючить? :]
Потом я перепишу и отполирую свою реализацию. Перестанет ли от этого меня глючить?Тебя перестанет глючить, когда ты перестанешь курить траву.
[Не для пацанов]grep 'define CONCAT' *[/не для пацанов]Да - пацаны, если ч0, когда хотят узнать, что это за функция - пользуются всплывающей подсказкой или переходят к определению по какому-нибудь CtrlClick.
Но переключаться в консоль и запускать поиск "define\s+CONCAT" по мегабайтам проекта, причём CONCAT (или SOMELONGNAMEFORFUNCTIONTHATDOINGMANYTHINGSANDACCEPTSABOUTDOZENOFPARAMETERS) придётся вбивать вручную/вставлять из буфера обмена.
кстати в тру языке лиспе большие макросы обычное делоТы не путай их с С-шными. Это как Ж и П сравнивать.
причём CONCAT (или SOMELONGNAMEFORFUNCTIONTHATDOINGMANYTHINGSANDACCEPTSABOUTDOZENOFPARAMETERS) придётся вбивать вручную/вставлять из буфера обмена.[Обратно не для пацанов]Middle-click[/обратно не для пацанов]
И в какой IDE можно по таким макросам ходить?
[Обратно не для пацанов]Middle-click[/обратно не для пацанов]конечно не для пацанов
не было никаких мидлкликов раньше
левая+правая вместе
Я слишком юн!..
X Window System называется, а вообще, не понял сообщения, там, походу, потерялось процентов тридцать при передаче...
каким макросам?
Какая IDE позволяет тебе по среднему клику на вызове функции/макроса CONCAT перекидывать тебя к определению этой функции/макроса?
любая IDE. разве нет?
Я понимаю, что любая приличная перейдёт к описанию функции... а что, с макросами они тоже работают?
ЗЫ: Ч0рд, мой Eclipse не умеет работать с C, не проверить...
если это IDE, то да, перейдет
cdt
кстати в тру языке лиспе большие макросы обычное делоOn Lisp
When to Use Macros
How do we know whether a given function should really be a function, rather than
a macro? Most of the time there is a clear distinction between the cases which
call for macros and those which don’t. By default we should use functions: it is
inelegant to use a macro where a function would do. We should use macros only
where they bring us some specific advantage
In other words: the choice of C is the only sane choice.Ага, и перед каждым return SOME_ERROR вставлять free, close, release_mutex,... malloch-ные реки, deadlock-нутые берега. Или освобождение памяти и многопоточность - это тоже от лукавого?
I really *would* prefer to piss off
Да он изначально послал всех на хуй. Как ему могли хоть что-то объяснить?
infinite amounts of pain when they don't work
Кроссплатформенный Си напичкан тем же количеством #ifdef'ов, как и Си++
inefficient abstracted programming models where two years down the road
you notice that some abstraction wasn't very efficient, but now all
your code depends on all the nice object models around it, and you
cannot fix it without rewriting your app
Правильно. К чёрту любые структуры, мы будем наращивать кучу функций, которые хаотично вызывают друг-друга. Вообще-то программирование подразумевает создание какой-то архитектуры, и если эта архитектура плохая, то нельзя обвинять в этом язык программирования. Тем более, Си++ не диктует никаких жёстких правил.
In other words, the only way to do good, efficient, and system-level and
portable C++ ends up to limit yourself to all the things that are
basically available in C.
Чувак просто всю свою жизнь писал драйверы. Во всяком случае, он совсем не понимает, как удобны деструкторы и исключения.
So I'm sorry, but for something like git, where efficiency was a primary
objective, the "advantages" of C++ is just a huge mistake.
Так надо было сразу писать на ассемблере под все известные процессоры...
Писать надо на С, используя от С++ только syntactic sugar.
Если посмотреть на приведенные тут примеры, то они написаны на примитивном С++. Вот только такой и надо использовать.
Без всяких виртуалов, друзей и прочей лабуды.
это всем известно
C и С++ - это два разных языка. Сишники никогда не смогут прогать не C++, пока не начнут учить его заново.
Писать надо на С, используя от С++ только syntactic sugar.Смотря что ты считаешь сахаром. Как на Си ты будешь делать паттерн visitor? А scoped ресурсы? А функции, которые возвращают значения, а в случае ошибок выкидывают исключения, чтобы не проверять код возврата на каждой второй строке? А параметризуемые решения, типа контейнеров и прочего? Так получится, что виртуальные функции, деструкторы, исключения, шаблоны - тоже сахар.
Если посмотреть на приведенные тут примеры, то они написаны на примитивном С++. Вот только такой и надо использовать.
Без всяких виртуалов, друзей и прочей лабуды.
Сишники никогда не смогут прогать не C++, пока не начнут учить его заново.У Си-шников ещё беда: они гонятся за производительностью там, где нужна стабильность и простота исполнения.
это ты сам придумал?
мне совсем не понятно, на основании каких фактов ты делаешь такие выводы?
C и С++ - это два разных языка.Ага, и во втором есть несколько полезных вещей.
Ага, и во втором есть несколько полезных вещей.Ну так ты напиши, какие по-твоему являются бесполезными?
раздельная компиляция и линковка
Какая IDE позволяет тебе по среднему клику на вызове функции/макроса CONCAT перекидывать тебя к определению этой функции/макроса?Вообще-то, я тебе ответил.
наличие h-ников, вернее, требование, чтобы тип или функция был определен до использованияТы написал, что требования и реализации языка являются бесполезными. Так я могу сказать, что установка .NET Framework - лишняя в языке C#
раздельная компиляция и линковка
Вопрос был про конструкции языка.
У Си-шников ещё беда: они гонятся за производительностью там, где нужна стабильность и простота исполнения.Беда С++ников: они не знают удобных языков, на которых можно писать программы, требующие не производительности, а стабильности и простоты исполнения.
Беда С++ников: они не знают удобных языков, на которых можно писать программы, требующие не производительности, а стабильности и простоты исполнения.Беда тех, кто знает слишком много "удобных языков": они не знают Си++ достаточно, чтобы понять, как он прост для написания стабильных и простых программ.
Хотя на цепепе писать быстрее чем на си.
наличие определение до использования - это именно конструкция языка, это даже в стандарте C++ зафиксировано
ps
необходимость установки .net-а для C# - в стандарте C# почему-то не описана
наличие определение до использования - это именно конструкция языка, это даже в стандарте C++ зафиксированоЯ же сказал, что требования языка не могут являться "бесполезными". Под бесполезными в контексте данного топика понимаются конструкции, без которых можно и нужно программировать на этом языке. Таким образом, из Си++ можно сделать какое-то подобие Си-с-плюшками.
необходимость установки .net-а для C# - в стандарте C# почему-то не описанаНе описана, но тем не менее необходима. Так что требования есть у любого языка. И неудобства тоже.
Что-то мне не кажется, что код на цепепе читается лучше чем сишный.Два куска кода, без особой логики. Скажи мне, что читается лучше.
struct some_context
{
int my_mutex;
const char* my_error;
double my_o1;
double my_o2;
};
void lock(int mutex)
{
}
void unlock(int mutex)
{
}
bool operation1(struct some_context* pctx, double* pres)
{
if (false /* some error */)
{
pctx->my_error = "some error";
return false;
}
*pres = pctx->my_o1;
return true;
}
bool operation2(struct some_context* pctx, double* pres)
{
if (false /* some error */)
{
pctx->my_error = "some error";
return false;
}
*pres = pctx->my_o2;
return true;
}
bool operation3(struct some_context* pctx, double operand, double* pres)
{
if (operand < 0.0)
{
pctx->my_error = "some error";
return false;
}
*pres = operand;
return true;
}
bool operation(struct some_context* pctx)
{
pctx->my_error = NULL;
lock(pctx->my_mutex);
double o1;
if (!operation1(pctx, &o1
{
unlock(pctx->my_mutex);
return false;
}
double o2;
if (!operation1(pctx, &o2
{
unlock(pctx->my_mutex);
return false;
}
double o3;
bool res = operation3(pctx, o1+o2, &o3);
unlock(pctx->my_mutex);
return res;
}
class some_class
{
public:
void operation
{
boost::mutex::scoped_lock lock(m_mutex);
operation3(operation1 + operation2;
}
double operation1
{
if (false/* some error */)
throw std::runtime_error("some error");
return m_o1;
}
double operation2
{
if (false/* some error */)
throw std::runtime_error("some error");
return m_o2;
}
double operation3(double operand)
{
if (operand < 0.0)
throw std::runtime_error("some error");
return operand;
}
private:
double m_o1;
double m_o2;
boost::mutex m_mutex;
};
это отличная идея, предполагать, что люди, читающие тебя, полные долбоёбы
Гы
The Truth About Lisp
In which the truth about lisp is revealed, and some alternatives are enumerated.
Learning lisp will alter your life.
Your brain will grow bigger than you ever thought possible.
You will rewrite all of your applications in just a handful of lines
Society will shun you. You will shun society.
You will become disatisfied with everything and everyone around you.
Lisp is so simple to learn that you can learn lisp in just a few minutes. I just learnt it now while I was waiting for a bus.
Lisp is so simple that you can implement it in any language in just a few pages of code. This might never happen though, because once you've learnt lisp you'd never want to write anything in any language other than lisp, so you wouldn't bother implementing lisp in any language other than lisp.
Lisp can be fully implemented in lisp in just a handful of lines. I just implemented lisp in lisp, fully, while i was hopping onto a bus and paying for my bus ticket all at the same time.
When you become a lisper, you will laugh at jokes that no one else thinks are funny. You will know things that cannot be expressed in ordinary imperative language.
You will think people are idiots when they state things like "Hi, how are you?" because a lisper simply doesn't need to use such verbose constructs. Lisp abstracts away those patterns of interaction and makes them completely irrelevant. The proper way to greet a fellow lisper is just a tiny nod of the chin, and about a tenth of a wink from your left eye, then point at your tin foil hat. They will know what you mean. if they don't know what you mean then they are not a true lisp programmer and they don't matter anyway.
Lisp was invented a long time ago, before java, before C, before fortran, before computers, before people, before the earth was built. the universe itself is a lisp program so trivial that no true lisper would even both implementing it.
Lisp is so elegant that the very fact that you know even the first thing about it will qualify you for a season as principal dancer of the royal ballet. You will go out on stage in your little tutu and just scribble a few round brackets in the air with your toe. People will gasp in wonder. Unless they don't know any lisp. If they don't know any lisp then they are idiots and they don't matter.
Only lispers have a true definition of fun. Maybe ML programmers too. All of today's languages are based on fortran and lisp. The bad bits fortran, the good: lisp.
If you're good enough to use lisp, you'll soon be frustrated with lisp. Lisp is not an adequate lisp. By the time my bus had made it two blocks I'd written some simple lisp macros that were so powerful they made lisp completely obsolete and replaced it with a new language. Fortunately, that new language was also called lisp. And i was able to prove, mathematically, that the new lisp i'd created was both far superior to lisp in every conceivable way, but also exactly equivalent to lisp in every possible way. I was very excited by this. But also found it very boring.
Reddit is proof that lisp is really powerful. Paul Graham originally wrote reddit, in lisp, on the back of a napkin while he was waiting for a coffee. it was so powerful that it had to be rewritten in python just so that ordinary computers could understand it. Because it was written in lisp it was almost no effort to rewrite the entire thing, and the rewrite was completed in-between two processor cycles. Paul Graham himself was completely written in lisp, by an earlier version of himself, also written in lisp, by an earlier version of lisp. It's lisp, paul graham, lisp, paul graham, all the way down.
Because we've reached the limits of moore's law, the computers of the future will have many-core processors and all our programs will need to be written in a combination of haskell and lisp, that will itself be so powerful that the computers of the future will not be able to implement any of our ideas without creating time-travelling algorithms that borrow processing power from other computers that are further into the future. This sounds difficult, but in lisp it isn't difficult at all. in haskell this is a built-in feature and the way you implement it is just a no-brainer to any one who knows lisp or haskell.
After that, the computer of the future will be called The Lisputer. It's speed will be measured using the Lispunit, which is a measure of how many simultaneous arguments about the inadequacy of lisp can be proposed and defeated by an infinite number of lisp pundits without any actual decisions being made. Today's computers run at just under one lispunit. The Lisputer will run at lisp Lispunits, where lisp is a fundamental maximum constant of the universe that can't be expressed using ordinary imperative numerals. Suffice to say that it ends with an infinite number of closing parentheses.
Anyway. i read an article about lisp on the bus today. Top article. All the articles on lisp are really full on — my brain starts to explode out my ear. This one, lisp is sin, was by Sriram Krishnan, in which he talked about doing C# for work, but Lisp for fun. And he touched on some of the ways in which C# is moving toward lisp.
Here's some of the technologies that the commentors at that article suggested as possible substitutes for a lisp addict:
1. newLisp
2. ML
3. Perl6
4. nermerle
5. smalltalk
6. biobike
7. chez scheme
8. Common Larceny
9. XSLT
10. OCaml
11. L
12. Lua
13. C Omega
14. F#
15. C# with Linq
Also, one person suggested porting the python libraries to lisp.
Curious for its absense: Ruby (see article Why Ruby is an acceptable lisp, and steve yegge's response: 'lisp is not an acceptable lisp')
(p.s. first person to write a comment that says "Paul Graham did not write reddit" deserves a lollipop.)
это отличная идея, предполагать, что люди, читающие тебя, полные долбоёбыТы что влезаешь? Выше для умных написаны аргументы, теперь я их разжёвываю тем, с кем не согласен, чтобы понять, в чём мы расходимся.
Я же сказал, что требования языка не могут являться "бесполезными".почему? это совсем неочевидно
, ты постоянно упираешь на ООП, но кроме него существуют и другие парадигмы =)
а в ООП C# и Java поудобнее C++ будут
почему? это совсем неочевидноПотому что без них язык не работает?! Ты ещё не понял, что приводишь примеры, которые не отвечают на мой вопрос? Ещё раз: речь идёт о программировании на языке, с принципиальным отказом от каких-то конструкций этого языка, и объявлением их бесполезными. Я прошу привести пример таких конструкций.
а в ООП C# и Java поудобнее C++ будутВсе эти три языка эквивалентны с этой точки зрения.
особенно порадовало
"сравним прогу на С и прогу на плюсах с бустом"
в твоем примере большая часть остается за кадром
в твоем примере большая часть остается за кадромИ что с того? На ассемблере всё будет выглядеть вообще одинаково. Смысл-то не в этом. На Си++ я заверну в деструктор что угодно и потом буду везде использовать. А на Си ты всегда будешь всё делать руками.
плюсы провоцируют на раздолбайство
"ааа, деструктор все сделает..."
или напихают в деструкторы всякого барахла а потом мучаются с тем, что
точка в которой он вызовется находится совсем не там где кажется
плюсы провоцируют на раздолбайствоага, а компьютер вообще оттучает думать...
было бы смешно, не будь это так...
ООП для тех, кто ниасилил концепцию процедурного программирования ?
плюсы провоцируют на раздолбайствоКонечно, лучше руками освобождать все ресурсы в каждой функции. А потом где-нибудь забыть что-то освободить. Желательно там, где возвращается ошибка, которая происходит только в продакшн билде у клиента.
или напихают в деструкторы всякого барахла а потом мучаются с тем, что
точка в которой он вызовется находится совсем не там где кажется
Ни разу не мучался от того, что у меня вызываются деструкторы. Да и за точками вызова следит компилятор.
пример - утечки незакрытых сокетов во всяких жабах, где надеются на то, что деструктор все закроет
а деструктор вызывается хрен знает когда, когда fd limit уже давно исчерпан
это, конечно, не плюсы, но там тоже хватает
пример - утечки незакрытых сокетов во всяких жабах, где надеются на то, что деструктор все закроетПример про языки с GC, которые к данной дискуссии не имеют никакого отношения. Мало того, я давно не видел профессионального программиста на C#/Java, который "надеется на деструктор". (Кстати, в этих языках это обычно называется finalizer.)
а деструктор вызывается хрен знает когда, когда fd limit уже давно исчерпан
это, конечно, не плюсы, но там тоже хватает
В Си++ деструктор вызывается гарантированно. Поэтому он надёжен во всех случаях.
в жабе вон тоже вызывается
просто пример с ГЦ наиболее показателен, там особо объяснять не надо что происходит
а в плюсах можно огрести когда происходит
копирование по значению в каком-нибудь контейнере
(не надо про autoptr, я тоже знаю что это ниибацки круто)
> с кем не согласен, чтобы понять, в чём мы расходимся.
ой извини, я что-то не догадался, что тут не форум, а приватная переписка
правильно ли я понял, что все (повторяю, все) твои аргументы сводятся к следующему
"C++ обратно совместим с С, всё, что можно писать на С отлично пишется на С++ -> C++ лучше"
мысль настолько проста, и, постарайся в это поверить, её отлично понимает линус
ты пытаешься разжевать это утверждение -> считаешь, что читающие тебя глупы
наверняка, линус, ругая С++, подразумевает некое сакральное знание, которое тебе не доступно
тот финансовый софт, который писал на плюсах я, лучше было бы писать на каком-нибудь питоне
всё равно основные задержки на БД и сети происходят
правильно ли я понял, что все (повторяю, все) твои аргументы сводятся к следующемуТы понял неправильно. Значит, примеры кода на Си и Си++ как раз для тебя. Погляди на них, подумай. Там всего два аспекта: обработка ошибок и захват ресурсов. В жизни эти функции могут быть в десятки строк, а ошибок гораздо больше, ровно как и мест, где эти ошибки надо проверять. Когда и если поймёшь этот мой пример, я приведу тебе другие удобства Си++ по сравнению с Си.
"C++ обратно совместим с С, всё, что можно писать на С отлично пишется на С++ -> C++ лучше"
всё равно основные задержки на БД и сети происходятЯ не понял, при чём тут задержки...
Эх.. говорила ведь мама, что когда пытаешься спорить с долбоёбом сам становишься долбоёбом
в том смысле, что производительность С++ не нужна
Эх.. говорила ведь мама, что когда пытаешься спорить с долбоёбом сам становишься долбоёбомНе волнуйся, я долбоёбом не стану. Просто попытайся аргументировать, может быть, у тебя что-то получится.
удобства Си++ по сравнению с СиА расскажи про удобства Си++ по сравнению с Питон+Си? Питон для логики, Си для счета.
Эх.. говорила ведь мама, что когда пытаешься спорить с долбоёбом сам становишься долбоёбом+1
Питон для логикисовсем нелогично
для логики есть более правильные языки
питон - для грязных хаков
А расскажи про удобства Си++ по сравнению с Питон+Си? Питон для логики, Си для счета.boost::python
где ещё счёт нужен?
Один язык - можно набирать более туп... неквалифицированных работников - можно сэкономить на зарплате
а boost::brain уже изобрели?
деньги вообще на 1С надо зарабатывать
есть более правильные языкиПриведи примеры? Я согласен, но все же. Языки на которых можно написать коммерческий софт. Не считая всяких жаб, сишарпа и пехепе.
а так для логики можно использовать такие отличные языки как ocaml, haskell, lisp
З.Ы. пхп сосёт, пернартуру привет =)
Civ4 на питоне
Про ПХП +1.
А Хаскель, Лисп и Окамл — это игрушки, серьезной софтины не напишешь. Сами с Лиспом мучаемся.
Так что Питон и Руби(тот же питон для веб). Мб Перл, про него мало знаю.
> "сравним прогу на С и прогу на плюсах с бустом"
Да тут это с самого начала.
Открытый программный проект свели к понятию "программа", полностью игнорируя пользовательскую аудиторию, распределённость процесса разработки, квалификацию разработчиков и протяженность всего процесса по времени. Причём в сообщении, из которого растёт тред, это всё упоминалось.
Можно приводить кучу разных ебанутых примерчиков и фич, но есть очень показательный момент: git - практически единственная открытая система распределённой разработки, которой сейчас можно пользоваться. Для меня это говорит о двух вещах. Во-первых, выбор языка был оправдан, так как он позволил привлечь в достаточной степени квалифицированных разработчиков. Во-вторых, у пишущих на C больше возможностей довести проект до ума (скорее всего потому, что "нормальные" плюсятники ваяют корпоративный софт под венду, а у остальных преимущественно каша в голове).
Во-первых, выбор языка был оправдан, так как он позволил привлечь в достаточной степени квалифицированных разработчиков.Ну если ты сам ненавидишь какой-то язык, как ты сможешь сколотить команду профессиональных программистов на этом языке? Честно говоря, я не ожидал увидеть настолько откровенный нонсенс, где без аргументации пишут в духе "этот язык сосёт, потому что плохой, гадкий, любые решения на нём сосут, он заставляет делать програмы с плохой архитектурой". Он бы хоть пару примеров привёл. Типа буст у него не работает на какой-то платформе, или ещё что.
квалификацию разработчиков и протяженность всего процесса по времени. Причём в сообщении, из которого растёт тред, это всё упоминалось
Квалификацию разработчкиов на Си++ просто обосрали без аргументов. А протяжённость процесса по времени Линус не счёл нужным упомянуть. Впрочем, если обратиться к примеру кода, который я привёл выше, можно понять, что на просто букав на Си надо было написать раза в два больше, чем на Си++
> аудиторию, распределённость процесса разработки, квалификацию разработчиков и протяженность
> всего процесса по времени. Причём в сообщении, из которого растёт тред, это всё упоминалось.
> пользоваться. Для меня это говорит о двух вещах. Во-первых, выбор языка был оправдан, так как он
> позволил привлечь в достаточной степени квалифицированных разработчиков. Во-вторых, у пишущих на
> C больше возможностей довести проект до ума (скорее всего потому, что "нормальные" плюсятники
> ваяют корпоративный софт под венду, а у остальных преимущественно каша в голове).
Т.е. основная причина выбора C — не техническая (преимущества или недостатки того или иного языка а социальная?
Еще раз предлагаю написать на каком-нибудь языке, отличном от C++, задачу из ICFPC.
Кстати, задача весьма интересная, того стоит.
> или напихают в деструкторы всякого барахла а потом мучаются с тем, что
> точка в которой он вызовется находится совсем не там где кажется
? не вижу никаких проблем с деструкторами.
Можно пример?
игрыГоворят, что производители игр сговорились с производителями железа. И тогда высокоуровневые языки дают сразу два преимущества - скорость разработки и не слишком высокая скорость работы.
где ещё счёт нужен?
хорошо подмечено
технически всё оно эквивалентно машине тьюринга
технически С++ обратно совместим с С
твоё мнение, за что линус не любит С++?
З.Ы. пхп сосёт, пернартуру привет =)Иди в жопу, если не считать мелкие косяки вроде foreach($arr as &$val) и отсутствие строгой типизации примитивных типов, в php не хватает только namespace-ов.
php не хватает только namespace-овПохоже, разработчики считают что в нем наоборот много лишнего
Т.е. основная причина выбора C — не техническая (преимущества или недостатки того или иного языка а социальная?Ага. Не основная, но существенная.
У Пола Грэма, как всегда, есть статья на эту тему: Python paradox.
Сцылко не открываеццо, цитату можно?
Честно говоря, я не ожидал увидеть настолько откровенный нонсенс, где без аргументации пишут в духе "этот язык сосёт, потому что плохой, гадкий, любые решения на нём сосут, он заставляет делать програмы с плохой архитектурой". Он бы хоть пару примеров привёл. Типа буст у него не работает на какой-то платформе, или ещё что.Во-первых, такие проблемы ничего не покажут. Во-вторых, я уверен, что если бы у него возникла чисто техническая проблема, то он бы её решил. Мнение про плохую архитектуру образовалось не на пустом месте - это печальный опыт других проектов. Кстати, особенно печальным такой опыт оказывается именно в случае "а теперь выбросим сишный код и напишем правильно на плюсах". Утверждение излишне категорично, но не безосновательно.
Квалификацию разработчкиов на Си++ просто обосрали без аргументов.Ну я совсем не отрицаю, что могут быть хорошие программисты на плюсах. Только язык намного более сложный, поэтому и выход годной продукции меньше (для open source проекта это серьёзный недостаток). В большинстве случаев это именно ламеры, гонящиеся за фичами под бессмысленными лозунгами типа "правильно", "круто" или "удобно", и которые совершенно не представляют, что со всем этим делать дальше (но явно это будут делать не они, т.к. завтра ветер подует в другую сторону). Гораздо эффективнее послать их всей толпой нахуй, чтоб не мешали, чем пытаться отфильтровывать разумные и одновременно правильные мысли от всего остального. А человек, который в нынешнее время пишет на сях, скорее всего знает, что и зачем он делает.
Кстати, категоричность сообщения вызвана во многом отшиванием очередного ламера. Нормальный разработчик (на любом языке) не стал бы пытаться изменить чужой проект под себя, если бы не собирался его развивать дальше, а от таких вот "улучшателей" гораздо больше вреда, чем пользы.
Кроме того, одно из предназначений открытого кода - фиксировать хорошие идеи (я думаю, что в случае с гит ставится и задача оставить след в истории). Чистый си для этого подходит гораздо лучше.
Все эти три языка эквивалентны с этой точки зрения.
"We were not out to win over the Lisp programmers; we were after the C++ programmers. We managed to drag a lot of them about halfway to Lisp."
- Guy Steele, Java spec co-author
В большинстве случаев это именно ламеры, гонящиеся за фичами под бессмысленными лозунгами типа "правильно", "круто" или "удобно", и которые совершенно не представляют, что со всем этим делать дальше (но явно это будут делать не они, т.к. завтра ветер подует в другую сторону). Гораздо эффективнее послать их всей толпой нахуй, чтоб не мешали, чем пытаться отфильтровывать разумные и одновременно правильные мысли от всего остального.Ему надо было сразу написать про квалификацию глупых программистов. Я тоже низкого мнения о 99% опенсурса, причём не важно, на каком языке он написан. Не солидно трогать язык программирования, да ещё и в таком тоне, да ещё и без аргументации.
After that, the computer of the future will be called The Lisputer.Б0ян.
+1
И в какой IDE можно по таким макросам ходить?вроде же очевидно, что в сишном/сюпласпласном коде по макросам ИДЕ ходить легче, чем пофункциям?
Т.е. основная причина выбора C — не техническая (преимущества или недостатки того или иного языка а социальная?ну вот мне тоже так кажется, и тоже, кажется, что это не лишено смысла...
оградиться от всяких, которые научились писать на с++ по книжкам а ля "Борланд С++ 4.5".
а вообще, я тут около года назад писал одну програмку (задание по ЭВМ какое-то на мм одному челу) на чистом С.
Это пипец... Тяжело без с++ных удобств очень.
boost::formatв пизду. есть snprintf. Мне больше ничего пока не понадобилось другого.
Скажи каке «нет!».
Скажи каке «нет!».Кака — это половина ебаного буст и потоки.
Честно говоря, не очень понятно в чем суть претензий к C++. Много эмоций, но ни одного конкретного недостатка не указано.
Знаешь, я с опытом прихожу постепенно к осознанию, что местами все эти эмоции не беспочвенны. Не вдаваясь в подробности, я изложу чисто свой опыт.
резюме такое: на С++ всякий пидорас может написать такое, что потом проблем не огребешься.
Во-первых — страсть писать непонятно. Я бы увольнял всех, кто инклудит Лямбду. Жестко, только за 1 инклуд — этот человек уже неисправим, он будет писать для того, чтобы другие не понимали, а не для того, чтобы сделать рабочий проект. Сколько я видел перегруженных запятых и прочих палочек! Хорошо, если это boost::spirit, я допускаю возможность писать такое, но когда каждый пидорас делает подобное — код можно выбрасывать.
Во-вторых куча юношей фанатично начинают отказываться от _стандартных_ средств в пользу уёбищных (iostream'ам привет!). Не потому, что в этом есть необходимость перехода, а потому, что начинают рассуждать о гламуре как программисты Java (тупиковая ветвь эволюции). Вместо того, чтобы написать:
const char *name;
const char *email;
...
char buf[1024];
snprintf(buf, "Hello, %s! We sent you new password to %s email.", name, email);
std::string super_answer = buf;
Они обязательно напишут так:
const char *name;
const char *email;
...
std::string super_answer = "Hello, ";
super_answer += name;
super_answer += "! We sent you new password to ";
super_answer += email;
super_answer += " email."
Или ещё хуже — подключат что-то ужасное типа boost::format. В итоге такая простая простая вещь как, например, запись в логи превращается в совершенно неприемлемый код.
Это ещё пол беды, если бы они просто писали сложно, так обычно от этого страдает алгоритмистика — мозг переключается от вопроса "как сделать эффективный логгер в многопоточном приложении" к "какую палочку будем использовать для перегрузки такого-то оператора? всё ли в стиле?". В итоге потом делаю ХУДШЕЕ поделие — зато написано непонятно.
Но самое страшное, — это их желание сделать stl-based АПИ! Достаточно просто посмотреть на такую библиотеку как PoCo, и ты сразу поймёшь, что писали её просто больные люди. Нездоровые, и уже им, скорее всего, поможет только карательная психиатрия. Этот урод человеческой мысли (PoCo) говорит, в принципе, об уродливости языка, по крайней мере, о тенденции людей так писать.
Ко всему прочему стоит отметить, что программисты после такой практики просто оказываются не способны писать на чистом С, и — ВНИМАНИЕ — в упор не видят коренную необходимость делать это местами. Особо клинические случаи — это когда на предложение использовать expat вместо libxml тебе нагло говорят, что "у expat нет обёртки в PoCo. И вот тут уже убедить в том, что нужна производительность, а не ебанутая идеология — нереально.
Отмечу, что я не считаю плюсы плохим языком, но минимум половина программистов не получает в нужное время нужную прививку.
агонь!
например, когда пользуешься строками, как сахаром и надо что-то быстро в одну из них прочитать.
не будешь же через буфер snprintf-ом фигачить.
Во-вторых куча юношей фанатично начинают отказываться от _стандартных_ средств в пользу уёбищных (iostream'ам привет!). Не потому, что в этом есть необходимость перехода, а потому, что начинают рассуждать о гламуре как программисты Java (тупиковая ветвь эволюции). Вместо того, чтобы написатьЭто вообще жесть, и что они делать будут, когда формат поменять надо будет?
Так ни на каком языке писать не надо, при чём тут Java?
Это вообще жесть, и что они делать будут, когда формат поменять надо будет?Обычно такие вещи относятся к логам, а в логах формат если и менятеся, то там у тебя всё равно код дожен меняться.
Если нужен ответ по шаблону — использую шаблонизатор. Но использовать += пицсот рас — это клиника.
Тогда уж лучше использовать Debug::log('name',value чем все эти бесконечные +=.
В итоге такая простая простая вещь как, например, запись в логи превращается в совершенно неприемлемый код.
LogPrintTS(
LOG_LEVEL__RELEASE,
_T("GetCardInfo: Card details:%d,%d,%d,%d,%d,%d,%I64d,%s,%d,%d,%s,%I64d\r\n"
static_cast<int>(pCardInfo->btWasDeleted
static_cast<int>(pCardInfo->btRevoke
static_cast<int>(pCardInfo->btExpired
static_cast<int>(pCardInfo->btNotActive
static_cast<int>(pCardInfo->btAuthRequired
static_cast<int>(pCardInfo->wDiscountNumber
pCardInfo->nFullSum,
pCardInfo->szName,
static_cast<int>(pCardInfo->wBonusNumber
static_cast<int>(pCardInfo->btBlocked
pCardInfo->szBlockReason,
pCardInfo->nDiscountSumMax
);
LOG(Log::DBG) << L"GetCardInfo: Card details: " << pCardInfo;Если кто-то не может правильно использовать iostreams, то это вовсе не повод превращать логирование в потенциально опасный механизм в программе. В sprintf слишком просто где-то перепутать типы, потерять варнинг и получить segmentation fault в том месте программы, которое спокойно пропустят тестеры.
Глупо кричать о том, что какой-то механизм является гавном, если либо сам не умеешь его нормально использовать, либо редко встречал тех, кто нормально его использует.
Глупо кричать о том, что какой-то механизм является гавном, если либо сам не умеешь его нормально использовать, либо редко встречал тех, кто нормально его использует.Речь как раз о том, что очень редко встречаются те, кто этот механизм нормально используют, а значит, легче уж вообще не рассматривать тех, кто таким механизмом пользуется, чем пытаться определить, правильно они им пользуются, или неправильно
Речь как раз о том, что очень редко встречаются те, кто этот механизм нормально используют, а значит, легче уж вообще не рассматривать тех, кто таким механизмом пользуется, чем пытаться определить, правильно они им пользуются, или неправильноДа это-то понятно. Просто я предпочитаю обобщать подобные вещи в другую сторону. Мне почему-то кажется, что чаще всего кричат те, кто сам не понимает, как правильно пользоваться какими-то конструкциями.
Инструмент должен быть удобным и безопасным. Точно так, можно какой-нибудь станок делать открытым, передачами наружу и т.п., а потом говорить, что станочник сам лох, если ему руку отрежет
Да пишите вы всякую хуйню сколько хотите, я что — нанимался тут кого-то переубеждать?
Инструмент должен быть удобным и безопасным.snprintf удобен и безопасен.
вот пример как я использую лог:
message(MSG_DEBUG, "test vat = %d", my_var);
Кто-то и асерты использует, и тоже считает, что это нормально. Виндузятники так поголовно их используют.
Опа. А ассерты-то тебе чем не нравятся ?
Недопустимо пользоваться макросом assert.
Хорошая программа – это программа, работающая в отладочной конфигурации под номинальной нагрузкой. Макрос assert, при использовании отладочной конфигурации, изменяет поведение программы. Проще говоря, программа упадет не там, где ошибка действительно могла бы проявиться, и где она будет проявляться в рабочем режиме, а на указанном макросе. Соответственно, поскольку заранее всего предусмотреть невозможно, есть вероятность получить две совершенно разные программы и долго искать ошибку в несуществующем месте.
Проще говоря, программа упадет не там, где ошибка действительно могла бы проявиться, и где она будет проявляться в рабочем режиме, а на указанном макросе.Собственно, для этого он и нужен.
Интересно, кто же нас призывает не юзать удобства отладки с assert'ом?
Какой феерический бред.Это опыт.
Асерты приводят к тому, что когда их убираешь, прога начинает работать ПО-ДРУГОМУ. Отладка не должна менять логику работы приграммы.
#define CONCAT(x, y) {(x) = realloc(length(x) + length(y) + 1); (x) = strcat(x, y);}
Прочитай, почему в NetBSD пишут так:
#define DOIT(...) do { ... } while(/*CONSTCOND*/0)
а не как у тебя.
---
...Я работаю антинаучным аферистом...
Ты же у нас за скорость, если я правильно помню?
Тогда почему ты делаешь snprintf+write, а не writev?
Или что-нибудь более правильное на основе strlcat/strlcpy.
Может быть, лучшим способом было бы использовать готовую БД,
а не перекодировать, как только формат поменялся?
---
...Я работаю антинаучным аферистом...
> Сами с Лиспом мучаемся.
(Я бы сказал, что вы больше мучитесь не с лиспом, а с
организационными вопросами, далёкими от программирования.)
Большая беда CL, на мой взгляд, заключается в отсутствии
хороших переносимых компиляторов. Нет ничего уровня сталина или
цыплёнка, чтобы получать промежуточный сишный код, который ещё
можно попытаться заставить работать на "серьёзных" платформах,
для которых компиляторов CL нет и не ожидается, потому что
компиляторописатели ещё не убрали ту жесть, которая находится в
недрах CMUCL и SBCL, наверное, с середины прошлого десятилетия.
---
...Я работаю антинаучным аферистом...
Я бы взял средства отладки, а насчёт макросов ещё бы разок подумал.
---
...Я работаю антинаучным аферистом...
Маза, я до такого еще не доходил в своих макросах.
> выкидывают исключения, чтобы не проверять код возврата на
> каждой второй строке?
Это беда не языка, а стандартной библиотеки и связанным с ней
способом мышления, исключения в сях можно успешно кидать и
ловить, там даже продолжения замутить можно.
---
"Расширь своё сознание!"
Естественно она работает по-другому. Кстати, с -O3 и -O0 программы тоже частенько работают по -разному. Просто любой инструмент нужно использовать с головой, и все будет в порядке, и изменения в поведении будут вполне предсказуемыми и позитивными.
---
...Я работаю антинаучным аферистом...
Кстати, с -O3 и -O0 программы тоже частенько работают по -разному.Бугаго. Не могу придумать, почему бы при этом аптимезаторам не убить себя апстенку.
Если честно, я всегда пишу:
if(OK) {
в отличие от -O0.
---
...Я работаю антинаучным аферистом...
Бывает и так. Вот прямо сейчас я смотрю на одну из них, и что-то мне влом в ней разбираться ) Сегфолт только на x86_64 и только с -O3.
Это беда не языка, а стандартной библиотеки и связанным с нейАга, только ты заебёшься это всё делать. Сам же когда-то кричал про "ручную работу". Так вот зачем я буду что-то делать на Си, если в Си++ это уже есть?
способом мышления, исключения в сях можно успешно кидать и
ловить, там даже продолжения замутить можно.
хаки в синтаксисе языка си и в семантике сишного препроцессора.
Заворачивать каждый оператор в процедурные скобки, когда этого
можно не делать, это, по-моему, загромождение записи.
У меня "if (ok) doit" и "if (ok) (doit)" имеют разный смысл.
---
...Я работаю антинаучным аферистом...
делать руками, так что можно написать свою собственную.
А при наличии готовой библиотеки, это не нужно будет делать руками.
---
...Я работаю антинаучным аферистом...
гнусь вешается при -O2 и -O3 даже на i386?
---
...Я работаю антинаучным аферистом...
(Я бы сказал, что вы больше мучитесь не с лиспом, а с
организационными вопросами, далёкими от программирования.)
С чем только не мучаемся
Ну не будем переходить на личности, про таланты которых нам тоже есть что сказать.
Большая беда CL, на мой взгляд, заключается в отсутствии
хороших переносимых компиляторов. Нет ничего уровня сталина или
цыплёнка, чтобы получать промежуточный сишный код, который ещё
можно попытаться заставить работать на "серьёзных" платформах,
для которых компиляторов CL нет и не ожидается, потому что
компиляторописатели ещё не убрали ту жесть, которая находится в
недрах CMUCL и SBCL, наверное, с середины прошлого десятилетия.
Полный бред.
Главная беда в отсутствии хороших библиотек и маленьком community.
после такого падения иногда не получается сохранить дамп,
без ASSERT, всё продолжает работать как ни в чём не бывало,
за исключением выполнения полезной работы.
---
"Крепче держите попкорн, граждане, плохо ваше дело;
ща вылезет --- устроит всем полный Армагеддец!"
Заворачивать каждый оператор в процедурные скобки, когда этогоЭто я когда-то прочитал статью о безопасном стиле программирования. Там был американский аргумент о том, что к
можно не делать, это, по-моему, загромождение записи.
if(condition)
operator1;
кто-нибудь может ненароком приписать, и получится:
if(condition), а фигурные скобки спасут от недоразумения.
operator1;
operator2;
if(condition)Да, кто-нибудь может ненароком приписать, поэтому тут не нужен перевод строки.
operator1;
Тогда на внутренность if'а брек-пойнт в отладчике халявно не поставишь
А вообще, я так понимаю, фишка с ду-вайлом нужна, чтобы после "вызова" макроса можно было точку с запятой ставить (?) Так что фигурные скобки у ифов вроде тут ни при чём.
Я не заметил, чтобы сообщество было таким уж маленьким,
сравнимо с PHP и PERL, стабильно выше, чем у TCL.
Если учесть, что большая часть перловых библиотек занимается
тем, что реализует внутренние средства CL, я бы сказал про
примерное равенство.
---
...Я работаю антинаучным аферистом...
При отсутствии стандартной библиотеки, это всё равно придётсяЧто придётся делать руками? В Си++ можно кидать исключения и всё будет в порядке. Ничего руками делать не надо. В Си тебе как минимум придётся следить за всеми ресурсами, создавать искусственный стек и так далее. Код разбухнет до предела. Тут нечего даже сравнивать.
делать руками, так что можно написать свою собственную.
> "вызова" макроса можно было точку с запятой ставить (?)
Ставить ты можешь как угодно, вопрос в том, чтобы эта расстановка
была согласована с правилами языка.
> Так что фигурные скобки у ифов вроде тут ни при чём.
На самом деле, "при чём." Это и есть проблемное место, которое
закрывает "do ... while(0)", если ты оборачиваешь каждый оператор
в скобки, то ты всегда получаешь "} else" и никак не можешь получить
"}; else".
---
...Я работаю антинаучным аферистом...
За ними так и так придётся следить, но разговор не об этом,
а о том, чтобы следить структурированно, а не пробрасывать
флаги по уровням вложенности или вызывать специальные
продолжения, завершающиеся _exit.
> Код разбухнет до предела.
Не так уж он и сильно разбухает, это не флаги пробрасывать.
Зато ты получаешь чётко определённую семантику, где и что
у тебя освобождается, без запоминания правил неявного вызова
деструкторов.
И, кстати, почему-то лиспники всё равно явным образом используют
обёртки, пробрасывающие исключения, а не деструкторы объектов,
связанных с тем же вводом-выводом.
---
...Я работаю антинаучным аферистом...
> использование функции concat. Такой стандартной функции нет.
> Где искать её определение - хз.
Умные люди используют TAGS.
> Что она делает - хз.
И комментируют код, если он неочевиден.
> Твой concat - это ещё хорошо, там определение короткое,
> а если там кода на несколько килобайт?
> Как в них искать синтаксическую ошибку?
Но макросы такими длинными пишут только, наверное, лиспники.
Вроде , только там и макросы немного другие, и
синтаксические ошибки сделать сложно. Вот семантические ---
другое дело. Но такие можно и на STL накрутить, как правильно
заметил "великий и мудрый LT".
---
...Я работаю антинаучным аферистом...
маленькимстранная статистика по ссылке
нету с#
они хотят сказать что он совсем не популярен?
> В Си тебе как минимум придётся следить за всеми ресурсамиРазговор как раз об этом. В Си++ у тебя чётко определены правила вызова деструктора. Поэтому ни за чем там следить не надо. Приведи пример кода на Си, который должен кидать исключения твоим способом :
За ними так и так придётся следить, но разговор не об этом,
void f
{
FILE* pf = fopen("test", "r");
char* buf = (char*) malloc(1024);
struct S* pS = (struct S*) malloc(sizeof(struct S;
/* do some work*/
/* throw exception here */
}
Зато ты получаешь чётко определённую семантику, где и чтоПравила вызова деструкторов запомнить проще, чем от проекта к проекту запоминать семантику, где и что освобождается. Да ещё при этом придётся не забывать это всё освобождать руками или регистрировать в хранилище своей библиотеки, опять же руками.
у тебя освобождается, без запоминания правил неявного вызова
деструкторов.
И комментируют код, если он неочевиден....и комментируют каждое упоминание макроса concat.
Нахуй-нахуй, это к каждой строчке коммнентарий писать придётся.
Это потому что ты не занимаешься разработкой на Лиспе профессионально.
> внутренние средства CL
regexp, XML, графика - внутренние средства CL? Покажи их в документации?
Впрочем, и C++ тоже не слишком для него удобен.
...и комментируют каждое упоминание макроса concat.PHPшник :-)
Use Google и найди Slime.
покемон Горохуй... А казалось бы, МГУ...
Всё, за исключением РВ, и в питоне, и в перле, и в пхп, и в
тикле отсутствует, оно присутствует там на тех же правах, на
которых и в КЛ.
---
...Я работаю антинаучным аферистом...
Предложишь альтернативу?
Заодно сообщи, что именно ты считаешь прикладным программированием.
---
...Я работаю антинаучным аферистом...
То что ты не знаешь кто такой Пол Грэм говорит только о недостатке твоего образования.
Не так много известных хороших программеров на свете есть.
То что ты не следишь за IT — твоя проблема.
Но семечки у тебя ничего.
Имхо, надо бы завести тред "Что вы читаете по теме?".
Всё, за исключением РВ, и в питоне, и в перле, и в пхп, и вОбъясняю:
тикле отсутствует, оно присутствует там на тех же правах, на
которых и в КЛ.
1. Указание на Перл — бред.
2. Библиотеки CL глюкавые все как одна (и regexp потому что их никто кроме разработчиков никогда не пользовал.
Это был просто последний пост на первой странице (у меня по 40).
И зря ты обижаешься... Большая часть здесь действительно не
пытаются что-то кому-то объяснить
Вместо этого пишешь "longjmp(handler, -1);", и ты оказываешься
в другом месте. Причём точно знаешь, что у тебя семантика всегда
"retry", о чём уже можно не заботиться.
Да, организовывать вложения тоже придётся руками или макросом,
но это уже совсем другая история.
> Правила вызова деструкторов запомнить проще, чем от проекта
> к проекту запоминать семантику, где и что освобождается.
Вообще говоря, это не правила проекта, оно ближе к стилю.
Примерно так же, как ты можешь вызывать perror/exit или warn/err,
но всё равно проверять, что тебе вернул malloc или open.
Да, си предлагает чересчур простую библиотеку и не навязывает
правил обработки ошибок, однако это не означает, что
единственным способом является пробрасывание флага.
Вообще говоря, различие лежит глубже: есть две модели обработки
событий, опрос и ожидание. Обе имеют право на существование,
просто с ними надо по-разному работать. Я думаю, если бы тебя
учили не последовательному программированию, а ситуационному,
тебе бы и в голову не пришло, что бывают какие-то "исключения",
ты бы просто переходил к точно такому же невыделенному среди
остальных состоянию, где решал бы, что делать, когда не хватило
памяти.
---
...Я работаю антинаучным аферистом...
Может, ты тогда объявишь, какие графические средства _встроены_ в перл?
То же с XML.
> 2. Библиотеки CL глюкавые все как одна (и regexp
CFFI не спасает? Только не говори, что под LW его нет, я не поверю.
Помимо того, очень многие библиотеки живые, CL лет ещё меньше, чем BSD.
> потому что их никто кроме разработчиков никогда не пользовал.
Это, мягко говоря, неправда.
---
...Я работаю антинаучным аферистом...
Вместо этого пишешь "longjmp(handler, -1);", и ты оказываешьсяДоговаривай: я оказываюсь в другом месте с тремя утечками.
в другом месте. Причём точно знаешь, что у тебя семантика всегда
"retry", о чём уже можно не заботиться.
Если ты соблюдаешь правила вложения, никаких утечек нет.
---
...Я работаю антинаучным аферистом...
Началось. Бедняга токарь
Если ты соблюдаешь правила вложения, никаких утечек нет.Так ты приведи хотя бы часть кода, где ты следишь за этими правилами. (Кстати, Си++ следит за деструкторами сам.) Очевидно, код распухнет по сравнению с Си++, и намного.
Началось. Бедняга токарьЯ только до сих пор не могу понять, на кой чёрт ты ответил на мой пост. Или ты тоже считаешь, что sprintf безопаснее ostream?
Научись прогать на Лиспе и попробуй написать качественный коммерческий софт. И сам убедишься.
>Может, ты тогда объявишь, какие графические средства _встроены_ в перл?
>То же с XML.
Перечитай посты, ты не о том.
> CFFI не спасает? Только не говори, что под LW его нет, я не поверю.
Не спасает, он убог.
> Помимо того, очень многие библиотеки живые, CL лет ещё меньше, чем BSD.
Гуманитарий? На "большинство глюкавые" контрпример "есть неглюкавые"? Зачем мне неглюкавые которые не делают того что мне нужно?
> Это, мягко говоря, неправда.
Иди регекспы потестируй. которые "быстрее сишных"
Если ты привык к императивному стилю, то у тебя есть одни привычки,
если ты привык к какому-то другому, другие. Если ты не привык ни
к чему, то у тебя вообще никаких привычек нет, и в этому случае
единственный способ обучения --- дисциплина. В программировании
часто не видно, что хорошо, а что плохо, поэтому некоторые любят
принцип "crash early, crash badly." Это же и использует неявно
Торвальдс: у неприплюснутого насильника больше горького опыта,
что важнее в больших и ядерных проектах.
Кстати, пример.
Если ты привык к тому, что память надо запирать, а то уползти может,
как в MacOS Classic или Palm, то программировать под униксы становится
страшновато, потому что там "mandatory locks" нет и хрен ты что с этим
сделаешь. Униксоиды этого могут не видеть и, вообще говоря, не видят,
пока не сталкиваются с похожими проблемами на примере pthreads.
В красках.
---
...Я работаю антинаучным аферистом...
С простыми утилитами типа "получил из стдина, отдал в стдаут" проблем быть не может, не спорю. А если надо создавать здоровую систему, которая должна работать 7 дней в неделю, 24 часа в сутки, то такой подход не проходит.
>> То же с XML.
> Перечитай посты, ты не о том.
Я о том, что пока КЛ уступает перлу больше из-за компилятора,
чем из-за библиотек. Ты привёл примеры именно к этому.
>> CFFI не спасает? Только не говори, что под LW его нет, я не поверю.
> Не спасает, он убог.
Ну, возьми другой FFI, какой тебе больше нравится.
>> Помимо того, очень многие библиотеки живые, CL лет ещё меньше, чем BSD.
> Гуманитарий?
Да.
> На "большинство глюкавые" контрпример "есть неглюкавые"?
> Зачем мне неглюкавые которые не делают того что мне нужно?
Ты используешь одни и те же библиотеки что в лиспе, что в перле,
может, конечно, Expat на перл переписали, но что-то не верится.
Что ещё? Motif? GTK? Они тоже одни что для перла, что для лиспа.
>> Это, мягко говоря, неправда.
> Иди регекспы потестируй. которые "быстрее сишных"
Я использую штатные спенсеровы через FFI. Мне так проще.
---
...Я работаю антинаучным аферистом...
в стилях обработки ошибок.
---
...Я работаю антинаучным аферистом...
А претензии к assert - вообще шик. Используешь ты какую-нибудь билиотеку, которая говорит, что должна что-то такое вернуть (ну, например, два параллельных массива одинаковой длины). Параллельные массивы, конечно, плохо, но речь не о том. Ты что будешь делать, если она вернёт что-то не то? Ждать пока у тебя програма 10 раз данные сохранит и считает, а потом упадёт в неизвестном месте, и ты заебёшься отлаживаться, чтобы понять почему, или сразу напишешь assert на то, что данные корректны?
То, что пользовательская и девеловерская версия программы должны работать одинаково (разве что отладчные логи у пользователя можно не выводить) - это конечно да, но что assert не использовать - это глупость. Если у тебя assert в пользовательской версии делает не то, что в девелоперовоской, так это тебе его переопределить просто надо.
А как ты будешь выводить массив данных в формате [a_0, a_1, ..., a_n], в смысле через запятые. Тоже с извращаться?
sNprintf, так как sprintf не безопасен.
Я буду в цикле делать offset += snprintf(buf + offset, BUF_SZ - offset, "%d, ", mas[i]);
И это правильно. Потому что работает пиздец как быстро.
Используешь ты какую-нибудь билиотеку, которая говорит, что должна что-то такое вернуть (ну, например, два параллельных массива одинаковой длины). Параллельные массивы, конечно, плохо, но речь не о том. Ты что будешь делать, если она вернёт что-то не то?Во-первых, я не использую "какие-то" библиотеки, ибо пользуюсь правилом — "или используй проверенное другими, или пиши сам с нуля". Пока из "каких-то" библиотек мне приходилось попдесть только на одну — лемматизатор Сокирко, но даже его мы переписали с нуля. Ну а если уж совсем никак и НАДО... я не понял в чем вопрос?
Да хоть даже и сами написали. Просто внешняя по отношению к данной библиотека, код которой компилируется отдельно, соответсвенно, гарантировать, что она будет возвращать то, что ты от неё ожидаешь, ты не можешь - другой программист может изменить код. И как ты предлагаешь, не пользуясь assert, проверять корректность данных, возвращаемых этой внешней библиотектой? Нормальные люди пишут в этом месте assert (вернее во всех местах, где надо проверить целостность каких-то внутренних инвариантов, которые не отслеживаются автоматически средствами языка и живут спокойно - если программа начнёт себя вести не так, как мы ожидаем, то полетит ислючение, которое мы обработаем на верхнем уровне и выдадим сообщение об ошибке. Таким образом большинство ошибок будет замеченно на этапе тестирования. А если какая-то ошибка случиться у пользователя, то мы будем иметь не спупое сообщение об обращении к чужой памяти по непонятному адресу (+ крэш программы а информацию о том, в каком месте кода она случилась (+ программа продолжит работать, если ошибка не в критическом месте что в большинстве случаев уже достаточно, чтобы понять, что случилось.
А почему во всех современных языках пишут что-то вроде?
result += ", " + a[i].to_str
А нормальная реализация строк на C++ позволяет писать так же, и при этом не проигрывать твоему коду по скорости?
ты чего сердитый такой? там же ни слова про понятность не было.
Во-первых — страсть писать непонятно. <бла-бла-бла>
Во-вторых куча юношей фанатично начинают отказываться от _стандартных_ средств в пользу уёбищных (iostream'ам привет!). <бла-бла-бла, надо юзать c-like snprintf>
ну это хз =)
и никак не можешь получить "}; else".А оно зачем?
Оставить комментарий
pilot
отсюда