Чи всі мови в основному однакові?


39

Нещодавно мені довелося зрозуміти дизайн невеликої програми, написаної мовою, про яку я поняття не мав ( ABAP , якщо ти повинен знати). Я міг це зрозуміти без особливих труднощів.

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

Це взагалі вірно? Чи всі мови програмування складаються з подібних конструкцій, таких як петлі, умовні оператори та повідомлення, що передаються між функціями? Чи є неезотеричні мови, які типовий програміст Java / Ruby / Haskell не зміг би зрозуміти? Чи всі мови мають спільне походження?


4
Я направлю вас на " Побиття середніх " Пола Грема. Ви можете чи не хочете прочитати всю справу, але шукайте відповідну частину рубрики "Парадокс". Містеру Грейму не можна заважати класти якорі у свою стіну тексту, тому я не можу безпосередньо посилатися на це.
kwatford

4
Мови не мають спільного походження. Але всі мови намагаються вирішити якусь проблему. Я думаю, це дещо аналогічно розмовній мові. Мета - виразити себе. Я не можу сказати, що прямо розуміти мови на основі знання 1 процедури / ОО / функціоналу. Я цього не робив, але якби я поставив це запитання, я би дивився на perl або lisp з великою кількістю дужок, і я не зміг би сказати, що знання 1 мови всіх типів є достатньою.
shahkalpesh

1
У такому випадку: обчислення лямбда. Можливо, не "справжня" мова, але вона є сенсом всіх мов програмування. Мені колись довелося реалізувати функціональну мову таким чином, щоб вона компілювалася в лямбда-вирази (які потім були безпосередньо інтерпретовані). Результати були (як мінімум, для мене) нечитабельними, незважаючи на збереження всіх відповідних ідентифікаторів. Особливо рекурсивні функції за допомогою Y-комбінатора. Єдиний практичний спосіб з'ясувати, що деякі зразкові вирази зробили - це їх ручна оцінка. Прості речі, такі як фібонаки та злиття, були нечитабельними.
kwatford

2
Якщо ви знаєте функціональні мови, ви повинні знати, що петлі можливі не на кожній мові.
jalf

Піт зовсім інший. :)

Відповіді:


88

Основи більшості процедурних мов майже однакові.

Вони пропонують:

  • Скалярні типи даних: зазвичай булі, цілі числа, поплавці та символи
  • Складені типи даних: масиви (рядки - це окремий регістр) та структури
  • Основні побудови коду: арифметика над скалярами, доступ до масиву / структури, завдання
  • Прості структури управління: якщо-то, якщо-то-ще, поки, для циклів
  • Пакети блоків коду: функції, процедури з параметрами
  • Області застосування: області, в яких ідентифікатори мають конкретні значення

Якщо ви це розумієте, ви добре розумієте 90% мов на планеті. Що робить ці мови трохи складнішими для розуміння, це неймовірне різноманіття непарного синтаксису, який люди використовують, щоб сказати ті самі основні речі. Деякі використовують стислі позначення, що містять непарні пунктуації (APL є крайнім). Деякі використовують безліч ключових слів (COBOL є прекрасним представником). Це не має великого значення. Важливо, якщо мова є достатньо повною, щоб робити складні завдання, не змушуючи вас виривати волосся. (Спробуйте кодувати кілька серйозних хакерських рядків у сценарії оболонки Window DOS: це Тьюрінг здатний, але дуже поганий у всьому).

Більше цікавих процедурних мов пропонують

  • Вкладені або лексичні області застосування, простори імен
  • Покажчики, що дозволяють одному об'єкту звертатися до іншого, з динамічним розподілом пам’яті
  • Упаковка пов'язаного коду: пакети, об'єкти з методами, ознаками
  • Більш досконалий контроль: рекурсія, продовження, закриття
  • Спеціалізовані оператори: рядкові та масивні операції, математичні функції

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

Мови, які важче зрозуміти, є непроцедурними:

  • Чисто функціональні мови, без призначень і побічних ефектів
  • Логічні мови, такі як Prolog, в яких відбуваються символьні обчислення та об'єднання
  • Мови відповідності шаблонів, в яких ви вказуєте фігури, які відповідають задачі, і часто дії ініціюються збігом
  • Мови обмежень, які дозволяють задавати відносини та автоматично вирішувати рівняння
  • Мови опису апаратних засобів, в яких все виконується паралельно
  • Мови, характерні для домену, такі як SQL, кольорові мережі Петрі тощо.

Існує два основних стилі репрезентації для мов:

  • На основі тексту, в якому ідентифікатори іменних об'єктів та потоки інформації кодуються неявно у формулах, які використовують ідентифікатори для іменування сутностей (Java, APL, ...)
  • Графічний, в якому об'єкти малюються як вузли, а відносини між сутностями малюються як явні дуги між цими вузлами (UML, Simulink, LabView)

Графічні мови часто дозволяють текстовим підмовам як анотації у вузлах та на дугах. Графічні мови одержуваних рекурсивно дозволяють графіки (з текстом :) у вузлах і на дугах. Дійсно непарні графічні мови дозволяють графікам анотацій вказувати на графіки, що коментуються.

Більшість цих мов засновані на дуже невеликій кількості моделей обчислень:

  • Обчислення лямбда (основа для Lisp та всіх функціональних мов)
  • Пост-системи (або методи перезапису рядків / дерев / графіків)
  • Машини Тьюрінга (модифікація стану та вибір нових комірок пам'яті)

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

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


3
Чудова відповідь! Як подальше спостереження (чи є спосіб задати наступне запитання в SO?), Чи є одна мова, яку я міг би засвоїти і претендувати на розуміння всіх концепцій програмного забезпечення? Це був би Lisp (чи діалект, такий як схема)?

@Anirudh: Не існує офіційного механізму подальшого спостереження, але ви можете відкрити нове питання. Якщо воно містить обґрунтування та посилання на це питання, воно може бути навіть закритим. ;) Щоб відповісти на Ваші подальші дії, я від щирого серця вважаю, що існує не одна мова, оскільки парадигми занадто різні.

@Anirudh: Погоджено з Джоном Y, немає лише одного. Але якщо ви відносно новачок у цій галузі, вам слід витратити чимало енергії на оволодіння процедурною парадигмою (я вважаю ОО просто спеціалізацією). Не завадило б шукати інші парадигми (логіка, обмеження, потік даних), щоб зрозуміти, як вони працюють, але для більшості повсякденних виробничих робіт, процедурні мови в значній мірі є корольними.
Іра Бакстер

1
Так само, як і з природними мовами, "важче зрозуміти" суб'єктивно і залежить від першої мови, яку ви вивчаєте.
NullUserException

1
@NullUserException: Це пропонує вам вибирати свою першу мову ретельно, щоб максимально легко зрозуміти інших. У цьому суть схеми, зокрема книги SICP.
Іра Бакстер

6

Мови опису обладнання - це мови програмування, але вони концептуально дуже різні. Спробуйте VHDL або Verilog на розмір. Вони звичайні для програмування FPGA. (Гаразд, вони не є процесорами, але вони є загальноприйнятими обчислювальними пристроями. І таке слід вважати дійсним апаратним забезпеченням для тем з інформатики.) Ви повинні чітко робити, що це відбувається серійно. Це зовсім інша модель. Ви думаєте, що речі відбуваються паралельно, як правило, не є винятком. Для циклів у verilog розгорніть паралельне обладнання. Тож "очікувана" поведінка може бути не такою, яку ви очікуєте.


Це хороший момент. Я буду шукати Verilog / VHDL.

Я завжди вважав, що звичайні мови програмування - це дійсно крихітні способи кодування програм, які були природно паралельними, наприклад, VHDL. Коли ви починаєте з дизайнера обладнання, цей фрагмент про все, що відбувається серійно, здається неймовірно незграбним. (Ми викладаємо людям неправильні мови програмування як їх перший мов: це повинен бути Verilog!).
Іра Бакстер

4

Залежить від того, що ви маєте на увазі під "в основному". Всі мови будь-якої гнучкості є повним Тюрінгом. У цьому сенсі: так, всі вони в основному однакові.

На низькому рівні всі вони виконують подібні послідовності операцій, а всі Windows, Linux та (останні) ОС X X працюють усі на сумісних з процесорами Intel, використовуючи однакові набори інструкцій. Таким чином вони також в основному однакові.

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


3

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

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


1
Джон фон Нойман. І це НЕ вимовляється як "новачок", більше схожий на "нойман".

Дякую за виправлення - я промовляю так, як ви сказали.
Преет Сангха

Коли хтось пропонує виправити, ви можете просто відредагувати свою публікацію, щоб відобразити її.
Філ Міллер

2

Мови програмування - це також інструменти для мислення. З іншого погляду на мислення деякі проблеми зникають або перетворюються на інший, більш керований вид (наприклад, багато моделей дизайну стилю C ++ просто зникають, коли ви думаєте в Ліспі (див., Наприклад, цю презентацію Пітера Норвіка ), і Ерланг звільняє вас від думки деякої одночасності або розподілених обчислювальних конструкцій низького рівня і дозволяє просто сконцентруватися на логіці програми).

Однак зауважте, що іноді "нові" парадигми можна частково застосувати до "старих" мов програмування, що пояснює, чому у нас, наприклад, є книги, які навчають функціональному програмуванню для програмістів Java . Але споконвічна підтримка та інтеграція більш потужної парадигми на мовному рівні дає можливість більш природне застосування парадигми (а отже, унеможливлює розуміння програм мовою, що підтримує незнайомі парадигми, як натякають інші відповіді - @Ira Baxter перелічуючи непроцедурні мови і @kwatford з посиланням на Пола Грехема ).


2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

На найнижчому рівні кожна мова програмування є "тією ж", але це не означає, що вони однакові на рівні, де ви фактично взаємодієте. Вони абстрагують проблеми для вас; це не означає, що вони абстрагують одні і ті ж проблеми або що вони абстрагують кожну проблему однаково.


1

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

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

Python має на меті бути ідеальною мовою сценаріїв. З цією метою воно жертвує швидкістю та перевіряемості для продуктивності та портативності.

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

Ці жертви та переваги роблять величезну зміну в мові. Так, більшість мов програмування можна використовувати для всього, що можна зробити за допомогою комп'ютера, але жодна з цих же мов не повинна використовуватися для всього. Усі мови, описані вище, я б вибрав для певних завдань, а не для інших. Якби я програмував операційну систему, я вибрав би C. Якби я писав бекенд для веб-сайту, я би використовував Python. І якби я писав фінансову систему, я б скористався Haskell.

Зрештою, ваш вибір програміста - це правильний інструмент для роботи.

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