Есть ли языки программирования, которые следуют минималистскому подходу к разработке?

26

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

Могут ли быть или есть языки, где версия 1.0 является окончательной версией? Конечно, исправления ошибок исключены, но набор функций всегда остается прежним?

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

Я предполагаю, что некоторые академические языки такие? Но существуют ли коммерчески успешные языки, которые следуют этой идее? Сопровождающая библиотека также может бесплатно получать новые функции, но язык всегда остается постоянным.

Один из примеров, который я могу привести, это один из моих любимых языков C #, который я использую довольно часто, с каждым выпуском добавляется все больше и больше функций. Чтобы воспользоваться их преимуществами, я должен отказаться от актуальных задач и потратить значительное время на их изучение, вместо того, чтобы уметь подбирать тривиальные концепции и сам комбинировать их для легкого решения более сложных задач.

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

Джоан Венге
источник
7
Областью работы большинства разработчиков является эффективное решение проблем. Эффективность требует постоянного изучения новых вещей. Новые языковые возможности, новые фреймворки, новые инструменты разрабатываются для повышения эффективности. Изучая их, вы на самом деле сосредотачиваетесь на своей работе.
Арсений Мурзенко
4
Ну, не каждый, кто программирует, обязательно является программистом на полный рабочий день. Это просто еще один инструмент для многих других профессий.
Джоан Венге
4
Опять же, никто не заставляет вас чему-то учиться. Если C # 1.0 отвечает вашим требованиям, не тратьте время на изучение того, что вам не нужно.
Арсений Мурзенко
11
Я думаю, что вопрос правомерен: почему мы должны применять принципы KISS и YAGNI к программным артефактам, а не к языкам программирования? Когда у языка достаточно основных функций, дальнейшее развитие (ИМХО) происходит главным образом за счет маркетинга (конкуренция с другими языками, которая заставляет компании набивать языки функциями, чтобы сохранить своих клиентов).
Джорджио
2
@MainMa: «Эффективность требует постоянного изучения новых вещей». Сложный язык программирования, содержащий слишком много функций, может снизить эффективность, а не повысить ее. Например, в команде это может привести к тому, что разные разработчики будут использовать разные подмножества языка, делая обзоры кода, исправление ошибок и обслуживание менее эффективными.
Джорджио

Ответы:

32

Лисп, Smalltalk. По совпадению, это также лучшие языки во всей группе.

И Lisp, и Smalltalk - это языки, построенные вокруг сильной объединяющей метафоры. Метафора Лиспа - «все есть список; этот список представляет и данные, и код (как функции)». Метафора Smalltalk - «все является объектом; единственный способ вызвать поведение - это передать сообщение объекту». Эти метафоры позволяют языкам быть стабильными, минимальными и мощными. Остальное в библиотеке.

Вещи, которые называются «структурами управления» на всех неминимальных (я хотел написать «раздутых») языках, являются здесь частью библиотеки (например: condфункция в lisp; ifTrue:/ ifFalse:семейство сообщений в Smalltalk, оба реализуют условное выражение , где другие языки имеют ifключевое слово).

Можно видеть, что Lisp / Smalltalk являются почти минимальными воплощениями их парадигмы и не более того (Lisp: функциональное программирование; Smalltalk: объектно-ориентированное программирование).

Херби
источник
4
Хорошие реализации Lisp могут конкурировать с C, хорошие реализации Smalltalk могут конкурировать с C ++. Черт, Oracle HotSopt JVM, самая быстрая виртуальная машина на планете, - это Smalltalk VM, она даже не использует статическую информацию о типах для своих оптимизаций.
Йорг Миттаг
9
Этот ответ слишком мал, чтобы быть конструктивным. Отсутствие подробностей или подтверждающих доказательств.
Джимми Хоффа
2
-1 Лисп? ЛИСП ? Шутки в сторону? После LISP войн 1970-х годов, повторные попытки LISP Unity и, наконец, Common Lisp? Нет, даже LISP не сделал это "сделано" в 1.0.
Росс Паттерсон
1
Я думаю, что вы указали на очень важную идею: язык должен быть построен вокруг одной (или нескольких) сильной, объединяющей метафоры, то есть язык программирования должен предлагать вам способ упорядочить свои мысли. Я думаю, что сложность некоторых языков отчасти связана с отсутствием такой метафоры: эти языки продолжают расти за счет включения новых функций, потому что у них нет базового объединяющего представления.
Джорджио
6

TeX , система набора текста, была очень стабильной с версии 3.

Начиная с версии 3, TeX использует уникальную систему нумерации версий, где обновления указываются путем добавления дополнительной цифры в конце десятичного числа, так что номер версии асимптотически приближается к π. Это является отражением того факта, что TeX теперь очень стабилен, и ожидаются лишь незначительные обновления. Текущая версия TeX - 3.1415926; последний раз оно обновлялось в марте 2008 года. Дизайн был заморожен после версии 3.0, и никакие новые функции или фундаментальные изменения не будут добавлены, поэтому все более новые версии будут содержать только исправления ошибок. Несмотря на то, что сам Дональд Кнут предложил несколько областей, в которых TeX мог бы быть улучшен, он указал, что твердо убежден в том, что наличие неизменной системы, которая будет производить тот же результат сейчас и в будущем, важнее, чем введение новых функций. По этой причине он заявил, что

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

Стивен Шланскер
источник
6

C и Fortran - это языки, которые приходят на ум. Они очень стабильны, и их синтаксис легко запоминается. Кроме написания плохого кода самостоятельно, при использовании этих языков очень мало сюрпризов. Но я бы не назвал их отличными языками для быстрой разработки приложений.

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

Питер Смит
источник
1
Я согласен с минималистским дизайном C. Даже если язык обновлялся в течение многих лет, базовая модель дизайна и программирования языка все еще узнаваема (другие языки подвергаются революции каждые 5–10 лет). Конечно, C не является языком общего назначения, как это было раньше, потому что он был заменен другими языками в определенных областях приложений (настольные приложения, веб-приложения и т. Д.).
Джорджио
@ Джорджио: Не все. Минимальные (как те, что я упомянул) не делают. С момента его появления в синтаксисе Smalltalk не было никаких изменений, за исключением одного, введенного Squeak: вычисляемые массивы с фигурными скобками. Библиотека также очень стабильна в своей основе ( Behaviorи Collectionиерархии). Мне кажется, что C намного менее стабилен со всеми этими C89, C99 и еще много чего.
Herby
1
@herby: Вы, вероятно, правы, что другие языки, такие как Smalltalk, более стабильны, чем C. Тем не менее, базовая модель программирования C такая же, как, скажем, 20 лет назад. Другие языки претерпели глубокие изменения. Итак, еще раз, я не утверждаю, что C - самый стабильный язык из всех, однако, IMO, он намного более стабилен, чем многие другие основные языки.
Джорджио
6

Другие уже сказали Лисп, так что я должен поднять Форт . Это очень легко реализовать, и правила языка просты для подражания.

Это основанный на стеке язык со словарем слов. Вы можете легко расширить язык, используя некоторые наследуемые функции.

ОЧЕНЬ краткий пример графики черепахи:

\ 8.8 fixed point sine table lookup
-2 var n F9F2 , E9DD , CEBD , AA95 , 7F67 , 4E34 , 1A c,
: s abs 3C mod dup 1D > if 3C swap - then dup E > if
  -1 1E rot - else 1 swap then n + c@ 1+ * ;

0 var x 0 var y 0 var a
0 var q 0 var w 
: c 9380 C80 0 fill ; \ clear screen
: k >r 50 + 8 << r> ! ;
: m dup q @ * x +! w @ * y +! ; \ move n-pixels (without drawing)
: g y k x k ; \ go to x,y coord
: h dup a ! dup s w ! 2D + s q ! ; \ heading
: f >r q @ x @ y @ w @ r 0 do >r r + >r over + \ forward n-pixels
  dup 8 >> r 8 >> plot r> r> loop o y ! x ! o r> o ;
: e key 0 vmode cls ; \ end
: b 1 vmode 1 pen c 0 0 g 0 h ; \ begin
: t a @ + h ; \ turn n-degrees

Затем, запустив его, : squiral -50 50 g 20 0 do 100 f 21 t loop ;вы получите:

спираль

Кредит на блог этого сотрудника Microsoft .

Остин Хенли
источник
1
Как за это снова проголосовали? Forth может быть хорошим кандидатом, но приведенный пример не намного лучше, чем шум исполняемой строки; яркий пример того, почему одержимость PLT краткостью противоречит тому, что действительно нужно профессионалам.
Теластин
4
@Telastyn Это был не его вопрос.
Остин Хенли,
4

Хотя Лисп упоминался, самый минималистичный язык, который я знаю, это схема . Мне было трудно понять это на университетских курсах, где я должен был. Но это изменило мой взгляд на программирование, и оно очень минимально. Минимальным синтаксисом являются круглые скобки ()и пробелы.

Единственное изменение в языке было принято решение преобразовать примитивы , такие как +, define(и некоторые другие) для встроенных модулей. Это означает, что они доступны при запуске, но могут быть переопределены во время выполнения.

Рамзи Кахил
источник
2

Tcl, дизайн которого был в первую очередь минималистичным

Оттуда о странице http://www.tcl.tk/about/features.html , одна из особенностей заключается в том, что ее очень легко изучить и где ее могут использовать обычные программисты или даже не программисты.

Egryan
источник
3
Это звучит точно для меня, но однострочные ответы без вспомогательной информации или деталей слишком низкого качества, чтобы быть полезными для всех. Пожалуйста, добавьте некоторые подробности (а не просто ссылку без краткого изложения), и вы получите от меня голос "за"
Джимми Хоффа,
Хорошо, сделаю, хотя из-за закрытого вопроса не знаю, сколько усилий стоит
Egryan
1
Если повезет, он будет вновь открыт с голосов. Это хороший вопрос. Я мог бы опубликовать на Meta, чтобы попытаться открыть его заново, если сообщество не откроет его в ближайшее время.
Джимми Хоффа
Я согласен, и я планирую добавить больше к сообщению, как только я уйду с работы, мне не повезло с поиском соответствующих ссылок
Egryan
Поищите в Google «Примеры использования языка TCL», «Tcl: встраиваемый командный язык» и tcl.tk/about/history.html - они дают некоторые ключевые моменты. Тем не менее, я не уверен, что они поддерживают желание ОП - похоже, что TCL был расширен с его первоначальной версии 1.0 (см. Wiki.tcl.tk/1721 )
2

Есть несколько языков, которые остались относительно неизменными с момента их появления за пределами эзотерических одноязычных языков, которые вряд ли будут желаемыми (я бы не хотел пытаться написать что-то значимое в Befunge (хотя это также было изменено с момента его оригинальной версии 1.0). выпуск)).

Языки, которые, скорее всего, удовлетворят желание не изучать ничего нового, являются языками, которые специализируются на «склеивании» между другими программами. Такие языки как jcl , bash и тому подобное. Простые скриптовые языки также могут попасть в это число - awk является одним из лидеров.

Как только человек покидает это царство, происходит развитие. Либо язык, либо рамки. В некоторых ситуациях «сложно» кодировать язык без получения какой-то структуры, которая быстро восстанавливается.

Многие языки имеют некоторую степень обратной совместимости. Сегодня все еще можно писать Java 1.4, хотя, вероятно, это и не рекомендуется - фреймворки, которые люди пишут для него, меняются быстрее, чем язык. Можно найти компиляторы f77 и f90 для языковой спецификации, которая не изменилась за 20 или 40 лет. C, Objective C, C ++ все еще могут быть закодированы для более старых спецификаций языка - не нужно постоянно обновлять свой код, потому что была выпущена новая спецификация или появилась новая инфраструктура.

Некоторые языки имеют довольно длинную неизменную историю, потому что сам язык достаточно силен, чтобы делать то, что он хочет. Лисп является главным кандидатом в этой области. Форт также попадает в сферу "он не сильно изменился".

Переходя к более традиционным языкам сценариев посмотрите на TCL, Perl и Python. Избегайте вещей, которые в настоящее время находятся в царстве «причуд», которые по той или иной причине испытывают всплеск популярности (ruby и javascript, я смотрю на вас). TCL изменился за эти годы , хотя одна из его целей состоит в том, чтобы попытаться поддержать последовательность дизайна. Современный Perl и Python имеют некоторую согласованность дизайна, хотя по общему признанию новые функции могут ощущаться как сбитые с толку (хотя их не нужно использовать).


источник
2

Я думаю, что Python - разумный кандидат на язык с минимализмом в качестве одной из целей его разработки. Он основан на относительно небольшом количестве основных концепций, и в версии 3, среди прочего, была предпринята попытка немного упростить язык , удалив некоторые функции.

(Конечно, это не то же самое, что набор функций, который не изменился по сравнению с версией 1, но я думаю, что это довольно произвольный способ оценки языков, учитывая, что авторы языков могут называть его версией 1 в любое время.)

Пол Д. Уэйт
источник
Дата ответа декабрь 2012 года дает вам свободный проход, потому что с тех пор у нас есть чудовище, известное как Python 3, которое конкурирует с C ++ в желании добавить кучу мусора, в то время как фактически удаляет простоту. В настоящее время это один из самых посторонних языков программирования.
Томас Браун
-1

Я думаю, что «минималистский» подход к дизайну был бы примером Tcl. Например, вы можете использовать команду {catch} со значениями {return -code n} для реализации любой структуры управления, которую может представить ваше воображение. Perl пришлось ждать десятилетие, чтобы (официально) получить {switch} - (не то, что Perl когда-либо нуждался в этом). Также вы увидите, что Dodekalogue http://wiki.tcl.tk/10259 полностью охватывает грамматику Tcl - остальное, с какой бы парадигмой программирования вы не хотели работать, можно выразить в этой грамматике.

user132043
источник
это просто повторяет сказанное и объясненное в ответе, опубликованном два года назад
комнат
Ссылаясь на оригинальный пост, я думаю, что могу сказать только ортогональность = история (семейство языков C) и недавняя межъязыковая ассимиляция; Я видел во всех языках ОС подход ко всем языкам к обобщенным веб-фреймворкам MVC, сопрограммам и т. Д. Помимо этой тенденции, я могу отметить замечательное добавление замыканий в C11 и грядущую лямбду Java (которые отражают развитие в языковых «сценариях» ОС).
user132043