Почему научные языки программирования такие странные? [закрыто]

9

Мне кажется, что языки программирования, предназначенные для использования в науке и технике, неизменно странны по сравнению с языками общего назначения. Несколько примеров из головы:

  • В Matlab каждая функция должна быть помещена в отдельный файл
  • В R <- оператор присвоения, в отличие от = почти во всех других языках
  • Matlab, R, Julia и другие все 1-индексированы
  • Matlab использует% для комментариев, а не стандартный # или //

Конечно, у всех этих языков есть несколько конструктивных особенностей, которые фактически упрощают их использование в научных приложениях, например, более естественная матричная запись. Тем не менее, все они необъяснимо делают все эти странные выборы, которые не делают ничего проще, и их легко можно было бы избежать, если бы разработчики языка только что сделали то, что делают 99% других языков. Является ли причина, почему поставщик заблокирован? Отсутствие контакта с более широким сообществом разработчиков программного обеспечения? Что-то другое?

Я прочитал эту ветку и не нашел объяснения удовлетворительными. Тот факт, что R были разработаны как научный язык, не означает, что он должен был полностью игнорировать соглашения и использовать <- вместо =.

haroba
источник
6
Короткий ответ: потому что они созданы для ученых, а не для программистов.
Барт ван Инген Шенау
19
Краткий ответ: потому что на каждый язык, который вы считаете нормальным, повлиял общий предок С.
Росс Паттерсон
3
Я думаю, вы будете бороться, чтобы найти какие-либо соглашения между языками. Это зависит от их наследия.
Робби Ди
6
Ничего из этого не странно. Это просто другое . Потому что нет особой причины выбирать один синтаксис по сравнению с другим, за исключением того, к чему привык конкретный автор конкретного языка.
Ян Худек
8
Ваши 99% не правы. Если вы знаете только C и его производные, вы можете подумать об этом, но более 50% не-C языков используют что-то другое для назначения, индексации и / или комментариев.
david.pfx

Ответы:

21
  • Есть разные соглашения. Соглашения в математике, логике и прикладных науках и соглашения в IT. Первые намного старше.
  • Научные языки созданы для того, чтобы сделать жизнь их пользователей более удобной. Пользователь рассматривается как ученый, который может время от времени реализовывать какой-то алгоритм или проверять какую-то теорию без необходимости изучать что-то действительно новое. Таким образом, языки для ученых ДОЛЖНЫ быть составлены в соответствии с не IT-стандартами. Потому что они не предназначены для использования айтишниками. Они соответствуют ДРУГИМ стандартам, и это хорошо из-за целевой аудитории. Поскольку хороший пользовательский интерфейс программного обеспечения, а язык - это пользовательский интерфейс программного обеспечения, должен выполняться на основе потребностей пользователя, а не кодера.
  • Наши ИТ-стандарты являются отраслевыми стандартами. Это индустрия. Наука это не индустрия. Ученые гордятся этим. И они неохотно переняли бы что-нибудь из нашей практики в свою. И им вообще не нравятся стандарты. И никто не любит иностранные стандарты. Таким образом, если кто-то создаст научный язык, который будет соответствовать стандартам ИТ, он вряд ли будет хорошо продаваться из-за неприязни к целевой аудитории, даже если это будет объективно более удобно.

И даже если мы будем судить только по стандартам ИТ ... Извините, какие стандарты вы имеете в виду? Вы пытались написать прогу в APL или SNOBOL? Эти два языка, ИМХО, САМЫЕ мощные в соответствующих областях (подсчет и строки). Но синтаксис ОЧЕНЬ странный (и эффективный). Чтение строки кода APL может занять несколько дней. С другой стороны, такая линия - серьезный кусок SW. Вы вернетесь в Матлаб со слезами облегчения.

Что касается "=", у многих людей есть проблемы, которые нужно привыкнуть, что это не равенство, а назначение. Кстати, в Паскале это равенство и присваивание ": =".

И вы действительно думаете, что == для равенства более естественно? Напротив, смешивание = и == является НАИБОЛЕЕ распространенной ошибкой в ​​программировании на C, это происходит очень часто даже в современных IDE с их автоматическим управлением.

Про индексирование от 1 - это единственное естественное. Когда вы были ребенком, вы выучили стихи и песни, где вы сосчитали: один, два, три ... А не 0,1,2 ... В школьной математике мы учились, что отсчет начинается с 1, а этот 0 не относится к натуральным / счетным числам. Только с определением функций приходят неестественные индексы. В конце концов, 0 был изобретен через много тысяч лет после того, как наш предок поднял палец вверх.

«0-старт» было проще реализовать, и сразу после появления в Си он попал в ИТ-практику. Но в Фортране, первом языке, используется 1-индексирование. То же самое с другими языками доиндустриальной эпохи.

И да, я прочитал статью Dyjkstra о естественности отсчета на основе 0. И совершенно не согласен с его аргументацией. Для музыкантов это естественно. И даже 0 энтузиастов, которые создают компиляторы C и Java, считают строки кода, начинающиеся с 1!

Гангнус
источник
1
«: =» для присвоения и индексации на основе 1 также используются в Smalltalk.
Рори Хантер
1
Я не покупаю, что индексирование на основе 0 происходит из-за простоты реализации (FORTRAN в значительной степени опровергает это). cs.utexas.edu/users/EWD/transcription/EWD08xx/EWD831.html приводит некоторые причины, по которым можно предпочесть индексирование на основе 0, но обратите внимание, что выбор довольно произвольный.
JK.
2
ФОРТРАН имел индексирование на основе 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 О, да, я уже вижу ребенка, который считает ноль, раз, два ... Самый естественный способ, правда.
Гангнус
4
Дети не пишут код. Есть веские причины использовать нулевое индексирование (см .: Дейкстра), и когда нулевое индексирование также часто встречается в математике, я не вижу много причин использовать 1-индексирование.
Haroba
1
@Aqwis Ответь за свои слова. Что странно и нет. То, что задано с детства и по математике (натуральные числа не включают ноль), не может быть странным с любой стороны. И что с ним противоречит, это странно. А то, что вы привыкли к чему-то другому, не имеет значения. Эти языки просто не созданы для вас или меня.
Гангнус
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. Ученые не делают свои языки, они заказывают их. Они клиенты, пользователи, но не их создатели. Если кто-то и есть, он / она уже является компьютерным фанатом. А синтаксис любого языка сомнителен, никто не идеален для всех задач.
Гангнус
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.
Амон
Извините моя ошибка.
Робби Ди