LINUX.ORG.RU

А много ли есть языков, где нет фиксированного «синтаксиса»?

 , , ,


2

6

Вообще, под синтаксисом часто понимаются разные вещи, понятие довольно расплывчатое. Кстати, есть ли четкое, абсолютно однозначная, каноническая трактовка?

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

Опять же, тут есть тонкая грань. Если каждому оператору соответствует какое-либо выражение языка, то все еще можно считать, что в языке все есть выражение. В таком случае, это можно считать легкой косметикой. Например, оператору := в Io соответствует выражение setSlot. Спецформе define в Scheme не соответствует никакое выражение. Соответственно, на Io можно писать используя одни только выражения, на scheme — нет.

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

Наверное, tcl сюда входит, picolisp, возможно смоллток(поправьте, если я ошибаюсь). А еще есть?

UPD точней будет, наверное, не «без синтаксиса», а «независим от синтаксиса»

Что значит, без синтаксиса? У Tcl есть синтаксис. Он простой и логичный, но таки есть.

Я думаю, что всё-таки без синтаксиса никуда. Хоть какой-то но должен быть.

Хотя... brainfuck

Xenius ★★★★★ ()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от Xenius

Ну, в тикле, ЕМНИП, можно все переопределить, там концепция «все есть строка». В этом смысле. Любые управляющие конструкции можно вручную запилить. Насчет брейнфака — не уверен.

callbackhell ()

В Smalltalk нет фиксированного синтаксиса?

Gentooshnik ★★★ ()
Ответ на: комментарий от Gentooshnik

Я собственно, не знаю, просто интересуюсь:) Я слышал, что там все выражения — сообщения, поэтому, по идее, должно быть так...

callbackhell ()
Ответ на: комментарий от Gentooshnik

Там же даже арифметические операторы — сообщения, именно поэтому там в арифметике нет приоритетов. Но вообще, я смоллток не знаю, все руки не доходят как-то:)

callbackhell ()

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

anonymous ()

А еще есть?

Forth: «синтаксис базового уровня в Форте прост и состоит из единственного правила: «все определения разделяются пробелами».

quickquest ★★★★★ ()
Ответ на: комментарий от quickquest

можно в форте переопределить определения, например mydup = dup; dup = foo?

callbackhell ()
Ответ на: комментарий от callbackhell

можно в форте переопределить определения, например mydup = dup; dup = foo?

Точно не помню как работают переопределения, в прошлом веке им баловался. Посмотри в стандарте языка или вызывай Главного Фортовода ЛОРа KRoN73 :)

quickquest ★★★★★ ()

На ЛОРе всё те же придурки. Санитары набухались и забыли вколоть ему успокоительное?

anonymous ()
Ответ на: комментарий от anonymous

При одинаковой сложности алгоритма либо сахарок, либо синтаксис, либо многословность. Хотя, нет. Есть ещё уникальные случаи вроде Java, где и синтаксис, и многословность.

Но если выбирать *одно* из трёх - лучше многословность.

Gentooshnik ★★★ ()
Ответ на: комментарий от callbackhell

Как это вообще связано с фиксированностью синтаксиса? Единственный язык без фиксированного синтаксиса - это Common Lisp из-за макросов чтения (reader macros). В прочих Tcl, Smalltalk и т.д. синтаксис очень простой, но он же фиксирован. В Tcl можно сделать свою команду со своим синтаксисом (стандартный expr, например), но синтаксис, которым оперирует компилятор таки фиксирован.

Gentooshnik ★★★ ()
Ответ на: комментарий от anonymous

Да, eDSL легко делать, но они получаются такими же громоздкими

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

Ну, и к тому же, утверждения «легко писать» и «многословность» не очень то сочетаются. Как-то я не уловил мысль.

callbackhell ()
Ответ на: комментарий от Gentooshnik

CL не является таковым, там есть спецформы, и их не мало.

Как это вообще связано с фиксированностью синтаксиса?

Напрямую. У тебя в языке все есть объект. Любой объект может изменить имя любого своего слота. А весь синтаксис — это только сообщения через имена слотов. Соответственно, все можно изменить.

callbackhell ()

достаточно много.

REBOL, Red, форт, фактор, лиспы, и т.п.

Вообще, под синтаксисом часто понимаются разные вещи, понятие довольно расплывчатое. Кстати, есть ли четкое, абсолютно однозначная, каноническая трактовка?

cм. у лингвистов — там достаточно чётко.

Не-синтаксис — это только лишь вражения языка. Сюда не входят любые макроопределения, спецформы, statements, операторы и так далее.

нет, они тоже входят. просто в некоторых языках — разные типы выражений для обозначения этих «выражений языка». в некоторых других — один формальный синтаксис, универсальный и гомоиконность (= «однородность представления»).

это не означает, что этот тип выражений единственный: наоборот, это фомальное «каноническое» представление (ну например для ЕЯ как если бы представлять логбан/ложбан логическое представление, или в терминах частей речи синтаксис, или фонетический алфавит для звуков и слогов)

например, в том же лиспе есть: S-выражения (ну это всем понятно), но ещё и : M-выражения (оригинальный лисп Дж.Маккарти, в стиле Mathematica), I-выражения или sweet expressions (синтаксис в стиле питона), алгол выражения в CGOL (семантически это тоже лисп, несмотря на).

то есть: есть изоморфизмы всех этих различных X-выражений на канонические S-выражения благодаря «гомоиконности».

ещё пример: реализация смоллтока на Фактор (встраиваемые PEG-грамматики, реализация на 2-3 страницы).

ещё пример: проект OMeta для парсеров из подпроектов проекта STEP/FoNC (в. т.ч. и крайне любопытные линзы и статья про «parsers running backwards») с реализациями на JS, C#, CL (META II) и т.п. (там есть в частности, наследование и композиция грамматик).

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

Это тоже неверно: изменить средствами самого языка таки можно — если среда позволяет. Ну например, в CommonLisp есть reader macro, и все эти трансляции грамматик можно делать через compiler-macro, во время чтения и макроподстановок, компиляцией с мемоизацией результатов.

то, что в CL стандартный синтаксис — S-выражения не мешает реализовать *другие* синтаксисы, с той или иной долей мучений (например CGOL, С-подобный алгол таки можно, но не так уж и просто). опять же, благодоря гомоиконности, сохраняющей полную информацию для трансляции между представлениями (ср. с представлением в статье «parsers running backwards» из OMeta).

кстати, вот ещё из алголов: W-грамматики и аттрибутивные грамматики в Algol-60. в этой реализации алгола не было BNF синтаксиса (собственно, Algol-W или Паскаль Н. Вирта появился из алгола-60 упрощением, устранением неоднозначностей грамматик).

поэтому трансляция была перепрограммируемой, перенастраиваемой.

ещё на тему управляемой синтаксисом трансляции, см. курс по метакомпилятору META: в туториале последовательно за 10 шагов разрабатывается компилятор через метакомпилятор, компилятор компиляторов, в духе Meta II статья пример со ссылкой на статью

callbackhell

анонiмус, ты что ли это? узнаю по node.js и io.

Наверное, tcl сюда входит, picolisp, возможно смоллток(поправьте, если я ошибаюсь). А еще есть?

форт, фактор и вообще любой конкатенативный на SK-комбинаторах, тот же темплейт хаскель на парсер комбинаторах, Staged Metaprogramming Ocaml и т.п.

те же метакомпиляторы в духе Meta II, OMeta, Xoc, an extension-oriented compiler for systems programming (ссылка-- диссер Расса Кокса

и т.п.

anonymous ()
Ответ на: комментарий от callbackhell

CL не является таковым, там есть спецформы, и их не мало.

Как это связано с фиксированностью синтаксиса? O_o

А весь синтаксис — это только сообщения через имена слотов.

Синтаксис - это что? o_O

Молодой человек, у вас такая каша в голове, что я сейчас даже на рискну начать разбираться как привести её в порядок.

Gentooshnik ★★★ ()

гомоиконность

кстати, в io или в каком-нибудь ooc-lang тоже гомоиконный синтаксис.

про что-то подобное А. Столяров из InteLib писал как про «операцию пробел» — он внезапно открыл, что мольеров персонаж разговаривал прозою — то есть, что от языка макросов нужна возможность реализовать какую-то алгебру синтаксиса (См. в последних публикациях на тему InteLib).

с этим кстати, интересно смыкаются «Система Алгоритмических Алгебр» В. М. Глушкова , Г. О. Цейтина, «схемы Янова» и т.п.

см. ссылку про «алгебру алгоритмов».

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

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

anonymous ()

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

Ассемблер, машинные коды, брейнфак и производные.

Psych218 ★★★★★ ()
Ответ на: комментарий от callbackhell

CL не является таковым, там есть спецформы, и их не мало.

в этом смысле, новые поколения лиспов лучше: ISO ISLISP, EuLisp и т.п.

да даже в той же схеме — уже получше.

смотрим на размер спецификации языка и прикидываем в уме количество частных случаев, костылей и подпорок.

ну или kernel с vau-выражениями на Fexpr-ах, 3-Lisp и т.п.

в SICL что-то говорят про «environmental passing style», это в нужном направлении, опять же для модульности получше будет.

У тебя в языке все есть объект. Любой объект может изменить имя любого своего слота. А весь синтаксис — это только сообщения через имена слотов. Соответственно, все можно изменить.

ага, или сообщения — то есть, объектный протокол. или метаобъектный протокол. или интерфейс к AST и компилятору.

или какое-то достаточно богатое IR, внутреннее представление (например на базе смоллтока в статье из FONC/STEP OMeta «parsers running backwards») — и в итоге возможность обратно оттранслировать из любого синтаксиса в любой другой, без потери метаинформации.

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

anonymous ()
Ответ на: комментарий от Gentooshnik

Как это связано с фиксированностью синтаксиса?

Непосредственным образом. Ты, тупо, не можешь переопределить спецформы, они захардкорены.

Молодой человек, у вас такая каша в голове, что я сейчас даже на рискну начать разбираться как привести её в порядок.

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

callbackhell ()
Ответ на: комментарий от callbackhell

Ну, в тикле, ЕМНИП, можно все переопределить, там концепция «все есть строка».

лисп: всё есть S-выражения.

OMeta: всё есть OMeta-выражения.

PEG: всё есть PEG-выражения.

парсер-комбинаторы: всё есть выражения комбинаторов в конкатенативном синтаксисе.

форт: всё есть слова, слово-выражение. с питушением стека данных вручную.

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

РЕБОЛ: всё есть ребол-выражения. первая строчка до начала программы — выбор подъязыка.

Racket: всё есть #lang mylang-syntax выражения. выбор подъязыка.

Рефал: всё есть R-выражения.

CGOL: всё есть алгол-выражения. Algol-60 c аттрибутивными W-грамматиками — тоже.

оригинальный лисп Маккарти: всё есть M-выражения.

Математика, Вольфрам Альфа формат бандлов: всё есть M-выражения тоже, только М другое.

смоллток, io, ooc, Obj-c: тоже какие-то Зю-выражения с «операцией пробел» и foo.doThis().andThat().andThen().hangBy(self,callBackHell)

anonymous ()
Ответ на: комментарий от anonymous

Синтаксический минимализм оборачивается многословностью

многословностью чего ???

Вот если бы язык с сахарком вроде питона можно было с полпинка расширять не трогая парсер, это было бы годно.

Nim (бывший Nimrod) с AST-макросами.

anonymous ()
Ответ на: комментарий от anonymous

или sweet expressions (там их 3 вида), I-выражения  — синтаксис питона для лиспов.

anonymous ()
Ответ на: комментарий от callbackhell

кроме того, протокол сообщений (объектный протокол) — неоднозначен (например: объектный, метаобъектный протокол для метаклассов, метаметаобъектный протокол для метаметаклассов и т.п.)

то есть: у слота объекта есть несколько адресов, в зависимости от протокола, по которому его адресовать.

язык — это тоже такой метаобъектный протокол. омонимы — неоднозначности синтаксиса за счёт образности, метаобъектов.

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

anonymous ()

1.

ибо все варианты это диалекты одного без синтаксисного языка.

итак возмём диалект безсинтаксисного языка как идеализированый диалект форта.

пусть алфавит будет utf-8 (ибо так ща проще) слова это последовательность 1 и/или более не пробельных букв ограниченая пробельными символами.

в идеализированном диалекте форта(и его интерактивном интерпретаторе) исходно все имеющиеся слова есть немедленные к исполнению.

каждое такое слово как то меняет состояние интерпретирующей системы и при некоторых словах сама интерпретирующая система оказывает влияние на внешний мир своей реакцией в виде некоего оутпута в тот или иной выход.

---------------------------------- вообщемо и всё.

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

в обычном форте это

: name existnames* ;

где : это слово которое поглощает весь дальний ввод до встречи особого слова ; и считает первое слово новым термом а остальной набор слов до терминала значением этого слова.

в обычном форте за счёт исполнения немедленных слов промеж : ; определения возможна специализация определений в момент их исполнения - но в целом это дублирующий механизм - эдакий аналог статической компиляции в обычных компиляторах.

как ни любопытно в самых ранних фортах : ; не было компилирующим(переводящим в код) словом, а буквально лишь добавляло в словарь определение нового_слова как набор уже существующих.

а при интерпритации (т.е встречи в процессе исполнения) слова шло стекование точек интерпритации и интерпритации словарной статьи

в том и мощь идеи Мура что интерпритация интерактивной консоли оператора есть частный случай процесса интерпритации словарной статьи.

qulinxao ★★☆ ()
Ответ на: комментарий от callbackhell

что слово синаксис не вполне однозначно

Running Ometa Parsers Backwards for Source to Source Translation

см. представление на базе смоллтока для OMeta, обладающее «обратимостью» reversability — возможностью построить парсер-линзу для трансляции с одного языка на другой, задавая грамматики языков на базе языка метакомпиляторов OMeta (с наследованием, как объекты, модульно).

anonymous ()
Ответ на: комментарий от callbackhell

представь теперь какой-нибудь GNU Emacs CEDET / Semantic /COGRE — УНИВЕРСАЛЬНЫЙ объектный браузер, рефакторинг, шаблонизатор для нескольких языков.

на основе вот похожего на «OMeta parser running backwards», для трансляции с одного языка на язык, с одного синтаксиса на другой.

нету покамест ничего подобного (что-то про парсер-линзу на смоллтоке разве что). а жаль.

anonymous ()
Ответ на: комментарий от anonymous

моллток, io, ooc, Obj-c: тоже какие-то Зю-выражения с «операцией пробел» и foo.doThis().andThat().andThen().hangBy(self,callBackHell)

Насчет других не знаю, но в Io с точки зрения синтаксиса все есть сообщение. <objectName> <messageName(optionalArguments)>, где <objectName> --также сообщение (сокращение от Lobby objectName ). В свою очередь, Lobby - это Lobby Lobby , таким образом, весь синтаксис сводится к сообщениям. Объекты — это уже, как бы, семантическая абстракция.

callbackhell ()
Ответ на: комментарий от Psych218

маш коды это вообщет над (0|1)* язык с вполне определённым синтаксисом ибо парсер(проц) не всякую строку признает за годную а лишь те которые соответствуют(локально) шаблонам исполнимых команд(в момент чтения места исполнения)

qulinxao ★★☆ ()
Ответ на: комментарий от qulinxao

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

Psych218 ★★★★★ ()

бля, какая хрень понаписана.

русский матерный - не имеет синтаксиса, на нем программируй. Да и какая тебе вообще разница, тыж не программист ни разу.

anonymous ()
Ответ на: комментарий от anonymous

кроме того, протокол сообщений (объектный протокол) — неоднозначен (например: объектный, метаобъектный протокол для метаклассов, метаметаобъектный протокол для метаметаклассов и т.п.)

Это касается только языков, где метаобъекты выделены в отдельные сущности(например классы). В Io протокол един для всего.

callbackhell ()
Ответ на: комментарий от qulinxao

а стенотип (ETAOIN SHRLDU для стенографистов-машинистов) — это слоговая азбука, слогами, фонемами, однокоренными мемами и образами языка.

глоссолалия намшуба Энки из «Лавины» Стивенсона.

хирагана и катакана.

а при интерпритации (т.е встречи в процессе исполнения) слова шло стекование точек интерпритации и интерпритации словарной статьи

в том и мощь идеи Мура что интерпритация интерактивной консоли оператора есть частный случай процесса интерпритации словарной статьи.

кста, зачем интерпретировать, если можно сразу компилировать?

но красота в глазах смотрящего — понимание в глазах интерпретатора, язык предназначен для конкретного фтыкателя-понимателя.

если его прометапрограммировать, этот сам язык — получится синьити мочидзуки, «интеруниверсальный геометр» с «универсальной теорией всего» теймюллера.

и фтыкатели-недопониматели метаязыков основоположника священных писаний на метакомбинаторах-унпарсерах.

так говорил енопланетянен. ницшеанцы-андромедяне с формально синтаксически святым писанием — а как вчитаешься, вовсе наоборот, морали там нет и ненужно.

anonymous ()
Ответ на: комментарий от qulinxao

спс. ещё про Ocode и те вот времена BCPL, тоже занятно.

anonymous ()
Ответ на: комментарий от qulinxao

умножение по крестьянски и операторные схемы Янова, САА

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

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

налицо общая схема решения — складываем разложения. ср. с вычислениями «моноиды на верёвках» из статьи из fprog.ru , катаморфизмы в F#, топосами Гротендика, и вычислениями над кольцом (полем) алгебр

и оттудова — в сторону САА Глушкова и схем Янова.

например: по общей схеме «алгоритма умножения по-крестьянски» (по древеегипетски) можно не только умножать, но и возводить в степеня (ср. с A*e^(i*phi), по основанию e :)) и извлекать корни.

потому что умножение это моноид с единицей и умножением, как композиция моноидов — умножения и сложения (с нулём и умножением).

то есть: заменяя умножения на возведение в степень, и складывая — получим вычисление степеней. пример

аналогично, можно и корни извлекать.

в итоге: единица неоднозначна (в разных СС). первичны инварианты, типа x = (2*x)/2 и алгебра деления на два. вычисляются по крестьянски не конкретное умножение (c увлечением), а умножение алгебр.

композиция моноидов как она есть. синтез алгоритма из общей схемы.

anonymous ()
Ответ на: комментарий от qulinxao

кстати, если заменить инвариант x=2*x/2 с умножения на корни: x=x**2**0.5 — то тут получим неоднозначность, относительно +- корней, +- едниц, мнимых единиц ijk в кватернионах.

то есть: единица сама по себе определена неоднозначно, +1= ij = jk = ki. к тому же ещё +1 = (-1)*(-1) = (i**2)*(j**2)=....

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

комплексные корни и логарифмы — неоднозначны, и первые лежат как пентакли в плоскости, вторые — в пространстве на поверхности Римана.

anonymous ()
Ответ на: комментарий от qulinxao

в обычном форте за счёт исполнения немедленных слов промеж : ; определения возможна специализация определений в момент их исполнения - но в целом это дублирующий механизм - эдакий аналог статической компиляции в обычных компиляторах.

Р. Богатырёв, оберонщик — где-то у него на сайте есть перечень систем программирования, разработанных в СССР.

в 90х среди прочего там кто-то в Питере разрабатывал систему программирования на форте, мультиязыковую.

anonymous ()
Ответ на: комментарий от qulinxao

а при интерпритации (т.е встречи в процессе исполнения) слова шло стекование точек интерпритации и интерпритации словарной статьи

да, форты с несколькими стеками зело прикольные.

надо в один из стеков завернуть окружение — актора-интерператора для ООП в стиле акторов.

anonymous ()
Ответ на: комментарий от qulinxao

программирование на программистах метапрограммистами Office Space

Human Resource Machine

тебе повезло, ты не такой как фсе. ты работаешь в офисе.

подрабатываешь машиной тьюринга на полставки.

anonymous ()
Ответ на: комментарий от qulinxao

гвозди бы делать из этих людей

или машину тьюринга с несколькими каретками (стеками).

anonymous ()
Ответ на: комментарий от qulinxao

в том и мощь идеи Мура что интерпритация интерактивной консоли оператора есть частный случай процесса интерпритации словарной статьи.

как-то так ?

словарь метапрограммиста

anonymous ()
Ответ на: комментарий от qulinxao

программно-задаваемая техномагия

так что пентаграммы — это плоскостная развёртка гиперповерхности римана, проекция на плоскость. проекция это программно задаваемое радио или метапрограмма «намшуба» конкретного заклинания в виде фрактально-рекуррентого хаотического аттрактора.

с ЛАЧХ и диаграммами направленности покамест зело неясно, и с метаобъектным протоколом SDR-радио (роль «намерения» для оператора-техношамана и алгоритмы автоподстройки частоты для повышения чувствительности и пеленга)...

anonymous ()

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

anonymous ()

Синтаксис языка программирования это набор правил, по которым исходный код программы преобразуется из текстовой формы в форму синтаксического дерева. У лиспов обычно синтаксис это скобки (2-3 вида), идентификатор, цитирование, строковые литералы, числовые литералы, иногда квазицитаты, оператор «точка».

Legioner ★★★★★ ()

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

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.