Подтвердить что ты не робот

Зачем использовать язык, ориентированный на стек?

Недавно я взглянул на Factor, и идея создания языка, основанного на концепции стека, очень интересна. (Это была моя первая встреча с языком, ориентированным на стек). Однако я не вижу никаких практических преимуществ такой парадигмы. Для меня это похоже на больше проблем, чем стоит. Почему я должен использовать язык, ориентированный на стек, например Factor или Forth?


Я игнорирую факторы (извините за каламбур), такие как доступность инструментов и библиотек. Я спрашиваю только о самой языковой парадигме.

4b9b3361

Ответ 1

Ориентация стека - это деталь реализации. Например, Joy может быть реализован с использованием перезаписи - без стека. Вот почему некоторые предпочитают говорить "конкатенативный" или "композиционный". С котировками и комбинаторами вы можете закодировать, не думая о стеке.

Выражение себя чистой композицией и без локальных жителей или именованных аргументов является ключевым. Это чрезвычайно сжато без синтаксических накладных расходов. Композиция позволяет легко исключить избыточность и "алгебраически" манипулировать вашим кодом; кипятить его по существу.

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

Ответ 2

Я не уверен, ответит ли это на ваш вопрос, но вы обнаружите, что Factor описывает себя как concatenative язык прежде всего. Просто случается также иметь модель исполнения на основе стека. К сожалению, я не могу найти сообщение в блоге Slava (или, может быть, в Factor Wiki?), Говоря об этом.

Конкатенативная модель в основном означает, что вы передаете "куски кода" (ну, как вы все равно программируете), а композиция выглядит как конкатенация. Операции, такие как currying, также легко выразить на языке на основе стека, поскольку вы просто предварительно компилируете код, который добавляет одну вещь в стек. В Factor, по крайней мере, это выражается через слово curry. Это значительно упрощает программирование более высокого порядка, а отображение над последовательностями в конечном итоге становится "очевидным способом сделать это". Я пришел из Lisp и был поражен возвращением после программирования в Factor немного, чтобы вы не могли делать "очевидные вещи", например bi в Lisp. Это действительно изменяет, как вы выражаете вещи.

Кстати, разумно не слишком зависеть от всего манипулирования стеком. Используя словарь locals (описанный здесь: http://docs.factorcode.org/content/article-locals.html), вам не нужно беспокоиться о перетасовке вещей. Часто существует четкий способ выразить вещи без локальных переменных, но я, как правило, делаю эту секунду.

Ответ 3

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

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

Язык программирования схемы - еще один пример этого: минималистский синтаксис и семантика, простая реализация и много удовольствия!

Ответ 4

[Отредактировано] У нас уже есть хорошие ответы, и я ничего не знаю о языке Фактор. Однако предпочтение использования стека является практическим преимуществом парадигмы, ориентированной на стек, и причиной принятия такой парадигмы.

Итак, я думаю, что стоит перечислить преимущества использования стека вместо выделения кучи для полноты:

  • CPU Time - временная стоимость выделения памяти в стеке практически свободна: не имеет значения, выделяете ли вы одну или тысячу целых чисел, все, что требуется, - это операция уменьшения указателя стека. пример
  • Утечка памяти - нет утечек памяти при использовании только стека. Это происходит естественным образом без дополнительных накладных расходов на код. Память, используемая функцией, полностью освобождается при возврате из каждой функции даже при обработке исключений или использовании longjmp (без учета ссылок, сбора мусора и т.д.).
  • Фрагментация - стеки также позволяют избежать фрагментации памяти естественным путем. Вы можете достичь нулевой фрагментации без какого-либо дополнительного кода, чтобы иметь дело с этим, как пул объектов или распределение памяти слэба.
  • Локальность - данные в стеке благоприятствуют локальности данных, используя преимущества кэша и избегая перестановок страниц.

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

Ответ 5

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

Кроме того: в первые дни карманных калькуляторов они использовали что-то, называемое обратная польская нотация, которая представляет собой очень простую нотацию Postfix на основе стека, и является чрезвычайно эффективной памятью. Люди, которые научились эффективно использовать его, склонны предпочитать его по алгебраическому вычислению.

Ответ 6

Исследования/Разработка/Понимание популярных виртуальных машин

JVM, виртуальная машина Java, является языком, основанным на стеке. Кроме того,.NET Framework основан на MSIL, который также является виртуальной машиной и языком стеков.

Как встроенный язык сценариев

Я писал подмножество FORTH в С#, в разных стилях (до сих пор, макро, с косвенной и прямой). Я хотел, чтобы он был очень маленьким и переносимым на разные языки и среды, и что-то очень простое должно быть в состоянии сделать это. Синтаксический анализатор представлял собой простую функцию разделения строк, а затем интерпретировал каждое слово (первый способ) или компилировал каждое слово в словарь (второй способ). У обоих были свои сильные стороны.

Это функциональный

Это так. Ты слышал меня. Чисто функциональный означает, что при одинаковых входных данных вы получаете одинаковый выходной сигнал и не производите побочных эффектов. В языке FORTH на основе стека с нулевой точкой, по крайней мере для большинства слов, учитывая стек в качестве входных данных, после запуска слова вы получаете тот же стек, что и выходной. Таким образом, он функционален, со всеми математически гарантированными свойствами, которые сопровождают его! ФОРТ мог добиться большего в этом.

Можно ли создать Haskell-Forth? - чисто функциональный язык Haskell, но повторно выраженный как язык, основанный на стеке? Это уже чисто функциональный язык на основе стека. Hmmmmm...

Объектно-ориентированные исследования

Поскольку FORTH позволяет вам полностью переопределить язык, если вы хотите, и представляет собой глубокое сочетание простых механизмов, он позволил создать множество различных вариантов объектно-ориентированной ориентации. Было много экспериментов с внедрением ООП на FORTH по мере его разработки, и некоторые из тех, о которых я никогда не слышал, были интересны для чтения. К сожалению, я недостаточно углубился в это. Если вам интересно, вы можете найти периодические издания 4th Dimensions для интересных перспектив и идей по ООП, так как это только начиналось.

Я быстро посмотрел их

Вывод вашего оптимизированного программного обеспечения на аппаратный уровень

Чарльз Мур, отец FORTH, одного из первых языков на основе стека, провел всю свою жизнь, оптимизируя разработку программного обеспечения и то, что он мог с ним сделать, вплоть до создания 144-ядерного процессора, который реализует его новейший язык на основе стека.

Исследования в оптимизации

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

Вот краткий обзор радости:

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

Потому что это форма проблемы (или машина!)

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

Спектакль

Производительность - одна из скрытых причин того, что JAVA и .NET основаны на языках стека. Я думаю, что другая причина в том, что JIT-ting, компиляция и оптимизация легче с языками на основе стека. Разве большинство инструкций ЦП не способны эффективно реализовать работу стека? Я полагаю, что это либо основанная на стеке, либо на регистровом основе.

Одна форма

Когда весь ваш код основан на стеке, он не имеет несоответствия импеданса. Вам не нужно переводить. Я имею в виду Homoiconicity, что подразумевает, что вместо совершенно отдельного языка для препроцессора, как в C++, язык может манипулировать собой, а язык, используемый для предварительной обработки (или реализации макросов), является тем же языком, который вы используете для напишите ваши основные файлы кода. Вы можете написать код. Вы можете написать код, который пишет код. Или вы можете пойти дальше, если хотите. На каждом уровне вы можете использовать один и тот же ФОРТ. По-видимому, это также относится и к Lispм, хотя я не сделал достаточно в этом пространстве. (В конце концов я хочу смешать LISP и FORTH - мне интересно, нужна ли нам вся эта мощь макроса LISP в FORTH или нет).

ВПЕРЕД

Я изучал только этот один язык в течение многих лет, и я поражен этим. Здесь я не говорю о FORTH, популяризированном его использованием и стандартизацией в мейнстриме. Здесь я на самом деле говорю о FORTH, как его задумал и определил его создатель Чарльз Мур, который рассматривал его как Язык оптимизации и инструмент для определения глубины простоты и оптимизации, и, честно говоря, немного продвинулся впереди нас. Пока что кажется, что мы никогда не наверстаем упущенное, но у нас есть чему поучиться у него, если мы можем просто сделать это. То, что ему потребовалось на всю жизнь, может найти нас несколько, чтобы понять, если мы не сможем получить посла/переводчика. Тем не мение...

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

Если вы написали этот единственный сайт, Джефф Фокс, Ultratechnology, и посмотрите на эту часть, 1x Forth, интервью с Чарльзом Муром Джеффа Фокса. В этом интервью он объясняет, как он больше не использует "другое", и это звучит безумно, но как далеко ушла его оптимизация - он думает: "Вместо этого я просто использую этот код операции, и этот другой трюк, и это проще и быстрее, и я удалил слово из своих кодов операций ".

На этом веб-сайте вам нужно выбирать из многих мест, но вы в конечном итоге понимаете, что они оптимизировали FORTH до сих пор, что они достигли 10% улучшения здесь, 10% улучшения там, оставив 40% код где-то еще,... с удивительным результатом, что их код в некоторых случаях работает в 100 раз быстрее, чем конкурирующий код.

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

Было бы полезно изучить этот "способ", чтобы вернуться к попытке понять, почему мы должны установить столько МБ операционной системы и так много МБ среды разработки, прежде чем мы сможем даже сказать "Привет, мир!"

Post-Script на PostScript

О да, и я забыл упомянуть. И PDF, и PostScript основаны на языке стека, который должен был быть достаточно компактным и обладать достаточной производительностью, чтобы работать на "древнем" оборудовании, когда вычисления только начинались. PostScript... экономный, мощный, производительный и практичный!