Чего не хватает... А что лишнего?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 08.12.05 16:49
Оценка: 3 (1)
Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего?

Когда Д. Кнут разрабатывал систему 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, ...). Вот собственно и все.

Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Re: Чего не хватает... А что лишнего?
От: aik Австралия  
Дата: 08.12.05 16:57
Оценка: -1
Здравствуйте, Mystic, Вы писали:

M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования?


Никак не жизнеспособная. Даже для одного популярного довольно жестко стандартизированного языка есть куча несовместимых компиляторов. Run-time плагины рулят.
Re: Чего не хватает... А что лишнего?
От: dshe  
Дата: 08.12.05 17:06
Оценка: +1
Здравствуйте, Mystic, Вы писали:

M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?


Ты об Intentional Programming?
К тому в общем-то оно и идет. Хотя и ооочень медленно.
--
Дмитро
Re: Чего не хватает... А что лишнего?
От: jedi Мухосранск  
Дата: 08.12.05 17:13
Оценка:
Здравствуйте, Mystic, Вы писали:

M>
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 парсит и преобразует в вызовы
соответстсвующей либы. Было такое в интербейзе для С (может и в других бд/языках — не интересовался).
Re[2]: Чего не хватает... А что лишнего?
От: jedi Мухосранск  
Дата: 08.12.05 17:22
Оценка:
Здравствуйте, jedi, Вы писали:

J>Здравствуйте, Mystic, Вы писали:


Сорри:

function GroupSize(GroupId: Integer): Integer;
sql
  BEGIN_SQL
    SELECT COUNT(*) FROM STUDENTS WHERE GROUP_ID = GroupId TO :Result
  END_SQL 
end;
Re: Чего не хватает... А что лишнего?
От: Quintanar Россия  
Дата: 08.12.05 17:33
Оценка:
Здравствуйте, Mystic, Вы писали:

>Реализовать это можно было бы как некую надстройку, позволяющую добавлять свой язык для блоков кода (asm..end, sql..end, math..end, ...). Вот собственно и все.


M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?


Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.
Опять же, специальные средства OCaml также позволяют достичь этой цели.

Идеальный язык для таких целей — расширенное лямбда исчисление. Оно довольно просто (есть всего несколько сущностей) и вместе с тем черезвычайно эффективно. Собственно, Haskell транслирует сначала свой достаточно сложный синтаксис в промежуточную форму примерно такого вида. Я надеюсь, когда — нибудь будет создана .Functional по аналогии с .NET.

Что касается адаптации языка к проекту, то это тоже к Лисп. Он для этого идеален.
Re: Чего не хватает... А что лишнего?
От: reductor  
Дата: 08.12.05 17:41
Оценка: +2
Здравствуйте, Mystic, Вы писали:


M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?



Этому "плагиновому" языку скоро исполнится 50 лет.
Называется Лисп.
Re[2]: Чего не хватает... А что лишнего?
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.12.05 04:25
Оценка:
Здравствуйте, jedi, Вы писали:
J>Реализуется посредством препроцессора который код между BEGIN_SQL/END_SQL парсит и преобразует в вызовы
J>соответстсвующей либы. Было такое в интербейзе для С (может и в других бд/языках — не интересовался).
Вообще вроде как это является соответствующей частью стандарта SQL. Я не помню точную аббревиатуру. Но возможность встраивать SQL прямо в текст программы была рассмотрена уже очень давно. На практике эта техника так и не прижилась — я точно не знаю, почему. То ли потому, что не позволяет строить динамические запросы, то ли еще что-то мешает.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Чего не хватает... А что лишнего?
От: Mamut Швеция http://dmitriid.com
Дата: 09.12.05 07:11
Оценка:
Q>Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.

Пример для CLSQL:
(with-transaction
        ()
    (insert-records :into [header]
                    :attributes '([id] [customer])
                    :values '(2 "Mary Smith"))
    (insert-records :into [detail]
                    :attributes '([id] [item] [quantity])
                    :values '(2 "BMW" 3)))
                    
(select [customer] [item] [quantity] :from '([header] [detail])
        :where [= [header id] [detail id]])


Ну или вот этот туториал
... << RSDN@Home 1.2.0 alpha rev. 619>>


dmitriid.comGitHubLinkedIn
Re: Чего не хватает... А что лишнего?
От: _Winnie Россия C++.freerun
Дата: 09.12.05 07:36
Оценка: +1
Здравствуйте, Mystic, Вы писали:

M>Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего?


RAII в С++ совершенно лишний. Потому что каждая компания пишет свой Reflection и RAII.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Чего не хватает... А что лишнего?
От: _Winnie Россия C++.freerun
Дата: 09.12.05 07:37
Оценка:
Здравствуйте, Mystic, Вы писали:

Что касается sql { }, то хороший препроцессор решает.
Либо пишется свой за пару деньков, либо берётся готовый M4.

Либо классически выносим код таких запросов в файл.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Чего не хватает... А что лишнего?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 09.12.05 08:28
Оценка:
Здравствуйте, reductor, Вы писали:

R>Этому "плагиновому" языку скоро исполнится 50 лет.

R>Называется Лисп.

Представления о LISP-е у меня как раз 50-ти летней давности. Программа состоит из списков, первый элемент списка есть название функции, вторые ее аргументы, ... Как, например, встроить в LISP тот же язык SQL я не вижу
Re[3]: Чего не хватает... А что лишнего?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 09.12.05 08:30
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, reductor, Вы писали:


R>>Этому "плагиновому" языку скоро исполнится 50 лет.

R>>Называется Лисп.

M>Представления о LISP-е у меня как раз 50-ти летней давности. Программа состоит из списков, первый элемент списка есть название функции, вторые ее аргументы, ... Как, например, встроить в LISP тот же язык SQL я не вижу


Не в том порядке прочитал...
Re[2]: Чего не хватает... А что лишнего?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.12.05 08:32
Оценка:
Здравствуйте, _Winnie, Вы писали:

M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего?


_W>RAII в С++ совершенно лишний.




И как же в C++ без RAII? А что взамен?
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Чего не хватает... А что лишнего?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 09.12.05 08:33
Оценка:
Здравствуйте, jedi, Вы писали:

J>В общем-то проблема рещена миллион лет назад в ембеддед sql.

J>Выглядеть буджет где-то так (100% не уверен, давно таким не занимался):

Речь идет совсем не о встраивании SQL-кода в код программы. Речь идет о том, чтобы предоставлять пользователю расширять язык программирования под конкретные задачи. Хотя бы, допустим, язык для реализации таких препроцессоров.
Re[3]: Чего не хватает... А что лишнего?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 09.12.05 08:44
Оценка: 1 (1) +1
Здравствуйте, Mamut, Вы писали:

Q>>Все было изобретено вместе с Лисп. То, что ты хочешь, это сложные макросы, которые есть в Лиспе. Я не хочу сказать, что они используются именно так, как ты сказал, но реализовать с их помощью такую схему довольно просто.


M>Пример для CLSQL:

M>
M>(with-transaction
M>        ()
M>    (insert-records :into [header]
M>                    :attributes '([id] [customer])
M>                    :values '(2 "Mary Smith"))
M>    (insert-records :into [detail]
M>                    :attributes '([id] [item] [quantity])
M>                    :values '(2 "BMW" 3)))
                
M>(select [customer] [item] [quantity] :from '([header] [detail])
M>        :where [= [header id] [detail id]])
M>


Тут возникает небольшой ньюанс. Используя Common SQL мы так и не уходим от синтаксиса LIST, который, как мне кажется, уступает стандартному синтаксису SQL. Например, необходимость квотирования нужных фрагментов, запись арифметических выражений и т. д. Скажем последний select как для меня гораздо более вразумительнее выглядит в виде:

select customer, item, quantity from header, detail where header_id = detail_id


Вопрос не в том, можно или нельзя это реализовать средствами языка. Вопрос в том, чтобы это можно было реализовать в наиболее элегантной форме. Если взять тот же синтаксис MATLAB, то любому выражению мз него можно записать аналог на C++. Но читабельность (восприятие) этого аналога будет сложнее. Например, двоеточие мы вынуждены будем заменить на некоторую константу, для оперций .* и .+ у нас не найдется операторов, ... Записывая это в LISP-е мы уйдем от привычной записи, когда одну формулу можно охватить одним взглядом без разбора нагромождения из скобочек, ...
Re[2]: Чего не хватает... А что лишнего?
От: aik Австралия  
Дата: 09.12.05 08:44
Оценка:
Здравствуйте, _Winnie, Вы писали:

M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему никто не спросит: что лишнего?

_W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой Reflection и RAII.

А что такое "RAII"?
Re[3]: Чего не хватает... А что лишнего?
От: Cyberax Марс  
Дата: 09.12.05 09:24
Оценка: 1 (1)
aik wrote:

> M>>Вот читаешь ветки: чего не хватает, чего не хватает... А почему

> никто не спросит: что лишнего?
> _W>RAII в С++ совершенно лишний. Потому что каждая компания пишет свой
> Reflection и RAII.
> А что такое "RAII"?

Resource Acquisition Is Initialization — захват ресурсов производится в
конструкторе, а их освобождение в деструкторе. Благодаря
детерминированности C++ у нас получается удобное средство управления
дефецитными ресурсами (сетевыми соединениями, курсорами в БД и т.п.).

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re: Чего не хватает... А что лишнего?
От: beroal Украина  
Дата: 09.12.05 09:45
Оценка:
Здравствуйте, Mystic, Вы писали:
M>Собственно говоря, насколько жизнеспособна идея создания некоторого плагинового языка программирования? Т. е. написал плагин --- получил некое расширение языка... Что по вашему мнению, является "лишним" в любимых Вами языках программирования, что бы можно было заменить такими плагинами? Какими свойствами должен обладать "минимальный" язык? Насколько вы допускаете для себя идею начинать каждый конкретный с адаптации конкретного языка программирования под нужды проекта? Пугает ли вас то, что в крупном проекте может использоваться несколько адаптаций (каждся для своей части)?
Я слышал про похожий язык программирования — TCL (ещё известно сочетание TCL/TK — вместе с GUI библиотекой). В TCL даже для математических формул отдельный синтаксис, не встроенный в язык. Нет встроенных массивов. Но больше ничего сказать не могу, близко не знаком. На мой взгляд, ничего интересного у них не получилось.
Re[4]: Чего не хватает... А что лишнего?
От: Mamut Швеция http://dmitriid.com
Дата: 09.12.05 09:49
Оценка:
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))


и так далее..

С другой стороны, а нужна ли нам такая выразительность? Когда не понятно — что код, а что — ждополнительные конструкции языка
... << RSDN@Home 1.2.0 alpha rev. 619>>


dmitriid.comGitHubLinkedIn
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.