четверг, 16 июня 2011 г.

[prog] Не могу не выдернуть цитату из обсуждения новости об EiffelStudio 6.8 на OpenNet-е

В продолжение небольшой вчерашней заметки. На OpenNet при обсуждении новости о выходе EiffelStudio 6.8 легендарный персонаж под ником iZEN очень феерично высказался (выделение жирным мое):

Eiffel — это прежде всего АКАДЕМИЧЕСКИЙ язык программирования с реализацией концепций ООП в таком виде, в котором они должны быть, но не полностью реализованы в популярных ООП-языках программирования Java, C#, C++. Этот язык является эталонной реализацией практического ООП, невзирая на синтаксис.

iZEN засветился на многих ресурсах, включая RSDN, LOR и OpenNet (на LOR-е он даже поделился своими воспоминаниями о пути в программирование). Лично у меня сложилось впечатление, что он существует в какой-то параллельной реальности, уж настолько сильно и часто его утверждения не соответствовали моим наблюдениям.

Вот и сейчас. Обозвать Eiffel академическим языком, да еще особо подчеркнуть это, можно было либо от очень большой обиды, либо от невежества. Последнее вероятнее. Но в этом случае поражает уверенность, с которой сделано данное утверждение.

Eiffel на меня произвел сильное впечатление тем, как просто, элегантно, последовательно и четко теоретические идеи были воплощены в практический универсальный язык. Это не C++, который можно назвать сборной солянкой всего, что потребовалось Страуструпу и Ко для работы. И не Java, из которой пытались сделать язык “для дебилов” не дающий возможности отстрелить себе ногу, тщательно избавляясь от кажущейся сложности. И не аскетично-минималистичные Modula-2 с Oberon-ами. Это именно практичный язык, который был кропотливо спроектирован сверху вниз отталкиваясь от хороших теоретических оснований.

Но это мои слова и мои впечатления. Они не могут служить доказательствами. Доказательствами могут быть компании-клиенты EiffelSoftware. Например, Boeing Co. и Lockheed-Martin Co. Но еще более ярким доказательством служит сама EiffelSoftware. Они ведь живут за счет продаж EiffelStudio (написанной на самом Eiffel-е) и связанных с ним сервисов. Много ли найдется “прежде всего академических” языков, живущих на основе самоокупаемости?

PS. В дополнение довольно старый список проектов, в которых применялся Eiffel.

7 комментариев:

Александр Кондуфоров комментирует...

Насчет Java неправильно говорите. Что же такое в Java сделали, чтобы никто не мог отстрелить себе ногу? Управление памятью? Так это разве зло? Это инструмент, который позволяет сэкономить время на разработке и исправлении ошибок. Продуктивность программиста на Java/.NET выше продуктивности разработчика на C++. Я уже не говорю, что код чище и легче поддается модификации. Да, за это мы платим меньшей производительностью, большим кушанием памяти, невозможностью (или очень большой сложностью) в решении целого пласта системных и около-системных задач, ну у любого инструмента есть свои плюсы и минусы.

И вообще, Java создавался для кроссплатформенности, и именно отсюда у нее растут ноги почти всех отличий от того же С++. Начиная от виртуальной машины и управления памятью, и заканчивая каличными средствами разработки десктоп-приложений. К слову, тут разработчики .NET хотя бы под винду сделали нормальную разработку. Да и производительность у .NET получше. Но зато он не кроссплатформенный :)

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

@Александр Кондуфоров:

>Насчет Java неправильно говорите.

Я говорю про ту Java 1.0, которую активно пиарили и продвигали в конце 1994-го и в 1995-м. Мол, мы взяли C++, выбросили оттуда все опасные вещи и получили намного более безопасный язык.

А когда Java 1.0 (да и 1.1) попала мне в руки, программировать на ней после C++ было совсем мрачно.

Ладно убрали include и систему заголовочных файлов (хотя практически сразу же встала проблема подключения к проекту автоматически сгенерированных фрагментов). Ладно убрали #define (хотя практически сразу выяснилось, что макросы в C/C++ используются не только для констант, но и для сокращения дублирования кода).

Но когда выяснилось, что убрали множественное наследование и шаблоны... Вот это было жестко. И ладно с множественным наследованием. Но без шаблонов даже в 1995-м программировать было уже неудобно.

А еще в Java не было адресной арифметики. И указателей на методы/функции. А еще там int и Integer -- это были разные вещи.

Так что Java 1.5, которая появилась в 2004 году дала разработчикам многие из тех возможностей, которые были в C++ еще в 1994-м.

Александр Кондуфоров комментирует...

Теперь мне понятно, что вы имели в виду. Да, без generic'ов действительно сложно. К слову, они и в .NET появились только во второй версии. А вот множественное наследование мне так и не понадобилось ни разу.

Кстати, что вы думаете насчет .NET/C#?

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

>А вот множественное наследование мне так и не понадобилось ни разу.

Наследование вообще штука сложная, не говоря о множественном.
Есть хорошее правило - надо делать A extends B только в том случае, если вы с полной уверенностью можете сказать что A есть B. В противном случае следует предпочесть композицию наследованию. Например неправильно, например, писать Машина ехtends Кузов, Двери, Колеса.
Этот момент, в какой-то мере оправдывает ненужность множественного наследования.

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

@Александр Кондуфоров:

>Кстати, что вы думаете насчет .NET/C#?

Это вещи достаточно многогранные. Вас интересует мое мнение по технической или идеологической сторонам?

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

@xonix:

>Есть хорошее правило - надо делать A extends B только в том случае, если вы с полной уверенностью можете сказать что A есть B. В противном случае следует предпочесть композицию наследованию.

Как раз язык Eiffel интересен еще и тем, какую роль в нем играют классы. Класс в Eiffel (а других сущностей там вообще нет) -- это не только сущность, отражающая какую-то вещь из предметной области. Но еще и модуль, своего рода маленькое пространство имен.

Поэтому, если рассматривать классы с этой точки зрения, то наследование выступает как бы объединением модулей (пространств имен). Соответственно, и множественное наследование имеет в Eiffel более широкий смысл, чем в других языках (вроде Java и C#).

В этом плане тот же C++ находится между Eiffel и Java. Даже ближе к Java, чем к Eiffel.

Александр Кондуфоров комментирует...

@Евгений Охотников

Даже не знаю. Наверно, глупый вопрос задал. Это не формат комментариев в блоге :)

@xonix

Да, конечно. Думаю, пример здесь должен быть другим: класс Самолет-амфибия можно унаследовать от классов Самолет и Лодка. Другой вопрос, что все это решаемо на уровне интерфейсов. Вот с их помощью и реализовывается множественное наследование в .NET и Java. И этого вполне достаточно.