【游戏编程扯淡精粹】如何学习编程语言
文章目录
如果你没有学过编程
学Python/Java
资料很多,问题容易找到回答
如果你只是想提升工作效率
比如你已经上班了,要处理一些Excel表格
但是你并不想学习编程,去成为程序员
那么学习Python,把Excel处理库熟悉即可
不要浪费时间去看C,去看Excel表的VBA
如果你想学习计算机科学与技术
学C,配合《CSAPP》
可以结合C++,从写C with class开始
C语言的规格应该完全掌握,因为这个集合很小,不像C++
比较复杂的关键字是static,学习时应该整理出所有用途
C的关键,不是C的语法(大概能占20%),而是《CSAPP》,理解计算机底层是如何运行的,怎么反应到C的层次上,通过C来控制计算机
如果你已经是熟悉了一门编程语言
你应该学习至少半打编程语言(6个)
覆盖大部分编程范式:
- 过程式编程
- 面向对象编程
- 函数式编程
- 声明式编程
- 并行编程
学习至少半打的编程语言。包括一种支持类抽象的语言(象Java 或C++),一种支持函数化抽象的语言(象Lisp或ML),一种支持语法抽象的语 言(象 Lisp),一种支持声明规格说明的语言(象Prolog或C++ 的模板),一种支持 共行程序(coroutine)的语言(象Icon或Scheme),一种支持并行的语言(象Sisal)。
作为辅助书籍,有《七周七语言》,含上下两册,一共十四种编程语言,这本书并不深,随便看看
我个人并没有学习全部,面向对象仍然是主流,其他几种语言可以作为补充
如果你已经工作
如果你已经是一个工作的程序员
精通一门语言是最基本的要求
所谓精通,就是要了解这门语言的所有角落和细节,了解每一样语言特性背后的权衡,知道如何用这门语言去解决各种问题
你可以从当前工作要用的语言入手,因为这样反馈最快
如果你想深入理解编程语言
最好不要这么做。。以我个人的经历,我认为收益很低
你应该专注于语言的运行时,这个可能对业务的性能提升有帮助
运行时首先要去阅读相关书籍,比如C#的《C# via CLR》,或者Lua的几篇论文
然后最好能看运行时源码,C#有开源实现,Lua本身是开源的
与运行时相对的是编译时,编译可以和运行时拆分,不影响运行时
编译唯一要解决的问题是编译慢,这里特指C++,编译优化可以单独作为一件事去做
如果你是编程语言学的范畴,我不会
一门编程语言有什么
- 语法
- 标准库
- 第三方库
内嵌语言(DSL)
- Linq(C#)
- 宏(C)
没有了解过Scheme的宏,暂不评价
语法
- 基本数值类型(primitive type,numeric type):
- 规格(精度,大小),默认值,cast,比较;实践中使用时,如何选择
- 常用集合类型/数据结构:string,list,dict(因为常用所以缓存一下),这几个肯定单独去研究,而且肯定包含了集合的常用机制
- 控制流:真的简单;condition的真假(每个语言不一样);switch注意一下(至于string是否慢,我觉得你可以不用考虑)
- 函数:根据作用域不同,全局函数和类函数不一样;lambda自己有闭包,延迟,auto特性;重载resolve规则
- 作用域:复杂,每个语言的分类机制不太一样;作用域还涉及dector
- 模块机制:这个和项目也有关,所以很困难;项目文件管理,如何分文件夹,如何保证可以重构(移动文件位置);如何链接其他文件,包括自己的还有3rd party;如何保证3rd party的版本,配置
- 类:继承机制,多继承,多态的方式;访问修饰符,挺复杂的,怎么指定规范,使得权限合适;
- 修饰符:修饰符是为了配置某一语义,是语言的语法特性;一般一个一个作为主题,参考也方便
- 语法糖:一个一个作为主题,参考方便;一般是与核心系统无关的
- 类型系统/ data model
- 内存管理,变量生命周期:
- 有GC的话轻松不少,但是要知道变量生命周期的区别,保证不要出访问错误;
- C/C++没有GC,指针很复杂,还要考虑前面的作用域
以Python为例
- Tutorial:略;很大一部分都算入标准库
- Lib Reference:
- Built-in
- Lang Reference:语法(sytax),语言要素
- Introduction:略
- Lexical analysis:keyword,literal,operator,(delimiter,id,这两个不太重要)
- Data model:对象,值和类型,魔法方法,协程(竟然是dm)
- Execution model:名字的绑定和决策(resolve;即scope)
- The import system:略,比较琐碎
- Expressions:operators(主要是基于op介绍exp)
- Simple statements:exp,assign,其他单行细节的stats
- Compound statements:控制流和函数,类的定义stats
- Top-level components:dofile层面(内容很少)
- Full Grammar specification:BNF
- HOWTOs:高级主题
- 安装,部署,C API:略
Python CheckList
语法基础
1.理解Python所有的数据类型及其方法与字面常量的表示。特别注意:
tuple与list的异同
字符串的多种字面常量,及各自用法
字符串中的转义及防转义,及其与C/C++的差异;
2.掌握Python的流程语句,包括赋值.条件.循环等。特别注意:
if/elif/else嵌套
while/else和for/else的用法,理清它们与一般语言的不同
3.Python表达式。特别注意:
value if cond else other的三段式表示
list comprehension
常用操作符的运算优先级,及其与C/C++的差异
函数
1.学习函数定义.参数传递.调用方式及返回值规则。特别注意:
没有显式返回值时的情况
list型及dict型的变长参数传递
参数默认值定义规则
2.理解嵌套函数及闭包的用法。
3.理解变量的作用域及生命周期(globals, locals)。
4.yield语句及Generator的使用。
5.熟悉Python官方的内置函数,如enumerate/eval/hasattr等
面向对象编程
1.类的定义及类的基本协议,如__init__
/__str__
等。
2.类的继承,多继承及super的用法,特别是多继承下super调用可能引起的特殊情况。
3.理解属性(property)的应用场合及本质
4.理解类命名空间及其访问规则。
5.理解类的动态性。
6.理解方法和函数的异同
7.类的静态方法.类方法及其与一般方法.函数的异同
8.理解命名空间及对象空间,及此模型与C/C++的模型差异。
9.循环引用产生,解环及无法解环时Python的处理方式。
模块
1.理解模块的本质是什么。
2.分清内置模块.标准模块及扩展模块的区别。
3.理解Python模块的加载机制。
4.熟悉Python官方提供的常用模块,如copy/types/os/random/re/gc等
异常
1.理解异常的使用方法及适用范围。
2.异常的栈展开原理
3.常见的异常类