Почему так много языков программирования?


130

Я довольно свободно говорю на C / C ++ и могу разбираться с различными языками сценариев (awk / sed / perl). Я начал использовать python гораздо больше, потому что он сочетает в себе некоторые изящные аспекты C ++ с возможностями сценариев awk / sed / perl.

Но почему так много разных языков программирования? Я предполагаю, что все эти языки могут делать то же самое, так почему бы просто не придерживаться одного языка и использовать его для программирования компьютеров? В частности, есть ли причина, по которой я должен знать функциональный язык как программист?

Некоторые связанные чтения:


2
Существует также разница между OO и не OO. Кроме того, некоторые языки поставляются с хорошими пакетами: R, Maple, Matlab, Mathematica, которые часто отсутствуют в других языках.
Артем Казнатчеев


4
Уже спрашиваю у программистов programmers.stackexchange.com/q/7551/45322
alain.janinm

2
Для реализации параллельных алгоритмов функциональное программирование лучше, в общем, когда у вас есть изменяемые объекты, лучше использовать OO-парадигму, иначе (если вы хотите иметь дело с неизменяемыми объектами) лучше заменить его на функциональную модель. Этот сценарий широко существует при параллельной обработке. Также некоторые из превосходных шаблонов ОО, такие как плавный интерфейс и объединение методов , работают как функциональная парадигма.

4
Почему так много машин? Почему так много самолетов? А как насчет лодок! Я имею в виду, действительно! Вы спускаетесь к океану, и там, как, все виды чертовых вещей! Какой смысл во всех этих разных вещах?!?!? Это неэффективно! Это расточительно! И в чём смысл всех этих разных вариантов?!?!? Боже - мудрые люди! Никто не может нуждаться в чем-либо, кроме Yugo, F-150 и океанского лайнера! О, да, самолеты - MD-80 отлично подойдет практически для всего. Там. Теперь, когда все решено ... :-)
Боб Джарвис

Ответы:


116

Языки программирования развиваются и совершенствуются со временем (инновации).

Люди берут идеи с разных языков и объединяют их в новые языки. Некоторые функции улучшены (механизмы наследования, системы типов), некоторые добавлены (сборка мусора, обработка исключений), некоторые удалены ( 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. Более серьезно, как уже упоминалось в другом ответе, функциональное программирование дает вам другой способ мышления о проблемах. Это относится ко всем другим парадигмам; некоторые лучше подходят для некоторых проблем, а некоторые нет. Вот почему мультипарадигмальные языки становятся все более популярными: вы можете использовать конструкции из другой парадигмы, если вам нужно, без смены языка, и, что более сложно, вы можете смешивать парадигмы в одном программном обеспечении.


1
Полностью согласен. Меня интересует, где через несколько лет появятся мультипарадигмальные языки (например, Scala). Если они допускают простую интеграцию с DSL, мы можем увидеть постепенное снижение количества языков.
Рафаэль

2
Очень подробный ответ! Мы могли бы признать, что большинство языков программирования могут быть эквивалентными по Тьюрингу, но это не означает, что поддерживаемая ими абстракция подходит для любой проблемной области.
CyberFonic

Помещение сборки и C ++ в одну коробку вредит моему сердцу. C ++ сильно развился !! Специально начиная с C ++ 11 и вперед.
Peregring-lk

66

TLDR: Там нет языка серебряной пули.

Я надеюсь, что они не будут судиться со мной, но вот фотография из одной из презентаций Стэнфорда.

введите описание изображения здесь

Когда вы решите выбрать язык, вы можете выбрать только 2 из этих 3 функций .

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

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

Сочетание таких факторов дает новый язык.

( И я слышал, что каждый хороший программист должен создавать свой новый язык;) )


11
Со временем треугольник сжимается, в том смысле, что углы сближаются ... Я надеюсь / мечтаю.
Дейв Кларк

1
Производительность и универсальность можно сравнивать более или менее, но я добавлю, что опыт работы с языком дает вам большую продуктивность, чем сам определенный язык, несправедливо сравнивать только «производительность языков», потому что вам нужны знания и опыт их все, очень маловероятная гипотеза.
Hernan_eche

Это интересное утверждение, которое напоминает мне теорему CAP. Это неформальная аргументация или треугольник может быть доказан?
Евну

1
@evnu, вот квазиформальный аргумент, состоящий из одной части: если предположить, что общность означает, что допустимые программы любой длины n на языке L покрывают большее проблемное пространство, каждое подпространство проблем покрывается только некоторыми долями программ длины n. Если бы программы длины n вне вашего конкретного подпространства были вместо этого внутри вашего подпространства, у вас были бы большие шансы найти более короткую программу, которая бы решала вашу проблему (так что вы, вероятно, были бы более продуктивной), но язык был бы менее общим. - это решило бы проблемы в других подпространствах менее хорошо (то есть с более длинными программами).
Йонас Кёлькер

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

25

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

  • Кто-то считает, что может улучшить существующие продукты
  • Местные соображения требуют другого дизайна (подумайте: дома на сваях или дома на бетонных плитах)
  • Новая категория товаров удовлетворяет потребность там, где ее раньше не было

Зайдите в любой канцелярский магазин и посмотрите раздел «Письменные принадлежности» - здесь есть сотни разновидностей ручек. Все они делают примерно одно и то же: доставляют чернила на поверхность для письма. Но каждая ручка, которую вы видите выставленной на продажу, есть там, потому что одна из трех причин выше.

  • Перьевые ручки с патронами - это усовершенствование перьевых ручек, которые сами по себе являются улучшением перьевых перьев.
  • НАСА нуждалась в ручке, которая могла писать без гравитации, поэтому была изобретена ручка-роллер под давлением.
  • Самой первой ручкой, возможно, была заостренная палочка, смоченная в смоле или крови; до этого люди скребли камни или смазывали пигментами стены мехом. (Просто предположение.)

Развитие ручек будет продолжаться, поскольку ни один продукт не соответствует потребностям каждого пользователя. Некоторые ручки дешевые и одноразовые, некоторые дорогие и изготовлены из высококачественных материалов; некоторые используют гели, некоторые используют чернила, некоторые используют пигменты; у некоторых есть заглушки, у некоторых вообще нет; широкие бочки, узкие бочки, круглые бочки, квадратные бочки; короткий, длинный; красный, белый, черный, синий. И т. Д.

Но хватит о ручках.

Наше текущее множество языков программирования можно проследить до самых первых: числовые машинные коды для ранних компьютеров еще в 1940-х годах. Примитивный, сложный в использовании и трудоемкий для входа в компьютер, но они сделали свою работу. Вскоре после этого программисты присвоили мнемонические слова (такие как ADD, CALL, LOAD) машинным кодам, породив класс языков, называемых «ассемблеры».

Разные архитектуры процессоров требовали разных мнемонических кодов, в зависимости от специфических особенностей базовых машин. Учет этих различий означал создание разных языков ассемблера.

(Возможно, теперь вы можете видеть, куда это идет ...)

Программисты смотрели на свои программы на языках ассемблера и видели шаблоны: одни и те же последовательности инструкций будут использоваться для формирования циклов, условий, назначения переменных, вызовов функций и так далее. Таким образом, процедурные языки программирования родились. Эти языки инкапсулировали группы инструкций под зонтичными терминами, такими как «if», «while», «let» и т.д.

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

И еще есть объектно-ориентированные, статически типизированные, динамически типизированные, позднее связывание, раннее связывание, низкое использование памяти, высокое использование памяти, распараллеливание, языки для специальных целей и так далее.

В конечном счете, у нас разные языки программирования, потому что мы хотим разные языки программирования. У каждого дизайнера языка есть свои идеи о том, как будет выглядеть и работать их язык «мечты». Разнообразие это хорошо .


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

Это точно. Программисты по своей природе решают проблемы. Для решения проблем им нужны инструменты, которые часто принимают форму языков программирования. Если инструменты не могут помочь им решить их проблему так, как они хотят, они изобретают новые инструменты. Думайте об этом так: поскольку инструменты являются программным обеспечением, а новое программное обеспечение написано для решения новых проблем, сами инструменты могут быть проблемами, которые необходимо решить. Эти проблемы решаются путем создания новых инструментов.
Барри Браун

Всего лишь одна гадость: функциональная ветвь языков - это фрагмент математических представлений о том, как выразить то, что мы сегодня называем «вычислениями», которые начали рассматривать примерно за 50 лет до появления первых компьютеров. Недаром LISP (в некоторой форме) является вторым старейшим языком, первым из которых является FORTRAN.
vonbrand

20

Языки функционального программирования обычно основаны на другой (но эквивалентной по мощности) модели вычисления: лямбда-исчисление . Существуют некоторые нетипизированные (с Python-подобной типизацией) языки, такие как LISP, Scheme (используемые в широко узнаваемой книге / курсе « Структура и интерпретация компьютерных программ» ) и языки со статической типизацией, такие как Haskell, ML, F #.

SICP привел меня в функциональное программирование, но другие люди рекомендуют эту статью Джона Хьюза и это интервью с ним.

Например, в настоящее время Microsoft продвигает функциональное программирование, которое включило F # (их функциональный язык для .NET) в VS2010 и 11; они также нанимают некоторых разработчиков Haskell в MSR, IIRC.

Обратите внимание, что существуют также некоторые функциональные языки программирования без лямбда-исчисления, такие как Refal , основанный на сопоставлении с образцом и переписывании.

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


1
Другой интересный класс языков - это языки логического программирования, такие как Prolog. У меня был очень ограниченный опыт работы с DataLog, так что, может быть, кто-нибудь еще мог бы написать ответ о них?
Даниил

2
Я согласен, что нам нужен язык программирования для каждой парадигмы программирования: императив, ОО, декларативный, функциональный и т. Д. Но это не объясняет, почему у нас так много, скажем, ОО-языков.
Дай

@Dai, хорошо, правда? Теоретическая основа - не единственная характеристика языка. Например, можно сказать, что ключевой особенностью Java или C # является (по сравнению с C ++) виртуальная машина, что значительно отличает Java.
Даниил

Но тогда, если C # и Java оба используют концепцию виртуальной машины, почему бы нам не использовать одинаковый синтаксис для обоих языков? Я думаю, что каждый дизайнер имеет свои сильные идеи о том, как должен выглядеть его язык, и имеет тенденцию создавать свой собственный стандарт.
Дай

@Dai, в конце концов, между C # и Java есть много небольших отличий. Кроме того, я думаю, что был какой-то юридический спор по поводу Java VM для Windows или чего-то в этом роде.
Даниил

19

В частности, есть ли причина, по которой я должен знать функциональный язык как программист?

Да. Потому что Haskell изменил способ, которым я думаю. Это может изменить ваш образ мышления.

История: Раньше я думал, что могу выучить любой язык программирования за день. Однажды я начал Haskell. Я закончил все, что было до монад за полдня. С того дня прошел год, и я все еще безнадежно застрял в Монаде.

Читать:

  1. Языки и мысли вики

  2. Нотация как инструмент для размышлений Кеннет Э. Иверсион, лекция премии Тьюринга

Но почему так много разных языков программирования?

Нотация - это инструмент для размышлений. Нам нужны индивидуальные нотации, чтобы удобно работать с разными мыслями. Поэтому мы создаем новые языки.

Также читай . ;-)


5
Повторять это божественно!
Pratik Deoghare

4
повторять это человек?
Суреш

1
Не уверен, что это хорошая реклама для Haskell. ;)
Барри Браун

@Pratik Deoghare. Изучение Хаскелла за один день было, вероятно, плохой идеей. Я бы сказал, прочитайте хороший учебник по функциональному программированию, такой как Bird и Wadler, и не торопитесь делать это. Тогда монады могут быть не такими сложными.
Удай Редди

«Я закончил все, что было до монад за полдня». В самом деле? Вы изучали классы типов, функторы, ADT, виды и т. Д. За полдня? Это невозможно. Лях имеет монады в главе 12 из 14 RWH не имеют монад Till главы 6, и они вводятся очень постепенно - полное определение в главе 14.
sdcvvc

13

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

Абади и Карделли в «Теории объектов» разрабатывают целое семейство языков программирования из объектно-ориентированных фондов. Они доказывают, что функциональное программирование является частным случаем ОО, но не наоборот.

Изобретать что-то новое - это весело, поэтому люди чаще создают еще один язык, чем способствуют улучшению существующего. Конечно, есть хранители языков, которые не приветствуют изменения в своем видении. Лучший пример - пропасть между сторонниками Common Lisp и Scheme.


3
Теория объектов не представляет целого семейства используемых языков программирования. Он представляет собой основу для объектно-ориентированных языков программирования, причём странный, не основанный на классах. Я не вижу связи между «Теорией объектов» и функциональным программированием. Например, в объектном исчислении нет понятия лени. Существует также исследование кодирования ОО-понятий с точки зрения функций и записей, например, работа Пирса в конце 90-х годов.
Дэйв Кларк

12

Поскольку другие уже дали хорошие ответы на этот вопрос, я просто процитирую Алана Перлиса.

Остерегайтесь смоляной ямы, в которой все возможно, но ничего интересного не так просто.

Кроме того, http://weblog.raganwald.com/2004/10/beware-of-turing-tar-pit.html , является хорошим чтением.


11

Почему в мире так много стран? Разве не было бы легче, если бы у нас было всего 5 или 6 сверхдержав или хотя бы одно универсальное царство Земли? Легко спорить, почему это не будет лучше - для начала конкуренция между разными странами может привести к прогрессу, и с точки зрения демократии, прав человека и т. Д. Многие страны могут быть лучше, чем одна - - но это не объясняет, почему у нас много стран. Это только объясняет, почему многие страны будут лучше .

Точно так же вы можете спросить, почему так много разных человеческих языков? Польский, арабский, мандаринский ... Не было бы проще, если бы был только один язык? Вы могли бы поспорить в любом случае, но это были бы причины, почему было бы лучше, если бы жизнь была так или иначе. Это не объяснило бы причины существования такого множества разных человеческих языков.

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

Прочитайте этот очень поучительный пост в блоге, Почему так много веб-фреймворков Python? По-видимому, в Python существует около 50 веб-фреймворков. Это просто смешно; нет абсолютно никакой разумной разумной причины для этого. Но автор поста отвечает: существует так много веб-фреймворков Python, потому что их так легко создать . Вам не нужна рациональная причина для того, чтобы существовало больше веб-фреймворков Python или больше языков программирования. Люди будут продолжать создавать новые, потому что они не знают, что уже доступно, или потому что они надеются, что смогут заработать деньги, или просто потому, что создавать новые вещи - это весело!

Позвольте мне описать личный пример. Около 10 лет назад я писал код на C ++ для финской компании. Вы знаете, в Финляндии есть те огромные грузовики, которые, ну, в общем, путешествуют на дальние расстояния и доставляют много вещей из одного места в другое. Я уверен, что в Америке есть и такие грузовики. Поэтому типичная проблема - убедиться, что все 24 или около того шины в порядке. Конечно, есть проверенная временем технология: давление и температуру можно контролировать, и радикальные изменения указывают на то, что что-то пошло не так. Конечно, вся эта технология является запатентованной, запатентованной, со всеми вытекающими последствиями. (Помните: патенты должны способствовать инновациям!) Так что эта финская компания хотела определить состояние шин по ... звуку. Идея заключалась в том, чтобы установить микрофоны, чтобы прослушивать звук, исходящий из всех шин, и выполнить какое-то волшебство по обработке сигналов для этих звуков, чтобы увидеть, не возникла ли какая-либо проблема с одной из шин, и я делал прототип этого безумия. (У них даже была специальная лаборатория для записи образцов звука; однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины после того, как она подверглась давлению 5 или 10 тонн и нагрелась до какой-то нелепой температуры Очевидно, опять же, не было особой разумной причины для этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все. (У них даже была специальная лаборатория для записи образцов звука; однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины после того, как она подверглась давлению 5 или 10 тонн и нагрелась до какой-то нелепой температуры Очевидно, опять же, не было особой разумной причины для этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все. (У них даже была специальная лаборатория для записи образцов звука; однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины после того, как она подверглась давлению 5 или 10 тонн и нагрелась до какой-то нелепой температуры Очевидно, опять же, не было особой разумной причины для этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все. однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины, подвергнув ее 5 или 10 тоннам давления и нагревая ее до какой-то нелепой температуры.) Очевидно, опять же, не было особого рационального Причина этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все. однажды они прислали мне впечатляющую видеозапись особого случая, когда им удалось взорвать образец шины, подвергнув ее 5 или 10 тоннам давления и нагревая ее до какой-то нелепой температуры.) Очевидно, опять же, не было особого рационального Причина этого развития, за исключением того, что это было весело, и некоторые люди хотели зарабатывать деньги. Также поймите, что существует множество причин, по которым кто-то может начать разработку нового языка программирования. Нет необходимости или даже возможности изучать их все.

Конечно, все это применимо, только если вы верите в эволюцию. Если вы верите в какую-то форму разумного замысла, что Бог также создал все языки программирования, тогда вам придется найти цель, стоящую за этим множеством. Возможно, Бог хотел способствовать конкуренции между различными языками программирования, чтобы искусство разработки программного обеспечения достигло максимально возможного состояния.

В заключение, есть много людей, много стран, много языков программирования. Это просто природа жизни! Давайте будем благодарны за это: это просто означает, что область программирования / информатики очень жива и процветает.


очень идеальный ответ, я не знаю, почему он не был принят!
Am_I_Helpful

8

Почему так много разных языков программирования?

Потому что есть выбор:

  • Режим спецификации: императивный или функциональный
  • Ввод: статически типизированный или динамически типизированный
  • Порядок оценки: вызов по значению против вызова по имени
  • Модульность: основанный на классе или абстрактный тип данных
  • Модель исполнения: последовательная или параллельная

К счастью, последние два являются несущественными дихотомиями, то есть можно было бы поместить оба варианта в один язык программирования. Но первые три дихотомии дают 8 комбинаций. Так что даже в идеальном мире было бы как минимум 8 языков программирования. Когда вы углубитесь в детали, у вас будут дополнительные нюансы выбора дизайна в рамках конкретных парадигм. Например, если кто-то решит использовать статически типизированный язык на основе классов, существуют разные способы проектирования системы типов. Канонического способа сделать это еще нет. Если кто-то решает сделать параллельный язык программирования, существуют различные способы представления параллелизма: семафоры, условные критические области, мониторы, передача сообщений (синхронный или асинхронный). В рамках синхронной передачи сообщений,

Часть исследований, которые мы проводим в теории языка программирования, посвящена разрешению этих дихотомий. Например, я работал над разрешением дихотомии между императивным и функциональным программированием в статье под названием « Назначения для аппликативных языков », и теперь наш метод был принят Хаскеллом, что сделало его и функциональным, и императивным языком. Это не значит, что дихотомия полностью решена. Программист на Haskell по-прежнему сталкивается с выбором: решить свою проблему функционально или с необходимостью. Лука Карделли работал над разрешением дихотомии статической и динамической типизации. Пол Леви работал над разрешением дихотомии «вызов по значению против вызова по имени» . Не все из этих результатов еще были реализованы в реальных языках программирования.


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

Потому что для реального программиста недостаточно просто что-то сделать. Также важно, как это делается. Когда это сделано правильно, проблемная область точно представлена ​​в программе, модульность проблемы сохраняется, и программы становятся простыми для понимания, изменения и обслуживания. Все это влияет на стоимость разработки и сопровождения программы. Они также влияют на надежность и безопасность программного обеспечения.

Например, многие люди используют программу под названием « Quicken » для финансовых счетов. Оригинальная программа была разработана в какой-то внутренней версии Visual Basic, и это было довольно хорошо. Однако было трудно расширять и поддерживать его. С годами, когда компания пыталась расширить ее для более новых функций, программа стала все более и более глючной с миллионами недовольных клиентов по всему миру. Они, вероятно, выиграют от реинжиниринга программного обеспечения в строго типизированном объектно-ориентированном языке программирования.


В частности, есть ли причина, по которой я должен знать функциональный язык как программист?

Исторически «функциональное программирование» было изобретено Годелем, Клини и Черчем в соответствии со стандартной математической практикой, а «императивное программирование» было изобретено Тьюрингом для закрепления понятия механических вычислений. До Тьюринга нет никаких свидетельств того, что математика когда-либо анализировала идеи императивного программирования. (Хотя все традиционные математические алгоритмы были выражены в «императивном стиле», их основное содержание все еще было функциональным.) Таким образом, императивное программирование является очень новым для человеческой цивилизации, и его математика все еще не очень хорошо понята. Причина № 1, почему каждый должен знать какое-то функциональное программирование, состоит в том, чтобы понять, как программирование может быть математическим. (Я не признаю, что императивное программирование нематематично, это то, во что вы верите функциональным программистам. Но я бы согласился с тем, что при нынешнем уровне техники мы еще не знаем, как математически выполнять императивное программирование. Многие из нас работают именно над этой проблемой.)


1

Вы можете посмотреть на это как на эволюцию.

В начале компьютеры были запрограммированы исключительно двоичными кодами. После этого были введены мнемоники и языки ассемблера, в основном сильно зависящие от используемого процессора.

После этого были введены языки более высокого уровня (3-й уровень) (Pascal, C, ADA, Cobol), некоторые очень общие (например, C), некоторые более подходящие для обработки данных (Cobol), некоторые для вычислений (Fortran).

После этого возникли языки 4-го уровня, как языки логики (например, Пролог). Наиболее общие языки являются наследниками языков третьего уровня; некоторые из них Java, C #.

Мы также видим языки, специфичные для Интернета / сети, такие как ASP.NET, PHP.

И языки для определенного домена (DSL), которые в основном работают вместе с общим языком.

Тогда есть языки для обучения детей программированию, такие как LOGO.

Также языки для быстрого написания кода, такие как Python, Ruby и т. Д., Языки для обработки XML (XSLT).

И я, наверное, забыл много языков и даже категорий языков.


1
Ваша хронология запуталась. Пролог с 1972 года, который младше Ады (1983). Я не знаю, что вы подразумеваете под "наследниками языков третьего уровня"; немногие языки не являются потомками Фортрана, в том числе C и Паскаль (который родил Ада).
Просфилаес

1
@prosfilaes, способ спутать. FORTRAN был первым языком, который все еще использовался, затем появился LISP, затем COBOL. Algol был определен для публикации алгоритмов, а не для машинного использования (но в любом случае это были компиляторы), с офшотами Pascal и более поздними версиями C. PL / 1 представлял собой странную смесь FORTRAN и COBOL с управляющими структурами Algol-ish.
vonbrand

1

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

это также означает, что существует долгая история и сроки, которые в основном начались в 1930-х годах с лямбда-исчисления .

Существует сильное взаимодействие / синергия / симбиоз между теорией и приложением с языками программирования. новые приложения изобретены, что приводит к новым теориям и наоборот. язык программирования во многих отношениях является мостом между теорией и применением .

Интересным примером из истории является Фортран. это не очень хорошо известно, но более ранние версии Fortran (в основном до Fortran77) имели неоднозначную грамматику . это означает, что одна и та же команда может быть законно «интерпретирована» / скомпилирована разными способами компилятором, потому что было несколько допустимых «интерпретаций» (это не тот же технический смысл «интерпретируемых» языков).

поэтому теория формальных грамматик развивалась примерно в то время, когда был изобретен Фортран, и это был небольшой кризис, когда была обнаружена проблема языковой неоднозначности. Синтаксис Fortan был переформулирован, чтобы избежать этой двусмысленности, и более поздние языки были более чувствительны к двусмысленности грамматики в их дизайне. ООП также является очень важным / главным примером теоретической концепции / прогресса в языках программирования, который «воздействует» или «колеблется» во многих существующих языках, преобразуя их.

другие тематические исследования - изобретение новых технологий. например, изобретение реляционной базы данных оказало огромное влияние на компьютерные языки, например, с помощью SQL и интерфейсов компьютерных языков (например, в Java, "JDBC"). аналогично всемирная паутина с еще более масштабным воздействием. Казалось, произошел взрыв языков, приуроченный прямо к буму доткомов, который в значительной степени совпал с ранним ростом WWW и мог бы сравниться с эволюционными взрывами .

также кажется, что в новых языках программирования наблюдается длительная тенденция роста в сочетании с огромным экспоненциально возрастающей вычислительной мощностью закона Мура, который, по мнению некоторых, может замедляться.

текущие долгосрочные тенденции в языках программирования, по-видимому, направлены на большие данные и распараллеливание, например, с MapReduce . в настоящее время также существует интерес к закрытиям .

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

Любой, кто изучал много компьютерных языков, должен признать, что стадный менталитет можно наблюдать, когда некоторые его аспекты оказываются чрезмерно причудливыми, то есть не такими критичными, как того требуют, или даже вымирают (используются) со временем! некоторые из основных идей / изменений остаются, но (чрезмерная) реклама исчезает. в этом смысле языки программирования также выходят из моды и выходят из моды . два случая, на мой взгляд, за последние полвека, которые действительно полезны, но были преувеличены:

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


см. также шаблоны проектирования, которые часто пересекаются с языками и реализуются на языках. Другим ключевым аспектом изучения языка / функциональности являются функции, реализованные в библиотеках
vzn

ФОРТРАН никогда не имел формального описания, тем более сложности выражения, которое могло привести к грамматическим неоднозначностям (да, я начал программировать с мерзости, называемой PDQ FORTRAN, а позднее - с FORTRAN IV) языка, на котором (очень смущающая) неоднозначность в В грамматике появился Algol, первый язык, определенный грамматикой.
vonbrand

Принято во внимание оригинальный / ранний FORTRAN, но более поздние версии были более формализованы с более строгими грамматическими определениями. Это тематическое исследование, показывающее эволюцию языка наряду с теорией языка.
vzn

ФОРТРАН подвергся принудительному кормлению грамматикой, но никогда не создавался вокруг нее. Алгол начал эту тенденцию, которую продолжили Паскаль, семья Модула, Оберон, С и ее потомки, PL / 1, Ада и другие. Учитывая не зависящую от контекста технологию грамматики и понимание синтаксического анализа, определение грамматики и ее преобразование в безошибочный синтаксический анализатор сегодня почти тривиально, без чего не обходится ни один новый язык.
vonbrand

приложение, тематическое исследование на новых / появляющихся языках: Google go , node.js , Apple swift
vzn

-3

Это не так, это всего лишь маркетинговый трюк - если вы заставите язык своего рода выглядеть как «С», то это снижает видимый барьер для входа.

Некоторые из них не имеют никакого влияния 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, но вряд ли могут быть более разными под прикрытием.


5
«Они не были» - что не было чем? В любом случае, я не вижу, как это отвечает на вопрос. Это просто список языков вместе с совершенно необоснованным утверждением, что маркетинг каким-то образом вовлечен.
Дэвид Ричерби

2
«Некоторые, которые вообще не имеют никакого влияния на С: ... Алгол, Алгол-68, ...» - Забавно, что вы должны это сказать, учитывая, что С возникло из Алгола. «если вы заставите язык своего рода выглядеть как« С », то это снижает видимый барьер для входа» - iirc, это было доказано неправильно. Студенты, не знакомые с программированием, быстрее учатся на других языках (я думаю, что они использовали Haskell в этом исследовании).
Рафаэль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.