[skip, ибо...]
ГВ>> Да, кстати, я не спорю с тем, что полезно знать нескольких языков. Я просто считаю приведённую выше формулировку слишком поверхностной. VD>Это твои проблемы. Я и не брался давать формулировку для энциклопедии. Я выражаю свое мнение. Оно просто [...]
Тогда я прекращаю дискуссию.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
E>>Влад, извини, что увожу тему в сторону, но почему ты считаешь Java динамическим языком?
VD>Вообще-то его таковым считали авторы еще при создании.
Понятно, значит классификацию Java как динамического языка нужно оставить на совести его создателей
VD>А вообще, что тут считать то? Язык позволяет делать динамически все от загрузки объектов, до компиляции.
In computer science, a dynamic programming language is a kind of programming language in which programs can change their structure as they run: functions may be introduced or removed, new classes of objects may be created, new modules may appear.
Можно ли в Java вводить новые методы в уже существующие классы? AFAIK, нет.
Можно ли в Java изымать существующие методы из уже существующих классов? Опять же, AFAIK, нет.
Подгружать новые модули с новыми классами и объектами? Да ты же сам мне недавно доказывал, что через COM на C++ это уже давно можно было делать.
Компилировать новые модули и подгружать их в уже работающую программу? Да на C++ -- нет проблем: запускаем внешний компилятор, строим DLL и полный вперед. А если компилятор оформлен в виде DLL или COM-объекта, то прямо из приложения можно это делать.
Единственное проявление динамизма Java, которое приходит мне в голову -- это возможность вызова либого метода объекта через reflection с передачей аргументов в виде object[]. Только, имхо, маловато этого, чтобы динамическим языком называться. Поэтому, как мне кажется, динамизм некоторых языков сильно преувеличивается.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
E>Единственное проявление динамизма Java, которое приходит мне в голову -- это возможность вызова либого метода объекта через reflection с передачей аргументов в виде object[]. Только, имхо, маловато этого, чтобы динамическим языком называться. Поэтому, как мне кажется, динамизм некоторых языков сильно преувеличивается.
Сделать на C++ библиотеку, которая будет реализовывать нечто подобное довольно просто. Опять же, при грамотном использовании шаблонов, C++ может дать гораздо более разнообразную динамичность, чем другие языки.
Здравствуйте, sch, Вы писали:
E>>Единственное проявление динамизма Java, которое приходит мне в голову -- это возможность вызова либого метода объекта через reflection с передачей аргументов в виде object[]. Только, имхо, маловато этого, чтобы динамическим языком называться. Поэтому, как мне кажется, динамизм некоторых языков сильно преувеличивается.
sch>Сделать на C++ библиотеку, которая будет реализовывать нечто подобное довольно просто.
Ануткать
Принципиальная разница будет в том, что в Java можно в run-time собрать необходимое количество аргументов в object[] и вызвать любой метод по его имени. В С++ подобный вызов можно будет сделать только для тех, методов, к которым шаблонные обертки были приделаны.
sch> Опять же, при грамотном использовании шаблонов, C++ может дать гораздо более разнообразную динамичность, чем другие языки.
Ключевые слова: "грамотном использовании" и "может дать". Слишком сильные "если" А в уже готовых динамических языках динамичность можно использовать прямо здесь и прямо сейчас. Пример, как водится, из Ruby:
# Обертка вокруг теста для того, чтобы не вылетать по исключению.
def execute_test_case( message )
begin
puts "-- #{message} --"
yield
rescue Exception => x
puts "!!! caught: #{x} !!!"
end
end
# Исходный класс и его методы.
class Test
def hello; puts "hello"; end
def bye; puts "bye"; end
end
# Тестируемый объект. Важно отметить, что все последующие модификации
# класса Test будут отражаться на уже существующем объекте.
t = Test.new
execute_test_case "Original Test class" do t.hello; t.bye end
# Теперь метод bye нам не нужен.
class Test
remove_method :bye
end
execute_test_case "Test class without bye method" do t.hello; t.bye end
# Теперь заменяем метод hello и возвращаем метод bye
class Test
def hello; puts "Hello, world"; end
def bye; puts "Bye, world"; end
end
execute_test_case "Modified Test class" do t.hello; t.bye end
Получаем:
-- Original Test class --
hello
bye
-- Test class without bye method --
hello
!!! caught: undefined method `bye' for #<Test:0x2777040> !!!
-- Modified Test class --
Hello, world
Bye, world
И все это "из коробки" для любого метода и любого класса. Другой вопрос насколько это надо и когда это стоит использовать. Но делать вручную то же самое на C++ и тяжело и вряд ли необходимо.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>И все это "из коробки" для любого метода и любого класса. Другой вопрос насколько это надо и когда это стоит использовать. Но делать вручную то же самое на C++ и тяжело и вряд ли необходимо.
Согласен с тобой по всем пунктам.
Тут просто действует общее правило, которое заключается в том, что на C++ можно делать *все*, только напильником поработать надо
Здравствуйте, sch, Вы писали:
sch>Тут просто действует общее правило, которое заключается в том, что на C++ можно делать *все*, только напильником поработать надо
На ассемблере можно сделать еще больше. Вот толку от того — 0.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Можно ли в Java вводить новые методы в уже существующие классы?
Да. На том построена туча фрэймворков.
E>Можно ли в Java изымать существующие методы из уже существующих классов?
Опять же да. Если бы это было невозможно, то разных Spring-ов просто не существовало бы.
E>Подгружать новые модули с новыми классами и объектами?
Тоже да.
E> Да ты же сам мне недавно доказывал, что через COM на C++ это уже давно можно было делать.
Ком является отдельной и не маленькой технологией.
E>Компилировать новые модули и подгружать их в уже работающую программу? Да на C++ -- нет проблем: запускаем внешний компилятор, строим DLL и полный вперед. А если компилятор оформлен в виде DLL или COM-объекта, то прямо из приложения можно это делать.
Ага. Вот только ни одного так и не оформелно в виде ДЛЛ. А теоритически можно. Вот только работать такие приложения будут ну очень медленно. Ведь компиляция С++ — жто процесс порой очень долгий.
Далее на сцену выходят все те же проблемы отсуствия динамичести. Подключение модулей осложнено. Динамическая загрузка осложнена. Про безопасность и надежность можно просто забыть.
E>Единственное проявление динамизма Java, которое приходит мне в голову -- это возможность вызова либого метода объекта через reflection с передачей аргументов в виде object[]. Только, имхо, маловато этого, чтобы динамическим языком называться. Поэтому, как мне кажется, динамизм некоторых языков сильно преувеличивается.
Ты судишь о том, что знаешь очень поверхносно. Я яву тоже знаю не очень глубого, но и моих знаний досточно чтобы заметить что твои суждения явно не верны.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
E>>Можно ли в Java вводить новые методы в уже существующие классы?
VD>Да. На том построена туча фрэймворков.
Каких?
E>>Можно ли в Java изымать существующие методы из уже существующих классов?
VD>Опять же да. Если бы это было невозможно, то разных Spring-ов просто не существовало бы.
Я думаю, что пора просить помощи у знатоков Java в этом вопросе. Лично я не могу представить себе такого кода на Java:
// SomeClass.javapublic class SomeClass
{
public void hello()
{
// трам-пам-пам...
}
}
и где-то в другом файле:
public class SomeClass
{
public void bye()
{
// трам-пам-пам...
}
}
И затем:
public class SomeClassTest
{
static public void main( string args[] )
{
SomeClass s = new SomeClass();
s.hello();
s.bye();
}
}
Может быть на уровне манипуляций с байт-кодом Java и можно что-либо подобное делать, но к языку Java это оношения уже не будет иметь.
E>>Единственное проявление динамизма Java, которое приходит мне в голову -- это возможность вызова либого метода объекта через reflection с передачей аргументов в виде object[]. Только, имхо, маловато этого, чтобы динамическим языком называться. Поэтому, как мне кажется, динамизм некоторых языков сильно преувеличивается.
VD>Ты судишь о том, что знаешь очень поверхносно. Я яву тоже знаю не очень глубого, но и моих знаний досточно чтобы заметить что твои суждения явно не верны.
Если в отношении добавленя/изъятия методов классов я прав, то мне кажется, что динамизм Java слишком завышен.
Кстати, а в C# возможно добавление/изъятие методов в класс, после того, как класс уже будет полностью определен?
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, sch, Вы писали:
E>>И все это "из коробки" для любого метода и любого класса. Другой вопрос насколько это надо и когда это стоит использовать. Но делать вручную то же самое на C++ и тяжело и вряд ли необходимо.
sch>Согласен с тобой по всем пунктам.
sch>Тут просто действует общее правило, которое заключается в том, что на C++ можно делать *все*, только напильником поработать надо
Угу. Только, к сожалению, объем доработок напильником может быть настолько велик, что ценность полученного результата окажется несоизмеримо меньше стоимости затраченных усилий.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, VladD2, Вы писали:
E>>>Можно ли в Java вводить новые методы в уже существующие классы?
VD>>Да. На том построена туча фрэймворков.
E>Каких?
А на строчку ниже взглянуть слабо было?
VD>>Опять же да. Если бы это было невозможно, то разных Spring-ов просто не существовало бы.
Ну, конечно. А к чему интересно имеет? Спринги и т.п. как раз так и устроены. Они дают декларативный интерфейс к динамическим возможностям среды. А в основе лежат рефлексия, кодогенерация и динамическое создание экземляров.
E>Кстати, а в C# возможно добавление/изъятие методов в класс, после того, как класс уже будет полностью определен?
Несколькими способами. От RealProxy до эмита.
Вот только ты почему-то считашь, что динамичность языка определяется добавлением кода в рантайме. Как раз это нужно довольно редко. А вот создать и проинциализировать объект основываясь только на его описании полученном в рантайме — это задача очень частая. В плюсах без создания специального фрэймворка (или использования разных КОМ-ом) не решаемая.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
aik>Это где так удачно аську разместил? Можно в мыло
Так надо заполнить поля в своей аське, у меня в интересах С++, так на меня сами из большого кадрового агенства через поиск нашли, жаль я уже на тот момент выбрал свой путь, а предложение было очень соблазнительным.
Здравствуйте, VladD2, Вы писали:
E>>Может быть на уровне манипуляций с байт-кодом Java и можно что-либо подобное делать, но к языку Java это оношения уже не будет иметь.
VD>Ну, конечно. А к чему интересно имеет? Спринги и т.п. как раз так и устроены. Они дают декларативный интерфейс к динамическим возможностям среды. А в основе лежат рефлексия, кодогенерация и динамическое создание экземляров.
Динамическое создание экземпляров -- это совсем не то, что изменение интерфейса класса путем добавления/изъятия методов в него.
Ты же утверждал:
E>Можно ли в Java вводить новые методы в уже существующие классы?
Да. На том построена туча фрэймворков.
что можно изменять интерфейс уже определенного класса.
E>>Кстати, а в C# возможно добавление/изъятие методов в класс, после того, как класс уже будет полностью определен?
VD>Несколькими способами. От RealProxy до эмита.
А где примеры можно посмотреть?
VD>Вот только ты почему-то считашь, что динамичность языка определяется добавлением кода в рантайме. Как раз это нужно довольно редко. А вот создать и проинциализировать объект основываясь только на его описании полученном в рантайме — это задача очень частая. В плюсах без создания специального фрэймворка (или использования разных КОМ-ом) не решаемая.
Скорее это говорит не о динамизме языка, а о динамизме программ на этом языке. А вот добавление или изменение кода в рантайме -- это как раз показатель динамизма языка. ИМХО.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
C>Твоя мысль понятна. Но судишь ты о мало тебе знакомой проблеме. Вообще C>странная ситуация. Все кто пользуется С++ не находят проблем в C>описаваемых теоретиками случаях.
Наглая и беспринципная ложь, коллега!
Я работал с С++ много лет и любил этот язык, но то, что эти проблемы действительно являются проблемами — всегда знал и видел. Перешел на .net при первой же возможности и меня тошнит каждый раз, когда приходится возвращаться к программированию на c++.
Как будто смирительную рубашку на меня напялили, ей-богу, такое сразу чувствуется ограничение в возможностях. Т.е. теоретически сделать можно все, но трудозатраты настолько выше, что делать ничего и не хочется.
Smartpointer-ов действительно не хватает, но в сравнении с другим — это воистину мелочи. Собственно, если бы меня в с++ заставили использовать using, но взамен дали бы единую и согласованную систему исключений с автоматическим поднятием stack trace — согласился бы не задумываясь.
А вообще — есть еще отдельные товарищи, которые утверждают, что лучше фортрана языка нет и не будет. Правда, в наше время у них с достойной оплатой труда некоторые проблемы
Я бы все-таки сказал — "низкая квалификация с++ кадров".
Среди сишников профессионалов не больше, чем среди других популяций. А может и меньше — C++ многие выбирают из-за "крутизны". А этот язык некомпетентности не прощает.
Даст бог — через какое-то время ситуация изменится и останутся только действительно грамотные люди. Но до тех пор, пока отдельные товарищи гонят волну истерии и призывают писать на с++ прикладные проекты как правило, этого ждать не приходится.
Здравствуйте, mrozov, Вы писали:
M>Даст бог — через какое-то время ситуация изменится и останутся только действительно грамотные люди. Но до тех пор, пока отдельные товарищи гонят волну истерии и призывают писать на с++ прикладные проекты как правило, этого ждать не приходится.
А вот мне интересно: вот у меня, к примеру, уже не помню когда были проблемы с утечками памяти. И с повисшими указателями. И с выходами за пределы массивов. И с чем там еще, чего в C++ все так боятся. Программирую на C++ довольно плотно, получается где-то по 2-3 тысячи отлаженных строк в месяц. Когда читаю многие здешние посты про паталогические проблемы C++ проявляющиеся на каждом шагу, то постоянно задаюсь вопросом: "Что же я делаю не так?"
И что, мне нужно, как правило, не выбирать C++ в качестве основного языка для реализации прикладных проектов?
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
1. Не хочу показаться грубым — я не обвиняю Вас во лжи. Но мне лично программисты Вашей квалификации никогда не встречались. Я лично, работая с с++, разнообразных проблем, прямо или косвенно связанных с неверными указателями объелся просто. Утечки памяти имели место быть практически в каждой написанной мной программе.
2. Подозреваю, что даже такой высококлассный специалист, как Вы, смог бы выиграть в скорости написания кода той же степени надежности, используя не с++, а с# или Java.
3. Желательно все-таки читать написанный текст, а не бороться с собственными демонами. Я в своем посте помянул именно и конкретно то, что вижу своими глазами регулярно. А именно — массу проблем, связанных с использованием с++ теми, кто рожден для программирования на VB.
Т.е. Ваша личная высочайшая или даже сверхестественная квалификация ни в коей мере не отменяет того простого факта, что большинство (подавляющее) людей не способны писать код с той степеню аккуратности, которая требуется для грамотного кодирования на с++.
Для меня лично переход на .net ознаменовал резкий скачек в производительности работы. Не в последнюю очередь за счет Resharper-а, NUnit-а и xml-comments. Обратно — не хочу.