Published: 2016-11-10 22:40:00
By ytwan
In Program .
tags: things
计算机语言学习和使用
语言本身就是一种工具,一些语言提供了其他语言所没有提出的功能
选择有价值的语言,了解它们之间的区别,分别适合什么任务,以及它们的弱点是什么,能做什么?适合什么任务?是否可用?掌握程度?
为你给定的任务选择最佳的语言
<1>工具相对而言是基础,使用工具的技能才是创造精美物品的关键
工具不是替我们做我们该做的工作,而是使我们有能力做我们的工作
<2>明白不同的情况需要不同的解决方案,并将正确的工具用到正确的工作上
用实际的眼光来看待软件工具。切合实际的向工具投入时间和金钱,磨练你的工具。
<3>时刻准备试用新的工具,确保你所使用的工具是你所获得最适合的。
<4>了解工具嫩做什么,适合什么任务以及学习如何驾驭它
<5>拥有工具的源代码是非常有用的
计算机语言学习
编程语言的架构有三个特点,
一是基本的元素,
二是构成复杂内容的组合方式,
三是抽象能力以及一些机制。
关键字的掌握和区分以及联系,可以为在不同语言中切换带来一个很好的切入口。
除了关键字还有一些方法和重要的类型。在这里也作为关键字学习了。
基本的元素: 语言的类型系统
语言的一致性
组合的手段: JAVA组合 和继承
抽象的机制:
汇编 是对底层机器的轻微抽象
命令式语言<C> 基于计算机的结构,对汇编的抽象,通过以函数为单元
面向对象<JAVA> 基于对象
函数式<Scala> 基于函数和模块
一些处理问题机制
错误处理方式
垃圾回收机制+异常处理机制
状况机制
语言特性:
C语言
C语言是接触的第一门面向过程的语言,也可以称之为命令式编程语言。
关键字分为:
数据类型: void char int float double short long signed unsigned
struct union enum typedef sizeof const
控制结构: if else switch case default
break continue return goto
for do while
其他:auto static registor extern const volatile
JAVA语言
JAVA 是面向对象的编程语言,面向对象中还是借鉴了 C 语言的一些特性
数据结构:基本型和构造型,基本型是 byte boolean void char int float double short long
enum const false true null
控制结构: if else switch case default
break continue return goto
for do while
面向对象特征: abstract extends class interface implements new
final static this super instance of private protected public
try catch throw finally throws
import package assert
其他: synchronized transient
Python语言
Python 是多范式编程,中间还有面向对象特性,函数式编程范式等
数据:False True
控制结构: if else elif
break continue return
for while yield
面向对象: class def
try except raise global assert
函数式: lambda is as and with in form or not
其他 : pass
Scala语言
Scala 也是面向对象和面向函数式编程的多范式语言,使用了模式匹配 case
数据: var val lazy true false null Unit 类
控制结构: if else
return match yield
for do while
面向对象: abstract extends class trait def object
final this super private protected
try catch throw
import package assert
函数式: with forSome type case override sealed implicit
其他:
R语言
R语言也是一门很好的工具
数据结构:numeric logical character complex matrix dataframe factor list table array NA Null NaNTRUE FALSE function
控制结构: if else ifelse
break return case
repeat for in
R语言循环特性不是很好,多习惯用向量化编程。apply之类的才是循环的王道。
面向对象:S3类隐式定义类以及S4类。tryCatch 泛型
其他:
SQL
SQL是工具性语言了
数据类型:integer smallint decimal numberic float double 增加了tinyint ,mediunint ,bigint,BIT类型Mysql支持
database table index view
一些命令
DDL:create drop alter
DML:select insert delete update
DCL: grant revoke
Shell 脚本
Excel工具
作为数据分析来说,适合的就是好的。Excel的操作是靠人去完成的。这个也是一个很好用的工具
不同的操作系统
编码
window 一般是gbk的编码,读取utf-8的文件时,需要声明读取编码就OK了。 source(file,encoding="utf-8")
linux/win两套环境,编码部分要是区别写的
换行符
换行符是不一样的,
MSExcel2007中采用的是 /n 转义字符
记事本只支持 /r/n
不同语言的路径
路径表示方式
斜杠 /
反斜杠 \
斜杠
Windows C:\Program Files\Microsoft Office
C language C:\User\Dae
C plus plus C:\User\Dae
Python C:\User\Dae
MATLAB C:\User\Dae
反斜杠系统:
Linux /home/dmstsai
Java D:/Mycoding/Java
MySQL D:/My_IR/train_.csv load data local infile 'D:\\My'
R language C:/Users/Dage/Documents C:\\Users\\age\\Documents
HTML
XML
\转义
网络文件路径
浏览器 https://www.baidu.com/
编码
C语言
gcc编译的时候 是当作 ansi格式处理,所以会出现乱码
JAVA
对于Java由于默认的编码方式是 UNICODE,所以用中文也易出问题,常见的解决是
String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);
网址路径的编码,
用的是utf-8编码。查询字符串的编码,用的是操作系统的默认编码
R读取,统一用utf-8的。
不同语言安装类库
Java 扩展模块
JDK\jre\lib\ext ,这个文件夹专门放置扩展的jar文件的地方
或者创建Maven工程
Python 安装类库
<1>第三方安装 pip 或者easy_install
<2>setup.py install PIL源码 就可以通过源码方式安装了
R语言
CRAN(Comprehensive R Archive Network)(R综合典藏网)
程序的文件后缀
语言后缀名
C language .c .obj
C ++ .c++
Scala .scala .class
Java .java .class
Python .py
R language .R .Rdata
MATLAB .m .mat
Perl .pl
PHP .php
HTML .html
XML .xml
MySQL .sql
关于Python,py pyw是源文件,pyc pyo是编译的文件 ,
pyd其实是动态链接库本质是windows的dll文件或者unix的so文件 pyw是没有控制台的,也就是默认用pythonw打开的文件
py是默认用python打开的。
pyo是优化的编译文件(虽然目前跟pyc文件基本上没什么区别
程序文件后缀名
安装程序
安装包 软件的所有文件释放到硬盘上,完成修改注册表、修改系统设置、创建快捷方式等工作
可执行程序 卸载程序
打包成双击执行
命令行执行
exe
jar
后缀名 文件类型
.h 头文件
.lib 静态链接库
EXE 可执行程序文件
COM 可执行命令文件
BAT 可执行批处理文件 由DOS或Windows系统内嵌的命令解释器来解释运行。本质,是一堆DOS命令按一定顺序排列而形成的集合。
TXT 文本文件
DAT 数据文件
BAK 备份文件
DLL Dynamic Link Library 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成
以.exe为后缀的文件就是可执行文件,
以.bat为后缀的文件就是可执行批处理文件
动态链接需要发行DLL,但EXE本身比较小,静态链接不需要发行DLL,但本身就比较大了
静态链接产生的执行文件执行是不需要库文件的支持,而动态链接产生的执行文件运行过程中需要库文件支持
静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。要想用就得全要!要不就都别要!:)
linux库文件分为静态库和动态库两种。静态库习惯以.a 结尾,而动态库习惯以.so(shared object)结尾。而且必须以lib开头
不同语言的注释
注释 行注释 块注释
语言 注释符号 注释要求
C language /* 注释 */
C ++ // 行注释
Python #
MATLAB %
Java //
R language #
Perl #
XML <!-- -->
MySQL -- 注释
PHP支持三种注释符号,分别如下:
1.C++风格的单行注释://
2.C风格的多行注释:/*……*/
3.shell风格的注释:#
HTML
1、<!--注释内容-->
2、//注释内容 (在css或javascript中插入单行注释)
3、/*注释内容*/ (在css或javascript中插入多行注释)
MySQL注释符有三种:
1、#注释
2、"-- 注释" (注意--后面有一个空格)
3、/* 注释 */
MATLAB
单行注释 %
块注释符号%{ 和 %}
垃圾回收机制+异常处理机制
异常被认为是一种很优雅的处理错误的机制,
使用try/catch(或类似的关键字)进行捕捉,
然后进行处理或者继续向上抛出异常
C 本身的错误处理风格是 error code
异常机制:即Java或者类似风格的exception handling,使用try/catch(或类似的关键字)进行捕捉,然后进行处理或者继续向上抛出异常;
状况机制:主要指的是Common Lisp风格的做法,即除了抛出异常、捕捉异常以外,还有重启(restart)机制,可以向下移动到某一个指定的代码处理点,例如从错误处继续运行等做法。
希望达到的效果本质上就是避免程序未来会进入acces`1s violation的状态。
想做到这一点,方法也是很简单粗暴的——
只要你在函数里面把运行前该对函数做的检查都查一遍就好了。
这个无论你用exception还是用error code,写起来都是一样的。
区别在于调用你的函数的那个人会怎么样
编程风格
理解自己要使用编程风格和开发方式,了解编程风格是
熟悉自己和其他原子的方式,了解开发方式来进行团队作战的方式
怎么理解所谓的编码风格?
提出的解决方案,以及解决方如何分解,使用目标语言构建
1)结构化编程
一种命令式的编程方法,运用算法分解。以过程为中心,运用自顶向下
的设计技术,考虑完成任务所需的步骤的顺序。
结构化编程技术特征
常用的实现语言:C
2)面向对象的编程
另外的一种命令式的的风格,以数据为中心的模型,考虑数据的生命以及
数据的移动方式。
面向对象的编程的技术特征:抽象、封装、继承、多态
常用的实现语言:Java、C++、Smalltalk python
3)函数式编程
一种声明式的编程风格,基于更加数学化的编程模型。
常见的函数式编程语言:Lisp、Scheme <R> Scala Python
4)逻辑编程
另外一种声明式的编程风格,是想执行器提供一组规则和一个目标陈述
编程语言:Prolog
编程思想
从自己的错误中学习,从别人的错误中学习 产品级的代码 工具型代码
原则:
编程不要相信,用怀疑的眼光审视输入和输出
编码的目标是清晰,在此基础上才可以选择简洁
设置权限,增加预防措施
编译的报错也要开启,兼听则明,虽然这回花费一些时间
使用静态工具检查
使用安全的数据结构
约束
防御性编程有助于程序的安全,防范恶意的滥用和破坏。
进攻性编程
主动尝试打破代码常规<测试时代>
(1)编排代码的格式和板式
使用括号<悬挂式allman<java R> K&R式<C perl >>
(2)代码的命名 和记录
以下划线 以点 以大小写字母 匈牙利命名法
<变量通常是名词或者动词化的名词,变量通常小写字母开头>
<函数在逻辑上是一种行为,多用动词,从使用者的角度命名>
<命名文件>同一类型不要仅仅是大小写的区别,不同类型的文件尽量不要同名
(3)编写注释和处理错误
自文档话的代码
记录创建日期
将旧代码标记为过时
描述每个函数的参数
注释是我们的生命线、记忆钥匙和代码的随篇指导,锦上添花
注释的目标读者是人,而不是机器,注释是主观的东西,编写够用的注释
注释 解释代码的目的、选择实现方式的策略 注释异常、特殊情况
注释的方式 行尾注释 缩进注释 常位于代码的上方
错误从何而来 用户错误 程序员错误 意外情况
错误报告机制 返回值 错误状态变量 异常 终止模式 恢复模式
检测错误 处理错误 <错误来自何处,为什么会,严重性 如何修正>
处理 尽早。尽可能日志报告传播恢复
(4)编码的风格和配合
工具
源代码编辑工具
代码构建工具 编译器 链接器
调试和调查工具
语言支持工具
文档工具
测试类型
单元测试 组件测试 集成测试 回归测试 负载测试 压力测试 疲劳测试 可用性测试
调试
优化
构建安全的代码
阅读代码
目的:
(1)将代码作为参考的文献;
(2)将代码作为范例加以学习;
(3)维护现有的代码;
(4)改进现有的代码;
(5)重用已有的代码;
(6)对代码进行审查。
学习
1. 首先了解该语言的基本数据类型,基本语法和主要语言构造,主要数学运算符和print函数的使用,
2. 其次掌握数组和其他集合类的使用,有基础的话可以理解一下泛型,如果理解不了也问题不大,后面可以补;
3. 简单字符串处理。所谓简单,就是Regex和Parser以下的内容,什么查找替换,截断去字串之类的。不
4. 基本面向对象或者函数式编程的特征,无非是什么继承、多态、Lambda函数之类的
5. 异常、错误处理、断言、日志和调试支持,对单元测试的支持。你不一定要用TDD,但是在这个时候应该掌握在这个语言里做TDD的基本技能;
6. 程序代码和可执行代码的组织机制,运行时模块加载、符号查找机制,这是初学时的一个难点,因为大部分书都不太注意介绍这个极为重要的内容;
7. 基本输入输出和文件处理,输入输出流类的组织,这通常是比较繁琐的一部分,可以提纲挈领学一下,搞清楚概念,用到的时候查就是了。
8. 该语言如何进行callback方法调用,如何支持事件驱动编程模型。在现代编程环境下,这个问题是涉及开发思想的一个核心问题,几乎每种语言在这里都会用足功夫,.NET的delegate,Java的anonymous inner class,Java 7的closure,C++OX的 tr1::function/bind,五花八门。如果能彻底理解这个问题,不但程序就不至于写得太走样,而且对该语言的设计思路也能有比较好的认识;
9. 如果有必要,可在这时研究regex和XML处理问题,如无必要可跳过;
10. 序列化和反序列化,掌握一下缺省的机制就可以了;
11. 如果必要,可了解一下线程、并发和异步调用机制,主要是为了读懂别人的代码,如果自己要写这类代码,必须专门花时间严肃认真系统地学习,严禁半桶水上阵;
12. 动态编程,反射和元数据编程,数据和程序之间的相互转化机制,运行时编译和执行的机制,有抱负的开发者在这块可以多下些功夫,能够使你对语言的认识高出一个层面;
13. 如果有必要,可研究一下该语言对于泛型的支持,不必花太多时间,只要能使用现成的泛型集合和泛型函数就可以了,可在以后闲暇时抽时间系统学习。需要注意的是,泛型技术跟多线程技术一样,用不好就成为万恶之源,必须系统学习,谨慎使用,否则不如不学不用;
14. 如果还有时间,最好咨询一下有经验的人,看看这个语言较常用的特色features是什么,如果之前没学过,应当补一下。比如Ruby的block interator, Java的dynamic proxy,C# 3的LINQ和extension method。没时间的话,我认为也可以边做边学,没有大问题。
15. 有必要的话,在工作的闲暇时间,可以着重考察两个问题,第一,这个语言有哪些惯用法和模式,第二,这个语言的编译/解释执行机制。