Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

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

К сожалению, народ в массе думает о языках очень ограниченно. Скажем, Java сразу подразумевает под собой Garbage Collection, Byte code, Interpreting VM, JDK, JRE, IntelliJ IDEA, Servlets. Я буду говорить о C# и Nemerle как о чистых языках программирования, без привязки к DotNet. Как описано в спецификации ECMA-334 на С#

C++ в его современном виде - очень сложный язык. С# и Java - более просты. Одной из целей создания Джавы было упрощение С++. Целью создания C# было компрометирование Джавы и устранение ее с рынка. Соответственно С# получился более богатым и мощным чем Java, но и более сложным в освоении.

Дальнейшее упрощение Java породило Netscape Javascript, который породил Microsoft JScript, и эти двое породили стандартный ECMA-262 ECMAScript. <script type="text/javascript"> - это этот самый ECMA-скрипт и есть. По-крайней мере, Мозилловцы ориентируются на стандарт ECMAScript.

Javascript хотели сделать простеньким языком для тривиальных нужд. Более того, как и Java и C#, большинство людей не рассматривают язык Javascript отдельно от платформы Javascript. Это приводит к недооценке JavaScript, а на самом деле обычный "браузерный" Javascript как язык мощнее современного С++.

Есть несколько Javascript-платформ:
- веб-браузер. Это самая известная платформа
- Mozilla XRE - движок на котором написан Mozilla. Состоит из XUL GUI, DLL-компонент XPCOM (аналог Microsoft COM/Automation), низкоуровневой кросс-платформенной С-библиотеки, и собственно Javascript связывающего XUL и XPCOM.
- Windows Scripting - коммандлайновые интерпретаторы cscript.exe и wscript.exe для администрирования Windows
- Microsoft IIS ASP
- Microsoft Html Applications (HTA)
- Flash ActionScript

Как видите, до сих пор почти никто не нашел Javascript достойного применения. Все платформы не подразумевают написания действительно архитектурно сложных систем, и даже в рамках старых Microsoft ASP многие считают что VBScript мощнее JScript, приводя в пример скажем убогие примеры на Javascript для прохода по коллекциям вместо встроенного в VBScript специального цикла.

Также многих пугают "кривые" объекты в Javascript. Но они не кривые. Просто в школе не учат использовать closures и anonymous functions, которые есть скажем в Javascript и Perl, но нет в VBScript и PHP. Многих также пугает "скриптовость", "нетипизированность", "интерпретируемость" языка, требование таскать за собой интерпретатор с рантаймом и так далее. Но я могу показать, что можно написать такую реализацию Javascript, которая будет лишена всех этих недостатков.

Microsoft JScript.NET достаточно близко подошел к решению проблемы, но его подвела привязка к ущербному Microsoft.NET.  Ошибка Microsoft была в желании реализовать CLI в виде того монолитного CLR который мы видим, и оставить ту же старую модель распространения приложений вместе с гигантским рантаймом, которую мы видим везде на других платформах включая С++. Я покажу, что есть альтернативная возможность реализовать СLI, сохранив совместимость, но сделав .NET-приложения столь же маленькими и self-contained, как и традиционные Си-приложения.

Собственно JScript.NET был бы лучшим из существующих действительно высокоуровневых языков, если бы не его привязанность к Дотнет и наличие проекта Nemerle. Язык Nemerle еще более удачен чем JScript.NET - он добавляет к возможностям JScript возможности незаслуженно забытого чисто функционального языка Haskell. В свое время меня поразил Glasgow Haskell Compiler c бэкендом от gcc - я не верил в возможность писать на крайне абстрактном функциональном языке со сборкой мусора exe-шники, по размеру и скорости не уступающие сишным или паскалевским.

Оказывается, ключ был использовании type inference для замены динамической типизации на статическую с сохранением возможности не указывать типы явно. Это отличает Haskell скажем от LISP и JScript.NET от Javascript/ECMAScript и дает возможность генерировать по "скриптовому" исходнику действительно хороший ассемблерный код, будь то MSIL или машинный код аппаратного процессора.

Сейчас этот незамеченный прорыв приобретает большую актуальность. Всеобщий бум объектной ориентированности и сложившийся стереотип С++ как самого практически пригодного из мощных ОО-языков привели к тому, что С++-программисты нашли такие применения для type inference, которые Страуструпу в былые времена и не снились. Возникла новая отрасль - шаблонное метапрограммирование (template metaprogramming), которая постепенно рождает на свет новую парадигму для замены ООП - обобщенное программирование (generic programming).

К непрактичным, но мощным ОО-языкам я отношу например Smalltalk и CLOS (ОО-расширение функционального LISP). Насколько известно, массово на них приложения не пишут.

Возвращаясь к С++... Использовать type inference и применять принципы generic programming в полном объеме на С++ на практике крайне сложно. Нужно везде писать безумное количество лишнего кода, объявляя шаблоны. Поэтому на С++ на каждом углу жертвуют обобщенностью кода в пользу читабельности и легкости внесения изменений в код.

Сравните сишное

template <typename A, typename B, typename C> A fun(B foo, C bar)
{
    return foo.a + bar.b;   
}


c тем же текстом на Javascript, где шаблонность подразумевается по умолчанию

function fun(foo, bar)
{
   return foo.a + bar.b;
}


и вы поймете, что возможность писать меньше была бы великим подарком для сишников если бы при этом сохранялись такие преимущества C++ как безопасность типов, скорость, размер и возможность скомпилировать исходник в крайне трудно декомпилируемый машинный код. Загляните в исходники Boost.Lambda и Boost.MPL, и подумайте, насколько бы они стали проще, если бы для обобщения кода надо было  стереть старые декларации типов вместо дописывания новых декларций шаблонов.

К счастью, это возможно. Более того, можно вдобавок привнести возможности функциональной абстракции сохранив общую императивность языка и не добавив заодно недостатков функционального подхода свойственных Haskell. Получится мегаязык условным названием "Nemerle.NET on steroids".

Ждите.
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 34 comments