Какая "семантическая модель" представлена ​​в Апокалипсисе №1?

В Апокалипсисе #1 Ларри написал с моим дополнительным ударением:

Raku будет поддерживать несколько синтаксисов, которые соответствуют единой семантической модели. Во-вторых, эта единая семантическая модель, в свою очередь, будет отображаться на нескольких платформах.

У меня есть некоторые смутные представления о том, что мог иметь в виду Ларри, когда писал "единую семантическую модель":

  • Полный язык / автомат Тьюринга; и / или

  • Что стало 6моделью; и / или

  • Что стало NQP / nqp.

(Я погуглил и поймал некоторые обсуждения, например, это на slashdot, но они были столь же расплывчаты.)

Возможно, более важным, чем ответ на то, о чем он думал, является то, что произошло.

Его формулировка очень похожа на NQP и / или nqp (в середине серверной архитектуры Raku / NQP/nqp / NQP).

(Если так, предположительно, эта модель "указана" в nqp-эквиваленте жаркого Раку?)

Или по Liz++, QAST или RAST?


Я знаю, кто, по моему мнению, сможет лучше всего ответить на мой главный вопрос (в заголовке), но, может быть, знает кто-то другой?

1 ответ

Решение

Апокалипсис №1 представляет собой одно из самых ранних размышлений Ларри о процессе, который привел нас к тому языку раку, который мы знаем сегодня. Я не был так рано в процессе разработки языка, поэтому любой ответ, который я дам, естественно, будет включать попытку представить себе то, что было известно на тот момент. С этим довольно важным предостережением давайте посмотрим.

Синтаксис - это слова и символы, которые мы пишем. Семантика - это то, что означают вещи. Например, предположим, что мы на языке, в котором есть такая вещь, как инфиксные операторы, и есть оператор, записанный как+. Мы могли бы написать выражениеa + b. Семантика говорит нам, что это значит. Хотя многие языки программирования имеют этот синтаксис, они сильно различаются по семантике, то есть по значению, связанной с ним. Например:

  • В C это зависит от типов a а также b. Это может означать какое-то числовое сложение (с целым набором правил, основанных на целых числах, целочисленных рангах, с плавающей запятой и т. Д.). Однако еслиa указатель и b является целым числом, на самом деле там тоже происходит скрытое умножение, основанное на размере указателя.
  • В C++ см. Определения из C, но это также может быть вызов функции для перегрузки оператора и / или любая из этих семантик, но полученная после применения правил преобразования к операндам. Пожалуйста, не спрашивайте меня, что это за правила.
  • В Java это тоже происходит по типу; это может означать сложение чисел или конкатенацию строк.
  • В JavaScript это может быть числовое сложение или конкатенация строк, но это решается во время выполнения в соответствии с правилами. Нет, об этих тоже не спрашивайте.
  • В Raku это вызов функции infix:<+>, а это означает то, что стандартная библиотека решает.

Для меня семантическая модель - это систематический способ описания семантики. Это может существовать как одно или несколько:

  • Письменная (на естественном языке) спецификация, которая пытается описать, что нужно делать.
  • Исполняемая спецификация, которая пытается описать, что делают вещи (например, спецификации Raku)
  • Выражение семантики с использованием математического формализма, такого как операционная семантика или денотационная семантика.
  • Интерпретатор, реализованный на каком-то другом языке (в этом случае мы опираемся на его семантическую модель)
  • Компилятор, переводящий на другой язык (опять же, мы опираемся на семантическую модель целевого языка)

Как мы уже заметили, синтаксис a + bможет соответствовать множеству различных семантик на разных языках, мы также можем отображать множество синтаксисов в один и тот же набор семантик. Это верно даже для стандартного раку; нет смысловой разницы между написанием$a + $b а также infix:<+>($a, $b).

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

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

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

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

В некоторой степени у нас уже есть мульти-синтаксическая модель в Perl 5; каждый раз, когда вы используете прагму или модуль, вы искажаете язык, который используете.

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

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

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

Особенно ярким примером того, как поддержка нескольких синтаксисов позволит продолжить развитие, является переход с Perl 5 на Perl 6.

Это указывает на то, что в то время считалось, что Perl 5 и Perl 6 (ныне Raku) будут иметь достаточно общего, чтобы иметь общую семантическую модель и работать поверх одной среды выполнения. Как мы знаем, все пошло не так, однако во время написания Апокалипсиса №1 я могу представить, что это было предположением. Фактически, он, вероятно, оставался таковым довольно долгое время; например, PONIE (проект по попытке запустить Perl 5 поверх виртуальной машины Parrot) продолжался несколько лет спустя.

В действительности, когда возник дизайн языка, единственная семантическая модель, которая позволяла бы это сделать, стала нереальной. По этой причине предпринимались различные попытки перенести функции Perl 6 в Perl 5. Умное сопоставление - это пример этого, и проблема была вовсе не из-за синтаксиса, а из-за семантики: в Raku вещи всегда знают свой тип, тогда как в Perl 5 скаляр может одновременно содержать строковое и числовое представление, в зависимости от того, как значение использовалось до этого момента. Эта функция была основана на чем-то в семантической модели Raku, что не имело прямого эквивалента в семантической модели Perl 5.

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

Другие вопросы по тегам