一、PHP学习去哪家机构比较好?
作为一个十几年的老PHPER和这么多年常年招聘面试的经历,我说一下我对PHP培训机构的看法。(5年内面过的培训机构毕业的“phper”录取率肯定不到十分之一)
首先,在你去某机构学习PHP之前还会什么,这个很重要。PHP上手太容易,是一个比较容易被培训机构忽悠的领域。确实他们说的没错,那些语法、功能、框架什么的确实能让人很快学会,并且很快能CV出一个看得出来能用的东西。但真正的开发团队肯定需要编程能力,要知道程序员真正的价值在于写出来以前不存在的东西,而不是复制粘贴。所以如果算法+数据结构底子太差的话只学了PHP+JS起不了什么作用。
其次,开发语言是“学”不会的,只能是被用会的。如果同样教育背景、工作态度的两个人,我肯定会选自己开发过东西的。如果自己做过什么东西, 哪怕是因为兴趣自己做的几个阅读列表,甚至啊片分类工具什么的,我都会认为这个人是真正爱好变成的,基础神马的不重要,这种人因为自驱力比较强,一定是学东西很快的,是愿意培养的对象。
结论就是选择培训机构时需要关注:
1.这个机构是能真正教你“编程”的还是只教框架、二次开发、复制粘贴的,如果是后者后面的出路也只能是一些烂地方,好团队的科班出身老油条面试官一个问题就能识破华而不实的外皮;
2.是否能真正教你从头到尾写一个感兴趣的,至少自己爱用的小产品,而不是“攒”一个。也不是大家前篇一律几十人写一模一样的东西,例如一个十年前流行老论坛。
再说一下我学PHP的经历,我大学刚毕业的时候做了一名JAVA程序员,也就一个多月吧,可以说JAVA也没用熟的时候项目团队解散了,我就被分配到了一个新的项目组,做了全公司唯一一名PHP程序员。当时没人可以教我,也没有培训,当时网上有营养的交流也不多,大学同学们也没人用这东西。我就只能翻着手册解决一个又一个的问题。不到两个星期我觉得已经能像开始用JAVA那样用着顺手了,基本的东西都会了,不会的函数再查手册就OK了。我的经历不见得对你有用,只是因为我先对别的几种编程语言很熟,所以自学起来没那么吃力。另一个原因就是我一直在解决实际的问题,而不是在“学PHP”。
二、有没有学习PHP的实训网站?求推荐?
PHP专业是比较热门的一门学科,不少人看到这个机会想要学习PHP,在众多语言当中,个人感觉php应该是比较容易容易学的编程语言了。
目前学习的方式有两种,可以自学,也可以报培训班。自学就是花的时间长,要有一定的自控能力,自己能坚持;报培训班有老师带和监督,学习更容易一些,不过也会付出一定的费用。
之前我的技术同事有跟我讲过EduCoder实践教学平台,可以自己学,自己练,自己测。平台上涵盖10000个实训案例、200套课程资源包、22000个技能评测点,比培训班强悍太多了。
三、在武汉友没有什么好的培训机构学习php?
首先,作为一个自学了一段时间的人来讲这个问题,感觉还蛮合理的,自学期间,找了韩顺平、长乐未央ITFun、高洛峰等看,而那些一上来就说自学好的,回答过于片面,其一,自学是要连续好几个月全天的坚持,那种耐心不是常人可比的,然后遇到问题又不好剞劂,那种焦虑非常难受,而且还阻碍学习的进度。最后还是决定报了班,不过开始也是比较担心的,毕竟要花些钱报名了。
我不评价任何培训机构,因为很容易被说成是水军。最没想到的是韩老师的机构不办了,可惜了,应该算是行业中通俗易懂的教程之一吧,当时最想去的就是韩老师的。去了几家的试听,对比了一下,具体那几个机构我们就不点名了,最后决定跑到二线城市武汉的长乐未央ITFun报了一个班,也是我看了教程之后被打动了,教程内容也是属于行业中通俗易懂的教程之一吧,也终于学完了。
最后,来句忠告,最好自己去实地听,千万别被忽悠先交钱再培训,毕竟都是成年人了,有时冲动会带惩罚的,一定一定要多写代码,因为编程这个东西熟能生巧,而且还要带有思想去写。
四、学PHP最快要多久? 学习路线?要不要报培训班?
嗯,对于PHP,我不是专家; 但对于如何学PHP, 我是专家.
我从四个方面来阐述!
- 学PHP最快的话,要多长时间?
- 高效的学习方法
- 具体的学习路线
- 自学和培训的异同
--稍等一会,教室有学员问问题.----
--回来继续 ---
一: 学PHP最快的话,要多长时间?
没有前提条件的问题讨论,只会变成无意义的争吵.
因此先设定两个前提:
前提1.学员基础为"没有任何程序语言基础",能"熟练操作电脑(打键盘,建目录等)".
前提2."学会PHP"是指走上了PHP正式工作岗位.
在此前提下,无论自学,还是培训,学习PHP的正常速度是4个月;极限速度是:2个月!
一位叫"星罗"的同学,2013年,用56天的时间自学,拿到offer.现在在南京工作.
"星罗"每天的学习时间为16个小时.
这里有他的学习和面试过程:
面试那些事[一]面试那些事[二]面试那些事[三]2年来,数百位基础参差的学员,高中毕业/古文专业/英语专业/车床工人/保安/张家口的矿工...等等,
他们用2个月的时间,从
布尔教育,走上工作PHP岗位.
最快的一位同学是49天,他们每天学习时间是12到14小时.
2个月这么短,怎么可能学会?
其实你应该反过来问: 2个月为什么学不会?
奥运会追求的,是人类体力的极限.
学编程,我们为什么不去追求脑力的极限?
短跑上,百米10秒一度被科学家认为是人类不可能逾越的极限.
但被 吉姆·海因斯 突破后,就有越来越多的选手突破此极限.
所以,真正的极限,在你的内心.
当然,光靠主观拼命,是不够的,科学高效的学习方法,才是快速学习的保障.
二: 高效的学习方法 --学编程没有捷径,但可以少走弯路.
编程最快的办法--是迭代学习法,也是
布尔教育做IT培训的理论依据.
何谓迭代?
大部分的教学方法,都是一门课一门课,顺着教过来.
而在一门课中,又是一章一章,一节一节,顺着教过来.
----对于编程,这是错的!
正确的学习方式---
先主干,再粗线,再细节,带学员逐步深入,反复迭代.
以HTML课程为例,几乎所有的课程,都是上来先讲讲标签,p,h1,h2,div,pre,ul,li.
试想: 一位0基础学员,一下子告诉他这么多标签,他能不晕吗?
即使所谓的"名师",也无非是声音洪亮,PPT和笔记做的细罢了.
但这种错误的教学方式,PPT做的越细,学员越学不会.
正确的做法是不管标签,先告诉你,看这张网页,如果他是这一块布,
如何把它剪切成上中下三大块? -- 先主干
中间一块,又如何切成左右两块? -- 再粗线
左右两块中间,又如何插入文字图片? -- 再细节
如果没有明白这种学习方式,请你看素描的过程
正确的素描步骤,就是典型的迭代学习过程.
而大部分老师的教学方式,都是平铺灌之,如下图.
对于迭代学习法,理解一点了吗?
如果仍没有,建议你看看我的"
8小时学会HTML网页开发" ,
这个课程,非常典型的体现出
布尔教育独特的"迭代学习法"
请允许我自大一下,这是国内最好的HTML网页课程,没有"之一".
由于我见的世面少, 在计算机教学方面,就见过汇编语言"一书的作者 王爽,可为知音.
王爽(中国著名计算机科学教育家)三. 具体的学习路线
第一轮迭代 (6天, 迅速掌握PHP做网站到底是什么回事)
- HTML(3天学习+2天练习) 教程:8小时学会HTML网页开发
- PHP3小时光速入门 (半天学习+半天练习) 教程: http://pan.baidu.com/s/1pGHc0
第二轮迭代 (14天, 夯实PHP理论基础,并用面向过程做一个Blog)
- PHP基础巩固(3天学习+2天练习) 教程: PHP基础巩固 - 自学it网
- MySQL3天基础巩固(当天学的当天练,共3天) 教程: 链接: http://pan.baidu.com/s/1kUCbF63密码: qcch
- Blog开发(cookie/session,文件上传,分页类,GD缩略图,验证码,在此项目都将练到,6天)视频地址: 链接: http://pan.baidu.com/s/1eR50qlG密码: 46u7
第三轮迭代 (4天,继续提升理论知识)
- PHP面向对象 (2天) 教程: 链接: http://pan.baidu.com/s/1qXvXDqG 密码: apvh
- PHP面向对象常用类 (1天) 自己搜索着写出上传类,缩略图类,分页类,MySQL类
- 面向对象方式再次做Blog (1天) 同上,自己摸索来
第四轮迭代 (7天, 框架,等实用开发工具,为就业做准备)
- Http协议 (半天) 教程: 链接: http://pan.baidu.com/s/1i4Onuex 密码: x538
- 正则表达式 (半天) 链接: http://pan.baidu.com/s/1bLbwCm 密码: k7tk
- TP框架 (1天) 教程: 见下一行.
- 用TP框架做一个商城(5天) 教程:http://pan.baidu.com/s/1bTRsxo 密码: ed5i (发布于16年/07/17)
第五轮迭代 (7天, js/jquery等前端技能)
- javascript (2天学习+1天练习) 教程: 谈笑间学会JavascriptJS游戏--别踩白块
- ajax (半天学习+半天练习) 教程: http://pan.baidu.com/s/1hMOA 看前10集即可
- jquery (2天学习+1天练习) 教程: jQuery 实战经典
第六轮迭代 (4天,Linux服务器)
- Linux(3天) 教程: Linux 入门基础
- lnmp环境(1天) 教程: 教你编译PHP7 (nginx+mysql+php7)
第七轮迭代 (3天,实用开源产品的二次开发.套模板虽 low,但不敢保证你一定去大公司对不对?)
- PHPCMS模板(1天)
- ecshop二次开发(1天)
- discuz插件开发(1天)
第八轮迭代 (面试及就业实用技术)
- svn+git (1天)
- bootstrap响应布局 (1天)
- 微信开发 (1天) 教程: 链接: http://pan.baidu.com/s/1gfjtNaF 密码: ffmg 链接: http://pan.baidu.com/s/1jI0OCkQ 密码: ck3c
第九轮迭代 ( 3-5 年 ,注意是"年")
各种框架,JS深入,MySQL优化, PHP底层,Linux运维,网络,C语言,python...
四: 自学和培训的异同
须知: 学习方式有异同,但知识无异同.
无论是自学还是培训,CURD还是那个CURD , for循环还是那个for循环
答主倾向于"自学",因为"那样比较酷的说", 这真是一个好消息.
说明你爱程序,而不是仅仅是为了糊口才去学.
你一定可以成为一名优秀的"程序媛"
其实,培训就是花钱买一个学习氛围, 花钱买时间
一人自学, 就是凭毅力, 花时间省钱.
以我的经验:相同的0基础学员
自学,一般需要6-12个月.
培训,一般需要2-4个月.
而培训总花费一般在1万-2万之间,大概是2-3月的工资.
自学的难度在于:
- 没有强制性,学习时间易被手机/微信/QQ 打断,
- 容易沮丧, 一个小问题,一上午没搞出来,又没有老师指点,特别打击.
- 学练不统一, 只看视频,感觉懂了就过, 往往不去认真完成课后案例或项目.导致根基浮浅.
所以,你如果离就业还早,比如大二,大三,不妨自学.
如果临近就业, 不妨培训.
但无论选哪条路, 努力,都是必须的!
五: PHP培训周期为什么往往比2个月要长?
2个月,是从追求极限出发, 但我们没有必要如苦行僧一般折磨自己.
博尔特百米能跑9秒,但他不会每天晨跑时,都百米冲刺吧?
布尔教育在之前,使用的是2个月的极限教学法.
所以之前的大部分班级,一个女生都没有,为什么?
强度太大啊,连男生都累的面有菜色.
如果我们对自己好一点, 再加一个月,总共3个月, 学习压力就小多了.
如果再考虑到"负基础学员"--连键盘都不熟悉的,就再加1个月的基础课.
所以----如果培训,4个月的时间,是绰绰绰绰绰绰有余!
如果再继续拉长周期, 那么就不是从教学出发,而是从商业出发了.
毕竟,拉长周期,学费高, 还容易骗小白说--"看,我们这教的多....."
-
五、PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点?
相信每一个计算机科班出身的同学或许都有这样的经历:在大三的某一天,仿佛打通了全身筋脉一般把三年的所学:“数电里的与非门——计算机体系结构——汇编语言——C语言——C++语言——Java语言”。所有知识全部串联了起来。所有这些语言的出现都仿佛都有了必然性和追根溯源的历史感。
**阅读指引**
读懂此文,需要以下基础:
1. 至少写过50000行的代码;
2. 汇编基础(静态数据段,代码段,堆栈段)。
有以下或者类似知识就更好了:
1. C语言编译,C++对象模型,MFC反射的实现
2. JAVA的解释器运行原理
3. 使用过javascript,Python,PHP:感受过代码和类型系统在运行时的自由程度的不同
4. 计算机组成原理
**序 —— 一些问题**
1. 程序设计语言的目的是什么?
2. 为什么大多数语言有控制流?逐行执行+跳转。这与我们的需求差很远(例如一个教务管理系统、一个自动打车APP)
3. 为什么类型申明在C语言中要与控制流隔离开来?
4. 现在主流语言最基本的元素是?
5. 有没有语言它的类型结构,在运行时也可以改变?
动态性?
什么是动态性?
1. 编译后确定了什么信息,之后不再改变;
2. 运行时可以改变、添加什么;
3. 运行时是否保存着类型信息。
程序中的信息分为几类?
1. 数据信息
a) 编译时Meta-Data元数据(类型框架、空间占用)
b) 运行时Meta-Data元数据(继承体系、用于new或者反射)(特别区别编译与运行的Meta-Data的不同。)
c) 堆栈段中地址偏移(C++的switch case中不能声明变量、共享内存)
d) 静态段中地址
2. 指令信息
a) 代码段(动态性需要操作系统或者虚拟机支持,例如动态链接库,动态类加载,lisp语言自生成代码)
**语言举例**
**汇编语言**
汇编语言没有动态性吗?
没有。首先,寄存器、数据段、堆栈、代码段完全由程序员控制。完完全全是写死了的。然后,根据冯诺伊曼机的规则;取指令,执行,取指令,执行……
既然都有数据段了,还要堆栈段来做什么?这不是多余?
一开始本没有堆栈,直到60年代出现了module模块化,才有了堆栈。汇编中的模块叫子程序,不过仍旧靠程序员全权控制。
堆栈和模块化的优点有?
1. 递归
2. 功能分离到模块,可复用
3. 封装作用域
堆栈和模块化的缺点有?
1. 时间上:保存现场、还原现场的代价(另,高级语言编译“消除尾递归”节约部分成本)
2. 空间上:爆栈的危险
**C语言**
C语言比起汇编多了什么东西?
1. 编译器
2. 表达式(相比汇编,可以处理多个操作数了。)
3. 函数与模块{}(真·模块化,栈操作无需程序员完成)
4. 类型(原子类型、结构类型、数组、指针)
5. 头文件,库
总之,C语言并没有比汇编多了新的特性,它只是把汇编的繁琐操作抽象出来,让编译器完成,减轻程序员负担。
编译器的作用是?
(减少程序员负担)
1. 解析表达式,控制流(汇编中指令只有1-3个操作数,而表达式可以多个操作数)
2. 模块和函数的抽象(完成堆栈中保存恢复现场的工作)
3. 类型变量的管理(所有变量被替换成直接访问的地址,最快的访问速率)
4. 代码优化
变量是替换成可以直接访问地址的?
a) 编译时的Meta-Data(struct的成员,数组的长度,以便替换到指令流;只在编译器中维护,编译结束后丢弃)
b) 计算出每个变量相对于该模块的偏移(一旦算出该偏移地址,将固定在执行码中,无法改变;就是说编译完成后,所有变量的偏移地址都固定下来了。)
c) 对变量的存储进行管理(所有的变量/内存地址的布置,都是在编译时确定的;也就是说,可执行码中没有类型信息,只有地址,任何数据都是地址来操作,完全和汇编类似。至于寄存器的安排,那是更下一层的类似缓存策略算法的结果。)
编译出来的执行码与汇编的执行码有特征的区别吗?
没有。特别是在编译器优化之后。
无法通过执行码,区分汇编和C程序。
打个比方,一只“程序猫”在黑笼子里,在里面喵喵的叫,无法通过它的叫声来判断它是“汇编猫”还是“C语言猫”。
从效率上来讲,C的多余代价在哪里?
1. 编译的时间
2. 模块的堆栈操作
总之,经过优化的C程序执行码与汇编效率几乎相同。
因为从理论上来说,C并没有引入运行时的新机制。
我理解的C语言只是一种汇编的宏而已。
**C++语言**
(推荐《深度探索C++对象模型》)
C++语言比C语言多了什么?
1. 成员函数
2. 类型继承体系
3. 虚函数、虚继承
4. 模板
5. 涉及到了多种编程范式
(开始更抽象,语言逐渐开始脱离冯氏结构。)
其中,面向对象的思想,让程序与现实事物的关系更加紧密。
程序设计的负担,也因为OO与设计模式的流行,而变得轻松。
编程范式是什么?
就是一套指导思想行为准则。
(例如,C是过程式,Haskell是函数式,JAVA是面向对象,Python是简单的大杂烩,shell是调用命令的,lua是调用c程序的,PHP是写页面的,ProLog是线性逻辑推理的。
再例如,UML是描述规格specification的,XML是存储数据的。
再再例如,CSS是描述网页表现的,HTML是描述网页内容的。
javascript比较神奇,不敢说。)
C++有什么编程范式?
1. 过程式(使用STL的类C语言编程)
2. ADT式(自定义抽象数据类型,继承;但是不用new,不用virtual;拷贝构造;为了防止资源泄漏,也发明了RAII的方式进行资源的初始化和释放)
3. 面向对象式(使用new,使用virtual,需要指针或引用;实现多态。)
4. 泛型编程(《Modern C++ Design》各种奇淫技巧,业务层代码比较少遇到)
C++编译器是怎样实现的?
C++开始有一个叫做cfront的编译器,即把C++语言先翻译成C语言。
然后再用C编译器来编译,C的编译器并不知道此段代码是来自C++还是C。
C++语言特性分别是怎样实现?简单说。
1. 成员变量:和C语言的struct 类似,最后也会被直接替换成地址,便于高效访问。
2. 成员函数:使用特殊函数名编码方案,翻译成C函数,并添加this指针作参数。(如___clsA12345func001(...,clsA *this))
3. 类型继承体系:通过C++编译时的Meta-Data来实现。即在编译时,编译器是知道类型信息与继承体系的,但是编译成C语言后就丧失了此类型信息。
4. 虚函数、虚继承:为了支持多态,这也是“面向对象”最重要的特性,使用了虚函数表和虚基类表。注意,运行时多态是通过运行时查表实现的。稍后详细说。
5. 模板:通过代码复制的方式实现。每次编译都需要重新编译,不能编成库文件直接使用。
C++编译器的准则与virtual机制?
1. 首先,C++的编译准则,希望做到与C一样的效率。希望做到以下:
——a) 没有运行时调用间接性。任何数据在运行时都是一个地址直接就访问到。
——b) 没有运行时的Meta-Data。无需通过Meta-Data来访问某个复杂的类层次。
——c) 所有的数据都希望用C中struct来实现,即在编译时就确定好对象及其成员地址。
2. 以上,在过程式范式,与ADT范式中都是成立的。
3. 但是,在面向对象范式中,渴望做到:
**需要维系着同一个继承体系成员结构的一致性,只有这样,才能保证运行时的多态性。即希望通过同一个入口,访问到父类或者子类的相同数据成员、函数成员,而不在乎具体对象的是父类还是子类。**
C++的virtual机制如何实现的?
a) 虚函数
i. 虚函数,运行时,每个有虚函数的类型(哪怕是子类)都维持着一个虚函数表,这已经是运行时的Meta-Data,通过查表,即可找到对象自己的虚函数。
ii. 例如clone肯定是object.__vptr__Base->#3(),无论具体的对象。
b) 多重继承
——如何处理后继的base基类?由编译器判断指针类型并加上相应的偏移。
c) 虚继承
——添加一个虚基类指针,指向共享部分。
这样的缺点有两个:
1. 虚基类的子类都要背负一个基类指针指向共享部分。如果继承了多个虚基类,还需要多个这样的指针。(Microsoft的解决方法是增加一个虚基类表,类似于虚函数表。)
2. 虚继承链条的增加,会导致间接访问的层次增加。例如两个菱形继承的串联。
跨平台的级别有哪些级别?——头文件,库,源代码
1. C++确实在源代码的层次是可能跨平台的(例如《POSA2》中加了针对不同平台的各种宏的代码)。
2. 也可以通过相同的头文件去访问不同平台的库。
3. 但是,不同操作系统中的不同的API大大增加了跨平台的难度。
4. 跨平台的责任留给了程序员(充斥着大量宏的C++跨平台代码确实让人头疼。)
5. 编译器面对不同的系统也不敢作为,它只是负责编译源代码,链接。
如何使用C++才能保证其高效性能?
1. 有额外负担的机制:虚函数,虚继承,拷贝构造。
2. 用一次虚函数,多了一次指针寻址的效率损失,并且相对于inline内联(另,inline是编译器优化的重头),还损失了保存和恢复现场的效率。
3. 用一次虚继承,也多一次指针寻址的效率损失。(另,虚基类没有成员变量没有虚函数的时候会被优化。这也是JAVA可以多重继承接口interface的原因。)
4. 不要使用virtual在复杂的多继承,深层次继承中。
5. 编译速度会较慢:virtual机制会使编译器处理更多的Meta-Data。
**JAVA语言**
(推荐《本地Java代码的静态编译和动态编译问题》)
JAVA语言比C++语言多了什么?
1. 虚拟机
a) 跨平台
b) 动态编译
c) 动态特性
2. 没有指针
3. 没有类的多继承,有接口的多继承。
4. 统一的库
从编译来说,JAVA比C++迈出了一大步。
它的跨平台特性和运行时的灵活性,为JAVA自己以及未来语言都提供了很多可能性。
虚拟机的好处有什么?
1. 跨平台:在OS与字节码间隔了一层。实现了程序员无负担的跨平台。
2. 动态编译:许多信息不必在编译后确定,为动态特性提供可能,稍后详细说。
3. 运行时维护着类型信息,甚至可以加载新的类型。(CORBRA依赖这个实现)
JAVA编译执行的过程是怎样的?
1. 编译后产生一个基于堆栈的字节码。
2. JRE在不同的OS上提供支持。
3. 起初的JRE是解释执行的,效率低下。
a) 获取待执行的下一个字节码。
b) 解码。
c) 从操作数堆栈获取所需的操作数。
d) 按照 JVM 规范执行操作。
e) 将结果写回堆栈。
JAVA是如何解决执行效率低下的问题呢?
使用JIT(Just-in-time)编译器进行动态编译。
JIT(Just-in-time)是怎样运行的呢?如何解决了效率的问题?
如上图:
1. 每次按照一个function来编译。转成中间表示,并优化其效率,再生成可执行码。
2. 编译器的编译线程和执行线程是分开的,应用程序不会等待编译的执行。
3. 分析框架Profiler会观察程序行为,对频繁执行的function进一步优化。(例如function内部对象维持一个池不必每次生成。)
动态编译的优点有什么?
可以根据程序的行为,优化其代码
1. 例如频繁执行的function——热方法
2. 例如arrayCopy方法,如果每次都拷贝大段内存,在指令集中有特别指令可以加速。
3. 例如类层次结构,多态的优化。(大多数虚调用都有其固定的一个目标,JIT因此生成的直接调用代码比虚表调用代码的效率会更高。)
动态编译的缺点有什么?
1. 大量的初始编译会影响程序启动时间。
2. 运行时候的编译,行为分析都需要花费时间。
3. 运行效率达到稳定需要时间。
4. 实时GUI型的程序不能忍受“动态编译”和“GC”带来的延迟。
JAVA如何解决实时的需求?
使用AOT(Ahead-of-time)编译器:预先编译成为可执行码。
AOT(Ahead-of-time)的缺点:
对于一些动态特性的支持效率低下
1. 反射机制
2. 运行时类加载
JIT与AOT的对比
总体来说,JAVA适合怎样的应用呢?
JAVA比较时候需要长期运行的应用,例如Web服务器,Daemon服务。
**函数式语言**
函数式语言通常有哪些呢?
1. 函数式语言
a) Lisp
b) Scheme
c) Haskell(纯函数式)
d) F#?
2. 包含了函数式特性的语言
a) Python
b) Javascript
c) JAVA
d) C?
函数式语言有哪些特性?
1. 函数无副作用,只对输入输出有作用
2. 高阶函数,lamda演算。(这个像C函数指针,但是它是高阶的,即返回值可能也是函数)
3. 没有过程,类似规格说明的语法,更容易理解,自解释。
4. 基于list的编程,函数更通用。
5. 惰性计算(这个很像“树形DP”)
6. 有对应的数学形式化表达,有可能证明其正确性。(最终目标可能是保证程序没有bug。)
7. 其模型适合多核或者分布式的计算。
a) 不变性(immutable)
b) 惰性计算/按需计算(lazy evaluation)
c) **最重要的是,由于函数式语言不可在同一数据上做修改,每一次运用一个函数都会在新的位置产生新的数据,这与过程式语言在同一位置对数据做多次操作不同:函数式语言的函数依赖于前一次函数产生的结果数据,过程式语言依赖于数据的位置。这里函数式语言就暗含了计算的依赖顺序,如果没有前后顺序关系,就可以并发。而过程式语言没有指定这个顺序,就需要通过加锁、Actor、Channel等模式来指定这个顺序**
总的来说,函数式语言,向着更抽象迈了一大步,更像是数学上的表达,几乎与冯诺伊曼体系断绝了关系。
函数式语言的劣势?
1. 效率不高(因为其抽象,远离了冯诺伊曼体系)
2. 平台以及开发环境都比较简单。
3. 缺少推广,应用不广泛
**逻辑程序设计**
ProLog语言,线性逻辑。人工智能语言。没有接触过。
**总结**
动态性有哪些呢?
1. 多态性:运行时根据具体对象来访问属于它的方法。(而不理会指针的类型。)
2. 反射:运行时维系着类型结构的Meta-Data。
3. 运行时类加载:运行后再次加载新的数据类型和指令流。
4. 动态链接:OS根据按需链接库文件。
编译语言 和 解释语言 的分界在哪里?
语言本身并没有编译类型或者解释类型。(例如:JAVA也可以静态编译后成可执行码。)只有少数运行时特性是依赖于解释型的。(可能需要运行环境的支持。)
为什么解释语言都需要虚拟机或者运行环境支持?
动态编译,运行时Meta-Data的保存,这些功能对于每个程序都是一致的。
所以把它们分离开来,不必每个程序植入这些代码
非脚本语言 和 脚本语言
脚本语言,我理解是负责调度其他代码的语言。
例如shell脚本(调用命令),lua(调用C)。
跨平台分为哪些层次?
1. 源码跨平台(C,C++,但是因为系统调用接口不同,程序员负担太大,但是汇编却不是。)
2. 执行码跨平台(JAVA,有些语言直接从源码解释执行,例如Javascript,PHP)
发展历史(推荐《近看图灵碗 (一. 从苏黎世到巴黎)》)
学术上有哪些实验性语言?
1. Fortran
2. ALGOL58
3. ALGOL60
4. Lisp
5. smalltalk
常用语言
过程式:C,ALGOL,Pascal,
面向对象式:C++,smalltalk,JAVA,Delphi
函数式:Lisp,Scheme,Haskell,
逻辑式:Prolog
脚本?PHP,Python,Ruby
存储描述信息:XML,CSS,HTML
**回答问题**
程序设计语言的目的是什么?
1. 控制数据
2. 控制指令流
为什么大多数语言有控制流?逐行执行+跳转。这与我们的需求差很远(例如一个教务管理系统。)
逐行执行,很大程度是起源于冯诺依曼体系结构。
为什么类型申明在C语言中要与控制流隔离开来?
因为在编译时,具体的类型信息,要转化成地址偏移,然后替换控制流中的类型变量。
现在主流语言最基本的元素是?
控制流 与 类型系统。
有没有语言它的类型结构,在运行时也可以改变?
Javascript只有对象没有类,使用prototype的方式继承,运行时给某个对象添加新的数据成员。没有类型体系。
许多后来的语言在运行时都保存着类型信息的,例如Python,JAVA。
**综上所述**
控制流——指令流
类型系统——为了计算出变量地址信息
区分运行时的Meta-Data与编译时的Meta-Data
六、C、C++、Java、JavaScript、PHP、Python、Ruby 这些语言分别主要用来开发什么?
之前刚毕业的时候写的回答,现在毕业四年了再看,其实写的有点不好,所以更新了一版。-2019.9.17
============
自问自答这个问题是大一的时候问的,大家只看到了我提问的问题,不知道我提问背后的动机,提这个问题的原因是因为那个时候刚进大学,很迷茫,不知道要学什么,在图书馆和网上见到各种语言各种技术,不知道从何入手。如果有人是不知道如何选择这些技术而看到这个问题,我可以给你一些帮助。语言只是一个工具,在选择工具之前,应该想清楚想做什么。
JavaScript这个是做前端开发的,就是写网站的页面,各种酷炫动画效果的,然而现在已经9102年了,这个语言不仅可以写网站页面,还可以写PC客户端软件(electron),如果你用vs code的话,其实vs code也是基于electron的,还可以写网页游戏(以前可能flash多点),甚至写APP(Cordova,ReactNative),还有十分混乱的百度小程序,头条小程序,支付宝小程序,微信小程序等。
Java/PHP/Python/Ruby/Go(Go lang)/NodeJS,这些是做后端开发的,和数据和各种业务打交道,静态页面之后,各种能力都是后端提供的(登陆注册关注点赞发布消息)。
C/C++是底层的语言(后面的C泛指C/C++),当前计算机很多基础设施的实现语言都是C,比如linux操作系统,chrome浏览器的V8引擎(负责JavaScript的解析)就是用C写的,后端经常接触的mysql也是C写的,nginx/redis也是C写的,你难道不想自己写一个操作系统/数据库玩玩吗?好吧,哪怕没有这种伟大的梦想,学这种底层语言,也可以更好的理解程序怎么和操作系统交互,通过底层语言去学习算法和数据结构,才能更好的理解一些高级语言数据结构的便利性背后的性能问题。
关于NodeJS和JavaScript我补充一下:
JavaScript是一门语言,而我们常说的浏览器端的JavaScript,其实说的除了这门语言本身,还包括了DOM和BOM,这些是浏览器提供的特殊API,比如渲染页面出来,获取当前的网页链接,刷新页面, 只有在浏览器这个场景下才可以使用。
而NodeJS,是JavaScript语言+NodeJS的特殊API,而这些特殊API是在操作系统上运行,而不是在浏览器运行,这些特殊API让其具有做后端开发的能力,比如他能开放一个端口监听网络请求,而浏览器是做不到的。
七、iOS学习c语言?
ios系统是没有的,苹果电脑上面的xcode自带了c/c++编译器,可以用来学习。
八、培训班培训半年PHP,出来发现自己什么也不会,应该继续学习吗?
毕业一年,php后端,毕业后北漂。
科班,但是大一c学的不咋地,c++和java混过去的差点挂科。php大二加入工作室自学的,从tp3.2.3框架入手,自学前端,用bootstrop和jq搭页面,用wamp集成环境。刚开始一个月一脸懵逼,完全照着视频教程和文档做,连面向对象的概念和数据库都不咋熟悉。大概半学期左右,课余时间呆工作室自学。期间做了两三个小项目,几百块钱,基本demo展示级。
可以说php才是我入门计算机的学科,才理解面向对象等基本概念,编译,操作系统等。当然这是后面继续相关性学习的后话了。
从我自身一开始同是彩笔的角度出发,php和前端的入门门槛真的挺低的,完成demo级的作品需要掌握的知识储备不需要很多,当然后续还需要学习很多东西。不清楚让你防写的页面的难度以及技术栈需求。但是若不限制,半年的培训和自学,简单的防写我觉得应该是能搞定的。若php都不能搞定,java我觉得入手更麻烦些。
九、新手如何学习C语言?
这个我可太知道了!!!这才是你最想要的 C 语言学习路线!!!
在大学的时候搞 ACM,用过三年的 C 语言,自认为比较熟悉。
现在常见的高级语言的底层几乎都是 C 语言实现的。
学好了 C 语言,你再去学别的编程语言就很快了。
C 语言的学习其实就三个阶段就好了:
(1) 入门阶段
这个阶段学习 C 语言的基础语法知识。
目标是可以开发一些简单的控制台小程序。
(2) 提高阶段
这个阶段学习 C 语言自带的库函数,形成 C 语言的基本知识框架。
目标是开发一些基本的应用程序。
(3) 应用阶段
这个是实战阶段,要具备一定的综合性应用软件开发能力。
目标是能够开发像贪吃蛇、图书管理系统、学生信息管理系统等项目。
注意!下面都是超极干的干货,记得先帮我 @Rocky0429 点个赞呀,么么哒。
一、入门阶段
入门阶段主要需要学习下图的内容:
1.视频推荐
此时同学们应该是小白阶段。
对于小白来说,不建议上来就看书,因为干看看不懂,容易劝退。
可以先从视频教程开始。
C 语言的视频教程我只推荐一人:浙江大学翁恺老师的 C 语言课,yyds!
是一个课程质量非常棒,讲课幽默,深入浅出的课程,非常容易理解!
当时学 C 语言的时候,自己还是个从来没接触过编程的菜鸡,当时的学习全靠翁恺老师了!
不多说,看过的都知道。翁恺老师的课是在 MOOC 上开的。
主要分两门:
- 第一门是面向高考结束想提前自学一些编程的或者是刚开始学习的大一新生,叫《程序设计入门-C语言》,涵盖了主要的 C 语言知识点。
完成本课程之后,就能具有初步的运用C语言编写程序的能力。
2.第二门是《C语言程序设计进阶》,这门课就是要告诉你C语言到底有哪些独特的地方,为什么能长期占据15%上下的编程语言份额。这门课同样也是带你项目实操,和设计入门搭配使用,效果翻倍。
C语言程序设计进阶_浙江大学_中国大学MOOC(慕课)www.icourse163.org/course/ZJU-200001#/infowww.icourse163.org/course/ZJU-200001#/iwww.icourse163.org/course/ZJU-200001#/iwww.icourse163.org/course/ZJU-200001#/infowww.icourse163.org/course/ZJU-200001#/info2.书籍推荐
我姑且认为现在题主有了一点基础,可以能配合视频看书了。
《啊哈 C语言》
这本书是为计算机纯小白量身打造。
风格幽默,生动形象,通俗易懂,读起来令人耳目一新,对入门小白培养兴趣的帮助很大。
在语言艺术这方面,是登峰造极,让人不得不佩服作者的才华和用心。
只不过内容并不深入,真的是对零基础,大佬绕路。
《c primer plus》
语法全覆盖,细节多,知识点讲的清楚,但是内容极多,是本大部头,容易劝退。如果你觉得入门差不多,可以啃一下。
现在是第六版了,书的封面啥的都换了,内容也更贴合现在的需求。
一共17章:
- 第1、2章介绍了C语言编程的预备知识。
- 第3~15章详细讲解了C语言的相关知识。
- 第16章、17章介绍C预处理器、C库和高级数据表示。
如果你在这个阶段觉得差不多了,可以尝试找一些在线的练习题做下。
这里推荐一下牛客网,在线的编程题库做的很不错,尤其是对于后期你找工作刷题来讲,这简直是个超级好的去处!
直接点击下面这个链接可以直达,开启你的测试之旅~
传送门:https://www.nowcoder.com/link/pc_kol_wenqlgd
二、提高阶段
这个阶段你已经对 C 语言有一定认知了,这个时候我们就可以深入学习 C 语言中最重要的指针等内容了。
1.提高内容
这一个阶段需要学习的内容主要有下图:
2.书籍推荐
《C 和指针》
指针和指针操作一直是c语言中的重点和难点,反正我当时学到这里的时候,就很头疼。
这本书是 C 指针的经点之作,通过对指针的基础知识和高级特性的探讨,来让我们学会把指针的强大功能融入到自己的程序中去。
但是这本书不只是指针,更是一本很棒的 C 语言入门书,提供和C语言相关的全面资源,还有比较深入的讨论,让你形成一个正确的c语言观。
《C 专家编程》
任何人都可以享受编程,编程应该是一项精妙绝伦、充满生机、富有挑战的活动,而讲述编程的书籍也应时时迸射出激情的火花。
这本书展示了最优秀的 C 程序员所使用的编码技巧,还对 C++的基础知识进行了介绍。
书里关于 C 的历史、语言特性、声明、数组、指针、链接、运行时、内存以及如何进一步学习 C++ 这些内容进行了细致的讲解和深入的分析。
差不多对几十个实例进行讲解,生动有趣,对 C 程序员具有非常高的实用价值。
《C 陷阱与缺陷》
任何人都可以享受编程,编程应该是一项精妙绝伦、充满生机、富有挑战的活动,而讲述编程的书籍也应时时迸射出激情的火花。
这本书展示了最优秀的 C 程序员所使用的编码技巧,还对 C++的基础知识进行了介绍。
书里关于 C 的历史、语言特性、声明、数组、指针、链接、运行时、内存以及如何进一步学习 C++ 这些内容进行了细致的讲解和深入的分析。
差不多对几十个实例进行讲解,生动有趣,对 C 程序员具有非常高的实用价值。
三、应用阶段
学编程除了理论外,更重要的是要应用,应用很好理解,前期多敲代码,之后慢慢去升华。
其实编程语言就是要多练,怎么多练,就是代码量。
自己多写,然后多观摩别人的项目,看人家的写法,模仿项目,学习其中的思想,一点点的积累,一步步形成自己的东西,厚积而薄发,慢慢你就会发现你也可以了。
1、C语言制作斗地主发牌器
通过本项目的学习,可以让学员掌握一些棋牌类的手机游戏中的发牌系统算法怎么编写,为学员就业后编写一些小的游戏类APP打下良好的基础。
传送门:C语言:斗地主的发牌器 - 网易云课堂、
2、C语言实现通讯录/图书管理
这个课程将使用 C 语言完成一个简单的通讯录。会涉及到结构体、数组、链表等重要概念,需要对 C 语言有一定的了解。
地址:C 语言实现通讯录_C - 蓝桥云课
3、C语言实现2048小游戏
2048是之前十分火爆的一款益智游戏,这个课程将使用 C 语言完成一个2048游戏。适合对C语言有一定基础,需要了解C语言,以及绘图库ncurses的实用。大大提高你的动手能力。
地址:C 语言实现 2048 游戏_C
4、Tinyhttpd(7.3k+ star)
一个不到 500 行的超轻量型 HTTP Server,可以用来理解服务器程序的原理和本质。
C语言 的入门级项目!
传送门:https://github.com/EZLippi/Tiny
5、db_tutorial(5.9k+ star)
用 C 从零创建一个简单的数据库。
传送门:https://github.com/cstack/db_tu
题主还说到了数据结构
题主开始数据结构的学习之前,首先要把 C 语言学好,这是个递进关系。
数据结构与算法的学习
程序 = 数据结构 + 算法。
数据结构经常与算法放在一起,在有些高校,会存在“数据结构”和“算法设计与分析”这样两门课。
这就造成很多同学懵圈,数据结构与算法有什么区别?甚至有些同学认为这就是一种。
其实吧:
- 数据结构主要讲解数据的组织形式。就是我们要怎样把这些数据存储起来,所以有数组、链表、栈、队列、树、图,这是数据结构的重点。
- 算法,则注重的是思想。比如数组里的元素怎么排序、怎么找到最大的数和最小的数等等。说白了就是解决现实中问题的思想。所以才会有贪心、动态规划等这些算法。
数据结构与算法,不管你怎么想,一定要认真学!不管面试还是考研都是必考!
下面总结一些重要的知识点吧,这样才能有针对的学。
【复杂度分析】
- 时间复杂度
- 空间复杂度
学习数据结构与算法的第一课,我永远都选复杂度分析,在我看来,这是数据结构与算法中最重要的知识点,且不接受任何反驳。
【数据结构】
- 数组(Array)
- 链表(Linked List)
- 栈(Stack)
- 队列(Queue)
- 散列表(Hash table)
- 堆(Heap)
- 树(Tree)
- 图(Graph)
【操作数据结构】
- 查找
- 插入
- 删除
- 修改
- 排序
文章推荐:
【数据结构书籍推荐】
《大话数据结构》、《数据结构与算法分析》
《大话数据结构》这本书与市场上的同类数据结构图书相比,内容更加趣味易读,算法讲解细致深刻。
是一本非常适合自学的读物。
这本书通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。
如果你还是看不懂,可以看我写的图解,不过有点慢,但是绝对通俗易懂:
复杂度分析:保姆级教学!彻底学会时间复杂度和空间复杂度
链表:链表,画几下就整明白了!
栈和队列:呔!“栈”住,队列!
字符串:关于字符串,你知道这些么?
【算法】
学习算法的套路很简单,多看、多写、多上机。
- 回溯算法
- 分治算法
- 枚举算法
- 贪心算法
- 动态规划
查找算法
- 二分查找
- 散列表查找
- 树结构查找
字符串匹配
- 暴力匹配
- KMP算法
10大排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 归并排序
- 堆排序
- 快速排序
- 计数排序
- 基数排序
- 桶排序
【算法书籍推荐】
《算法图解》
示例丰富,图文并茂,这是一本像小说一样的算法入门书。
无论你是专业程序员,还是编程爱好者,亦或是需要重温算法的计算机专业学生,这本书都是你不二的选择。
书中的前三章将帮助你打下基础,带你学习二分查找、大 O 表示法、两种基本的数据结构以及递归等。
余下的篇幅将主要介绍应用广泛的算法,具体内容包括:面对具体问题时的解决技巧,比如,何时采用贪婪算法或动态规划;散列表的应用;图算法;Kzui 近邻算法。
《算法(第 4 版)》
算法领域的经典参考书,包含了经过几十年演化而成的算法核心知识体系。
书中讲解了多种算法和数据结构,让你能够在各种计算机环境下实现、调试并应用它们。
作为算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述
第 4 版具体给出了每位程序员应知应会的 50 个算法,提供了实际代码。
【视频教程推荐】
- 《数据结构》,浙大陈越和何钦铭教授联合授课,其大名在计算机领域可谓耳熟能详了。
- 《数据结构与算法》,这门课程的最大特点是理论和实践的结合,你将学习到解决各种计算问题的算法技巧,并实现大约100个算法编码问题。
链接:Data Structures and Algorithms
【网站推荐】
如果还是觉得学起来很吃力,可以借助下面这个网站来学习。
- VisuAlgo,数据结构和算法动态可视化网站。
【刷题】
数据结构与算法的学习,往往要伴随着“刷题”,如果没特殊情况,我建议大家刷 LeetCode 就好。
刷题按照分类来刷,如果不知道刷哪几道题,可以看下这个前字节大佬的刷题笔记:
两个月斩获 70k star,前字节大神刷题笔记mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=328435156&idx=1&sn=f189d0ab3a5faa4e224b6e3f2b485be1&chksm=7f22e25948556b4f0fad0ec8f42dabc17abaf8b097421861acf92516dcde1582525ee1b4dbbb#rd针对 LeetCode,题的解法有很多,我们往往追求的是最优解,这里有一份清华学长整理的 LeetCode 最优解,强烈推荐:
清华学霸的刷题笔记(leetcode最优解)mp.weixin.qq.com/s?__biz=MzI0NjAxMDU5NA==&mid=328435125&idx=1&sn=3de887a586e8a6a08784036de466623e&chksm=7f22e23848556b2e67fedbd30b1ca0fcdb46ed336279aa4cb0899a0f2ff44210e829d125ade6#rd两者配合起来应该非常舒爽。
我在大学的时候参加 ACM,拿过亚洲区预赛银奖,刷题贯穿了我的整个大学生涯,总结了一些刷题的经验,感兴趣的可以看下。
Rocky0429:刷了几千道算法题,ACM学长的一些心得。希望对你有所帮助!
如果觉得不错,大家记得帮我 @Rocky0429 点赞呀。
十、学习c语言用什么软件?
我大一,学了快一年了,我告诉你,不要乱听一些自称大牛的人给你说不要用vs,vs怎么了,vs偷你家钱来?新手学习c语言难道不应该把重心放在语言上吗?
学习c语言,不是学习计算机,不是学习编程语言!
你如果只是单纯的想学c语言,我告诉你,用vs,宇宙第一IDE不是吹的。除了语言本身,其他的你根本不需要关心。scanf_s怎么了?新手了解一下又怎么了,??
你如果要进入这个行业,c语言本身就没有那么重要,你哪个用着舒服就用哪个呗?
网上一些人我是真的看不下去。就必须逼着别人也用vim?逼着别人自己配置?人就想学个c语言。有必要吗?非得人人都是顶级码农配置?
深入的话,c语言就只是一个桥梁,让你能更理解底层原理,和编译器,编译环境本身又有什么关系???
你要深入学习,就多看算法,数据结构,操作系统,编译原理这些书。语言什么的,本身并不占大头。
别跟我说什么其他的。我也进基地,用Ubuntu系统,vim编辑器,ros包搞机器人,Windows10下安装过sublime,cb,dev,vs,vscode,环境都配置过。Ubuntu下vscode,cb也都用过。自己搞过unity,cocos2d,最新版cmake配置对于当初的我还是有点懵的。
讲真,对于新手,vs简直就特么的跟一个保姆级别的老师一样,有自己的帮助文档,社区论坛,自带标准汉化,简直就他妈是给新手穿上了满级装备,为什么不用???
我去华为参观,人家也有用vs。
我在Windows下写程序基本就是vs了。Python会用pycharm,Java只写过helloworld,用的IDEA,在大创时,之后另外一个人负责安卓上的,我负责嵌入式就没在管Java了。
说说为啥这么喜欢vs。语法高亮,代码补全这是最基本的。
再就是写一些稍微大一点的程序,我会写头文件和cpp,vs的创建会比其他更加方便。跳转创建声明定义也很便捷。
会自动缩进对齐,这对于我一个追求美的人简直太棒了。写出的代码规范整齐。
按住crtl 和鼠标滚轮就可以放大缩小,就不需要调整字体大小。vscode这点差评。
每当你写出代码,他会实时告诉你有木有错误,警告!这特么不是给新手准备的???这对新手简直友好的不行。
编译器出错了,像新手常犯的错误,看其他编译器,有些英文的看不懂?没关系,vs自带汉化,而且不是百度翻译那种水平,简单的错误看一遍报错就知道怎么改!
如果还不知道?没关系,点击前面的错误序号,自动打开官方文档,给出你错误示例和正确示例。c开头是官网,e是论坛(如果没记错的话,毕竟有段时间没用Windows了)。
vs还有很多扩展,就类似于vscode的扩展。可以自己搞一搞自己的界面。(这个是我前一段时间写的数模)
这不比cb,dev香吗?
还有自带的下载器。
你随便拉来一个人问,vs搞OpenGL,Opencv简单还是其他简单,这没有任何异议吧?别扯什么自己去下载配置也很快,反正你没有vs方便就是。
当然,这么方便也是有代价的,就是太方便了,这也是最多人批评vs的一个点。我觉得对于一个大学非计算机专业而言,方便难道是错的?计算机的人没有自己的老师吗?需要别人指指点点?
还有就是vs占用的内存大,我的十来GB吧,我选的插件比较多,因为我参与的多一些,都要学。各种不同的需求,只要在Windows下,我一律选择IDE,不图其他的,就图简单,我给我周围要学习的也都推荐vs。其他的东西自己上课学习,自己捣鼓,比在学习c语言时,顺便学习要好多了。
微软vs,苹果xcode,东欧的那个公司叫什么来着,je什么我忘了。发展这么多的ide是为什么?说的简洁的编辑器加mingw的,我还真不信就配置这么一个东西能学习到什么东西。全部按照CSDN来,最后自己搞得啥也不清楚,出了问题还是不会解决。为什么不一步到位呢?优势不过是跨平台,轻量等对新手作用不大的优点。
新手学习c语言,我首推vs,其次cb,cb也不需要自己配置,但是比vs少很多功能,而且主要是因为是我用过的第一个ide,还是有感情的。再就是clion,这个没用过,不过他们公司的软件风格很像(pycharm和idea是他们公司的),应该也很好用。
我只是通过一个新手学习c语言不久之后的感受来推荐,你如果是大佬,熟练vim所有操作,Linux命令,各种奇技淫巧,那我无话可说,毕竟,学习c语言对你也没什么难度,如果是新手,我还是坚持我的建议!