При всём уважении к труду… я не совсем понимаю, зачем нужны «однострочники» на C++.
Одно дело какой-нибудь powershell, где нужно в командной строке набрать строчку и получить результат.
И совсем другое дело — компилируемый язык, где разницы между одной строчкой и десятью строчками нет.
У меня все программы состоят из однострочников примерно такого вида:
class X {
public: void f();
void g(int x);
int h(double a, double b);
};
А что находится в cpp-модуле — какая кому разница?
Хорошо, нормальный человек не будет отказываться от полезного совета.
Но выдавать отсутствие какой-либо возможности языка за его плюс — довольно странно. Пусть есть альтернатива, но оставьте мне и мой старый способ.
Копирование — это всего лишь способ организации доступа. Если ваши идеи начнут воплощать в жизнь, софт тупо переедет в онлайн-форму и будет людям выделяться по подписке. Всего $10 за месяц доступа к онлайн-фотошопу. За одновременное висение под одним паролем в онлайне пожизненный бан аккаунта. Тогда претензий у вас не будет — копии же не продают. Но легче тоже не будет никому.
Я вообще не понимаю, откуда берутся холиворы на эту тему. Свобода лучше, чем несвобода. Сейчас у разработчиков есть полная свобода выбора бизнес-модели. Хочешь — продавай по старинке, хочешь — делай онлайн доступ, хочешь — краудсорсь или просто раздавай бесплатно.
Пользователи тоже могут брать софт, разработанный любым описанным способом. Казалось бы, вот оно счастье. Ан нет, надо обязательно чего-то там запрещать и регулировать.
Когда-то читал, что основные деньги MS делает на пакете MS Office. Операционная система для них далеко не главное. Вернее, это необходимая подложка для Office :)
> Функц.: Зачем она тебе? Какую задачу ты хочешь решить.
Честно говоря, не хотел бы слышать такое от коллег. Мне она затем, что я так хочу. Что мне так удобно. Если я вычисляю математическое выражение, может, функциональный стиль окажется удобнее, но если я пишу управляющий скрипт для робота, гуляющего по комнате, оставьте мне возможность сочинить императивную инструкцию — какой мотор когда запустить, и в какую сторону когда повернуть.
Поэтому хорошие языки поддерживают обе эти парадигмы. Хочешь — пиши функционально, не хочешь — императивно.
По сравнению с C# и Java стандартизация в C++ вообще слабая часть, как-то они очень медленно всё делают. Куча опций, которым давно место в стандарте, до сих пор находятся в де-факто стандартных библиотеках, это правда.
На Haskell нельзя написать систему реального времени (например, для встроенного прибора для самолёта), потому что в любой момент может запуститься garbage collector и удлинить конкретный шаг цикла. Аналогично работает механизм ленивых вычислений — два вызова функции f(x) могут отличаться по скорости в неопределённое количество раз. Я понимаю, что этот механизм полезен, но вот его ограничение.
Далее, я не совсем понимаю, как на Haskell реализовать прямой доступ к памяти. Допустим, у меня есть девайс, в котором экран отображается на оперативную память. Мне надо нарисовать на экране окружность; нужен прямой доступ к конкретным физическим адресам.
Библиотека контейнеров. Вот здесь я не так уверен, но насколько знаю, на Haskell «из коробки» нет такого обилия структур данных (массивы, ассоциативные массивы, деревья, хэш-таблицы, списки, деки) как в C++ или даже в Java. Я понимаю, что всё это реализовать МОЖНО, но одно дело можно, а другое — уже есть.
Вообще со времён развития Java мне окончательно стало ясно, что язык уже не так важен, как вся экосистема вокруг него. Есть библиотека функций — есть язык. Нет библиотеки — нет языка, как хорош бы он ни был.
Подключиться к сети с MPI-интерфейсом, загрузить JPG файл, открыть zip-архив, работать с графами, складывать и пересчитывать даты-времена, читать xml файлы, разбирать регулярные выражения, преобразовывать строки из unicode в ascii с учётом локали, выполнять математические алгоритмы — для всего этого есть либо решение «из коробки», либо де-факто стандарты.
Ну это даже не смешно. Приведённые языки совершенно другого рода, абсолютно не совпадающие с задачами C++. А какие аргументы нужны? Я должен на полном серьёзе сейчас объяснять здесь разницу между C++ и Haskell?
Есть такая вещь как швейцарский нож. Там внутри всё. Если там совсем всё, это довольно уродливый инструмент, но универсальный. Во многих задачах эта универсальность полезна.
Я не вижу второго такого ножа. Если в силу невежества — укажите мне его.
Вот и всё, что хотел сказать. Если не удалось с первого раза, приношу извинения. Надеюсь, со второго раза получилось.
Если вырезать энтропию из вашей реплики, получится: «каждая фича C++ реализована где-то». Это и так очевидно, C++ никогда не претендовал на революционность. Вот вы лучше назовите хоть один язык, где все те же фичи реализованы вместе, а не по отдельности. По отдельности я и так знаю.
Поэтому не будем тратить время на общие слова что такое шаблоны или перегрузка операторов. Название языка в студию, пожалуйста.
А мои знания языков здесь не при чём. С ними как раз всё в порядке.
По поводу (1). Если на то пошло, Степанов не апологет C++, там совсем другая история. Он искал язык, где можно воплотить идеи обобщённого программирования. И не нашёл ничего кроме Ады. Лишь позже шаблоны встроили в C++, и ему удалось добиться более широкого признания.
По поводу (2) — я не понял смысла фразы (т.е. в чём месседж? не призывы ко мне, а на что надо конкретно обратить внимание?)
«Откуда я знаю, что в C++ есть то, чего нет нигде»? Хороший вопрос. Я не знаю. У меня нет времени выучить все 3000 языков программирования.
Скажем, объекты уже есть практически везде, окей.
Шаблоны — в Java недавно появились, в C# тоже. При этом до сих пор их поддержка отстаёт (позже вышли).
Метапрограммирование — вообще не знаю, где оно есть за пределами C++ (берём популярные языки).
Препроцессор (с помощью которого реализуют кучу нетривиальных вещей) — почти нигде нет, потому что он ещё в C был объявлен «злом», и от него избавляются.
Множественное наследование — иногда полезно, где оно?
А мне казалось, в научных вычислениях такие вещи как std::vector или std::map просто напрашиваются. Не представляю, как без них жить.
Ну и всякие токенизаторы из буста — даже банальный csv файл разбирать самостоятельным кодом? (Хотя такие вещи уже наверняка вынесены в библиотеки). Или ввод-вывод строк — в C тоже морока.
Я не могу говорить за все 3000 языков программирования, так что это задача непосильная. Всегда может найтись человек, который скажет: а вы не рассмотрели язык X. В своё время автор STL Степанов сказал в интервью:
«At present C++ is the best vehicle for this style of programming. I have tried different languages and I think that C++ allows this marvelous combination of abstractness and efficiency. However, I think that it is possible to design a language based on C and on many of the insights that C++ brought into the world, a language which is more suitable to this style of programming, which lacks some of the deficiencies of C++, in particular its enormous size.»
Но это было давно. Может, чего-то изменилось. Но если посмотреть на разнообразие буста, подозреваю, что всё так до сих пор. Язык, на котором можно реализовать все эти вещи, будет столь же монструозным. Выбросим препроцессор? Не будет Boost.Preprocessor. Выбросим шаблоны? Не будет Boost.MPL и так далее. А если мы всё это воткнём, здравствуй снова C++. Скажем, из простого языка для студентов Java всё больше превращается в такое же болото. То же самое происходит с C#. Конечно, мы радуемся шаблонам и всяким lambda-штучкам, но язык от них проще не становится.
Мне кажется, C++ суждено быть здесь ещё очень долго, потому что именно его устаревшие и во многом трудные для понимания и использования особенности делают возможным реализацию всяких нетривиальностей (что на том же бусте вытворяют, рассказывать не надо). Я не знаю, когда все аналоги удастся реализовать на других языках.
Другое дело, что C++ превращается во что-то монструозное, и доля программистов, способных по-настоящему полноценно его использовать, падает. Какой-то тупик.
Так-то оно так, но у каждого преподавателя своя методика. Одно дело разъяснить конкретный момент, и совсем другое — обучать.
Если взять такую вещь как иностранный язык, без системы вообще никуда. Они могут быть разными, но нельзя надергивать куски из разных курсов. Нужно пройти один целиком, затем второй целиком и так далее.
Смущает, что теряется механизм «ведения». В оффлайне обычно ученик занимается с одним и тем же преподавателем, который быстро начинает понимать его сильные и слабые стороны, помогает ему, исходя из его особенностей и целей. А если подключился-получил ответ-отключился — это же «гугл с человеческим лицом» получится :)
Одно дело какой-нибудь powershell, где нужно в командной строке набрать строчку и получить результат.
И совсем другое дело — компилируемый язык, где разницы между одной строчкой и десятью строчками нет.
У меня все программы состоят из однострочников примерно такого вида:
class X {
public: void f();
void g(int x);
int h(double a, double b);
};
А что находится в cpp-модуле — какая кому разница?
Но выдавать отсутствие какой-либо возможности языка за его плюс — довольно странно. Пусть есть альтернатива, но оставьте мне и мой старый способ.
Я вообще не понимаю, откуда берутся холиворы на эту тему. Свобода лучше, чем несвобода. Сейчас у разработчиков есть полная свобода выбора бизнес-модели. Хочешь — продавай по старинке, хочешь — делай онлайн доступ, хочешь — краудсорсь или просто раздавай бесплатно.
Пользователи тоже могут брать софт, разработанный любым описанным способом. Казалось бы, вот оно счастье. Ан нет, надо обязательно чего-то там запрещать и регулировать.
Честно говоря, не хотел бы слышать такое от коллег. Мне она затем, что я так хочу. Что мне так удобно. Если я вычисляю математическое выражение, может, функциональный стиль окажется удобнее, но если я пишу управляющий скрипт для робота, гуляющего по комнате, оставьте мне возможность сочинить императивную инструкцию — какой мотор когда запустить, и в какую сторону когда повернуть.
Поэтому хорошие языки поддерживают обе эти парадигмы. Хочешь — пиши функционально, не хочешь — императивно.
На Haskell нельзя написать систему реального времени (например, для встроенного прибора для самолёта), потому что в любой момент может запуститься garbage collector и удлинить конкретный шаг цикла. Аналогично работает механизм ленивых вычислений — два вызова функции f(x) могут отличаться по скорости в неопределённое количество раз. Я понимаю, что этот механизм полезен, но вот его ограничение.
Далее, я не совсем понимаю, как на Haskell реализовать прямой доступ к памяти. Допустим, у меня есть девайс, в котором экран отображается на оперативную память. Мне надо нарисовать на экране окружность; нужен прямой доступ к конкретным физическим адресам.
Библиотека контейнеров. Вот здесь я не так уверен, но насколько знаю, на Haskell «из коробки» нет такого обилия структур данных (массивы, ассоциативные массивы, деревья, хэш-таблицы, списки, деки) как в C++ или даже в Java. Я понимаю, что всё это реализовать МОЖНО, но одно дело можно, а другое — уже есть.
Вообще со времён развития Java мне окончательно стало ясно, что язык уже не так важен, как вся экосистема вокруг него. Есть библиотека функций — есть язык. Нет библиотеки — нет языка, как хорош бы он ни был.
Подключиться к сети с MPI-интерфейсом, загрузить JPG файл, открыть zip-архив, работать с графами, складывать и пересчитывать даты-времена, читать xml файлы, разбирать регулярные выражения, преобразовывать строки из unicode в ascii с учётом локали, выполнять математические алгоритмы — для всего этого есть либо решение «из коробки», либо де-факто стандарты.
Есть такая вещь как швейцарский нож. Там внутри всё. Если там совсем всё, это довольно уродливый инструмент, но универсальный. Во многих задачах эта универсальность полезна.
Я не вижу второго такого ножа. Если в силу невежества — укажите мне его.
Вот и всё, что хотел сказать. Если не удалось с первого раза, приношу извинения. Надеюсь, со второго раза получилось.
Поэтому не будем тратить время на общие слова что такое шаблоны или перегрузка операторов. Название языка в студию, пожалуйста.
А мои знания языков здесь не при чём. С ними как раз всё в порядке.
По поводу (1). Если на то пошло, Степанов не апологет C++, там совсем другая история. Он искал язык, где можно воплотить идеи обобщённого программирования. И не нашёл ничего кроме Ады. Лишь позже шаблоны встроили в C++, и ему удалось добиться более широкого признания.
По поводу (2) — я не понял смысла фразы (т.е. в чём месседж? не призывы ко мне, а на что надо конкретно обратить внимание?)
«Откуда я знаю, что в C++ есть то, чего нет нигде»? Хороший вопрос. Я не знаю. У меня нет времени выучить все 3000 языков программирования.
Скажем, объекты уже есть практически везде, окей.
Шаблоны — в Java недавно появились, в C# тоже. При этом до сих пор их поддержка отстаёт (позже вышли).
Метапрограммирование — вообще не знаю, где оно есть за пределами C++ (берём популярные языки).
Препроцессор (с помощью которого реализуют кучу нетривиальных вещей) — почти нигде нет, потому что он ещё в C был объявлен «злом», и от него избавляются.
Множественное наследование — иногда полезно, где оно?
Перегрузка операций — аналогично.
(Ну это то, что первое в голову приходит)
Ну и всякие токенизаторы из буста — даже банальный csv файл разбирать самостоятельным кодом? (Хотя такие вещи уже наверняка вынесены в библиотеки). Или ввод-вывод строк — в C тоже морока.
«At present C++ is the best vehicle for this style of programming. I have tried different languages and I think that C++ allows this marvelous combination of abstractness and efficiency. However, I think that it is possible to design a language based on C and on many of the insights that C++ brought into the world, a language which is more suitable to this style of programming, which lacks some of the deficiencies of C++, in particular its enormous size.»
Но это было давно. Может, чего-то изменилось. Но если посмотреть на разнообразие буста, подозреваю, что всё так до сих пор. Язык, на котором можно реализовать все эти вещи, будет столь же монструозным. Выбросим препроцессор? Не будет Boost.Preprocessor. Выбросим шаблоны? Не будет Boost.MPL и так далее. А если мы всё это воткнём, здравствуй снова C++. Скажем, из простого языка для студентов Java всё больше превращается в такое же болото. То же самое происходит с C#. Конечно, мы радуемся шаблонам и всяким lambda-штучкам, но язык от них проще не становится.
Мне кажется, проблема в том, что у нас в принципе мало промышленности, где используют C++. Отсюда и низкий интерес.
Другое дело, что C++ превращается во что-то монструозное, и доля программистов, способных по-настоящему полноценно его использовать, падает. Какой-то тупик.
Если взять такую вещь как иностранный язык, без системы вообще никуда. Они могут быть разными, но нельзя надергивать куски из разных курсов. Нужно пройти один целиком, затем второй целиком и так далее.
Уйти в виртуальность (до некоторой степени) можно уже и сейчас, но не всем этого, к счастью, хочется.
Цитировать в таком контексте ненадёжные источники — крайне дурной тон.