[Holy war] Язык Java круче всех
Ты совершенно прав. Java круче всех. Чем больше такие как ты, тем дороже хорошие программисты.
В Жаве есть шаблоны? Множественное наследование реализации? Автоматические локальные переменные?
Арифметика с указателями?
так что Джава, в меру оперативно, тырит неплохие концепции
Java прост и в этом его сила. В C++ есть ещё больше, чем ты привёл (ты про C#, я так понял). Только зачем всё это богатство, если из-за него только всё усложняется, а стоимость проекта больше?
Я хотел бы увидеть достаточно конкретные примеры, где можно сказать "а вот на Java это делать замучаешься".
А в c#'е они уже в этом году окончательно в релизе появятся
Возможно, ты путаешь с generic-ами. Они похожи на шаблоны, но предназначены для других вещей.
Граждане, давайте по существу.
Если мне надо запрограммировать шустрые математические рассчеты, то наверное, на C/C++ у меня это лучше получится, чем у тебя на Java... imho
так уж и для других?
Разумеется, речь не об обращении матриц или решении дифуров. Речь о достаточно общих, распространённых задачах (приёмах).
Для частых задач очень не помешают свойства, которых в яве нет
Чем больше таких как ты, тем дороже хорошие программисты.
ты, кстати, работу не ищешь случайно?
А... ну если ты так ставишь вопрос Тогда да, в той области для которой предназначена Java, она не сильно уступает своим основным конкурентам. Разве что такая неудобность: свойства надо ручками вызовы методов делать, а вместо делегатов - массив ссылок на интерфейс. Но когда привыкнешь, проблемой это не считаешь
В Java generic-и нужны, например, для того, чтобы
- компилятор следил, объекты каких типов содержатся в контейнере;
- не нужно было выполнять небезопасный downcast от Object к фактическому типу.
По-моему, это не одно и то же.
на C++ делают какую-нибудь обертку для LAPAC, т.к. перегрузка операторов довольно облегчает жизнь. Кстати, ее вроде тоже в Жаве нет?..
А разве в C# свойства не нужно руками прописывать? Ну там get/set всякие?
Перегрузки операторов нет. А что, она хорошо реализована хотя бы на C++?
ну так в Жаве ты тоже можешь написать для каждого типа по типизированному контейнеру, который будет проверять типы на этапе компиляции и не делать downcasting'ов. И в c++ можно сделать универсальный контейнер элементов void* вместо std::vector или std::list
Разве что такая неудобность: свойства надо ручками вызовы методов делать, а вместо делегатов - массив ссылок на интерфейс.Еще в Java-е фишка есть, когда нужно передать параметр by ref, то передают массив из одного элемента, тоже привыкаешь.
при обращении к свойству - не нужно
а что, разве плохо? Меня вполне устраивает. И программеров MS, видимо, тоже, т.к. в c# они их перенесли без принципиальных изменений
ну так в Жаве ты тоже можешь написать для каждого типа по типизированному контейнеру, который будет проверять типы на этапе компиляции и не делать downcasting'ов. И в c++ можно сделать универсальный контейнер элементов void* вместо std::vector или std::listJava не будет делать копии алгоритма для каждого типа, а это может быть важно в свете оптимизации по скорости.
Не понял. Можно пример?
Да штука приятная, я не спорю. Но она усложняет программу. Для каждого случая нужно писать operatorX(A a friend operatorX(A a, A b) и т. д., насколько я помню. С operator++ тоже какие-то заморочки.
Java
class Complex
{
private double re;
private double im;
void get_re_im(out double re, out double im)
{ re = this.re; im = this.im; }
}
class Complex
{
private double re;
private double im;
void get_re_im(double[] re, double[] im)
{ re[0] = this.re; im[0] = this.im; }
}
может, он о строках и скалярах?
Complex z = w.clone;
Ну просто бывает нужна вернуть из функции несколько значений (не обязательно примитивных, в принципе). В C# есть для этого "out" параметр, а в Java-е - я слышал для этой цели массивы из одного элемента очень популярны...
Что это за "функция", которая возвращает кучу всего? Может, это просто плохой ОО-дизайн? Может, дашь ещё примеров?
в Джава все типы, кроме всяких чисел, передаются исключительно как референс. Патамушта там большинство типов - это классы. А под видом объектов замаскированы указатели на них - это в грубой форме.
Насколько я помню, всё, что есть в жаве - есть в шарпе, но в шарпе есть ещё немножко полезных вещей, типа пропертей и индексеров.
А! Единственное, чего в шарпе нет - квалификатора throws, но о его пользе споры ведуццо уже давно и безультратно.
Ладно, короче, тебе примеры не приходят в голову не потому, что их нет, а потому что они невыразимы в Java.
void split_at(string s, int at, out string left, out string right);
void calculate_statistics(double[] data, out double mean, out double stddev, out double max, out double min);
.. И структур, ага.
Видишь ли, out и ref параметры это аналог плюсового
void a(Type ** b)
где две звёздочки. Почувствуй разницу.
неа. Не две, а одна. Две - это если бы ты мог не только переменную, но и ее адрес менять, а ты не можешь, да и не хочешь.
вроде есть, только игнорируется... Или это только в c++
Практически всё, что есть в Java, есть и в C#, ясное дела. Тем более, в С++ типа .NET 2005 (ИМХО). Только так уж ли нужны отдельные навороты - это я и пытаюсь выяснить. Мне хотелось бы увидеть что-то типа кода на C++ или C# с пометкой "аналог на Java отсутствует/слишком коряв в реализации".
void create__linked_pair(out A a, out B b)
{
a = new A;
b = new B;
a.b = b;
b.a = a;
}
void use_linked_pair
{
A a;
B b;
create_linked_pair(out a, out b);
//...
}
#include <stdio.h>
void main(void)
{
printf("Hello world");
}
:)
неа. Не две, а одна.Ладно, не тупи. Таки две.
это с чего это?
в яве, в большинстве случев, все параметры in-out. За редким исключением.
C++:
class T;
1) void F(T a, int b); // все - по значению
2) void F(T& a, int b); // объект - по ссылке, целое по значению
3) void F(T** pA, int& b); // ссылка на объект - по ссылке, целое - по ссылке
C#:
class T;
1) не возможно
2) void F(T a, int b);
3) void F(ref T a, ref int b);
с чего это две? Ссылка - это, по большому счету, одна звезда. Нафига там вторая?
пардон, в шарпе не шарю.. думал, словом реф вы сокращаете сишные референсы.
#include <iostream>
int main
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
А в C# такая (библиотечная) функция есть? Я к тому, что это самое _at (ИМХО) обычно опредляют на ходу и более удобна версия (более общая, кстати)
public String[] split(String regex)
Про статистику щас гляну.....
объект всегда передается по ссылке, но когда пишут ref или out, то сама ссылка передается по ссылке Не боись, это наверное, единственный сложный момент в c#
Нахрена RegEx'ы для такой элементарной задачи?
2 Кайафа: ух бля знатоков выискалось.
Поясняю.
class IntContainer
{
public readonly int Int;
public IntContainer(int value)
{
this.Int = value;
}
}
class SomeClass
{
public static void SomeRefMethod(ref IntContainer ic)
{
ic = new IntContainer(13);
}
public static void SomeMethod(IntContainer ic)
{
ic = new IntContainer(13);
}
}
public static void Main
{
IntContainer ic = new IntContainer(0);
SomeMethod(ic);
Console.WriteLine(ic.Int);
SomeRefMethod(ref ic);
Console.WriteLine(ic.Int);
}
}
Выведет
0
13
Нельзя говорить о том, что шарповые/жавовские ссылки - это аналог указателей в плюсах, потому что это приводит вот к такому вот непониманию элементарных вещей.
2 ЖЮнит - тебе привели, кажется, пример с использованием аут параметра (а что, в жаве его реально нету? Жава говнооо!). Заводить на каждый такой случай контейнер для двух стрингов или возвращать массив стрингов - наносить повреждения собственному мозгу.
Извини, думаю, проблема надуманная. Неужели так часто надо получить пачку результатов, не оформленных в один объект?
> (а что, в жаве его реально нету?
Ну и чем ты от меня отличаешься?
А какому классу принадлежит main?
а что, классовость - это самоцель?
А почему бы и нет?
В простых случаях пишешь
String[] tokens = line.split(" ");
но всегда знаешь, что разбивать можно и намного хитрее.
Мне привели пример со статистикой, где тебя функция забрасывает всякими параметрами - я отвечаю, что считаю что пример не слишком показательный.
Против других примеров нисколечко не возражаю.
Я шарп знаю, хуле!
Да нет, но в нашем глобализированном мире обычно всё к чему-то относится...
this.effect = Effect.FromFile(
World.Device,
creationParams_FromFile.SrcFile,
creationParams_FromFile.PreprocessorDefines,
creationParams_FromFile.IncludeFile,
creationParams_FromFile.SkipConstants,
creationParams_FromFile.Flags,
creationParams_FromFile.Pool,
out this.compilationErrors);
Мне бы водил-стриптизёрш... В том треде дисскуссия как-то ушла не в ту степь...
P.S. "creationParams_FromFile." не влом каждый раз писать?
1. параметры ref/out - уже обсудили
2. свойства
3. индексные свойства
Data.Current.Length = Car.Wheel.Length;
4. структуры
dictionary["Key"] = myCollection[5];
влияет на производительность.
5. boxing - автоматическое приведение примитивных типов к объектам, и полуавтоматическое - обратное привидение
6. params - метод может принимать произвольное кол-во параметров
Console.WriteLine(1);
7. Аттрибуты - упрощается кодирование стандартных задач
void MyMethod(params object[] data) {}
MyMethod("sf", 1, new Class;
8. using - автоматический вызов определенного метода интерфейса (Dispose) при выходе из блока
class MyClass
{
[Browsable(true)]
[DisplayName("Данные")]
[XmlIgnore]
[Serializable(false)]
public int MyData{}
}
using (StreamReader reader = new StreamReader("data.txt"
{
throw new Exception("какая-то ошибка");
} //здесь reader будет автоматически закрыт в любом случае
2. Не понял. Можешь пояснить?
3. Как насчёт Map?
4. Давай не будем про производительность . Не C++ всё-таки.
5-6. Есть в Java 5.
7. Думаю...
8. (несерьёзно) Ну вызови dispose в finally. Пусть читателю будет яснее!
{
Browsable = true; и т. д.
}
внутри описания класса?
А Annotations в Java 5 - это не аналог атрибутов C#?
ОК, щас гляну...
class Aдолжен помочь.
{
{
property1 = value1;
...
}
...
}
> 2. Не понял. Можешь пояснить?
void Swap(ref int a, ref int b);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
в Java-е превращается:
Data.Current.Length = Car.Wheel.Length;
> 3. Как насчёт Map?
Data.getCurrent.setLength(Car.getWheel.getLength;
Что такое Map? какой у него синтаксис?
> 4. Давай не будем про производительность . Не C++ всё-таки.
С# декларирует, что при нормальном JIt-е С# сможет приблизится по скорости к C++;
т.е. C# имеет меньшее кол-во технологических ограничений - которые мешают добиться нормальной скорости
> 8. (несерьёзно) Ну вызови dispose в finally. Пусть читателю будет яснее!
Что нагляднее?
или
using (StreamReader reader = new StreamReader("in.txt"
using (StreamWriter writer = new StreamWriter("out.txt"
{
writer.Write(reader.ReadToEnd;
}
StreamReader reader = new StreamReader("in.txt");
try
{
StreamWriter writer = new StreamWriter("out.txt")
try
{
writer.Write(reader.ReadToEnd;
}
finally
{
writer.Close;
}
}
finally
{
reader.Close;
}
в блоке чего?
и Browsable = true - чему ставится?
Annotations do not directly affect program semantics, but they do affect the way programs are treated by tools and libraries, which can in turn affect the semantics of the running program. Annotations can be read from source files, class files, or reflectively at run time.Или атрибуты в C# вовсе не для того нужны? =)
QueryPerformanceFrequency: А почему бы не вернуть long (-1 в случае ошибки)?
2. Совсем не обязательно. У массивов есть length (знаю, это другой length). У StreamTokenizer есть sval. При желании можно использовать переменные, а не соотв. get/set.
3. В Map (например, HashMap) надо делать put(key, value). М. б., не так изящно, зато можно при желании менять реализацию (HashMap, TreeMap, SortedMap, ...)
4. Ну и Java тоже подаёт надежды (в виде будущих JVM). Язык проще => больше возможностей для оптимизации.
8. Думаю...
Тут ты меня поймал - я с атрибутами не разбирался.
foreach (string s in text.Split(','
BlaBla(s);
10. Перегрузка операторов
Если говорить про новые фишки, то:
11. Generics
12. anonymous delegate
list.Sort(delegate(int i1, int i2) {return -i1.CompareTo(i2);});
13. partial class - класс может быть объявлен по частям - удобно, например, когда часть класса генерится автоматически
partial class Class
{
int a;
}
partial class Class
{
public int A {get {return a;}}
}
14. yield - "быстрое" объявление enumerator-ов
IEnumerator<TakingPoint> IEnumerable<TakingPoint>.GetEnumerator
{
foreach (TakingPoint item in InnerList)
{
yield return item;
}
}
ps
Пятая Java когда вышла?
Зато это хорошее применения для шаблона (а к ним хотел бы свести дискуссию) Builder: Получаешь заготовку, настраиваешь параметры, и все счастливы.
Это и остальное (кроме перегрузки операторов есть в Java 5).
Если надо делать классы на ходу, есть BeanShell.
Потому что это готовая (уже реализованная) winapi-шная функция
> зато можно при желании менять реализацию (HashMap, TreeMap, SortedMap, ...)
у индексных свойств в C# тоже можно менять реализацию
> 4. Ну и Java тоже подаёт надежды (в виде будущих JVM). Язык проще => больше возможностей для оптимизации.
Syntactic Sugar не усложняет язык, т.к. не добавляет новых концепций.
свойства - это обычные методы
foreach, using - это сокращенная запись стандартных кусков кода.
overload operators - обычные методы
и т.д.
5 java - когда вышла?
Не могу сказать - у меня Java 6. Полгода - год назад, наверно.
30.09.2004
Еще плюс в пользу .NET (ну и C# в том числе) заключается в том, что за последние годы MS получилось создать очень хорошую информационную среду для разработчиков. Один институт MVP чего стоит.
class A implements i1, i2, ..., i999 { ... }
Кстати, куда делся этот тред?
Просил же - сразу в Garbage.
это очень конкретный аргумент, все остальное - размазывание данной выше характеристики
Спасибо, ценная инфа
А сколько объект этого класса будет занимать?
Ты же спросил, как с множественным наследованием интерфейсов . Может, надо уточнить вопрос?
"Это нас не касается. Этим занимаются во флоте."
за последние годы MS получилось создать очень хорошую информационную среду для разработчиков. Один институт MVP чего стоитА можно поподробнее?
Итак, несмотря на кричащее название треда, пока не удалось обсудить какой-нибудь содержательный пример (задачу который на Java кодируется из рук вон плохо. А жаль. Хотелось попрактиковаться, а не попрепираться по мелочам.
Он, кстати, спросил "как реализовано", а не "как используется/делается/реализуется".
А если ещё увидеть его соседний топик%
одно из проявлений их деятельности (кроме блогов и всяких статей) - это активная работа в майкрософтских новостных группах. Реально, на любой нормальный вопрос, обычно получаешь несколько очень качественных ответов.
Итак, несмотря на кричащее название треда, пока не удалось обсудить какой-нибудь содержательный пример (задачу который на Java кодируется из рук вон плохо. А жаль. Хотелось попрактиковаться, а не попрепираться по мелочам.Где-то еще в начале треда тебе накидали пяток фич, которых, народ считает, недостает Джаве. Что тебе еще нужно? Наверно ты очень мало прогал на Джава или прогал очень специфические вещи, если не можешь их оценить. И не надо разводить гнилой базар типа, что перегрузка операторов усложняет язык, делает программу не такой прозрачной и все такое. Все это бред. Конечно, только ненормальный начнет перегружать операторы направо и налево. Обычно этой фичей вообще никто пользоваться не будет, но есть группа прогеров, которые ее очень оценят.
народ считает
Наверно ты очень мало прогал на Джава
И не надо разводить гнилой базар... ...Все это бред
а это ваще лол:замечательные аргументы дайте две
Конечно, только ненормальный начнет перегружать операторы направо и налево. Обычно этой фичей вообще никто пользоваться не будет, но есть группа прогеров, которые ее очень оценят.
Какие у тебя есть критерии, по которым можно определить - какой код написан лучше/хуже?
но есть группа прогеров, которые ее очень оценят-- ну мы все неплохо представляем о ком речь
но отсутствие этой фичей в Джава многие аргументируют так
операторов усложняет язык, делает программу не такой прозрачной и все такоеоднако на практике, если ей не злоупотреблять, то эти недостатки не проявляются
Обычно этой фичей вообще никто пользоваться не будет, но есть группа прогеров, которые ее очень оценятт.е. будут использовать, когда это реально имеет смысл
Тебе каждый пост расшифровывать надо?
Хочу что-нибудь типа водил-мутантов с внятными условиями.
предлагаю сначала определиться с тем, что считать куском кода. а заодно выяснить, может ли кусок кода иметь хоть какую-то ценность как вещь в себе. подозреваю, что после выяснения этого твой вопрос отпадет
1. Общая читабельность и простота.
2. Возможность повторного использования.
3. Возможность усовершенствования.
> 2. Возможность повторного использования.
> 3. Возможность усовершенствования.
Как их можно измерить? хотя бы на пальцах?
кусок исходника
> а заодно выяснить, может ли кусок кода иметь хоть какую-то ценность как вещь в себе
да может - потому что именно куски кода являются результатом работы программистов.
При этом заплата программистов бывает отличается в разы - даже при решении одних и тех же задач.
1. Время, потраченное на прочтение и понимание (можно засечь секундомером) и общие представления о прекрасном .
2. 1 / количество исправлений после Copy & Paste.
3. Аналогично 2 для числа исправления остального (внешнего) кода, вызывающего этот код.
И вообще, почему никто не вспомнил любимый момент архитектора C#, который он называет versioning, кажется (что проявляется в C# в виде ключевых слов override и new)?
ну мы все неплохо представляем о ком речь1. не говори за всех. я, например, не представляю о ком ты.
2. если ты имеешь в виду кучку крикунов, сишарп и джаву видевших тока в учебнике и собсвенной программе хелло ворлд(а громче всех кричат почему-то именно такие то и хер бы с ними.
отсутствие этой фичей в Джава многие аргументируют так1. здесь лишнее слово "многие". Если эти "многие" опять же из описанных выше крикунов - рецепт тот же.
2. отсутствие не нужно аргументировать - оно просто есть( аргументировать нужно присутствие. так вот, то что ты принимаешь за аргумены - на самом деле контраргументы. против присутствия фич в неджаве.
ну и еще ты забыл в своем посте слово "имхо"(в моем, оно, как видишь, есть)
1. Правильно ли я, понимаю, что из этого следует, что чем код компактнее - тем лучше?
2. Компактность должна быть не в ущерб читабельности, или другими словами - код должен легко читаться без обращения к доп. источникам?
Тогда еще спроси себя, что важнее для языка: предоставлять возможность хорошему программисту писать "хорошо" или препятствовать плохому писать "плохо". Тут конечно все еще зависит от того, как ты будешь раскрывать эти "хорошо" и "плохо". Но кажется, что эти два момента мешают один другому.
2. Да, желательно; за исключением javadoc, которые высвечиваются без обращения к источниках этих javadoc-комментариев.
А к чему всё это?
>кусок исходника
пустая строка - кусок исходника. маза следует уточнить критерий.
>> а заодно выяснить, может ли кусок кода иметь хоть какую-то ценность как вещь в себе
>да может - потому что именно куски кода являются результатом работы программистов.
ну тогда с тебя критерии этой ценности. тока чтоб не получилось как в примере выше.
Понимаю. Всё-таки было бы здорово, если бы мы разобрали конкретную задачку.
Да
ps
Надеюсь ты помнишь, что в оригинале шла речь о том, что кусок кода должен был выполнять определенную задачу?
предоставлять возможность хорошему программисту писать "хорошо" или препятствовать плохому писать "плохо".а как ты считаешь, каких программистов больше - плохих или хороших? я вот просто уверен что плохих больше
кстати, отличная тема для голосовалки, а, ?
Примеры приводимые на C# были ли компактнее, чем аналогичные Java-ишные?
Теряли ли C#-ные примеры при этом читабельность?
Какая разница - каких больше?
Главное - с какими программистами (с плохими или хорошими) - ты вместе хочешь работать .
ps
Исходя из определения плохого программиста - плохих всегда больше.
это все идеализм-утопизм, батенька.
Похоже, я неправильно назвал весь тред.
Цель была - попытаться найти не слишком специализированную задачи, которая хорошо реализуется на C++/C#, а на Java - якобы плохо.
Я хотел попрактиковаться в Java, предоставляя Java-решения таких задач.
Ладно, другой более очевидный момент. Рассмотрим пятую версию. Очевидно, что новый язык не удовлетворяет старой системе требований (достаточно посмотреть на новые енумы или статические импорты или как там они называются). Причем, замечу, что именно не удовлетворяет старым требованиям, а не является развитием языка в рамках этих требований. Т.е. в Сан решили, что она в чем-то ошибочна. Причем очевидно, что убрали как раз то требование, которое имело очень высокий приоритет. Другими словами - основную установку, которой руководствовались при разработке языке, признали необоснованной и ошибочной. Ладно, посмотрим, что там дальше будут делать с языком.
Так что про иделальность и уникальность Джава ненадо. Ошибаются все. Когда-то считали, что распределенные объектные системы тоже самая правильная штука. Сегодня с этим не все согласны.
Еще инфа для размышлений. Конструкцию using посчитали такой полезной, что ее добавляют в новую версию VB. Впрочем, как и перегрузку операторов, и беззнаковые целые. Замечу, что VB развивают отдельно, и по этому поводу тоже было очень много полемики.
Всё это, конечно, не может не радовать. Но почему Java открыта и более распространена, чем .NET? Хотя, может, это ненадолго.
В остальном все зависит от программиста.
Не совсем понимаю, что ты имеешь в виду под "открыта" и какое это имеет отношение к обсуждаемому вопросу. Или мы не только язык обсуждаем? Про распространенность все понятно: Джава в двое старше, появилась первой (т.е. ниша была свободна .NET ограничена майкрософтской платформой (где, кстати, .NET вытесняет Джава).
Можно и JVM c CLR посравнивать Там аналогичная ситуация.
Предлагаю определиться со своей позицией:
- за простоту языка
или
- за попытку его нагнать упущенное в java5, java6
> , а на Java - якобы плохо.
> Я хотел попрактиковаться в Java, предоставляя Java-решения таких задач.
Так ты хочешь сравнить:
язык Java против языка C#?
или framework Java против framework-а .Net?
это не кошерный код Надо так:После этого себя можно чувстовать крутым плюсовиком? Или просто тащиться от того, что программы дольше компилируются?
Давай не будем про производительностьС такой оговоркой ты вполне можешь одержать победу в споре "Язык Java круче всех".
Просил же - сразу в Garbage.Оба лозунга "java - говно" и "java круче всех" заслуживают гарбейджа в одинаковой мере. Если хочешь, могу перенести весь тред.
1. Время, потраченное на прочтение и понимание (можно засечь секундомером) и общие представления о прекрасном .Товарищ, ты идеальный программист в вакууме. Твои критерии касаются только того, как ты работаешь с кодом, а не то, как он работает сам по себе. Где критерии о затратах памяти, процессора?
2. 1 / количество исправлений после Copy & Paste.
3. Аналогично 2 для числа исправления остального (внешнего) кода, вызывающего этот код.
Ты напоминаешь коллекционера оружия, которого интересуют наиболее эстетически интересные образцы, а не наиболее рабочие.
Прошу. Глупый какой-то тред получился...
Боюсь, что в таком случае надо выкинуть в мусор все языки,
происходящие от сей.
Да, кстати:
(display "Hello, world!")
---
...Я работаю антинаучным аферистом...
Штука в том, что то, как выглядит язык, определяется набором первоначальных требований, которые к нему предъявляют. В случае Джава требование о максимальной простоте языка (назовем это требование так, хотя не совсем точное название) приписывается очень высокий приоритет (по крайней мере так было раньше, до пятой версии). С другой стороны, Джава позиционируется как универсальный язык (более того, фактически единственный для целой платформы). Последнее делает это требование очень спорным. Гораздо разумнее было бы изначально заменить его на более мягкое.одна из немногих умных мыслей в этом треде... действительно, java позиционировался вначале как простой и надежный язык, но платформа - то j2ee развивается быстрыми темпами , и излишняя простота языка уже начинает мешать. А так ,вроде нормальный язык
Если кто-то считает, что AOP не особо нужная/удобная вещь - он просто им не пользовался. Как говорится, попробовав раз - пишу и сейчас
В плюсах AOP не очень нужен (как что-то дополнительное т.к. там mixin-ы можно напрямую реализовать через множественное наследование.
Ну АОП это не тока миксин, не так ли? Это еще и dynamic introductions, и advices и все остальное. И кстати, вот этот вот AOP.NET динамически ведь инструментацию проводит, да? Или как AspectJ, в статике?
у нас с начальником недавно был как раз на этот счет спор... нужно было не шибко сложное преобразование строки сделать. Он делал через Split с помощью регэкспа, а я чисто C-style, последовательным обходом массива символов и записью в StringBuilder. Мой вариант работал в 10 раз быстрее (и то и то - на c#).
1. Swap: ладно, это в Java, похоже, только напрямую. Только часто ли нужна такая специфическая операция?Хм... а в Жабе есть что-нить типа InterlockedIncrement?.. как его без ссылок сделать?
QueryPerformanceFrequency: А почему бы не вернуть long (-1 в случае ошибки)?
Эх, давайте, что ль, шаблоны обсуждать в соседнем треде...
Извини, не знаю, что это такое.
твой пример был на чистых Си. Об этом говорит даже void в списке параметров.
Increments a specified variable and stores the result, as an atomic operation.
Overload List
Increments a specified variable and stores the result, as an atomic operation.
public static int Increment(ref int);
Increments a specified variable and stores the result, as an atomic operation.
public static long Increment(ref long);
--- это для многопоточных программ, атомарное увеличение числовой переменной на единицу
Ну ты ещё ассемблерные вставки попроси.
я чего-то упустил, в c# есть ассемблерные вставки? Есть unsafe-блоки, это кстати, еще одна фича которой нет в Жабе, но ассемблер - это уже слишком
Дык, заведи тред - и напиши, что хорошего ты имеешь против шаблон.
А причем здесь шаблоны. Из в C# и Java нет, или ты про что?
Ладно, лажовый тред я создал, надо закругляться...
В нём абсолютно отчётливо обнаружилось, что жава как язык - полное говно (по сравнению с шарпом, конечно и единственный её плюс - несколько более широкая распространённость =)
ИМХО, конечно же. То есть я прочитал эти 12 фишек, которых нет в жаве, и осознал вот это.
Спасибо, дружёк! Я теперь больше не буду задумываться на тему "а может жава всё-таки не сосёд"!
ЗЫ: в числе недостатков никто не вспоминал отсутствие уинта?
101 reason why Java is better than Dot Net
А вообще, кому как удобно. Я чёта уж привык на Яве. Да и кстати все красоты что есть в пятом компиляторе от Сана мне и даром не нужны, я лучше напишу две строчки вместо одной, зато буду уверен в стабильности работы IBM JDK 1.4 на кластере из Websphere.
Для пущего флейма подкину ещё статейку А вообще, кому как удобно. Я чёта уж привык на Яве. Да и кстати все красоты что есть в пятом компиляторе от Сана мне и даром не нужны, я лучше напишу две строчки вместо одной, зато буду уверен в стабильности работы IBM JDK 1.4 на кластере из Websphere.
ЗЫ а ты уинтом часто пользуешься? ну кроме interop'а, когда апишная функция уинт использует?
ИМХО, в прикладных задачах очень часто приходится работать с legacy-системами и сторонними системами.
И в этих системах uint-ы встречаются тоже довольно часто.
А я без for(:) и generics в IDEA уже даже прогать не могу Видимо мы прогаем разные вещи.
вполне возможно.на яве я в основном делаю server-side J2EE приложения, а jrockit и ibm jdk под них только 1.4 . IDEA самая удобная для кодирования, но многие вещи в J2EE она обходит стороной. Я использую её скорее как текстовый редактор.
Да .net - уже говно тем что ориентирована на 1 платформу микрософт , а факт того что софтварные гиганты такие как ibm,sun,oracle и др. явно ориентированы на поддержку java,то есть не столько java ,сколько против микросовта. Так что в ближайшее время вытеснение java с рынка не предвидится
Mono вроде уже работает.
По крайней мере почти все .net-проекты на sourceforge декларируют поддержку mono.
В теме Java vs .NET меня больше интересует вопрос в плане трудоустройства и так дальше, если учитывать местную специфику. Может лучше такой тред замутить? Даже так, много ли теряешь сегодня если выбираешь .NET, а не Java?
Да и кстати все красоты что есть в пятом компиляторе от Сана мне и даром не нужны, я лучше напишу две строчки вместо одной, зато буду уверен в стабильности работы IBM JDK 1.4 на кластере из Websphere.аналогично =)
угу, .NET ориентирована только на платформу CLR, но и Java ориентирована только на платформу JVM А всякие IBM'ы мелкомягкие себе вроде чуть ли не в партнеры записывают...
.NET ориентирована только на платформу CLR, но и Java ориентирована только на платформу JVMне понял юмора
угу, .NET ориентирована только на платформу CLR, но и Java ориентирована только на платформу JVM А всякие IBM'ы мелкомягкие себе вроде чуть ли не в партнеры записывают...пешы исчо
Иеперь моё мнение о том, что жава-говно не поколеблет никто и никогда (разве что выйдет новая жава с фишечками).
Я нашёл в ней, конечно, один технический недостаткок (отсутствие фичи) .НЕТа,
http://www.manageability.org/manageabilityWiki/GarbageCollectClasses
Всё остальное - это бессвязные вопли на тему "винформс 1.1 херовые, а у нас много графических библиотек" (Именно так я и упустил единственный шанс написать прогу на жаве: задача выбора между тремя оконными библиотеками оказалась непосильна "разработчикам на жаве платят больше" и "сан утверждает, что жвм иногда быстрее, особенно когда мы пытаемся интерпретировать питон".
Особенно меня поразило, что в статье не упомянули отличие в работе с эксепшенами. Мб они ламера?
Упд: нет, я просто пропустил это место. Оно есть. Почитав комменты, я пришёл к выводу, что жавовская модель действительно не очень хороша, потому что "Usually all you want is to treat the exceptions centrally in as few locations as possible not in every damned method.", а делать throws опциональным - значит делать его бессмысленным.
так я и упустил единственный шанс написать прогу на жаве: задача выбора между тремя оконными библиотеками оказалась непосильнаКакие именно библиотеки, если не секрет?
By contrast, generated MSIL cannot be unloaded. The only way to unload code is to unload an entire application domain (that is, to unload all of your application's code).В CLR 2.0 есть lightweight генерация IL статических методов, причем этот IL собирается GC (наверно и нативный код тоже). А решение о невозможности выгрузки сборок было осознанным, видимо дает какие-то ощутимые бонусы. По крайней мере не раз встречал в блогах попытки его объяснить. Потом с их стороны честно было бы упомянуть про то, что dllки разделяются процессами и про возможно запихнуть сразу найтив код, который тоже будет разделятся процессами.
Короче если сами платформы еще и можно сравнивать, что про ВМ все довольно очевидно: CLR гораздо более сложная, низкоуровневая и рассчитанная на более широкий круг задач, чем JVM. Плюс CLR очень активно развивается, а с JVM непонятно, вроде Sun ее трогать не решается.
Какая разница, они все дают уродский GUI, т.е. который почти одинаково уродский под все системы.
Да кто эти "они", мне интересно? Иногда приколько немного приврать, но совсем завираться - это же не дело.
Ну я видел только две Swing и SWT . Про SWT я конечно погорячился в плане уродства (хотя я видел только Eclipse, плюс это не чистый SE). Но все проги на Swing ужасны, мне даже интерфейс винды 95 больше нравится, причем в 5ой версии сильно лучше не стало. Хотя наверно, если очень сильно постараться, то можно что-то сделать.
Ещё один считающий, что две страницы кода лучше одной.
Почему бы не писать на ассемблере?
Напишешь десять строчек вместо одной, но зато будешь точно
уверен в том, что компилятор правильно тебя понял.
> Язык Java круче всех
Если слово "круче" воспринимать буквально, получается правильнее.
---
...Я работаю антинаучным аферистом...
[Holy war] Язык Java круче всех
В этом треде я попрошу приводить достаточно конкретные аргументы против тезиса, вынесенного в заголовок (если, конечно, они существуют). Предполагается сравнение в первую очередь с C++ и C#.А как же другие языки ?
Бессодержательные сообщения типа "Ошибаешься. Учи Аду." прошу направлять сразу в Garbage, чтобы не усложнять процесс.
А вообще, тред не заладился и рассматривается своим создателем как deprecated.
Предполагалось затмить всех своими знаниями design pattern-ов, которые доставляют простые элегантные решения для предъявленных "контрпримеров". ОК, как-нибудь в другой раз...
С# ближе всего к Java и претендует на большую крутизну, поэтому естественно, что его использовали для опускания Java. С другими языками будет сложнее.
а где тут юмор? На c# пока пишут только для одной платформы, на Java - тоже только для одной. А вот реализации этих платформ есть и для писюков под разными осями, и для встроенных систем...
забей, просто ты там CLR и JVM в платформы записал
Понятия не имею. Там была Eclipse (до сих пор ржу с этого названия и в ней была квик-старт картинка, типа "возможная структура жава-приложения". Наверху былы три клеточки с ГУИ библиотеками (свинг там точно был ниже три клеточки с ещё чем-то, и ниже ещё что-то. Я попытался выяснить у случившегося рядом человека, который уже имел опыт программирования на жаве, что типа лучше. Он сказал, что из трёх пробовал две, и одна ему нравится больше другой.
Потом я оценил скорость работы Eclipse на пятисотом пеньке (секундный лаг между нажатием кнопки и появлением символа на экране и решил, что это не для меня.
Так я не стал прогать на жаве.
Другим словами: по сообщениям источника ОБС News, в Java 3 GUI библиотеки, только никто не знает, что это за библиотеки. Круто.
Про трудность выбора, отвернувшего человека от Java. Скорее всего имеются в виду AWT, Swing, Swing. AWT не стоит использовать по причине отсталости. Вы же не будете использовать библиотеки OWL (ObjectWindows library) или MFC 1.0, не так ли? Остаётся SWT и Swing. Ну это конечно просто жестокий выбор, прям Java-аналог выбора буриданова осла. Хотя казалось бы: нравится Eclipse - используй SWT, не нравиться - юзай Swing.
// Потом я оценил скорость работы Eclipse на пятисотом пеньке (секундный лаг между нажатием кнопки и появлением символа на экране
Это всего лишь ленивая загрузка - чтобы не забивать память всем необходимым на все случаи жизни. Нажми кнопку ещё раз и будет тебе щастье.
// и решил, что это не для меня.
Так я не стал прогать на жаве.
Что ж, несмотря на ощутимую потерю для Java, мы постараемся это как-то преодолеть.....
Вот ты л0х. Не какая-то мифическая Одна Бабка, а я.
Более того, ты и сам их после этого назвал.
В чём проблема?
> Это всего лишь ленивая загрузка - чтобы не забивать память всем необходимым на все случаи жизни.
> Нажми кнопку ещё раз и будет тебе щастье
Ты не понял. Это после каждого нажатия такой лаг был =) Если отключить всё интеллисенс, то лаг вроде бы становился порядка сотни-двух миллисекунд, то есть почти приемлемым. Но как-то это всё равно неприятно.
Нельзя говорить о том, что шарповые/жавовские ссылки - это аналог указателей в плюсах, потому что это приводит вот к такому вот непониманию элементарных вещей.А по-моему, твой код очень хорошо сочетается с концепцией "шарповые/жавовские ссылки - это аналог указателей в плюсах".
В С++ код
#include<iostream>выведет то же самое...
using namespace std;
class IntContainer
{
public:
const int Int;
IntContainer(int value): Int(value) {}
};
class SomeClass
{
public:
static void SomeRefMethod(IntContainer *&ic)
{
ic = new IntContainer(13);
}
static void SomeMethod(IntContainer *ic)
{
ic = new IntContainer(13);
}
};
int main
{
IntContainer *ic = new IntContainer(0);
SomeClass::SomeMethod(ic);
cout<<ic->Int<<'\n';
SomeClass::SomeRefMethod(ic);
cout<<ic->Int<<'\n';
return 0;
}
http://msk.nestor.minsk.by/kg/2002/16/kg21611.html
Python и другие...
Все познается в сравнении. Это аксиома стала в компьютерном мире одной из главных. Так давайте же сравнивать...
На практике выбор языка программирования часто диктуется другими реальными сдерживающими факторами, такими как стоимость, доступность, подготовка, предшествующая инвестиция, или даже эмоциональная симпатия. Поскольку эти аспекты чрезвычайно нестабильны и переменчивы, будет пустой тратой времени много говорить о них. Сравним Python с такими языками, как Java, Perl, Tcl, Smalltalk, C++.
Java. Многие думают, что Python программы выполняются медленнее, чем программы Java, но они в то же время требуют намного меньше времени для разработки. Python программы типично медленнее в 3-5 раз, чем эквивалентные Java программы. Эта разница может быть объяснена за счет встроенных высокоуровневых типов данных Python и его динамической типизации. Например, Python программист не тратит времени, описывая типы аргументов или переменных, а мощные типы полиморфных списков и словарей Python, для которых богатая синтаксическая поддержка встроена прямо в сам язык, могут найти применение почти в каждой Python программе. Из-за типизации во время выполнения Python должен выполнять больше работы, чем Java. Например, при обработке выражения a+b он должен сначала исследовать объекты a и b, чтобы выяснить их типы, которые неизвестны во время компиляции. Затем вызывается соответствующая операция сложения, которая может оказаться перегруженным пользователем методом. Java, с другой стороны, может выполнять эффективное сложение целых или чисел с плавающей точкой, но требует описания переменных a и b, и не позволяет перегружать оператор + для экземпляров классов, определенных пользователем. По этим причинам Python намного лучше подходит как "склеивающий" язык в то время, как Java лучше характеризуется как низкоуровневый язык для реализации. Фактически, вместе они могут образовать отличную пару. Компоненты можно реализовывать на Java, а затем использовать в приложениях на Python; Python также полезно использовать для прототипов компонент, пока их разработка не "затвердеет" в Java реализации. Для поддержки такого типа разработки создается реализация Python, написанная на Java. Она позволяет вызывать Python код из Java и наоборот. В этой реализации исходный код Python транслируется в байт-код Java (с помощью библиотеки времени выполнения для поддержки динамической семантики Python).
Perl. Python и Perl родом из похожих окружений и несут много сходных особенностей, но имеют разную философию. Perl предназначен для поддержки общих программно-ориентированных задач, например, имеет встроенную обработку регулярных выражений, сканирование файлов и генерирование отчетов. Python концентрируется на общих методологиях программирования, таких, как разработка структур данных и объектно-ориентированное программирование, способствует написанию удобочитаемого (а значит, легко поддерживаемого) кода путем предоставления элегантной, но не чрезмерно зашифрованной нотации. Как следствие, Python близко подходит к Perl, но редко побеждает в его оригинальной нише приложений; однако, Python имеет хорошую применимость за пределами ниши Perl.
Tcl. Подобно Python, Tcl полезен как язык расширения приложений, так и в качестве независимого языка программирования. Однако Tcl, который традиционно хранит все данные как строки, обладает скудными структурами данных, а выполняет типичный код намного медленнее, чем Python. Tcl также недостает особенностей, необходимых при написании больших программ, таких как модулированные пространства имен. В то время, как "типичные" большие приложения, использующие Tcl, обычно содержат расширения, написанные на C или C++, эквивалентные Python приложения часто могут быть написаны на "чистом Python". Безусловно, разработка на чистом Python осуществляется намного быстрее, чем при написании и отладке C или C++ компонент. Было высказано, что одним из качественных разработок на Tcl является пакет Tk. Python приспособил интерфейс Tk в качестве своей библиотеки стандартных компонент GUI. Tcl 8.0 затрагивает вопросы скорости, предоставляя байт-код компилятор с ограниченной поддержкой типов данных, и добавляет пространства имен. Однако это все еще слишком громоздкий язык программирования.
Smalltalk. Возможно, наибольшее различие между Python и Smalltalk состоит в Python синтаксисе "основного потока", который дает ветвь подготовки программистов. Подобно Smalltalk, Python имеет динамическую типизацию и динамическое связывание, и все в Python является объектом. Тем не менее, Python отличает встроенные объектные типы от классов, определенных пользователем, и к настоящему времени не допускает наследование из встроенных типов. Стандартный набор библиотеки типов данных Smalltalk более очищенный, тогда как библиотека Python имеет больше средств для работы с Internet и WWW, например, c e-mail, HTML и FTP. Python имеет отличающуюся философию касательно среды разработки и распределения кода. Там, где Smalltalk по традиции имеет монолитный "системный образ", который включает как среду, так и программу пользователя, Python хранит стандартные модули и модули пользователя в индивидуальных файлах, которые могут легко быть перестроены или распространены за пределами системы. Как следствие, существует более одного выбора при использовании графического интерфейса пользователя (GUI) в Python программе, поскольку GUI не встроен в систему.
C++. Почти все сказанное для Java также применимо к C++, тем более, что там, где код Python обычно в 3-5 раз короче, чем эквивалентный код Java, он часто в 5-10 раз короче эквивалентного кода C++! Анекдотическое подтверждение гласит: то, что один программист Python может завершить за два месяца, два программиста C++ не смогут сделать и за год. Python блестяще используется как клей, соединяющий компоненты, написанные на C++.
В заключение хотелось бы сказать только одно: не так давно вышла новая версия питона — 2.2. Это еще один сильный шаг вперед. Вперед к сверхвысокому уровню современного программирования. Этот язык стоит того, чтобы его знать.
По материалам www.python.org
Python и другие...
Все познается в сравнении. Это аксиома стала в компьютерном мире одной из главных. Так давайте же сравнивать...
На практике выбор языка программирования часто диктуется другими реальными сдерживающими факторами, такими как стоимость, доступность, подготовка, предшествующая инвестиция, или даже эмоциональная симпатия. Поскольку эти аспекты чрезвычайно нестабильны и переменчивы, будет пустой тратой времени много говорить о них. Сравним Python с такими языками, как Java, Perl, Tcl, Smalltalk, C++.
Java. Многие думают, что Python программы выполняются медленнее, чем программы Java, но они в то же время требуют намного меньше времени для разработки. Python программы типично медленнее в 3-5 раз, чем эквивалентные Java программы. Эта разница может быть объяснена за счет встроенных высокоуровневых типов данных Python и его динамической типизации. Например, Python программист не тратит времени, описывая типы аргументов или переменных, а мощные типы полиморфных списков и словарей Python, для которых богатая синтаксическая поддержка встроена прямо в сам язык, могут найти применение почти в каждой Python программе. Из-за типизации во время выполнения Python должен выполнять больше работы, чем Java. Например, при обработке выражения a+b он должен сначала исследовать объекты a и b, чтобы выяснить их типы, которые неизвестны во время компиляции. Затем вызывается соответствующая операция сложения, которая может оказаться перегруженным пользователем методом. Java, с другой стороны, может выполнять эффективное сложение целых или чисел с плавающей точкой, но требует описания переменных a и b, и не позволяет перегружать оператор + для экземпляров классов, определенных пользователем. По этим причинам Python намного лучше подходит как "склеивающий" язык в то время, как Java лучше характеризуется как низкоуровневый язык для реализации. Фактически, вместе они могут образовать отличную пару. Компоненты можно реализовывать на Java, а затем использовать в приложениях на Python; Python также полезно использовать для прототипов компонент, пока их разработка не "затвердеет" в Java реализации. Для поддержки такого типа разработки создается реализация Python, написанная на Java. Она позволяет вызывать Python код из Java и наоборот. В этой реализации исходный код Python транслируется в байт-код Java (с помощью библиотеки времени выполнения для поддержки динамической семантики Python).
Perl. Python и Perl родом из похожих окружений и несут много сходных особенностей, но имеют разную философию. Perl предназначен для поддержки общих программно-ориентированных задач, например, имеет встроенную обработку регулярных выражений, сканирование файлов и генерирование отчетов. Python концентрируется на общих методологиях программирования, таких, как разработка структур данных и объектно-ориентированное программирование, способствует написанию удобочитаемого (а значит, легко поддерживаемого) кода путем предоставления элегантной, но не чрезмерно зашифрованной нотации. Как следствие, Python близко подходит к Perl, но редко побеждает в его оригинальной нише приложений; однако, Python имеет хорошую применимость за пределами ниши Perl.
Tcl. Подобно Python, Tcl полезен как язык расширения приложений, так и в качестве независимого языка программирования. Однако Tcl, который традиционно хранит все данные как строки, обладает скудными структурами данных, а выполняет типичный код намного медленнее, чем Python. Tcl также недостает особенностей, необходимых при написании больших программ, таких как модулированные пространства имен. В то время, как "типичные" большие приложения, использующие Tcl, обычно содержат расширения, написанные на C или C++, эквивалентные Python приложения часто могут быть написаны на "чистом Python". Безусловно, разработка на чистом Python осуществляется намного быстрее, чем при написании и отладке C или C++ компонент. Было высказано, что одним из качественных разработок на Tcl является пакет Tk. Python приспособил интерфейс Tk в качестве своей библиотеки стандартных компонент GUI. Tcl 8.0 затрагивает вопросы скорости, предоставляя байт-код компилятор с ограниченной поддержкой типов данных, и добавляет пространства имен. Однако это все еще слишком громоздкий язык программирования.
Smalltalk. Возможно, наибольшее различие между Python и Smalltalk состоит в Python синтаксисе "основного потока", который дает ветвь подготовки программистов. Подобно Smalltalk, Python имеет динамическую типизацию и динамическое связывание, и все в Python является объектом. Тем не менее, Python отличает встроенные объектные типы от классов, определенных пользователем, и к настоящему времени не допускает наследование из встроенных типов. Стандартный набор библиотеки типов данных Smalltalk более очищенный, тогда как библиотека Python имеет больше средств для работы с Internet и WWW, например, c e-mail, HTML и FTP. Python имеет отличающуюся философию касательно среды разработки и распределения кода. Там, где Smalltalk по традиции имеет монолитный "системный образ", который включает как среду, так и программу пользователя, Python хранит стандартные модули и модули пользователя в индивидуальных файлах, которые могут легко быть перестроены или распространены за пределами системы. Как следствие, существует более одного выбора при использовании графического интерфейса пользователя (GUI) в Python программе, поскольку GUI не встроен в систему.
C++. Почти все сказанное для Java также применимо к C++, тем более, что там, где код Python обычно в 3-5 раз короче, чем эквивалентный код Java, он часто в 5-10 раз короче эквивалентного кода C++! Анекдотическое подтверждение гласит: то, что один программист Python может завершить за два месяца, два программиста C++ не смогут сделать и за год. Python блестяще используется как клей, соединяющий компоненты, написанные на C++.
В заключение хотелось бы сказать только одно: не так давно вышла новая версия питона — 2.2. Это еще один сильный шаг вперед. Вперед к сверхвысокому уровню современного программирования. Этот язык стоит того, чтобы его знать.
По материалам www.python.org
а они продвинулись уже достаточно далеко
Оставить комментарий
enochka1145
В этом треде я попрошу приводить достаточно конкретные аргументы против тезиса, вынесенного в заголовок (если, конечно, они существуют). Предполагается сравнение в первую очередь с C++ и C#.Бессодержательные сообщения типа "Ошибаешься. Учи Аду." прошу направлять сразу в Garbage, чтобы не усложнять процесс.