Какой язык программирования наиболее ортогональный? [закрыто]

46

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

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

Примечание модератора

Мы ищем длинные ответы, которые дают некоторое объяснение и контекст. Не просто перечислите язык: пожалуйста, объясните, почему вы думаете, что язык отвечает на вопрос. Ответы, которые ничего не объясняют, будут удалены. См. Хорошее Субъективное, Плохое Субъективное для получения дополнительной информации.

fredoverflow
источник
1
Попробуйте использовать Unlambda - существует минимально возможное количество языковых строительных блоков. Немного более серьезный ответ: Схема (специально для R5RS).
SK-logic
@ SK-logic, Унламбда не ортогональна, потому что I=SKK. Максимум в ортогональных языках - это языки с одной инструкцией, такие как Jot и RSSB.
Питер Тейлор
11
@ Питер - я не думаю, что он имеет в виду минимальный. Минимальный язык просто заканчивается всеми дополнительными определениями в библиотеке, поэтому студенты должны изучать их в любом случае. То, как я читаю этот вопрос: «Какой язык лучше всего следует принципу наименьшего удивления?».
Steve314
1
@ Питер Тейлор: не могли бы вы привести пример, где Тимтоутди конфликтует с ортогональностью?
Keppla
1
Я думаю, что «ортогональность» - плохой выбор слов здесь. Как выяснили Питер и Стив, вы на самом деле имеете в виду «принцип наименьшего удивления» или какое-то тесно связанное качество.
Конрад Рудольф

Ответы:

53

Когда дело доходит до «очень немногих правил», я бы сказал, что Лисп или Smalltalk победят. Простой синтаксис может быть написан на одной вкладке пива.

Но по моему опыту, простота Lisp и Smalltalk не означает, что они просты для понимания и легки в обучении. Хотя это и не «чистый» способ, по моему опыту, стиль императивных языков «список дел» легче всего понять новичкам.

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

keppla
источник
33
Впечатляющая работа по измерению синтаксиса в единицах пивной закладки.
PSR
3
И не забудь Perl. На Perl гораздо больше, чем думает большинство людей, и сообщество пользователей огромно .
Рэндал Шварц
20
Perl может быть очень мощным, но у парня, который считает, что это самый простой путь к программированию, должен быть эквивалент туннелей храмов Индианы Джонса как главного коридора от его спальни до его душевых ...
Хелдар
9
Синтаксис Perl может поместиться на пивном табло, если вы пьете достаточно пива.
Дейв Шерохман
4
@ Рандал, вопрос требует ортогонального языка. Философия Perl заключается в том, чтобы быть неортогональным - «есть несколько способов сделать это».
Питер Тейлор
41

Я бы сказал, что LISP или Scheme или язык из этой семьи будут наиболее ортогональными. С let, lambda, define, if, cons, list, и ( )вы можете научить почти все , что вы хотите , чтобы в интро курсе. Также нет необходимости в предварительной обработке директив или чего- int main()то подобного, что студенты просто включают, но не видят причины.

На моих вступительных курсах CS мы сделали много действительно интересных вещей со Scheme: внедрили машину Тьюринга, внедрили компьютер TC-201, написали грамматику без контекста, использовали рекурсию, напишем слияние и вставку, реализовали сумматоры и множество другие вещи.

Я занимался Java в AP comp sci до колледжа, но Scheme был великолепен, потому что я мог избавиться от беспорядка и сосредоточиться на реальных концепциях своей программы. Это был отличный урок, и я очень рекомендую вам попробовать его для обучения.

Блэк Джек
источник
5
Согласен. Racket (ранее PLT Scheme) - немного более дружественный вариант Scheme, который наша школа с большим успехом использует на вводных занятиях.
Ник Алдвин
3
Что насчет Хаскелла? Я не знаю много о Haskell, но я ожидаю, что это будет ортогональный язык.
Джорджио
4
@ Джорджио: Синтаксис на Haskell довольно сложный, хотя, я думаю, можно раскрыть только подмножество. Сам факт, что вам нужно взаимодействовать с IO-монадами с самого начала, чтобы получить какую-либо интересную программу, немного раздражает, учитывая цель OP.
Матье М.
4
За «ортогональность» я голосую за «Схему», особенно за реализацию « Ракетки» . Среда Racket разработана таким образом, чтобы облегчить путь учащегося, чем что-то вроде обычного Common Lisp. Язык чистый, с несколькими правилами. Давным-давно MIT решил использовать схему для обучения студентов-первокурсников, используя книгу SICP . Те выжившие студенты, кажется, показывают хорошие результаты на рынке. Однако этот подход не будет напрямую учить студентов, как писать код коммерческого уровня на наиболее часто используемых языках.
Джон Тоблер
2
Да! Тот факт, что Scheme радикально отличается от большинства «реальных» языков, позволяет сосредоточиться на программировании, а не на API. Схема обучения похожа на кодирование « воском, воском »; кажется пустой тратой времени, пока вы не поймете, что у вас есть более глубокое понимание компьютера, чем раньше.
бензадо
17

Паскаль был специально разработан для обучения программированию. Его легко выучить (это был один из первых языков программирования, которые я выучил).

Хенрик
источник
3
Я также научился программировать, используя Паскаль, и считаю, что это очень чистый язык. Единственная неортогональная особенность, о которой я могу думать, - это синтаксис процедур writeln () и readln (), которые имеют переменное число аргументов и позволяют задавать форматирование.
Джорджио
Я нашел это очень расстраивающим языком. Но я могу проектировать, так как у меня был очень, очень плохой инструктор.
Greyfade
14

Логотип: он все еще жив и здоров !

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

Это может показаться игрушкой, а не языком программирования, но для многих это не будет плохим первым шагом. Синтаксис очень прост, но черепаха обеспечивает более конкретную форму обратной связи, чем большинство языков / сред. Попытка создать определенную форму - это отличный способ научиться думать заранее, чтобы решить проблему.

Если у вас есть отвращение к черепахам, я действительно думаю, что Схема - это путь.

benzado
источник
1
Хотите верьте, хотите нет, но Logo - это Lisp, как и Scheme. Большинству пользователей не хватает далеко за рамки простой петлеобразной и черепашьей графики, чтобы научиться этому.
Шон МакSomething
@SeanMcSomething Это интересно, учитывая фокусировку на побочных эффектах (перемещение черепахи), а не на оценке выражений.
Бензадо
10

Я бы предложил как SML, так и Haskell. Ортогональность была главной точкой дизайна для обоих. В частности, ядро ​​SML (то есть часть языка, не связанная с модульностью) в значительной степени является типизированным лямбда-исчислением. В результате большинство языковых функций определяются типами, а типы, в свою очередь, определяют формы ввода и исключения значений. Это в значительной степени идеально.

В обоих языках есть несколько теоретико-нетипичных бородавок (eqtypes в SML, seq в Haskell), но они все еще бьют по всему остальному с точки зрения странных взаимодействий несвязанных языковых особенностей.

Lambdageek
источник
7

Каким бы ни был выбор, я бы настоятельно рекомендовал преподавать «настоящий» язык . Преподавание игрушечных языков работает для некоторых людей, но для других это очень, очень расстраивает из-за разрыва с реальным миром. Некоторые люди нуждаются в реальной релевантности в качестве мотивации для обучения, и не нам судить об этой стратегии обучения (на самом деле, это распространенное заблуждение).

Это дисквалифицирует языки, такие как логотип, но также и языки, специфичные для предметной области, такие как обработка . Хотя последнее чрезвычайно полезно для определенных вещей (например, для создания инфо-графики), использование слишком ограничено для большинства применений (и, следовательно, для большинства пользователей). Это также исключает Gofer , бесполезное подмножество Haskell. Это также исключает Паскаль , потому что , хотя последний уже был использован в реальных проектах, он просто не имеет значения больше и просто не хватает существенных признаков (например , встроенный в строках).

Из практических языков я бы согласился с уже упомянутыми: современные диалекты Lisp или Scheme, Haskell, Python или Ruby. Лично я бы, вероятно, использовал Python, но у всех этих вариантов есть свои преимущества и недостатки.

Конрад Рудольф
источник
2
Ошибочно утверждать, что обучение «настоящему» языку - это способ обеспечить актуальность в реальном мире. Работа учителя - показать, как «игрушечный» язык соотносится с реальными навыками. Обучение жонглированию, начиная с ножей, не означает, что вы изучаете более важные навыки жонглирования.
Бензадо
3
@benzado Вы неправильно поняли мою точку зрения. Если вы изучаете игрушечный язык, вы должны передать свои навыки, чтобы они соответствовали реальным проблемам. Весь мой смысл был в том, что этот перевод является дополнительным косвенным указанием, которое активно мешает некоторым людям учиться . Разные люди учатся совершенно разными способами, и некоторым людям действительно нужна эта непосредственность. Научиться жонглировать ножами - это не одно и то же. Реальная аналогия была бы с обучением программированию путем написания живой системы управления ракетами в качестве первого проекта, и я никогда не предлагал этого.
Конрад Рудольф
3
Я понимаю вашу точку зрения. Мы просто не согласны. Я думаю, что перевод важен, он требует, чтобы у ученика было более глубокое понимание, чем у того, кто имеет успешную стратегию угадывания (например, тот, кто «решает» проблемы со словами, выбирая числа и вставляя их в формулы в начале главы ). Другими словами, если они не могут передать то, что они узнали, они никогда не узнали это в первую очередь. Чтобы мотивировать учащихся, нужно просто выбрать правильные задачи, что важно независимо от языка, «реального» или «игрушечного».
Бензадо
@benzado Передача является важной, не аргумент там. Но это целая «другая дисциплина», которой нужно учить, и некоторые студенты не обладают этим. Кроме того, часть «более глубокого понимания» также верна, но также помимо сути: это уже продвинутое состояние, которое необходимо достичь . Когда ученики выучат «это», они могут перенести это. Но сначала они должны учиться, и для этого некоторым студентам нужна актуальность. Трансфер приходит позже.
Конрад Рудольф
В математическом образовании (где у меня есть небольшой опыт), «Обучение без понимания» является большой проблемой: сосредоточиться на том, как сделать это без причины . Я утверждаю, что если вы будете учить понятиям программирования, то с игрушечным языком все будет в порядке, и если вам это удастся , переход на «настоящий» язык не составит труда. (Если перевод труден, вы учили процедурам, а не понятиям.) Игрушечная среда не мешает людям учиться, но требует хорошего планирования уроков для привлечения. (Мне нравится эта тема, но я думаю, что мы перешли на территорию обсуждения, и модераторы будут недовольны.)
benzado
6

Tcl имеет 12 правил, которые регулируют весь язык.

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

Особых случаев или зарезервированных слов или символов очень мало.

Брайан Оукли
источник
4

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

Чтобы расширить мой комментарий, в Jot все является первым классом (потому что это лямбда-исчисление) и может быть составлено. Есть только одна инструкция. Это абсолютно ужасный язык обучения.

В целом, в тарпингах Тьюринга очень мало специальных правил, и они требуют, чтобы вы хорошо понимали основы вычислений, прежде чем что-либо делать. Идеальный язык обучения позволяет студентам экспериментировать, не вырывая все свои волосы, поэтому абстракции более высокого уровня - это действительно хорошая вещь.

Питер Тейлор
источник
Спасибо за то, что вы познакомили меня с термином «тьюринг тарпит», мне всегда был нужен термин для такой простоты.
Keppla
Я согласен с тем, что ученики должны быть в состоянии экспериментировать, но, прежде чем вы сможете «что-либо делать», требуется понимание, и это похоже на весь смысл обучения.
Бензадо
@ Benzado, я согласен, что цель обучения заключается в том, чтобы привить понимание. Но с большинством людей вы должны начать с базовых понятий, позвольте им обдумать это, а затем научить их промежуточным понятиям. Итак, вам нужен язык, на котором тот, кто немного понимает, может писать программы, которые делают немного. Есть причина, по которой большинство курсов по программированию не начинаются с обучения машин Тьюринга или регистрационных машин Мински.
Питер Тейлор
1
Да, я думаю, что мы не согласны с тем, что означает «сделать немного». Если вы хотите (например) смягчить контингент «покажи мне, как сделать видеоигры», вы можете сделать некоторые вещи, но они достигнут определенного результата, потому что не могут добиться прогресса и разочаровываются, и тогда вам придется вернитесь к «скучным частям», чтобы они могли обрести понимание, чтобы двигаться вперед. В этот момент они уже разочарованы в плохом смысле и могут просто сдаться; с другой стороны, выполнение «скучных частей» в первую очередь и наращивание означает постоянный прогресс. Но очевидно, что вы не начинаете с полоски полубесконечной ленты.
Бензадо
2

Наиболее важные функции в изучаемом вами языке:

  • принцип наименьшего удивления (ПАСКАЛЬ)

  • удобочитаемость (ада)

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

Опять же, я пишу C #, Java, Objective-C и Javascript для жизни, каждый из которых имеет ужасные причуды: D

Тем не менее, если бы мне пришлось выбрать один язык для начала, я бы пошел на C #. Его относительно легко читать, в нем мало серьезных сюрпризов (они чаще всего скрыты в инструментах / инфраструктурах MS ...), а также огромное количество кода для чтения и документации, которые необходимы для хорошего обучения.

Kheldar
источник
Если это просто для удобочитаемости, а не для статической типизации и безопасности ada, Python и Visual Basic (да, я знаю, не крутой способ для детей) имеют похожий синтаксис без помех, imho.
Keppla
Да, я согласен с вами, но «если он компилируется в Аде, он должен работать». Однако Ариана V не предотвращает логические ошибки : D
Хельдар
Я думал, полезна ли статическая типизация для начинающих или нет. Это дает больше поддержки (как учебные колеса), но это можно рассматривать как как хорошую, так и плохую вещь. Это отодвигает некоторую ответственность от студента к системе типов.
Айвар
@ Хелдар, ни один язык программирования не может помешать управлению, как тот, который был причиной отказа Ariane V. Вы должны сделать свою домашнюю работу на этом.
Джон Р. Штром
@ JohnR.Strohm, это была моя точка зрения: иногда это не язык, а инженерный поток (например, управление), который имеет недостатки. Вы могли бы сформулировать свой комментарий менее агрессивно, по моему мнению.
Хельдар