Я это читал, но согласитесь, между чтением мануала и умением писать хороший код на данном языке лежит пропасть. Поэтому я и прошу вас привести тот кусок, который был бы образцом «оберонного» стиля решения данной задачи. Подставляться я не боюсь, подумаешь, тоже мне проблема.
Если просто кидаться текстами, я не «пойму, что есть другие взгляды». Давайте конкретнее.
Согласитесь, моя задача не относится ни к какой узкой области. Речь идёт о банальной сортировке. Если один член команды разрабатывает алгоритм сортировки, а другой работает над структурами данных, то разделение труда таким образом выглядит очевидным. Кроме того, хороший алгоритм сортировки можно применить и в следующем проекте (короче говоря, это библиотечный код).
Ну, я, конечно, в этом языке малокомпетентен, так что могу сильно промазать.
Но вот взять хотя бы простую задачу: «разработать алгоритм сортировки произвольной линейной структуры данных, в которой хранятся объекты пользовательского типа, для которой определены операции доступа по индексу, а объекты сравнимы операцией „меньше“».
Согласитесь, базовее задачу трудно придумать. Как это выглядит на Обероне? Ну то есть предположим, требуется разработать библиотечное средство.
Это не аксиоматика, это теорема, которую я попытался вкратце обосновать.
Но вы с ней даже не спорите, потому что предлагаете «выбирать язык в соответствии с задачей».
Ну так укажите язык ОБЩЕГО назначения, который Вам нравится, а я попробую его раскритиковать. Это будет конструктивно.
Мне тоже нравятся языки из Вашего списка. Но только для написания каких-то мелких кусков или для самостоятельных упражнений. А вот в качестве инструмента для широкого класса задач у меня с ними плохо срастается.
Давайте я для простоты картины сведу мысль к двум тезисам:
1) Вирт проповедует минимализм и выражает свою философию в языках вроде Паскаля, Модулы и Оберона.
2) Вирт позиционирует упомянутые языки как языки общего назначения с самой широкой сферой деятельности.
Я считаю, что минимализм и широкая сфера несовместимы, вот и всё.
Соответственно, можно опровергать (1), (2) или мой вывод. А разговоры о «школах» и т.п. нерелевантны.
Нет, не надо приписывать меня к какому-либо лагерю. Я работаю с несколькими языками и вижу их сильные и слабые стороны.
Вы снова и снова уходите от темы.
Это всё общие слова про разность школ и прочие высокие философии. Не причисляю себя ни к какой «школе».
Я выше объяснил своё видение ситуации с языками общего назначения. Если вы видите альтернативу (тезис — антитезис), разговор можно продолжить. А иначе получается игра в одни ворота — вместо опровержения своих мыслей я просто получаю какие-то абстрактные размышлизмы о специализации языков и школах.
Кстати, довольно странно записывать Страуструпа и авторов Simula 67 в американцы.
Не складывается. Фортран всего на год старше Лиспа, а C на пятнадцать лет моложе.
А вот про подготовку поверить могу. Но это уже к вопросу о «ломании через колено».
Нет, я поклонник C++.
По предыдущим замечаниям — понятно, но это всё довольно очевидные соображения, которые в наши дни всё сильнее размываются реальностью. А реальность такова, что предметных областей становится всё больше, а возможности человеческие ограничены. Всё равно очень хорошо выучить можно пять-семь языков и обходиться ими в любой задаче.
Но мы, на самом деле уходим в сторону, потому что в текущем контексте речь идёт о языках общего назначения, как я это себе представляю. Или профессор Вирт и вправду придумал несколько узко специализированных языков, а я чего-то недопонял?
Ну вот это проблема курицы и яйца: Бейсик появился позже Лиспа, так в чём же проблема освоения преподавателями, которые на тот момент были tabula rasa?
Дело не в моём вкусе, а в моей предметной области. Она не имеет никакого отношения ко вкусу.
Вот ориентация на определённый класс задач — это совсем другое дело. Поэтому у нас есть SQL, например. Или Perl. Но в контексте данной статьи, я думаю, речь в большей степени идёт о Паскале и Обероне, которые позиционируются как языки общего назначения.
А необходимое — опять же, для кого. Для математика, например, арифметические операции с векторами и матрицами абсолютно необходимы. А я с ними редко сталкиваюсь.
Я думаю, если такими широкими мазками перечислять базовые понятия C++, окажется примерно столько же :)
Интерпретация и типизация, я бы сказал, очень важное свойство языка. Именно благодаря этим штукам в Python так изящно работает duck typing и гораздо меньше головной боли с частично пересекающимися в целях механизмами шаблонов и наследования в C++. Ведь если подумать, сколько всего в C++ наворочено лишь ради того, чтобы код можно было откомпилировать…
Это так, но из этого не следует, что в параллельной вселенной, где всё наоборот, LISP бы оказался впереди.
Вообще в известном смысле мир становится всё более мультипарадигменным, и тот же C++ в последние годы сделал немало шагов навстречу функциональному программированию, так что скоро все в одной лодке будем.
Когда ещё не было никакого C, LISP мог конкурировать с Бейсиком, однако вот как-то воспринимался Бейсик попроще.
В том и дело, что (повторю свой тезис) автор языка не может знать заранее, что конкретно мне нужно. Так что с тезисом (2) я в корне не согласен: язык должен удовлетворять мои объективные потребности. А если не удовлетворяет, то для меня он не годится.
Тут, конечно, надо пройти по тонкому льду между «естественными / правильными» абстракциями и «вредными костылями». Скажем, Чак Мур вообще всё на свете объявляет вредными костылями.
Я рассуждаю так. Вот я сижу и абстрактно решаю задачу. Например: нужно найти решение уравнения с заданной точностью. Точность — это разность между решениями, полученными на последовательных шагах численного метода. Таким образом, моя задача естественным образом разбивается на две: программирование многошагового метода и определение разности между двумя членами.
Языки вроде Haskell или Python позволяют описать мои мысли с наименьшими искажениями, то есть лениво сгенерировать бесконечный список, а потом пройтись по его элементам и найти требуемый шаг.
Если же язык заставляет меня формулировать мысли иначе, это не очень хороший язык, потому что я здесь хозяин, в конце концов, а он мне должен служить.
Вряд ли соглашусь. Языки вроде LISP или FORTH живучи и мощны, но я думаю, что они обладают слишком ограниченными средствами для описания моей проблемы на моём языке, скажем так. Это языки, которые «ломают программиста через колено». Если на всё смотреть сквозь призму FORTH или LISP, то да, на них можно сделать что угодно.
Если бы всё было так просто, на LISP писали бы всё подряд, и у языка вроде Java не было бы никакого шанса выжить.
Python я бы не назвал слишком простым языком. В него легко войти, но встроенных средств в него заложено очень немало. К тому же предположу, что рано или поздно и там начнутся добавления, потому что будет «почему Вася может написать на своём языке Х, а я не могу?»
Да и у Питона свои недостатки (которые являются продолжениями его достоинств) — интерпретация, динамические типы. Не всегда я им рад.
Продуктивный диалог строится на основе тезисов. Если речь идёт о диалоге между автором и читателем, то тезисы должны приводиться в статье автора. В данном случае никаких особенных тезисов не приводится, поэтому сложно ожидать от читателя конструктивной дискуссии.
Можно, конечно, начать переписку в комментариях, но это в принципе неправильно.
Если интересует моя «аксиома», то это, конечно, не аксиома, а теорема. Чтобы её доказать, мне надо написать целую простыню текста.
Но если выразиться предельно кратко, то основной механизм борьбы со сложностью называется «абстракция». Если язык позволяет создавать высокоуровневые абстракции, он масштабируем. Причём возможности абстракции (инкапсуляции сложности) должны быть предельно гибки, потому что автор языка программирования не знает моих нужд, не знает моей предметной области.
Например, если я математик, то у меня должна быть возможность написать выражение «A*c», где A — квадратная матрица, а c — вектор-столбец, потому что к этому подвигают гигантские объёмы существующей математической литературы и поколения математиков, работавших над формализмом.
Если я пишу алгоритм сортировки, то у меня должна быть возможность написать его обобщённую версию для любого произвольного типа T, для которого определены операции сравнения и присваивания.
Если я пишу GUI, то знаю, что мои алгоритмы перерисовки объектов и прочего управления окнами будут работать с виджетами сторонних разработчиков, причём частично функционал и внешний вид виджетов будут пересекаться, что неизбежно приводит к идеям вроде наследования и виртуальных функций.
Наконец, если моя программа работает на реальном компьютере, меня могут неожиданно озаботить представления об эффективности кода, о прямой работе с оперативной памятью, доступе к нестандартному оборудованию.
Таким образом, любой язык, который отсекает какую-либо теоретически возможную абстракцию, лишает меня какого-либо инструмента. А автор языка никогда не знает, какой инструмент мне реально понадобится. Потому что язык программирования — это язык моделирования предметной области, и чем естественнее на языке программирования я могу выразить понятия моей области, тем лучше.
Вынужден заметить, что предлагаемая статья никак не способствует познанию этого наследия. Вот и рассказали бы подробнее, а просто высказать мнение каждый умеет.
Ну потому что статья пафосная, но во многом не по делу. Как будто бы имеет значение, кто ещё кончал его вуз в разные годы, или кого-то трогают тенденциозно-бредовые соображения автора про «диктатуру воинствующих дилетантов».
А если по делу — я глубоко уважаю профессора Вирта, учился в том числе и по его книжкам, и ценю его достижения.
Но он, на мой предвзятый взгляд, относится к тем «кирпичам» здания компьютерной науки, которые не окажутся на фасаде. Он многое сделал для развития идей, практики и содержания программирования.
Однако его основное детище — это попытка создать минимальный простой язык. Модула проще Паскаля, а Оберон проще Модулы. Однако жизнь показала, что идея эта нежизнеспособна, потому что сложные понятия требуют сложного языка. И даже те языки, которые начинались как «простые» (вроде тех же C# и Java), сейчас по сложности стремительно догоняют C++.
А ниша Паскаля стремительно уходит к языкам вроде Python или Ruby. Так что пройдёт ещё немного времени, и существенный вклад Вирта, к сожалению, окажется скрытым под новыми культурными слоями. Даже я, начинавший программирование с Бейсика, как-то мало соприкасался с его наследием.
Выше вы приводите несколько весьма разумных замечаний, но здесь просто троллите уже второй раз, говоря о том, что «русский текст должен быть написан кириллическими буквами».
Любой текст предъявляет те или иные требования к читателю. Фраза «дифференциальное уравнение в частных производных» написана кириллическими буквами, но чтобы понять её суть, нужно, как минимум, обладать незаконченным высшим образованием. Примерно то же можно сказать о словах вроде «маркетинг», «номинализм» или «эсхатология».
Соответственно, думать надо не только об алфавите, но и о лексике. Если я посмел употребить сочетание «дифференциальное уравнение в частных производных», то сразу же отсёк огромное количество потенциальных читателей, которые, быть может, сумели бы прочесть написанные буквы, но всё равно не поняли бы смысла (и стало быть, их умение читать здесь не помогает).
Я с огромным трудом могу себе представить читателя компьютерно-технического текста на русском языке, который не сумеет прочесть вставленное слово «JavaScript». Наверно, такие уникумы действительно существуют. Но я как автор текста в любом случае самостоятельно решаю, на какую аудиторию рассчитано моё повествование. Моё решение в любом случае дискриминационно, потому что любое употребление латиницы, иероглифики, специальной терминологии, профессионального жаргона и т.п. неизбежно кого-то отсекает.
Почему вы так выделяете латиницу из всего этого разнообразия — неясно. Вы ведь обосновываете свою точку зрения наличием читателей, которые латиницу не прочтут. Если проблема лишь в этом, ну что ж, мне их жаль, я не для них пишу. И ничего в этом обидного нет: я не пишу технические тексты ни для медсестёр, ни для слесарей, ни для музыкантов.
Ну хорошо, вот вы упоминаете GlobalMapper. Это претензия к энтузиасту или к компании, которая не считает для себя интересным делать русский интерфейс?.. Я не верю, что кто-то в здравом уме может отдать на откуп неизвестному энтузиасту перевод на язык, который считает для себя важным. Для них русский, очевидно, неважен. Значит, они могут либо вообще не обращать внимания на русский язык, либо запретить любым энтузиастам копаться в программе.
Господа, ваш «вывод» можно было предугадать с самого начала, чего ещё ожидать от профессиональных переводчиков? :)
А по сути тот же вывод можно было сформулировать проще: лучше быть богатым и здоровым, чем бедным и больным. Я не знаю никого, кто бы в здравом уме предположил, что случайные люди из интернета переведут текст качественнее, чем высококлассные профессионалы. Вся история с краудсорсингом — это история о том, что в теории можно получить неплохой перевод очень дёшево или бесплатно.
У меня на компьютере довольно много копеечного или бесплатного софта с 12-20 заявленными языками интерфейса. «Обратиться к профессионалам» для их авторов просто не вариант. А те, кто рассматривает свой продукт как серьёзный бизнес, и так обращается к переводчикам.
Надо сказать, впрочем, что при таком подходе представители не очень крупных народов/рынков (вроде грузин или эстонцев) вообще никогда бы не увидели софта на родном языке.
Тривиально: 7 лет в Финляндии, затем 4 года в Японии, а язык изучать всё некогда :)
Ну финский немного подучил, жалко терять навыки, а японский вот между делом пытаюсь шлифовать помаленьку.
На самом деле эта деятельность затягивает, начинаешь получать удовольствие от процесса и от новых знаний/умений. Кроме того, это реально интересные языки, да и после английского изучать такое — это как Хаскелл после Паскаля.
Если просто кидаться текстами, я не «пойму, что есть другие взгляды». Давайте конкретнее.
Согласитесь, моя задача не относится ни к какой узкой области. Речь идёт о банальной сортировке. Если один член команды разрабатывает алгоритм сортировки, а другой работает над структурами данных, то разделение труда таким образом выглядит очевидным. Кроме того, хороший алгоритм сортировки можно применить и в следующем проекте (короче говоря, это библиотечный код).
Но вот взять хотя бы простую задачу: «разработать алгоритм сортировки произвольной линейной структуры данных, в которой хранятся объекты пользовательского типа, для которой определены операции доступа по индексу, а объекты сравнимы операцией „меньше“».
Согласитесь, базовее задачу трудно придумать. Как это выглядит на Обероне? Ну то есть предположим, требуется разработать библиотечное средство.
Но вы с ней даже не спорите, потому что предлагаете «выбирать язык в соответствии с задачей».
Ну так укажите язык ОБЩЕГО назначения, который Вам нравится, а я попробую его раскритиковать. Это будет конструктивно.
Мне тоже нравятся языки из Вашего списка. Но только для написания каких-то мелких кусков или для самостоятельных упражнений. А вот в качестве инструмента для широкого класса задач у меня с ними плохо срастается.
1) Вирт проповедует минимализм и выражает свою философию в языках вроде Паскаля, Модулы и Оберона.
2) Вирт позиционирует упомянутые языки как языки общего назначения с самой широкой сферой деятельности.
Я считаю, что минимализм и широкая сфера несовместимы, вот и всё.
Соответственно, можно опровергать (1), (2) или мой вывод. А разговоры о «школах» и т.п. нерелевантны.
Вы снова и снова уходите от темы.
Это всё общие слова про разность школ и прочие высокие философии. Не причисляю себя ни к какой «школе».
Я выше объяснил своё видение ситуации с языками общего назначения. Если вы видите альтернативу (тезис — антитезис), разговор можно продолжить. А иначе получается игра в одни ворота — вместо опровержения своих мыслей я просто получаю какие-то абстрактные размышлизмы о специализации языков и школах.
Кстати, довольно странно записывать Страуструпа и авторов Simula 67 в американцы.
А вот про подготовку поверить могу. Но это уже к вопросу о «ломании через колено».
По предыдущим замечаниям — понятно, но это всё довольно очевидные соображения, которые в наши дни всё сильнее размываются реальностью. А реальность такова, что предметных областей становится всё больше, а возможности человеческие ограничены. Всё равно очень хорошо выучить можно пять-семь языков и обходиться ими в любой задаче.
Но мы, на самом деле уходим в сторону, потому что в текущем контексте речь идёт о языках общего назначения, как я это себе представляю. Или профессор Вирт и вправду придумал несколько узко специализированных языков, а я чего-то недопонял?
Вот ориентация на определённый класс задач — это совсем другое дело. Поэтому у нас есть SQL, например. Или Perl. Но в контексте данной статьи, я думаю, речь в большей степени идёт о Паскале и Обероне, которые позиционируются как языки общего назначения.
А необходимое — опять же, для кого. Для математика, например, арифметические операции с векторами и матрицами абсолютно необходимы. А я с ними редко сталкиваюсь.
Интерпретация и типизация, я бы сказал, очень важное свойство языка. Именно благодаря этим штукам в Python так изящно работает duck typing и гораздо меньше головной боли с частично пересекающимися в целях механизмами шаблонов и наследования в C++. Ведь если подумать, сколько всего в C++ наворочено лишь ради того, чтобы код можно было откомпилировать…
Вообще в известном смысле мир становится всё более мультипарадигменным, и тот же C++ в последние годы сделал немало шагов навстречу функциональному программированию, так что скоро все в одной лодке будем.
Когда ещё не было никакого C, LISP мог конкурировать с Бейсиком, однако вот как-то воспринимался Бейсик попроще.
Тут, конечно, надо пройти по тонкому льду между «естественными / правильными» абстракциями и «вредными костылями». Скажем, Чак Мур вообще всё на свете объявляет вредными костылями.
Я рассуждаю так. Вот я сижу и абстрактно решаю задачу. Например: нужно найти решение уравнения с заданной точностью. Точность — это разность между решениями, полученными на последовательных шагах численного метода. Таким образом, моя задача естественным образом разбивается на две: программирование многошагового метода и определение разности между двумя членами.
Языки вроде Haskell или Python позволяют описать мои мысли с наименьшими искажениями, то есть лениво сгенерировать бесконечный список, а потом пройтись по его элементам и найти требуемый шаг.
Если же язык заставляет меня формулировать мысли иначе, это не очень хороший язык, потому что я здесь хозяин, в конце концов, а он мне должен служить.
Если бы всё было так просто, на LISP писали бы всё подряд, и у языка вроде Java не было бы никакого шанса выжить.
Python я бы не назвал слишком простым языком. В него легко войти, но встроенных средств в него заложено очень немало. К тому же предположу, что рано или поздно и там начнутся добавления, потому что будет «почему Вася может написать на своём языке Х, а я не могу?»
Да и у Питона свои недостатки (которые являются продолжениями его достоинств) — интерпретация, динамические типы. Не всегда я им рад.
Можно, конечно, начать переписку в комментариях, но это в принципе неправильно.
Если интересует моя «аксиома», то это, конечно, не аксиома, а теорема. Чтобы её доказать, мне надо написать целую простыню текста.
Но если выразиться предельно кратко, то основной механизм борьбы со сложностью называется «абстракция». Если язык позволяет создавать высокоуровневые абстракции, он масштабируем. Причём возможности абстракции (инкапсуляции сложности) должны быть предельно гибки, потому что автор языка программирования не знает моих нужд, не знает моей предметной области.
Например, если я математик, то у меня должна быть возможность написать выражение «A*c», где A — квадратная матрица, а c — вектор-столбец, потому что к этому подвигают гигантские объёмы существующей математической литературы и поколения математиков, работавших над формализмом.
Если я пишу алгоритм сортировки, то у меня должна быть возможность написать его обобщённую версию для любого произвольного типа T, для которого определены операции сравнения и присваивания.
Если я пишу GUI, то знаю, что мои алгоритмы перерисовки объектов и прочего управления окнами будут работать с виджетами сторонних разработчиков, причём частично функционал и внешний вид виджетов будут пересекаться, что неизбежно приводит к идеям вроде наследования и виртуальных функций.
Наконец, если моя программа работает на реальном компьютере, меня могут неожиданно озаботить представления об эффективности кода, о прямой работе с оперативной памятью, доступе к нестандартному оборудованию.
Таким образом, любой язык, который отсекает какую-либо теоретически возможную абстракцию, лишает меня какого-либо инструмента. А автор языка никогда не знает, какой инструмент мне реально понадобится. Потому что язык программирования — это язык моделирования предметной области, и чем естественнее на языке программирования я могу выразить понятия моей области, тем лучше.
А если по делу — я глубоко уважаю профессора Вирта, учился в том числе и по его книжкам, и ценю его достижения.
Но он, на мой предвзятый взгляд, относится к тем «кирпичам» здания компьютерной науки, которые не окажутся на фасаде. Он многое сделал для развития идей, практики и содержания программирования.
Однако его основное детище — это попытка создать минимальный простой язык. Модула проще Паскаля, а Оберон проще Модулы. Однако жизнь показала, что идея эта нежизнеспособна, потому что сложные понятия требуют сложного языка. И даже те языки, которые начинались как «простые» (вроде тех же C# и Java), сейчас по сложности стремительно догоняют C++.
А ниша Паскаля стремительно уходит к языкам вроде Python или Ruby. Так что пройдёт ещё немного времени, и существенный вклад Вирта, к сожалению, окажется скрытым под новыми культурными слоями. Даже я, начинавший программирование с Бейсика, как-то мало соприкасался с его наследием.
Любой текст предъявляет те или иные требования к читателю. Фраза «дифференциальное уравнение в частных производных» написана кириллическими буквами, но чтобы понять её суть, нужно, как минимум, обладать незаконченным высшим образованием. Примерно то же можно сказать о словах вроде «маркетинг», «номинализм» или «эсхатология».
Соответственно, думать надо не только об алфавите, но и о лексике. Если я посмел употребить сочетание «дифференциальное уравнение в частных производных», то сразу же отсёк огромное количество потенциальных читателей, которые, быть может, сумели бы прочесть написанные буквы, но всё равно не поняли бы смысла (и стало быть, их умение читать здесь не помогает).
Я с огромным трудом могу себе представить читателя компьютерно-технического текста на русском языке, который не сумеет прочесть вставленное слово «JavaScript». Наверно, такие уникумы действительно существуют. Но я как автор текста в любом случае самостоятельно решаю, на какую аудиторию рассчитано моё повествование. Моё решение в любом случае дискриминационно, потому что любое употребление латиницы, иероглифики, специальной терминологии, профессионального жаргона и т.п. неизбежно кого-то отсекает.
Почему вы так выделяете латиницу из всего этого разнообразия — неясно. Вы ведь обосновываете свою точку зрения наличием читателей, которые латиницу не прочтут. Если проблема лишь в этом, ну что ж, мне их жаль, я не для них пишу. И ничего в этом обидного нет: я не пишу технические тексты ни для медсестёр, ни для слесарей, ни для музыкантов.
А по сути тот же вывод можно было сформулировать проще: лучше быть богатым и здоровым, чем бедным и больным. Я не знаю никого, кто бы в здравом уме предположил, что случайные люди из интернета переведут текст качественнее, чем высококлассные профессионалы. Вся история с краудсорсингом — это история о том, что в теории можно получить неплохой перевод очень дёшево или бесплатно.
У меня на компьютере довольно много копеечного или бесплатного софта с 12-20 заявленными языками интерфейса. «Обратиться к профессионалам» для их авторов просто не вариант. А те, кто рассматривает свой продукт как серьёзный бизнес, и так обращается к переводчикам.
Надо сказать, впрочем, что при таком подходе представители не очень крупных народов/рынков (вроде грузин или эстонцев) вообще никогда бы не увидели софта на родном языке.
Ну финский немного подучил, жалко терять навыки, а японский вот между делом пытаюсь шлифовать помаленьку.
На самом деле эта деятельность затягивает, начинаешь получать удовольствие от процесса и от новых знаний/умений. Кроме того, это реально интересные языки, да и после английского изучать такое — это как Хаскелл после Паскаля.