Скільки існує мов програмування? [зачинено]


30

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

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


2
Не було б краще сказати "Який тип ..", а не скільки?
Amir Rezaei

Ну я дізнався, що щось на кшталт Prolog і C принципово відрізняється, тому я думав, що кожен з них відповідає різному мові програмування, і я сподівався зрозуміти, скільки видів.
сова

7
2: тип, що робить те, що ти хочеш, і тип, який ні,
Метт Еллен

1
Дізнатися про різні типи мов програмування абсолютно конструктивно ! Ви потенційно можете стверджувати, що це слід закрити як дублікат цього, але я думаю, що у них достатньо чітких питань, щоб вони залишалися окремими.
Пітер Бауфтон

1
@Sova, я рекомендую зробити свій перший вибір нових мов, щоб спробувати те, що не використовує синтаксис на основі с. Це дозволить вам більше зосередитись на тому, як вона працює, наскільки вона відрізняється від тієї, яку ви найкраще знаєте.
Ерік Реппен

Відповіді:


73

Це залежить від того, як ви хочете класифікувати мови. Фундаментально, мови можуть бути розбиті на два типи: імперативні мови , в яких ви інструктують комп'ютер , наскільки для виконання завдання, і декларативні мови , в яких ви скажіть комп'ютер , який робити. Декларативні мови можуть бути розбиті на функціональні мови, в яких програма побудована за допомогою функцій складання та логікимови програмування, в яких програма побудована за допомогою набору логічних зв’язків. Імперативні мови читають більше, як перелік кроків для вирішення проблеми, як рецепт. Імперативні мови включають C, C ++ та Java; функціональні мови включають Haskell; Мови логічного програмування включають Prolog.

Імперативні мови іноді розбиваються на дві підгрупи: процедурні мови, такі як C, і об'єктно-орієнтовані мови . Об'єктно-орієнтовані мови є дещо ортогональними для групувань, оскільки існують об'єктно-орієнтовані функціональні мови (приклади OCaml та Scala).

Ви також можете групувати мови, ввівши: статичну та динамічну . Статистично типізовані мови - це ті, в яких введення тексту перевіряється (і зазвичай виконується) перед запуском програми (зазвичай під час фази компіляції); динамічно набрані мови відкладають перевірку типу на час виконання. C, C ++ та Java - це мови статичного типу; Python, Ruby, JavaScript та Objective-C - це динамічно набрані мови. Існують також нетипізовані мови, до яких належить мова програмування Forth.

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


1
Збирався поставити щось подібне, але поставить +1 і замість цього додасть коментарі. Кожна категорія або комбінація також має численні віджимання, створені шляхом фокусування на окремих елементах. Наприклад, OOP починає: протокол, заснований на прототипі, програмування, орієнтоване на аспекти, програмування на основі компонентів тощо. Функціональні парадигми також мають спін-оф, такі як мови, де асинхронний процес або потік є базовою одиницею, і ви програмуєте, складаючи паралельні процеси разом.
CodexArcanum

Як мови сценаріїв, наприклад VBScript, вписуються в це? Це може бути трохи процедурно і трохи OO, оскільки можна створювати різні типи, так що це зробить його гібридом?
JB King

Це саме те, що я шукав. Велике спасибі.
сова

3
@JB King OOP мови зазвичай є процедурними, принаймні в межах методів. Також поширена помилкова думка, що OOP означає «об’єкти». Багато мов мають типи даних та об'єкти. Існує багато дискусій щодо того, що таке точне визначення ООП, але воно, як правило, включає спадщину та / або інкапсуляцію (приватний стан) як основні теми. Мову, яка не має жодної форми, важко віднести до мови ООП.
CodexArcanum

2
@sova Я можу думати лише про дві мови, які так працюють. Erlang багато в чому базується на паралельній обробці, але якщо ви хочете більше схожих на те, про що я говорив, вам слід заглянути в поліфонічний C #. Це дослідницька мова (тепер складена в С-омегу), заснована на Pi-Calculus (як, наприклад, FP заснована на лямбда-кальці). Pi-calc базується на одиниці процесу, і ви оголошуєте процеси та комбінацію синхронних і асих дзвінки в них. Також загляньте в Стрілки в ПП, особливо в Haskell. Стрілки дуже схожі на це.
CodexArcanum

12
  • Асамблея
  • Процедурний
    • Основні
    • С
  • Об'єктно-орієнтована
    • C #
    • Java
  • Декларативний
    • Пролог
    • SQL
  • Функціональний
    • Лісп
    • Хаскелл

Це основні, але там багато інших парадигм, і між ними є велика кількість перекриттів.


Як щодо декларативних (наприклад, Prolog, SQL)?
Брюс Олдерман

@Bruce, отримай їх зараз.

Так, це була загальна ідея, яку я навчився десь на шляху.
sevenseacat

6
Чи не слід вважати збори процедурними?
MattDavey

2
Як щодо конкатенативних (на основі стека) мов програмування, таких як Forth та Factor? Ви можете вважати це типом функціонального програмування, але це, мабуть, досить чітко, щоб заслужити згадку. en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux

11

Типи мов програмування (парадигми) дивіться тут:
http://en.wikipedia.org/wiki/Programming_paradigm

Інші характеристики мов програмування (наприклад, Type Systems) дивіться тут: http://en.wikipedia.org/wiki/Programming_language


ах! "парадигма", яке гарне слово! дякую
sova

@sova Я б прийняв це як найкращу відповідь, оскільки просто занадто багато парадигм, щоб перелічити у відповіді P.SE, тим більше, щоб описати нюанси кожної.
Rei Miyasaka

9

Клацніть на зображення, щоб побачити PDF. Програмування парадигм плаката

Ви повинні подивитися на програмування парадигм для манекенів: що повинен знати кожен програміст від Пітера Ван Роя. Це дасть вам огляд того, як це відбувається зовні.

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


6
  • Процедурні: збори, Java, C #, F #, Lisp, Fortran.

  • Встановити на основі: SQL.

  • На основі шаблону: Perl, Regex, Snobol.

  • На основі дерева: XSLT.

  • На основі масиву: APL.


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

4

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

Мова машини: Мова машини - це мова програмування низького рівня. Це легко зрозуміти на комп’ютерах, але важко читати людям. Ось чому люди використовують мови програмування вищого рівня. Програми, написані мовами високого рівня, також компілюються та / або інтерпретуються машинною мовою, щоб комп'ютери могли їх виконувати.

Мова складання: Мова складання - це представлення машинної мови. Іншими словами, кожна інструкція з мовної збірки перекладається на машинну мову навчання. Хоча висловлювання на мові збірки читабельні, вони все ще є низьким рівнем. Недоліком мови складання є те, що вона не є портативною, оскільки кожна платформа постачається з певною мовою асамблеї.

Мова високого рівня: Мови високого рівня - це те, чим сьогодні користуються більшість програмістів. Мови, такі як C, C ++ та Java - всі мови високого рівня. Переваги мов високого рівня полягають у тому, що вони дуже легко читаються та переносяться. Недоліком мов високого рівня є те, що вони менш потужні, ніж мови монтажу. Тому що одне твердження мовою високого рівня перекладається на багато висловлювань машинної мови.

Мови високого рівня можна додатково класифікувати як:

  1. Функціональні мови: У функціональній мові програма поділяється на визначення функцій. Функціональні мови - це своєрідна декларативна мова. Вони здебільшого засновані на типізованому лямбда-числі з константами. Деякі з відомих функціональних мов - Scala, F #, Clojure та Lisp.

  2. Процедурні мови: у процедурних мовах програма пишеться в послідовності кроків, яких слід дотримуватися для отримання результату. COBOL, FORTRAN і C - це деякі мови процедурних процесів.

  3. Об'єктно-орієнтовані мови програмування: В мовах OOP програма поділяється на Об'єкт, який містить дані, а також методи, які працюють на даних. Java, C # і C ++ - це мови OOP.

  4. Мови програмування логіки: Логічні мови використовуються для створення програм, які дозволяють комп'ютеру логічно міркувати. наприклад: Логічна мова

Для поглибленого вивчення перевірте:


3

Я схильний думати з точки зору особливостей:

Синтаксис:

На основі С чи що у вас є. У Java є синтаксис на основі С. Я настійно рекомендую спробувати щось на зразок Python або Ruby, щоб вивести голову з синтаксису і більше думати з точки зору основ роботи тієї чи іншої мови. Я вважаю, що жоден синтаксис не повинен бути об'ємнішим, ніж на основі С та не має проблемних будівельних блоків навколо білого простору.

Складено проти інтерпретованого w. Збірка-процес проти інтерпретованого / консольного:

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

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

А потім є JavaScript і Python, які ви можете виконувати на льоту, командувати командою в консолі в реальному середовищі. Усі три можуть призвести до дуже різних способів написання коду.

Динамічне та суворе введення тексту:

Я схильний розглядати це як компромісні рішення. Коли ви перебуваєте на значно нижчому рівні та продуктивність є критичною, статичне введення має багато сенсу. Я ніколи не розумів цього поняття того, що одна людина є "безпечнішою", ніж інша, але я придумала дуже пластичну / динамічну мову, де ви просто дізнаєтесь, як працює система набору тексту та чого очікувати в основному. Шенігани типу рідко хвилюють мене в JS. Деяким чином гнучкість може зробити речі більш надійними, хоча, мабуть, на дотик більш прихованим для більш молодшого рівня, якщо ви не знаєте про деякі отвори в мові.

Область блоку на рівні порівняно з функцією:

Блок-рівень є найпоширенішим (що-небудь між {} у більшості мов синтаксису на основі с). Область JavaScript побудована навколо функцій (які також використовуються для створення об'єктів настільки ефективно). Існує також велика різниця у тому, який доступ ви маєте від внутрішнього простору до зовнішнього. Я не знайомий з іншими схемами оцінювання, але впевнений, що вони існують.

Класичний OOP проти Prototypal OOP проти майже OOP (структури в C?) Проти Non-OOP:

Навіть у ООП на базі класів є велика кількість варіацій. Чи можете ви робити численні спадкування (ew, добре з надлишком, ew), визначати інтерфейси тощо ...

У JavaScript у нас є свого роду приголомшений гібридний прототиповий OOP, де об'єкти значно простіші, дуже мутабельні, але ми все ще маємо можливість відокремити інтерфейс від внутрішніх проблем, що є IMO - важливим аспектом інкапсуляції.

Справа в OOP полягає в тому, що дійсно є багато речей, які ви можете зняти, які по суті є орієнтованими на ООП, а технічно не є OOP. Звичайно, існують пуристи, але наприкінці дня «Шаблони дизайну» стосуються досягнення певних абстракцій, які добре працюють у певних ситуаціях. Не будьте занадто швидкі, щоб вважати, що ідеї з мовою, що базується на ООП, не мають користі в чомусь більш орієнтованому на процедуру. І я не кажу про JavaScript. Це зовсім не обмежено його густою версією прототипу OOP, заснованої на прототипі.

Функції першого класу:

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

Закриття:

Я не впевнений, де ведуться дебати щодо Java, але я знаю, що багато Java розробників вимагали цієї функції рік-два тому. Коли мова не закривається, коли функція закривається, все, що якимось чином посилається на матеріали зсередини цієї функції, не зможе отримати доступ до неї, оскільки вона зібрала сміття. При закритті контекст виконання пов'язаний таким чином, що якщо ви можете посилатись на матеріали, що знаходяться в тій закритій функції, з іншого діапазону, наприклад, у поверненому об'єкті або функції, ви отримуєте ці параметри такими, якими вони були, коли функція була закрита. Це схоже на заклинювання вашої ноги у дверях сміття, хоча я підозрюю, що це реалізоване більше, як копії цих камер, зроблених у місцевих касах відповідної організації.

Жорсткий / Суворий / Безпечний проти надання вам усієї мотузки, яку хочете:

JS devs та Java devs мають тенденцію взагалі не розуміти один одного, і я думаю, що це має багато спільного з двома мовами, що падають на майже протилежні сторони цього конкретного дизайнерського спектру. Я не хочу, щоб ти захищав мене від себе чи від інших чортів моєї команди. Я хочу зробити набагато більше в набагато меншому коді і робити все це дуже різними (але послідовними для даного домену) способами залежно від ситуації. Існують абсолютно компрометації обох, і багато мов, як правило, більше падають на середину.


Дякую Справді приємно прокласти зусилля, спрямовані на перемогу за голосом, без пояснень.
Ерік Реппен

2

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

Навколо існує декілька "видів" мов, але нові завжди можуть з'являтися. По суті, метою мови є дозволити кодування ідей, концепцій або вимог, наскільки це можливо безпосередньо. З цією метою можуть бути ситуації, коли потрібні парадигми, і може знадобитися нова.

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

Ще один спосіб поглянути на це з точки зору структури управління. Коли мова виконується (якщо вона є), який порядок, в якому відбуваються речі, щоб виконати те, що ви хочете? Приклади: просте пряме виконання, рекурсія, зворотний трек, паралелізм. Я виявив, що я (скромний кашель) був різним виконанням .

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


Класно. Я навчусь LISP та просвітиться. Захоплююче: D
сова

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

@sova: Для мене теорія інформації була чудовим відкриттям (і Шеннон, і Колмогоров). Йдеться про те, як значення кодуються та передаються через канали, з поняттями пропускної здатності, виявлення помилок, мінімального кодування, випадковості тощо. Отже, дані кодують інформацію, а алгоритми - це канали. Програми кодують інформацію, а програмування - канал. Отже, яка інформація закодована? звідки воно походить і коли? куди йде? які джерела помилок (шум)? як вони виправляються? Я виявив, що це корисна перспектива.
Майк Данлаве

@sova: (продовження) Вам не доведеться оволодівати всією математикою. Для мене те, що було важливим, була рамкою, яку вона дала мені для роздумів про речі.
Майк Данлаве

1

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


Я пам’ятаю це. Можливо, я навіть цим користувався. Хлопчик, це було найсучасніше. Вам не довелося вручну керувати фрезерним верстатом, просто натисніть кнопку запуску. І якби була помилка, все пекло розіб'ється.
Майк Данлаве

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

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