Какие важные языки учатся понимать разные подходы и концепции?
Когда все, что у вас есть, - это пара болтов и бутылка водки, все выглядит как замок на двери ловушки Вольфа Блитцера. (Замените это молотком и гвоздем, если вы не читаете 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 для этого визуального программирования, хотя это и для технических целей.
тем не менее, вы, похоже, очень заинтересованы во всем этом, поэтому предложение
Кроме того, вы можете попробовать андроид для визуального создания вещей
Ответ 13
Брюс А. Тейт, взяв страницу Прагматический программист написал книгу о том, что:
Семь языков за семь недель: прагматическое руководство по обучению языкам программирования
В книге он охватывает Clojure, Haskell, Io, Prolog, Scala, Erlang и Ruby.
Ответ 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 и напишите некоторый код робототехники. Все происходит, когда вы пишете код, который должен "загрязняться" и взаимодействовать с реальным миром, который вы не можете изучать каким-либо другим способом. Да, тот же язык, но совсем другая перспектива.