Какие важные языки учатся понимать разные подходы и концепции?

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

Dataflow, Oz - Я думаю, что влияние Oz находится на подъеме и будет продолжать расти в будущем.

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

Экспертная система, CLIPS - я всегда рекомендую это. Если вы знаете Prolog, то, скорее всего, у вас будет преимущество в скорости, но это совсем другой язык.

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

Функциональные + Дополнительные типы, Qi - Вы говорите, что у вас есть опыт работы с некоторыми системами типов, но есть ли у вас опыт работы с системами типа скинов * Никто не имеет... но они должны. Qi как Lisp в много способов, но система его типа взорвёт ваш разум.

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

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

Ответ 2

Как насчет Prolog (для унификации/возврата и т.д.), Smalltalk (для "всего сообщения" ), Forth (обратный полис, поточные интерпретаторы и т.д.), схема (продолжение)?

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

Ответ 3

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

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

Ответ 4

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

С

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

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

Кроме того, вы можете написать объектно-ориентированный код в C, вам просто нужно немного руководствоваться об vtables и т.д. Simon Tatham Portable Puzzle Collection - отличный пример довольно доступного объектно-ориентированного кода C; он также довольно хорошо спроектирован и хорошо стоит читать начинающему/промежуточному программисту C. Это то, что происходит и в Haskell, - типы классов в некотором смысле "просто еще один vtable".

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

В типах как теоремы/системы расширенного типа: 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). Он не будет компилироваться, если функция не вернет это!

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

EDIT: Мне нужно упомянуть: вы пишете функцию в Coq, а затем вы можете PROVE, это правильно для любого ввода, это потрясающе!

Ответ 8

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

Ответ 9

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

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

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

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

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

Ответ 10

Подобно тому, как fogus предложил его вам в своем списке, я также советую вам взглянуть на язык OzML/Mozart Многие парадигмы, в основном нацеленные на программирование concurrency/multi agent.

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

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

Ответ 11

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

Ответ 12

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

тем не менее, вы, похоже, очень заинтересованы во всем этом, поэтому предложение

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

Ответ 14

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

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

Если вы это сделаете, то Prolog as Haskell будет Lisp.

Ответ 15

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

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

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

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

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

Ответ 16

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

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

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

Ответ 17

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

Ответ 18

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

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

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

Ответ 19

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

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

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

Ответ 20

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

Ответ 21

Там также anic:

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

С сайта:

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

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

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

Ответ 22

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

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

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

Ответ 23

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

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

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

Ответ 24

APL, Forth и Assembly.

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