Яка найбільш ортогональна мова програмування? [зачинено]


46

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

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

Примітка модератора

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


1
Спробуйте скористатись Unlambda - там близько до найменшої можливої ​​кількості мовних складових. Трохи серйозніша відповідь: Схема (специфічно R5RS).
SK-логіка

@ SK-логіка, Unlambda не є ортогональною, тому що I=SKK. Кінцевими в ортогональних мовах є мови з одною інструкцією, такі як Jot та RSSB.
Пітер Тейлор

11
@ Peter - Я не думаю, що він суто означає мінімальний. Мінімальна мова просто закінчується усіма додатковими визначеннями в бібліотеці, тому школярі повинні їх вивчити в будь-якому випадку. Як я читаю це запитання: "яка мова найкраще відповідає принципу найменшого здивування?".
Стів314,

1
@ Петер Тейлор: чи можете ви навести приклад, коли Тімтовді конфліктує з ортогональністю?
кеппла

1
Я думаю, що «ортогональність» - це поганий вибір слів. Як встановили Пітер і Стів, те, що ви насправді маєте на увазі, це "принцип найменшого здивування", або якась тісно пов'язана якість.
Конрад Рудольф

Відповіді:


53

Якщо говорити про "дуже мало правил", я б заперечував, що "Лісп" або "Малий талк" виграють. Голий синтаксис можна записати на одній вкладці пива.

Але, на мій досвід, простота Lisp і Smalltalk не означає, що вони прості для розуміння і прості в навчанні. Хоча це не "чистий" спосіб, на мій досвід, стиль обов'язкових мов у списку справ є найпростішим для розуміння для новачків.

Тому я б запропонував Python, Ruby чи щось подібне абстрагування : ви знаходите (майже) кожне базове поняття в них (гаразд, немає покажчиків), але вам не потрібно це розуміти з самого початку, щоб зробити щось працюючим.


33
вражаюча робота вимірює синтаксис в одиницях пивної вкладки.
psr

3
І не забувайте Perl. Набагато більше Perl там, ніж думає більшість людей, а спільнота користувачів величезна .
Рандал Шварц

20
Perl може бути дуже потужним, але хлопець, якому здається, що це найпростіший шлях до програмування, повинен мати еквівалент тунелів храмів Індіани Джонс як головний коридор від його спальні до його душових ...
Хельдар,

9
Синтаксис Perl міг би поміститися на вкладці пива, за умови, що ви будете пити достатню кількість пива.
Дейв Шерохман

4
@Randal, питання задає ортогональну мову. Філософія Перла - бути не ортогональною - "існує більше ніж один спосіб зробити це".
Пітер Тейлор

41

Я б сказав, що LISP, або схема або мова з цієї родини була б найбільш ортогональною. З let, lambda, define, if, cons, list, і ( )ви можете навчити майже все , що ви хочете , щоб в інтро курсі. Також немає необхідності в попередній обробці директив чи int main()подібних матеріалів, до яких студенти просто включають, але не бачать причин для цього.

На моїх курсах введення CS ми зробили багато справді цікавих речей із схемою: впроваджуємо машину Тьюрінга, впроваджуємо комп'ютер TC-201, пишемо контекстну безкоштовну граматику, використовуємо рекурсію, записуємо злиття та вставку, впроваджуємо додавачі та т. інші речі.

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


5
Погодьтеся. Ракетка (раніше схема PLT) - дещо приємніший варіант схеми, який наша школа використовує з великим успіхом у вступних класах.
NickAldwin

3
Що з Haskell? Я не знаю багато Haskell, але я б очікував, що це буде ортогональна мова.
Джорджіо

4
@Giorgio: Синтаксис Haskell є досить складним, хоча, мабуть, може бути викритий лише підмножина. Сам факт, що вам доведеться взаємодіяти з монадами вводу-виводу з самого початку, щоб отримати будь-яку цікаву програму, є прикрою враховуючи мету ОП.
Матьє М.

4
За "ортогональне" я голосую за схему, особливо за реалізацію ракетки . Навколишнє середовище Ракетки створене для того, щоб полегшити шлях учня легшим, ніж щось на зразок сирого Common Lisp. Мова чиста, дійсно мало правил. Давно MIT вирішив використовувати схему для навчання студентів-першокурсників, використовуючи книгу SICP . Ті студенти, які вижили, схоже, успішно працюють на ринку. Однак такий підхід не навчить студентів безпосередньо писати код комерційного класу на найбільш поширених мовах.
Джон Тоблер

2
Так! Той факт, що схема кардинально відрізняється від більшості "реальних" мов, дозволяє зосередитись на програмуванні, а не на API. Схема навчання - це як " віск увімкнути, вимкнути " кодування; здається марною витратою часу, поки ви не зрозумієте, що глибше розумієте комп’ютер, ніж раніше.
бензадо

17

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


3
Я також навчився програмувати за допомогою Pascal і вважаю, що це дуже чиста мова. Єдина не ортогональна особливість, яку я можу придумати, - це синтаксис процедур writeeln () та readln (), які мають змінну кількість аргументів і дозволяють задати форматування.
Джорджіо

Я вважав це дуже неприємною мовою. Але я, можливо, проектую, оскільки у мене був дуже, дуже поганий інструктор.
greyfade

14

Логотип: воно все ще живе і б'є !

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

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

Якщо у вас є відраза до черепах, я дійсно думаю, що схема - це шлях.


1
Вірите чи ні, логотип - це Lisp, як і схема. Більшість користувачів не надто далеко виходять за рамки простого циклу циклів і черепах, щоб дізнатися це.
Sean McSomething

@SeanMcSomething Це цікаво, враховуючи зосередженість на побічних ефектах (переміщення черепахи), а не на оцінці виразів.
бензадо

10

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

Існує декілька нетеоретичних теоретичних бородавок на обох мовах (eqtypes в SML, seq в Haskell), але вони все ще б'ють штани всього іншого там, що стосується химерних взаємодій непов’язаних особливостей мови.


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 все є першокласним (оскільки це лямбда-числення) і його можна скласти. Є лише одна інструкція. Це абсолютно жахлива мова викладання.

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


Дякую за те, що ви познайомили мене з терміном "turing tarpit", мені завжди потрібен був термін для такої простоти.
keppla

Я погоджуюся, що студенти повинні вміти експериментувати, але вимагати розуміння, перш ніж ви зможете "зробити що-небудь", схоже на всю суть викладання.
benzado

@benzado, я погоджуюся, що сенс вчення полягає у наданні розуміння. Але з більшістю людей ви повинні почати з основних понять, нехай вони обводять голову, а потім навчайте їх проміжним поняттям. Отже, ви хочете мову, де хтось, хто трохи розуміє, може писати програми, які трохи роблять. Існує причина, що більшість курсів програмування не починаються з навчання машин Тьюрінга або машин реєстру Мінського.
Пітер Тейлор

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

2

Найважливіші функції, які ви вивчаєте, - це:

  • принцип найменшого сюрпризу (PASCAL)

  • читабельність (Ада)

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

Тепер я знову пишу C #, Java, Objective-C і Javascript для життя, які мають жахливі химерності: D

Але якби мені довелося вибрати один багаж для початку, я б поїхав на C #. Це досить легко читати, має кілька серйозних сюрпризів (саме вони найчастіше приховані в інструментах / рамках MS ...) та величезну кількість коду для читання та документації, обидва вони мають важливе значення для хорошого навчання.


Якщо це просто для читабельності, а не для статичного набору тексту та безпеки ада, Python та Visual basic (так, я знаю, не класний спосіб для дітей) мають схожий синтаксис вільного безладу, imho.
keppla

Так, я згоден з вами, але "якщо він збирається в Ada, він повинен працювати". Але це не заважає логічним помилкам, як може сказати Аріана V : D
Хельдар,

Я думав, чи статична введення корисна для початківців чи ні. Він надає більше підтримки (як тренувальні колеса), але це можна сприймати як добру, так і погану річ. Це відсуває деяку відповідальність від студента до типу системи.
Айвар

@ Хельдар, жодна мова програмування не може перешкодити управлінню ф-люми, як та, яка була причиною відмови Ariane V. Ви повинні зробити домашнє завдання на цьому.
Джон Р. Стром

@ JohnR.Strohm це був саме мій погляд: іноді це не мова, це хибність інженерного потоку (наприклад, управління). Ви могли б сформулювати ваш коментар менш агресивно, хоча, на мій погляд.
Хелдар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.