воскресенье, 13 мая 2007 г.

Nemerle и Boo против c# 3.0

Nemerle и Boo против c# 3.0


Оба языка нацеленны на уменьшение кода. Некоторые их фичи теперь присутствуют в C3 3.0 (выведение типа и встроенный SQL), но убийственная фича в обоих это их поддержка макросов. Их возможности намного шире чем возможности C препроцессора, и очень близки к возможностям LISP. Paul Graham обясняет почему это важно в Succinctness is Power:

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

Сила языка программирования заключается в том, насколько меньшим он делает размер ваших программ.



Мне нравится C#, я считаю, что у него не меньше и не больше перспектив чем у Java. Они уменьшают размер необходимого кода за счет использования хорошо написанных библиотек.
Но для описания простых вещей количество строк кода которые они требуют написать ошеломлят. Steve Yegge написал прекрасное эссе на эту тему, где он описывает эквивалент Java кода для следующего Perl сниппета:

my @squares = map { $_ * $_ } (1..5);
print "@squares\n";

Код получился около 20 строк кода . C# версия вернее всего не шибко будет от него отличается. потому что также не решает главную проблему:

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

Итак это возвращает нас к Boo и Nemerle. Оба дают нав возможность использовать гигантские возможности .NET framework, позволяют нам взаимодействовать с C#/VB/C++ классами , плюс некоторые 3.0 фичи, но самое важное вы получаете макросы.

В Boo, вы имеете 2 пути для того чтобы заставить компилятор писать код за вас, Syntactic Attributes и Syntactic Macros (описание в Boo Манифест [pdf]). Синтаксический Аттрибут позволяет вам писать это:

class Person:
[getter(FirstName)]
_fname as string

Вместо

class Person:
_fname as string
FirstName as string:
get:
return _fname

Это уменьшает в 2 раза количество строк, но что более важно уменьшает избыточность (и возможность ошибки). Но Boo поддерживает макросы, и я могу сделать такоеже самI . Тогда я мог бы сделать простое свойство указывая только тип и имя свойства:

[getter] _firstName as string

Вы можете писать свои собственные Syntactic Attributes реализуя IAstAttribute. Ваш класс будет вызван во время компиляции и сгенерирует код за вас.

Boo's Syntactic Macros позволяет вам добавлять новые конструкции в язык. Boo не имеет using, но вы можете добавить их используя класс названный UsingMacro который реализует Boo.Lang.Compiler.IAstMacro. Ваша реализация будет вызвана во время компиляции и сгенерирует код.

Nemerle's Macros использует конструкции языка вместо интерфейсоф. Для определения while loop в стиле С, используйте

macro while_macro (cond, body)
syntax ("while", "(", cond, ")", body) {
<[ def loop () { when ($cond) { $body; loop () } } loop () ]>
}

Nemerle имеет макросы для design by contract, embedded SQL, и многозадачности. Кстати, пока искал хорошую ссылку на многозадачность, Я нашел это –новый язык от Microsoft Research называетмый Cω (произносится Comega), с похожими идеями.

C# 3.0 [doc] уже добавляет некоторые возможности этих языков (type inference, lambda expressions, и LINQ), но макросы дают нам возможность создавать свои фичи, типа PAR и SEQ.


Кстати как с этим дела у Groovy обстоят? Кто знает?


1 комментарий:

mholub комментирует...

никак, там есть метапрограммирование и средства для создания DSL, но язык не изменишь.

Linux.org.ru News

Вебпланета - все новости

CNews - Издание о высоких технологиях