. (оценки доставлю завтра, на сегодня лимит исчерпан ). Сделал агрегацию ответов. Формулировки непереформулировал собственными словами, но надеюсь, что смысл не потерян. Так же, для сокрашения числа пунктов, пришлось "сливать" похожие ответы, но опять же надеюсь, что смысл при этом сильно не потерялся. В скобках указан язык, в котором данная проблема решена. Порядок следующий — вверх вынес варианты, за которые высказалось больше всего людей, остальные — примерно в хронологическом порядке.
Длительное время компиляции, включение заголовочных файлов (Java)
eao197, merk, WolfHound, StevenIvanov, Sergey, Walter Bright, Alexander G, jazzer, IROV, Константин Л.
Сахара и фич в языке — делегатов, рефлексии, многопоточности и т.д (C#)
Аноним, StevenIvanov, alzt, jazzer, EyeOfHell, StevenIvanov, sergey_shandar, Tonal-
Сложность языка. Сложно найти "свободных" программистов высокого уровня (Eiffel)
eao197, StevenIvanov, alzt, ua1zcl, FR, gear nuke, Кодёнок
Библиотеки — слишком много, слишком разношёрстные (по стилю, качеству, требованиям и т.д.) (Java)
Roman Odaisky, eao197, alzt, ua1zcl, jazzer, Аноним
IDE — не до конца может совладать с языком (Java)
Roman Odaisky, eao197, jazzer, strcpy
Широкое применение метапрограммирования на шаблонах доведённое до абсурда (Java)
eao197, FR, Аноним
Слабые шаблоны (???)
jazzer, minorlogic
Манглинг имён, отсутствие ABI (Java)
StevenIvanov, ua1zcl, Alexander G
Макросы — рудимент (Java)
StevenIvanov, alzt, Walter Bright
Слишком слабые макросы (Nemerle)
jazzer, EyeOfHell
Чрезмерная свобода в выборе стиля программирования (Java)
Аноним, LaptevVV
Совместимость с С (Java)
LaptevVV, ua1zcl
Недостаточная совместимость с С (ObjectiveC)
StevenIvanov
Ничего
den123
Отсутствие безопасного режима (Java)
eao197
Неразбериха с исключениями — кто-то использует, кто-то — нет; кто-то кидает одно, кто-то — другое (Java)
eao197
Невозможность локонично написать некоторые типовые паттерны кода (C#)
eao197
DLL-Hell (Java)
WolfHound
Отсутствие finally (Java)
Alexander G
Недостаточная типизация -> глупые ошибки (Java)
Alexander G
Невозможно быстро и удобно создавать GUI приложения (Delphi)
Alexander G
Сложная модель исполнения (точки следования и т.д) (Java)
Mr.Cat
Неэффективность new\delete для маленьких объектов (Java)
alzt
Ручное управление памятью (Java)
TheBeard
Статическая поддержка исключений (Java)
Pasternak
По существу списка тут комментировать наверное бесполезно, т.к. вопрос достаточно субьективный. Однако же можно выделить варианты, за которые проголосало более, допустим, 2 человек, что бы получить более информативную выборку:
Длительное время компиляции, включение заголовочных файлов
Сахара и фич в языке — делегатов, рефлексии, многопоточности и т.д
Сложность языка. Сложно найти "свободных" программистов высокого уровня
Библиотеки — слишком много, слишком разношёрстные (по стилю, качеству, требованиям и т.д.)
IDE — не до конца может совладать с языком
Широкое применение метапрограммирования на шаблонах доведённое до абсурда
Манглинг имён, отсутствие ABI
Макросы — рудимент
Плохая "кросс-платформенность" (между компиляторами, ОС, аппаратными платформами)
Если посмотреть в контексте С++0х, то второй пункт С++0х более-менее решит. Хотя рефлексии не будет, и аттрибутов тоже похоже не будет. Зато забавно, что некоторые остальные пункты С++0х скорее ухудшит — сложность языка повысится, с разношёрстными библиотеками ситуация определенно не улучшится (представляются первые шаблонные библиотеки на основе концептов). Большинство же пунктов вообще не адресуется С++0х. Ну хотя это в прочем и не удивительно — с заголовочными файлами уже ничего не сделаешь, с ABI видимо уже тоже поздно что-то делать, макросы не уберёшь и т.д. Горбатого могила исправит
Мммм... что-то на такой ноте не хочется заканчивать пост... Но зато это — самый крутой язык
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, remark, Вы писали:
R>>Но зато это — самый крутой язык
E>Имхо, это не правильный акцент. С++ не самый крутой язык (равно как и любой иной язык). Важно другое -- ты умеешь им пользоваться!
Ну не скажи, не крутой язык я бы не стал изучать, васик там какой-нибудь
Здравствуйте, remark, Вы писали:
R>Мммм... что-то на такой ноте не хочется заканчивать пост... Но зато это — самый крутой язык
1. никакой язык самостоятельной ценности не имеет. ценность имеет только то, насколько он способствует производству надежного, и хорошо сопровождаемого и эффективного ПО, с минимальными затратами разнообразных ресурсов, — человеческих, временных, финансовых. поскольку именно для этого язык и предназначен.
любить язык сам по себе — род фетишизма.
Широкое применение метапрограммирования на шаблонах доведённое до абсурда
Не нужно будет иммитировать замыкания через бустовские костыли — средства для имитации замыканий будут встроены в язык. Не нужно будет делать типизацию метапрограммирования через другое метапрограммирование — будут концепты. Не нужно будет для получения факториала или наименьшего общего кратного заставлять компилятор параметризовать десятки шаблонов — будет constexpr.
Сам код шаблонного метапрограммирования тоже не будет таким страшным. Переменноарные шаблоны и rvalue-ссылки помогут избежать копипаста — то, против чего шаблоны вроде как изначально боролись.
Что ещё могли бы пофиксить, так это
Сахара и фич в языке — делегатов, рефлексии, многопоточности и т.д
кстати, нужный лично мне finally я бы записал в этот сахар. Но тут видимо на принцип идут
Здравствуйте, Alexander G, Вы писали: AG>Не нужно будет иммитировать замыкания через бустовские костыли — средства для имитации замыканий будут встроены в язык.
можно подумать, это даст какие-то дополнительные возможности. и так уж, блин, концептуально необходимо.
Не нужно будет делать типизацию метапрограммирования через другое метапрограммирование — будут концепты. Не нужно будет для получения факториала или наименьшего общего кратного заставлять компилятор параметризовать десятки шаблонов — будет constexpr.
насчет концептов пока ничего не скажу, но тезис о компиляторе, трудящемся над "десятком шаблонов" для получения факториала! его на асме можно получить за пять команд. не пугайте уже народ.
AG>Сам код шаблонного метапрограммирования тоже не будет таким страшным. Переменноарные шаблоны и rvalue-ссылки помогут избежать копипаста — то, против чего шаблоны вроде как изначально боролись.
наконец найден метод от копипейста. вставить в компилятор еще сто кило кода. тогда как в редакторе кнопки копи и пейст останутся неторонутыми, а ведь копипейст идет именно оттуда.
AG>Что ещё могли бы пофиксить, так это
AG>Сахара и фич в языке — делегатов, рефлексии, многопоточности и т.д
кстати, нужный лично мне finally я бы записал в этот сахар. Но тут видимо на принцип идут
многопоточность они вообше не сформулируют в приемлемом виде. будут либо плохозакрытые дырки, либо ограничения, что станут устранять еще через три ревизии стандарта. как с rvalue.
Здравствуйте, Alexander G, Вы писали:
AG>Кое-что С++0х таки адресует AG>
AG>Широкое применение метапрограммирования на шаблонах доведённое до абсурда
AG>Не нужно будет иммитировать замыкания через бустовские костыли — средства для имитации замыканий будут встроены в язык. Не нужно будет делать типизацию метапрограммирования через другое метапрограммирование — будут концепты. Не нужно будет для получения факториала или наименьшего общего кратного заставлять компилятор параметризовать десятки шаблонов — будет constexpr.
AG>Сам код шаблонного метапрограммирования тоже не будет таким страшным. Переменноарные шаблоны и rvalue-ссылки помогут избежать копипаста — то, против чего шаблоны вроде как изначально боролись.
Согласен. Об этом я не подумал.
Наверное в контексте данной теме это можно сформулировать следующим образом — больше вещей можно будет реализовать с помощью шаблонов не доходя до абсурда. Например, форвардинг параметров.
Здравствуйте, merk, Вы писали:
M>наконец найден метод от копипейста. вставить в компилятор еще сто кило кода. тогда как в редакторе кнопки копи и пейст останутся неторонутыми, а ведь копипейст идет именно оттуда.
Ты путаешь о чём идёт речь. Речь не идёт о получении 100% тождественного кода. Речь идёт о получении *почти* тождественного кода, или о генерации т.н. boilerplate кода, который может быть совершенно не идентичен в текстовом представлении.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
M>>наконец найден метод от копипейста. вставить в компилятор еще сто кило кода. тогда как в редакторе кнопки копи и пейст останутся неторонутыми, а ведь копипейст идет именно оттуда.
R>Ты путаешь о чём идёт речь. Речь не идёт о получении 100% тождественного кода. Речь идёт о получении *почти* тождественного кода, или о генерации т.н. boilerplate кода, который может быть совершенно не идентичен в текстовом представлении.
R>
ремарк, вы слишком увлеченно программируете на сипп, отчего говорите загадками, вместо ясного и чистого изложения.
если серьезно, не являются темплейты таким уж строго необходимым средством для разработки систем. да, они описывают родственные концепции не OOP языком, оттого их слабость очевидна. и могут генерить только близкородственные коды отличающиеся в небольших деталях.
Здравствуйте, merk, Вы писали:
M>многопоточность они вообше не сформулируют в приемлемом виде. будут либо плохозакрытые дырки, либо ограничения, что станут устранять еще через три ревизии стандарта. как с rvalue.
Конечно, не сформулируют. Зачем им будет её формулировать, да ещё в неприемлемом виде; если они уже её сформулировали, да ещё в виде лучше, чем сейчас есть в любом другом языке?
merk, как всегда, жжот
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
M>>многопоточность они вообше не сформулируют в приемлемом виде. будут либо плохозакрытые дырки, либо ограничения, что станут устранять еще через три ревизии стандарта. как с rvalue.
R>Конечно, не сформулируют. Зачем им будет её формулировать, да ещё в неприемлемом виде; если они уже её сформулировали, да ещё в виде лучше, чем сейчас есть в любом другом языке? R>merk, как всегда, жжот
а причем тут языки? многопоточность формулируется обычно на уровне системной библиотеки(что как раз верно), поскольку является
1. гибким решением, поскольку к самой проблеме можно подойти по разному.
2. не ограничено компилятором и синтаксисом конкретного языка
3. многопоточность должна быть частью содержать eventdriven концепта и обязательно иметь таймауты в операциях.
4. многопоточность завязана на ее реализацию в ос. или они будут ее делать платформенно-независимой? а если ось как платформа не соотвуствует взглядам с++ на многопоточность...а? криво-отображать, авось как-нить зашевелится?
Здравствуйте, merk, Вы писали:
M>насчет концептов пока ничего не скажу, но тезис о компиляторе, трудящемся над "десятком шаблонов" для получения факториала! его на асме можно получить за пять команд.
"На асме" тоже можно за 0 команд факториал получить если не путать runtime и copmiletime...
M>не пугайте уже народ.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, remark, Вы писали:
R>с заголовочными файлами уже ничего не сделаешь, с ABI видимо уже тоже поздно что-то делать, макросы не уберёшь и т.д. Горбатого могила исправит
- Мы сами знаем, что она не имеет решения, — сказал Хунта,
немедленно ощетиниваясь.— Мы хотим знать, как ее решать.
. (оценки доставлю завтра, на сегодня лимит исчерпан ). Сделал агрегацию ответов. Формулировки непереформулировал собственными словами, но надеюсь, что смысл не потерян. Так же, для сокрашения числа пунктов, пришлось "сливать" похожие ответы, но опять же надеюсь, что смысл при этом сильно не потерялся. В скобках указан язык, в котором данная проблема решена. Порядок следующий — вверх вынес варианты, за которые высказалось больше всего людей, остальные — примерно в хронологическом порядке.
R>[q] R>Длительное время компиляции, включение заголовочных файлов (Java) R>eao197, merk, WolfHound, StevenIvanov, Sergey, Walter Bright, Alexander G, jazzer, IROV, Константин Л.
R>Сахара и фич в языке — делегатов, рефлексии, многопоточности и т.д (C#) R>Аноним, StevenIvanov, alzt, jazzer, EyeOfHell, StevenIvanov, sergey_shandar, Tonal-
Эээ... я говорил о CTTI которого нет в C# и говорил что не нужен RTTI, который есть в C# . Как раз CTTI никакого отоношения к языкам типа Java, C# не имеет. Я бы выделил это отдельной веткой, так как это не сахар (без которого можно обходиться), а скорее реальный недостаток языка (без которого очень трудно).
Здравствуйте, merk, Вы писали:
M>ремарк, вы слишком увлеченно программируете на сипп, отчего говорите загадками, вместо ясного и чистого изложения. M>если серьезно, не являются темплейты таким уж строго необходимым средством для разработки систем. да, они описывают родственные концепции не OOP языком, оттого их слабость очевидна.
Без шаблонов полиморфизм заканчивается на первом аргументе. (По крайней мере пока в C++ не добавили multiple dispatch.) И дело не в каких-то фунциях вычисляющих пересечение или что там еще в качестве примера обычно приводят. Просто сравнение на равенство, ведь и смех, и грех, какие приплясывания нужны, чтобы корректно определить его в OOP.
R>Длительное время компиляции, включение заголовочных файлов R>Сахара и фич в языке — делегатов, рефлексии, многопоточности и т.д R>Сложность языка. Сложно найти "свободных" программистов высокого уровня R>Библиотеки — слишком много, слишком разношёрстные (по стилю, качеству, требованиям и т.д.) R>IDE — не до конца может совладать с языком R>Широкое применение метапрограммирования на шаблонах доведённое до абсурда R>Манглинг имён, отсутствие ABI R>Макросы — рудимент R>Плохая "кросс-платформенность" (между компиляторами, ОС, аппаратными платформами) R>
Согласен со всеми пунктами! Тут даже добавить нечего
А как думаете, возможно создание нового языка программирования, который бы был совместим с С++ на уровне проектов? Т.е. например в Visual Studio встраивается некий аддин, и в С++ проектах появляется возможность добавлять файлы на новом ЯП. Программисты скачивают аддин, пробуют добавить в свои проекты файлы на новом языке (которые компилятся новым компилятором в совместимый с С++ объектный файл), радуются новым возможностям и постепенно переводят все свои проекты полностью на новый язык. ИМХО, этот подход, в отличие от подхода D, вполне реальный.
Здравствуйте, remark, Вы писали:
R>>>Но зато это — самый крутой язык
E>>Имхо, это не правильный акцент. С++ не самый крутой язык (равно как и любой иной язык). Важно другое -- ты умеешь им пользоваться!
R>Ну не скажи, не крутой язык я бы не стал изучать, васик там какой-нибудь
Э-э-э... Я о другом хотел сказать. Любой инструмент должен "лежать в руке" как родной. И пользоваться инструментом нужно не задумываясь о мелких деталях (это как в единоборствах, когда человека заставляют оттачивать технику движений до такого уровня, чтобы в нужный момент человек не задумывался как он будет что-то делать -- в этот момент движениями управляют приобретенные рефлексы и инстинкты).
Именно поэтому "знание языка" и "владение языком" -- совершенно разные вещи. Можно изучить язык за какое-то ограниченное время, но овладевать им придется гораздо дольше. До тех пор, пока не научишься думать на этом языке. По отношению к С++ у тебя этот момент давно наступил
Владение языком должно приводить, по идее, к двум результатам:
1. Предсказуемые результаты при программировании с его использованием. Т.е. если для проекта был выбран C++, то созданные на C++ приложения не будут просто так падать или жрать память. Причем достигаться это должно без больших усилий со стороны разработчиков (что определяется хорошим знанием разбросанных по языку граблей и мастерскому умению (на уровне инстинктов) их обходить).
2. Нет детских обид по отношению к языку: мол я его так любил и холил, и лелеял, а он такой гад -- и компилируется долго, и IDE его не понимают, и памятью нужно управлять и вообще редиски те кто его придумал, и место им всем в биореакторе...
К сожалению, оба эти результата наблюдаются достаточно редко.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Эмм... а можно полюбопытствовать, зачем весь этот опрос? Никак надумал свой язык написать? Когда можно будет ждать тему с названием "[ANN] C-- alpha"? Бороду уже отрастил?
Здравствуйте, Critical Error, Вы писали:
CE>Эмм... а можно полюбопытствовать, зачем весь этот опрос? Никак надумал свой язык написать? Когда можно будет ждать тему с названием "[ANN] C-- alpha"? Бороду уже отрастил?
Здравствуйте, x-code, Вы писали:
XC>А как думаете, возможно создание нового языка программирования, который бы был совместим с С++ на уровне проектов? Т.е. например в Visual Studio встраивается некий аддин, и в С++ проектах появляется возможность добавлять файлы на новом ЯП. Программисты скачивают аддин, пробуют добавить в свои проекты файлы на новом языке (которые компилятся новым компилятором в совместимый с С++ объектный файл), радуются новым возможностям и постепенно переводят все свои проекты полностью на новый язык. ИМХО, этот подход, в отличие от подхода D, вполне реальный.
Это вроде уже есть. Скомпилировать С++ проект как С++/CLI, далее можно добавлять файлы на С++/CLI, C#, VB.NET и COBOL.NET.
Здравствуйте, remark, Вы писали:
R>Это вроде уже есть. Скомпилировать С++ проект как С++/CLI, далее можно добавлять файлы на С++/CLI, C#, VB.NET и COBOL.NET. R>
Отлично Я давно хочу начать проект создания собственного языка программирования, но нет ни времени, ни — самое главное — необходимых знаний. Но если в студии это есть, то потенциально можно сделать и гибридный проект без дотнета.
Кстати, интересно — а Nemerle файлы можно добавлять в такой С++/CLI проект?
Здравствуйте, Critical Error, Вы писали:
CE>Эмм... а можно полюбопытствовать, зачем весь этот опрос? Никак надумал свой язык написать? Когда можно будет ждать тему с названием "[ANN] C-- alpha"? Бороду уже отрастил?
Да я уж и забыл...
Аааа, вспомнил. Конекст примерно такой. Сейчас мейнстрим мнение постепенно переходит к следующему — С++ — морально устаревший язык, появились более современные языки, на которых разработка ведется значительно более эффективно. Не очень понятно, насколько это мнение объективно, и что значит "значительно более эффективно" в "количественном" исчислении. Понятно, что такое мнение "слепо пропихивается" во-первых разработчиками этих более современных языков, во-вторых "необъективными" приверженцами этих более современных языков.
Хотелось поглядеть на этот вопрос с более объективной стороны. Т.е. вот есть профессинальный С++ программист, вот есть более современный язык, за счёт чего конкретно повысится эффективность этого программиста при переходе на этот язык?
Примерно так. Свой язык программирования создавать не собираюсь. У меня пока остаются идеи, как более полезно тратить своё время
Кстати, занятно. Поглядел ещё раз на список.
К некоторым недостаткам, которые более всего популярны, действительно обоснованно аппелируют "приверженцами более современных языков" — например, недостаток фич и сахара, макросы. Зато большинство недостатков-лидеров они не видят, но при этом постоянно аппелируют к недостаткам, которые упоминались всего они раз — ручное управление памятью, "Недостаточная типизация -> глупые ошибки" и т.д.
Ну всё это, конечно, моё имхо и сугубо субьективно...
Здравствуйте, Critical Error, Вы писали:
CE>Здравствуйте, StevenIvanov, Вы писали:
SI>>Вообще-то уже есть такой зверюго
CE>Он еще есть? оО Я думал он уже давно помер...
Здравствуйте, eao197, Вы писали:
E>Владение языком должно приводить, по идее, к двум результатам:
E>1. Предсказуемые результаты при программировании с его использованием. Т.е. если для проекта был выбран C++, то созданные на C++ приложения не будут просто так падать или жрать память. Причем достигаться это должно без больших усилий со стороны разработчиков (что определяется хорошим знанием разбросанных по языку граблей и мастерскому умению (на уровне инстинктов) их обходить).
E>2. Нет детских обид по отношению к языку: мол я его так любил и холил, и лелеял, а он такой гад -- и компилируется долго, и IDE его не понимают, и памятью нужно управлять и вообще редиски те кто его придумал, и место им всем в биореакторе...
E>К сожалению, оба эти результата наблюдаются достаточно редко.
С этим нельзя не согласиться. Поэтому я полностью согласен
Но при этом, разьве всё это не предъявляет каких-то требований и к самому языку? Значительно более абстрактных требований, нежели просто наличие определенных видов синтаксического сахара, или требования ко времени компиляции.
Для меня лично, самое большое достоинство С++ в том, что он меня *ни в чём* не ограничивает. Абсолютно. Точка.
Т.е. я знаю, что что-бы я ни захотел на нём сделать, я смогу сделать. Причём это относится как к каким-то "ран-тайм" свойствам, так и к самой структуре программы, к уровню абстракции программы, к самим тем абстракциям, которые я применяю при написании программы. Как следствие можно эмулировать возможности практически всех языков, начиная от ассемблера, заканчивая лиспом.
Я думаю, что это была одна из основных идей при разработке С++ — вот вам сильная типизация, а вот вам каст, что бы её отменять; вот вам чёткая объектная модель, а вот вам возможность ручного вызова конструктора и деструктора. Если посмотреть в свете Закона Дырявых Абстракций, то в большинстве современных языков абстракции просто просвечиваются через дыры — "ой, сокеты плохо работают с асинхронным вводом-выводом по нагрузкой", "ой, GC не справляется с таким паттерном поведения программы", "ой, не получается плотно упаковать объекты". В С++ дыр значительно больше, но зато рядом с каждой расположена удобная лесница, по которой при необходимости можно спуститься на нижний уровень. При этом достаточно средств, что бы и подниматься вверх неограниченно высоко.
Здравствуйте, merk, Вы писали:
M>>>наконец найден метод от копипейста. вставить в компилятор еще сто кило кода. тогда как в редакторе кнопки копи и пейст останутся неторонутыми, а ведь копипейст идет именно оттуда.
R>>Ты путаешь о чём идёт речь. Речь не идёт о получении 100% тождественного кода. Речь идёт о получении *почти* тождественного кода, или о генерации т.н. boilerplate кода, который может быть совершенно не идентичен в текстовом представлении.
R>> M>ремарк, вы слишком увлеченно программируете на сипп, отчего говорите загадками, вместо ясного и чистого изложения. M>если серьезно, не являются темплейты таким уж строго необходимым средством для разработки систем.
Этого никто и не утверждает.
M>да, они описывают родственные концепции не OOP языком, оттого их слабость очевидна. и могут генерить только близкородственные коды отличающиеся в небольших деталях.
Шаблоны абсолютно перпендикурярны ООП. Например, их можно применять и в функциональном и в императивном программировании.
Шаблоны способны генерировать абсолютно любой код, различающийся в любых деталях: C++ Templates are Turing Complete
запоздало выскажу мучавшую меня мысль...
мне, кстати, давно уже кажется, что эскалация фич языка принесет не так уж много плодов. И говоря в терминах "мифического человеко-месяца" уж точно не появится никакой "серебряной пули". Да и "медная пуля" уже существующей в языке концепции ООП так же не прибавит в своей эффективности.
Я думаю, что существенным прорывом будет введение качественно новой возможности внесения метаинформации в программу об абстрагируемых сущностях, например об элементах пользовательского интерфейса. Чтобы была возможность истинного описания архитектуры программы в языке. Причем язык генерировал сам низкоуровневые конструкции (метапрограммирование).
Вот к примеру, захотелось мне в программе ввести окошко с кнопкой и тесктовым полем и пишу примерно так:
require( w )
{
// здесь описательная часть
w is Window; // w это Окно
w have ((b is Button) && (t is TextBox)); // у w будут кнопка b и текстовое поле t
// если нажали на b - делаем что то
if( isClicked(b) )
{
setText( t, "b is clicked" );
}
}
и по такой схеме компилер должен сгенерить весь код описания прототипа ui. В блоке require должны будут фигурировать описательные конструкции-отношения is и have, событийная модель будет генерироваться с помощью блоков if.
Layout для такого интерфейса компилятор может сгенерировать на свое усмотрение, оставив возможность редактировать его без внесения изменений в исходный код.
Не обязательно это должно выглядеть именно так, просто общий подход мне видится пока примерно таким.
В конце концов существующие библиотеки инкапсулируют большой объем знаний о том "как делать" что-то. К сожалению "спосою" использования этих знаний предлагается только один, не всегда удобный. И при его использовании мы не оперируем в полной мере понятиями предметной области. Львиную долю времени составляют продирания через тернии языковых наворотов к звездам. Для примера можно подумать о том, что вышеприведенный псевдокод можно реализовать на чем угодно — wtl, mfc, qt, wxWidgets, winapi... "Смысл" этой реализации останется тем же. В то же время научится использованию winapi, к примеру, будет не столь тривиально как понять смысл конструкций псевдокода.
Прогу прощения за корявость и спутанность изложения.
Может это очередной боян и в неком виде это уже есть?
Здравствуйте, merk, Вы писали:
R>>Мммм... что-то на такой ноте не хочется заканчивать пост... Но зато это — самый крутой язык
M>1. никакой язык самостоятельной ценности не имеет. ценность имеет только то, насколько он способствует производству надежного, и хорошо сопровождаемого и эффективного ПО, с минимальными затратами разнообразных ресурсов, — человеческих, временных, финансовых. поскольку именно для этого язык и предназначен. M>любить язык сам по себе — род фетишизма.
Значит я — фетишист С++
Надо будет подумать об открытии Клуба С++ фетишистов
Здравствуйте, sergey_shandar, Вы писали:
R>>Сахара и фич в языке — делегатов, рефлексии, многопоточности и т.д (C#) R>>Аноним, StevenIvanov, alzt, jazzer, EyeOfHell, StevenIvanov, sergey_shandar, Tonal-
_>Эээ... я говорил о CTTI которого нет в C# и говорил что не нужен RTTI, который есть в C# . Как раз CTTI никакого отоношения к языкам типа Java, C# не имеет. Я бы выделил это отдельной веткой, так как это не сахар (без которого можно обходиться), а скорее реальный недостаток языка (без которого очень трудно).
CTTI — чем не фича языка?
Если его нет ни в каком другом промышленном языке, то его вообще придётся исключить...
Здравствуйте, remark, Вы писали:
R>Для меня лично, самое большое достоинство С++ в том, что он меня *ни в чём* не ограничивает. Абсолютно. Точка.
Кроме как в том, что он сделать не в состоянии
R>Т.е. я знаю, что что-бы я ни захотел на нём сделать, я смогу сделать.
Мне это тоже нравится в С++, единственный вопрос — какой ценой все это дается.
Геморроя никому не хочется, а в С++ его частенько не избежать.
И поэтому я горячо приветствую появление фич типа переменных шаблонов, именно потому что они дают возможность выразить свою мысль в несколкьо раз меньшим и в несколько раз более понятным кодом.
и, имхо, если прикрутить к С++ систему макросов уровня Немерле, оставив все остальное как есть — это бы подняло язык на качественно новый уровень.
Здравствуйте, merk, Вы писали:
M>Здравствуйте, remark, Вы писали:
R>>Здравствуйте, merk, Вы писали:
M>>>многопоточность они вообше не сформулируют в приемлемом виде. будут либо плохозакрытые дырки, либо ограничения, что станут устранять еще через три ревизии стандарта. как с rvalue.
R>>Конечно, не сформулируют. Зачем им будет её формулировать, да ещё в неприемлемом виде; если они уже её сформулировали, да ещё в виде лучше, чем сейчас есть в любом другом языке? R>>merk, как всегда, жжот
M>а причем тут языки? многопоточность формулируется обычно на уровне системной библиотеки(что как раз верно), поскольку является
Многопоточность и библиотеки высокоуровневых примитивов синхронизации — разные вещи.
Если ты имеешь в виду всякие там условные переменные, семафоры и ридер-вритер мьютексы, то так и скажи.
M>2. не ограничено компилятором и синтаксисом конкретного языка
Зто без компилятора не может быть решено *в принципе*. Без базовых гарантий относительно многопоточности и набора примитивных операций ты никакой библиотеки не сделаешь.
M>3. многопоточность должна быть частью содержать eventdriven концепта и обязательно иметь таймауты в операциях.
На базе того, как сейчас сформулирована "многопоточность" в текущем драфте ISO С++, ты можешь реализовывать любые высокоуровневые примитивы. Хоть с таймаутами, хоть евент-дривен.
M>4. многопоточность завязана на ее реализацию в ос. или они будут ее делать платформенно-независимой? а если ось как платформа не соотвуствует взглядам с++ на многопоточность...а? криво-отображать, авось как-нить зашевелится?
От ОС тут нужна всего 1 вещь — park/unpark (заблокировать/разблокировать поток исполнения). Это реализуют в одинаковом виде все ОС, на которые рассчитан С++ — семафоры есть и в POSIX, и в WinAPI. Гораздо больше зависит от аппаратной платформы.
Здравствуйте, remark, Вы писали:
R>В С++ дыр значительно больше, но зато рядом с каждой расположена удобная лесница, по которой при необходимости можно спуститься на нижний уровень. При этом достаточно средств, что бы и подниматься вверх неограниченно высоко.
проистекает из того факта, что на C++ делали и, наверное, делают гораздо больше, чем следовало бы. Уж не знаю, с чем это связано (со слабостью компьютеров, дешевизной C++компиляторов по сравнению с компиляторами других языков, проникновением C++ в ВУЗы, существованием вокруг C++ ореола "крутого языка"), но тем не менее. Сейчас развитие как аппаратных средств, так и языков программирования (включая себя виртуальные машины, алгоритмы сборки мусора, JIT компиляцию и пр.) предоставляет разработчикам возможности более быстрого получения приемлимых результатов. В условиях современного бизнеса, когда срок сдачи "вчера", а четкие требования появятся только "завтра", и когда заказчика удовлетворяет быстро введенная в эксплуатацию, но глючная версия, это очень и очень большое конкурентное преимущество.
При этом для многих проектов на первых этапах их существования вообще нет вопросов узких мест и, соответственно, необходимости опускаться на самые низкие уровни при программировании. В качестве примера подобных маразматических, в общем-то, вещей можно вязать web-приложения на Ruby-On-Rails, развернутые на тысячах(!) серверов. Т.е. разница в скорости разработки каких-то вещей конкретными людьми на C++ и Ruby такова, что позволяет спокойно покупать и обслуживать в десять раз больше серверов, чем в случае C++ реализации. Может быть сегодняшная Web-ориентация (а мне кажется, что web-ориентированные продукты сейчас являются менйстримом) со временем сменится на что-то другое, но пока это так. Средней руки server-side на Java с кластеризацией и отказоустойчивостью, поддержкой разных типов БД и различных Web-стандартов сейчас собирается из имеющихся компонентов гораздо проще, чем на C++.
Поэтому количество ниш, в которых C++ был бы действительно стоящим выбором (как раз потому, что позволяет работать как на низком, так и на высоком уровне) сокращается и, надо полагать, будет сокращаться. И это нормально, хотя и неприятно для тех, кто привык работать на C++.
С этой точки зрения как раз более интересно, что C++ может противопоставить не мейнстримовым языкам вроде Java/C# (успешное шествие которых во многом определяется огромными денежными вливаниями), а менее раскрученным языкам, которые так же претендуют на оставшиеся для C++ ниши. В первую очередь это Eiffel и Ada2005. Может быть еще и Erlang в области server-side.
Пока C++ был мейнстримом, он явно был предпочтительнее Eiffel-я с Ada. Теперь ситуация меняется. С одной стороны C++ менее востребован, с другой стороны Eiffel и Ada становяться доступнее простым людям (за счет бесплатных GPL версий).
К сожалению, у меня очень поверхносные знания Ada. Но по сравнению с C++ у Eiffel/Ada гораздо больший упор сделан на безопасность программирования. Т.е. в языке больше препятствий к отстреливанию собственных ног. И это очень важно. Ведь, например, если и C++, и Ada могут использоваться для разработки какого-нибудь телекоммуникационного продукта, для которого надежность не пустой звук, то более безопасный язык предпочтительнее. Хотя Ada сама по себе вовсе не защищает от катастроф на $500M.
Познакомившись с Eiffel-ем я пришел к выводу, что располагая своим нынешним опытом работы на C++ мне было бы писать на Eiffel менее удобно и комфортно, чем на C++ (хотя сейчас EiffelStudio 6.2 продвинуло язык в лучшую сторону еще больше). Но вот если бы с Eiffel-ем я познакомился одновременно с C++... Или если бы мне сейчас предстояло набрать команду студентов, научить их программировать и приступить к реализации своих нынешних проектов то не могу с уверенностью сказать, что я бы однозначно выбрал C++. Скорее всего, что я попробовал бы использовать при обучении Eiffel и по результатам учебных проектов уже судил бы о том, имеет смысл использовать Eiffel дальше.
В связи с этим хочется попробовать изучить Ada2005, но когда для этого представиться возможность -- большой вопрос.
Так вот возвращаясь к твоему вопросу о том, какие требования предъявляются к самому языку, я за себя могу сказать так: опускаясь на низкий уровень и становясь нишевым языком C++у не хватает ориентации на безопасность, которая присуща Eiffel-ю и Ada.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, remark, Вы писали:
R>>Для меня лично, самое большое достоинство С++ в том, что он меня *ни в чём* не ограничивает. Абсолютно. Точка.
J>Кроме как в том, что он сделать не в состоянии
Например?
R>>Т.е. я знаю, что что-бы я ни захотел на нём сделать, я смогу сделать.
J>Мне это тоже нравится в С++, единственный вопрос — какой ценой все это дается. J>Геморроя никому не хочется, а в С++ его частенько не избежать.
J>И поэтому я горячо приветствую появление фич типа переменных шаблонов, именно потому что они дают возможность выразить свою мысль в несколкьо раз меньшим и в несколько раз более понятным кодом.
Если что-то сделать *и* можно, *и* легко, то это бесспорно ещё лучше.
J>и, имхо, если прикрутить к С++ систему макросов уровня Немерле, оставив все остальное как есть — это бы подняло язык на качественно новый уровень.
Да, было бы неплохо. Или хотя бы мощную рефлексию. Причём в отличие от C#, где рефлексия только в ран-тайм, в С++ рефлексию можно сделать в ран-тайм, в компайл-тайм, и даже в препроцессинг-тайм (тогда можно будет, например, генерировать "прозначные" прокси-классы): https://sourceforge.net/forum/message.php?msg_id=4180732
Здравствуйте, StevenIvanov, Вы писали:
SI>Я думаю, что существенным прорывом будет введение качественно новой возможности внесения метаинформации в программу об абстрагируемых сущностях, например об элементах пользовательского интерфейса. Чтобы была возможность истинного описания архитектуры программы в языке. Причем язык генерировал сам низкоуровневые конструкции (метапрограммирование). SI>Вот к примеру, захотелось мне в программе ввести окошко с кнопкой и тесктовым полем и пишу примерно так:
В контексте С++ я вижу 2 основные проблемы:
— как это всё интегрировать в текущий С++?
— как быть с "дырявыми абстракциями"? Т.е. интерфейс WinAPI всё-таки не совсем просто так значительно сложнее, он всё-таки позволяет делать очень много вещей при необходимости. А тут можно упереться в то, что простенькую форму с кнопочкой то сделать легко, а вот если надо что-то типа анимации с переменной задержкой между кадрами....
А если не в контексте С++, то я думаю, таких языков достаточно — не зря каждый год появляется пара сотен новых языков.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, StevenIvanov, Вы писали:
SI>>Я думаю, что существенным прорывом будет введение качественно новой возможности внесения метаинформации в программу об абстрагируемых сущностях, например об элементах пользовательского интерфейса. Чтобы была возможность истинного описания архитектуры программы в языке. Причем язык генерировал сам низкоуровневые конструкции (метапрограммирование). SI>>Вот к примеру, захотелось мне в программе ввести окошко с кнопкой и тесктовым полем и пишу примерно так:
R>В контексте С++ я вижу 2 основные проблемы: R> — как это всё интегрировать в текущий С++?
сложно сказать. Как вариант возможно использование инструмента наподобие moc (metaobject compiler) из Qt
R> — как быть с "дырявыми абстракциями"? Т.е. интерфейс WinAPI всё-таки не совсем просто так значительно сложнее, он всё-таки позволяет делать очень много вещей при необходимости. А тут можно упереться в то, что простенькую форму с кнопочкой то сделать легко, а вот если надо что-то типа анимации с переменной задержкой между кадрами....
По моему опыту 99% в реализации обычной офисной программы оперируют стандартными вещами: меню, пункт меню, окно, диалог, кнопка, поле ввода и т.п.
"Знания" о реализации нестандартных вещей так же можно представить в виде неких концепций, отражающих поведение объектов в определенных контекстах.
R>А если не в контексте С++, то я думаю, таких языков достаточно — не зря каждый год появляется пара сотен новых языков.
В этом случае не думаю что эта затея сколь-нибудь серъезна. Подобная вещь имеет смысл в mainstream языках, на которых уже сидит куча народу. Иначе это так и останется уделом горстки интеллектуалов-теоретиков и автора, вне зависимости от революционности предложненных фич
R>
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
M>>Здравствуйте, remark, Вы писали:
R>>>Здравствуйте, merk, Вы писали:
M>>>>многопоточность они вообше не сформулируют в приемлемом виде. будут либо плохозакрытые дырки, либо ограничения, что станут устранять еще через три ревизии стандарта. как с rvalue.
R>>>Конечно, не сформулируют. Зачем им будет её формулировать, да ещё в неприемлемом виде; если они уже её сформулировали, да ещё в виде лучше, чем сейчас есть в любом другом языке? R>>>merk, как всегда, жжот
M>>а причем тут языки? многопоточность формулируется обычно на уровне системной библиотеки(что как раз верно), поскольку является
R>Для общего развития рекумендую прочитать Threads Cannot be Implemented as a Library
заголовок громкий. толку боюсь никакого. небось какая-то мелкая языковая фишка предлагается для поддержки библиотечно реализованных тредов. пока нет времени читать.
откуда вы тока натаскиваете такие бумашки?
M>>1. гибким решением, поскольку к самой проблеме можно подойти по разному.
R>Многопоточность и библиотеки высокоуровневых примитивов синхронизации — разные вещи. R>Если ты имеешь в виду всякие там условные переменные, семафоры и ридер-вритер мьютексы, то так и скажи.
как ж они разные? все вместе это и есть поддержка многопоточности. что вы будете делать с тредом, даже если он будет создаваться одним оператором языка, если у вас нет механизмов их взаимодействия????
спасибо за поддержку в языке, типо!
M>>2. не ограничено компилятором и синтаксисом конкретного языка
R>Зто без компилятора не может быть решено *в принципе*. Без базовых гарантий относительно многопоточности и набора примитивных операций ты никакой библиотеки не сделаешь.
M>>3. многопоточность должна быть частью содержать eventdriven концепта и обязательно иметь таймауты в операциях.
R>На базе того, как сейчас сформулирована "многопоточность" в текущем драфте ISO С++, ты можешь реализовывать любые высокоуровневые примитивы. Хоть с таймаутами, хоть евент-дривен.
R>От ОС тут нужна всего 1 вещь — park/unpark (заблокировать/разблокировать поток исполнения). Это реализуют в одинаковом виде все ОС, на которые рассчитан С++ — семафоры есть и в POSIX, и в WinAPI. Гораздо больше зависит от аппаратной платформы.
напишите прототипы этий функций, поглядим, что вы имеете ввиду. с комментом, что они делают с тредом технически.
добавление. после того как напишите, еще постарйтесь вспомнить про стратегию диспетчеризации тредов. от коотрой сильно зависит характер поведения программы, про понятие приоритетов также. также вспомнить про процессы, про их взаимодействие. про способы управления тредами, типа, resume, dispatch, sleep, проч. как запускать и останавливать и треды и процессы..и так далее... и все это должно быть формализовано в некоем виде.
и очень сомнительно, что с++ хоть на шаг отступит от posix.
у них есть только один выход, нарисовать нечто, прямо проецируемое на posix.
и гадать тут нечего.
Здравствуйте, merk, Вы писали:
R>>Для общего развития рекумендую прочитать Threads Cannot be Implemented as a Library M>заголовок громкий. толку боюсь никакого. небось какая-то мелкая языковая фишка предлагается для поддержки библиотечно реализованных тредов. пока нет времени читать. M>откуда вы тока натаскиваете такие бумашки?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, merk, Вы писали:
R>>>Для общего развития рекумендую прочитать Threads Cannot be Implemented as a Library M>>заголовок громкий. толку боюсь никакого. небось какая-то мелкая языковая фишка предлагается для поддержки библиотечно реализованных тредов. пока нет времени читать. M>>откуда вы тока натаскиваете такие бумашки?
J>потрясающая самоуверенность J>Я тоже так хочу!
проблема в том, что в дискуссии обычно не отсылают к бумажкам, а говорят своими словами.
это как минимум экономит время вашего собеседника.
бумашки обычно многословны там, где ее суть выразима в паре предложений.
просмотрев бумашку по диагонали, я понял что там имеются ввиду некие атомарные операции и неистовая борьба с переупорядочиванием инструкций как компилятором так и процессором. цитируются атомарые операции. видимо эту неистовую борьбу и называют поддержкой компилятором многопоточности??? ну возможно.
но на атомарных операциях вопрос синхронизации не решается. они хороши только на участках гарантированно короткого кода, без возможности встать в ожидание. очень частный случай.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, jazzer, Вы писали:
J>>Я тоже так хочу!
E>Максим, так ведь молодость не вернешь Так что не суждено нам уже
Никогда не поздно сказать Hans-J. Boehm'у, что он — ламер и ничего не понимает в многопоточности! Евгений, не теряй надежду, главное начать!
Здравствуйте, merk, Вы писали:
M>>>>>многопоточность они вообше не сформулируют в приемлемом виде. будут либо плохозакрытые дырки, либо ограничения, что станут устранять еще через три ревизии стандарта. как с rvalue.
R>>>>Конечно, не сформулируют. Зачем им будет её формулировать, да ещё в неприемлемом виде; если они уже её сформулировали, да ещё в виде лучше, чем сейчас есть в любом другом языке? R>>>>merk, как всегда, жжот
M>>>а причем тут языки? многопоточность формулируется обычно на уровне системной библиотеки(что как раз верно), поскольку является
R>>Для общего развития рекумендую прочитать Threads Cannot be Implemented as a Library M>заголовок громкий. толку боюсь никакого. небось какая-то мелкая языковая фишка предлагается для поддержки библиотечно реализованных тредов. пока нет времени читать.
Да, мелкая. Однако без неё в языке нельзя будет реализовать вообще ничего связанного с многопоточностью.
M>откуда вы тока натаскиваете такие бумашки?
Из интернета
M>>>1. гибким решением, поскольку к самой проблеме можно подойти по разному.
R>>Многопоточность и библиотеки высокоуровневых примитивов синхронизации — разные вещи. R>>Если ты имеешь в виду всякие там условные переменные, семафоры и ридер-вритер мьютексы, то так и скажи.
M>как ж они разные? все вместе это и есть поддержка многопоточности. что вы будете делать с тредом, даже если он будет создаваться одним оператором языка, если у вас нет механизмов их взаимодействия???? M>спасибо за поддержку в языке, типо!
Это не С++ way. Если надо много высокоуровневых фич, то надо использовать что-нибудь типа Javа. С++ никогда не будет это специфицировать, так же как не спицифицирует API для GUI приложений. С++ way — это дать максимально гибкий и полный базис, на основе которого уже можно создать любые требуемые библиотеки.
M>>>2. не ограничено компилятором и синтаксисом конкретного языка
R>>Зто без компилятора не может быть решено *в принципе*. Без базовых гарантий относительно многопоточности и набора примитивных операций ты никакой библиотеки не сделаешь.
M>>>3. многопоточность должна быть частью содержать eventdriven концепта и обязательно иметь таймауты в операциях.
R>>На базе того, как сейчас сформулирована "многопоточность" в текущем драфте ISO С++, ты можешь реализовывать любые высокоуровневые примитивы. Хоть с таймаутами, хоть евент-дривен.
R>>От ОС тут нужна всего 1 вещь — park/unpark (заблокировать/разблокировать поток исполнения). Это реализуют в одинаковом виде все ОС, на которые рассчитан С++ — семафоры есть и в POSIX, и в WinAPI. Гораздо больше зависит от аппаратной платформы.
M>напишите прототипы этий функций, поглядим, что вы имеете ввиду. с комментом, что они делают с тредом технически.
unpark
public static void unpark(Thread thread)
Make available the permit for the given thread, if it was not already available. If the thread was blocked on park then it will unblock. Otherwise, its next call to park is guaranteed not to block. This operation is not guaranteed to have any effect at all if the given thread has not been started.
Parameters:
thread — the thread to unpark, or null, in which case this operation has no effect.
park
public static void park()
Disables the current thread for thread scheduling purposes unless the permit is available.
If the permit is available then it is consumed and the call returns immediately; otherwise the current thread becomes disabled for thread scheduling purposes and lies dormant until one of three things happens:
* Some other thread invokes unpark with the current thread as the target; or
* Some other thread interrupts the current thread; or
* The call spuriously (that is, for no reason) returns.
This method does not report which of these caused the method to return. Callers should re-check the conditions which caused the thread to park in the first place. Callers may also determine, for example, the interrupt status of the thread upon return.
parkNanos
public static void parkNanos(long nanos)
Disables the current thread for thread scheduling purposes, for up to the specified waiting time, unless the permit is available.
If the permit is available then it is consumed and the call returns immediately; otherwise the current thread becomes disabled for thread scheduling purposes and lies dormant until one of four things happens:
* Some other thread invokes unpark with the current thread as the target; or
* Some other thread interrupts the current thread; or
* The specified waiting time elapses; or
* The call spuriously (that is, for no reason) returns.
This method does not report which of these caused the method to return. Callers should re-check the conditions which caused the thread to park in the first place. Callers may also determine, for example, the interrupt status of the thread, or the elapsed time upon return.
Parameters:
nanos — the maximum number of nanoseconds to wait
parkUntil
public static void parkUntil(long deadline)
Disables the current thread for thread scheduling purposes, until the specified deadline, unless the permit is available.
If the permit is available then it is consumed and the call returns immediately; otherwise the current thread becomes disabled for thread scheduling purposes and lies dormant until one of four things happens:
* Some other thread invokes unpark with the current thread as the target; or
* Some other thread interrupts the current thread; or
* The specified deadline passes; or
* The call spuriously (that is, for no reason) returns.
This method does not report which of these caused the method to return. Callers should re-check the conditions which caused the thread to park in the first place. Callers may also determine, for example, the interrupt status of the thread, or the current time upon return.
Parameters:
deadline — the absolute time, in milliseconds from the Epoch, to wait until
M>добавление. после того как напишите, еще постарйтесь вспомнить про стратегию диспетчеризации тредов. от коотрой сильно зависит характер поведения программы, про понятие приоритетов также. также вспомнить про процессы, про их взаимодействие. про способы управления тредами, типа, resume, dispatch, sleep, проч. как запускать и останавливать и треды и процессы..и так далее... и все это должно быть формализовано в некоем виде.
Всё это формализовано в виде:
namespace std {
class thread {
public:
typedef implementation-defined native_handle_type; // See 30.1.3
native_handle_type native_handle(); // See 30.1.3
Однако, на основании этого я бы не стал делать утверждение, что "многопоточность в С++ реализована криво".
M>и очень сомнительно, что с++ хоть на шаг отступит от posix. M>у них есть только один выход, нарисовать нечто, прямо проецируемое на posix. M>и гадать тут нечего.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
M>>>>наконец найден метод от копипейста. вставить в компилятор еще сто кило кода. тогда как в редакторе кнопки копи и пейст останутся неторонутыми, а ведь копипейст идет именно оттуда.
R>>>Ты путаешь о чём идёт речь. Речь не идёт о получении 100% тождественного кода. Речь идёт о получении *почти* тождественного кода, или о генерации т.н. boilerplate кода, который может быть совершенно не идентичен в текстовом представлении.
R>>> M>>ремарк, вы слишком увлеченно программируете на сипп, отчего говорите загадками, вместо ясного и чистого изложения. M>>если серьезно, не являются темплейты таким уж строго необходимым средством для разработки систем.
R>Этого никто и не утверждает.
M>>да, они описывают родственные концепции не OOP языком, оттого их слабость очевидна. и могут генерить только близкородственные коды отличающиеся в небольших деталях.
R>Шаблоны абсолютно перпендикурярны ООП. Например, их можно применять и в функциональном и в императивном программировании. R>Шаблоны способны генерировать абсолютно любой код, различающийся в любых деталях: R>C++ Templates are Turing Complete
вас трудно понимать. вы говорите о шаблонах вообще, как о метаязыке описывающем генераторы каких-то языковых конструкций, или о шаблонах C++? шаблоны с++ в основном это генераторы классов, все таки. а как их можно применять — десятое дело.
сермяжный смысл функционального программирования, это все таки возможность автоматического доказаетельства на таких описаниях каких-то логических теорем. если ваш функциональное описание, ну например на шаблонах, действительно такую возможность дает, то каким образом? если ж все сводится просто к некоей "похожести" с функциональными языками или языками формльных описаний, то эффект не достигнут. вы просто делаете "немного похоже". и фсе.
R>
Здравствуйте, merk, Вы писали:
M>>>да, они описывают родственные концепции не OOP языком, оттого их слабость очевидна. и могут генерить только близкородственные коды отличающиеся в небольших деталях.
R>>Шаблоны абсолютно перпендикурярны ООП. Например, их можно применять и в функциональном и в императивном программировании. R>>Шаблоны способны генерировать абсолютно любой код, различающийся в любых деталях: R>>C++ Templates are Turing Complete
M>вас трудно понимать. вы говорите о шаблонах вообще, как о метаязыке описывающем генераторы каких-то языковых конструкций, или о шаблонах C++? шаблоны с++ в основном это генераторы классов, все таки. а как их можно применять — десятое дело. M>сермяжный смысл функционального программирования, это все таки возможность автоматического доказаетельства на таких описаниях каких-то логических теорем. если ваш функциональное описание, ну например на шаблонах, действительно такую возможность дает, то каким образом? если ж все сводится просто к некоей "похожести" с функциональными языками или языками формльных описаний, то эффект не достигнут. вы просто делаете "немного похоже". и фсе.
Я говорю о шаблонах С++, как о метаязыке описывающем генераторы каких-то языковых конструкций.
Шаблоны С++, в частности, могут помочь типизировать некоторые функции, которые применяются для функционального программирования в С++.
Я пока не говорил, что шаблоны С++ сами реализуют функциональное программирование.
Здравствуйте, remark, Вы писали:
R>>>Для общего развития рекумендую прочитать Threads Cannot be Implemented as a Library M>>заголовок громкий. толку боюсь никакого. небось какая-то мелкая языковая фишка предлагается для поддержки библиотечно реализованных тредов. пока нет времени читать.
R>Да, мелкая. Однако без неё в языке нельзя будет реализовать вообще ничего связанного с многопоточностью.
M>>откуда вы тока натаскиваете такие бумашки?
R>Из интернета
M>>>>1. гибким решением, поскольку к самой проблеме можно подойти по разному.
R>>>Многопоточность и библиотеки высокоуровневых примитивов синхронизации — разные вещи. R>>>Если ты имеешь в виду всякие там условные переменные, семафоры и ридер-вритер мьютексы, то так и скажи.
M>>как ж они разные? все вместе это и есть поддержка многопоточности. что вы будете делать с тредом, даже если он будет создаваться одним оператором языка, если у вас нет механизмов их взаимодействия???? M>>спасибо за поддержку в языке, типо!
R>Это не С++ way. Если надо много высокоуровневых фич, то надо использовать что-нибудь типа Javа. С++ никогда не будет это специфицировать, так же как не спицифицирует API для GUI приложений. С++ way — это дать максимально гибкий и полный базис, на основе которого уже можно создать любые требуемые библиотеки.
M>>>>2. не ограничено компилятором и синтаксисом конкретного языка
R>>>Зто без компилятора не может быть решено *в принципе*. Без базовых гарантий относительно многопоточности и набора примитивных операций ты никакой библиотеки не сделаешь.
M>>>>3. многопоточность должна быть частью содержать eventdriven концепта и обязательно иметь таймауты в операциях.
R>>>На базе того, как сейчас сформулирована "многопоточность" в текущем драфте ISO С++, ты можешь реализовывать любые высокоуровневые примитивы. Хоть с таймаутами, хоть евент-дривен.
R>>>От ОС тут нужна всего 1 вещь — park/unpark (заблокировать/разблокировать поток исполнения). Это реализуют в одинаковом виде все ОС, на которые рассчитан С++ — семафоры есть и в POSIX, и в WinAPI. Гораздо больше зависит от аппаратной платформы.
M>>напишите прототипы этий функций, поглядим, что вы имеете ввиду. с комментом, что они делают с тредом технически.
R>
R>unpark
R>public static void unpark(Thread thread)
R> Make available the permit for the given thread, if it was not already available. If the thread was blocked on park then it will unblock. Otherwise, its next call to park is guaranteed not to block. This operation is not guaranteed to have any effect at all if the given thread has not been started.
R> Parameters:
R> thread — the thread to unpark, or null, in which case this operation has no effect.
R>park
R>public static void park()
R> Disables the current thread for thread scheduling purposes unless the permit is available.
R> If the permit is available then it is consumed and the call returns immediately; otherwise the current thread becomes disabled for thread scheduling purposes and lies dormant until one of three things happens:
R> * Some other thread invokes unpark with the current thread as the target; or
R> * Some other thread interrupts the current thread; or
R> * The call spuriously (that is, for no reason) returns.
R> This method does not report which of these caused the method to return. Callers should re-check the conditions which caused the thread to park in the first place. Callers may also determine, for example, the interrupt status of the thread upon return.
R>parkNanos
R>public static void parkNanos(long nanos)
R> Disables the current thread for thread scheduling purposes, for up to the specified waiting time, unless the permit is available.
R> If the permit is available then it is consumed and the call returns immediately; otherwise the current thread becomes disabled for thread scheduling purposes and lies dormant until one of four things happens:
R> * Some other thread invokes unpark with the current thread as the target; or
R> * Some other thread interrupts the current thread; or
R> * The specified waiting time elapses; or
R> * The call spuriously (that is, for no reason) returns.
R> This method does not report which of these caused the method to return. Callers should re-check the conditions which caused the thread to park in the first place. Callers may also determine, for example, the interrupt status of the thread, or the elapsed time upon return.
R> Parameters:
R> nanos — the maximum number of nanoseconds to wait
R>parkUntil
R>public static void parkUntil(long deadline)
R> Disables the current thread for thread scheduling purposes, until the specified deadline, unless the permit is available.
R> If the permit is available then it is consumed and the call returns immediately; otherwise the current thread becomes disabled for thread scheduling purposes and lies dormant until one of four things happens:
R> * Some other thread invokes unpark with the current thread as the target; or
R> * Some other thread interrupts the current thread; or
R> * The specified deadline passes; or
R> * The call spuriously (that is, for no reason) returns.
R> This method does not report which of these caused the method to return. Callers should re-check the conditions which caused the thread to park in the first place. Callers may also determine, for example, the interrupt status of the thread, or the current time upon return.
R> Parameters:
R> deadline — the absolute time, in milliseconds from the Epoch, to wait until
функций не две, как вы утверждали, а четыре. появились 2 связанные со времением. их отсутсвие меня и удручало. но нету ничего связанного с понятием события. синхронизация тредов с помощью таких функций — тайна за семью печатями. короче — еще 10 раз по столько же и мы наконец увидим нечто концептульное.
R>Всё это формализовано в виде: R>
R>namespace std {
R> class thread {
R> public:
R> typedef implementation-defined native_handle_type; // See 30.1.3
R> native_handle_type native_handle(); // See 30.1.3
R>
откуда текст, дайте ссылку.
M>>и очень сомнительно, что с++ хоть на шаг отступит от posix. M>>у них есть только один выход, нарисовать нечто, прямо проецируемое на posix. M>>и гадать тут нечего.
R>Когда пропадёт желание делать пустые тезисы, могу предложить почитать вот это: R>Why POSIX Threads Are Unsuitable for C++
это просто некие предложения в виде мнения. в заключительной части прямо написано — в с++ лучше реализовать свою концепцию, на основе использования механизмов pthreads, чем прямо вводить их. то самое о чем я и сказал, пиша — "нарисовать нечто, прямо проецируемое на posix." что вас не устраивает?
R>
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
M>>>>да, они описывают родственные концепции не OOP языком, оттого их слабость очевидна. и могут генерить только близкородственные коды отличающиеся в небольших деталях.
R>>>Шаблоны абсолютно перпендикурярны ООП. Например, их можно применять и в функциональном и в императивном программировании. R>>>Шаблоны способны генерировать абсолютно любой код, различающийся в любых деталях: R>>>C++ Templates are Turing Complete
M>>вас трудно понимать. вы говорите о шаблонах вообще, как о метаязыке описывающем генераторы каких-то языковых конструкций, или о шаблонах C++? шаблоны с++ в основном это генераторы классов, все таки. а как их можно применять — десятое дело. M>>сермяжный смысл функционального программирования, это все таки возможность автоматического доказаетельства на таких описаниях каких-то логических теорем. если ваш функциональное описание, ну например на шаблонах, действительно такую возможность дает, то каким образом? если ж все сводится просто к некоей "похожести" с функциональными языками или языками формльных описаний, то эффект не достигнут. вы просто делаете "немного похоже". и фсе.
R>Я говорю о шаблонах С++, как о метаязыке описывающем генераторы каких-то языковых конструкций.
R>Шаблоны С++, в частности, могут помочь типизировать некоторые функции, которые применяются для функционального программирования в С++. R>Я пока не говорил, что шаблоны С++ сами реализуют функциональное программирование.
R>
во во. когда говорите о функциональном программировании в С++, следует о нем вообще говорить с осторожностью. его там нет. поскольку нет возможности поверять автоматической системой доказательства теорем всю ту билиберду, что там написана в виде а-ля функциональный язык.
они ж(функц. языки) и возникли как ответ на необходимость автоматического анализа смысла программы.
впрочем я тут не специалист. просто имею некое представление.
есть у меня товарищ, что этим много и плотно занимался.
Здравствуйте, merk, Вы писали:
M>функций не две, как вы утверждали, а четыре. появились 2 связанные со времением. их отсутсвие меня и удручало. но нету ничего связанного с понятием события. синхронизация тредов с помощью таких функций — тайна за семью печатями. короче — еще 10 раз по столько же и мы наконец увидим нечто концептульное.
M>>>и очень сомнительно, что с++ хоть на шаг отступит от posix. M>>>у них есть только один выход, нарисовать нечто, прямо проецируемое на posix. M>>>и гадать тут нечего.
R>>Когда пропадёт желание делать пустые тезисы, могу предложить почитать вот это: R>>Why POSIX Threads Are Unsuitable for C++ M>это просто некие предложения в виде мнения. в заключительной части прямо написано — в с++ лучше реализовать свою концепцию, на основе использования механизмов pthreads, чем прямо вводить их. то самое о чем я и сказал, пиша — "нарисовать нечто, прямо проецируемое на posix." что вас не устраивает?
Я вижу в заключении:
POSIX threads are not a suitable basis for adding threading to C++, either conceptually or as a specification
Если говорить о таких вещах как, например, мьютекс, то тут всё равно на что проецируется, т.к. мьютекс проецируется на всё. Хоть на POSIX, хоть на Win Threads, хоть на zThreads.
Если говорить о более базовых вещах, то тут как раз С++ полностью уходит от POSIX, с его неоднократно обруганной моделью памяти, и невозможностью в нём что-либо изменить.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
M>>функций не две, как вы утверждали, а четыре. появились 2 связанные со времением. их отсутсвие меня и удручало. но нету ничего связанного с понятием события. синхронизация тредов с помощью таких функций — тайна за семью печатями. короче — еще 10 раз по столько же и мы наконец увидим нечто концептульное.
R>Концептуальное здесь: R>http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2691.pdf
R>>>Всё это формализовано в виде: R>>>
R>>>namespace std {
R>>> class thread {
R>>> public:
R>>> typedef implementation-defined native_handle_type; // See 30.1.3
R>>> native_handle_type native_handle(); // See 30.1.3
R>>>
M>>>>и очень сомнительно, что с++ хоть на шаг отступит от posix. M>>>>у них есть только один выход, нарисовать нечто, прямо проецируемое на posix. M>>>>и гадать тут нечего.
R>>>Когда пропадёт желание делать пустые тезисы, могу предложить почитать вот это: R>>>Why POSIX Threads Are Unsuitable for C++ M>>это просто некие предложения в виде мнения. в заключительной части прямо написано — в с++ лучше реализовать свою концепцию, на основе использования механизмов pthreads, чем прямо вводить их. то самое о чем я и сказал, пиша — "нарисовать нечто, прямо проецируемое на posix." что вас не устраивает?
R>Я вижу в заключении: R>
R>POSIX threads are not a suitable basis for adding threading to C++, either conceptually or as a specification
R>Если говорить о таких вещах как, например, мьютекс, то тут всё равно на что проецируется, т.к. мьютекс проецируется на всё. Хоть на POSIX, хоть на Win Threads, хоть на zThreads. R>Если говорить о более базовых вещах, то тут как раз С++ полностью уходит от POSIX, с его неоднократно обруганной моделью памяти, и невозможностью в нём что-либо изменить.
я ж не говорил о мьютексах. а о концептах мульти так сказать программирования. например в яве мьютексов на поверхности не было (последние нововведения не знаю), зато есть декларации — synchronized. вы понимаете о чем я? об обьектно-ориентированной парадигме мультитрединга, об "активных обьектах", об их иерархиях, взаимодействиях, защите на уровне языка(например), в некоторых языках к этому плюсуют встроенные каналы протоколы обмена по каналам... вот что я считаю парадигмой.
а не какую-то ерунду с "атомарными операциями" (что конечно нужны, но не являются существенной частью), или две основные функции пак-анпак.
understood?
Здравствуйте, remark, Вы писали:
R>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, remark, Вы писали:
R>>>Для меня лично, самое большое достоинство С++ в том, что он меня *ни в чём* не ограничивает. Абсолютно. Точка.
J>>Кроме как в том, что он сделать не в состоянии
R>Например?
ну вот то, что ниже перечислено.
или, например, возможность навесить на любую сущность нечто вроде атрибута и потом в коде соответствующим образом все это дело обрабатывать.
R>>>Т.е. я знаю, что что-бы я ни захотел на нём сделать, я смогу сделать.
J>>Мне это тоже нравится в С++, единственный вопрос — какой ценой все это дается. J>>Геморроя никому не хочется, а в С++ его частенько не избежать.
J>>И поэтому я горячо приветствую появление фич типа переменных шаблонов, именно потому что они дают возможность выразить свою мысль в несколкьо раз меньшим и в несколько раз более понятным кодом.
R>Если что-то сделать *и* можно, *и* легко, то это бесспорно ещё лучше.
иногда "легко" становится решающим фактором и люди готовы платить ограничением возможностей за легкость использования.
J>>и, имхо, если прикрутить к С++ систему макросов уровня Немерле, оставив все остальное как есть — это бы подняло язык на качественно новый уровень.
R>Да, было бы неплохо. Или хотя бы мощную рефлексию. Причём в отличие от C#, где рефлексия только в ран-тайм, в С++ рефлексию можно сделать в ран-тайм, в компайл-тайм, и даже в препроцессинг-тайм (тогда можно будет, например, генерировать "прозначные" прокси-классы): R>https://sourceforge.net/forum/message.php?msg_id=4180732
Ну это понятно, что можно, но хотелось бы, чтоб это как-то почище и попрое в коде выглядело
J>> R>
Здравствуйте, merk, Вы писали:
R>>Если говорить о таких вещах как, например, мьютекс, то тут всё равно на что проецируется, т.к. мьютекс проецируется на всё. Хоть на POSIX, хоть на Win Threads, хоть на zThreads. R>>Если говорить о более базовых вещах, то тут как раз С++ полностью уходит от POSIX, с его неоднократно обруганной моделью памяти, и невозможностью в нём что-либо изменить.
M>я ж не говорил о мьютексах. а о концептах мульти так сказать программирования. например в яве мьютексов на поверхности не было (последние нововведения не знаю), зато есть декларации — synchronized. вы понимаете о чем я? об обьектно-ориентированной парадигме мультитрединга, об "активных обьектах", об их иерархиях, взаимодействиях, защите на уровне языка(например), в некоторых языках к этому плюсуют встроенные каналы протоколы обмена по каналам... вот что я считаю парадигмой. M>а не какую-то ерунду с "атомарными операциями" (что конечно нужны, но не являются существенной частью), или две основные функции пак-анпак. M>understood?
Такое не будет формулироваться вообще. Такая цель перед С++ не ставится. Соотв. и затыкать будет не чего.
С++ это не Erlang, OpenMP или Cw.
Специфицируются базовые вещи:
— явная многопоточность — потоки, мьютексы, условные переменные
— параллелизм по задачам — фьючерсы
— полный набор базовых примитивов, необходимый и достаточный для эффективной реализации всех остальных высокоуровневых моделей программирования
И всё это специфицировано очень хорошо.
Реализации таких вещей как активные объекты или модель производитель-потребитель слишком спорны и компромиссны для реализации в С++ на уровне языка. На уровне языка всё это больше подходит для какого-то экспериментального академического языка.
А в виде библиотек — пожалуйста. В принципе и сейчас есть OpenMP, Cilk, TBB, libasync и т.д.
Здравствуйте, jazzer, Вы писали:
R>>>>Для меня лично, самое большое достоинство С++ в том, что он меня *ни в чём* не ограничивает. Абсолютно. Точка.
J>>>Кроме как в том, что он сделать не в состоянии
R>>Например? J>ну вот то, что ниже перечислено. J>или, например, возможность навесить на любую сущность нечто вроде атрибута и потом в коде соответствующим образом все это дело обрабатывать.
Я думаю, не составит труда реализовать что-то типа:
class person : obj<person>
{
int age;
ATTRS_BEGIN();
ATTR(age, "visible_name", "Person age:");
ATTRS_END();
};
Если это действительно необходимо. Например, в каком-то enterprise приложении, где с помощью такого декларативного описания удасться избавиться от львиной части boilerplate кода. Заметь, я не говорил, что получится реализовать также красиво как и в языке со встроенной поддержкой данной фичи; и что для этого не надо будет изначально затратить некоторые усилия. Однако, основная задача будет решена — декларативно навешиваем атрибуты, boilerplate код генерируется автоматически.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
R>>>Если говорить о таких вещах как, например, мьютекс, то тут всё равно на что проецируется, т.к. мьютекс проецируется на всё. Хоть на POSIX, хоть на Win Threads, хоть на zThreads. R>>>Если говорить о более базовых вещах, то тут как раз С++ полностью уходит от POSIX, с его неоднократно обруганной моделью памяти, и невозможностью в нём что-либо изменить.
M>>я ж не говорил о мьютексах. а о концептах мульти так сказать программирования. например в яве мьютексов на поверхности не было (последние нововведения не знаю), зато есть декларации — synchronized. вы понимаете о чем я? об обьектно-ориентированной парадигме мультитрединга, об "активных обьектах", об их иерархиях, взаимодействиях, защите на уровне языка(например), в некоторых языках к этому плюсуют встроенные каналы протоколы обмена по каналам... вот что я считаю парадигмой. M>>а не какую-то ерунду с "атомарными операциями" (что конечно нужны, но не являются существенной частью), или две основные функции пак-анпак. M>>understood?
R>Такое не будет формулироваться вообще. Такая цель перед С++ не ставится. Соотв. и затыкать будет не чего. R>С++ это не Erlang, OpenMP или Cw. R>Специфицируются базовые вещи: R> — явная многопоточность — потоки, мьютексы, условные переменные
посмотрите позикс... все это давно есть. то что нарисовано в драфте — обертка над позиксом собссно.
R> — параллелизм по задачам — фьючерсы
не знаю что это.
R> — полный набор базовых примитивов, необходимый и достаточный для эффективной реализации всех остальных высокоуровневых моделей программирования
хорошо сказано.
R>И всё это специфицировано очень хорошо.
сказано еще лучше.
R>Реализации таких вещей как активные объекты или модель производитель-потребитель слишком спорны и компромиссны для реализации в С++ на уровне языка. На уровне языка всё это больше подходит для какого-то экспериментального академического языка.
таких как ява.
R>А в виде библиотек — пожалуйста. В принципе и сейчас есть OpenMP, Cilk, TBB, libasync и т.д.
то то и оно. все что "хорошо специфицифицировано" в драфте уже тыщу раз специфицровано в позиксе, и куче разных библиотек.
вы же говорили о неизмеримо более продвинутом уровне парадигмы, чем где либо.
но там нет ничего нового. более того все что есть — известно черт знает сколько времени. тут нужно говорить не о новизне, а о попытке ликвидации хронического отставания.
Здравствуйте, remark, Вы писали:
J>>или, например, возможность навесить на любую сущность нечто вроде атрибута и потом в коде соответствующим образом все это дело обрабатывать.
<snip>
Я немножко не это имел в виду.
Вот представь, что я организую strong exception guarantee. Это значит, что у меня код метода делится на две части — которая может бросать и которая не может. Так вот я хочу получить поддержку со стороны компилятора, чтоб он гарантировал, что я ничего бросающего не зову.
И если для функций, поднапрягшись и навсегда испортив себе карму, это еще можно сделать, то для операторов — уже нет.
Да и все равно, все останется держаться на дисциплине разработчика.
А хотелось бы декларативно:
[[nothrow]]
A operator+(A,A) {} // can't throw, body checked in CT
A operator-(A,A) {} // can throwvoid f()
{
// ...
// can throw from the above
[[nothrow]]
{
A a,b,c; // OK: ctors declared nothrow
c = a + b; // OK: declared nothrow
c = a - b; // doesn't compiletry {
c = a - b; // OK: explicit blocking
} catch(...) {}
}
}
Вот если б такое можно было реализовать...
Причем, насколько я понимаю, в Немерле подобное можно сделать на макросах — надо будет спросить у них в форуме, можно ли.
J>>>>>>>> R>>>>>>> J>>>>>> R>>>>> J>>>> R>>> J>> R>
Здравствуйте, merk, Вы писали:
R>>Такое не будет формулироваться вообще. Такая цель перед С++ не ставится. Соотв. и затыкать будет не чего. R>>С++ это не Erlang, OpenMP или Cw. R>>Специфицируются базовые вещи: R>> — явная многопоточность — потоки, мьютексы, условные переменные
M>посмотрите позикс... все это давно есть. то что нарисовано в драфте — обертка над позиксом собссно.
Обёртка над посиксом настолько же, насколько обёртка над Win API. Тут просто особо ничего не нафантазируешь.
R>> — параллелизм по задачам — фьючерсы M>не знаю что это.
R>> — полный набор базовых примитивов, необходимый и достаточный для эффективной реализации всех остальных высокоуровневых моделей программирования M>хорошо сказано.
R>>И всё это специфицировано очень хорошо. M>сказано еще лучше.
R>>Реализации таких вещей как активные объекты или модель производитель-потребитель слишком спорны и компромиссны для реализации в С++ на уровне языка. На уровне языка всё это больше подходит для какого-то экспериментального академического языка. M>таких как ява.
R>>А в виде библиотек — пожалуйста. В принципе и сейчас есть OpenMP, Cilk, TBB, libasync и т.д. M>то то и оно. все что "хорошо специфицифицировано" в драфте уже тыщу раз специфицровано в позиксе, и куче разных библиотек. M>вы же говорили о неизмеримо более продвинутом уровне парадигмы, чем где либо. M>но там нет ничего нового. более того все что есть — известно черт знает сколько времени. тут нужно говорить не о новизне, а о попытке ликвидации хронического отставания.
R>> — полный набор базовых примитивов, необходимый и достаточный для эффективной реализации всех остальных высокоуровневых моделей программирования
Не реализовано НИГДЕ на таком уровне. Вообще НИГДЕ. Ни в другом языке. Ни как расширение какого-либо существующего компилятора С/С++. Ни как кросс-платформенная библиотека. Ни как платформенно-зависимая библиотека. Вообще нигде даже близко ничего не было, ни о каких стандартах типа POSIX вообще говорить не приходится. В данный момент единственная возможность получить такие возможности, которые будут стандартизированы в ISO C++, — взять документацию по процессору, взять документацию по компилятору, ассемблер в руки и вперёд писать платформенно+компиляторо-зависимый код.
Здравствуйте, merk, Вы писали:
R>>Такое не будет формулироваться вообще. Такая цель перед С++ не ставится. Соотв. и затыкать будет не чего. R>>С++ это не Erlang, OpenMP или Cw. R>>Специфицируются базовые вещи: R>> — явная многопоточность — потоки, мьютексы, условные переменные M>посмотрите позикс... все это давно есть. то что нарисовано в драфте — обертка над позиксом собссно.
т.е. статью, почему посикс не подходит для С++, ты принципиально читать не будешь... Тем не менее продолжишь утвеждать (далее идет цитата из профессора Преображенского)...
R>> — параллелизм по задачам — фьючерсы M>не знаю что это.
а потом удивляешься, что люди не хотят объяснять на пальцах, видя, что ты не знаком с основными понятиями, и отправляют читать статьи, в которых все разжевано, просто чтоб был базис для дальнейшего разговора.
R>>Реализации таких вещей как активные объекты или модель производитель-потребитель слишком спорны и компромиссны для реализации в С++ на уровне языка. На уровне языка всё это больше подходит для какого-то экспериментального академического языка. M>таких как ява.
Ага, в которой вставили единственный примитив синхронизации со словами: "Вам никогда не понадобится больше 64к памяти", а теперь не знают, кода от него бечь.
R>>А в виде библиотек — пожалуйста. В принципе и сейчас есть OpenMP, Cilk, TBB, libasync и т.д. M>то то и оно. все что "хорошо специфицифицировано" в драфте уже тыщу раз специфицровано в позиксе, и куче разных библиотек. M>вы же говорили о неизмеримо более продвинутом уровне парадигмы, чем где либо. M>но там нет ничего нового. более того все что есть — известно черт знает сколько времени. тут нужно говорить не о новизне, а о попытке ликвидации хронического отставания.
Вообще-то параллельность была досконально исследована в семидесятые годы, когда С++ еще и не пахло. И с тех пор ничего особо нового не придумано.
И, кстати, тогда же показано, что если у тебя нет гарантированно атомарных операций — ты не сможешь написать корректный параллельнй код, просто потому что не сможешь гарантированно реализовать примитивы синхронизации.
И пока в С++ нет соответствующих гарантий — невозможно на С++ написать бибилотеку примитивов синхронизации.
Плюс ты не можешь понять одной простой истины — нельзя просто взять что-то откуда-то и прилепить жвачкой к С++, не глядя на то, как оно встроится в язык (речь не о синтаксисе, а о модели исполнения, модели памяти, вопросы времени жизни объектов, исключения и т.д. и .т.п). Те языки, которые так начинали, после короткого периода бурного роста, вызванного копи-пейстом фич других языков, коллапсировали под несовместимостью привнесенных фич как с самим языком, так и между собой.
И цель стандартизации параллельности в С++ — не сказать новое слово в параллельности, а ввести ее в язык максимально корректно.
И эти люди, которые занимаются этим уже несколько лет, пишут на эту тему статьи, которые тебе неплохо бы почитать, потому что, мне так кажется, твой уровень познаний в данной области сильно не дотягивает до уровня их познаний.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, merk, Вы писали:
R>>>Такое не будет формулироваться вообще. Такая цель перед С++ не ставится. Соотв. и затыкать будет не чего. R>>>С++ это не Erlang, OpenMP или Cw. R>>>Специфицируются базовые вещи: R>>> — явная многопоточность — потоки, мьютексы, условные переменные M>>посмотрите позикс... все это давно есть. то что нарисовано в драфте — обертка над позиксом собссно.
J>т.е. статью, почему посикс не подходит для С++, ты принципиально читать не будешь... Тем не менее продолжишь утвеждать (далее идет цитата из профессора Преображенского)...
мы уже с ремарком пришли к выводу, что в драфте просто нарисован позикс.
таким образом статья(которую вы явно не прочли даже по диагонали) не соответствует драфту.
скажите что нить умное в конце концов.
R>>> — параллелизм по задачам — фьючерсы M>>не знаю что это.
R>>>Реализации таких вещей как активные объекты или модель производитель-потребитель слишком спорны и компромиссны для реализации в С++ на уровне языка. На уровне языка всё это больше подходит для какого-то экспериментального академического языка. M>>таких как ява. J>Ага, в которой вставили единственный примитив синхронизации со словами: "Вам никогда не понадобится больше 64к памяти", а теперь не знают, кода от него бечь.
я нигде не заявлял о 64 к памяти. вы говорите с кем-то другим.
R>>>А в виде библиотек — пожалуйста. В принципе и сейчас есть OpenMP, Cilk, TBB, libasync и т.д. M>>то то и оно. все что "хорошо специфицифицировано" в драфте уже тыщу раз специфицровано в позиксе, и куче разных библиотек. M>>вы же говорили о неизмеримо более продвинутом уровне парадигмы, чем где либо. M>>но там нет ничего нового. более того все что есть — известно черт знает сколько времени. тут нужно говорить не о новизне, а о попытке ликвидации хронического отставания.
J>Вообще-то параллельность была досконально исследована в семидесятые годы, когда С++ еще и не пахло. И с тех пор ничего особо нового не придумано.
што ви говорите! и что? я и сказал — ничто кроме позикса в сипп не вставят. и не потому, что он чему-то там соответствует. а потому что он стандарт де факто. и уклонение от него чревато для сипп. каким бы гуаном не был позикс.
J>И, кстати, тогда же показано, что если у тебя нет гарантированно атомарных операций — ты не сможешь написать корректный параллельнй код, просто потому что не сможешь гарантированно реализовать примитивы синхронизации.
шо ви говорите!
вы это к чему.
J>И пока в С++ нет соответствующих гарантий — невозможно на С++ написать бибилотеку примитивов синхронизации.
J>Плюс ты не можешь понять одной простой истины — нельзя просто взять что-то откуда-то и прилепить жвачкой к С++, не глядя на то, как оно встроится в язык (речь не о синтаксисе, а о модели исполнения, модели памяти, вопросы времени жизни объектов, исключения и т.д. и .т.п). Те языки, которые так начинали, после короткого периода бурного роста, вызванного копи-пейстом фич других языков, коллапсировали под несовместимостью привнесенных фич как с самим языком, так и между собой.
хорошо сказано!...но не по делу. J>И цель стандартизации параллельности в С++ — не сказать новое слово в параллельности, а ввести ее в язык максимально корректно.
то исть? что есть признак корректности?
сформулируйте несколько признаков, по которым можно понять — корректно или нет.
J>И эти люди, которые занимаются этим уже несколько лет, пишут на эту тему статьи, которые тебе неплохо бы почитать, потому что, мне так кажется, твой уровень познаний в данной области сильно не дотягивает до уровня их познаний.
о какой статье идут тут речь??? вы сами упоминаемую вами статью читали?
все что дал мне ремарк, не имело особого касательства к существу вопроса, кроме всяких банальностей.
единственно уместным был драфт.
если вам особо что-то другое понравилось и поразило вас своей целостностью рассмотрения вопроса многопоточности, — будьте любезны, откройте новый топик по этой статье, с удовольствием подискутирую с вами лично.
R>Не реализовано НИГДЕ на таком уровне. Вообще НИГДЕ. Ни в другом языке. Ни как расширение какого-либо существующего компилятора С/С++. Ни как кросс-платформенная библиотека. Ни как платформенно-зависимая библиотека. Вообще нигде даже близко ничего не было, ни о каких стандартах типа POSIX вообще говорить не приходится. В данный момент единственная возможность получить такие возможности, которые будут стандартизированы в ISO C++, — взять документацию по процессору, взять документацию по компилятору, ассемблер в руки и вперёд писать платформенно+компиляторо-зависимый код.
ниче не понял. всегда решал эту задачу просто нужными классами, реализация которых несколько отличается для той или иной платформы. могу показать собственные хидеры 5 летней давности..что дико напоминают эти ваши "суперпродвинутые" штуки из драфта. работают одинаково, как для винды так и для линуха.
а у вас обламывалось, да?
ну ждите когда драфт вопротится в жись.
и никто доков по процессору брать не будет, чтобы сделать независимость от платформы, нужно просто реализовать свой сет, несколько специфически для разных осей. и ассемблеры то зачем???
вообще проблемы не понял. есть куча библиотек, где треды и вся многозадачность реализована вне зависимости от платформы. Не нравится? реализуйте свою, вообще нет проблем.
R>
Здравствуйте, merk, Вы писали:
R>>Не реализовано НИГДЕ на таком уровне. Вообще НИГДЕ. Ни в другом языке. Ни как расширение какого-либо существующего компилятора С/С++. Ни как кросс-платформенная библиотека. Ни как платформенно-зависимая библиотека. Вообще нигде даже близко ничего не было, ни о каких стандартах типа POSIX вообще говорить не приходится. В данный момент единственная возможность получить такие возможности, которые будут стандартизированы в ISO C++, — взять документацию по процессору, взять документацию по компилятору, ассемблер в руки и вперёд писать платформенно+компиляторо-зависимый код.
M>ниче не понял. всегда решал эту задачу просто нужными классами, реализация которых несколько отличается для той или иной платформы. могу показать собственные хидеры 5 летней давности..что дико напоминают эти ваши "суперпродвинутые" штуки из драфта. работают одинаково, как для винды так и для линуха.
Я верю, что ты мог реализовать что-то тривиальное на мьютесах и условных переменных.
Ну вот набросай, например, реализацию легковесной fifo single-producer/single-consumer очереди сообщений, которая на основном пути не исполняет тяжеловесные атомарные RMW операции и тяжелые (#StoreLoad) барьеры памяти. Хотя бы для пары компиляторов и пары процессоров.
Интерфейс примерно такой:
M>и никто доков по процессору брать не будет, чтобы сделать независимость от платформы, нужно просто реализовать свой сет, несколько специфически для разных осей. и ассемблеры то зачем???
Что б не лажу какую-нибудь сваять, а сделать нормально.
M>вообще проблемы не понял. есть куча библиотек, где треды и вся многозадачность реализована вне зависимости от платформы. Не нравится? реализуйте свою, вообще нет проблем.
Как ты сам заметил, тредов мало для написания программы, нужны ещё примитивы синхронизации. Если тебя устраивают примитивные мьютекс+условная переменная, то проблем нет. А если в библиотеке нет read-writer mutex, нет мьютекса с поддержкой отладочной информации, нет мьютекса со статической инициализацией, нет эффективной очереди для передачи сообщений, нет легковесного шедулера, нет нормального многопоточного аллокатора памяти и т.д. и т.п., то тут начинаются проблемы. И на основе этой библиотеки ты уже это не решишь, на основе этой библиотеки ты модешь сделать только что-то ещё более медленное.
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, jazzer, Вы писали:
VE>Я вот не пойму, зачем вы этого тролля кормите?
Чтоб народ не смущал своими откровениями.
А то ведь если никто не возразит, так начинающие программеры, которые не в теме, и будут думать, что всё так и есть, как он говорит.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
R>>>Не реализовано НИГДЕ на таком уровне. Вообще НИГДЕ. Ни в другом языке. Ни как расширение какого-либо существующего компилятора С/С++. Ни как кросс-платформенная библиотека. Ни как платформенно-зависимая библиотека. Вообще нигде даже близко ничего не было, ни о каких стандартах типа POSIX вообще говорить не приходится. В данный момент единственная возможность получить такие возможности, которые будут стандартизированы в ISO C++, — взять документацию по процессору, взять документацию по компилятору, ассемблер в руки и вперёд писать платформенно+компиляторо-зависимый код.
M>>ниче не понял. всегда решал эту задачу просто нужными классами, реализация которых несколько отличается для той или иной платформы. могу показать собственные хидеры 5 летней давности..что дико напоминают эти ваши "суперпродвинутые" штуки из драфта. работают одинаково, как для винды так и для линуха.
R>Я верю, что ты мог реализовать что-то тривиальное на мьютесах и условных переменных. R>Ну вот набросай, например, реализацию легковесной fifo single-producer/single-consumer очереди сообщений, которая на основном пути не исполняет тяжеловесные атомарные RMW операции и тяжелые (#StoreLoad) барьеры памяти. Хотя бы для пары компиляторов и пары процессоров.
R>Интерфейс примерно такой: R>
неясна постановка задачи. и какими средствами пользоваться.
намекаю. очередь стандартно реализуется как — много продюсеров и консьюмеров, и делается на правильных мьютексах, с функцией wait и notify_all.
вариант — один продюсер-один консьюмер — это чиста иллюстрация, ненужная в рнеальности, поскольку покрывается очередью много-много.
жаль что вы тратили время на ненужный код.
M>>а у вас обламывалось, да? R>Нет, но было очень сложно.
ну это ваше личное впечатление. не так ли?
R>Как ты сам заметил, тредов мало для написания программы, нужны ещё примитивы синхронизации. Если тебя устраивают примитивные мьютекс+условная переменная, то проблем нет. А если в библиотеке нет read-writer mutex, нет мьютекса с поддержкой отладочной информации, нет мьютекса со статической инициализацией, нет эффективной очереди для передачи сообщений, нет легковесного шедулера, нет нормального многопоточного аллокатора памяти и т.д. и т.п., то тут начинаются проблемы. И на основе этой библиотеки ты уже это не решишь, на основе этой библиотеки ты модешь сделать только что-то ещё более медленное.
интересно чем вы там занимаетесь...что вам нужен мьютекс с отладочной информацией! и у вас нет многопоточного аллокатора памяти!
поднесли голую железку, без оси? и откуда с++ на ней?
Re[6]: C - -
От:
Аноним
Дата:
08.07.08 21:24
Оценка:
R>От ОС тут нужна всего 1 вещь — park/unpark (заблокировать/разблокировать поток исполнения). Это реализуют в одинаковом виде все ОС, на которые рассчитан С++ — семафоры есть и в POSIX, и в WinAPI. Гораздо больше зависит от аппаратной платформы.
с каких пор POSIX и WinAPI стал единственными.. мм.. платформами под который рассчитан С++? А как же микроконтроллеры, под которых то и ОС иногда нету?
Здравствуйте, Аноним, Вы писали:
R>>От ОС тут нужна всего 1 вещь — park/unpark (заблокировать/разблокировать поток исполнения). Это реализуют в одинаковом виде все ОС, на которые рассчитан С++ — семафоры есть и в POSIX, и в WinAPI. Гораздо больше зависит от аппаратной платформы.
А>с каких пор POSIX и WinAPI стал единственными.. мм.. платформами под который рассчитан С++? А как же микроконтроллеры, под которых то и ОС иногда нету?
На платформе либо вообще нет многопоточности, либо есть реализация стандартных примитивов синхронизации в стандартном виде, либо есть средства для реализации оных.
R>На платформе либо вообще нет многопоточности, либо есть реализация стандартных примитивов синхронизации в стандартном виде, либо есть средства для реализации оных. R>
Вот в том и фишка, до сих пор в С++ не было ниче такого, чего не было на какихлибо существующих платформах.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, Аноним, Вы писали:
R>>>От ОС тут нужна всего 1 вещь — park/unpark (заблокировать/разблокировать поток исполнения). Это реализуют в одинаковом виде все ОС, на которые рассчитан С++ — семафоры есть и в POSIX, и в WinAPI. Гораздо больше зависит от аппаратной платформы.
А>>с каких пор POSIX и WinAPI стал единственными.. мм.. платформами под который рассчитан С++? А как же микроконтроллеры, под которых то и ОС иногда нету?
R>На платформе либо вообще нет многопоточности, либо есть реализация стандартных примитивов синхронизации в стандартном виде, либо есть средства для реализации оных.
R>
я от ремарка просто торчу иногда... фактически он заявил, что теперь с++(по новому драфту)
1. либо не сможет по стандарту поддерживать платформу, если может в своей либе реализовать многопоточность на ней.
2. либо будет обязан реализовать шедулер, таймеры, обработку прерываний и прочий HAL...поскольку только после этого ремарк сможет увидеть свои пафосные парки и анпарки на голом железе.
короче разработчикам на голом железе теперь придется туго с С++
зато ремарку хорошо. теперь он свою очередь на винде напишет с гениальной легкостью
и получится, что для голого железа С++ будет стыдливо предлагать усеченный вариант системы...нууу...без многопоточности типо делайте сами как хотите. наше дело сторона.
так?
поправочка разумеется M>я от ремарка просто торчу иногда... фактически он заявил, что теперь с++(по новому драфту) M>1. либо не сможет по стандарту поддерживать платформу, если может в своей либе реализовать многопоточность на ней.
либо не сможет по стандарту поддерживать платформу, если НЕ может в своей либе реализовать многопоточность на ней.
Здравствуйте, dcb-BanDos, Вы писали:
DB>Из полученного результат можно сделать вывод, что пора срочно учить Java. DB>Интересно было бы также увидеть минусы Java и C# кроме отсутствия const =)
В Java есть один очень серьезный объективный недостаток: спецификация исключений.
И еще один субъективный -- Java каким-то непостижимым образом переводит программиста в царство существительных.
Что до C#, то пока стремно рассматривать его как язык для кросс-платформенной разработки, т.к. MS не высказывает желания поддерживать Mono.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, dcb-BanDos, Вы писали:
DB>Здравствуйте, remark, Вы писали:
DB>Из полученного результат можно сделать вывод, что пора срочно учить Java. DB>Интересно было бы также увидеть минусы Java и C# кроме отсутствия const =)
Странная логика.
Попросили написать только недостатки — написали.
Но это же не значит, что нет достоинств, правда?
Здравствуйте, merk, Вы писали:
M>неясна постановка задачи. и какими средствами пользоваться.
Что конкретно не ясно? Средства любые.
M>намекаю. очередь стандартно реализуется как — много продюсеров и консьюмеров, и делается на правильных мьютексах, с функцией wait и notify_all.
Именно. По причине, которую я описал выше. НИ ОДИН язык, библиотека, стандарт не давал других средств.
Однако ран-тайм свойства от такой реализации (на мьютексах и условных переменных) могут проседать на 2 порядка.
M>вариант — один продюсер-один консьюмер — это чиста иллюстрация, ненужная в рнеальности, поскольку покрывается очередью много-много. M>жаль что вы тратили время на ненужный код.
Если не можешь, то так и скажи. Это понятно, что такая очередь не нужна, т.к. покрывается очередью много-много. А очередь много-много тоже не нужна, т.к покрывается файловой системой (складывать сообщения в директорию). А ФС тоже не нужна, т.к. можно сокетами обойтись.
Любая бинарная сериализация тоже не нужна, т.к. покрывается XML.
Ну в принципе можешь делать "много-много", если сможешь требования соблюсти.
M>>>а у вас обламывалось, да? R>>Нет, но было очень сложно. M>ну это ваше личное впечатление. не так ли?
Да. Но ты вроже тоже сказал, что рыться в документации по процессорам — не сахар.
R>>Как ты сам заметил, тредов мало для написания программы, нужны ещё примитивы синхронизации. Если тебя устраивают примитивные мьютекс+условная переменная, то проблем нет. А если в библиотеке нет read-writer mutex, нет мьютекса с поддержкой отладочной информации, нет мьютекса со статической инициализацией, нет эффективной очереди для передачи сообщений, нет легковесного шедулера, нет нормального многопоточного аллокатора памяти и т.д. и т.п., то тут начинаются проблемы. И на основе этой библиотеки ты уже это не решишь, на основе этой библиотеки ты модешь сделать только что-то ещё более медленное. M>интересно чем вы там занимаетесь...что вам нужен мьютекс с отладочной информацией! и у вас нет многопоточного аллокатора памяти! M>поднесли голую железку, без оси? и откуда с++ на ней?
Мьютекса со статической инициализацией нет, например, в самой распространённой ОС — Windows.
По поводу аллокатора — ты упустил ключевое слово *нормального*. Нормальный многопоточный аллокатор не входит ни в Win, ни в Linux.
Ну и так далее.
Здравствуйте, merk, Вы писали:
M>поправочка разумеется M>>я от ремарка просто торчу иногда... фактически он заявил, что теперь с++(по новому драфту) M>>1. либо не сможет по стандарту поддерживать платформу, если может в своей либе реализовать многопоточность на ней.
M>либо не сможет по стандарту поддерживать платформу, если НЕ может в своей либе реализовать многопоточность на ней.
На любой платформе, где есть несколько процессоров *есть* средства для реализации всего необходимого для С++.
Про шедулеры и таймеры вообще не понял, они не имеют никакого отношения к С++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, dcb-BanDos, Вы писали:
DB>>Из полученного результат можно сделать вывод, что пора срочно учить Java. DB>>Интересно было бы также увидеть минусы Java и C# кроме отсутствия const =)
E>В Java есть один очень серьезный объективный недостаток: спецификация исключений.
Это если я правильно понял отсутствие в Java возможности написать void func() throw(exceptionType) ??
E>И еще один субъективный -- Java каким-то непостижимым образом переводит программиста в царство существительных.
Ничто не ограничивает полет мысли программиста так, как компилятор.
Здравствуйте, dcb-BanDos, Вы писали:
E>>В Java есть один очень серьезный объективный недостаток: спецификация исключений.
DB>Это если я правильно понял отсутствие в Java возможности написать void func() throw(exceptionType) ??
Наоборот, если какой-нибудь мудрец в Java напишет в каком-либо из базовых классов или интерфейсов:
public Config loadConfig() throws FileNotFoundException { ... }
а затем в производном классе потребуется поднимать конфигурацию из БД, то все -- компилятор будет говорить, что он ждет от метода производного класса только FileNotFoundException и ничего больше.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, dcb-BanDos, Вы писали:
E>>>В Java есть один очень серьезный объективный недостаток: спецификация исключений.
DB>>Это если я правильно понял отсутствие в Java возможности написать void func() throw(exceptionType) ??
E>Наоборот, если какой-нибудь мудрец в Java напишет в каком-либо из базовых классов или интерфейсов: E>
E>а затем в производном классе потребуется поднимать конфигурацию из БД, то все -- компилятор будет говорить, что он ждет от метода производного класса только FileNotFoundException и ничего больше.
Так это проблема кривого дизайна, а не спецификации исключений... Если в интерфесе прописано (с помошью спецификации исключений или просто в комментариях), что loadConfig кидает FileNotFoundException, то код, использующий этот интерфейс, имеет полное право ожидать только это исключение. Да, без спецификации все скомпилируется, только кому от этого легче?
Что если другой мудрец напишет на C++
virtual shared_ptr<Config> load_config() = 0; // throws file_not_found_exception when config-file is missing
"а затем в производном классе потребуется поднимать конфигурацию из БД"...
The last good thing written in C was Franz Schubert's Symphony No. 9.
Здравствуйте, crable, Вы писали:
C>Так это проблема кривого дизайна, а не спецификации исключений... Если в интерфесе прописано (с помошью спецификации исключений или просто в комментариях), что loadConfig кидает FileNotFoundException, то код, использующий этот интерфейс, имеет полное право ожидать только это исключение. Да, без спецификации все скомпилируется, только кому от этого легче?
C>Что если другой мудрец напишет на C++ C>
C>virtual shared_ptr<Config> load_config() = 0; // throws file_not_found_exception when config-file is missing
C>
C>"а затем в производном классе потребуется поднимать конфигурацию из БД"...
В C++, если спецификация исключений выполняется лишь на уровне комментариев, то разработчик производного класса может без проблем выбросить любое другое исключение. Да, код, который ожидал только file_not_found_exception не выживет. Исключение поднимится куда-то вверх по иерархии. И рано или поздно где-то проблема будет диагностированна.
В Java же спецификации исключений не дают возможности выбросить что-то другое в принципе. Поэтому, если мы все-таки надо поднимать конфигурацию из БД, то я вынужден перехватывать те исключения, с которыми не могу справиться. А дальше выбор вообще корявый:
— перехватив DBException генерировать FileNotFoundException (маразматично, имхо);
— перехватив DBException не порождать вообще ничего. А возвращать, например, некий NullObject. Контракт соблюден, но вряд ли вызывающий код будет доволен;
— перехватив DBException прокидывать его дальше в виде RuntimeException. Которому любые контракты пофигу. Вызывающий код, если он расчитывал только на FileNotFoundException, не выживет по любому.
Т.е., если выбирать самое логичное решение с прокидыванием RuntimeException, то получается то же самое, что и в C++, но с лишними телодвижениями.
Поэтому-то я и считаю, что спецификация исключений в Java плоха тем, что в случае корявого дизайна этот дизайн оказывается забетонированным и никак его не обойдешь. За то недолгое время, когда мне довелось пророграммировать на Java, я почему-то слишком часто натыкался на подобные ляпсусы в 3rd party библиотеках, поправить которые было невозможно.
Кроме того, вообще ожидание чего-то конкретного -- это несколько наивный подход. Ну допустим, что написан код, который ждет от loadConfig только file_not_found_exception. С большой долей уверенностью можно утверждать, что это проблемный код. Поскольку при наличии в проекте исключений, вылететь может все, что угодно. Например, bad_cast или bad_alloc -- вполне себе легальные исключения. Наверняка тот, кто обещал о том, что из loadConfig будет вылетать только file_not_found_exception даже не думал, что bad_alloc может приключиться.
Так вот, если уйти от доверия спецификации исключений (в комментариях или в throw()) и ожидать, что может выскочить любое исключение, то качество кода, вызывающего loadConfig только повыситься. Ничто не запрещает этому коду ожидать file_not_found_exception в надежде, что после такого исключения можно будет восстановиться. Это нормальное ожидание. Но в добавок к этому данный код должен нормально пережить (обеспечив должные гарантии) выскакивание других исключений.
И продолжая цепочку исключений дальше, я в свое время пришел к выводу, что ценно знание всего лишь одной вещи: может бросать код исключения вообще или нет. Т.е., грубо говоря, методы должны быть помечены либо как:
// Можно ждать исключений.
shared_ptr<Config> loadConfig() throw(std::exception) = 0;
либо как
// Исключений не будет.
shared_ptr<Config> loadConfig() throw() = 0;
Однако, в C++ throw() все равно имеет мало толку, т.к. никаких проверок в compile-time не делается. Поэтому ничего не запрещает написать в C++ так:
Но вот у авторов D есть желание реализовать в языке специальный модификатор nothrow, которым можно будет помечать функции, не боросающие исключения. Такая фича была бы полезна в C++, имхо. Например, для методов swap(). В общем, надо посмотреть, что в D из этого выйдет.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>И продолжая цепочку исключений дальше, я в свое время пришел к выводу, что ценно знание всего лишь одной вещи: может бросать код исключения вообще или нет. E>Однако, в C++ throw() все равно имеет мало толку, т.к. никаких проверок в compile-time не делается.
Подпишусь под каждый словом. Нужно только это и с проверкой при компиляции (ну и соответсвующие средства, чтоб правильно прокидывать это свойства через шаблоны).
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
M>>поправочка разумеется M>>>я от ремарка просто торчу иногда... фактически он заявил, что теперь с++(по новому драфту) M>>>1. либо не сможет по стандарту поддерживать платформу, если может в своей либе реализовать многопоточность на ней.
M>>либо не сможет по стандарту поддерживать платформу, если НЕ может в своей либе реализовать многопоточность на ней.
R>На любой платформе, где есть несколько процессоров *есть* средства для реализации всего необходимого для С++. R>Про шедулеры и таймеры вообще не понял, они не имеют никакого отношения к С++.
ремарк.
для реализации таймаутов(см драфт си++), нужен обработчик аппаратного таймерного прерывания.
это прерывание должно приводить в действие механизм сталкивания тредов с каких-то очередей ожидания(где они сидят в таймаутах или слипе) и заталкивания их в очередь активных тредов шедулера, которым он будет передавать управление. кто треды то переключает на голом железе??? шедулер от аппартного прерывания.
для привешивания любого аппаратного прерывания желателен HAL, то есть слой абстракции железа.
таймеры — это обьекты сидящие в очереди, драйвером которой является тоже таймерное прерывание. там исполняется код анализа, созрел ли данный таймер, для срабатывания. если созрел, какой-то процесс может быть выведен из слипа.
ничего этого на железке нет. а если есть, то это называется как минимум микроядром.
если драфт желает переносимости своей многозадачности, то он должен сформулировать микроядро, и реализовывать его для разных железок.
до сей поры С++ обслуживал такие железки просто.
gcc имел бэкенд для данной железки, то исть генератор кода, плюс минимальная перенесенная библиотека. ну типа функций копирования пямяти и проч. лабуда. ну и менеджер памяти для работы new delete.
чтобы пустить задачу на железке этого было достаточно.
но теперь в драфте есть многозадачность! тогда давайте микроядро.
Здравствуйте, merk, Вы писали:
M>до сей поры С++ обслуживал такие железки просто. M>gcc имел бэкенд для данной железки, то исть генератор кода, плюс минимальная перенесенная библиотека. ну типа функций копирования пямяти и проч. лабуда. ну и менеджер памяти для работы new delete. M>чтобы пустить задачу на железке этого было достаточно. M>но теперь в драфте есть многозадачность!
Которая никак не помешает следовать той же самой стратегии: иметь для этой железки минимальную перенесенную библиотеку, без STL и многопоточности. В ряде случаев и сейчас для некоторых железяк программируют на C++, в котором вообще нет исключений.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
R>>На любой платформе, где есть несколько процессоров *есть* средства для реализации всего необходимого для С++. R>>Про шедулеры и таймеры вообще не понял, они не имеют никакого отношения к С++.
M>ремарк. M>для реализации таймаутов(см драфт си++), нужен обработчик аппаратного таймерного прерывания. M>это прерывание должно приводить в действие механизм сталкивания тредов с каких-то очередей ожидания(где они сидят в таймаутах или слипе) и заталкивания их в очередь активных тредов шедулера, которым он будет передавать управление. кто треды то переключает на голом железе??? шедулер от аппартного прерывания. M>для привешивания любого аппаратного прерывания желателен HAL, то есть слой абстракции железа. M>таймеры — это обьекты сидящие в очереди, драйвером которой является тоже таймерное прерывание. там исполняется код анализа, созрел ли данный таймер, для срабатывания. если созрел, какой-то процесс может быть выведен из слипа. M>ничего этого на железке нет. а если есть, то это называется как минимум микроядром. M>если драфт желает переносимости своей многозадачности, то он должен сформулировать микроядро, и реализовывать его для разных железок.
M>до сей поры С++ обслуживал такие железки просто. M>gcc имел бэкенд для данной железки, то исть генератор кода, плюс минимальная перенесенная библиотека. ну типа функций копирования пямяти и проч. лабуда. ну и менеджер памяти для работы new delete. M>чтобы пустить задачу на железке этого было достаточно. M>но теперь в драфте есть многозадачность! тогда давайте микроядро.
Опять мимо. Что бы быть полностью совместимой с ISO стандартом реализации С++ (на голой железяке) не обязательно реализовывать многопоточность. Это будет называться freestanding реализация. Требования к freestanding реализации полностью определены ISO C++ стандартом (17.4.1.4/2).
Т.ч. не волнуйся, С++ по прежнему просто будет обслуживать такие железяки.
Здравствуйте, remark, Вы писали:
R>Здравствуйте, merk, Вы писали:
R>>>На любой платформе, где есть несколько процессоров *есть* средства для реализации всего необходимого для С++. R>>>Про шедулеры и таймеры вообще не понял, они не имеют никакого отношения к С++.
M>>ремарк. M>>для реализации таймаутов(см драфт си++), нужен обработчик аппаратного таймерного прерывания. M>>это прерывание должно приводить в действие механизм сталкивания тредов с каких-то очередей ожидания(где они сидят в таймаутах или слипе) и заталкивания их в очередь активных тредов шедулера, которым он будет передавать управление. кто треды то переключает на голом железе??? шедулер от аппартного прерывания. M>>для привешивания любого аппаратного прерывания желателен HAL, то есть слой абстракции железа. M>>таймеры — это обьекты сидящие в очереди, драйвером которой является тоже таймерное прерывание. там исполняется код анализа, созрел ли данный таймер, для срабатывания. если созрел, какой-то процесс может быть выведен из слипа. M>>ничего этого на железке нет. а если есть, то это называется как минимум микроядром. M>>если драфт желает переносимости своей многозадачности, то он должен сформулировать микроядро, и реализовывать его для разных железок.
M>>до сей поры С++ обслуживал такие железки просто. M>>gcc имел бэкенд для данной железки, то исть генератор кода, плюс минимальная перенесенная библиотека. ну типа функций копирования пямяти и проч. лабуда. ну и менеджер памяти для работы new delete. M>>чтобы пустить задачу на железке этого было достаточно. M>>но теперь в драфте есть многозадачность! тогда давайте микроядро.
R>Опять мимо. Что бы быть полностью совместимой с ISO стандартом реализации С++ (на голой железяке) не обязательно реализовывать многопоточность. Это будет называться freestanding реализация. Требования к freestanding реализации полностью определены ISO C++ стандартом (17.4.1.4/2). R>Т.ч. не волнуйся, С++ по прежнему просто будет обслуживать такие железяки.
ремарк, ты нездоровый ваще. я пишу ему реплику на его мнение, что на железяках мол все есть, для реализации многопоточности(через пост выше), и мол зачем там ваще таймеры и прерывания???, пишу ему — зачем! и что он аццки заблуждается...в ответ он выкатывает, что — а мол там и многопоточности не надо.
то есть сначала — все есть и тип топ...
а потом — а там и не надо.
ну как на такое реагировать????
R>
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, crable, Вы писали:
[кусь]
E>В C++, если спецификация исключений выполняется лишь на уровне комментариев, то разработчик производного класса может без проблем выбросить любое другое исключение. Да, код, который ожидал только file_not_found_exception не выживет. Исключение поднимится куда-то вверх по иерархии. И рано или поздно где-то проблема будет диагностированна.
E>В Java же спецификации исключений не дают возможности выбросить что-то другое в принципе. Поэтому, если мы все-таки надо поднимать конфигурацию из БД, то я вынужден перехватывать те исключения, с которыми не могу справиться. А дальше выбор вообще корявый: E>- перехватив DBException генерировать FileNotFoundException (маразматично, имхо); E>- перехватив DBException не порождать вообще ничего. А возвращать, например, некий NullObject. Контракт соблюден, но вряд ли вызывающий код будет доволен;
+1, не самые лучшие варианты.
E>- перехватив DBException прокидывать его дальше в виде RuntimeException. Которому любые контракты пофигу. Вызывающий код, если он расчитывал только на FileNotFoundException, не выживет по любому.
Так этот код и не должен выжить. В контракте прописано, что конфигурация либо будет загружена либо вылетит FileNotFoundException. Если реализация не может выполнить контракт, то RuntimeException тут наиболее верное решение
E>Т.е., если выбирать самое логичное решение с прокидыванием RuntimeException, то получается то же самое, что и в C++, но с лишними телодвижениями.
E>Поэтому-то я и считаю, что спецификация исключений в Java плоха тем, что в случае корявого дизайна этот дизайн оказывается забетонированным и никак его не обойдешь. За то недолгое время, когда мне довелось пророграммировать на Java, я почему-то слишком часто натыкался на подобные ляпсусы в 3rd party библиотеках, поправить которые было невозможно.
А как его можно обойти в C++? Ты же сам говоришь, что при выкидывании RuntimeException получается то же самое, что и в C++, но в Java мы хотя бы получим ошибку компиляции и с большей вероятностью заметим эту самую ошибку дизайна. Во всяком случае, я бы не назвал спецификацию исключений однозначно минусом Java.
E>Кроме того, вообще ожидание чего-то конкретного -- это несколько наивный подход. Ну допустим, что написан код, который ждет от loadConfig только file_not_found_exception. С большой долей уверенностью можно утверждать, что это проблемный код. Поскольку при наличии в проекте исключений, вылететь может все, что угодно. Например, bad_cast или bad_alloc -- вполне себе легальные исключения. Наверняка тот, кто обещал о том, что из loadConfig будет вылетать только file_not_found_exception даже не думал, что bad_alloc может приключиться.
Так и думал, что меня неправильно поймут. Да, вылететь может все-что угодно, но мы не всегда можем корректно обработать все возможные виды исключений в одном месте. Если код ожидал только file_not_found_exception, то bad_alloc или bad_cast полетят дальше и будут обработаны кодом, который знает, что делать с этими исключениями. Проблемы будут если написать что-то вроде
void load_config()
{
try
{
scoped_ptr<config_t> config(new db_config_t());
...
config->load_config();
...
}
catch (file_not_found_exception const &)
{
cout << "Неправильный путь конфигурационного файла.\n";
}
}
int main()
{
try
{
...
load_config();
...
}
catch (bad_alloc const &)
{
cout << "Для выполнения операции недостаточно памяти.\n";
}
catch (exception const &e)
{
cout << "В приложении возникла неустранимая ошибка. Пожалуйста обратитесь в службу технической поддержки и blah-blah-blah.\n";
send_bug_report(e);
}
}
E>Так вот, если уйти от доверия спецификации исключений (в комментариях или в throw()) и ожидать, что может выскочить любое исключение, то качество кода, вызывающего loadConfig только повыситься. Ничто не запрещает этому коду ожидать file_not_found_exception в надежде, что после такого исключения можно будет восстановиться. Это нормальное ожидание. Но в добавок к этому данный код должен нормально пережить (обеспечив должные гарантии) выскакивание других исключений.
Так я и не спорю, что код должен себя вести корректно при возникновении других исключений. Вообще, чем-то смахивает на спор между сторонниками строгой типизации и динамической. Мне лично, кажется, что однозначного ответа, что лучше, тут нет.
E>И продолжая цепочку исключений дальше, я в свое время пришел к выводу, что ценно знание всего лишь одной вещи: может бросать код исключения вообще или нет. Т.е., грубо говоря, методы должны быть помечены либо как: E>
E>// Можно ждать исключений.
E>shared_ptr<Config> loadConfig() throw(std::exception) = 0;
E>
E>либо как E>
E>// Исключений не будет.
E>shared_ptr<Config> loadConfig() throw() = 0;
E>
E>Однако, в C++ throw() все равно имеет мало толку, т.к. никаких проверок в compile-time не делается. Поэтому ничего не запрещает написать в C++ так: E>
E>Но вот у авторов D есть желание реализовать в языке специальный модификатор nothrow, которым можно будет помечать функции, не боросающие исключения. Такая фича была бы полезна в C++, имхо. Например, для методов swap(). В общем, надо посмотреть, что в D из этого выйдет.
А как оно будет себя вести с функциями не имеющими спецификации, но для которых, тем не менее, известно, что они не выбрасывают исключений?
The last good thing written in C was Franz Schubert's Symphony No. 9.
Здравствуйте, merk, Вы писали:
M>Здравствуйте, remark, Вы писали:
R>>Здравствуйте, merk, Вы писали:
R>>>>На любой платформе, где есть несколько процессоров *есть* средства для реализации всего необходимого для С++. R>>>>Про шедулеры и таймеры вообще не понял, они не имеют никакого отношения к С++.
[кусь]
R>>Опять мимо. Что бы быть полностью совместимой с ISO стандартом реализации С++ (на голой железяке) не обязательно реализовывать многопоточность. Это будет называться freestanding реализация. Требования к freestanding реализации полностью определены ISO C++ стандартом (17.4.1.4/2). R>>Т.ч. не волнуйся, С++ по прежнему просто будет обслуживать такие железяки.
M>ремарк, ты нездоровый ваще. я пишу ему реплику на его мнение, что на железяках мол все есть, для реализации многопоточности(через пост выше), и мол зачем там ваще таймеры и прерывания???, пишу ему — зачем! и что он аццки заблуждается...в ответ он выкатывает, что — а мол там и многопоточности не надо. M>то есть сначала — все есть и тип топ... M>а потом — а там и не надо. M>ну как на такое реагировать????
Внимательнее читать? Да, там где несколько процессоров, есть все, что надо, чтобы реализовать поддержку многопоточности в C++. Но при этом, никто не заставляет ее реализовывать, если она не нужна.
R>>
The last good thing written in C was Franz Schubert's Symphony No. 9.
Здравствуйте, crable, Вы писали:
C>Здравствуйте, merk, Вы писали:
M>>Здравствуйте, remark, Вы писали:
R>>>Здравствуйте, merk, Вы писали:
R>>>>>На любой платформе, где есть несколько процессоров *есть* средства для реализации всего необходимого для С++. R>>>>>Про шедулеры и таймеры вообще не понял, они не имеют никакого отношения к С++.
C>[кусь]
R>>>Опять мимо. Что бы быть полностью совместимой с ISO стандартом реализации С++ (на голой железяке) не обязательно реализовывать многопоточность. Это будет называться freestanding реализация. Требования к freestanding реализации полностью определены ISO C++ стандартом (17.4.1.4/2). R>>>Т.ч. не волнуйся, С++ по прежнему просто будет обслуживать такие железяки.
M>>ремарк, ты нездоровый ваще. я пишу ему реплику на его мнение, что на железяках мол все есть, для реализации многопоточности(через пост выше), и мол зачем там ваще таймеры и прерывания???, пишу ему — зачем! и что он аццки заблуждается...в ответ он выкатывает, что — а мол там и многопоточности не надо. M>>то есть сначала — все есть и тип топ... M>>а потом — а там и не надо. M>>ну как на такое реагировать????
C>
C>Внимательнее читать? Да, там где несколько процессоров, есть все, что надо, чтобы реализовать поддержку многопоточности в C++. Но при этом, никто не заставляет ее реализовывать, если она не нужна.
R>>>
прогулка на свежем воздухе поможет вашей сообразительности коллега.
я могу создать свою железку на двуядерном атлоне(теоретически), и никто мне ничего не обеспечит. никакая будущая система с++ генерящая код для атлона не содержит по драфту в себе микроядра, что я должен запустить на этой своей системе. несмотря на то, что сам проц поддерживается.
вы смотрели на мать-плату? там что, только один проц? вот его команды с++ подерживает(если компилятор перенесен), но там есть еще квадратики, которые абстрагируются от с++ микроядром, и превращаются в вызовы чего-то там, необходимые для реализации многозадачности от драфта.
покажите того, кому не нужна многозадачность(как ви тут говорите), и я скажу, что он программирует детские будильники. это фигурально
Здравствуйте, crable, Вы писали:
C>А как оно будет себя вести с функциями не имеющими спецификации, но для которых, тем не менее, известно, что они не выбрасывают исключений?
А в чем проблема добавить этот признак?
А если нельзя добавить — в чем проблема написать тупую обертку, которая уже будет иметь этот признак?
Здравствуйте, merk, Вы писали:
M>Здравствуйте, crable, Вы писали:
C>>Здравствуйте, merk, Вы писали:
M>>>Здравствуйте, remark, Вы писали:
R>>>>Здравствуйте, merk, Вы писали:
R>>>>>>На любой платформе, где есть несколько процессоров *есть* средства для реализации всего необходимого для С++. R>>>>>>Про шедулеры и таймеры вообще не понял, они не имеют никакого отношения к С++.
C>>[кусь]
R>>>>Опять мимо. Что бы быть полностью совместимой с ISO стандартом реализации С++ (на голой железяке) не обязательно реализовывать многопоточность. Это будет называться freestanding реализация. Требования к freestanding реализации полностью определены ISO C++ стандартом (17.4.1.4/2). R>>>>Т.ч. не волнуйся, С++ по прежнему просто будет обслуживать такие железяки.
M>>>ремарк, ты нездоровый ваще. я пишу ему реплику на его мнение, что на железяках мол все есть, для реализации многопоточности(через пост выше), и мол зачем там ваще таймеры и прерывания???, пишу ему — зачем! и что он аццки заблуждается...в ответ он выкатывает, что — а мол там и многопоточности не надо. M>>>то есть сначала — все есть и тип топ... M>>>а потом — а там и не надо. M>>>ну как на такое реагировать????
C>>
C>>Внимательнее читать? Да, там где несколько процессоров, есть все, что надо, чтобы реализовать поддержку многопоточности в C++. Но при этом, никто не заставляет ее реализовывать, если она не нужна.
R>>>>
M>прогулка на свежем воздухе поможет вашей сообразительности коллега.
Вы считаете, я что-то не то написал? Может тогда, скажете, в чем моя ошибка или Вам нечего возразить по существу?
M>я могу создать свою железку на двуядерном атлоне(теоретически), и никто мне ничего не обеспечит. никакая будущая система с++ генерящая код для атлона не содержит по драфту в себе микроядра, что я должен запустить на этой своей системе. несмотря на то, что сам проц поддерживается. M>вы смотрели на мать-плату? там что, только один проц? вот его команды с++ подерживает(если компилятор перенесен), но там есть еще квадратики, которые абстрагируются от с++ микроядром, и превращаются в вызовы чего-то там, необходимые для реализации многозадачности от драфта. M>покажите того, кому не нужна многозадачность(как ви тут говорите), и я скажу, что он программирует детские будильники. это фигурально
В этой теоретической железке будет все, что нужно для многопоточности? Думаю, будет. Если Вам нужна будет поддержка многопоточности для этой железки в C++ или в любом другом языке, то, ок, Вам понадобится это микроядро, что из этого?
The last good thing written in C was Franz Schubert's Symphony No. 9.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, crable, Вы писали:
C>>А как оно будет себя вести с функциями не имеющими спецификации, но для которых, тем не менее, известно, что они не выбрасывают исключений?
J>А в чем проблема добавить этот признак? J>А если нельзя добавить — в чем проблема написать тупую обертку, которая уже будет иметь этот признак?
Эээ... думаю ни в чем, только писанины может быть много мне правда было интересно узнать подробнее, работы этой спецификации в D и как это будет работать для функций без спецификаций.
The last good thing written in C was Franz Schubert's Symphony No. 9.
C>В этой теоретической железке будет все, что нужно для многопоточности? Думаю, будет. Если Вам нужна будет поддержка многопоточности для этой железки в C++ или в любом другом языке, то, ок, Вам понадобится это микроядро, что из этого?
теоретически там будет все. если там есть аппаратный таймер, память, проц и источник питания. по теории этого достаточно. тока я не об этой "теории".
Гхм... первую часть выкинули, ну да ладно.
C>>В этой теоретической железке будет все, что нужно для многопоточности? Думаю, будет. Если Вам нужна будет поддержка многопоточности для этой железки в C++ или в любом другом языке, то, ок, Вам понадобится это микроядро, что из этого?
M>теоретически там будет все. если там есть аппаратный таймер, память, проц и источник питания. по теории этого достаточно. тока я не об этой "теории".
Так о чем же? Если многопоточность нужна ее можно сделать и в стандарте описаны примитивы, которые позволяют создавать кросс-платформенный многопоточный код, что же Вас не устраивает?
The last good thing written in C was Franz Schubert's Symphony No. 9.
Здравствуйте, crable, Вы писали:
E>>- перехватив DBException прокидывать его дальше в виде RuntimeException. Которому любые контракты пофигу. Вызывающий код, если он расчитывал только на FileNotFoundException, не выживет по любому.
C>Так этот код и не должен выжить. В контракте прописано, что конфигурация либо будет загружена либо вылетит FileNotFoundException. Если реализация не может выполнить контракт, то RuntimeException тут наиболее верное решение
Так проблема не в том, может реализация выполнить контракт или не может. А в том, что Java позволяет зафиксировать намертво дурацкие контракты.
C>А как его можно обойти в C++?
А в C++ не нужно обходить (как и в C# или Python/Ruby). Генери себе какие хош исключения и все дела Лишь бы они от std::exception были производными
C>Ты же сам говоришь, что при выкидывании RuntimeException получается то же самое, что и в C++, но в Java мы хотя бы получим ошибку компиляции и с большей вероятностью заметим эту самую ошибку дизайна.
Мы ее и так заметим. Только если это чужая ошибка и исправить мы ее не можем, то нас компилятор в нее будет тыкать снова и снова.
C>Во всяком случае, я бы не назвал спецификацию исключений однозначно минусом Java.
Ну разработчики C#, надо полагать, были больше солидарны со мной
C>Так и думал, что меня неправильно поймут.
Я понял правильно. И так же ошибочным называл твой первый пример.
C>
А такому коду, вообще-то говоря, строгая специализация исключений и не нужна.
E>>Но вот у авторов D есть желание реализовать в языке специальный модификатор nothrow, которым можно будет помечать функции, не боросающие исключения. Такая фича была бы полезна в C++, имхо. Например, для методов swap(). В общем, надо посмотреть, что в D из этого выйдет.
C>А как оно будет себя вести с функциями не имеющими спецификации, но для которых, тем не менее, известно, что они не выбрасывают исключений?
Пока nothrow еще не реализовали, так что не могу сказать, что в результате будет. Но идея, насколько я понимаю, такова:
// Не бросает исключений.void f() nothrow { ... }
// Может бросать исключения.void g() { ... }
Если у функции g() нет nothrow, то компилятор будет считать, что она может бросать исключения. И ее вызов внутри f() должен расматриваться как ошибочный.
Вообще-то D является какой-то вариацией на тему managed языков, в которых исключения, в принципе, могут бросаться всегда. Имхо, в D достаточно мало инструкций, которые гарантировано не бросают исключений. Поэтому спецификатор nothrow будет использоваться не так уж и часто.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
C>Эээ... думаю ни в чем, только писанины может быть много мне правда было интересно узнать подробнее, работы этой спецификации в D и как это будет работать для функций без спецификаций.
ну, если предусмотреть блочное навешивание этого признака, по типу extern "C" — то и обертки писать не придется.
C>The last good thing written in C was Franz Schubert's Symphony No. 9.
А для C# — "Лунная соната"?
Здравствуйте, remark, Вы писали:
R>>>Мммм... что-то на такой ноте не хочется заканчивать пост... Но зато это — самый крутой язык
M>>1. никакой язык самостоятельной ценности не имеет. ценность имеет только то, насколько он способствует производству надежного, и хорошо сопровождаемого и эффективного ПО, с минимальными затратами разнообразных ресурсов, — человеческих, временных, финансовых. поскольку именно для этого язык и предназначен. M>>любить язык сам по себе — род фетишизма.
R>Значит я — фетишист С++ R>Надо будет подумать об открытии Клуба С++ фетишистов
Кстати, да! Но автор цитируемого топика тоже прав в достаточной мере. Додиез сам по себе язык — не очень. Но у него мощная библиотека поддержки и, самое главное, прекрасная интегрированная среда, заточенная под определенный вид приложений. Очень хорошо заточенная.
В отличие от С++, к сожалению.
С++|CLI выглядит на фоне Додиеза слабой поделкой, попыткой прилепиться к "магистральной линии партии".
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
проистекает из того факта, что на C++ делали и, наверное, делают гораздо больше, чем следовало бы. Уж не знаю, с чем это связано (со слабостью компьютеров, дешевизной C++компиляторов по сравнению с компиляторами других языков, проникновением C++ в ВУЗы, существованием вокруг C++ ореола "крутого языка"), но тем не менее. Сейчас развитие как аппаратных средств, так и языков программирования (включая себя виртуальные машины, алгоритмы сборки мусора, JIT компиляцию и пр.) предоставляет разработчикам возможности более быстрого получения приемлимых результатов. В условиях современного бизнеса, когда срок сдачи "вчера", а четкие требования появятся только "завтра", и когда заказчика удовлетворяет быстро введенная в эксплуатацию, но глючная версия, это очень и очень большое конкурентное преимущество.
Во-первых, конечно, да, вначале надо определиться о каком Мире мы говорим. Для внутреннего, одноразового и т.д. ПО, да, самое подходящее средство — то, которое позволяет получить приемлемый результат как можно быстрее. Понятно, что С++ при прочих раных тут не подходит. За сим предлагаю такое ПО больше не рассматривать.
E>При этом для многих проектов на первых этапах их существования вообще нет вопросов узких мест и, соответственно, необходимости опускаться на самые низкие уровни при программировании. В качестве примера подобных маразматических, в общем-то, вещей можно вязать web-приложения на Ruby-On-Rails, развернутые на тысячах(!) серверов. Т.е. разница в скорости разработки каких-то вещей конкретными людьми на C++ и Ruby такова, что позволяет спокойно покупать и обслуживать в десять раз больше серверов, чем в случае C++ реализации. Может быть сегодняшная Web-ориентация (а мне кажется, что web-ориентированные продукты сейчас являются менйстримом) со временем сменится на что-то другое, но пока это так. Средней руки server-side на Java с кластеризацией и отказоустойчивостью, поддержкой разных типов БД и различных Web-стандартов сейчас собирается из имеющихся компонентов гораздо проще, чем на C++.
А вот по-поводу web-приложений позволю не согласиться. Я думаю, что когда компании переходят с одного сервера на 2, потом на 4, то они радуются — вот как быстро мы разработали, а теперь так просто можем ещё и промасштабировать это. Когда они переходят на 10-20 — уже начинают подозревать что-то неладное. Когда переваливают за 100 серверов — понимают, что в ловушке — железо становится основной статьей расходов, а что делать уже не понятно, остаётся только докупать ещё сервера, тем самым ещё усугубляя проблему.
Простая математика. 1000 серверов — $1000000 на покупку. + каждый день выходит из строя по 1 серверу — каждый день надо покупать по новому — $30000 в месяц. + электропитание/охлаждение — затрудняюсь сказать сколько в $-эквиваленте, но я думаю, что не меньше $20000 в месяц. + обслуживание железа и ПО. + аренда за площади. Такие суммы получаются, что проще, что бы 10 С++ программистов поработали год. Хорошая архитектура и реализация способна увеличить производительность ~ в 100 раз. Я знаю одну компанию в сфере VoIP, которая обслуживает своими силами сотни клиентов, миллионы минут в день, + часть голосового трафика и всё это работает на... 1 машине. И это чистый С + 1 программист. Программист, правда, понятно, что это не первый попавшийся программист-студент за $1000/мес.
Здравствуйте, eao197, Вы писали:
E>Поэтому количество ниш, в которых C++ был бы действительно стоящим выбором (как раз потому, что позволяет работать как на низком, так и на высоком уровне) сокращается и, надо полагать, будет сокращаться. И это нормально, хотя и неприятно для тех, кто привык работать на C++.
Здравствуйте, remark, Вы писали:
R>Для внутреннего, одноразового и т.д. ПО, да, самое подходящее средство — то, которое позволяет получить приемлемый результат как можно быстрее. Понятно, что С++ при прочих раных тут не подходит.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, remark, Вы писали:
R>>Для внутреннего, одноразового и т.д. ПО, да, самое подходящее средство — то, которое позволяет получить приемлемый результат как можно быстрее. Понятно, что С++ при прочих раных тут не подходит.
RO>См. ICFP 2004
Здравствуйте, remark, Вы писали:
R>А вот по-поводу web-приложений позволю не согласиться. Я думаю, что когда компании переходят с одного сервера на 2, потом на 4, то они радуются — вот как быстро мы разработали, а теперь так просто можем ещё и промасштабировать это. Когда они переходят на 10-20 — уже начинают подозревать что-то неладное. Когда переваливают за 100 серверов — понимают, что в ловушке — железо становится основной статьей расходов, а что делать уже не понятно, остаётся только докупать ещё сервера, тем самым ещё усугубляя проблему. R>Простая математика. 1000 серверов — $1000000 на покупку. + каждый день выходит из строя по 1 серверу — каждый день надо покупать по новому — $30000 в месяц. + электропитание/охлаждение — затрудняюсь сказать сколько в $-эквиваленте, но я думаю, что не меньше $20000 в месяц. + обслуживание железа и ПО. + аренда за площади. Такие суммы получаются, что проще, что бы 10 С++ программистов поработали год.
Ситуация, насколько я ее понимаю, обычно другая -- нет года для того, чтобы C++ программисты разработали программу, выдерживающую аналогичную нагрузку на гораздо меньшем количестве серверов. Новый сервис нужно выкатить пользователям прямо сейчас. Даже не через неделю.
R>Хорошая архитектура и реализация способна увеличить производительность ~ в 100 раз. Я знаю одну компанию в сфере VoIP, которая обслуживает своими силами сотни клиентов, миллионы минут в день, + часть голосового трафика и всё это работает на... 1 машине. И это чистый С + 1 программист. Программист, правда, понятно, что это не первый попавшийся программист-студент за $1000/мес.
Проблема в том, что таких программистов не может быть много в принципе. Я бы, например, так не смог бы. На все задачи корифеев не хватит. Нужно как-то ориентироваться на средний уровень. А в последнее время -- и на уровень ниже среднего.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, remark, Вы писали:
R>>>Для внутреннего, одноразового и т.д. ПО, да, самое подходящее средство — то, которое позволяет получить приемлемый результат как можно быстрее. Понятно, что С++ при прочих раных тут не подходит.
RO>>См. ICFP 2004 ;-) R>А что конкретно смотреть? И как это релевантно?
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, remark, Вы писали:
R>>>>Для внутреннего, одноразового и т.д. ПО, да, самое подходящее средство — то, которое позволяет получить приемлемый результат как можно быстрее. Понятно, что С++ при прочих раных тут не подходит.
RO>>>См. ICFP 2004 R>>А что конкретно смотреть? И как это релевантно?
RO>http://alliance.seas.upenn.edu/~plclub/cgi-bin/contest/results.php#lightning RO>
The judges hastily declare:
RO>“Java and C++ are very suitable for rapid prototyping.”
Хммм... я то думал, что на таких мероприятиях как минимум сжигают чeчело С++ программиста под всеобщие аплодисменты...
Здравствуйте, eao197, Вы писали:
R>>Хорошая архитектура и реализация способна увеличить производительность ~ в 100 раз. Я знаю одну компанию в сфере VoIP, которая обслуживает своими силами сотни клиентов, миллионы минут в день, + часть голосового трафика и всё это работает на... 1 машине. И это чистый С + 1 программист. Программист, правда, понятно, что это не первый попавшийся программист-студент за $1000/мес.
E>Проблема в том, что таких программистов не может быть много в принципе.
There is also lots of anecdotal support for the large variation between programmers. During the time I was at Boeing in the mid 1980s, there was a project that had about 80 programmers working on it that was at risk of missing a critical deadline. The project was critical to Boeing, and so they moved most of the 80 people off that project and brought in one guy who finished all the coding and delivered the software on time. I didn't work on that project, and I didn't know the guy, so I'm not 100% sure the story is even true. But I heard the story from someone I trusted, and it seemed true at the time.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
R>>>Хорошая архитектура и реализация способна увеличить производительность ~ в 100 раз. Я знаю одну компанию в сфере VoIP, которая обслуживает своими силами сотни клиентов, миллионы минут в день, + часть голосового трафика и всё это работает на... 1 машине. И это чистый С + 1 программист. Программист, правда, понятно, что это не первый попавшийся программист-студент за $1000/мес.
E>>Проблема в том, что таких программистов не может быть много в принципе.
E>Кстати, забавная байка в тему, Productivity Variations Among Software Developers and Teams: The Origin of "10x"
Самые шустрые студенты заканчивают эти задачи в три или четыре раза быстрее, чем средние студенты, и — ни много ни мало — в десять раз быстрее самых медленных. Более того, если вы внимательно посмотрите на эти данные, то станет ясно, что видимой зависимости между временем и оценкой нет. Качество работы и время, на нее затраченное, — эти параметры попросту не кореллируют.
Еще один минус:
То что в с++ можно неявно использовать с.
Т.е. в коде на с++ разрешается вызов с-функций( mem***, str***, free, ...).
Имхо, нужно запретить неявное использование с-конструкций и оставить доступ к ним тока через с-вставки экстерн си.
Здравствуйте, merk, Вы писали:
M>...а если ось как платформа не соотвуствует взглядам с++ на многопоточность...а? криво-отображать, авось как-нить зашевелится?
Чиста совет: Перед обсуждением документа, стоит таки с ним ознакомится. Содержательности в обсуждение сильно добавится
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
А>Вот в том и фишка, до сих пор в С++ не было ниче такого, чего не было на какихлибо существующих платформах.
Про исключения на ранних версиях симбиан, например, слышал?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
А>>Вот в том и фишка, до сих пор в С++ не было ниче такого, чего не было на какихлибо существующих платформах. E>Про исключения на ранних версиях симбиан, например, слышал?
Это ты к чему?