Чому наукові мови програмування такі дивні? [зачинено]


9

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

  • У Matlab кожну функцію потрібно розмістити в окремому файлі
  • У R <- це оператор присвоєння, на відміну від = майже у всіх інших мовах
  • Matlab, R, Julia та інші - це 1-індексація
  • Matlab використовує% для коментарів, а не стандартний # або //

Звичайно, всі ці мови мають декілька конструктивних особливостей, які фактично полегшують їх використання для наукових застосувань, наприклад, більш природні позначення матриці. Тим не менш, вони всі незрозуміло роблять усі ці химерні варіанти вибору, які нічого не полегшують і їх можна було б легко уникнути, якби мовні дизайнери вирішили зробити те, що роблять 99% інших мов. Чи причина блокування постачальника? Відсутність контакту з ширшим співтовариством із розробки програмного забезпечення? Щось ще?

Я прочитав цю тему і не знайшов пояснень задовільними. Тільки тому, що R були розроблені як наукова мова, це не означає, що йому довелося повністю ігнорувати конвенції та використовувати <- замість =.


6
Коротка відповідь: адже вони були зроблені для вчених, а не для програмістів.
Барт ван Інген Шенау

19
Коротка відповідь: Оскільки на кожну мову, яку ви вважаєте нормальною, впливав спільний пращур, C.
Росс Паттерсон

3
Я думаю, ви будете намагатися знаходити будь-які конвенції на різних мовах. Це залежить від їх спадщини.
Роббі Ді

6
Нічого цього не дивно. Це просто різне . Тому що немає певної причини вибирати один синтаксис над іншим, крім того, до чого звичний автор певної мови.
Ян Худек,

8
Ваші 99% помиляються. Якщо ви знаєте лише C та його похідні, ви можете так подумати, але понад 50% мов, що не містять C, використовують щось інше для присвоєння, індексації та / або коментарів.
david.pfx

Відповіді:


21
  • Існують різні умовності. Конвенції з математики, логіки та прикладних наук та конвенції в галузі ІТ. Перші набагато старші.
  • Наукові мови створені для того, щоб зробити життя їхніх користувачів більш зручним. Користувач вважається вченим, який час від часу може реалізувати якийсь алгоритм або перевірити якусь теорію, не потребуючи вивчити щось дійсно нове. Отже, мови для науковців ОБОВ'ЯЗКОВО складатися з нестандартних ІТ-стандартів. Тому що вони не призначені для використання ІТ-людей. Вони відповідають іншим стандартам, і це добре завдяки цільовій аудиторії. Оскільки хороший інтерфейс SW, а мова - це SW UI, потрібно робити на основі потреб користувача, а не кодера.
  • Наші ІТ-стандарти - це галузеві стандарти. ІТ - це галузь. Наука - це не промисловість. Вчені пишаються цим. І вони неохоче взяли б щось із нашої практики у своє. І їм стандарти взагалі не подобаються. І ніхто не любить закордонні стандарти. Отже, якщо хтось зробить наукову мову, яка буде відповідати стандартам ІТ, навряд чи вона буде продаватися добре, через неприязнь до цільової аудиторії, навіть якщо це буде об'єктивно зручніше.

І навіть якщо ми будемо судити лише за ІТ-стандартами ... Вибачте, які стандарти ви маєте на увазі? Ви намагалися написати прогу в APL чи SNOBOL? Ці дві мови є, ІМХО, МОСТО найпотужнішими у відповідних полях (підрахунку та рядків). Але синтаксис - щось ДУЖЕ дивне (та ефективне) Читання рядка коду APL може зайняти кілька днів. З іншого боку, така лінія є серйозним твором SW. Ви повернетесь до Mathlab зі сльозами полегшення.

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

І ти справді вважаєш, що == для рівності природніше? Навпаки, змішування = і == - НАЙБІЛЬША поширена помилка в програмуванні на С, це трапляється дуже часто навіть у сучасних ІДЕ з їх автоматичним керуванням.

Про індексацію від 1 - це єдине природне. Коли ви були дитиною, ви вивчали вірші та пісні, де ви рахували: один, два, три ... А не 0,1,2 ... У шкільній математиці ми вивчали, що підрахунок починається з 1, і що 0 не належить до натуральних / лічильних чисел. Тільки з визначенням функцій приходять неприродні показники. Зрештою, 0 було винайдено через багато тисяч років після того, як наш предок підняв палець вгору.

0-старт був простішим в усвідомленні та одразу ж потрапив у ІТ-практику після появи С Але у Fortran, першій мові, використовується 1-індексація. Те саме з іншими мовами доіндустріальної епохи.

І так, я прочитав статтю Дайкстра про природність підрахунку на основі 0. І абсолютно не згоден з його аргументацією. Це природно для музикантів. І навіть 0 ентузіастів, які створюють компілятори C та Java, рахують рядки коду НАЧАЛИ З 1!


1
": =" для присвоєння та індексації на основі 1 також використовуються в Smalltalk.
Рорі Хантер

1
Я не купую, що індексація на основі 0 відбувається через простоту реалізації (FORTRAN в значній мірі спростовує це). cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html наводить деякі причини, які можна віддати перевагу індексації на основі 0, але зауважте, що вибір досить умовний.
jk.

2
FORTRAN проводив індексацію на основі 1. PASCAL дозволено довільну індексацію: ви можете оголосити масив, індекс якого варіюється, наприклад, від -42 до +57. (Див. En.wikipedia.org/wiki/… для прикладу, де це корисно.)
Джон Р. Стром

1
@Gangnus Я думаю, що помилково порівнювати сучасні мови з C і вважає, що це навмисно важко читати. Він був розроблений як альтернатива високого рівня для мов нижчого рівня.
Роббі Ді

1
FORTH - мова на основі стека. Подумайте про калькулятор HP. Це було дуже компактно і швидко, але важко було написати код, який був непроникний. У FORTH ви рідко використовуєте змінні, а швидше натискаєте на стек і використовуєте операторів, які діють на стек.
Gort the Robot

16

Індексація з 1 не є дивною, вона цілком нормальна і очікувана, за винятком програмістів , оскільки вони були обумовлені очікуванням підрахунку на основі 0 на C (що було обумовлено властивостями архітектури процесора).

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

Призначення - це теж дивне і незрозуміле поняття, за винятком програмістів ; більшість людей не наплювати чи це =або :=або <-, вони з усіх сил , щоб зрозуміти сенс (і для них, це насправді краще НЕ для використання =, так як це підкреслює , що призначення не рівність - найбільш поширеним перешкодою для не-програмістів зрозуміти код).

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


4
Я не погоджуюся, що індексація від 1 не дивна. 0-індексація принаймні така ж поширена, як 1-індексація в математиці, і це, очевидно, було нормою в програмуванні протягом багатьох років до появи Matlab або S / R.
haroba

9
@Aqwis О, так, я вже бачу, як дитина рахує нуль, один, два ... Насправді найприродніший спосіб.
Gangnus

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

1
@Aqwis Відповідь на власні слова. Що дивно, а ні. Реч, яка встановлюється з дитинства і математикою (натуральні числа не включають нуль), не може бути дивною з будь-якої сторони. І що з цим суперечить, це дивно. А те, що ви звикли до чогось іншого, не має значення. Ці мови просто не створені ні для вас, ні для мене.
Gangnus

1
@phresnel Перефразовуючи відповідь: Індексація з 1 - це нормально. За винятком програмістів, тому що вони були обумовлені очікувати цього [індексуючи 0] від C
Роббі Ді

5

Є три проблеми:

  1. Вам невідомі певні традиції та вагомі причини певного вибору.
  2. Ви занадто багато акцентуєте на синтаксисі, занадто мало на семантиці.
  3. Інженери та вчені не мають досвіду мовного дизайну, що призводить до сумнівного синтаксису.

Тепер до ваших конкретних моментів:

  • Я не знаю Matlab, тому не можу коментувати вимоги організації файлів. Зауважте, що Java хоче, щоб ви використовували один файл у публічному класі.

  • В R =може також використовуватися як оператор присвоєння. Зауважте, що йому потрібні кілька операторів присвоєння <-та <<-мати справу з його концепцією <<-масштабування ( призначає символ у зовнішній області замість створення нового символу всередині функції). Стрілки можуть бути використані в іншому напрямку теж, що робить потенційно більш чистий код complex_calculation() -> x.

  • Індексація на основі 1 - це стандарт математики, і це те, чим користувачі Matlab та R зручніше, ніж C. Юлія слідкує за Matlab, щоб мати кращу криву навчання.

  • %для коментарів також використовується в TeX / LaTeX. #Тільки угоду з Unix мов сценаріїв, і їх нащадків.

Ви також ігноруєте, що "справжні" мови програмування мають багато дивних частин. Чому схема не використовується =? Замість цього:

(define foo 5)

Чому C використовується *для перенаправлення, коли, очевидно, каре ^xзустрічається в інших традиціях?


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

1
Я погоджуюся майже з усім, крім п.3. Вчені не викладають своїх мов, вони ЗАМОВЛЮють їх. Вони - клієнти, користувачі, але не їх творці. Якщо хтось є, він / вона вже ІТ-видовище. І синтаксис будь-якої мови сумнівний, ніхто не ідеальний для всіх завдань.
Gangnus

Matlab компілює функції / файли щойно вчасно. У нього немає реальної концепції програми, лише купа функцій. Якщо я запускаю функцію, яка робить виклик до foo (), то вона шукатиме свій шлях до файлу під назвою foo.m, компілює його та запускає його. Не потрібно заздалегідь повідомляти Matlab, який набір файлів я маю намір використовувати.
Саймон Б

1

Я думаю, це залежить від вашого впливу інших мов. Вгорі голови:

  • C / C ++ мають окремі вихідні файли (.c / .cpp & .h)
  • Символи -> використовуються в C # для лямбда-виразів
  • Старі версії VB використовували 1 як індекс за замовчуванням (хоча це можна змінити за допомогою Option Base)

1
В C і C ++ ви можете визначити стільки функцій, скільки вам потрібно в одному файлі.
haroba

Я просто зазначаю, що модулі можуть бути розділені на кілька файлів. Якщо ви хочете, ви можете помістити всі свої функції в окремі файли, використовуючи .NET мови з конструкцією часткового класу .
Роббі Ді

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

3
Коментарі в HTML виглядають так <!-- ... -->. Знак відсотка використовується для кодування URL: http://example.com/()стає http://example.com/%28%29.
амон

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