Pull to refresh

Comments 57

Без обид, возможно я ничего не понимаю, но кому нужно сейчас Delphi? Я понимаю что есть куча старого софта на нем написаного, но че действительно он так востребованный?
господи, давайте хоть в этом топике обойдемся без дурацких вопросов
И в чем вопрос дурацкий? Мне действительно интересно узнать где он востребованный. Можете Вы сможете объяснить? Я Вас с удовольствием выслушаю.
В каждом топике по Delphi находится кто-то вроде вас, кто задает этот вопрос. Я лично не хочу в сотый раз подымать эту тему
А что в вашем понимании значит «востребованный». Если на нем уже более 20 лет (включая Pascal) пишут ПО для автоматизации телевещания для лидера отрасли — это «востребован»? И, чем Delphi так плох, что не может быть востребован?
Что вы вообще делаете в хабе "Delphi"? Отпишись от него и вам будет спокойнее )
Найдите холиварный топик по Делфи и там можно сраться до конца скролла.
А тут — не мешайте ностальгировать :)
Вы скайпом пользуетесь? Наверное будете удивлены, если узнаете, что он написан на Delphi.
И в каждом холиваре всегда вижу этот аргумент :-).
UFO just landed and posted this here
Эта ваша «точка» зрения меня наводит на неоднозначные мысли по поводу сказанного.
Ошибся веткой, а удалить комент возможности нет :(. Так что извините, впредь буду осторожней.
Согласен, удаления порой сильно не хватает.
Особенно возможности удалить чужой комент :).
*введите сюда язык (не C++\Delphi), компилируемый в нативный код и с удобным визуальным фреймворком (+дизайнером форм)*
Хотя-бы с теоретической точки зрения интересно (дизайн языков программирования). Я именно с этой точки зрения прочитал.
Так я же не спорю. У меня вопрос, где востребован сейчас Delphi?
Будь у меня достаточно денег, я бы создал компанию в которую нанимал делфи-программистов и учил их С++, С# или Java. // второй раз за день опасно шуткую
А после обучения этим языкам предполагается, что они и дальше пишут на Delphi? Вы думаете, им понравится C++, в котором приведение типа из char* в std::string вызывает Segmentation Fault в случае NULL? Или Java, в которой при сравнении строк можно получить NullPointerException, если не использовать equals из стороннего пакета Apache Commons.

Delphi и Ada — нативные языки программирования, позволяющие работать в том числе с сишными библиотеками, но при этом изолированные от них языковым барьером. Нет ситуации, когда я делаю инклуд одного файла, этот файл инклудит заголовки Win32, и через все эти инклуды в препроцессор и пространство имён заливается неконтроллируемый объём дефайнов и объявлений. И Delphi, и, особенно, Ada имеют свои механизмы определения области видимости, отличные от C и C++ в лучшую сторону.

Кроме того, в Delphi и Ada для примитивных типов можно включить проверку диапазонов, и это штатная фича, в отличие от костылей типа Electric Fence или libmudflap в C/C++. И, наоборот, в отличие от Java и C#, эти проверки можно отключать.
Или Java, в которой при сравнении строк можно получить NullPointerException, если не использовать equals из стороннего пакета Apache Commons.
Неубедительно.
При вызове метода объекта по нулевому указателю в Delphi тоже может быть NPE AV.
Что бы обезопасить себя от NPE достаточно одной проверки на null, безо всяких невизуальных компонентов сторонних пакетов.

UFO just landed and posted this here
М.б. у мелкомягких? Скайп-то они купили...)
Мне нужен. Уходите.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Знакомая штука! Вам надо над информативностью поработать, я так и не понял, что к чему, и как разлочить телефон. закрыл страницу и пошел гуглить дальше.
Та же тема. К томуже, я делаю на нем все, что хочется — ISAPI Extension, exe, dll… разве что, драйверы писать нельзя. Для этого нужен обычный C. И любой другой разработчик может всязть мою dll и его не будет беспокоить, на каком языке она написана.
Без обид, просто не нужно заходить, а тем более комментировать тему, если она Вам не интересна.
Я сказал что тема мне не интересна? Мне интересно, где сейчас востребован Delphi? И да почитайте ниже комментарии, там больше наезда на Delphi, чем как вы посчитали в моем вопросе
Погуглите, пожалуйста, Embarcadero Showcase
Многие (не) риторические вопросы легко гуглятся.
Аналог DriverPackSolution -DriverX написан на дельфи, скайп, тотал, один из создателей Delphi Придумал C#.

Чем больше программируешь на Visual C++, тем больше понимаешь что он не визуальный. Очень популярный МЕМ
Тем более что Все плюшки Delphi утекли в C# после ухода Хейлсберга из Borland в Microsoft.

ЛЯ ЛЯ ????
чую скоро появится поколение людей которые будут спрашивать: «что такое Delphi?»
Уже сталкивался. Рожденные в середине 90-х.
Простите, что? Я начинал с Delphi, например.

И да, у меня все друзья о нем знают, т.к. он (в начале обучения) — один из наиболее простых языков.
У меня большинство тоже знают, включая 90-тиков. Но есть и такие, для кого это как для нас какой-нибудь PL/M. Такое впечатление, что их уже в школе не учат паскалю, а на большинстве веб-ресурсов о программировании чаще упоминаются совсем другие инструменты.
Сарказма значит вы не разглядели в посте, увы… Нет такого языка Visual C++, это древнее название Visual Studio.
Я всё понимаю, но Delphi 7 в 2012 году?
К чему эта некрофилия? Его даже поставить без плясок с бубнами на Win 7 не получится.
Давно пора переползти на более поздние версии.
— Ставится без проблем.
— В режиме совместимости XP работает хорошо.
— Если вы компоненто-писатель, то какая у вас альтернатива? Как еще вы будете поддерживать эту армию программистов, которым все еще нужен D7?
Скорость скачивания обновлений по gprs может быть от 1.5 до 5 Кбайт/сек. Тариф — 7 руб. за Мб

.bpl'ки улучшают ситуацию, но само их появление на платежных терминалах можно приурочить только к крупным обновлениям
никогда не задумывались, что есть старые проекты, которые надо саппортить, а рефакторинг под новые версии — нереальный геморрой?:) Плюс это последняя действительно быстрая и стабильная IDE из всей линейки. Да, там нет кучи современных вещей, мне там не хватает дженериков как воды, но в целом, работать можно.
Ставлю на вин7 без единой пляски с бубнами, кстати:)
UFO just landed and posted this here
не ставил режим совместимости:) ставлю на несистемный раздел и все:)
Так прямо и «нереальный геморрой»?
Тогда и его поддержка на D7 тоже не сахар, видимо :)
Перетаскивал проект (около миллиона строк) с D7 на D2009, затруднения были только с Indy.
всякое бывает, знаете ли. не скажу, что разработка на д7 доставляет острые анальные боли, работа как работа:) Синтаксический сахар это хорошо, но на качестве кода это редко сказывается.

Свой проект перенести проще, вы попробуйте перенести чужой, да с кучей зависимостей, да с библиотеками, которые не обновлялись уже с пяток лет;) Вот это приключение, я вам скажу. И проблемы с юникодом это так, фигня, решается быстрее всего. Сложнее становится, когда логика перестает работать как раньше в силу особенностей новой платформы, каких-то новых багов или потому что старые хаки не работают. Вот это действительно превращает процесс перевода в крупную головную боль.
Маловато примеров. А без примеров все эти пляски с бубном выглядят подозрительно. Попробую предложить решения некоторых проблем:
Автоматическое управление памятью. Лестница из try… finally — это не серьёзно
obj1 := nil;
obj2 := nil;
try
  obj1 := TClass1.Create;
  obj2 := TClass2.Create;
 ....
finally
  obj1.Free;
  obj2.Free;
end;
решение масштабируется на любое количество объектов.

Copy-on-write и счётчики ссылок
Счетчики ссылок встроены в TInterfacedObject. готовое Copy-on-write реализовано только в string, остальное да, ручками.

Другое особое поведение при копировании
Непонятно каким образом объектная модель Delphi мешает реализовать любое копирование, как вам нужно.

Неинициализированная переменная должна вести себя как пустая строка или 0, соответственно
Это почему еще? Даже в антагонистическом С++ это не так.

Методы не могут изменить содержимое переменной–указателя, у которого они были вызваны
Зачем такие извращения?

Нет контроля за тем, что происходит при копировании объекта.
Встроенного копирования объектов в Delphi нет, соответственно нет и контроля. Копируйте и контролируйте сами.

Подозреваю, что до Delphi вы имели богатый опыт на каком-то высокоуровневом языке вроде C# или Java. У Delphi'ста с рождения, таких проблем возникать не должно :)
Непонятно каким образом объектная модель Delphi мешает реализовать любое копирование, как вам нужно

a := b; — объектная модель не мешает, но и не помогает. Только, используя варианты, можно вклиниться в процесс копирования

Неинициализированная переменная должна вести себя как пустая строка или 0, соответственно

Это почему еще? Даже в антагонистическом С++ это не так

Имелось в виду, что string(nil) в Delphi — это пустая строка, и собственные типы могли бы быть устроены так же…

Методы не могут изменить содержимое переменной–указателя, у которого они были вызваны

Зачем такие извращения?

… в том числе, становясь nil, если их занулить. Например, если сделать строке .Delete по всему диапазону. А также это необходимо для copy-on-write. MyCustomString.Append('12') может захотеть стать другим указателем, если будет знать, что не уникален.

Нет контроля за тем, что происходит при копировании объекта.

Встроенного копирования объектов в Delphi нет, соответственно нет и контроля. Копируйте и контролируйте сами.

В некоторых случаях это крайне нежелательно, особенно, когда объекты начинают выстраиваться в иерархию и иметь пересекающиеся части.
полагаю, что немного примеров из реального кода помогли бы:)
Я для себя написал вот такой класс:

TkaGarbageCollector
unit kaGarbageCollector;

interface

{$REGION 'interface uses'}
uses
 // Стандартные модули:
 Generics.Collections;
{$ENDREGION}

type
 ///<summary> Класс позволяющий упростить освобождение памяти.</summary>
 TkaGarbageCollector = class
 public
  const
   DEFAULT_TAG = 'DEFAULT_TAG';
 private
  items: TDictionary<TObject, string>;
 public
  constructor Create();
  destructor Destroy; override;

  ///<summary> Добавить элемент в список и вернуть свежедобавленный элемент.</summary>
  function add<T:class>(item: T): T; overload;

  ///<summary> Добавить помеченый элемент в список и вернуть свежедобавленный элемент.</summary>
  function add<T:class>(const tag: string; item: T): T; overload;

  /// <summary> Произвести сборку мусора с указанной меткой. </summary>
  procedure gc(const tag: string);
 end;

implementation

{$REGION 'TGarbageList'}
constructor TkaGarbageCollector.Create();
begin
 items := TObjectDictionary<TObject, string>.Create([doOwnsKeys]);
end;

destructor TkaGarbageCollector.Destroy;
begin
 items.free();

 inherited Destroy;
end;

function TkaGarbageCollector.add<T>(item: T): T;
begin
 result := add(DEFAULT_TAG, item);
end;

function TkaGarbageCollector.add<T>(const tag: string; item: T): T;
begin
 items.add(item, tag);
 result := item;
end;

procedure TkaGarbageCollector.gc(const tag: string);
var key: TObject;
    item: TPair<TObject, string>;
    gcList: TList<TObject>;
begin
 gcList := TList<TObject>.Create();
 try
  for item in items do
   begin
    if (item.Value = tag) then
     gcList.add(item.Key);
   end;

  for key in gcList do
   items.remove(key);
 finally
  gcList.free();
 end;
end;
{$ENDREGION}



Его можно применять начиная с Delphi 2009, так как он использует generics.

Применять вот так:
  gc := TkaGarbageCollector.Create();
  try
   log := gc.add(TLogStrings.Create());
   warnings := gc.add(TLogStrings.Create());
   partialTrips := gc.add(TLogStrings.Create());
  .... code ....
  finally
   gc.free();
  end;

ну сравни это с:
var
  FileStreamPtr: TScopedPtr<TFileStream>;
begin
  FileStreamPtr := TFileStream.Create('C:\1.data');
  FileStreamPtr.Value.WriteBuffer(..);
  ...
end;

у raii на рекордах в дельфи по сравнению с плюсами — есть ряд минусов

1) удобство использования.
у рекорда должно быть некое свойство Value для доступа к методам объекта
2) производительсность.
какой нить интерфейсы/варианты дают оверхед. Правда на уровне общей слабости дельфийского компилятора/RTL — это не так и важно.
3) невозможность реализовать что нить типа unique_ptr (http://en.wikipedia.org/wiki/Smart_pointer#unique_ptr). невозможно в компил тайм запретить присваивать один указатель другому. можно только в ран тайм просигнализировать об этом.

ну и если касается в дельфи7, то там невозможно создать универсальное решение, только затачиваться под конкретный класс.
а так, в целом пользоваться можно.
Для доступа к методам объекта используются методы record (или методы object в Delphi 7 и 2005)

По поводу оверхеда — да, это действительно так. Смысл статьи — показать, что кое–какие фичи в Delphi реализуемы и показать, куда копать

Кстати, System.Rtti.TValue — это как раз интерфейс в записи
>>Для доступа к методам объекта используются методы record (или методы object в Delphi 7 и 2005)
это работает только если твой врайпер заточен под строго определенный класс объектов. Для общего случая — это невозможно реализовать.
Действительно, для общего случая подойдёт только нетипизированный Variant Invoke.

Ещё одна слабо документированная фича Delphi pre-2010 — это RTTI, который включает в себя published свойства, поля и методы, посредством которой можно сделать AsDynamic в том числе и на старых версиях Delphi
Sign up to leave a comment.

Articles