LINUX.ORG.RU

Вторая часть интервью с Bjarne Stroustrup


0

0

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

Первую часть интервью можно прочитать здесь: http://www.techreview.com/InfoTech/17...

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

★★★★★

Проверено: Shaman007 ()

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

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

> C++ это язык для узкого круга задач не более того, и никаким в нем meta и не пахнет.

То есть: "Языка не знаю, писать на нем - не пробовал, но мне он не нравится". Веское мнение, да.

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

> Как без reflection? switch на сотню видов классов? :D

есть более гуманные методы помимо switch, хотя бы наследование... Но это сразу вводит некие правила игры и по гибкости уступает Reflection API

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

>вот не надо :) я его знаю на базовом уровне, и то только потому что на нем ничего писать не хочу. НО C++ это не МЕТА язык, смешно, я валялся - метаязык - бугога ;)

Альфекс, еще раз: нет осетрины второй свежести. Осетрина есть либо свежая, либо тухлая. Если ты язык не знаешь, а ты его не знаешь, поверь, то и не рассуждай о языке. У тебя ХОТЬ ОДИН ЗАВЕРШЕННЫЙ и работающий _СЕЙЧАС_ проект на С++ есть? Нет? А если есть, какие возможности именно С++ ты в нем применял? Или просто писал на С++ как на С и потому огреб проблем?

Я же в курсе, что ты ниасилил ни шаблоны ни RTTI ни интерфейсные классы ни кучу других возможностей С++...

> C++ это язык для узкого круга задач не более того

На С++ отлично пишутся вещи начиная от высокопроизводительных TCP серверов и до поисковых систем уровня Google/Yandex. Начиная от QT-шных десктопных приложений и заканчивая научными библиотеками а-ля root и анализаторов естественных языков.

Очень узкий круг? А разработчики всего этого, наверное, безголовые кретины, так? Ну а если они такие, то почему нет более успешных проектов? Виновата как всегда теория заговора, да?

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

>То есть: "Языка не знаю, писать на нем - не пробовал, но мне он не нравится". Веское мнение, да.

и писать на нем писал, и разбирался в крестовом проекте, но да, тут это не в кассу, ты докажи где чем кресты метаязык то? и с каких пор императивный язык может быть метаязыком ? тем более ООП ориантированный - то есть по сути одна парадигма - ООП. То есть молоток предназначенный для забивания только одного типа гвоздей это метамолоток что ли ??? ;)

иди это расскажи кому нить еще, мы тут с моим коллегой компиляторщиком ржали от слов - "C++ это мета язык, он мультипарадигменный"

ни С, ни С++, ни Java ну ни как не мета языки. А так С более универсален в плане парадигм, на нем можно применить подход ООП, почему нет, только вот сам подход ООП дааааааалеко не всегда нужен.

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

>На С++ отлично пишутся вещи начиная от высокопроизводительных TCP серверов

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

поисковики типа google нужно писать каждый день - ага. ну то что некоторые неасиливают Lisp помолчу.

А с тобой спорить == время тратить, ты себя считаешь априори всех умнее и мудрее, неинтерестно.

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

>М. - это язык, используемый для выражения суждений о другом языке, языке-объекте. Как предметный язык, так и М. могут быть обычными (естественными) языками. М. может отличаться от языка-объекта (например, в учебнике английского языка для русских русский язык является М., а английский - языком-объектом), но может и совпадать с ним или отличаться лишь частично, например специальной терминологией (русская лингвистическая терминология - элемент М. для описания русского языка; т. н. семантические множители - часть М. описания семантики естественных языков).

Большая советская энциклопедия

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

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

>руки за это отрывать надо, давайте еще ядра и компиляторы писать на крестах, ага.

Почему отрывать? Не надо эмоций. Эмоции - они показывают слабость оппонента. Приведи четкую аргументацию, почему это плохо.

>поисковики типа google нужно писать каждый день - ага.

И? К чему эта фраза?

>ну то что некоторые неасиливают Lisp помолчу.

Да, я не знаю lisp. Но я и не рассуждаю о нем. Мне неизвестно, в чем хорош lisp и в чем он плох. И потому я не позволяю себе кричать о том, что LISP - (rulez|sux).

>А с тобой спорить == время тратить, ты себя считаешь априори всех умнее и мудрее, неинтерестно.

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

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

> и писать на нем писал, и разбирался в крестовом проекте

При этом "зная его на базовом уровне"? А что такое "базовый уровень" в Си++ - его Си-совместимое подмножество?

> ты докажи где чем кресты метаязык то?

Это не я утверждал, так что не мне и доказывать. Однако я не раз читал, как некоторые техники программирования на Си++ называли "метапрограммированием".

> А так С более универсален в плане парадигм

Это типа шутка, да? Си++ может всё, что может Си, обратное - неверно (даже наследование _нормально_ не сделаешь, а реализуй-ка шаблоны? namespace'ы?).

> только вот сам подход ООП дааааааалеко не всегда нужен.

Да, кричать "ООП не нужен" сейчас модно.

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

>> Таки Стив Джобс послал в тухес Бенино поделие (оставив, правда этот недоязычок для мазохистов) и предлагает Objective C. (&& Java.)

> вообще-то Джобс предлагает Objective-C++ это так для дебилов, к сведению

Ви сами таки напейсали для Степы Джобса новый язычок и назвали его "Objective-C++" (c) ??? И что это за язычок, что там имеет место быть от С++, а что от Objective-C? И есть ли там таки множественная наследуемость в Ващем "Objective-C++" (c). Ви сделали Стиву приятно, а нам всем смешно.

http://homepage.mac.com/svc/cocoa-objc-mac-os-x/index.html

Учите албанский. Или просто таки купите мак.

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

>Так вот, если я могу на С++ реализовать описание любого другого языка

очень хочется посмотреть на реализацию питона средствами "метаязыка C++"

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

>Приведи четкую аргументацию, почему это плохо.

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

>начинает писать чепуху.

ага, вроде C++ это метаязык мультипарадигменный ;) вот это и есть чепуха.

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

И я не к тому что кресты мастдай, для своих задач - да, но пихать кресты или С или Lisp или Java повсюду и везде - вот это бред и идиотизм. Не подходят кресты для сиспрограммирования ну и не надо их туда пихать, не подходит C для прикладнухи ну и не надо его туда пихать - ну и так далее.

А ты стараешся пихнуть кресты повсюду, вот это и бесит.

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

> давайте еще ядра и компиляторы писать на крестах, ага.

Прикинь, и ведь пишут (BeOS, Jikes)! Вот идиоты, да? Не спросили у тебя.

Особенно умиляет насчет компиляторов - ты список рассылки gcc читаешь? Там периодически проносится стон "ну давайте уж на Си++ перейдем". Не переходят по каким-то неясным политическим соображениям самого RMS. Кстати, тот Си, на котором написан GCC - это не совсем Си, а его расширенный диалект + сборка мусора.

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

>А так С более универсален в плане парадигм,

Альфекс, не надо так подставляться. Потому, что теперь я тебе задам очень простой вопрос: ЧЕМ ИМЕННО С универсальнее а плане парадигм?

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

>Си++ может всё, что может Си,

кхе кхе ;)

>а реализуй-ка шаблоны? namespace'ы?

а зачем ?

>Да, кричать "ООП не нужен" сейчас модно.

нет, сейчас модно везде пихать OOP

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

> Ви сами таки напейсали для Степы Джобса новый язычок и назвали его "Objective-C++" (c) ???

Нет, это он сам накодил

> http://homepage.mac.com/svc/cocoa-objc-mac-os-x/index.html

По ссылке - документ 6-летней давности.

> Учите албанский.

Учите русский и Си++. И читайте новости.

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

>Прикинь, и ведь пишут (BeOS

ну и где твой BeOS ? а про мак или NeXTStep ненада, objective-C там.

>тот Си, на котором написан GCC - это не совсем Си, а его расширенный диалект + сборка мусора.

поделись травой пожалуйста. ;) где в C сборка мусора то ? и зачем?

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

>Альфекс, не надо так подставляться. Потому, что теперь я тебе задам очень простой вопрос: ЧЕМ ИМЕННО С универсальнее а плане парадигм?

во первых без мягкого знака, во вторых - я в С могу безболезненно оперировать OOP, да согласен мне прийдется написать макросы итак далее, кстати как сделано это в gtk+, но тем не менее при этом не будет что то вроде "не пишите в крестах как на C" ;)

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

>>Си++ может всё, что может Си,

>кхе кхе ;)

Убедительное возражение.

>>а реализуй-ка шаблоны? namespace'ы?

>а зачем ?

Ну, чтобы доказать, что "С более универсален в плане парадигм"

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

Ви таки можете что нибудь обосновать по существу? Ви уже много пейсали на Objective-C? Или сразу перешли на новый "Objective-C++" (c)? А не могли бы привести пример кода на "Objective-C++" (c) для скромного жабабыдлокодера, который воспринял совет Проф.В.С.Луговского о том, что даже кодеришкам надо саморазвиваться?

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

>кхе кхе ;)

Еще вопрос: ну и чего конкретно не может С++ из того, что может С? Приведи пример, плиз.

>а зачем ?

Шаблоны - затем, чтобы не писать один и тот же алгоритм для разных типов данных.

Пространства имен -- затем, чтобы разрабатывать код с ограниченной областью видимости сущностей.

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

>>Прикинь, и ведь пишут (BeOS

>ну и где твой BeOS ?

То, что у BeOS было качественное ядро - общепризнано. То, что маркетологи ее угробили, не имеет к этому никакого отношения.

> а про мак или NeXTStep ненада, objective-C там.

Я про него и не говаорил. Кстати, _ядро_ NeXTStep было написано на Си, это в MacOS X оно плюсовое (не всё)

>>тот Си, на котором написан GCC - это не совсем Си, а его расширенный диалект + сборка мусора.

>поделись травой пожалуйста. ;) где в C сборка мусора то ? и зачем?

Алфекс, займись самообразованием (начни с того, что научись внимательно читать). Может, и Си++ поймешь.

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

>C++ это метаязык.

Чтобы (надеюсь) поставить точку.

Вот Форт. На нём есть реализации Бейсика. Или Си. Т.е. пишем:
=== cut ===
S" blah-blah-blah - это чистый Форт" .
S" basic.f" INCLUDED
<basic>
LET PI=3.1415926
print "Дальше - можно писать на Бейсике"
</basic>

: TEST
4 0 DO
<basic>
print "Более того, вызовы Бейсика можно вставлять в Форт-слова"
</basic>
LOOP
;
=== cut ===

Всё это - внутри одного файла. Хочешь Форт, хочешь - Бейсик, хочешь - Си. А Форт-ассемблер - это, вообще, дело обычное. Хотя обычно Форт доводят просто до проблемно ориентированного языка, заточенного под конкретную задачу, сохраняя общие правла Форт-стиля.

Как такое же сделать на Си? Если это метаязык, то он легко должен позволять реалиховывать любой язык не в виде интерпретации внешних файлов (это и Бейсик сможет сделать), а прямо "внутри себя".

Вот пример. Скажем, в данной версии Си нету ассемблера. Как средствами Си добавить в этот же Си ассемблерные вставки? Чтобы сделал #include <my_asm.h>, и используй после этого директивы asm { ... }?

Если сделаешь это на Си - тогда Си - метаязык :D

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

> Ви таки можете что нибудь обосновать по существу?

Что именно я должен обосновать?

> Ви уже много пейсали на Objective-C?

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

> Или сразу перешли на новый "Objective-C++" (c)?

См. выше

> для скромного жабабыдлокодера, который воспринял совет Проф.В.С.Луговского о том, что даже кодеришкам надо саморазвиваться?

Знаешь о стадиях профессионального развития?

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

Теперь понятно, почему таки авторы языка "Objective-С++" (с) сделали всем смешно:

http://en.wikipedia.org/wiki/Objective-C

"As nothing is done to unify the semantics behind the various language features, certain restrictions apply:"

Так, что увы, оставаться мне недоразвитым "жабабыдлокодером" (с). Лень изучать всякие некошерные поделия из области тератологии типа "Objective-С++" (с).

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

>это в MacOS X оно плюсовое (не всё)

панеслась, еще курнул ? ;))))))

>Алфекс, займись самообразованием (начни с того, что научись внимательно читать)

я им постоянно занимаюсь, и не зацикливаюсь на узкой ниши крестов.

>Может, и Си++ поймешь.

а оно мне надо ? я прикладнухой не занимаюсь

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

>Шаблоны - затем, чтобы не писать один и тот же алгоритм для разных типов данных.

легко, есть у меня R&B tree и указатель на void и ф-цию compare, дальше все просто.

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

это не ответ, зачем мне это делать? приведи пример пожалуйста.

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

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

Самообразование, Алфекс. Может быть, еще не поздно.

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

>так а чего ее приводить, C++ заточен под OOP, ну и нафига OOP пихать везда, и парадигма у крестов одна единственная, сам же писал - нефиг на крестах писать как на C с указателями и прочим.

Я НИГДЕ и НИКОГДА не писал, что на С++ нефиг писать с указателями и прочим. Не надо перевирать слова. Я писал, что плохо писать в _стиле_ С, не более того. Писать процедурно-ориентированно на С++ можно, а зачастую - нужно.

>И какой метаподход может быть применен в этом единственно возможном контексте, контексте OOP ?

Да вот все дело в том, что контекст НЕ единственно возможный.

Корочек, Альфекс, ну не знаешь ты языка С++, не знаешь....

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

>Не подходят кресты для сиспрограммирования

Сиспрограммирования ЧЕГО? Модуля для ядра? Библиотеки для обработки RT-сигналов? Сервера, работающего на epoll / kqueue? Конкретизируй, плиз.

>А ты стараешся пихнуть кресты повсюду, вот это и бесит.

Чепуха. Это ты сам придумал про меня, да?

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

>во первых без мягкого знака, во вторых - я в С могу безболезненно оперировать OOP, да согласен мне прийдется написать макросы итак далее,

Хорошо, хорошо, Алфекс :) Реализуй мне некостыльный полиморфизм _компиляции_.

Если не получится, вот тебе задачка попроще:

Реализуй на С _такое_ же поведение при _компиляции_ и в _работе_, что и в примере http://reki.ru/test.cpp

>легко, есть у меня R&B tree и указатель на void и ф-цию compare, дальше все просто.

А контроль типов - ну его, да? Нахрен он нужен!

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

>Корочек, Альфекс, ну не знаешь ты языка С++, не знаешь....

а ты не знаешь, что такое метапрограммирование :) Вы квиты ;)

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

> Так, что увы, оставаться мне недоразвитым "жабабыдлокодером" (с)

Ну, твоя жизнь. А как же заветы св. Профессора Луговского?

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

>Что такое метапрограммирование, я как раз знаю. И Вы тоже почитайте.

советую поучить матчасть. От того что один маразматик назвал генерацию SQL-запросов, использование специального компилятора и шаблоны метапрограммированием - плюсы не становятся метаязыком.

генерировать sql-запросы можно и на сях, #define позволяет определять макросы, а уж препроцессор можно наваять какой угодно. И что - Си тоже в метаязыки запишем?

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

>Скажите, а где она _реально_ нужна?

Есть программа A, с классами BobjHandler, CobjHandler, DobjHandler etc. Объекты типа B, C, D обрабатываются соответствующими классами.

В А я определяю тип объекта, достаю имя класса соответствующее типу объекта из XML файла. И парой строк запускаю его конструктор (и потом member functions). И всё - не надо никаких if/else. К тому же, если надо будет написать какой-нибудь EobjHandler, то код класса А трогать не нужно.

Без reflection'a можно обойтись, но тогда я был бы ССЗБ (ещё учитывая то, что иногда надо написать какой-то Handler, а от класса A есть только документация без исходников, или же я не имею права изменять исходник класса А - так что здесь рефлекшн рулит)

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

>>Реализуй на С _такое_ же поведение при _компиляции_ и в _работе_, что и в примере http://reki.ru/test.cpp

>дада, а зачем мне подобное, зачем мне на каждый чих создавать отдельный класс ?

Причем тут "на каждый чих создавать отдельный класс"?

Алфекс, не надо прикидываться кретином -- тебе не идет. Я тебе привел не реальный код, а пример. Ты утверждал, цитирую

"во вторых - я в С могу безболезненно оперировать OOP, да согласен мне прийдется написать макросы итак далее"

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

Еще раз: Ты в состоянии реализовать на С _такое_ же поведение при _компиляции_ и в _работе_, что и в примере http://reki.ru/test.cpp

ДА/НЕТ ?

Если нет - слив засчитан.

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

Такое imho и на C нормально пишется, через dlopen("BobjHandler.so") + dlsym("process_obj")(obj).

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

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

>Такое imho и на C нормально пишется, через dlopen("BobjHandler.so")

Каким образом dlopen тебе позволит создать нужный класс?

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

В dlopen передается стринг "BobjHandler.so", он нормально генерится в runtime => A тоже не нужно переписывать.

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

> К тому же, если надо будет написать какой-нибудь EobjHandler, то код класса А трогать не нужно.

В том его случае Handler-ы пишутся(и компилятся), а не создаются в runtime.

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

>Есть программа A, с классами BobjHandler, CobjHandler, DobjHandler etc. Объекты типа B, C, D обрабатываются соответствующими классами.

В А я определяю тип объекта, достаю имя класса соответствующее типу объекта из XML файла. И парой строк запускаю его конструктор (и потом member functions). И всё - не надо никаких if/else.

Еще раз: Прочитайте про фабрики объектов.

typedef AbstractFactory<MyBaseObject> MyFactory;

MyFactory oFactory; .... ....

objHandler * BobjHandler = oFactory.GetObject("B"); objHandler * CobjHandler = oFactory.GetObject("C"); objHandler * DobjHandler = oFactory.GetObject("D");

В чем проблема-то?

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

> objHandler * BobjHandler = oFactory.GetObject("B"); objHandler * CobjHandler = oFactory.GetObject("C"); objHandler * DobjHandler = oFactory.GetObject("D");

> В чем проблема-то?

В том, что нет СТАНДАРТНОГО способа, с помощью которого реализуется GetObject. Ну вот как бы _ты_ его реализовал?

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

>> Так, что увы, оставаться мне недоразвитым "жабабыдлокодером" (с)

>Ну, твоя жизнь. А как же заветы св. Профессора Луговского?

Согласно учению Профессора (http://www.lugovsky.narod.ru/prog.html) нельзя всю жизнь оставаться "жабабыдлокодером" (с), (вариант, PHP-кодеришкой & etc.), а надо типа развиваться, изучая новые языки программирования. Таки понятно, что средний пользователь ЛОРа круче любого сертифицированного + долго практикующего жабабыдлокодера, однако остается сакральный вопрос гешефта. И Ви таки уже полагаете, что те, кто пишет на заказ (http://en.wikipedia.org/wiki/Code_monkey) и те, кто "cool_па_жизне", придут к общему мнению?

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

> В том, что нет СТАНДАРТНОГО способа, с помощью которого реализуется GetObject. Ну вот как бы _ты_ его реализовал?

Я-бы обернул dlopen/dlsym в виде Factory, а во всех .so-шках(одна сошка - один класс) подключал-бы общий include <produceable.h> и реализовавал функцию produce, возвращающую указатель на объект данного класса.

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

>В том, что нет СТАНДАРТНОГО способа, с помощью которого реализуется GetObject. Ну вот как бы _ты_ его реализовал?

В С++ вообще много чего нет в СТАНДАРТЕ. Например, ничего не сказано о том, как должна выглядеть _реализация_ fprintf. И ничего, никого этого не смущает.

Касаемо меня, то сделал бы через хэш (имя => указатель на менеджер объекта).

А вот пример, как это сделано в loki. http://www.google.com/search?ie=UTF-8&hl=ru&q=%6C%6F%6B%69%20%61%62%7...

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