Альтернативы )))

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Re: Альтернативы )))

Сообщение azsx » 22.06.2016 02:42:06

третий человек пишет, что не любит С. А что в нем не так?
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Альтернативы )))

Сообщение скалогрыз » 22.06.2016 06:24:14

azsx писал(а):третий человек пишет, что не любит С. А что в нем не так?

а я не люблю Си за разношёрстность:
когда-то в детстве пытался осилить, и у меня даже было 3 книжки. И все они назывались Си++ (одна кстати за авторством Страуструпа!)
А кроме этих книжек у меня было два компилятора MSVC++ и Borland C++ (даже ещё не билдер)
и диво-дивное, ни один пример я так скомпилировать не смог...(тут нужно взять поправку на мой возраст 13-15 лет).
Зато из книжки по паскалю, в TP всё работало с разу, с тех пор у меня зародилось к Си недоверие.

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

Естественно, т.к. мой мозг был травмирован модульностью TP, пришлось ломать свою психику чтобы освоить просто принцип сборки Си-шных исходников (каждый файлик отдельно, а потом все вместе). А так дивные вещи, вроде почему "модуль" не был добавлен в #include а его функцию/переменную я могу использовать. Разрыв шаблонов! :)

Разочарованием было, что в Си не оказалось ни var ни const параметров, а всё пошло через указатель. И массив - указатель, и указатель - массив. Как ни странно тут же начились те самые выстрелы в ногу. Насколько больно было писать какой-нить hello world без shortstring-ов (TP - string) :)

Повзрослев, лёгким шоком оказалось, что скорость сборки на Си и Си++ - черепашья, по сравнению с Паскалем.
В написанном кем-то проекте, библиотеке, за день-два просто не разобраться. А если ещё нужно что-то собирать под новую систему (н.р. какой-нить юниксовую библиотеку под mingw32/msvisual), то оказывается что ещё нагромаждение сборочных систем. Без которых в Си, как и без препроцессора жить нельзя.
есть make. Но make руками оказываются делают только если нужно скомпилировать 2-3 файла.
а кроме make, есть configure. Но configure это оказываетс скрипт, из каких-то шаблонов.
и есть утилита для создания configure - autoconf.
а ещё есть automake. А ещё их есть разных версий, и одна версия с другой не совпадает.

Каким-то чудом, паскаль компиляторы (tp, delphi, fpc) без всей этой шлуеты обходятся. Даёшь компилятору начальный файл, список поиск модулей/исходников - и ВСЁ! собирается же!!! человеколюбие же!

И, конечно, эстетически Си отталкивал закорючками (нету же begin/end!, полно скобок, и кучи символов - краткость синтаксиса! ). Как и многие другие дети начинал своё обучение с бейсика (zx spectrum). Но бейски визуально ближе к паскалю, там хотя бы всё словами. (а отсутствие нумерации строк в паскале, делало его ну просто супер-языком!). И т.к. я вырос на "словестных" языках, си с его кратко-символьной записью казался китайской грамотой. Да, выглядит код кулхацки... но глаза режет и колет.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Альтернативы )))

Сообщение azsx » 22.06.2016 07:36:52

библиотеке, за день-два просто не разобраться. А если ещё нужно что-то собирать под новую систему (н.р. какой-нить юниксовую библиотеку под mingw32/msvisual), то оказывается что ещё нагромаждение сборочных систем. Без которых в Си, как и без препроцессора жить нельзя.

скалогрыз без шуток, вы меня расстраиваете. Я думал щас С выучу, потихоньку на нем писать начну - борода вырастет и чувство собственного величия... Насчет разношерстности компиляторов С++ согласен,я поэтому учу С.
Кстати недавно на другом форуме я задавал вопрос, почему так сложно копировать и искать исходный код на С под разные алгоритмы. Ведь на С типа всё есть. Я думал, что это я искать не умею, а оно оказывается не идет половина сложных алгоритмов за просто так...
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Альтернативы )))

Сообщение скалогрыз » 22.06.2016 08:12:05

azsx писал(а):скалогрыз без шуток, вы меня расстраиваете. Я думал щас С выучу, потихоньку на нем писать начну - борода вырастет и чувство собственного величия... Насчет разношерстности компиляторов С++ согласен,я поэтому учу С

А я не отговариваю! учи, пиши, тебе только в плюс (плюс) :)

Мне не приходилось "писать" что либо существнное на Си , но ОЧЕНЬ и ОЧЕНЬ много приходилось разбиратся в уже написанном коде (пересобирать, допиливать или приматывать паскаль интерфейс). А это, как известно, работа трудная и муторная. Может быть по-этому у меня скиптическое отношение к Си и Си++

Кстати, вспомнил ещё один предмет лютой ненависти в Си-шном коде.
Это объявление типа, где угодно, когда угодно и произвольной сложности.
Особенно это доканывает, когда начинается речь об указателях на процедуры, которые нужно передать/вернуть в параметр.

Это кстати по-задумке было так, ибо typedef появился не в первой версии Си, и свои типы по имени описать было невозможно.

Но ведь typedef же ввели, ан нет, люди продолжают злоупотреблять, и с первого взгляда трудно бывает понять, является ли это выражение приведением типов, вызовом функции или просто хитросплетённым умножением.

azsx писал(а):Кстати недавно на другом форуме я задавал вопрос, почему так сложно копировать и искать исходный код на С под разные алгоритмы. Ведь на С типа всё есть. Я думал, что это я искать не умею, а оно оказывается не идет половина сложных алгоритмов за просто так...

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

Не удивлюсь, если эта библиотека, если она на Си++, обязательно будет использовать какие-нибудь шаблоны, или другие хитрости языка реализации, которых в других языках нет. А это значит что портировать такой алгоритм на другой язык будет сложнее.

Как итог, придётся либо использовать библиотеку, которая нафик не нужно, либо "вдхоновившись" найденными исходниками придётся (пере)писать самостоятельно :)
Последний раз редактировалось скалогрыз 22.06.2016 08:18:53, всего редактировалось 1 раз.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Альтернативы )))

Сообщение CynicRus » 22.06.2016 08:13:21

azsx писал(а):третий человек пишет, что не любит С. А что в нем не так?


На самом деле, в нём почти всё так. Но угнетает, что почти на каждую задачу, если не используешь glib или winapi приходится изобретать свои строки. И конечно же препроцессор, и поддержка чужого кода. В чужом коде на C редко можно сходу разобраться, поскольку все пишут на нём по своему, редко кто пользуется каким либо стандартом. А от длинных портянок типа if elseif - просто вытекают глаза.
CynicRus
постоялец
 
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

Re: Альтернативы )))

Сообщение SSerge » 22.06.2016 08:15:23

azsx писал(а): А что в нем не так?


Костыли в первую очередь. Разные у разных компиляторов.
Задание №1. Вывести одним оператором printf четыре переменных типа long long (или unsigned long long для разнообразия). Сильно удивитесь, если это сделаете для разных компиляторов. Особенно эпична разница между Visual C++ и gcc/mgw
Задание №2. Вывести через printf величину, хранящуюся в переменной типа long double. :mrgreen: Из той же серии.
Задание №3. Поработать с файлом длиной больше 4 гигабайт на 32-разрядной ОС. Чудные костылики. Если еще найдёте их. :D Потому как тщательно прячут.

Справедливости ради, стоит отметить, что к языку как к таковому это не имеет отношения. Такова реализация библиотек.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Альтернативы )))

Сообщение Дож » 22.06.2016 19:48:29

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

Нужно всё же отличать C и C++. Нет такого языка «C/C++», есть отдельно язык C со своим стандартом и отдельно язык C++ со своим стандартом, язык C не являюется подмножеством C++ (вопреки распространённому мнению). На C++ можно вполне себе писать короткий код без макросов.

Так вы про C или C++? :) Большинство утверждений верно, если говорить про С, и сомнительно, если говорить про С++.

Задание №1. Вывести одним оператором printf четыре переменных типа long long (или unsigned long long для разнообразия). Сильно удивитесь, если это сделаете для разных компиляторов. Особенно эпична разница между Visual C++ и gcc/mgw


printf-like функции не рекомендуется использовать в C++ для сложных преобразований типов в строки.

Ну ок, какой компилятор и в какой системе, по-вашему, неправильно отработает такой printf?
Код: Выделить всё
#include <stdio.h>

int main(int /*argc*/, char* /*argv*/[]) {
    long long x = 5;
    printf("%lli\n", x);
    return 0;
}


Вывести через printf величину, хранящуюся в переменной типа long double.


Аналогичный вопрос:
Код: Выделить всё
#include <stdio.h>

int main(int /*argc*/, char* /*argv*/[]) {
    long double x = 5;
    printf("%Lf\n", x);
    return 0;
}


Задание №3. Поработать с файлом длиной больше 4 гигабайт на 32-разрядной ОС. Чудные костылики. Если еще найдёте их. :D Потому как тщательно прячут.


Написал самым прямолинейным и тупым способом, без костылей, всё отработало. И?
Код: Выделить всё
#include <stdint.h>
#include <iostream>
#include <fstream>

int main(int /*argc*/, char* /*argv*/[]) {
    using namespace std;
    // более 4GB
    uint64_t size = 4*1024*1024*(uint64_t)1024 + 1;
    {
        // создаём файл более 4GB
        ofstream out("large.bin");
        for (uint64_t i = 0; i < size; ++i)
            out.put((char)i);
    }
    {
        // читаем файл более 4GB
        ifstream in("large.bin");
        int count = 0;
        for (uint64_t i = 0; i < size; ++i)
            if (in.get() == 255)
                ++count;
        // мы посчитали сколько раз встретилось 255,
        // а это примерно 1/256 от размера файла
        cout << count << endl;
    }
    return 0;
}

Код: Выделить всё
17:56:54 doj@malina:~$ g++ large.cpp -o large && time ./large
16777216

real    31m58.599s
user    26m25.430s
sys     2m2.540s
18:29:01 doj@malina:~$ uname -a
Linux malina 4.1.13+ #826 PREEMPT Fri Nov 13 20:13:22 GMT 2015 armv6l GNU/Linux
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Альтернативы )))

Сообщение скалогрыз » 22.06.2016 21:27:07

Дож писал(а):Нужно всё же отличать C и C++. Нет такого языка «C/C++», есть отдельно язык C со своим стандартом и отдельно язык C++ со своим стандартом, язык C не являюется подмножеством C++ (вопреки распространённому мнению). На C++ можно вполне себе писать короткий код без макросов.

Может быть и можно, но я не встречал обратного. Люди, всё-равно упорно и активно используют препроцессор, который так и не выкинули из С++.
Простейший пример - даже в Си++ коде, проще найти #DEFINE, нежели const.
Самый лучший (чистый) Си++ код, который я видел, был в unrar.dll.

а ещё я нелюблю генерики :) потому что они генерики (и в паскале их когда-то не было)! и в Си++ используются часто.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Альтернативы )))

Сообщение dedm0zaj » 23.06.2016 04:55:25

скалогрыз писал(а):а ещё я нелюблю генерики

как тогда писать листы? отдельный лист под каждый тип? или юзая нетипизированный указатель? в него же можно положить что угодно, что плохо.
dedm0zaj
постоялец
 
Сообщения: 108
Зарегистрирован: 05.10.2012 19:55:20

Re: Альтернативы )))

Сообщение скалогрыз » 23.06.2016 05:13:30

dedm0zaj писал(а):как тогда писать листы? отдельный лист под каждый тип? или юзая нетипизированный указатель? в него же можно положить что угодно, что плохо.

нетипизированный указатель для "внутренних" листов и отдельный тип-листа или спец интерфейс для листов "внешних".

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

"внешние" листы, это те, содержимое которых я не могу гарантировать или не контроллирую. Опять же писать спец-лист для каждого не обязательно. Например можно использовать TObjectList или TFPObjectHashTable. Сейчас прибегут и скажут, дескать "теряешь производительность на проверках типа". Отвечу, что не теряю, т.к. считаю, что проверка типа (is) займёт времени несоизмеримо меньше, чем полезный код. Ну и решение может получится в итоге гибче, чем какой-либо специализированный список.

Со школьной и студенческой скамьи вбивают - дублирование кода, это плохо. И почему же дженерики это не дублирование в промышленных масштабах? Ну и экономлю на типах :)

Но я ни в коем случае не призываю никого отказываться от их использования, это мой стиль написания, мой вкус.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Альтернативы )))

Сообщение SSerge » 23.06.2016 05:30:13

Дож писал(а):какой компилятор и в какой системе, по-вашему, неправильно отработает такой printf?


Насколько помню, у minGW были с этим проблемы; особенно с unsigned long long. Требовалось лепить MS-овские спецификаторы типа %I64

Дож писал(а):Написал самым прямолинейным и тупым способом, без костылей


Не плюсами, а чистым Си, пожалуйста. И без костылей! :D
Вот стопроцентно не выйдет ... без костылей.
Я имею в виду директиву #define _FILE_OFFSET_BITS 64 и аналогичный ключ компиляции (linux 32х, под windows сработает на последних компиляторах VCC, под 64-битным linux тоже сработает)

С long double вообще-то несколько иная проблема. Ее просто нечем (при базовых средствах) прочитать из бинарного файла под windows. Ибо в MS это абсолютный аналог double.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Альтернативы )))

Сообщение Дож » 23.06.2016 05:38:31

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

Потому что говорится про дублирование в другом смысле. При ручной реализации всех специфичных типов, дублирует код программист. При использовании дженериков дублирует код компилятор, освобождая программиста от ручной работы. От того, что программист вручную напишет все специфичные списки, итоговый код программы не станет больше, чем если бы за него это сделал компилятор. Я уже не первый раз вижу, как в аргументации сливают два различных явления в одно (потому что и то, и другое можно назвать словом дублирование).
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Альтернативы )))

Сообщение скалогрыз » 23.06.2016 06:20:44

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

Дож писал(а):Я уже не первый раз вижу, как в аргументации сливают два различных явления в одно (потому что и то, и другое можно назвать словом дублирование).
так какие 2 явления? "ручное" и "автоматическое"? или ты имеешь в виду "дублирование логики" и "копирование реализации для другого типа"?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Альтернативы )))

Сообщение Дож » 23.06.2016 06:32:22

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

При этом внешние списки дублируете руками, а не приводите по типу :)
так какие 2 явления? "ручное" и "автоматическое"? или ты имеешь в виду "дублирование логики" и "копирование реализации для другого типа"?

Дублирование логики в исходнике и дублирование одинакового кода в исполняемом файле, да.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Альтернативы )))

Сообщение скалогрыз » 23.06.2016 06:46:32

Дож писал(а):При этом внешние списки дублируете руками, а не приводите по типу :)

да как же ш!
скалогрыз писал(а): Опять же писать спец-лист для каждого не обязательно. Например можно использовать TObjectList или TFPObjectHashTable. Сейчас прибегут и скажут, дескать "теряешь производительность на проверках типа". Отвечу, что не теряю, т.к. считаю, что проверка типа (is) займёт времени несоизмеримо меньше,

"Внешние" списки нужно не дублировать, в тех случаях, когда для обслуживания нужен более удобен иной интерфейс, чем в самом "списке".
Например, если список состоит из read-only объектов, и заполняется только через дополнительные методы, то имеет смысл описать к нему соответствующий интерфейс, а не выкладывать его как property ... TList или TStringList.

Дож писал(а):Дублирование логики в исходнике и дублирование одинакового кода в исполняемом файле, да.

Бинарно-то код всё-равно увеличивается.
Вот хорошо в паскале получилось с массивами. По сути своей они как бы дженерики, но объём кода при этом не увеличивается, т.к. методы работы с массивом (например изменить размер), завязан на размере элемента. Т.е. вроде бы и дженерик, а дубляжа кода (на бинарном уровне) нет.

И читая maillist, я как-то обратил внимание, что люди стали клянчить для дженериков удивительные вещи.
Нужно знать тип специализации и в коде знание о типе использовать, чтобы к большему виду типов можно было было дженерик прикрутить.
Вроде такого получается
Код: Выделить всё
  if T is String  then Result := a + a
  else if T is Integer then  Result := a * a
  else if T is Record then // do nothing
  else if T is ...

ну и т.д.
Получается исходник самого дженерика, расплывается с конкретной реализацией всех типов. И хочется задать вопрос - и в чём в итоге преимущество, перед ручным копированием, если в дженерике оказывается тот же самый код?! Ручное копирование в этом случае лучше, т.к. код для конкретного типа изолирован от других типов, его легче воспринимать, менять и отлаживать
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru