C、C++、Java、Python介绍
C++、Java和Python都是面向对象的编程语言。其中C++和Java都是强类型语言,而Python是一种弱类型语言。
python比较容易学习,语法很简单,融入了很多现代编程语言的特性。python的库非常丰富,可以迅速地开发程序,无论是网站还是小游戏都非常方便。不过,python的脚本的运行效率较低,不适合对运行效率要求较高的程序。
Python是一种脚本语言。它更适合用来做算法。Python简单易学,对于新手来讲是编程入门的好选择。Python其实也是基于C++创造的,它们的区别主要体现在,C++效率高,编程难;Python效率低,编程简单。比如同样的事情,Python程序员可以很快的写出代码,但机器运行却可能需要成倍于C++的时间;反之,C++程序员编程实现的难度比较大,但在机器上的运行效率很高。因此,很多公司在核心的功能、需要大量运行的部分更倾向于选择C++,而在执行次数不多,但对写代码速度要求比较高的部分则更倾向于使用Python。
**(1)用途:**爬虫,Web开发,视频游戏开发,桌面GUIs(即图形用户页面),软件开发,架构等。
**(2)优势:**拥有强大的开源类库,开发效率高,作为Raspberry Pi等新型平台开发基础,易上手
**(3)缺点:**运行速度低于编译型语言,在移动计算领域乏力
Java的语法比较规则,采用严格的面向对象编程方法,同时有很多大型的开发框架,比较适合企业级应用。Java的学习曲线较长,不仅要学习语言相关的特性,还要面向对象的软件构造方法,在此之后要学习一些框架的使用方法。
(1)用途:**Android & IOS 应用开发,视频游戏开发,桌面GUIs(即图形用户页面),软件开发,架构等。
(2)优势:**市场对JAVA开发者需求旺盛,Android开发的基石,java跨平台实现一处编译多处执行,拥有强大的类库,Web开发(主流语言)。
**(3)缺点:**占用大量的内存,启动时间较长,不直接支持硬件级别的处理
3)C++: 需求效率的软件
C++更接近于底层,方便直接操作内存。C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
C++不仅是C和java特点的结合。实际上C++是多范式编程语言。它不仅支持传统的面向过程编程,也支持面向对象编程,最初C++发明的时候就叫做C with class (带类的C),随着时间推移,C++又接受了泛形编程的思想,像STL库就是一个例子。C++的语法风格不一而同,大部分人在写C++的时候还是当作带类的C来使用,其实C++可以写出像python一样现代的风格。C++运行效率较高,同时能够比较容易地建立大型软件,适合对效率要求高的软件,比如机器学习中的神经网络,大型游戏编程等等。C++的内容非常复杂,同时语言经过了几十年的演化,所以学习起来难度较大,开发效率较低。
在C语言的基础上,C++增加下面的内容:
(1)类型检查更加严格
(2)增加了面向对象机制
(3)增加了泛型编程的机制
(4)增加了函数重载和运算符重载。
(5)异常处理机制
(6)标准模板库STL。
C++的优点:
(1)代码可读性好。
(2)可重用性好。
(3)可移植。
(4)C++设计成无需复杂的程序设计环境
(5)运行效率高,高效安全
(6)语言简洁,编写风格自由。
(7)提供了标准库stl
(8)面向对象机制
(9)很多优秀的程序框架包括Boost、Qt、MFC、OWL、wxWidgets、WTL就是使用的C++。
C++的缺点:
(1)相对java来说,没有垃圾回收机制,可能引起内存设漏;
(2)内容较多较难,学起来相对困难;
**4)C: 操作系统及驱动
C是一种面向过程的语言。由于C++源于C,它良好的兼容了C功能,完全支持C,因此既可以面向对象、也可以面向过程。近几年又在此基础上发展出C#,C#使用起来更类似于Java。
(1)用途:操作系统,软件开发,硬件等
**(2)优势:**可移植性强,体型小巧,易镶入现代处理器,了解了C语言,相当于了解了编程语言的一切,支持硬件级别的处理
**(3)缺点:**不具备运行时检查机制,不支持面向对象编程,上手较难
4)C
C语言的优点:
1.面向过程的语言
C语言是面向过程的语言,在这里用户创建过程或函数来执行他们的任务。面向过程的语言是很容易学,因为它遵循的算法来执行你的语句。要使用面向过程的语言开发程序,你需要画/编写算法,然后开始转换成程序或功能。
2.拥有许多库
C语言中提供了大量的函数其中包括系统生成的函数和用户定义的函数。 C编译器自带的头文件,其中包括可用于开发程序的许多基本功能列表。同时,程序员还可以创建功能,按他们的要求被称为用户生成/定义的函数。
3.编译速度
C编译器产生的机器代码非常快相比其他语言的编译器。 C编译器可以在两秒编译约1000行代码。 C编译器的另一个好处是,它还优化了代码更快的执行速度
4.易学(语法是接近英语)
C语言的语法是很容易理解的。它使用关键字就像if, else, goto, switch, goto, main等。这类关键词,我们都在我们的日常生活使用的是传达意义或得到一些决定。
5.可移植
C语言的设置是大约3-5 MB。所以,你可以随身携带在你的软盘驱动器或随身碟这种语言。它非常易于安装和操作,又其输出是可以在任何一台电脑,没有任何其他的框架/软件执行的exe文件。
C是高度可移植的语言。这意味着,对于一台计算机编写的C程序可以在另一台计算机上轻松地运行而没有任何变化或做一个小的变化。
6.C语言为许多其他目前已知的语言构建模块。
C语言具有各种各样的数据类型和强大的操作符。由于这个原因,用C语言编写程序是高效,快速和易于理解。
7.只有32 ANSI C关键字和它的长度依赖于它的的内置函数。
有几个标准的函数可用于开发程序。
8.C的另一个重要优势是它能够扩展自己。
一个C程序基本上是那些由C库支持的功能集合,这让我们更容易对我们自己函数添加到C库中。
由于大量功能的可用性,编程任务变得简单。
9.C语言是一种结构化程序设计语言。
这使得用户能够想到一个问题中的功能模块或块的条款。这些模块的集合可以编写一个完整的程序。这种模块化结构,使程序调试,测试和维护变得更加容易。
C语言的缺点:
1.面向对象编程功能(OOPs)
面向对象编程的特点是C语言缺少的,你只能使用面向过程的语言来开发程序。C没有的OOPs概念,这就是为什么C ++被开发。
2.运行时类型检查是不可用
在C语言没有规定运行时类型检查,比如我传递浮点值,而接收参数为整数类型那么值将会被改变,它不会给任何类型的错误信息。
3.命名空间功能
C不提供的命名空间功能,让你是不能够在一个范围内再次使用相同的变量名。如果命名空间功能可用的话,那么你可以能够重复使用相同的变量名。
4.构造函数和析构函数不可用:
C不提供面向对象的特性,因此它不具有构造和析构功能。构造函数和析构函数用于构造对象和销毁对象。因此,在C语言中,你必须通过方法或者以其他方式来手动实现变量的析构和构造。
C、C++、Java比较
(1)指针:C++和C中都有指针的概念,C++还可以使用智能指针,boost库。指针可以理解为一个地址,可以由程序员使用指针直接拿到该地址的数据,但是由于指针在使用的过程中,如果没有处理好,容易出现空指针和野指针,带来一些麻烦,因此Java去掉了指针的功能,规避了指针使用中可能存在的混乱情况。
(2)封装:Java在C++的基础上又做了更高级的封装,具有良好的平台间的可移植性。C++一次编写到处编译,而Java一次编译到处运行。Java中的功能C++都能够实现,只是相对来说在编程方面会比较复杂一些。
(3)垃圾回收方面:C++需要程序员自己回收,对内存进行良好的管理,而Java则不需要程序员自己完成这个工作,有自己的垃圾回收机制。
(4)实现不同:比如C++把声明和实现分别放在头文件和源文件中,而Java则不使用头文件。C++引用其他内容时需要include,而Java则用package和import。
https://blog.csdn.net/xindoo/article/details/86561994
嵌入式这一行的顶峰就是驱动 如果你想在这一方面走下去 驱动也是你最终的目标 软件Linux C 软件+硬件 驱动
c/c++ ,shell,linux系统编程,系统移植,传感器,ARM,无线,各种编解码协议等等都得学,门槛是比上层纯软要高
https://blog.csdn.net/aotony_1988/article/details/52903776(面试问题)
1. 嵌入式绕不开各种接口
比如:uart 、spi、i2c、usb、eth、mipi、edp、can、i2s、hdmi等等。需要了解各接口的使用场景、带宽、机制、时序、工作模式、缺点,时序等等。我相信硬件接口这一块儿就会让很多新手摸不到头脑吧。
2. 嵌入式绕不开交叉编译工具
嵌入式一般都需要自己搭建交叉编译工具链,当然MCU类的开发也会有成熟的IDE可供使用。但是对于编译器而言一般都是GCC。对于嵌入式开发人员来说,搭建交叉编译工具链。编译过程分为 ——预编译、编译、汇编、链接。通过GCC提供的工具可以使程序完成任一阶段的处理。要清楚各个阶段主要完成了什么工作。链接分为静态链接、动态链接,各自的优缺点及使用场景要知道。同时编译生成ELF格式的文件,要理解ELF文件的格式、必要的时候需要通过objdump或readelf工具来解析ELF文件。
3. 嵌入式开发绕不开调试
嵌入式开发的很大一部分时间都在调试,好的调试方法和工具可以更快速的定位问题。
3.1 vargrind 的使用
3.2 gdb的使用
3.3 kdump
3.4 corddump
3.5 oops
4. 嵌入式开发离不开优化
嵌入式的优化分为两部分,算法上的优化,编程上的优化。其中编程上的优化分为以下技术。
4.1 内存使用上的优化-cacheline的使用
cache涉及到cache命中率、cache一致性,write-back,wrte-through等。全局变量问题、常用变量位置问题、互锁问题。
4.2 并行优化
并行优化主要是SIMT或SIMD技术的应用,包括GPU的使用,NEON优化、SSE优化等。
其中并行分为任务并行和数据并行、任务并行是多核方面的优势。数据并行是GPU和NEON来解决。
同时需要
4.3 依赖性问题
依赖性问题主要是流水线问题,避免数据的依赖性可以高效的使用流水线。至于这部分的优化要借助反汇编,来对比不同写法造成的差异。
5. 嵌入式绕不开驱动
很多人对驱动开发有技术情节,越是年轻的工程师越是这样。驱动的开发本质上就是给外设配置参数,使其工作在期望的方式。linux下的 驱动开发需要遵从linux的驱动框架,裸机的驱动开发就是直接配置寄存器就可以。
linux有一个很好的理念,就是万物皆文件。linux将外设也会抽象成文件,读写外设和读写文件在操作上没有了区别。
linux下的设备,分为字符型设备、块设备、网络设备。
linux下注册驱动的时候,将设备号和文件名进行了映射,并实现file_operation里的一些函数,例如,write、read、ioctl。其中write、read主要用于读写外设的有用数据。ioctl主要用于配置外设的一些参数,使其工作在不同的模式或状态。
6. 嵌入式离不开操作系统
其实嵌入式指的就是嵌入式操作系统,操作系统有很多种。vxworks、ucos、freertos、bios、linux、uclinux、nuttx等等。对于操作系统的选择个人感觉要看实时性、以及生态。生态很重要,这样出现问题的时候,才不至于绝望,感觉不是孤军奋斗。
其实操作系统的出现,主要是为了解决任务调度、内存管理。这两方面是操作系统的精髓。感兴趣可以阅读源码。ucos的源码不多,可以从它看起。
1.汇顶
工作职责:
1、 负责应用软件、操作系统框架、驱动软件、MCU固件或者单片机软件的开发;
2、 与硬件、固件、系统、应用软件等各方一起配合联调,完成整机方案开发;
3、 负责软件需求分析、设计,相关文档编写;
4、 负责软件性能的优化与Bug的修复;
5、 负责软件版本发布,以及项目上的集成调试;
任职资格:
1、学历要求:计算机、通信,信号相关专业,大学本科及以上学历;
2、熟练使用C/C++语言;
3、熟练掌握单片机及常见外设的工作原理;
4、熟悉数据结构、掌握一些常用的算法分析和设计方法;
5、熟悉数字、模拟电路,掌握基本的电路分析方法和仪器使用者优先;
6、熟悉Linux/Android驱动软件、应用软件或系统框架者优先;
7、有MCU、DSP、ARM、TEE、RTOS软件开发经验者优先;
8、有优秀的软件架构设计思想者优先;
9、具有优秀的沟通能力和团队协作能力。
2.其他嵌入式岗位信息:
岗位职责:
1. 参与产品需求分析、架构设计及优化;
2. 负责嵌入式软件模块的设计、开发、调试以及功能验证;
3. 配合硬件人员调试硬件板卡;
4. 负责技术相关文档的编写。
任职要求:
1. 电子、计算机、自动化,嵌入式等相关专业本科以上学历;两年以上嵌入式软件开
发工作经验;
2. 熟悉 C/C++编程语言;熟练掌握电子行业专业英语,能够熟练阅读相关器件英文数
据文档;
3. 具有赛灵思 ZYNQ 平台开发经验;至少熟悉 ARM、DSP、STM32、8051、MSP430 中一种
MCU 的结构和编程;
4. 至少熟悉一种操作系统;熟悉操作系统裁剪、移植、交叉编译;
5. 熟悉相关嵌入软件开发工具,如 SDK 或 SDSoc 、Keil 等开发工具;
6. 熟悉 Ethernet、USB、I2C、UART、SPI 等常用接口,最好开发过高速接口(如
SRIO、PCIE、JESD204),具备良好的设备驱动调试能力;
7. 开发过雷达相关设备优先,有硬件开发经验优先;
8. 细致、耐心、责任心强、思路清晰、开朗,逻辑思维好,有良好的团队协作能力,
身体健康,品行端正,有较强的学习能力、团队精神和良好的职业道德。
嵌入式软件工程师
岗位职责:
1、 参与嵌入式产品软件的需求分析、整体方案设计,协助制定具体项目研发计划;
2、主要负责嵌入式系统应用软件开发;
3、负责嵌入式系统软件的移植,性能优化、维护等;
4、负责嵌入式固件、软件版本的发布等;
任职要求:
1、大学本科以上学历,3年以上嵌入式行业工作经验,电子、计算机、通讯类专业毕业;
2、熟悉嵌入式系统及驱动开发方法,能熟练使用Linux操作系统及编译环境;
3、有丰富的实时操作系统总线开发经验,熟悉ARM体系架构,具有NXP/TI芯片开发经验者优先;
4、有SPI、Bluetooth、WIFI、Ethernet、USB、UART、I2C等开发经验者优先;
5、较好的英文阅读能力,能轻松读懂英文文档、文献等;
6、能够读懂硬件原理图;
7、具有一定的抗压能力,团队合作精神,较强的自学能力。
LinuxC/C++发展方向——知乎精彩回答收藏
链接:https://www.zhihu.com/question/22608820/answer/26095225
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
lable1:
列一下写服务端需要的基本知识点吧:
1. 网络通信:最低要求能理解 Tcp 是流,Udp 是包,并会创建连接通信,写 epoll 的程序。
1.1 进阶可以看 《TCP/IP详解》。
2. 多线程编程:最低要求理解为啥要用锁,并且学会用锁。
2.1 进阶可以研究一下各种不同的锁,比如读写锁、自旋锁等;
2.2 再可以研究一下 Lock-Free;
2.3 也可以玩一下协程;
3. 数据库:最少会读会写,优化可以交给 DBA (什么你们没 DBA?那么自己点 DBA 技能吧)
4. 了解 HTTP 协议等一些你的工作范围可能用到的协议;
5. 学会使用库和其他语言写的服务交互;
比如 Redis* 上面这些是写服务器的基础技能,不需要进阶就可以先写* 如果想点 Linux 专精,平时在 Linux 下工作,弄本 《Linux 编程》之类的书学习。PS:可以考虑在 Windows 下用 VS 写,使用 Boost 之类的跨平台库写代码,直接拿到 Linux 下编译就可以了,比较省心,毕竟最新的 VS 有很多好用的功能。不过,偶尔会碰到没跨平台库的情况。学会基本,就可以自己写代码练习了,比如自己写个高性能 Web 服务器之类的。写代码没捷径,只有做工程,多写。
6.最后,服务端编程最重要的其实是设计能力,多看看别人的代码,一定要理解别人的设计思想哦!PS 2: 然后,花一周学会 Java 服务端开发,就能来公司上班了。(花式逃~~~~
lable2:
根据工程经验来看,LinuxC/C++这个方向主要强调性能,高并发,稳定性这些因素,重点在后端。如果你对前端内容不是特别敏感(所谓的美),后端是你的强项,大数据,云存储,云计算都与linux后端有密切关系。内容:语言(c/c++),算法(强调性能),linux系统编程及内核原理(才知道如何调优),网络。这是基础。然后就是具体的方向,例如高并发服务器?大数据?完全根据你自己的定位。
lable3:
//1.精通C++,STL,Linux等,熟悉设计模式;熟悉常用的数据结构、算法
//2.熟练掌握一门脚本语言(Lua, Python, Perl等);
//3.对多线程环境编程有一定的理解,能独立完成服务器端模块的开发、维护和优化;
//4.熟练掌握MySQL数据库的开发维护、性能优化;精通数据库设计;
//5.熟悉TCP/IP协议,精通Socket协议,了解分布式负载和集群类型的服务器框架结构;
//6.精通网络编程并有高并发系统的开发经验;