Отображение языков на парадигмы - PullRequest
3 голосов
/ 25 сентября 2010

Я недавно прочитал статью Эрика Стивена Рэймонда «Как стать хакером», и мне нравится его предложение изучать 5 ключевых языков (он предлагает Python, C / C ++, Lisp, Java и Perl) как способ раскрытия парадигмы программирования, используемые сегодня.

Его совет заключается в том, что не так важно, какие языки знает программист. Более важно знать разные подходы к программированию по двум причинам.

Первая причина в том, что подобрать новый язык становится тривиально, если вы знаете общий подход к решению проблем.

Вторая причина в том, что нет лучшего языка - у всех есть компромиссы. Было бы лучше знать, какой тип языка выбрать, учитывая конкретный тип проблемы. Это то, что меня больше всего интересует, но у меня проблема с тем, чтобы действительно отличить 5 языков, которые он предлагает. Кажется, что есть много совпадений.

Итак, мой конкретный вопрос, учитывая эти 5 языков, какова их предполагаемая парадигма программирования, и привести один пример типа проблемы, для которой она лучше всего подходит.

Пример ответа (и я не уверен, что этот ответ правильный):

Perl
- mainly a functional language
- great for quick text substitutions in multiple files from the command line.

Я нашел несколько других похожих вопросов, но я хотел бы узнать об этих 5 языках в частности. Я просто ищу отправную точку, ничего лишнего. Заранее спасибо!

Ответы [ 3 ]

11 голосов
/ 25 сентября 2010

Я думаю, вы ошибаетесь. Как говорит сам esr, важен не язык , а парадигма . Поэтому, когда вы говорите, что

  1. Perl - это функциональный язык
  2. Отлично подходит для быстрой замены текста в нескольких файлах из командной строки.

вам не хватает одного из основных моментов функционального языка, который заключается в том, что он отлично подходит для построения больших систем с использованием подхода «снизу вверх»: решайте кучу (удачно выбранных) небольших проблем с хорошо разработанными функциями, пока у нас не получится полный система. Мы сокращаем дублирование кода, определяя, какие общие алгоритмы мы используем, и используя функции более высокого порядка для инкапсуляции их общности. Мы минимизируем (явное) поведение ветвления, используя функции более высокого порядка, чтобы создать именно ту функцию, которая нам нужна в данной ситуации.

Точно так же я мог бы сказать, что

  1. Java в основном является языком ООП
  2. Это хорошо для написания больших, надежных систем,

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

В целом базовая точка языков программирования и связанных с ними парадигм:

  • , чтобы позволить вам не думать ни о чем, что не влияет на качество получаемой программы. Если бы это не было (в значительной степени) желаемой вещью, то мы все будем писать машинный код.

  • Это достигается (помимо прочего) предоставлением набора инструментов для построения абстракций .

Магазин вокруг и выберите тот, который вам нравится, и получите хорошие. Просто убедитесь, что вы узнаете, когда другие позволяют найти лучшее решение (это, вероятно, также будет означать, что в конечном итоге вы получите хорошее;). Я думаю, что «хорошее решение» можно в основном понимать как «четкое отображение кода в идей ». (по модулю опасения по поводу эффективности, которые заставили бы вас (предоставить оправдание?) писать на языке, подобном C)

0 голосов
/ 28 сентября 2010

Выбор языка ESR основан не только на парадигмах, но и на их использовании, каждый из которых представлен как:

  1. C / C ++: язык системного программирования (металл)
  2. Лисп: функциональная парадигма (просветление)
  3. Java: объектно-ориентированный (фреймворк)
  4. Perl: лучше язык оболочки (администратор)
  5. Python: Потому что это Python, дох. (рай - http://xkcd.com/353/)

А если серьезно, то Python является наиболее хорошо разработанным языком; все его функций просто очень хорошо вписываются в чистый, хорошо продуманный и простой в освоении язык, который не является игрушечным языком. Это универсальный, всесторонний язык общего назначения, который используется практически в любых ситуациях: настольные приложения, веб-приложения, встроенный язык сценариев, системное администрирование и т. Д., От самого маленького однострочного сценария до сотен тысяч линий. Его изюминкой является сам дизайн языка. AFAIK, в этом классе нет другого языка.

Perl представляет класс языка, используемого для сценариев оболочки или автоматизации заданий, где вам нужно вызывать серию программ, выполнять некоторые преобразования в ее выводе и передавать результат как при вводе другой программы. Другие языки в этом классе - bash, однако bash не хватает многих мощных манипуляций со строками, которые есть в perl (не говорите, что bash может вызывать perl, sed или awk).

Java представляет собой класс языка, который широко используется в промышленности и на него вкладывается большое количество времени и средств. Поскольку они повсеместно распространены, существует множество хороших библиотек и фреймворков для чего угодно; Если вы можете придумать проблему, скорее всего, проблема была решена кем-то другим, и они написали для нее библиотеку. Хакер должен знать эти языки, поскольку это увеличивает производительность, если вы можете избежать написания какого-либо кода (или избежать написания слишком большого количества кода). Другие языки / фреймворки в этом классе: .NET, Django, RoR.

Лисп представляет собой функциональную парадигму. Умение думать и писать в функциональной парадигме имеет много преимуществ, которые я не буду здесь повторять. Кроме того, в Лиспе есть очень мощные функции метапрограммирования, которые почти уникальны для Лисп. Другой язык в этом классе (функциональный, не метапрограммирующий) включает Haskell, Scheme, Clojure, F # и т. Д.

C / C ++ представляет языки низкого уровня, используемые для написания ядра ОС, драйверов устройств и критичных по скорости кодов. Этот класс языка имеет семантику, близкую к голому металлу (особенно C, в C ++ - тем более), и хакер должен знать, как работает металл, называемый CPU, иначе он не может назвать себя хакером. Другим языком в этом классе является Assembly, но я думаю, что даже ESR согласен с тем, что Assembly слишком низкоуровневая, чтобы делать что-либо продуктивное.

Хотя верно, что многие из упомянутых им языков имеют значительную долю перекрытий (например, Python, C ++, Perl поддерживает ООП, например); у каждого из классов языков есть выделение, уникальное для его собственного класса.

Лично, если бы мне дали возможность добавить еще один язык, я бы добавил в смесь PHP. Веб-приложение становится все более и более вездесущим. PHP представляет класс языка, используемого для веб-приложений, другие языки в этом классе включают JSP, ColdFusion и т. Д.

Короче говоря, хакер - это тот, кто:

  1. знает, как компьютер работает на низком уровне
  2. умеет мыслить абстрактно
  3. знает, как правильно использовать фреймворки
  4. знает, как управлять собственной системой
  5. знает дизайн, хороший язык
0 голосов
/ 25 сентября 2010

Если можете, отправляйтесь в школу, которая даст вам опыт работы с разными языками.

  • Python: мультипарадигма, ориентированная на ОО и универсальное программирование на основе полиморфизма.
  • C / C ++: это два разных языка. Группировка их вместе отражает уровень практичности ESR.
    • C: классический императивный язык.
    • C ++: мультипарадигма, сфокусированная на ОО и шаблонном программировании на основе шаблонов.
  • Emacs Lisp: Устаревший, изучите Haskell или Clojure, или OCaml, или Scheme. Это функциональный язык.
  • Java: Классическая ОО, разработанная для надежности. Но это не поможет тебе ничему научиться.
  • Perl: Сделай себе одолжение и не изучай Perl. Он не предназначен для какой-либо заметной парадигмы, и писать в нем хороший код сложно. Вместо этого попробуйте Awk.

ESR не совсем приземленный. Он хорошо известен как философ, но какой важный код он написал?

Чтобы изучить современные популярные парадигмы, просто начните кодировать в любом современном проекте. В настоящее время популярные парадигмы легче всего раскрыть. Попытка «выучить» весь сложный язык, такой как C ++ или Java, может привести к путанице. Каждый язык имеет глубину и требует времени для освоения путем применения в реальных проектах. Вы не можете просто сесть и сделать это.

Тем не менее, безусловно, стоит написать несколько игрушечных проектов в

  • некоторый функциональный язык (в моей школе использовался OCaml, его очень легко выучить)
  • ассемблерный код (используйте настоящий ассемблер, а не GNU as, который не предназначен для использования человеком)
    • или чрезвычайно легкая система, такая как Forth
  • (относительно) простой язык обработки текста, такой как Awk
  • логический решатель, а именно Пролог (Спасибо @ Thorbjørn!)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...