Какие важные языки нужно выучить, чтобы понять разные подходы и концепции? [закрыто]

172

Когда все, что у вас есть, это пара болторезов и бутылка водки, все выглядит как замок на двери эллинга Вольфа Блитцера. (Замените это молотком и гвоздем, если вы не читаете xkcd)

В настоящее время я программирую Clojure, Python, Java и PHP, поэтому я знаком с синтаксисом C и LISP, а также с пробелами. Я знаю императив, функциональность, неизменность, ООП и пару типов систем и другие вещи. Теперь я хочу больше!

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

Мне не хочется изучать другой функциональный язык (Haskell) или другой императивный язык ООП (Ruby), а также я не хочу практиковать непрактичные забавные языки, такие как Brainfuck.

Одна очень интересная вещь, которую я нашел, - это основанные на моно-звуке языки, такие как Factor.

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

Pepijn
источник
3
Я бы +1 за одну ссылку xkcd, но вопрос тоже интересный.
63
Кажется, вы успешный программист, а все остальное постепенно. Не пытаясь быть членом, но ... как твои жизненные финансы, отношения, здоровье, веселье, хобби? Возможно, сейчас самое время заняться некоторыми из этих вещей. Я не верю, что вам нужно знать более десятка языков одновременно. Если вам платят, чтобы использовать один - изучите это. Если вы хотите написать книгу об одном - изучите ее. Помимо этого у вас есть хорошая база программирования. Зачем изучать что-то (например, J - мое субъективное мнение :)), которое вы нигде не будете серьезно (читай make $)? Не будь самым крутым хакером на кладбище.
Хэмиш Грубиджан 18.10.10
6
Да, я успешный программист в соответствии со своими стандартами. В настоящее время я не зарабатываю много денег, но эй, мне 19. Я вкладываю время во все эти моменты и многое другое, но я нахожу и хобби, и удовольствие от программирования. Я также хочу сказать, что есть разница между пониманием языка и его освоением. Для меня достаточно освоить Python и Clojure. Я хочу понять другие возможные варианты, потому что это улучшит мой код, поможет мне понять мой компьютер и поможет мне определить свой собственный язык программирования.
Пепейн
5
Вы видели Программистов. SE ? Это относится к типу вопросов, которые лучше задать там.

Ответы:

287

Вопросы практичности очень субъективны, поэтому я просто скажу, что изучение различных языковых парадигм только поможет вам стать лучшим программистом. Что практичнее этого?

Функционально, Хаскелл - я знаю, ты сказал, что не хочешь, но тебе действительно стоит пересмотреть. Вы получили некоторое функциональное знакомство с Clojure и даже с Python, но вы не испытали его в полной мере без Haskell. Если вы действительно против Haskell, то хорошими компромиссами являются либо ML, либо OCaml.

Декларативный, Datalog - Многие люди рекомендуют Prolog в этом слоте, но я думаю, что Datalog - более чистый пример декларативного языка.

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

Стек, Фактор / Форт - Фактор очень мощный, и я планирую копаться в нем как можно скорее. Forth - прародитель языков стека, и в качестве дополнительного бонуса легко реализовать себя. Есть что-то, что можно сказать об обучении через реализацию.

Поток данных, Оз - Я думаю, что влияние Оз на подъем и будет только расти в будущем.

Основанный на прототипах, JavaScript / Io / Self - Self - дедушка и очень влиятельный на каждом языке, основанном на прототипах. Это не то же самое, что ООП на основе классов и не должно рассматриваться как таковое. Многие люди приходят к языку-прототипу и создают специальную систему классов, но если ваша цель - расширить свой кругозор, то я думаю, что это ошибка. Используйте язык на полную мощность. Прочитайте Организационные программы без Классов для идей.

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

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

Функциональные + дополнительные типы, Qi - вы говорите, что у вас есть опыт работы с некоторыми системами типов, но есть ли у вас опыт работы с системами типа «skinnable *»? Ни у кого нет ... но они должны. Q во многом похож на Lisp, но его система типов взорвет ваш разум.

Актеры + отказоустойчивость, Erlang - модель процесса Эрланга получает много шума, но ее механизмы отказоустойчивости и горячей замены кода меняют игру. Вы не узнаете много о FP, чего не узнаете с Clojure, но его функции FT заставят задуматься, почему больше языков не могут понять это правильно.

Наслаждайтесь!

fogus
источник
8
+1 - отличный ответ.
duffymo 18.10.10
2
Спасибо, что указали мне на очень много языков для изучения.
2
Я бы добавил Erlang для актерского программирования и Fortress для параллельного программирования.
ник
2
+1 за горячую замену Эрланга и распознавание отказоустойчивости
Mic
14
Нет сборки? Хорошо понимать, как работают процессоры, чтобы понять, какой код им нравится.
Ник Т
33

Что насчет Пролога (для объединения / возврата и т. Д.), Smalltalk (для «всего, что есть сообщение»), Forth (обратная польская обработка, многопоточные интерпретаторы и т. Д.), Схемы (продолжения)?

Не язык, а Искусство протокола метаобъекта - умопомрачительный материал

Архетипический Павел
источник
Поправьте меня, если я ошибаюсь, но я думаю, что Python sortof уже делает продолжения. И из того, что я прочитал, я бы лучше изучил Factor и Objective-C, чем Forth и Smalltalk, но я мог бы там срезать углы.
Пепейн
1
@pepijn, у python нет первоклассных продолжений (хотя я работаю над взломом байт-кода, чтобы его подделать)
aaronasterling 18.10.10
1
Objective-C опирается на Smalltalk, но я думаю, что реальный вывод ST - это динамизм самой среды.
Джон Кромарти
33

Я второй Хаскелл. Не думайте: «Я знаю Лисп, поэтому я знаю функциональное программирование». Вы когда-нибудь слышали о классах типа? Алгебраические типы данных? Монады? «Современные» (более или менее - по крайней мере, 50 лет;)) функциональные языки, особенно Haskell, исследовали множество очень полезных новых полезных концепций. Классы типов добавляют специальный полиморфизм, но вывод типов (еще одна вещь, которую языки, которые вы уже знаете, не имеют) работает как шарм. Алгебраические типы данных просто великолепны, особенно для моделирования древовидных структур данных, но отлично работают и для перечислений или простых записей. И монады ... ну, давайте просто скажем, что люди используют их для создания исключений, ввода-вывода, синтаксических анализаторов, понимания списков и многого другого - чисто функциональными способами!

Кроме того, вся тема достаточно глубока, чтобы занять человека годами;)

user395760
источник
«Кроме того, вся тема достаточно глубока, чтобы годами занимать ее;)» - интересно, почему это хорошо? В конце концов, наша жизнь конечна.
Вегай
1
@vegai: Почему это плохо? Есть худшие способы потратить всю жизнь, чем на обучение. И никто не говорил, что вам нужно учиться годами, чтобы правильно использовать язык - просто эта тема не исчерпана за короткое время. (Также обратите внимание на смайлик - эта часть не совсем серьезна.)
32

В настоящее время я программирую Clojure, Python, Java и PHP [...] Какие языки используют другой подход и могут быть полезны либо для выбора практического инструмента, либо для теоретического понимания?

С

Вокруг много кода на C - это определенно практично. Если вы также изучите C ++, кода станет намного больше (и вы поймете, что знаете C и Java).

Это также дает вам (или заставляет вас иметь) глубокое понимание некоторых теоретических вопросов; например, каждая запущенная программа в некотором смысле живет в байтовом массиве 4 ГБ. Указатели в C на самом деле являются просто индексами в этом массиве - это просто другое целое число. Не отличается в Java, Python, PHP, за исключением скрытых под поверхностным слоем.

Кроме того, вы можете написать объектно-ориентированный код на C, вам просто нужно немного разобраться с vtables и тому подобным. Портативная коллекция головоломок Саймона Тэтхэма - отличный пример достаточно доступного объектно-ориентированного C-кода; он также довольно хорошо спроектирован и стоит того, чтобы его можно было прочитать программисту новичка / среднего уровня. Это то, что происходит и в Haskell - классы типов в некотором смысле «просто другая vtable».

Еще одна замечательная вещь о C: участие в Q & A с опытными программистами C даст вам много ответов, которые объясняют C в терминах низкоуровневых конструкций, что создает базу знаний, более близкую к железу.

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

Йонас Кёлкер
источник
1
Это требует больше голосов. C - это язык номер один, когда вам нужно или вы хотите начать с нуля и понять работу машины - или языков программирования более высокого уровня - с нуля. Более того, он также очень универсален, компиляторы C существуют (почти) для каждой архитектуры ЦП, когда-либо разработанной.
диетолог
27

С сайта Питера Норвига:

Изучите по крайней мере полдюжины языков программирования. Включите один язык, который поддерживает абстракции классов (например, Java или C ++), один, который поддерживает функциональную абстракцию (например, Lisp или ML), один, который поддерживает синтаксическую абстракцию (как Lisp), один, который поддерживает декларативный спецификации (например, шаблоны Prolog или C ++), поддерживающие сопрограммы (например, Icon или Scheme) и поддерживающие параллелизм (например, Sisal). "

http://norvig.com/21-days.html

Galactus
источник
13

Я поражен тем, что после 6 месяцев и сотен голосов никто не упомянул SQL ...

ypercubeᵀᴹ
источник
10

В типах как теоремы / продвинутые системы типов: Coq (я думаю, что Agda тоже входит в эту категорию).

Coq - это корректный помощник, встроенный в функциональный язык программирования.

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

У него есть зависимые типы, которые одни взорвали мой разум. Простой пример:

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

является сигнатурой функции, которая объединяет два массива размера n и m элементов A и возвращает массив размера (n + m). Он не скомпилируется, если функция не возвращает это!

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

РЕДАКТИРОВАТЬ: я должен упомянуть: вы пишете функцию в Coq, а затем вы можете доказать, что это правильно для любого ввода, это удивительно!

оборота GClaramunt
источник
Я второй кок. При изучении большинства языков вы все равно можете использовать свои старые методы, но coq вынуждает вас писать программы, которые всегда работают.
Бруно Мартинес
Я пытался выучить Coq прошлым летом, но сдался, потому что мне было трудно найти хорошую документацию по изучению и использованию . Какие-либо предложения?
Я учился на курсе в моем университете, а затем прочитал «Coq'Art: исчисление индуктивных конструкций». Этого недостаточно, чтобы по-настоящему освоить его, но достаточно, чтобы оценить его.
Бруно Мартинес
6

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

оборота джнейра
источник
5

Так же, как fogus предложил это вам в своем списке, я также советую вам взглянуть на язык OzML / Mozart Многие парадигмы, в основном ориентированные на параллельное / мультиагентное программирование.

Что касается параллелизма и распределенного исчисления, то эквивалент лямбда-исчисления (который стоит за функциональным программированием) называется пи-исчислением.

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

Стефан Роллан
источник
5

Программирование потоков данных, или программирование на основе потоков, - хороший шаг вперед на пути. Несколько модных слов: обработка паралелей, быстрое создание прототипов, визуальное программирование (не так плохо, как сначала звучит).

Статьи Википедии хороши:

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

Прочитайте книгу JPM: http://jpaulmorrison.com/fbp/

(Мы написали простую реализацию на C ++ для целей домашней автоматизации, и мы очень довольны. Документация находится в стадии разработки.)

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

Вы выучили много языков. Сейчас самое время сосредоточиться на одном языке и овладеть им.

Sandman
источник
3

возможно, вы захотите попробовать LabView для визуального программирования, хотя это для инженерных целей.

тем не менее, вы, кажется, довольно заинтересованы во всем, что есть, отсюда и предположение

Кроме того, вы можете попробовать Android Appinventor для визуального построения вещей

Belun
источник
LabView имеет забавный «синтаксис», но очень сложно щелкнуть и перетащить весь код. Я не рекомендовал бы это программисту.
Иштар
Вот что поставляется с Lego NXT, верно? Совершенно не работает для меня. Спасибо за предложение, хотя.
Пепейн
это от National Instruments. LabVIEW - это графическая среда разработки, которая делает ученых и инженеров более продуктивными
Belun,
2

Брюс А. Тейт, взяв страницу от Прагматического Программиста, написал книгу о том, что именно: Семь языков за семь недель: прагматическое руководство по изучению языков программирования

В книге он описывает Clojure, Haskell, Io, Prolog, Scala, Erlang и Ruby.

Aissen
источник
2
Имейте в виду, что книга переполнена ссылками на фильмы, которые, очевидно, стали частью американской поп-культуры. Если вы еще не видели фильмы, вам будет интересно, о чем Тейт. Если вы смотрели фильмы, вы все равно можете быть отстранены постоянной антропоморфизацией языков программирования или просто не любить рассматриваемые символы (мне не нравится Мэри Поппинс; по совпадению я также не люблю Ruby, поэтому аналогия может быть к чему-то).
Алан Плам
2

Меркурий : http://www.mercury.csse.unimelb.edu.au/

Это типизированный Пролог с типами и режимами уникальности (т. Е. С указанием, что предикат, append(X,Y,Z)означающий X, добавленный к Y, равен Z, дает один Z с учетом X и Y, но может давать несколько X / Y для данного Z). Кроме того, нет вырезки или других дополнительных логических предикатов.

Если хотите, это к Прологу, как Хаскелл к Лиспу.

yatima2975
источник
1
  1. Программирование не распространяется на задачу программистов.
  2. Новые вещи всегда интересны, но есть очень классные старые вещи.

Первой системой баз данных для меня была dBaseIII, я потратил около месяца на написание небольших примеров (dBase / FoxPro / Clipper - это база данных на основе таблиц с индексами). Затем, на моем первом рабочем месте, я встретил MUMPS, и у меня заболела голова. Я был молод и молод, но потребовалось 2 недели, чтобы понять модель базы данных MUMPS. Был момент, как в комиксах: через 2 недели кнопка была включена, и лампочка просто загорелась в моей голове. MUMPS естественный, низкий уровень и очень-очень быстрый. (Это несбалансированное, неформализованное дерево без типов.) Современные тенденции показывают путь к этому: NoSQL, ключ-значение db, многомерный db - так что осталось всего несколько шагов, и мы достигли Mumps.

Вот презентация о преимуществах MUMPS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

Краткий документ по иерархической базе данных: http://www.cs.pitt.edu/~chang/156/14hier.html

Введение в глобальные переменные MUMPS (в MUMPS локальные переменные: short: локальные переменные являются переменными памяти, а глобальные переменные: short: глобальные переменные - это «переменные db», установка глобальной переменной немедленно попадает на диск): http: // gradvs1.mgateway.com/download/extreme1.pdf (PDF)

ern0
источник
1

Скажи, что хочешь написать любовное стихотворение ...

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

Как только вы достигнете почти разговорного уровня, вы готовы начать свое стихотворение.

Роджер
источник
4
Конечно, это будет мусорное стихотворение, потому что для написания стихов нужно говорить намного выше обычного уровня родного языка. А вашей девушке нужно будет выучить французский, чтобы ее прочитать. Если она уже не француженка, в этом случае ей, вероятно, будет неловко.
Джон Лоуренс Аспден
Восхитительная ирония, Джон, мне это нравится (я
француз
1

В то время как изучение новых языков на академическом уровне является интересным хобби, ИМХО, вы не сможете научиться использовать один, пока не попробуете применить его к реальной проблеме. Поэтому вместо того, чтобы искать новый язык для изучения, я бы сначала занялся поиском новых вещей для создания, и только потом я бы искал подходящий язык для этого конкретного проекта. Сначала выберите проблему, затем инструмент, а не наоборот.

Ivanhoe
источник
1

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

На той же строчке я бы выбрал калькулятор серии HP-41C (или эмулятор, хотя ничто не сравнится с настоящим оборудованием). Трудно обернуть вокруг себя мозг, но оно того стоит. TI-57 подойдет, но это будет совершенно другой опыт. Если вам удастся решить уравнения второй степени на TI-55, вы будете считаться мастером (у него не было никаких условий и ветвей, кроме RST, который переместил программу обратно на шаг 0).

И наконец, я бы выбрал FORTH (это упоминалось ранее). У него есть хорошая вещь "создай свой язык", но гораздо более голая. Он научит вас, почему Rails интересен и когда DSL имеют смысл, и вы поймете, что думает ваш калькулятор без RPN, пока вы печатаете.

rbanffy
источник
1

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

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

Попробуйте программировать графические процессоры - CUDA или OpenCL. Это просто расширения C / C ++, но ментальная модель архитектуры снова полностью отличается от классического подхода, и она определенно становится практичной, когда вам нужно выполнить некоторое вычисление реальных чисел.

pasky
источник
1

Erlang, Forth и некоторые встроенные работы с ассемблером. В самом деле; купите комплект Arduino или что-то подобное, и создайте полифонический звуковой сигнал в сборке. Вы действительно чему-то научитесь.

Барт ван Динен
источник
1

Также есть аник :

https://code.google.com/p/anic/

С его сайта:

Быстрее, чем C, Безопаснее, чем Java, Проще, чем * sh

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

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

itistoday
источник
1

Несмотря на то, что вы не удовлетворяете вашему требованию «другого» - я бы держал пари, что Fantom - это язык, на который должен смотреть профессиональный программист По их собственному признанию, авторы фэнтома называют это скучным языком. Он просто демонстрирует наиболее распространенные сценарии использования Java и C # с некоторым заимствованным синтаксисом замыкания в ruby ​​и аналогичных более новых языках.

И все же ему удается иметь свой собственный загрузочный компилятор, обеспечить платформу, которая позволяет быстро устанавливать без внешних зависимостей, правильно получает пакеты - и работает на Java, C # и теперь в Интернете (через js).

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

Вкд
источник
1

Одна вещь, которую я вижу, отсутствует в других ответах: языки, основанные на переписывании терминов.

Вы можете взглянуть на Pure - http://code.google.com/p/pure-lang/ .

Mathematica также основывается на переписывании, хотя не так просто понять, что происходит, так как она довольно закрыта.

JonyEpsilon
источник
0

APL, Forth и Ассамблея.

Веселиться. Подберите комплект робота Lego Mindstorm и RobotC от CMU и напишите код робототехники. Вещи случаются, когда вы пишете код, который должен «испачкаться» и взаимодействовать с реальным миром, который вы, возможно, не сможете изучить никаким другим способом. Да, на одном языке, но с другой точки зрения.

Мартин
источник