LINUX.ORG.RU

[C++?] Серьезный вопрос.


3

2

Просьба ответит серьезно, желательно с аргументами за или против.

Предистория:
Когда то давным давно (я тогда еще только закончил 9-ый класс) я увидел в газете объявление о наборе в летнюю группу по изучению классического программирования. В тот момент я был с компьютером на ты и "очень" хорошо в них разбирался (переустанавливал Windows каждый месяц, хаял Microsoft просто потому, что после моих настроек W приходилось постоянно переустанавливать). Группа по классическому программированию так и не набралась, но набралось 1 человек на Visual Basik for Applications. Я соглсился быть вторым и начались занятия.
Все, что мне там объясняли я схватывал быстро. Меня пригласили продолжить обучение в сентябре на курсе "моделирование".
Там уже был Pascal, который я тогда совсем не знал. Сам курс был очень разношорстный: мы изучали и использование мыши через прерывание, готовились к различным олимпиадам. Параллельно я изучил Pascal.
Потом был Delphi. К концу 10-го класса я уже неплохо владел приемами программирования и вовсю клепал бесполезные программулины. Потом поступил в универ на программиста. Там тоже был Delphi, и я особо не напрягаясь писал все лабы (к моменту поступления я уже был знаком с логикой указателей, самописные стеки и графы, etc).
На 2-ом курсе в гостях у знакомого я разобщался с человеком, который уже насколько лет работал в нерезиновой программистом. Он мне и открыл глаза на мир: "Delphi здох. Его уже похоронили и забыли. Сейчас необходимо знание C++, C#. Необходимо занание паттернов проектирование". Вобщем много чего он мне наговорил. Книжек умных насоветовал, подкинул MSVS 2008, кучу электронных книжек. Я изучил C# по книжке Шилдта. Читал "Идеальный кол" (автора уже не помню). Потом купил(!) себе книжку Шилдта про С++. Мне понравился язык. Тем более что мне казалось, что именно он и есть общепринятый стандарт. Наиболее удобный язык для программиста.

А недавно в соседней теме за упоминание это С++ меня чуть было не съели со всем чем можно. Так-то.

Собственно вопрос: Так стоит ли изучать дальше С++ (а я уже достаточно углубился в книжку Страуструпа, подробно изучая все подводные течения)? Какой язык стоит изучать? Какие из них более востребованны?

Спасибо всем, кто осилил это многобукаф.

★★★★★
Ответ на: комментарий от linuxfan

Какой «твой код»? Что-то я кода в упор не вижу, только какой-то невнятный «псевдокод».

Ну вот допустим код на Хаскеле(есть недочеты, но не суть важно):

integEps eps a b f | a<b = (f a  + f(a+eps))*eps/2 + integEps eps (a+eps) b f
                   | otherwise = 0
                   
main = do
    print $ integEps 0.01 0 1 (\x -> x*x)
Waterlaz ★★★★★
()
Ответ на: комментарий от linuxfan

>>Код, пожалуста (эквивалентный моему).

> Какой "твой код"? Что-то я кода в упор не вижу, только какой-то невнятный "псевдокод".

Спасибо, К.О.

Код, пожалуста (эквивалентный моему псевдокоду).

> невнятный "псевдокод".

Ах невнятный? А ведь ты, О Мудрейший, еще и математике хотел меня подучить и сокрушался о моем математическом невежестве... Почему же ты не узрел элементарное быдловычисление быдлоинтеграла по быдлообъему?

> Если речь идет о C, то void *params в качестве дополнительного параметра решает все проблемы.

Ну так мы увидим код?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Waterlaz

> Ну вот допустим код на Хаскеле(есть недочеты, но не суть важно):

В хаскеле аналогичный код не вызывает ни капли затруднений, т.к. есть карринг.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от kemm

>> При чем тут "чисто на С++" ? универсального языка не существует.

> Хорошо, продолжим. Что именно там написано на C++?

Практически всё в яндексе написано на плюсах, кроме совсем пользовательских интерфейсов. Внутре, в основном, именно что вебсервисы-на-плюсах. Интерфейсы, в смысле отдавалки юзерам HTML-я - на перле (ну, исторически так сложилось, у унутре у него все равно плюсы), джанге (всякая мелкая сравнительно слабо нагруженная упячка) и самопальном изврате на тему JSP под названием XScript (оно даже опенсорсное с некоторых пор).

Хотя я вру, есть некоторое количество кода на яве (в основном, внутреннего пользования) и пыхе (мойкруг, оно такое было куплено)

Если чё, я точно знаю, я там уже довольно много лет работаю.

anonymous
()
Ответ на: комментарий от linuxfan

> Какой "твой код"? Что-то я кода в упор не вижу, только какой-то невнятный "псевдокод".

Вполне себе обычный псевдокод. Подозреваю, что он даже на C# заработает (??) без особых изменений. И уж тем более на окамле. В хаскеле придется переводить в хвостовую рекурсию, но это здесь не проблема.

dave ★★★★★
()
Ответ на: комментарий от Waterlaz

> Ну вот допустим код на Хаскеле(есть недочеты, но не суть важно):

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

kemm
()
Ответ на: комментарий от anonymous

Я, вроде, где-то уже спрашивал следующую итерацию: и что из этого следует?

Дабы не продолжать пинг-понг, сразу дам правильный ответ: ничего из этого не следует. 8))

kemm
()
Ответ на: комментарий от www_linux_org_ru

>Почему же ты не узрел элементарное быдловычисление быдлоинтеграла по быдлообъему?

Дай-ка я подумаю... Наверное потому, что твой самопальный псевдобыдлокод не имеет ничего общего с общепринятой математической нотацией. Кстати, как ни всматривался, не разглядел там тройного интеграла, а двойной интеграл у нас вроде бы по быдлоплощади, нет?

>Ну так мы увидим код?

Реальный код, эквиваленгтный эзотерическому высокоуровневому быдлокоду? Не пойдет. Пиши что-то близкое к реальности и, возможно, я снизойду до того, чтобы показать тебе мощь void*.

linuxfan
()
Ответ на: комментарий от kemm

>Дабы не продолжать пинг-понг, сразу дам правильный ответ: ничего из этого не следует. 8))

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

linuxfan
()
Ответ на: комментарий от linuxfan

Держи код на окамле. Жду увидеть аналогичный на C... Кстати, можешь сравнить скорость исполнения.

  (* здесь используется хвостовая рекурсия *)

  let integ_eps eps a b f =
    let rec integ_eps' acc eps a b f =
      if a < b then
        integ_eps' (acc +. (f a +. f (a +. eps)) *. eps /. 2.0) eps (a +. eps) b f
      else
        acc
    in integ_eps' 0.0 eps a b f;;

  (* здесь код переписан "в-лоб" с помощью цикла for *)

  let h_eps eps n g =
    let r = ref 0.0 in
    for i = 0 to (n - 1) do
      r := !r +. integ_eps eps 0.0 1.0 (fun x -> integ_eps eps 0.0 1.0 (fun y -> g x y ((float_of_int i) /. (float_of_int n))));
    done;
    !r /. (float_of_int n);;

Проверка:

# h_eps 0.01 10 (fun x y z -> sin (x +. y +. z));;
- : float = 0.87548945511083853
dave ★★★★★
()
Ответ на: комментарий от dave

>Держи код на окамле.

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

Можно для старых, тупых и ленивых словами пояснить, что оно делает?

linuxfan
()
Ответ на: комментарий от kemm

>иди дальше плюсы грызи

Гордо сказал программист на... На чем? На хацкиле? На петуне? Или на том самом охаиваемом C++?

linuxfan
()
Ответ на: комментарий от linuxfan

> Можно для старых, тупых и ленивых словами пояснить, что оно делает?

Ты просто не в теме. Сам будучи старым, могу сказать тебе одно: читай мануалы :)

Языки C и C++ низкоуровневые. Их место там. Есть задачи, для которых эти языки не годятся.

dave ★★★★★
()
Ответ на: комментарий от dave

>Есть задачи, для которых эти языки не годятся.

И, как я понял, два упертых любителя высокоуровневой каки в этом треде хотят убедить кого-то, что эти языки не годятся для числодробилок? Ну удачи вашим хацкилям и окамлям в соревновании с icc :)

linuxfan
()
Ответ на: комментарий от linuxfan

Не могу ничего говорить за других, но мне кажется, что ты опять ничего не понял... Ради бога, программируй на Си и Си ++ сколько душе угодно. Вопрос ведь в том, сколько это будет тебе стоить. Тем более, если зачастую существуют альтернативы, которые позволяют получить почти тоже самое, но меньшими страданиями ;)

dave ★★★★★
()
Ответ на: комментарий от linuxfan

Капитан сообщает, что эти ваши числодробилки --- суть 0.02% от реальных задач. Программисты на хаскеле, лиспе, перле, питоне, etc с насмешливым глумлением смотрят на жалкие попытки с++дрочеров написать несегфолтящийся хелловорлд за вменяемое время.

ugoday ★★★★★
()
Ответ на: комментарий от kemm

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

Ага, тьху. Понял, что имеется ввиду.

Вот аналог того псевдокода:

integEps eps a b f | a<b = (f a  + f(a+eps))*eps/2 + integEps eps (a+eps) b f
                   | otherwise = 0

integ a b f = integEps ((b-a)/100) a b f

g x y z = x*y*z
                  
h :: Int -> Double
h n = sum $ map (\i -> integ 0 1 
                             (\x -> integ 0 1 
                                          (\y ->  g x y ((fromIntegral i)/(fromIntegral n)) )))
                [0..n-1]
                   
main = do
    print $ h 4

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Тьху, опять. Влом переделывать, но там можно было с каррированием прозще записать. Ну да ладно...

Waterlaz ★★★★★
()
Ответ на: комментарий от ugoday

>Капитан сообщает, ... <бред лжекапитана поскипан>

Капитан также сообщает, что на даже десктопе, где по заявлениям скриптофанатиков, C и C++ не место, у меня нет ни одного приложения на этих ваших петонах и хацкилях. Firefox, pidgin, Xorg -- все это C или C++. Есть только два исключения: Azureus (Vuze) и mldonkey, причем последним я попользовался всего пару раз и забросил.

Подозреваю, что поделки на скриптовых быдлоязыках не сегфолтятся преимущественно потому что этих поделок почти нет.

Кстати, совсем уж оголтелые фанатики могут сравнить потребление памяти мультипротокольным pidgin'ом и однопротокольным gajim'ом. Результат, как говорится, налицо.

linuxfan
()
Ответ на: комментарий от linuxfan

О, ещё одну печенюжку нашёл, лови...

> Подозреваю, что поделки на скриптовых быдлоязыках не сегфолтятся преимущественно потому что этих поделок почти нет.

Это ты Ocaml или Haskell в данный момент _скриптовым_ быдлоязыком назвал, просвети общественность?

kemm
()
Ответ на: комментарий от kemm

> Это ты Ocaml или Haskell в данный момент _скриптовым_ быдлоязыком назвал, просвети общественность?

Т.е. на хаскелле нельзя писать скрипты?

anonymous
()
Ответ на: комментарий от anonymous

> Т.е. на хаскелле нельзя писать скрипты?

На С можно писать скрипты? Является ли он скриптовым быдлоязыком?

kemm
()
Ответ на: комментарий от kemm

> На С можно писать скрипты? Является ли он скриптовым быдлоязыком?

А для сей есть интерпретатор?

anonymous
()
Ответ на: комментарий от anonymous

> А для сей есть интерпретатор?

Во-первых, afair, есть. Во-вторых, никто не мешает сделать, только кому оно такое нужно, кроме как по-приколу, непонятно...

kemm
()
Ответ на: комментарий от kemm

>http://en.wikipedia.org/wiki/Ch_interpreter

Протри глаза от конъюнктивита и скажи, это похоже на C:

[code] #!/bin/ch #include <sys/stat.h> struct stat cstat, ostat; string_t c, o; foreach (c; `find . -name "*.c"`) { o=`echo $c | sed 's/.c$/.o/'`; stat(o, &ostat); stat(c, &cstat); if (ostat.st_mtime > cstat.st_mtime) { echo "compiling $c to $o"; gcc -c -o "$o" "$c"; } } [/code]

Конкрено интересует инструкция foreach и повсеместное использование обратных апострофов. Что-то не очень на C похоже. Разве что фигурными скобками, но в таком случае, Java -- это тоже C.

linuxfan
()
Ответ на: комментарий от kemm

http://en.wikipedia.org/wiki/Ch_interpreter

Протри глаза от конъюнктивита и скажи, это похоже на C:

   #!/bin/ch 
   #include <sys/stat.h> 
   struct stat cstat, ostat; 
   string_t c, o; 
   foreach (c; `find . -name "*.c"`) 
   { 
       o=`echo $c | sed 's/.c$/.o/'`; 
       stat(o, &ostat); stat(c, &cstat); 
       if (ostat.st_mtime > cstat.st_mtime) 
       {  
           echo "compiling $c to $o"; 
           gcc -c -o "$o" "$c"; 
       } 
   } 

Конкрено интересует инструкция foreach и повсеместное использование обратных апострофов. Что-то не очень на C похоже. Разве что фигурными скобками, но в таком случае, Java — это тоже C.

linuxfan
()
Ответ на: комментарий от kemm

http://bellard.org/tcc/ как придерёшься?

Мосье не в курсе, что он поддерживает _подмножество_ языка C? Разницу между подмножеством языка и расширением языка объяснить или сам сообразишь?

linuxfan
()
Ответ на: комментарий от kemm

Очевидно, что tcc. А Ch как-то весьма некисло дополняет язык всяческими shell'овскими "`".

Кстати, главная проблема местных хацкилистов в том, что они не понимают, что если у этих недоязыков и есть какая-то сфера применения, то она определенно лежит вне десктопов, где все уже давно занято C/C++/Java

linuxfan
()
Ответ на: комментарий от linuxfan

> Очевидно, что tcc.

А теперь список неподдерживаемых возможностей ANSI C в студию. Он только C99 не в полном объёме поддерживает. Иди за глазными каплями и отвечай, является ли С -- скриптовым быдлоязыком.

kemm
()
Ответ на: комментарий от linuxfan

И чем они более скриптовые быдлоязыки, чем С?

kemm
()
Ответ на: комментарий от linuxfan

Кстати, как ни всматривался, не разглядел там тройного интеграла, а двойной интеграл у нас вроде бы по быдлоплощади, нет?

Наимудрейший проглядел цикл по i и затем деление на N — там вычислялся третий интерграл. (Мое мнение о тех, у кого ухудшилось мнение о краснодипломниках, ухудшилось :-)

Реальный код, эквиваленгтный эзотерическому высокоуровневому быдлокоду? Не пойдет. Пиши что-то близкое к реальности и, возможно, я снизойду до того, чтобы показать тебе мощь void*.

Гы-гы. Скорее, ты покажешь немощь указателя на функцию без костыля void* (или без замыканий).

... и тут встал вопрос, как написать «что-то близкое к реальности» и в то же время не решить за Наимудрейшего его задачу. Я решил написать на гнутых расширениях С.

#include <stdio.h>

double integral( const double a, const double b, double (*f)(const double x) ) {
  return (f(a)+f(b))*(a-b)/2; /* для линейной функции сойдет */
} 
double g(double x, double y, double z) { 
  return x*y*z; 
}
double h(unsigned int n) {
  double r=0, N=n;
  unsigned int i=0;
  for( ; i<n; i++ ) {
    double f1(double x) {
      double f2(double y) {
        return g(x,y,i/N);
      }
      return integral(0,1,f2);
    }
    r += integral(0,1,f1);
  }
  return r/N;
} 
int main() {
  printf("%lf\n",h(10));  
  return 0;
}

Выхлоп: 0.112500

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от kemm

> Оно не STL, оно eaSTL, ага?

Нет, не ага. Оно соответсвует стандарту.

This document describes an STL implementation (EASTL) developed within Electronic Arts as an alternative to and extension of the STL defined by the C++ standard library. By STL, we mean the container, iterator, and algorithm components of the C++ standard library, hereafter referred to as std STL (with std referring to the std namespace, whereas the S in STL refers to standard C++). By C++ standard, we mean ISO 14882 (1998) and the 2003 update.

> И то от него частенько отказываются, похоже...

Гдк пруфлинк?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

> Нет, не ага. Оно соответсвует стандарту.

Ага, ага.

Оно имеет весьма специфичные для геймдева фичи. Именно обычный stl тут неприменим. Плюс по мелочёвке eaSTL, вроде, отличается от более-менее обычных stl'ей по семантике -- например, get_allocator() обычно возвращает копию, в eaSTL возвращает сам аллокатор.

> Гдк пруфлинк?

Нет и не будет. Читал в блоге какого-то консольщика, последовательно пролистывая его года на два-три назад. Нереально найти.

Можешь за доказательство не считать, это скорее личные впечатления.

kemm
()
Ответ на: комментарий от kemm

> Ага, ага.

Да, и по некоторым вещам, которые в eaSTL по дефолту сделаны как по стандарту для совместимости, там же рекомендуется для геймдева использовать нестандартный вариант.

kemm
()
Ответ на: комментарий от linuxfan

> Капитан также сообщает, что на даже десктопе, где по заявлениям скриптофанатиков, C и C++ не место, у меня нет ни одного приложения на этих ваших петонах и хацкилях. Firefox, pidgin, Xorg -- все это C или C++

Зря ты Firefox привёл, ой зря. Хорошо ещё Open Office забыл, а то бы был полный конфуз. Это ж классические примеры софта на C++ aka buggy unmaintainable crap. Причём, что самое забавное, на C хороший софт таки есть, и как то его создатели обходятся без волшебных таблеток STL.

anonymous
()
Ответ на: комментарий от ugoday

>Отсюда вывод --- С и С++ редкостные тормоза.

Ну так перепиши Firefox на петуне, получишь +много% прироста производительности :)

>legacy код как он есть.

Да, тоже на петуне надо переписать, ага.

linuxfan
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.