Які важливі мови навчитися розуміти різні підходи та концепції? [зачинено]


172

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

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

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

Мені не подобається вивчати іншу функціональну мову (Haskell) чи іншу імперативну мову OOP (Ruby), ні я не хочу практикувати непрактичні забавні мови, такі як Brainfuck.

Одна дуже цікава річ, яку я знайшов, - це мови, засновані на моноконічних стеках, як Factor.

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


3
Я б поставив +1 лише для посилання на xkcd, але питання теж цікаве.

63
Ви, здається, успішний програміст, решта - додаткові. Не намагаюся бути хуй, але ... як ваше життя фінансує мудрі, стосунки мудрі, здорові, веселі, мудрі, хобі? Можливо, зараз саме час переслідувати деякі з цих речей. Я не вірю, що вам потрібно знати більше десятка мов одночасно. Якщо вам платять за користування одним - дізнайтеся це. Якщо ви хочете написати книгу про одну - вивчіть її. Крім цього у вас є хороша база програмування. Навіщо навчитися чомусь (наприклад, J - моя думка subj :)), що ви не будете серйозно (читайте заробляти $) де-небудь використовувати? Не будьте крутим хакером на кладовищі.
Гаміш Грубіян

6
Так, я успішний програміст за власними мірками. Наразі я не заробляю багато грошей, але ей, мені 19 років. Я вкладаю час у всі ці пункти і багато іншого, але знаходжу і хобі, і розваги в програмуванні. Я також хочу сказати, що існує різниця між розумінням мови та оволодінням нею. Освоєння Python і Clojure мені достатньо. Я хочу зрозуміти інші варіанти, тому що це покращить мій код, допоможе зрозуміти мій комп'ютер і допоможе визначити власну мову програмування.
Pepijn

5
Ви бачили Programmers.SE ? Це підпадає під тип запитань, які краще задаються там.

Відповіді:


287

Питання практичності дуже суб’єктивні, тому я просто скажу, що вивчення різних мовних парадигм буде служити лише для того, щоб зробити вас кращим програмістом. Що практичніше за це?

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

Декларативний, Datalog - Багато людей рекомендували б Prolog в цьому слоті, але я думаю, що Datalog є більш чітким прикладом декларативної мови.

Array, J - Я тільки що виявив J, але вважаю це приголомшливою мовою. Це закрутить ваш розум у кренделі. Ви будете дякувати J за це.

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

Потік даних, Оз - Я думаю, що вплив Оза на підйом і буде продовжувати зростати лише в майбутньому.

Прототип, заснований на прототипі, JavaScript / Io / Self - Я - це дідусь та дуже впливає на кожну мову, засновану на прототипі. Це не те саме, що OOP на основі класу, і не слід розглядати як таке. Багато людей приходять до мови-прототипу і створюють спеціальну систему класів, але якщо ваша мета - розширити свою думку, то я вважаю, що це помилка. Використовуйте мову на повну потужність. Прочитайте Організаційні програми без класів для ідей.

Експертна система, CLIPS - я завжди рекомендую це. Якщо ви знаєте Prolog, то, швидше за все, ви будете мати перевагу в швидкості, але мова зовсім інша.

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

Функціональні + Необов’язкові типи, Ци - Ви кажете, що у вас є досвід роботи з деякими типами систем, але чи маєте ви досвід роботи з "шкідливими системами * типу? Ніхто не має ... але вони повинні. Ци дуже схоже на Lisp, але його тип системи підірве ваш розум.

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

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


8
+1 - чудова відповідь.
duffymo

2
Дякую, що вказали мені на стільки мов, щоб вивчити.

2
Я додав би Ерланг для програмування на базі акторів та "Фортеця" для паралельного програмування.
nickik

2
+1 за гарячу заміну Ерланга та визнання відмовостійкості
Mic

14
Ніякої збірки? Добре мати розуміння того, як працюють процесори, щоб дізнатися, який тип коду їм подобається.
Нік Т

33

Що про Prolog (для уніфікації / зворотного відтворення тощо), Smalltalk (для "все є повідомлення"), Forth (зворотна політика, потокові перекладачі тощо), схема (продовження)?

Не мова, а мистецтво протоколу метаоб'єктів - це вигадливі речі


Виправте мене, якщо я помиляюся, але я думаю, що Python sortof вже продовжує. І з того, що я прочитав, я краще вивчу Factor and Objective-C, ніж Forth і Smalltalk, але я, можливо, там виріжувати кути.
Pepijn

1
@pepijn, python не має продовження першого класу (хоча я працюю над
хай-

1
Objective-C витягує з Smalltalk, але я думаю, що справжній виїзд від ST - це динамізм середовища.
Джон Кромарті

33

Я другий Хаскелл. Не думайте, що "я знаю Ліса, тому я знаю функціональне програмування". Коли-небудь чули про типові класи? Алгебраїчні типи даних? Монади? "Сучасні" (більш-менш - принаймні не 50 років;)) функціональні мови, особливо Хаскелл, дослідили безліч дуже потужних корисних нових понять. Класи типів додають особливий поліморфізм, але умовивід (ще одна мова, яку ви вже знаєте, не має) працює як шарм. Алгебраїчні типи даних просто приголомшливі, особливо для моделювання деревних структур даних, але вони також чудово працюють для перерахунків або простих записів. І монади ... ну скажімо, люди використовують їх для винятку, вводу / виводу, аналізаторів, списків і багато іншого - чисто функціональними способами!

Крім того, вся тема досить глибока, щоб один рік зайнятись;)


"Крім того, вся тема досить глибока, щоб один рік не зайнятись;)" - Цікаво, чому це було б добре? Адже наше життя скінченне.
вегай

1
@vegai: Чому це було б погано? Є гірші способи витратити все життя, ніж на навчання. І ніхто не говорив, що вам доведеться вчитися роками лише для того, щоб правильно використовувати мову - тільки що тема не вичерпується через короткий час. (Також зверніть увагу на смайлик - ця частина не зовсім серйозна.)

32

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

С

Там дуже багато коду C валяється --- це, безумовно , практично. Якщо ви також вивчаєте C ++, навколо вас є набагато більше коду (і стрибок короткий, коли ви знаєте C та Java).

Це також дає вам (або змушує вас мати) прекрасне розуміння деяких теоретичних питань; Наприклад, кожна запущена програма живе в певному сенсі в 4-байтному масиві. Покажчики на C - це справді просто індекси цього масиву --- вони - ціле ціле число іншого типу. Не відрізняється в Java, Python, PHP, крім прихованого під поверхневим шаром.

Крім того, ви можете написати об'єктно-орієнтований код на C, вам просто потрібно бути трохи посібником про vtables та інше. Портативна колекція головоломки Саймона Татама - чудовий приклад досить доступного об'єктно-орієнтованого коду С; це також досить добре розроблений і його варто прочитати програмісту для початківців / проміжних C. Це те, що відбувається і в Haskell --- класи типів у певному сенсі "просто інша vtable".

Ще одна чудова річ у галузі C: ​​участь у питаннях та відповідях з кваліфікованими програмістами на C отримає вам багато відповідей, які пояснюють C в плані конструкцій нижчого рівня, що створює вашу ближчу до залізної бази знань.

Можливо, мені не вистачає точки ОП --- Я думаю, що я є, судячи з інших відповідей ---, але я думаю, що це може бути корисною відповіддю для інших людей, які мають подібне запитання і читають цю тему.


1
Для цього потрібно більше коштів. C - мова номер один, коли вам потрібно або хочете спуститися до чистого металу та зрозуміти роботу машини - або мови програмування вищого рівня - з нуля. Крім того, це також дуже універсальний, компілятори C існують для (майже) кожної архітектури процесора, коли-небудь створеної.
дієтолог

27

З сайту Пітера Норвіга:

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

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


13

Я вражений, що після 6 місяців і сотень голосів ніхто не згадував SQL ...


10

У таких типах, як теореми / системи сучасного типу: Coq (я думаю, що Агда також входить у цю категорію).

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 і тоді ви можете довести, що вона правильна для будь-якого вводу, що дивовижно!


I другий кок. Ви вивчаючи більшість мов, ви все ще можете використовувати свої старі методи, але coq змушує вас писати загальні програми, які завжди працюють.
Бруно Мартінес

Я намагався вивчити Кок влітку минулого року, але відмовився, бо мені було важко знайти гарну документацію щодо вивчення та використання його. Будь-які пропозиції?

Я дізнався з курсу в своєму університеті, а потім прочитав "Coq'Art: Обчислення спонукальних конструкцій" Це не достатньо, щоб справді оволодіти ним, але достатньо, щоб оцінити його.
Бруно Мартінес

6

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


5

Так само, як fogus запропонував це вам у своєму списку, я також раджу поглянути на мову OzML / Mozart Багато парадигм, в основному орієнтованих на програму concurrency / multi agent.

Щодо одночасності та розподіленого числення, еквівалент обчислення лямбда (який стоїть за функціональним програмуванням) називається обчисленням Pi.

Я лише почав розглядати деяку реалізацію числення Pi. Але вони вже розширили мої уявлення про обчислення.


5

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

Статті у Вікіпедії хороші:

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

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

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


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

5

Ви вивчили багато мов. Зараз саме час зосередитись на одній мові та оволодіти нею.


3

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

Тим не менш, ти, здається, досить зацікавлений у всьому, що там є, звідси і пропозиція

Крім того, ви можете спробувати Android appinventor для візуального побудови матеріалів


У LabView є смішний «синтаксис», але справжній біль натискати та перетягувати весь код. Я б не рекомендував це програмісту.
Іштар

Ось що поставляється з Lego NXT, правда? Повністю не працював для мене. Дякую за пропозицію, хоча.
Pepijn

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

2

Брюс А. Тейт, взявши сторінку у Прагматичного програміста, написав книгу саме так: Сім мов через сім тижнів: Прагматичний посібник з вивчення мов програмування

У книзі він висвітлює Clojure, Haskell, Io, Prolog, Scala, Erlang та Ruby.


2
Попереджуйте, що книга наповнена посиланнями на фільми, які, очевидно, стали частиною поп-культури США. Якщо ви ще не бачили фільми, вам залишиться цікаво, про що йдеться у Тейт. Якщо ви переглядали фільми, вас все одно можуть відкласти постійною антропоморфікою мов програмування або просто не сподобавшись відповідним персонажам (мені не подобається Мері Поппінс; випадково мені також не подобається Рубі, тому аналогія може бути на чомусь).
Алан Плюм

2

Ртуть : http://www.mercury.csse.unimelb.edu.au/

Це введений Prolog з унікальними типами та режимами (тобто із зазначенням присудка append(X,Y,Z) значення X, додане до Y, дає Z одне Z, задане X та Y, але може давати кілька X / Ys для даного Z). Крім того, немає вирізання чи інших поза логічних предикатів.

Якщо ви хочете, це до Prolog, як Haskell - до Lisp.


1
  1. Програмування не охоплює завдання програмістів.
  2. Нові речі завжди цікаві, але є дуже класні старі речі.

Першою системою баз даних було для мене dBaseIII, я витрачав близько місяця на написання невеликих прикладів (dBase / FoxPro / Clipper - це табличний db з індексами). Тоді, на своєму першому робочому місці, я зустрів МУМП, і у мене болить голова. Я був молодий і свіжий, але для розуміння моделі бази даних MUMPS знадобилося 2 тижні. Був момент, як у коміксах: через 2 тижні увімкнулася кнопка, і лампочка просто загорілася в моїй свідомості. МОМПИ природний, низький рівень і дуже-дуже швидкий. (Це неврівноважений, неформалізований 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, локальні змінні, короткі: локальні - це змінні пам’яті, а глобальні змінні, короткі: глобали - це «змінні db», встановлення глобальної змінної переходить на диск негайно): http: // gradvs1.mgateway.com/download/extreme1.pdf (PDF)


1

Скажіть, ви хочете написати вірш про кохання ...

Замість того, щоб використовувати молоток тільки тому, що у вас вже є один, навчіться правильних інструментів для виконання завдання: навчіться розмовляти французькою.

Досягнувши майже рідного розмовного рівня, ви готові розпочати свій вірш.


4
Звичайно, це буде вірш сміття, бо для того, щоб писати вірші, потрібно говорити вище звичайного рідного рівня. А вашій дівчині потрібно буде вивчити французьку, щоб її читати. Якщо вона вже не французька, в такому випадку їй, мабуть, стане це ніяково.
Джон Лоуренс Аспден

Смачна іронія, Джон, мені це подобається (я по-французьки, btw)
Vinzz,

1

Хоча вивчення нових мов на академічному рівні - цікаве захоплення, IMHO ви не можете навчитися користуватися нею, поки не спробуєте застосувати її до реальної світової проблеми. Тож, замість того, щоб шукати нову мову для вивчення, я б на вашому місці спершу шукав нові речі, а лише потім шукав би потрібну мову, яку можна використати для цього конкретного проекту. Спочатку виберіть проблему, потім інструмент, а не навпаки.


1

Для всіх, кого не було з середини 80-х, я б запропонував вивчити 8-бітну ОСНОВУ. Це дуже низький рівень, дуже примітивний і цікаве вправу програмувати навколо своїх дірок.

У цьому ж рядку я б обрав калькулятор серії HP-41C (або емулятор, хоча нічого не перемагає реальне обладнання). Важко обернути навколо себе свій мозок, але воно того варте. TI-57 буде робити, але це буде зовсім інший досвід. Якщо вам вдасться розв’язати рівняння другого ступеня на TI-55, ви вважатиметесь майстром (він не мав жодних умовних умов і жодних гілок, крім RST, який перейшов програму назад до кроку 0).

І останнє, я б вибрав FORTH (про це згадувалося раніше). У ній є приємна річ, що «будує свою мову», але це набагато більше голий метал. Це навчить вас, чому Rails цікавий, і коли DSL мають сенс, і ви матимете глибокий погляд на те, про що думає ваш калькулятор без RPN, коли ви вводите текст.


1

PostScript. Це досить цікава мова, оскільки вона заснована на стеці, і цілком практична, коли ви хочете скласти речі на папері, і ви хочете або зробити це, або усунути неполадки, чому це не робиться.

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

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


1

Ерланг, Форт і деякі вбудовані роботи з мовою складання. Дійсно; придбайте комплект Arduino або щось подібне і створіть багатоголосний звуковий сигнал в зборі. Ви дійсно чогось навчитесь.


1

Є також анік :

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

З його сайту:

Швидше C, безпечніше Java, простіше, ніж * sh

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

Це, здається, вже не перебуває під активним розвитком, але, здається, має якісь цікаві концепції (і це, зрештою, те, що вам здається після).


1

Хоча не відповідаю вашій вимозі "іншого" - я б став до того, що Fantom - це мова, на яку повинен дивитися професійний програміст. За власним визнанням, автори fantom називають це нудною мовою. Він просто розкриває найбільш поширені випадки використання Java та C #, із запозиченими синтаксисом закриття з рубіну та подібними новими мовами.

І все-таки йому вдається мати власний завантажувальний компілятор, забезпечити платформу, яка має падіння інсталяції без зовнішніх залежностей, отримує пакети правильно - і працює в Java, C # і зараз в Інтернеті (через js).

Це може не розширити ваш кругозір щодо нових способів програмування, але це, безумовно, покаже вам кращі способи програмування.


1

Одне, що я бачу, відсутнє в інших відповідях: мови, засновані на терміновому переписуванні.

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

Математика також заснована на переписуванні, хоча зрозуміти, що відбувається, не так просто, оскільки це досить закрито.


0

APL, Forth та Assembly.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.