2024年10月电脑常用的编程软件有哪些?自学编程软件有哪些

 更新时间:2024-10-12

  ⑴电脑常用的编程软件有哪些?自学编程软件有哪些

  ⑵多线程程序不是不能调用fork(),b:运行一个多线程的进程,三:多线程服务器的常用编程模型大概有这么几种:a:每个请求创建一个线程,即non-blockingIO+oneloopperthread模式来编写多线程C++网络服务程序,程序里的每个IO线程有一个eventloop,而是这么做会遇到很多麻烦:fork一般不能在多线程程序中调用,子进程内部只存在一个线程,如果父进程中的某个线程占有锁。

  ⑶电脑常用的编程软件有哪些

  ⑷常用的编程软件有:Visualstudio、WebStrom、PhpStorm、Notepad++、EditPlus、SublimeText等。

  ⑸Visualstudio

  ⑹Visualstudio是一款由美国微软公司开发的开发工具集,简称VS,它包括了整个软件的生命周期所需要的大部分工具,比如UML工具,代码管控工具,集成开发环境IDE等等。

  ⑺WebStrom是jetbrains公司旗下的一款JavaScript开发工具,目前被广大的中国JS开发者誉为“Web前端开发神器“,“最强大的HTML编辑器“和“最智能的JavaScriptIDE“等。

  ⑻PhpStormPhpStorm是一个专业轻量级且便捷的PHPIDE,旨在提供了用户效率,可深刻理解用户的编码,提供智能的代码补全,快速导航以及即时错误检查等等强大的功能。

  ⑼Notepad++Notepad++,能够支持种编程语言,比如C,C++,Java,C#,XML,HTML,PHP,JavaScript等等,是程序员必备的文本编辑器,比起微软的记事本,它小巧高效,是个不错的选择。

  ⑽EditPlusEditPlus是一款由韩国SangilKim出品的小巧而功能强大的可处理文本,HTML和程序语言的Windows编辑器,可以通过设置用户工具将其作为C,Java,PHP等等语言的一个简单的IDE

  ⑾SublimeTextSublimeText是一款代码编辑器,是HTML和散文先进的文本编辑器。具有漂亮的用户界面以及强大的功能,比如代码缩略图,Python插件,代码段等。

  ⑿桌面、效率工具Onenote

  ⒀onenote就像纸质的笔记本。收集资料、知识管理、强悍的复制图像的文字,简直是好用到不怎么需要介绍。

  ⒁阅读/编写代码:Notepad++

  ⒂毫不夸张地讲,至少有、%的程序员用过这款工具。这款编辑器确实挺好的,支持代码高亮显示,而且适用于多种语言,有ada,php,java.c#,c++等。

  ⒃sublimetext

  ⒄SublimeText在OSX、Linux和Windows三大平台都可以使用。

  ⒅这款代码编辑器拥有多选、宏、代码片段等功能,并且还有极具特色的Minimap。

  ⒆编写代码:SourceInsight

  ⒇编写代码除了使用Notepad++之外,也可以选择SourceInsight。

  ⒈它是一个非常强大的强大的程序编辑器。可快速访问源代码和源信息的功能。

  ⒉程序员做流程图的软件,很少有几款可以和Visio媲美的。它可以将复杂信息、系统和流程可视化、分析,受到大量程序员的喜爱。

  ⒊我想学编程,请问该怎么入门

  ⒋一:确定一个方向,编程语言太多了:java、C++、python、PHP、C等,需要确定方向,从基础学起,建议零基础学编程的小伙伴从C语言开始学起,C语言入门比较简单,会提升自信心。

  ⒌二:自学编程入门一定要阶段性的看到成果,这个“成果”并不是在“黑匣子”里面实现,要在用户展现界面呈现,很容易提升信心。

  ⒍三:视频和图书同步查阅,网上的是鱼龙混珠,建议找一些免费的学编程入门的初级视频进行学习,最好是成套视频,如果条件允许也可以购买一套编程入门的视频资料。

  ⒎四:计算机编程入门一定要理论和实践相结合只有这样才能真正学好

  ⒏五:如果你有会编程的好朋友,多请教请教他,能让他带带你就是最好不过的了。

  ⒐如何看懂《Linux多线程服务端编程

  ⒑一:进程和线程每个进程有自己独立的地址空间。“在同一个进程”还是“不在同一个进程”是系统功能划分的重要决策点。《Erlang程序设计》[ERL]把进程比喻为人:每个人有自己的记忆(内存,人与人通过谈话(消息传递来交流,谈话既可以是面谈(同一台服务器,也可以在电话里谈(不同的服务器,有网络通信。面谈和电话谈的区别在于,面谈可以立即知道对方是否死了(crash,SIGCHLD,而电话谈只能通过周期性的心跳来判断对方是否还活着。有了这些比喻,设计分布式系统时可以采取“角色扮演”,团队里的几个人各自扮演一个进程,人的角色由进程的代码决定(管登录的、管消息分发的、管买卖的等等。每个人有自己的记忆,但不知道别人的记忆,要想知道别人的看法,只能通过交谈(暂不考虑共享内存这种IPC。然后就可以思考:·容错:万一有人突然死了·扩容:新人中途加进来·负载均衡:把甲的活儿挪给乙做·退休:甲要修复bug,先别派新任务,等他做完手上的事情就把他重启等等各种场景,十分便利。线程的特点是共享地址空间,从而可以高效地共享数据。一台机器上的多个进程能高效地共享代码段(操作系统可以映射为同样的物理内存),但不能共享数据。如果多个进程大量共享内存,等于是把多进程程序当成多线程来写,掩耳盗铃。“多线程”的价值,我认为是为了更好地发挥多核处理器(multi-cores)的效能。在单核时代,多线程没有多大价值(个人想法:如果要完成的任务是CPU密集型的,那多线程没有优势,甚至因为线程切换的开销,多线程反而更慢;如果要完成的任务既有CPU计算,又有磁盘或网络IO,则使用多线程的好处是,当某个线程因为IO而阻塞时,OS可以调度其他线程执行,虽然效率确实要比任务的顺序执行效率要高,然而,这种类型的任务,可以通过单线程的”non-blockingIO+IOmultiplexing”的模型(事件驱动来提高效率,采用多线程的方式,带来的可能仅仅是编程上的简单而已。AlanCox说过:”Aputerisastatemachine.Threadsareforpeoplewhocan’tprogramstatemachines.”(计算机是一台状态机。线程是给那些不能编写状态机程序的人准备的如果只有一块CPU、一个执行单元,那么确实如AlanCox所说,按状态机的思路去写程序是最高效的。二:单线程服务器的常用编程模型据我了解,在高性能的网络程序中,使用得最为广泛的恐怕要数”non-blockingIO+IOmultiplexing”这种模型,即Reactor模式。在”non-blockingIO+IOmultiplexing”这种模型中,程序的基本结构是一个事件循环(eventloop,以事件驱动(event-driven和事件回调的方式实现业务逻辑:[cpp]viewplaincopy//代码仅为示意,没有完整考虑各种情况while(!done){inttimeout_ms=max(,getNextTimedCallback());intretval=poll(fds,nfds,timeout_ms);if(retval《){处理错误,回调用户的errorhandler}else{处理到期的timers,回调用户的timerhandlerif(retval》){处理IO事件,回调用户的IOeventhandler}}}这里select()/poll()有伸缩性方面的不足(描述符过多时,效率较低,Linux下可替换为epoll(),其他操作系统也有对应的高性能替代品。Reactor模型的优点很明显,编程不难,效率也不错。不仅可以用于读写socket,连接的建立(connect()/aept()),甚至DNS解析都可以用非阻塞方式进行,以提高并发度和吞吐量(throughput),对于IO密集的应用是个不错的选择。lig基于事件驱动的编程模型也有其本质的缺点,它要求事件回调函数必须是非阻塞的。对于涉及网络IO的请求响应式协议,它容易割裂业务逻辑,使其散布于多个回调函数之中,相对不容易理解和维护。三:多线程服务器的常用编程模型大概有这么几种:a:每个请求创建一个线程,使用阻塞式IO操作。在Java.引人NIO之前,这是Java网络编程的推荐做法。可惜伸缩性不佳(请求太多时,操作系统创建不了这许多线程。b:使用线程池,同样使用阻塞式IO操作。与第种相比,这是提高性能的措施。c:使用non-blockingIO+IOmultiplexing。即JavaNIO的方式。d:Leader/Follower等高级模式。在默认情况下,我会使用第种,即non-blockingIO+oneloopperthread模式来编写多线程C++网络服务程序。:oneloopperthread此种模型下,程序里的每个IO线程有一个eventloop,用于处理读写和定时事件(无论周期性的还是单次的。代码框架跟“单线程服务器的常用编程模型”一节中的一样。libev的作者说:Oneloopperthreadisusuallyagoodmodel.Doingthisisalmostneverwrong,sometimesabetter-performancemodelexists,butitisalwaysagoodstart.这种方式的好处是:a:线程数目基本固定,可以在程序启动的时候设置,不会频繁创建与销毁。b:可以很方便地在线程间调配负载。c:IO事件发生的线程是固定的,同一个TCP连接不必考虑事件并发。Eventloop代表了线程的主循环,需要让哪个线程干活,就把timer或IOchannel(如TCP连接注册到哪个线程的loop里即可:对实时性有要求的connection可以单独用一个线程;数据量大的connection可以独占一个线程,并把数据处理任务分摊到另几个计算线程中(用线程池;其他次要的辅助性connections可以共享一个线程。比如,在dbproxy中,一个线程用于专门处理客户端发来的管理命令;一个线程用于处理客户端发来的MySQL命令,而与后端数据库通信执行该命令时,是将该任务分配给所有事件线程处理的。对于non-trivial(有一定规模的服务端程序,一般会采用non-blockingIO+IOmultiplexing,每个connection/aeptor都会注册到某个eventloop上,程序里有多个eventloop,每个线程至多有一个eventloop。多线程程序对eventloop提出了更高的要求,那就是“线程安全”。要允许一个线程往别的线程的loop里塞东西,这个loop必须得是线程安全的。在dbproxy中,线程向其他线程分发任务,是通过管道和队列实现的。比如主线程aept到连接后,将表示该连接的结构放入队列,并向管道中写入一个字节。计算线程在自己的eventloop中注册管道的读事件,一旦有数据可读,就尝试从队列中取任务。:线程池不过,对于没有IO而光有计算任务的线程,使用eventloop有点浪费。可以使用一种补充方案,即用blockingqueue实现的任务队列:[cpp]viewplaincopytypedefboost::function《void()》Functor;BlockingQueue《Functor》taskQueue;//线程安全的全局阻塞队列//计算线程voidworkerThread(){while(running)//running变量是个全局标志{Functortask=taskQueue.take();//thisblockstask();//在产品代码中需要考虑异常处理}}//创建容量(并发数为N的线程池intN=num_of_puting_threads;for(inti=;i《N;++i){create_thread(&workerThread);//启动线程}//向任务队列中追加任务Foofoo;//Foo有calc()成员函数boost::function《void()》task=boost::bind(&Foo::calc,&foo);taskQueue.post(task);除了任务队列,还可以用BlockingQueue《T》实现数据的生产者消费者队列,即T是数据类型而非函数对象,queue的消费者从中拿到数据进行处理。其实本质上是一样的。:总结总结而言,我推荐的C++多线程服务端编程模式为:one(event)loopperthread+threadpool:eventloop用作IOmultiplexing,配合non-blockingIO和定时器;threadpool用来做计算,具体可以是任务队列或生产者消费者队列。以这种方式写服务器程序,需要一个优质的基于Reactor模式的网络库来支撑,muduo正是这样的网络库。比如dbproxy使用的是libevent。程序里具体用几个loop、线程池的大小等参数需要根据应用来设定,基本的原则是“阻抗匹配”(解释见下,使得CPU和IO都能高效地运作。所谓阻抗匹配原则:如果池中线程在执行任务时,密集计算所占的时间比重为P(《P《=),而系统一共有C个CPU,为了让这C个CPU跑满而又不过载,线程池大小的经验公式T=C/P。(T是个hint,考虑到P值的估计不是很准确,T的最佳值可以上下浮动%以后我再讲这个经验公式是怎么来的,先验证边界条件的正确性。假设C=,P=.,线程池的任务完全是密集计算,那么T=。只要个活动线程就能让个CPU饱和,再多也没用,因为CPU资源已经耗光了。假设C=,P=.,线程池的任务有一半是计算,有一半等在IO上,那么T=。考虑操作系统能灵活合理地调度sleeping/writing/running线程,那么大概个“%繁忙的线程”能让个CPU忙个不停。启动更多的线程并不能提高吞吐量,反而因为增加上下文切换的开销而降低性能。如果P《.,这个公式就不适用了,T可以取一个固定值,比如*C。另外,公式里的C不一定是CPU总数,可以是“分配给这项任务的CPU数目”,比如在核机器上分出个核来做一项任务,那么C=。四:进程间通信只用TCPLinux下进程间通信的方式有:匿名管道(pipe)、具名管道(FIFO)、POSIX消息队列、共享内存、信号(signals),以及Socket。同步原语有互斥器(mutex)、条件变量(conditionvariable)、读写锁(reader-writerlock)、文件锁(recordlocking)、信号量(semaphore)等等。进程间通信我首选Sockets(主要指TCP,我没有用过UDP,也不考虑Unixdomain协议。其好处在于:可以跨主机,具有伸缩性。反正都是多进程了,如果一台机器的处理能力不够,很自然地就能用多台机器来处理。把进程分散到同一局域网的多台机器上,程序改改host:port配置就能继续用;TCPsockets和pipe都是操作文件描述符,用来收发字节流,都可以read/write/ftl/select/poll等。不同的是,TCP是双向的,Linux的pipe是单向的,进程间双向通信还得开两个文件描述符,不方便;而且进程要有父子关系才能用pipe,这些都限制了pipe的使用;TCPport由一个进程独占,且进程退出时操作系统会自动回收文件描述符。因此即使程序意外退出,也不会给系统留下垃圾,程序重启之后能比较容易地恢复,而不需要重启操作系统(用跨进程的mutex就有这个风险;而且,port是独占的,可以防止程序重复启动,后面那个进程抢不到port,自然就没法初始化了,避免造成意料之外的结果;与其他IPC相比,TCP协议的一个天生的好处是“可记录、可重现”。tcpdump和Wireshark是解决两个进程间协议和状态争端的好帮手,也是性能(吞吐量、延迟分析的利器。我们可以借此编写分布式程序的自动化回归测试。也可以用tcpcopy之类的工具进行压力测试。TCP还能跨语言,服务端和客户端不必使用同一种语言。分布式系统的软件设计和功能划分一般应该以“进程”为单位。从宏观上看,一个分布式系统是由运行在多台机器上的多个进程组成的,进程之间采用TCP长连接通信。使用TCP长连接的好处有两点:一是容易定位分布式系统中的服务之间的依赖关系。只要在机器上运行stat-tpna|grep《port》就能立刻列出用到某服务的客户端地址(ForeignAddress列,然后在客户端的机器上用stat或lsof命令找出是哪个进程发起的连接。TCP短连接和UDP则不具备这一特性。二是通过接收和发送队列的长度也较容易定位网络或程序故障。在正常运行的时候,stat打印的Recv-Q和Send-Q都应该接近,或者在附近摆动。如果Recv-Q保持不变或持续增加,则通常意味着服务进程的处理速度变慢,可能发生了死锁或阻塞。如果Send-Q保持不变或持续增加,有可能是对方服务器太忙、来不及处理,也有可能是网络中间某个路由器或交换机故障造成丢包,甚至对方服务器掉线,这些因素都可能表现为数据发送不出去。通过持续监控Recv-Q和Send-Q就能及早预警性能或可用性故障。以下是服务端线程阻塞造成Recv-Q和客户端Send-Q激增的例子:[cpp]viewplaincopy$stat-tnProtoRecv-QSend-QLocalAddressForeigntcp...:...:#服务端连接tcp...:...:#客户端连接tcp...:...:五:多线程服务器的适用场合如果要在一台多核机器上提供一种服务或执行一个任务,可用的模式有:a:运行一个单线程的进程;b:运行一个多线程的进程;c:运行多个单线程的进程;d:运行多个多线程的进程;考虑这样的场景:如果使用速率为MB/s的数据压缩库,进程创建销毁的开销是微秒,线程创建销毁的开销是微秒。如何执行压缩任务?如果要偶尔压缩GB的文本文件,预计运行时间是s,那么起一个进程去做是合理的,因为进程启动和销毁的开销远远小于实际任务的耗时。如果要经常压缩kB的文本数据,预计运行时间是ms,那么每次都起进程似乎有点浪费了,可以每次单独起一个线程去做。如果要频繁压缩kB的文本数据,预计运行时间是微秒,那么每次起线程似乎也很浪费,不如直接在当前线程搞定。也可以用一个线程池,每次把压缩任务交给线程池,避免阻塞当前线程(特别要避免阻塞IO线程。由此可见,多线程并不是万灵丹(silverbullet)。:必须使用单线程的场合据我所知,有两种场合必须使用单线程:a:程序可能会fork();实际编程中,应该保证只有单线程程序能进行fork()。多线程程序不是不能调用fork(),而是这么做会遇到很多麻烦:fork一般不能在多线程程序中调用,因为Linux的fork只克隆当前线程的threadofcontrol,不可隆其他线程。fork之后,除了当前线程之外,其他线程都消失了。这就造成一种危险的局面。其他线程可能正好处于临界区之内,持有了某个锁,而它突然死亡,再也没有机会去解锁了。此时如果子进程试图再对同一个mutex加锁,就会立即死锁。因此,fork之后,子进程就相当于处于signalhandler之中(因为不知道调用fork时,父进程中的线程此时正在调用什么函数,这和信号发生时的场景一样,你不能调用线程安全的函数(除非它是可重入的,而只能调用异步信号安全的函数。比如,fork之后,子进程不能调用:malloc,因为malloc在访问全局状态时几乎肯定会加锁;任何可能分配或释放内存的函数,比如snprintf;任何Pthreads函数;printf系列函数,因为其他线程可能恰好持有stdout/stderr的锁;除了mansignal中明确列出的信号安全函数之外的任何函数。因此,多线程中调用fork,唯一安全的做法是fork之后,立即调用exec执行另一个程序,彻底隔断子进程与父进程的联系。在多线程环境中调用fork,产生子进程后。子进程内部只存在一个线程,也就是父进程中调用fork的线程的副本。使用fork创建子进程时,子进程通过继承整个地址空间的副本,也从父进程那里继承了所有互斥量、读写锁和条件变量的状态。如果父进程中的某个线程占有锁,则子进程同样占有这些锁。问题是子进程并不包含占有锁的线程的副本,所以子进程没有办法知道它占有了哪些锁,并且需要释放哪些锁。尽管Pthread提供了pthread_atfork函数试图绕过这样的问题,但是这回使得代码变得混乱。因此《ProgrammingWithPosixThreads》一书的作者说:”Avoidusingforkinthreadedcodeexceptwherethechildprocesswillimmediatelyexecanewprogram.”。b:限制程序的CPU占用率;这个很容易理解,比如在一个核的服务器上,一个单线程程序即便发生busy-wait,占满个core,其CPU使用率也只有.%,在这种最坏的情况下,系统还是有.%的计算资源可供其他服务进程使用。因此对于一些辅助性的程序,如果它必须和主要服务进程运行在同一台机器的话,那么做成单线程的能避免过分抢夺系统的计算资源。

您可能感兴趣的文章:

相关文章