языки программирования

На чем работаете и что ОБЪЕКТИВНО вы считаете перспективным

Работаю на C# и считаю этот язык преспективным
9
8%
Работаю на C# и считаю этот язык преспективным
9
8%
Работаю на C#, но не против перейти на Java
2
2%
Работаю на C#, но не против перейти на Java
2
2%
Работаю на С#, но не против перейти на PHP или Ruby
1
1%
Работаю на С#, но не против перейти на PHP или Ruby
1
1%
Работаю на Java и считаю этот язык перспективным
12
11%
Работаю на Java и считаю этот язык перспективным
12
11%
Работаю на Java, но не против перейти на C#
0
No votes
Работаю на Java, но не против перейти на C#
0
No votes
Работаю на Java, но не против перейти на PHP или Ruby
0
No votes
Работаю на Java, но не против перейти на PHP или Ruby
0
No votes
Работаю на PHP или Ruby, и считаю этот язык перспективным
2
2%
Работаю на PHP или Ruby, и считаю этот язык перспективным
2
2%
Работаю на PHP или Ruby, но не против перейти на C#
1
1%
Работаю на PHP или Ruby, но не против перейти на C#
1
1%
Работаю на PHP или Ruby, но не против перейти на Java
3
3%
Работаю на PHP или Ruby, но не против перейти на Java
3
3%
Другое
26
23%
Другое
26
23%
 
Total votes: 112

User avatar
Medium-rare
Уже с Приветом
Posts: 9195
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: языки программирования

Post by Medium-rare »

crypto5 wrote: Да, код обычно проясняет все абстрактные ворпосы.
С пару месяцев назад пробовал, всё что мог, в новом C++ 11. Это header для некоего подобия cron. Action есть назначается ScheduleItem, который хранится по значению в векторе, но при копировании ScheduleItem, Action перемещается. A bit complicated, но вот хотелось подменять Action "на лету". В приниципе можно было организовать вместо std::vector<ScheduleItem> m_vctSchedule; какой-то std::vector< unique_ptr<ScheduleItem> > m_vctSchedule; Ну или take care of Action while copying ScheduleItem, который имеет unique_ptr<Action>.

Code: Select all

#include <string>
#include <atomic>
#include <mutex>
#include <vector>
#include <ctime>
#include <chrono>
#include <memory>
#include <future>
#include <functional>
#include <condition_variable>


namespace cpp11_fubar
{

class SchedulerControlInterface
{
public:
	virtual void stop() = 0;
	// virtual void notify_complete() = 0;
};

struct Result
{
	typedef enum
	{
		WaitingOnStart,
		Started,
		FinishedOk,
		Terminated,
		FailedToStart
	}
	completionCode;

	Result(completionCode code = WaitingOnStart) : m_completionCode(code) {}
	const completionCode getCompletion() {return m_completionCode;}
	const std::string getInfo() {return m_info;}
	completionCode m_completionCode;
	std::string m_info;
};

typedef SchedulerControlInterface* SI;

class Action
{
public:
	Action(const std::string& info, std::function<void (SI)> function) :
		m_info(info), m_function(function) {}

	std::function<void (SI)> m_function;
	const Result& getResult() {return m_result;}

	void setResultCode(Result::completionCode code) {m_result.m_completionCode = code;}
	void setResultInfo(const std::string& info) {m_result.m_info = info;}

	std::string getResultInfo() {return m_info;};
protected:
	Result m_result;
	std::string m_info;
};

class ScheduleItem
{
public:
	ScheduleItem(std::chrono::time_point<std::chrono::system_clock> pt, Action* action) :
		m_point_in_time(pt), m_action(action) {}

	std::chrono::time_point<std::chrono::system_clock> m_point_in_time;
    std::unique_ptr<Action> m_action;

	// move constructor
	ScheduleItem(ScheduleItem&& item) {operator=(item);}

	// copy constructor does 'move' too
	ScheduleItem(const ScheduleItem& item) {operator=(const_cast<ScheduleItem&>(item));}

	// copy operator (acts as move for unique_ptr)
	ScheduleItem& operator=(ScheduleItem& item)
	{
		// dealing with move for unique_ptr
		m_action = std::move(item.m_action);
		m_point_in_time = item.m_point_in_time;
		return *this;
	}
};

class Scheduler : public SchedulerControlInterface
{
public:
    Scheduler();
    virtual ~Scheduler();

    std::future<Result> start();
    void stop();

	void consumeSchedule(std::vector<ScheduleItem>&);
    void consumeSchedule(const std::string& xmlStr);

    void tick();

private:
    std::atomic<bool> m_bContinue;
    std::mutex  m_mtx;
    std::condition_variable m_FinishCondVar;

    std::vector<ScheduleItem> m_vctSchedule;

    Result loopThruTimes();
};

}
... and even then it's rare that you'll be going there...
User avatar
M. Ridcully
Уже с Приветом
Posts: 12017
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: языки программирования

Post by M. Ridcully »

nightmare2 wrote:Все это можно было бы решить через стандартизацию библиотек/фреймворков.
Вот только никому это не надо, да и сложно это сделать для всех ОС.
Поэтому и неудобен он для писания большинства тривиальных бизнес приложений.
С этим я скорее соглашусь.

Всё замечательно, гогда все в команде придерживаются одного стиля и пишут на хорошем C++. Но редко какая программа живёт в вакууме, и вот при взаимодействии со всякими 3rd-parties цирк и начинается. Чувствуешь себя полным идиотом, когда приходится в XXI веке писать, к примеру, код по конвертации строк из одного дебильного формата в другой (разумеется, кадый из разработчиков этих библиотек считал, что его строки самые строчные строки в мире).

По поводу умных указателей - на одной работе, помнится, моей первой задачей было утечку найти. Оказалось, что кто-то чуток не так использовал CComBSTR (это smart pointer для строк в COMе, кто не в курсе). Так что smart pointers тоже не панацея, если не уметь ими пользоваться.

Справедливости ради, у нас сейчас веб-погромисты по полной огребают проблемы с памятью с garbage collected JavaScript & ActionScript. Причём на такие танцы с бубном им приходится идти, от которых у непосвящённых (вроде меня) волосы дыбом встают и сложности речного управления памятью с malloc/free кажутся игрой в кубики для трёхлеток. Так что думать всегда надо.

Кстати, не понял, как это smart pointers могут быть настолько медленными, что их с GC сравниваете тут? Даже самому захотелось померять...
Мир Украине. Свободу России.
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: языки программирования

Post by Интеррапт »

M. Ridcully wrote: Кстати, не понял, как это smart pointers могут быть настолько медленными, что их с GC сравниваете тут? Даже самому захотелось померять...
По массе причин. Например, reference counting - это довольно дорогостоящая операция (особенно с синхронизацией). GC может удалить сразу много обьектов, а это как правило более эффективно, чем когда много мелких обьектов удаляются один за другим по ходу выполнения кода (как в случае со смарт поинтерами). И еще всякие аспекты.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15526
Joined: 27 Sep 2007 22:53

Re: языки программирования

Post by Мальчик-Одуванчик »

M. Ridcully wrote: Кстати, не понял, как это smart pointers могут быть настолько медленными, что их с GC сравниваете тут? Даже самому захотелось померять...
Управление памятью штатными средствами С++ достаточно нееффективно.
Собственно умные указатели с семантикой переноса а так же R-value reference и есть один из способов оптимизации в этом направлении.
User avatar
Medium-rare
Уже с Приветом
Posts: 9195
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: языки программирования

Post by Medium-rare »

std::shared_ptr, с его подсчётом ссылок, как и его шестёрочный тип std::weak_ptr вовсе не должны быть часто используемы. Только для интерфейсного кода. Вот std::unique_ptr и есть star of the show, оборачивайте в него всё, что динамически выделяется. И будет вам щастье и быстрый безопасный код.
... and even then it's rare that you'll be going there...

Return to “Вопросы и новости IT”