Я довольно свободно говорю на C / C ++ и могу разбираться с различными языками сценариев (awk / sed / perl). Я начал использовать python гораздо больше, потому что он сочетает в себе некоторые изящные аспекты C ++ с возможностями сценариев awk / sed / perl.
Но почему так много разных языков программирования? Я предполагаю, что все эти языки могут делать то же самое, так почему бы просто не придерживаться одного языка и использовать его для программирования компьютеров? В частности, есть ли причина, по которой я должен знать функциональный язык как программист?
Некоторые связанные чтения:
Ответы:
Языки программирования развиваются и совершенствуются со временем (инновации).
Люди берут идеи с разных языков и объединяют их в новые языки. Некоторые функции улучшены (механизмы наследования, системы типов), некоторые добавлены (сборка мусора, обработка исключений), некоторые удалены (
goto
операторы, низкоуровневые манипуляции с указателями).Программисты начинают использовать язык особым образом, который не поддерживается никакими языковыми конструкциями. Разработчики языка идентифицируют такие шаблоны использования и вводят новые абстракции / языковые конструкции для поддержки таких моделей использования. Не было никаких процедур на ассемблере. Нет классов в C. Нет обработки исключений в (раннем) C ++. Нет безопасного способа загрузки новых модулей на ранних языках (легко в Java). Нет встроенных потоков (легко-peasy в Java).
Исследователи думают об альтернативных способах выражения вычислений. Это привело к появлению Lisp и ветви функционального языка в дереве языков, Prolog и ветви логического программирования, Erlang и других актерских моделей программирования, среди прочих.
Со временем дизайнеры / исследователи языков стали лучше понимать все эти конструкции и то, как они взаимодействуют, и разрабатывать языки для включения многих популярных конструкций, разработанных для совместной работы. Это приводит к замечательным языкам, таким как Scala, в котором есть объекты и классы (выраженные с использованием признаков вместо одиночного или множественного наследования), функциональные возможности программирования, алгебраические типы данных, прекрасно интегрированные с системой классов и сопоставлением с образцом, и параллелизм на основе акторов.
Исследователи, которые верят в статические системы типов, стремятся улучшить свою выразительность, разрешая такие вещи, как типизированные универсальные классы в Java (и все замечательные вещи в Haskell), так что программист получает больше гарантий перед запуском программы, что вещи не собираются пойти не так Системы статических типов часто налагают на программиста большую нагрузку (ввод типов), поэтому исследования направлены на то, чтобы облегчить эту нагрузку. Такие языки, как Haskell и ML, позволяют программисту опускать все аннотации типов (если они не делают что-то хитрое). Scala позволяет программисту опускать типы в теле методов, чтобы упростить работу программиста. Компилятор выводит все недостающие типы и сообщает программисту о возможных ошибках.
Наконец, некоторые языки предназначены для поддержки определенных доменов. Примеры включают SQL, R, Makefiles, язык ввода Graphviz, Mathmatica, LaTeX. Интеграция функциональных возможностей этих языков в языки общего назначения (напрямую) была бы довольно громоздкой. Эти языки основаны на абстракциях, характерных для их конкретной области.
Без эволюции в дизайне языка программирования мы все еще использовали бы язык ассемблера или C ++.
Что касается знания функционального языка программирования : функциональные языки позволяют выражать вычисления по-разному, часто более кратко, чем при использовании других языков программирования. Подумайте о разнице между C ++ и Python и умножьте ее на 4. Более серьезно, как уже упоминалось в другом ответе, функциональное программирование дает вам другой способ мышления о проблемах. Это относится ко всем другим парадигмам; некоторые лучше подходят для некоторых проблем, а некоторые нет. Вот почему мультипарадигмальные языки становятся все более популярными: вы можете использовать конструкции из другой парадигмы, если вам нужно, без смены языка, и, что более сложно, вы можете смешивать парадигмы в одном программном обеспечении.
источник
TLDR: Там нет языка серебряной пули.
Я надеюсь, что они не будут судиться со мной, но вот фотография из одной из презентаций Стэнфорда.
Когда вы решите выбрать язык, вы можете выбрать только 2 из этих 3 функций .
И именно поэтому люди грустят и хотят изобрести суперязык, который охватит все 3 из них.
На самом деле существует огромный список требований (некоторые из них вы можете увидеть в других ответах), но они просто добавляют детали к основным функциям. Кроме того, существуют исторические и политические причины, по которым предпочтение отдается одному языку другому.
Сочетание таких факторов дает новый язык.
( И я слышал, что каждый хороший программист должен создавать свой новый язык;) )
источник
Мир полон вещей, которые имеют много разных вариаций: текстовые процессоры, автомобили, домашний дизайн, напитки, конфеты, ручки, лопаты и т. Д. Причины, по которым у нас так много людей, можно свести к нескольким принципам:
Зайдите в любой канцелярский магазин и посмотрите раздел «Письменные принадлежности» - здесь есть сотни разновидностей ручек. Все они делают примерно одно и то же: доставляют чернила на поверхность для письма. Но каждая ручка, которую вы видите выставленной на продажу, есть там, потому что одна из трех причин выше.
Развитие ручек будет продолжаться, поскольку ни один продукт не соответствует потребностям каждого пользователя. Некоторые ручки дешевые и одноразовые, некоторые дорогие и изготовлены из высококачественных материалов; некоторые используют гели, некоторые используют чернила, некоторые используют пигменты; у некоторых есть заглушки, у некоторых вообще нет; широкие бочки, узкие бочки, круглые бочки, квадратные бочки; короткий, длинный; красный, белый, черный, синий. И т. Д.
Но хватит о ручках.
Наше текущее множество языков программирования можно проследить до самых первых: числовые машинные коды для ранних компьютеров еще в 1940-х годах. Примитивный, сложный в использовании и трудоемкий для входа в компьютер, но они сделали свою работу. Вскоре после этого программисты присвоили мнемонические слова (такие как ADD, CALL, LOAD) машинным кодам, породив класс языков, называемых «ассемблеры».
Разные архитектуры процессоров требовали разных мнемонических кодов, в зависимости от специфических особенностей базовых машин. Учет этих различий означал создание разных языков ассемблера.
(Возможно, теперь вы можете видеть, куда это идет ...)
Программисты смотрели на свои программы на языках ассемблера и видели шаблоны: одни и те же последовательности инструкций будут использоваться для формирования циклов, условий, назначения переменных, вызовов функций и так далее. Таким образом, процедурные языки программирования родились. Эти языки инкапсулировали группы инструкций под зонтичными терминами, такими как «if», «while», «let» и т.д.
В результате математического анализа компьютерного программирования появились функциональные языки - совершенно новый взгляд на вычисления. Не лучше, не хуже, просто по-другому.
И еще есть объектно-ориентированные, статически типизированные, динамически типизированные, позднее связывание, раннее связывание, низкое использование памяти, высокое использование памяти, распараллеливание, языки для специальных целей и так далее.
В конечном счете, у нас разные языки программирования, потому что мы хотим разные языки программирования. У каждого дизайнера языка есть свои идеи о том, как будет выглядеть и работать их язык «мечты». Разнообразие это хорошо .
источник
Языки функционального программирования обычно основаны на другой (но эквивалентной по мощности) модели вычисления: лямбда-исчисление . Существуют некоторые нетипизированные (с Python-подобной типизацией) языки, такие как LISP, Scheme (используемые в широко узнаваемой книге / курсе « Структура и интерпретация компьютерных программ» ) и языки со статической типизацией, такие как Haskell, ML, F #.
SICP привел меня в функциональное программирование, но другие люди рекомендуют эту статью Джона Хьюза и это интервью с ним.
Например, в настоящее время Microsoft продвигает функциональное программирование, которое включило F # (их функциональный язык для .NET) в VS2010 и 11; они также нанимают некоторых разработчиков Haskell в MSR, IIRC.
Обратите внимание, что существуют также некоторые функциональные языки программирования без лямбда-исчисления, такие как Refal , основанный на сопоставлении с образцом и переписывании.
Поскольку уровень абстракции в функциональных языках различен, ваше отношение к решению проблем меняется, когда вы используете методы функционального программирования. Некоторые говорят, что это может сделать вас лучшим программистом в целом.
источник
Да. Потому что Haskell изменил способ, которым я думаю. Это может изменить ваш образ мышления.
История: Раньше я думал, что могу выучить любой язык программирования за день. Однажды я начал Haskell. Я закончил все, что было до монад за полдня. С того дня прошел год, и я все еще безнадежно застрял в Монаде.
Читать:
Языки и мысли вики
Нотация как инструмент для размышлений Кеннет Э. Иверсион, лекция премии Тьюринга
Нотация - это инструмент для размышлений. Нам нужны индивидуальные нотации, чтобы удобно работать с разными мыслями. Поэтому мы создаем новые языки.
Также читай . ;-)
источник
Вряд ли найдется программист, который в какой-то момент не разочаровался бы из-за ограничений языка, который они использовали, и решил покончить с этим зудом. Таким образом, новый язык - или диалект существующего - рождается.
Абади и Карделли в «Теории объектов» разрабатывают целое семейство языков программирования из объектно-ориентированных фондов. Они доказывают, что функциональное программирование является частным случаем ОО, но не наоборот.
Изобретать что-то новое - это весело, поэтому люди чаще создают еще один язык, чем способствуют улучшению существующего. Конечно, есть хранители языков, которые не приветствуют изменения в своем видении. Лучший пример - пропасть между сторонниками Common Lisp и Scheme.
источник
Поскольку другие уже дали хорошие ответы на этот вопрос, я просто процитирую Алана Перлиса.
Кроме того, http://weblog.raganwald.com/2004/10/beware-of-turing-tar-pit.html , является хорошим чтением.
источник
Почему в мире так много стран? Разве не было бы легче, если бы у нас было всего 5 или 6 сверхдержав или хотя бы одно универсальное царство Земли? Легко спорить, почему это не будет лучше - для начала конкуренция между разными странами может привести к прогрессу, и с точки зрения демократии, прав человека и т. Д. Многие страны могут быть лучше, чем одна - - но это не объясняет, почему у нас много стран. Это только объясняет, почему многие страны будут лучше .
Точно так же вы можете спросить, почему так много разных человеческих языков? Польский, арабский, мандаринский ... Не было бы проще, если бы был только один язык? Вы могли бы поспорить в любом случае, но это были бы причины, почему было бы лучше, если бы жизнь была так или иначе. Это не объяснило бы причины существования такого множества разных человеческих языков.
Дело в том, что на планете много людей, и мы все делаем свое дело, у всех нас есть свое мнение, мы все хотим быть ответственными и иметь свою собственную страну или язык программирования, и мы часто думаем, что знаем лучше чем другие, или, по крайней мере, не пытайтесь понять, что другие могут предложить.
Прочитайте этот очень поучительный пост в блоге, Почему так много веб-фреймворков Python? По-видимому, в Python существует около 50 веб-фреймворков. Это просто смешно; нет абсолютно никакой разумной разумной причины для этого. Но автор поста отвечает: существует так много веб-фреймворков Python, потому что их так легко создать . Вам не нужна рациональная причина для того, чтобы существовало больше веб-фреймворков Python или больше языков программирования. Люди будут продолжать создавать новые, потому что они не знают, что уже доступно, или потому что они надеются, что смогут заработать деньги, или просто потому, что создавать новые вещи - это весело!
Позвольте мне описать личный пример. Около 10 лет назад я писал код на C ++ для финской компании. Вы знаете, в Финляндии есть те огромные грузовики, которые, ну, в общем, путешествуют на дальние расстояния и доставляют много вещей из одного места в другое. Я уверен, что в Америке есть и такие грузовики. Поэтому типичная проблема - убедиться, что все 24 или около того шины в порядке. Конечно, есть проверенная временем технология: давление и температуру можно контролировать, и радикальные изменения указывают на то, что что-то пошло не так. Конечно, вся эта технология является запатентованной, запатентованной, со всеми вытекающими последствиями. (Помните: патенты должны способствовать инновациям!) Так что эта финская компания хотела определить состояние шин по ... звуку. Идея заключалась в том, чтобы установить микрофоны, чтобы прослушивать звук, исходящий из всех шин, и выполнить какое-то волшебство по обработке сигналов для этих звуков, чтобы увидеть, не возникла ли какая-либо проблема с одной из шин, и я делал прототип этого безумия. (У них даже была специальная лаборатория для записи образцов звука; однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины после того, как она подверглась давлению 5 или 10 тонн и нагрелась до какой-то нелепой температуры Очевидно, опять же, не было особой разумной причины для этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все. (У них даже была специальная лаборатория для записи образцов звука; однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины после того, как она подверглась давлению 5 или 10 тонн и нагрелась до какой-то нелепой температуры Очевидно, опять же, не было особой разумной причины для этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все. (У них даже была специальная лаборатория для записи образцов звука; однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины после того, как она подверглась давлению 5 или 10 тонн и нагрелась до какой-то нелепой температуры Очевидно, опять же, не было особой разумной причины для этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все. однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины, подвергнув ее 5 или 10 тоннам давления и нагревая ее до какой-то нелепой температуры.) Очевидно, опять же, не было особого рационального Причина этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все. однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины, подвергнув ее 5 или 10 тоннам давления и нагревая ее до какой-то нелепой температуры.) Очевидно, опять же, не было особого рационального Причина этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все.
Конечно, все это применимо, только если вы верите в эволюцию. Если вы верите в какую-то форму разумного замысла, что Бог также создал все языки программирования, тогда вам придется найти цель, стоящую за этим множеством. Возможно, Бог хотел способствовать конкуренции между различными языками программирования, чтобы искусство разработки программного обеспечения достигло максимально возможного состояния.
В заключение, есть много людей, много стран, много языков программирования. Это просто природа жизни! Давайте будем благодарны за это: это просто означает, что область программирования / информатики очень жива и процветает.
источник
Почему так много разных языков программирования?
Потому что есть выбор:
К счастью, последние два являются несущественными дихотомиями, то есть можно было бы поместить оба варианта в один язык программирования. Но первые три дихотомии дают 8 комбинаций. Так что даже в идеальном мире было бы как минимум 8 языков программирования. Когда вы углубитесь в детали, у вас будут дополнительные нюансы выбора дизайна в рамках конкретных парадигм. Например, если кто-то решит использовать статически типизированный язык на основе классов, существуют разные способы проектирования системы типов. Канонического способа сделать это еще нет. Если кто-то решает сделать параллельный язык программирования, существуют различные способы представления параллелизма: семафоры, условные критические области, мониторы, передача сообщений (синхронный или асинхронный). В рамках синхронной передачи сообщений,
Часть исследований, которые мы проводим в теории языка программирования, посвящена разрешению этих дихотомий. Например, я работал над разрешением дихотомии между императивным и функциональным программированием в статье под названием « Назначения для аппликативных языков », и теперь наш метод был принят Хаскеллом, что сделало его и функциональным, и императивным языком. Это не значит, что дихотомия полностью решена. Программист на Haskell по-прежнему сталкивается с выбором: решить свою проблему функционально или с необходимостью. Лука Карделли работал над разрешением дихотомии статической и динамической типизации. Пол Леви работал над разрешением дихотомии «вызов по значению против вызова по имени» . Не все из этих результатов еще были реализованы в реальных языках программирования.
Если все эти языки могут делать то же самое, почему бы просто не придерживаться одного языка и использовать его для программирования компьютеров?
Потому что для реального программиста недостаточно просто что-то сделать. Также важно, как это делается. Когда это сделано правильно, проблемная область точно представлена в программе, модульность проблемы сохраняется, и программы становятся простыми для понимания, изменения и обслуживания. Все это влияет на стоимость разработки и сопровождения программы. Они также влияют на надежность и безопасность программного обеспечения.
Например, многие люди используют программу под названием « Quicken » для финансовых счетов. Оригинальная программа была разработана в какой-то внутренней версии Visual Basic, и это было довольно хорошо. Однако было трудно расширять и поддерживать его. С годами, когда компания пыталась расширить ее для более новых функций, программа стала все более и более глючной с миллионами недовольных клиентов по всему миру. Они, вероятно, выиграют от реинжиниринга программного обеспечения в строго типизированном объектно-ориентированном языке программирования.
В частности, есть ли причина, по которой я должен знать функциональный язык как программист?
Исторически «функциональное программирование» было изобретено Годелем, Клини и Черчем в соответствии со стандартной математической практикой, а «императивное программирование» было изобретено Тьюрингом для закрепления понятия механических вычислений. До Тьюринга нет никаких свидетельств того, что математика когда-либо анализировала идеи императивного программирования. (Хотя все традиционные математические алгоритмы были выражены в «императивном стиле», их основное содержание все еще было функциональным.) Таким образом, императивное программирование является очень новым для человеческой цивилизации, и его математика все еще не очень хорошо понята. Причина № 1, почему каждый должен знать какое-то функциональное программирование, состоит в том, чтобы понять, как программирование может быть математическим. (Я не признаю, что императивное программирование нематематично, это то, во что вы верите функциональным программистам. Но я бы согласился с тем, что при нынешнем уровне техники мы еще не знаем, как математически выполнять императивное программирование. Многие из нас работают именно над этой проблемой.)
источник
Вы можете посмотреть на это как на эволюцию.
В начале компьютеры были запрограммированы исключительно двоичными кодами. После этого были введены мнемоники и языки ассемблера, в основном сильно зависящие от используемого процессора.
После этого были введены языки более высокого уровня (3-й уровень) (Pascal, C, ADA, Cobol), некоторые очень общие (например, C), некоторые более подходящие для обработки данных (Cobol), некоторые для вычислений (Fortran).
После этого возникли языки 4-го уровня, как языки логики (например, Пролог). Наиболее общие языки являются наследниками языков третьего уровня; некоторые из них Java, C #.
Мы также видим языки, специфичные для Интернета / сети, такие как ASP.NET, PHP.
И языки для определенного домена (DSL), которые в основном работают вместе с общим языком.
Тогда есть языки для обучения детей программированию, такие как LOGO.
Также языки для быстрого написания кода, такие как Python, Ruby и т. Д., Языки для обработки XML (XSLT).
И я, наверное, забыл много языков и даже категорий языков.
источник
другие ответы хороши, добавит несколько новых углов. как DC пишет, что языки развиваются так же, как настоящие человеческие языки! и они снова заимствуют понятия и синтаксис друг от друга, как настоящие человеческие языки. другими словами, есть также довольно реальное исследование этимологии компьютерных языков.
это также означает, что существует долгая история и сроки, которые в основном начались в 1930-х годах с лямбда-исчисления .
Существует сильное взаимодействие / синергия / симбиоз между теорией и приложением с языками программирования. новые приложения изобретены, что приводит к новым теориям и наоборот. язык программирования во многих отношениях является мостом между теорией и применением .
Интересным примером из истории является Фортран. это не очень хорошо известно, но более ранние версии Fortran (в основном до Fortran77) имели неоднозначную грамматику . это означает, что одна и та же команда может быть законно «интерпретирована» / скомпилирована разными способами компилятором, потому что было несколько допустимых «интерпретаций» (это не тот же технический смысл «интерпретируемых» языков).
поэтому теория формальных грамматик развивалась примерно в то время, когда был изобретен Фортран, и это был небольшой кризис, когда была обнаружена проблема языковой неоднозначности. Синтаксис Fortan был переформулирован, чтобы избежать этой двусмысленности, и более поздние языки были более чувствительны к двусмысленности грамматики в их дизайне. ООП также является очень важным / главным примером теоретической концепции / прогресса в языках программирования, который «воздействует» или «колеблется» во многих существующих языках, преобразуя их.
другие тематические исследования - изобретение новых технологий. например, изобретение реляционной базы данных оказало огромное влияние на компьютерные языки, например, с помощью SQL и интерфейсов компьютерных языков (например, в Java, "JDBC"). аналогично всемирная паутина с еще более масштабным воздействием. Казалось, произошел взрыв языков, приуроченный прямо к буму доткомов, который в значительной степени совпал с ранним ростом WWW и мог бы сравниться с эволюционными взрывами .
также кажется, что в новых языках программирования наблюдается длительная тенденция роста в сочетании с огромным экспоненциально возрастающей вычислительной мощностью закона Мура, который, по мнению некоторых, может замедляться.
текущие долгосрочные тенденции в языках программирования, по-видимому, направлены на большие данные и распараллеливание, например, с MapReduce . в настоящее время также существует интерес к закрытиям .
Другим ключевым аспектом языков является то, что они представляют повышающиеся уровни абстракции . они основываются на абстракциях более низкого уровня для создания абстракций более высокого уровня (аналогично пирамиде). таким образом, прогресс в эволюции компьютерного языка, вероятно, бесконечен, и мы можем быть относительно уверены, что важные новые будут и впредь изобретаться в будущем. это, вероятно, аналогично аналогичному понятию в психологии, называемому « чанкинг» , - с полным изложением - построение ментальных концепций более высокого уровня из строительных блоков более низкого уровня.
Любой, кто изучал много компьютерных языков, должен признать, что стадный менталитет можно наблюдать, когда некоторые его аспекты оказываются чрезмерно причудливыми, то есть не такими критичными, как того требуют, или даже вымирают (используются) со временем! некоторые из основных идей / изменений остаются, но (чрезмерная) реклама исчезает. в этом смысле языки программирования также выходят из моды и выходят из моды . два случая, на мой взгляд, за последние полвека, которые действительно полезны, но были преувеличены:
во многих основных языках все больше наблюдается самоподобие , так что все они имеют тенденцию сходиться к реализации многих аналогичных функций по-своему, то есть, как в случае со схемами сравнения продуктов, которые «отмечают» многие функции в сетке.
источник
Это не так, это всего лишь маркетинговый трюк - если вы заставите язык своего рода выглядеть как «С», то это снижает видимый барьер для входа.
Некоторые из них не имеют никакого влияния C: SQL, Pascal, Delphi, FORTRAN, COBOL, Ada, PowerBuilder, HyperTalk, Lisp, Simula, FOCAL, BASIC, PL / I, Algol, Algol-68, SNOBOL, Modula, Visual BASIC, Репетитор, логотип, Forth, DIBOL, Helix, AppleScript, Python, Erlang, Ruby, Pick, английский, RPG, PL / SQL, ASP, Prolog, SmallTalk, Perl, bash, Wand BASIC, REXX, DOS, пакетный язык.
Те, которые похожи на C, но имеют с ними очень мало общего: JavaScript, Java, C #, (возможно) Objective-C.
Это все маркетинг, Java, C ++ и JavaScript вроде как C, но вряд ли могут быть более разными под прикрытием.
источник