Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего?
Когда Д. Кнут разрабатывал систему TeX, то впоследствии честно признавался, что ставил своей целью написать программу, которая бы удовлетворила бы 95% процентов пользователей. Как он предполагал, остальные 5% пользователей просто внесут извенения в исходный текст TeX так, чтобы он поддерживал необходимые возможности (например, сочетание английского (слева направо) и арабского (справа налево) языков, ...)
Случилось однако так, что в саму систему TeX никто изменений вносить не стал, и Леймпорт при разработке LaTeX использовал только средства самого TeX.
Я иногда мечтаю о некоторой подобной схеме... Если у меня математическое приложение, то даже с учетом перегрузки операций библиотека для работы с матрицами будет, как мне кажется, уступать специализированым возможностям MATLAB. Получается что перегрузка операций лучше чем ничего, но занимает как бы промежуточную нишу. В ряде приложений она не нужна, в ряде приложений лучше MATLAB и где-то посередке располагается библиотека для работы с матрицами с использованием перегруженых операций. Или другой пример. При разработке приложений, работающих с БД, часто не хватает возможности элегантно встроить SQL-операторы в используемый язык программирования. Скажем синтаксис
function GroupSize(GroupId: Integer): Integer;
sql
SELECT COUNT(*) FROM STUDENTS WHERE GROUP_ID = GroupId
end;
был бы намного полезнее, чем возможность ассемблерных вставок. И т. д. и т. п.
Реализовать это можно было бы как некую надстройку, позволяющую добавлять свой язык для блоков кода (asm..end, sql..end, math..end, ...). Вот собственно и все.
Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Здравствуйте, Mystic, Вы писали:
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования?
Никак не жизнеспособная. Даже для одного популярного довольно жестко стандартизированного языка есть куча несовместимых компиляторов. Run-time плагины рулят.
Здравствуйте, Mystic, Вы писали:
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Ты об Intentional Programming?
К тому в общем-то оно и идет. Хотя и ооочень медленно.
function GroupSize(GroupId: Integer): Integer;
M>sql
M> SELECT COUNT(*) FROM STUDENTS WHERE GROUP_ID = GroupId
M>end;
В общем-то проблема рещена миллион лет назад в ембеддед sql.
Выглядеть буджет где-то так (100% не уверен, давно таким не занимался):
function GroupSize(GroupId: Integer): Integer;
sql
BEGIN_SQL
SELECT COUNT(*) FROM STUDENTS WHERE GROUP_ID = GroupId TO :GroupId
END_SQL
end;
Реализуется посредством препроцессора который код между BEGIN_SQL/END_SQL парсит и преобразует в вызовы
соответстсвующей либы. Было такое в интербейзе для С (может и в других бд/языках — не интересовался).
Здравствуйте, Mystic, Вы писали:
>Реализовать это можно было бы как некую надстройку, позволяющую добавлять свой язык для блоков кода (asm..end, sql..end, math..end, ...). Вот собственно и все.
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.
Опять же, специальные средства OCaml также позволяют достичь этой цели.
Идеальный язык для таких целей — расширенное лямбда исчисление. Оно довольно просто (есть всего несколько сущностей) и вместе с тем черезвычайно эффективно. Собственно, Haskell транслирует сначала свой достаточно сложный синтаксис в промежуточную форму примерно такого вида. Я надеюсь, когда — нибудь будет создана .Functional по аналогии с .NET.
Что касается адаптации языка к проекту, то это тоже к Лисп. Он для этого идеален.
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Этому "плагиновому" языку скоро исполнится 50 лет.
Называется Лисп.
Здравствуйте, jedi, Вы писали: J>Реализуется посредством препроцессора который код между BEGIN_SQL/END_SQL парсит и преобразует в вызовы J>соответстсвующей либы. Было такое в интербейзе для С (может и в других бд/языках — не интересовался).
Вообще вроде как это является соответствующей частью стандарта SQL. Я не помню точную аббревиатуру. Но возможность встраивать SQL прямо в текст программы была рассмотрена уже очень давно. На практике эта техника так и не прижилась — я точно не знаю, почему. То ли потому, что не позволяет строить динамические запросы, то ли еще что-то мешает.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Q>Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.
Здравствуйте, reductor, Вы писали:
R>Этому "плагиновому" языку скоро исполнится 50 лет. R>Называется Лисп.
Представления о LISP-е у меня как раз 50-ти летней давности. Программа состоит из списков, первый элемент списка есть название функции, вторые ее аргументы, ... Как, например, встроить в LISP тот же язык SQL я не вижу
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, reductor, Вы писали:
R>>Этому "плагиновому" языку скоро исполнится 50 лет. R>>Называется Лисп.
M>Представления о LISP-е у меня как раз 50-ти летней давности. Программа состоит из списков, первый элемент списка есть название функции, вторые ее аргументы, ... Как, например, встроить в LISP тот же язык SQL я не вижу
Здравствуйте, _Winnie, Вы писали:
M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего?
_W>RAII в С++ совершенно лишний.
И как же в C++ без RAII? А что взамен?
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, jedi, Вы писали:
J>В общем-то проблема рещена миллион лет назад в ембеддед sql. J>Выглядеть буджет где-то так (100% не уверен, давно таким не занимался):
Речь идет совсем не о встраивании SQL-кода в код программы. Речь идет о том, чтобы предоставлять пользователю расширять язык программирования под конкретные задачи. Хотя бы, допустим, язык для реализации таких препроцессоров.
Здравствуйте, Mamut, Вы писали:
Q>>Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.
M>Пример для CLSQL: M>
Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL. Например, необходимость квотирования нужных фрагментов, запись арифметических выражений и т. д. Скажем последний select как для меня гораздо более вразумительнее выглядит в виде:
select customer, item, quantity from header, detail where header_id = detail_id
Вопрос не в том, можно или нельзя это реализовать средствами языка. Вопрос в том, чтобы это можно было реализовать в наиболее элегантной форме. Если взять тот же синтаксис MATLAB, то любому выражению мз него можно записать аналог на C++. Но читабельность (восприятие) этого аналога будет сложнее. Например, двоеточие мы вынуждены будем заменить на некоторую константу, для оперций .* и .+ у нас не найдется операторов, ... Записывая это в LISP-е мы уйдем от привычной записи, когда одну формулу можно охватить одним взглядом без разбора нагромождения из скобочек, ...
Здравствуйте, _Winnie, Вы писали:
M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего? _W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой Reflection и RAII.
aik wrote:
> M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему > никто не спросит: что лишнего? > _W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой > Reflection и RAII. > А что такое "RAII"?
Resource Acquisition Is Initialization — захват ресурсов производится в
конструкторе, а их освобождение в деструкторе. Благодаря
детерминированности C++ у нас получается удобное средство управления
дефецитными ресурсами (сетевыми соединениями, курсорами в БД и т.п.).
Здравствуйте, Mystic, Вы писали: M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Я слышал про похожий язык программирования — TCL (ещё известно сочетание TCL/TK — вместе с GUI библиотекой). В TCL даже для математических формул отдельный синтаксис, не встроенный в язык. Нет встроенных массивов. Но больше ничего сказать не могу, близко не знаком. На мой взгляд, ничего интересного у них не получилось.
M>Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL. Например, необходимость квотирования нужных фрагментов, запись арифметических выражений и т. д. Скажем последний select как для меня гораздо более вразумительнее выглядит в виде:
M>
select customer, item, quantity from header, detail where header_id = detail_id
Тогда можно запутаться в том, что есть язык, а что является настройкой к нему. Тот же CLSQL, возможно, можно было сделать в стиле LOOP
(loop with a = 1
with b = (+ a 2)
with c = (+ b 3)
return (list a b c))
(loop while (hungry-p) do (eat))
(loop until (not (hungry-p)) do (eat))
(loop for i fixnum from 3
when (oddp i) collect i
while (< i 5))
(loop for i from 1 to 10
thereis (> i 11)
finally (print i))
и так далее..
С другой стороны, а нужна ли нам такая выразительность? Когда не понятно — что код, а что — ждополнительные конструкции языка