一、 排在一切的开始help/search
1 help 当你知道一个命令想了解它的具体用法和含义时help command-name
2 search 当你不知道该用什么命令可以输入你关心的词查找到需要的命令
这两个都使用菜单 *** 作更加方便在最右边help 菜单下
3 log using 创建日志文件就是把你输入的命令得出的结果等在stata results
窗口里显示过的东西都存成一个smc 文件可供以后察看
二、 数据库 *** 作
从其他格式的数据库文件开始
1 使用statatransfer 转化成stata 格式
2 如果是Exce 格式可全选复制打开stata 粘贴到空白的数据编辑窗口里面去
3 stata 命令insheet(读用tab 或逗号分隔的文本)/odbc/infile1(读tab 或space 或逗号分开的文本)/infix/infile2 等
从stata 格式的文件开始
1 打开保存open/ save,可以进行菜单 *** 作当数据库非常大时可能会需要set
memory … 已经打开数据库的情况下该命令可能不被允许使用
Save 命令的重要选项是replace就是把同名文件替换掉这里有时候需要小心一些否则的话可能会带来不期望的结果
2 描述describe/codebook/inspect/summarize/tab/table/display/list
describe 提供变量名变量类型变量标签(label)
codebook 变量名标签非缺生值个数其他统计量type, range, mean, sd, percentile等
inspect 变量名标签该变量数值的结构几个不同值几个正值负值0 值
tabulate 制表有丰富功能
table:制表仅显示离散变量各值的出现频率
summarize 报告均值标准差极值
list: 列举不加任何参数列举所有变量的所有观察值
display 显示后面加的表达式想把stata 当计算器用的话可以在di 后面输入你要计算的式子回车这个式子里可以有数字定义过的scalar 某个变量的某个观察值如I[23]指的是变量I 的第23 个观察值
label: 给变量或者变量的值贴标签
3 变量/观察处理generate/replace/drop/keep/egen
generate: 生成一个变量你需要给它赋值可以用常数缺省 existing 变量的代数式函数注意用函数赋值如gen sumi=sum(i), sumi 的所有观察值都是一样的等于所有I 的加总
replace: 给已有变量赋值结构同gen
drop/keep: 删掉指定变量/除指定变量以外的所有变量
egen 比较智能的变量生成器用于分组加总计数平均等要求数据库sorted by the group
从离散变量生成dummies: tab var gen var(var)如果变量var 有3 个不同值就相应生成了3 个dummies 分别命名为var1 var2 var3
4 数据库处理keep /drop/merge/append/sort
keep/drop 跟if 条件满足/不满足条件的观察删掉
merge 横向合并数据库当两个数据库描述的大体是同一些个体的不同方面的特征合并起来一描述这些个体的所有特征时使用注意简单一对一合并(merge using “dta”)区别于按索引合并merge 索引变量 using “dta”, 这时主客数据库均应按索引变量排序,注意update/update replace 选项
append: 追加观察
sort 排序gsort 智能排序
5 scalar 和matrix 不编程的话用的不多即使用到也是很简单的help 一看就明白
6 function: help function 去找你想用的函数有
Mathematica functions Probability distributions & density functions Random numbers
String functions Programming functions Date functions Time-series functions
Matrix functions 等
三、 估计针对pane data
pane data 的处理需要先制定组代码和时间代码iis …/tis …
1 OLS: reg depenvar covariates, 选项
Predict: 计算残差hat/yhat
变量的系数scalar 存储为_b[变量名]
可以加weight 相当于GLS 处理异方差
2 GLS: pane data 中xtgls 缺省仅假定var( ) var( ) it is u ≠ u ift≠s 即个时期之间存在异方差个体之间方差相同个体之间相互独立时间序列上没有自相关但是通过选项panel(),corr()使协方差矩阵更加复杂当然要求程序运行的时间加长运行gls 需要较大型的矩阵运算所以有时候需要set matsize …后面的数字最大为800
3 random effect fixed effect: xtreg …, re/ferandom effect 作为一种GLS 和xtgls 的不同之处在于对残差的假定不同Randomeffect 里面没有任何形式的异方差但是同一个pane 内部有相关性而这个相关性与时间没有关系是individua effect 引起的所以不是时间序列意义上的马尔可夫过程
4 test:
Hausman specification test: “help hausman” 有详细步骤描述
5 报告结果的两个trick
把结果做成表格选定表格注意是表格不能包括回归结果上面的RSS,F, R-square什么的表头右键copy table 贴到exce 里面就是完美的表格了
把几个回归的结果合并在一起报告一个数列的表
step1: 先做一个回归跟上est store 回归名1
step2: 做另一个回归跟上est store 回归名2
StepN+1 est table 回归名1 回归名2 回归名N, se
就会出来一个合并起来的表格加se 选项同时还报告每一个回归系数的标准差
如果把se 换成star 则自动在估计系数右上加上表示显著性水平的号
四、 do file 的写作
我的经验不多主要是从MR HE 那里听来看来的
1 注释两种以开始一句话该句话被认为是注释
命令后面/ /中间的东西被认为是注释当然后面的也是不算命令的
可以在单命令里使用/ /只能在do files 里使用
2 循环条件语句forvalues/if/…具体用法看帮助
forvalues 里面引用循环指标(say, a)的时候需要这么写`a’, 注意前后两个引号是不一样的如果不是laborhood 教导我恐怕这辈子也想不出来
五、 画图
画图时非常重要的内容可是stata8 用菜单/对话框的方式实现了就没什么难为的了虽然程序里用的时候必须输命令这个命令要实现的任务可以先用对话框实现一遍stata8自己会把完整的命令写出来
不过stata8 有一点不好graph 命令必须制定画图的类型graph var graph var1 var2 这样的命令不被接受而stata7 里面这两个就分别默认为histogram var; twoway(var1,var2)了还有save graph combine graphs 的问题 就是把画好的几个图列在一个大图里显示Stata8和stata7 也不一样7 里面是graph…, saving(name1),…;graph using name1…; 8 里面是graph…,name(name1); graph combine name1…;
当进入解压好的源码包后,使用/configure –help命令,可以获得相应帮助,那我们只要选取参数部分看看-release这个参数显而易见,就是编译Qt以发布版的模式进行,一般来说,最后系统完成后,库就应该是发布版。-release与上面对应,自然是调试版了,如果开发的话,可以选择它吧。-debug-and-release囧,上面那两个的儿子。-developer-build囧,我错了,开发者也可以用这个的,选了这个后,可以进行自动测试,不过还没去用过,以后可以研究研究。-opensource-commercial这两个参数是指是编译是商业版本的,还是开源版本呢,视个人情况而定。-shared-static这两个参数是指Qt的lib以动态还是静态编译生成,这自然也是视个人需要的。-no-fast-fast这两个就很有关系,如果对自己的电脑性能很有信心,那就选第一个,那所有的工程文件都会生成到makefiles中,那编译的时间,估计可以看完变形金刚了。如果选第二个,那就加入子目录和库到makefiles,这样就能加快编译的速度。-no-largefile-largefile顾名思义,支不支持大文件,一般来说,嵌入式里是不会有从超过4G的大文件的,那就选第一个吧。-no-exceptions-exceptions计算机英语够好的人都该懂,这个自然就是异常情况,选则编译器支持抛出异常,否则不支持。-no-accessibility-accessibility可访问性的支持,说实话,这个我真不知道有什么有用了。等哪天发现了,再来好好解释。-no-stl-stl是都加入stl的支持,stl,这应该算是C++程序员应该都了解了,再不济,那也总听说过大名吧。no-sql-<driver>-qt-sql-<driver>-plugin-sql-<driver>这 个可要好好说明下,一般来说,对于一个优秀的项目开发,数据库是必不可少的,qt也自带了大多数数据库驱动,可以完美地支持数据库的使用。对于数 据库的使用,我们可以直接qt驱动编译进去,或者以插件的形式编译进去。一般来说,最简单地就是直接编译进去,但使用插件形式的可以更加灵活,针对不同的 需求将驱动插件添加。其中,<>代表的是驱动名,如果我想直接添加sqlite的支持话,形式如下:-qt-sql-sqlite。其他名称 可以自己查看参数里,有详细地介绍。-system-sqlitesqlite真受欢迎啊,当然那么优秀的嵌入式数据库,本人也是基本使用它来进行开发。这个参数意思是使用 *** 作系统上的sqlite数据库,如果是不太会移植的,可以考虑直接使用qt自带的驱动。-no-qt3support-qt3support这个也是简洁易懂,加不加对qt3的支持。no-xmlpatterns-xmlpatterns选择对xml的支持,如果对网络无需求的话,就不用加了。-no-phonon-phononphonon是qt中处理多媒体的模块,比如放放视频什么来着,不过本人从没用过,也是根据需要选择的。-no-phonon-backend-phonon-backend与上面类似,只不过这两是以插件的形式加入支持。-no-svg-svg是否加入svg的支持,svg即可缩放矢量图形。-no-webkit-webkit是否加入webkit的支持,这可是个好东西,不过如果跟网络不搭界的话,还是不支持吧。-no-scripttools-scripttools是否加入脚本工具的支持,这对php等脚本工程师来说是个很棒的参数,但对于我这样菜鸟,就别提了。-platform target目标平台,这可是关键了,如果不注意的话,编译出来是x86上的话,哪怕是再牛的嵌入式工程师来也没法帮你移植到开发板上。通常,本人是linux-arm-g++。-no-mmx-no-3dnow-no-sse-no-sse2这四个参数是针对CPU的指令集,老实说,我也不甚了解,不过,对于开发并不是影响很大。-qtnamespace把qt的库封装到命名空间,没啥重要用处,依个人爱好加吧。-qtlibinfix将所有的qt的so库重命名,也没啥大用处。-no-sql-<driver>-qt-sql-<driver>-plugin-sql-<driver>-system-sqlite这是相当明显的,如果这都看不出来,,囧,那您一定比我近视(本人800度近视。。)就 是说如果是-no-XX-,就说明编译时不选择这个参数,如过是-qt-XX-,说明我们可以编译直接选用qt自带的驱动,如果是 -plugin-XX-,就是将驱动以插件形式编译,而-system-XXX,当然是使用 *** 作系统提供的驱动,不过那就需要您自己移植了,而且有时还要 用第三方的API,就方便来说非常麻烦,但是不排除您是牛人要好好玩玩的情况。接下来,我们接着研究配置参数。-qt-zlib-system-zlib想 必经过上面的讲解,参数的意思已经很快得知,就是选择qt带的zlib库还是系统的zlib。zlib库是用于文件和资料压缩的库,对于新入嵌入式的人来 说,可能并无太大的用处,但是在以后的实际开发中,特别是对于多媒体图像图形的工程师来说,就肯定用到,因为图形图像的压缩都要使用或涉及到这个库。-no-gif-qt-gif这是选择gif的支持,如果选择qt支持的话,那在用qt开发的项目中,就能显示gif图,gif也是比较普遍的格式了,英文全称是Graphics Interchange Format。-no-libtiff-qt-libtiff-system-libtifftiff是一种非常复杂的光栅图像格式,并且有直接现成的C语言实现库,因此选择参数时就有了qt和system,一般来说,科学相关的开发里可能会用到。-no-libpng-qt-libpng-system-libpngpng的相关参数,一种非失真性压缩位图图形文件格式,其实就是为了替代gif搞出来的,也是随实际需要来选择,当然,也有C语言实现的库。-no-libmng-qt-libmng-system-libmng大汗,大汗,这可是超级罕见的东西,QT竟然也能支持,说实话,这个参数我看来就是无视的。MNG是多帧PNG动画格式,结构极其复杂,基本没人用。-no-libjpeg-qt-libjpeg-system-libjpegjpeg,这么有名的格式也不用说了,随需要选择吧。-no-openssl-openssl-openssl-linkedSSL,Security Socket Layer,是一个安全传输协议,在Internet网上进行数据保护和身份确认,而OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件 包,在qt中,我们可以选择直接支持,或者OpenSSL链接支持,这个参数也是为有需要者提供的。以上是第三方库的参数选择,紧接着就是qt附加参数,在附加参数里,我们可以指定编译的部分及加入参数来获取信息。-make-nomake一 句话,说明,就说我可以这两个参数选择哪些我要编译,哪些我不需要,在 libs tools examples demos docs translations这些里你可以选择,比如examples,并不重要,可以放在-nomake后,这样编译过程中就不会编译这部分了。通过适当的 选择,我们可以大大加快编译的速度,这对配置较差的机子来说有着积极意义。-R <string>-l <string>这两个参数是为编译时增加一个库的运行路径及头文件的路径,比如使用tslib作为开发触摸驱动时,我们就应使用这两个参数来指定tslib的库路径和头文件路径。-no-rpath-rpath这个参数比较难于理解,简单地说,就是告诉动态加载器,到-rpath指定的目录中寻找编译时须要的动态链接库,语法就与上面的参数结合,比如 -rpath -R/home/xxxx。-continue这个参数的作用就是当出现错误时依然进行配置编译,换我是不会加上的。-verbose, -v这个参数就很眼熟,在前面的文章中有过详细介绍,简言之,就是显示配置的每一步的具体信息。-no-optimized-qmake-optimized-qmake是否编译生成优化过的qmake,没啥大用,也属于可有可无的参数。-no-nis-nis是否编译NIS支持,NIS(网络信息服务)是一个提供目录服务的RPC(远程过程调用)应用服务,当然没网络需要的可以再次华丽地无视。-no-cups-cups是 否编译CUPS支持,是不是想问什么用啊~~~~囧,开打印店用的。好了,不说冷笑话,CUPS给Unix/Linux用户提供了一种可靠有效 的方法来管理打印。它支持IPP,并提供了LPD,SMB(服务消息块,如配置为微软WINDOWS的打印机)、JetDirect等接口。CUPS还可 以浏览网络打印机。它的开发提供者是大名鼎鼎的“水果生产商”----苹果公司。-no-iconv-iconv选择是否编译iconv支持,iconv是一个计算机程序以及一套应用程序编程接口的名称。它的作用是在多种国际编码格式之间进行文本内码的转换。这对跨语言Qt开发人员来说是很有用的,当然,考虑到中文的编码,我也选择加入支持。-no-pch-pch是 否支持预编译过的头文件。预编译头就是把一个工程中的一部分代码,预先编译好放在一个文件里(通常以pch为扩展名),这个文件就称为预编译头 文件。这些预先编译好的代码在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。妈妈经常说:不懂就要学。我说:不 懂就加上。。。no-dbus-dbus-dbus-linked是否编译编译QtDBus模块。dbus是freedesktop下开源的Linux IPC通信机制,本身Linux 的IPC通信机制包括,管道(fifo),共享内存,信号量,消息队列,Socket等。在Qt中DBUS是有单独的模块的,可见其重要性。 -reduce-relocations 对于额外的库链接器优化,可以减少编译中的再定位。no-separate-debug-info-separate-debug-info是否存储debug信息在debug,一般为了查错,还是选择存储吧。-xplatform target相当浅显的参数,即交叉编译的目标平台,一般来说根据你所要移植的目标板来确定。-no-feature-<feature>-feature-<feature>选 取qte的feature编译,对于这个,我理解为特性,特性的描述你可以参考src/corelib/global/qfeaturestxt,在这 里面对于每个特性都有比较充分的讲解。对于特性地选择,也是要根据开发需求进行,如果裁剪适当,能大大为qte库瘦身。-embedded <arch>嵌入式平台架构选择,可以选择arm,mips,x86及generic,视你的目标平台决定吧。-armfpa-no-armfpa这个参数也只是针对ARM平台的,是否加入对于基于ARM的浮点数格式的支持,通常,这个参数在编译时会自动选择。-little-endian-big-endian目标平台的大端和小端选择,这应该是常识了,如果这不知道,就不要来混嵌入式了-host-little-endian-host-big-endia主机平台的大端和小端选择,属于鸡肋的参数,不选择也会在配置时自动选择。-no-freetype-qt-freetype-system-freetype选择freetype,FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,在嵌入式开发中,有套可使用的字体对于中文开发至关重要,本人一般使用文泉驿字体。-qconfig local使用本地的qconfig配置文件来替代全部参数配置,有需要的可以去研究下,可以裁剪控件级别的参数。-depths <list>显示的像素位深,也是根据需要来进行吧。-qt-decoration-<style>-plugin-decoration-<style>-no-decoration-<style>这个是选择qt的样式风格,对于需要美化界面的项目来说,可以好好选择下。-no-opengl-opengl <api>是否加入opengl的支持,OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。不过对于一般的开发来说,似乎有很少用到的地方。-qt-gfx-<driver>-plugin-gfx-<driver>-no-gfx-<driver>这个是相当重要的一个参数,选择QtGui的图形显示驱动,比如我们在pc上使用qvfb模拟时,就应该加入对qfvb的支持。我们可以在 linuxfb,transformed,qvfb,vnc,multiscreen这几个中选择。在平常的开发板上,选择linuxfb即可。-qt-kbd-<driver>-plugin-kbd-<driver>-no-kbd-<driver>选择键盘的驱动支持,可以支持usb键盘,串口键盘等等,也是在tty,usb ,sl5000, yopy, vr41xx ,qvfb中选择。qt-mouse-<driver>-plugin-mouse-<driver>-no-mouse-<driver>鼠标的驱动支持,一般都会选择tslib,可以完美地支持触摸屏,在pc,bus,linuxtp,yopy,vr41xx,tslib,qvfb中选择吧。-iwmmxt加入iWMMXt指令的编译,也只是部分XScale架构才具有。-no-glib-glib是否加入glib库的支持,glib库对应即gtk库,就也是说加入后可以使用gtk。
为什么说 Kotlin 是优秀的
本文不会像一般介绍语言的文章那样,一开头就罗列出语言那些酷炫的特性,我们稍后再来探讨这些内容。
首先我将介绍一些其它的信息,因为2013 年一项研究显示,当开发者评估一种编程语言时生态系统要比语言特性更重要。这符合我个人的经验,下面就让我开始介绍吧:
Kotlin 被编译成 JVM 字节码或者 JavaScript 代码。Java 开发者将会是对它最感兴趣的人,不过对于使用垃圾收集运行时语言的开发者而言它也具有一定的吸引力,比如 Scala、Go、Python、Ruby 和 JavaScript 等语言。
Kotlin 来自业界,而不是学术界。它解决了开发者现今面临的实际问题。例如它的类型系统可以帮助你避免空指针异常。
切换到 Kotlin 无需成本!它是开源的但这不是重点,重点是它提供了一个高质量的一键从 Java 转换到 Kotlin 的工具,并且十分关注 Java 二进制文件的兼容性。你可以将现有 Java 项目的一次性转换成 Kotlin 项目,而该项目仍将可以正常编译,即使这是一个包含上百万行代码的复杂程序。
显然你可以从上文得知,Kotlin 程序能够使用所有现存的 Java 框架和库,甚至那些依赖注解处理的高级框架。它们之间的交互是无缝的,不需要包装或者适配层。Kotlin 可以整合 Maven,Gradle 以及其它构建系统。
它十分平易近人,语法精炼直观,仅仅是阅读语言参考文档几个小时就能学会使用。Kotlin 看起来十分像 Scala 但是更加简洁并且兼顾了可读性。
它不遵循特定的编程哲学,例如极度的函数式编程或者面向对象编程风格。
它不会增加运行时的开销。Kotlin 的标准库十分小巧紧凑:专注于扩展 Java 标准库,编译阶段的大量内联 *** 作意味像 map/filter/reduce 等管道结构函数将被编译成类似于命令式语言的代码。
Anko 与 Kovenant 等框架的出现意味着在 Android 开发者中 Kotlin 开始变得流行起来。如果你正在从事 Android 相关的工作,相信你很快就会获得好的工作。你可以阅读这份 Square 公司开发者 JakeWharton 的报告,了解用 Kotlin 进行 Android 开发的体验。
Kotlin 允许你继续使用你的工作效率提升工具。IntelliJ 的 IDE 对 Kotlin 的支持十分完善:你可以对代码进行重构、搜索、导航以及使用自动完成,而且 IDE 充分支持调试、单元测试、性能分析等等功能。
除了 Android,我认为 Kotlin 还非常适用于企业中 Java 的应用场景。如果你的工作是整天埋头于大公司的代码库中,那么当 Kotlin 10 版本正式发布时你应该尽快去了解一下:
由知名公司为它提供强大的商业支持。 JetBrains 这家公司 有一个高度称职的大团队致力于该项目,有稳定的商业模式甚至在自己的部分旗舰产品中使用 Kotlin,这表明短期内 Kotlin 不会被放弃。
使用 Kotlin 风险较低:可以由一两个感兴趣的团队成员在项目中小范围的试验 Kotlin,这并不会扰乱你的项目,因为 Kotlin 的类对外提供的 Java API 看起来就与普通的 Java 代码一样。
因为 Kotlin 十分注重语法的可读性,代码审查不会成为问题,对 Kotlin 不熟悉的团队成员仍然能够完成该工作。
Kotlin 基于 Java 6,所以假如你难以在项目中升级使用新版本的 JVM,你可以使用 Kotlin。
今年早些时候我向 Swiss Re 这家瑞士再保险公司的团队(他们使用 Java 和 NET)展示了 Kotlin。首先我定义了一个简单的 Java 类包含一些字段以及 toString、equals、hashCode 等方法,大概有 50 行代码。然后我将它转换成 Kotlin 代码(大部分是自动完成的),结果仅剩 1 行代码,接着我还演示了其它节省时间的特性。他们看过后对 Kotlin 充满了热情并且认为 Kotlin 是它们项目中 C# 语言的一个潜在竞争对手。
我认为 Kotlin 正中企业 Java 开发者的红心,所以尽管 Kotlin 是免费的,JetBrains 还是能够通过它增加商业版本 IDE 的销售来赚大钱。这将激励他们根据用户的意愿持续改进它。
与此相比,对于那些由不相关产品资助的语言开发者来说,当用户需求与之前的设计理念冲突时,他们很少会因此作出调整。
特性
Kotlin 作为一门新的编程语言能够脱颖而出,是因为它关注生态系统:JetBrains 懂得生产力的高低更多的取决于生态系统而不是便捷的语法。
尽快如此,Kotlin 还是有许多有用的特性能让你编码的过程变得愉快:
我们已经提过 null 安全(可选),它能够让编译器系统的标记潜在的空指针引用。与一些语言不同的是它不涉及 option 类,因此是零开销的,并且还有其它语言特性确保它不会造成不便。
精炼的语法:无处不在的类型推断、简单的函数只需要一行、简单的结构以及 JavaBeans 也只需要一行就能声明、真正的属性——可以在背后自动生成 getFoo/setFoo 方法用于与 Java 进行交互、函数可以独立存在于类之外。
异常均为非检查型。(译者注:感兴趣的可以阅读一下Java 理论与实践: 关于异常的争论)
使用 data class 关键字创建数据类会自动生成通用方法,例如 equals、hashCode、toString 以及 copy 和 componentN(同时声明多个变量时会调用该方法)。这将帮助你在不使用构建器的情况下便捷的获得不变类(immutable classes)。
但如果你需要构造复杂的结构体,借助类型安全的构建器这个特性可以简洁的实现。如果你使用 Google Protocol Buffers 来存储结构化数据, 通过 KBuilders 这个库也能很轻易做到。
支持函数式编程以及零开销的 lambda 表达式,能够在 Java 的集合中做 Map、Filter、Folder 等处理。Kotlin 的类型系统能够自动识别可变或者不可变的集合。
扩展函数特性能够让你在不改动源码的情况下为类添加方法。乍眼一看以为是为了避免写出像 FooUtils 这种风格工具类的语法糖,不过随着使用的加深,你会认识到它不仅能帮你更加容易的通过自动完成使用方法,还能协助你集成现有的 Java API 以及借助其它 Kotlin 特性构建功能强大的扩展。
支持运算符重载,但是不会像 Scala 或者 Perl 那样出现难以理解的代码。运算符被映射成相应名字的方法,通过重写这些方法改变运算符的行为(包括函数调用),但是不能定义新的运算符。这使得程序能够兼顾功能与可读性。
Kotlin 没有宏或者其它的方式来重定义语言,但是通过这些精心设计的特性能够使第三方库自由的对它进行扩展,官方对集合类进行的扩展也只是小试牛刀而已,请看以下例子。
想使用 fibers、actors 和 Go 风格的 channels?一个名为 Quasar 的库已经为你实现了。
使用 Markdown 替代 HTML 来编写 API 文档,这样编写 JavaDocs 可比以前舒适多了。(译者注:JetBrains 提供了相应的文档生成器 Dokka)
更好用的泛型。如果你没有完全掌握泛型参数中 super 以及 extends 的含义,别担心,这不是你的错。Java 的泛型的确令人费解,Kotlin 解决了这个问题。
委托是一个大家都知道的设计模式,Kotlin 原生支持它。
== 运算符的行为符合预期(译者注:简单来说 a == b 相当于 aequals(b);新增了 === 运算符,用来判断运算符两边是否指向同一个对象)
想快速便捷的进行异步编程吗?当然!
字符串插值“可以使用这样的写法在字符创中直接引用变量 {thisexample}”
函数中的参数可以指定默认值、使用可变长度以及通过参数名传参。
还有许多的调整与优化。假如 Java 中有某些让你觉得困扰的问题,我相信 Kotlin 一定已经把它处理好了。
现在就来试用一下!
跟很多现代编程语言一样,Kotlin 可以通过网页浏览器来进行体验。不过跟其他语言不一样的是,Kotlin 的实验网站提供了一个成熟的 IDE,包括响应很快的自动完成,实时的后台编译,甚至还有在线的静态分析!
在线试用一下吧
好了,让我们继续接下来的内容
目前存在哪些问题?
生活中没有什么是完美的,包括 Kotlin。以下是我尝试这门语言时遇到的一些问题。
最大的问题是不够成熟,因为 Kotlin 目前还处于 Beta 阶段,这意味着:
每更新一个版本,语法、ABI 以及标准库就变一次。好消息是这些变化通常比较微小,可以借助 IntelliJ IDE 来自动升级你的代码,所以这个过程并不会太麻烦。
Java-to-Kotlin 的转换工具(J2K)还没有完成。它偶尔会大规模的破坏和默默地擦除 Java 8 中的 Lambdas(修改:2015 年 10 月:M13 版本的转换工具已经可以正确地处理 Java 8 的特性了)。由它转换而成的代码并不总是最好的写法,但是 JetBrains 为这个工具付出了大量努力,它已经是我用过的语言转换工具中最好的了。所以我并不太担心这个问题,这个转换器正在迅速的改进中,变得越来越成熟。
你会遇到编译器错误。尽管我的程序并不大,但还是会发生无法编译的情况,甚至错误的编译结果。诊断这些问题并不难,但终归还是影响了开发的体验。
你会遇到 IDE 内部错误。当这个错误发生时,IntelliJ IDE 会d出一个悬浮窗口,附带向 JetBrains 报告的选项。大部分错误无需理会,不过依然会使人厌烦。
偶尔会出现无法加载提示文档的错误(修改:M14 版本发布后,这个问题已被修复)
目前 JetBrains 正致力于完善发布 10 版本而不是添加新的功能,期待这些问题能够得到修复。
第二个我遇到的比较大的问题是,有时与 Java 的交互会受到局限。
一个典型的 Bug 是 Java 的类型系统无法防止你改变 Map 中 Key 的类型。按理来说,这样 *** 作应该导致编译器报错,例如使用类型错误的 Key 删除元素。有些 JDK 中的集合使用了泛型,它们某些重要方法的泛型参数是 Obejct,所以编译器不会提示。当在 IntelliJ IDE 中编写 Java 代码时会有静态分析的警告,但是目前 Kotlin 环境还没有这个功能。因为 Kotlin 使用的是 Java 的集合框架没有自己实现,所以这导致了一些类型安全方面的问题,我已经遇到好几次了。
(修改:10 Beta 版本中这个问题已经解决了,Java 中集合框架的类型安全缺陷在 Kotlin 已经不复存在。哟呵!)
另一个例子是,当调用或使用 Java 代码时 Kotlin 的 Null 安全特性无法发挥作用(可以借助注解弥补)。作为 Kotlin 的初学者,刚开始你可能会写许多调用 Java 库的代码,但是因为以上的问题它们并没有你想象中那么好用。这种情况的改善只能等待 Kotlin 使用人数的增长。JetBrains 一直在尝试使 Null 安全特性能体现在 Java 交互中,这种想法是好的,但有时考虑并太周全。(修改: 从 M13 版本开始,在 Java 代码中将自动以 @NotNull @Nullable 等注解实现 Kotlin 的 Null 安全特性)
虽然有以上的问题存在,但同时也使得我们能更流畅的使用 Java API,我觉得这种权衡是值得的,只是在开发中要注意。
其它需要考虑的问题:
Kotlin 的社区还比较小。虽然目前没有多少 Kotlin 的库可以使用,但是凭借优秀的 Java 交互能力,Kotlin 可以使用现有成熟的 Java 库。
如果你喜欢看书来学习,那么你需要等到今年晚些时候才能看到 Kotlin 开发者写的书(译者注:Kotlin in Action)
纯粹的函数编程风格开发者可能会觉得类型系统中缺乏一些 Scala 或 Haskell 拥有的高级功能。如果你对类型系统一些功能比较看重,那么 Kotlin 可能不适合你。
Kotlin 还能编译成 Javascript 代码,但是比较少用,所以可能会遇到更多的问题,这是我从论坛中得到的印象。(修改: 目前 Kotlin 的开发重心在于完成 10 版本并使其稳定运行在 JVM 中,Javascript 方面的问题将会在 10 发布后着手解决)
没有标准的编程风格指南,目前 Kotlin 提供了多种语法可供选择。不同人写出来的 Kotlin 代码很可能完全不一样。这与 Go 严格的风格形成了鲜明的对比。(修改: Kotlin 10 版本开始,一些灵活的语法已经被移除了,例如现在重载运算符以及定义中缀函数时必须分别使用 operator 和 infix 关键字进行标记)
Kotlin 的编译速度稍稍慢于 Java,以及 IntelliJ IDE 的智能提示反应有点缓慢,不算严重而且比 Scala 快多了。(修改:Kotlin 10 开始编译速度有了明显提升)
Kotlin 有一个 Eclipse 插件,但是很明显没有 IntelliJ 的好用。
Kotlin 在某些方面比 Java 要严格。它不会自动将 Int 转换为 Long 类型,需要开发者显示的转换。这是因为 Kotlin 关注正确性和试图解决《Java Puzzlers》一书中提出的问题。JetBrains 声称他们已经搞定一半了。
Kotlin 基于 Java 6,因此会受到它的局限。Kotlin 与 C# 在很多领域都很相似甚至比 C# 做得更好,但是它缺少一些功能,例如 Java 平台尚未支持的某些数据类型。
为什么应该开始考虑使用 JVM
最近一段时间我遇到了很多使用动态脚本语言(JavaScript 或者 Go —— 译者注:Go 应该是静态编译型语言)的创业公司。
我在 Bitcoin Space 工作的时候,使用动态语言是非常痛苦的事情。在这些语言里没有安全性的类型,这已经导致了巨大的货币损失。Go 比较少出错,但是在基础层面上给人的体验依然很差,比如说缺少好的调试工具,快速 GC 机制,稳健的管理器以及可靠的分析工具。
过去 15 年或者更长时间里,Java 变得越来越健壮,越来越冗长,甚至有过度设计的迹象,这些变化很大程度上源于它的声誉。企业级 Java 类的名字 PathVariableMapMethodArgumentResolver 就是例证。在很长一段时间里我没有考虑 JVM,我确信这种环境并不适合我。
最终我因为 Android 被迫回到 Java,发现 Java 的开发环境已经改变了。虽然 XML 仍然不合时宜的频繁出现在各种场合,但是一些基础功能十分完善,令人印象深刻。 IntelliJ 是比 Eclipse 更快并且更智能的 IDE。Maven 一出现就得到了迅速的发展,拥有许多原本我想要其它构建 / 依赖系统增加的功能。较新的 Web 框架像 Ninja 和 Play 从类似 Ruby on Rails 的框架中学到了轻量简洁。有大量的库可供使用。硬件性能变得更高以及 JVM 变得更有效率,等等转变。
没有真正改变的是语言本身,Java 代码写起来依然是令人不快的冗长。
现在有了 Kotlin,完全无需承受离开 Java 现有的生态系统的疼苦。你可以编写更富有表现力的代码,但是却比脚本语言更简洁,同时拥有更好的性能和更少的错误。
如果你喜欢 JavaScript,可以尝试 Kotlin 的 JS 后端,或者在 Nashorn JS 引擎里运行你现有的代码。
最后,如果你喜欢 Go 语言是因为它可以编译独立运行的程序,那么试试 javapackager 工具。Kotlin 在本地为每个平台创建了捆绑包,这意味着在 linux 上不需要 JRE 的依赖就可以独立自主的获取 DEBs(linux 的安装包)或者压缩包。当然,它拆包之后不是单个文件而是单个目录,从部署的角度来看并不难 *** 作。
简而言之:如果你之前因为看 Java 不顺眼而忽略了 JVM 的生态系统,那么你应该借着 Kotlin 这门新语言进入这个世界瞧瞧。
当进入解压好的源码包后,使用/configure –help命令,可以获得相应帮助,那我们只要选取参数部分看看
-release
这个参数显而易见,就是编译Qt以发布版的模式进行,一般来说,最后系统完成后,库就应该是发布版。
-release
与上面对应,自然是调试版了,如果开发的话,可以选择它吧。
-debug-and-release
囧,上面那两个的儿子。
-developer-build
囧,我错了,开发者也可以用这个的,选了这个后,可以进行自动测试,不过还没去用过,以后可以研究研究。
-opensource
-commercial
这两个参数是指是编译是商业版本的,还是开源版本呢,视个人情况而定。
-shared
-static
这两个参数是指Qt的lib以动态还是静态编译生成,这自然也是视个人需要的。
-no-fast
-fast
这两个就很有关系,如果对自己的电脑性能很有信心,那就选第一个,那所有的工程文件都会生成到makefiles中,那编译的时间,估计可以看完变形金刚了。如果选第二个,那就加入子目录和库到makefiles,这样就能加快编译的速度。
-no-largefile
-largefile
顾名思义,支不支持大文件,一般来说,嵌入式里是不会有从超过4G的大文件的,那就选第一个吧。
-no-exceptions
-exceptions
计算机英语够好的人都该懂,这个自然就是异常情况,选则编译器支持抛出异常,否则不支持。
-no-accessibility
-accessibility
可访问性的支持,说实话,这个我真不知道有什么有用了。等哪天发现了,再来好好解释。
-no-stl
-stl
是都加入stl的支持,stl,这应该算是C++程序员应该都了解了,再不济,那也总听说过大名吧。
no-sql-<driver>
-qt-sql-<driver>
-plugin-sql-<driver>
这 个可要好好说明下,一般来说,对于一个优秀的项目开发,数据库是必不可少的,qt也自带了大多数数据库驱动,可以完美地支持数据库的使用。对于数 据库的使用,我们可以直接qt驱动编译进去,或者以插件的形式编译进去。一般来说,最简单地就是直接编译进去,但使用插件形式的可以更加灵活,针对不同的 需求将驱动插件添加。其中,<>代表的是驱动名,如果我想直接添加sqlite的支持话,形式如下:-qt-sql-sqlite。其他名称 可以自己查看参数里,有详细地介绍。
-system-sqlite
sqlite真受欢迎啊,当然那么优秀的嵌入式数据库,本人也是基本使用它来进行开发。这个参数意思是使用 *** 作系统上的sqlite数据库,如果是不太会移植的,可以考虑直接使用qt自带的驱动。
-no-qt3support
-qt3support
这个也是简洁易懂,加不加对qt3的支持。
no-xmlpatterns
-xmlpatterns
选择对xml的支持,如果对网络无需求的话,就不用加了。
-no-phonon
-phonon
phonon是qt中处理多媒体的模块,比如放放视频什么来着,不过本人从没用过,也是根据需要选择的。
-no-phonon-backend
-phonon-backend
与上面类似,只不过这两是以插件的形式加入支持。
-no-svg
-svg
是否加入svg的支持,svg即可缩放矢量图形。
-no-webkit
-webkit
是否加入webkit的支持,这可是个好东西,不过如果跟网络不搭界的话,还是不支持吧。
-no-scripttools
-scripttools
是否加入脚本工具的支持,这对php等脚本工程师来说是个很棒的参数,但对于我这样菜鸟,就别提了。
-platform target
目标平台,这可是关键了,如果不注意的话,编译出来是x86上的话,哪怕是再牛的嵌入式工程师来也没法帮你移植到开发板上。通常,本人是linux-arm-g++。
-no-mmx
-no-3dnow
-no-sse
-no-sse2
这四个参数是针对CPU的指令集,老实说,我也不甚了解,不过,对于开发并不是影响很大。
-qtnamespace
把qt的库封装到命名空间,没啥重要用处,依个人爱好加吧。
-qtlibinfix
将所有的qt的so库重命名,也没啥大用处。
-no-sql-<driver>
-qt-sql-<driver>
-plugin-sql-<driver>
-system-sqlite
这是相当明显的,如果这都看不出来,,囧,那您一定比我近视(本人800度近视。。)
就 是说如果是-no-XX-,就说明编译时不选择这个参数,如过是-qt-XX-,说明我们可以编译直接选用qt自带的驱动,如果是 -plugin-XX-,就是将驱动以插件形式编译,而-system-XXX,当然是使用 *** 作系统提供的驱动,不过那就需要您自己移植了,而且有时还要 用第三方的API,就方便来说非常麻烦,但是不排除您是牛人要好好玩玩的情况。
接下来,我们接着研究配置参数。
-qt-zlib
-system-zlib
想 必经过上面的讲解,参数的意思已经很快得知,就是选择qt带的zlib库还是系统的zlib。zlib库是用于文件和资料压缩的库,对于新入嵌入式的人来 说,可能并无太大的用处,但是在以后的实际开发中,特别是对于多媒体图像图形的工程师来说,就肯定用到,因为图形图像的压缩都要使用或涉及到这个库。
-no-gif
-qt-gif
这是选择gif的支持,如果选择qt支持的话,那在用qt开发的项目中,就能显示gif图,gif也是比较普遍的格式了,英文全称是Graphics Interchange Format。
-no-libtiff
-qt-libtiff
-system-libtiff
tiff是一种非常复杂的光栅图像格式,并且有直接现成的C语言实现库,因此选择参数时就有了qt和system,一般来说,科学相关的开发里可能会用到。
-no-libpng
-qt-libpng
-system-libpng
png的相关参数,一种非失真性压缩位图图形文件格式,其实就是为了替代gif搞出来的,也是随实际需要来选择,当然,也有C语言实现的库。
-no-libmng
-qt-libmng
-system-libmng
大汗,大汗,这可是超级罕见的东西,QT竟然也能支持,说实话,这个参数我看来就是无视的。MNG是多帧PNG动画格式,结构极其复杂,基本没人用。
-no-libjpeg
-qt-libjpeg
-system-libjpeg
jpeg,这么有名的格式也不用说了,随需要选择吧。
-no-openssl
-openssl
-openssl-linked
SSL,Security Socket Layer,是一个安全传输协议,在Internet网上进行数据保护和身份确认,而OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件 包,在qt中,我们可以选择直接支持,或者OpenSSL链接支持,这个参数也是为有需要者提供的。
以上是第三方库的参数选择,紧接着就是qt附加参数,在附加参数里,我们可以指定编译的部分及加入参数来获取信息。
-make
-nomake
一 句话,说明,就说我可以这两个参数选择哪些我要编译,哪些我不需要,在 libs tools examples demos docs translations这些里你可以选择,比如examples,并不重要,可以放在-nomake后,这样编译过程中就不会编译这部分了。通过适当的 选择,我们可以大大加快编译的速度,这对配置较差的机子来说有着积极意义。
-R <string>
-l <string>
这两个参数是为编译时增加一个库的运行路径及头文件的路径,比如使用tslib作为开发触摸驱动时,我们就应使用这两个参数来指定tslib的库路径和头文件路径。
-no-rpath
-rpath
这个参数比较难于理解,简单地说,就是告诉动态加载器,到-rpath指定的目录中寻找编译时须要的动态链接库,语法就与上面的参数结合,比如 -rpath -R/home/xxxx。
-continue
这个参数的作用就是当出现错误时依然进行配置编译,换我是不会加上的。
-verbose, -v
这个参数就很眼熟,在前面的文章中有过详细介绍,简言之,就是显示配置的每一步的具体信息。
-no-optimized-qmake
-optimized-qmake
是否编译生成优化过的qmake,没啥大用,也属于可有可无的参数。
-no-nis
-nis
是否编译NIS支持,NIS(网络信息服务)是一个提供目录服务的RPC(远程过程调用)应用服务,当然没网络需要的可以再次华丽地无视。
-no-cups
-cups
是 否编译CUPS支持,是不是想问什么用啊~~~~囧,开打印店用的。好了,不说冷笑话,CUPS给Unix/Linux用户提供了一种可靠有效 的方法来管理打印。它支持IPP,并提供了LPD,SMB(服务消息块,如配置为微软WINDOWS的打印机)、JetDirect等接口。CUPS还可 以浏览网络打印机。它的开发提供者是大名鼎鼎的“水果生产商”----苹果公司。
-no-iconv
-iconv
选择是否编译iconv支持,iconv是一个计算机程序以及一套应用程序编程接口的名称。它的作用是在多种国际编码格式之间进行文本内码的转换。这对跨语言Qt开发人员来说是很有用的,当然,考虑到中文的编码,我也选择加入支持。
-no-pch
-pch
是 否支持预编译过的头文件。预编译头就是把一个工程中的一部分代码,预先编译好放在一个文件里(通常以pch为扩展名),这个文件就称为预编译头 文件。这些预先编译好的代码在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。妈妈经常说:不懂就要学。我说:不 懂就加上。。。
no-dbus
-dbus
-dbus-linked
是否编译编译QtDBus模块。dbus是freedesktop下开源的Linux IPC通信机制,本身Linux 的IPC通信机制包括,管道(fifo),共享内存,信号量,消息队列,Socket等。在Qt中DBUS是有单独的模块的,可见其重要性。
-reduce-relocations 对于额外的库链接器优化,可以减少编译中的再定位。
no-separate-debug-info
-separate-debug-info
是否存储debug信息在debug,一般为了查错,还是选择存储吧。
-xplatform target
相当浅显的参数,即交叉编译的目标平台,一般来说根据你所要移植的目标板来确定。
-no-feature-<feature>
-feature-<feature>
选 取qte的feature编译,对于这个,我理解为特性,特性的描述你可以参考src/corelib/global/qfeaturestxt,在这 里面对于每个特性都有比较充分的讲解。对于特性地选择,也是要根据开发需求进行,如果裁剪适当,能大大为qte库瘦身。
-embedded <arch>
嵌入式平台架构选择,可以选择arm,mips,x86及generic,视你的目标平台决定吧。
-armfpa
-no-armfpa
这个参数也只是针对ARM平台的,是否加入对于基于ARM的浮点数格式的支持,通常,这个参数在编译时会自动选择。
-little-endian
-big-endian
目标平台的大端和小端选择,这应该是常识了,如果这不知道,就不要来混嵌入式了
-host-little-endian
-host-big-endia
主机平台的大端和小端选择,属于鸡肋的参数,不选择也会在配置时自动选择。
-no-freetype
-qt-freetype
-system-freetype
选择freetype,FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,在嵌入式开发中,有套可使用的字体对于中文开发至关重要,本人一般使用文泉驿字体。
-qconfig local
使用本地的qconfig配置文件来替代全部参数配置,有需要的可以去研究下,可以裁剪控件级别的参数。
-depths <list>
显示的像素位深,也是根据需要来进行吧。
-qt-decoration-<style>
-plugin-decoration-<style>
-no-decoration-<style>
这个是选择qt的样式风格,对于需要美化界面的项目来说,可以好好选择下。
-no-opengl
-opengl <api>
是否加入opengl的支持,OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。不过对于一般的开发来说,似乎有很少用到的地方。
-qt-gfx-<driver>
-plugin-gfx-<driver>
-no-gfx-<driver>
这个是相当重要的一个参数,选择QtGui的图形显示驱动,比如我们在pc上使用qvfb模拟时,就应该加入对qfvb的支持。我们可以在 linuxfb,transformed,qvfb,vnc,multiscreen这几个中选择。在平常的开发板上,选择linuxfb即可。
-qt-kbd-<driver>
-plugin-kbd-<driver>
-no-kbd-<driver>
选择键盘的驱动支持,可以支持usb键盘,串口键盘等等,也是在tty,usb ,sl5000, yopy, vr41xx ,qvfb中选择。
qt-mouse-<driver>
-plugin-mouse-<driver>
-no-mouse-<driver>
鼠标的驱动支持,一般都会选择tslib,可以完美地支持触摸屏,在pc,bus,linuxtp,yopy,vr41xx,tslib,qvfb中选择吧。
-iwmmxt
加入iWMMXt指令的编译,也只是部分XScale架构才具有。
-no-glib
-glib
是否加入glib库的支持,glib库对应即gtk库,就也是说加入后可以使用gtk。
Scala到底是什么在目前众多的JVM语言当中,Scala无疑是最引人注意的语言之一。Scala是一个静态语言,更适合大型工程项目,Scala直接编译成Java字节码,性能接近Java。Scala是一个多范式的语言,你可以混合使用函数式和面向对象编程,混合使用可变类和不变类,混合使用Actor和传统的Java并发库。
短短一个月的时间,Scala于本月冲进了TIOBE的前五十名。一个 Twitter 的开发人员说过,Scala 将会成为现代 Web20 的发起语言。LinkedIn 也用这种语言。同样许多其他大的公司如 Sony Picture, EDF, SAP 也开始使用这种语言。为什么Scala发展这么迅猛,可以获得如此热烈的社区支持。
曾冠东还表示,Scala不是Java的杀手,它无法取代Java的地位,也突破不了JVM的限制、Java实现不了的功能它也实现不了。我们可以将Scala形象的理解成大量语法糖的Java。
Scala 开发团队发布了最新的292稳定版本,Scala 语言的特性有许多,例如高阶函数和对象、抽象类型绑定,actor 使得函数在 Scala 中能是一个子类成为可能,Scala 中的设计模式使得面向对象和函数编程无缝结合。Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。它已经成功运用在电信行业。Spark 是一种可扩展的数据分析平台,它整合了内存计算的基元,因此,相对于 Hadoop 的集群存储方法,它在性能方面更具优势。Spark 是在 Scala 语言中实现的,并且利用了该语言,为数据处理提供了独一无二的环境。Scala 编译器可以生成字节码,直接运行在使用JVM上。该语言(它实际上代表了可扩展语言)被定义为可直接集成到语言中的简单扩展。
Scala作为一门静态语言,它的主要特性有哪些
· Scala是面向对象的
Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。
· Scala是函数式的
Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher-order)函数、允许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中都被使用。
· Scala是静态类型的
Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。
· Scala是可扩展的
Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:
任何方式可以被用作中缀(infix)或后缀(postfix) *** 作符闭包按照所期望的类型(目标类型)自动地被构造
两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。
· Scala可与Java和NET进行互 *** 作
Scala设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载类),允许访问成千上万的高质量类库。
在并发性方面,与 Scala 在 NET 领域中的姐妹语言 F# 相似,Scala 是针对 “并发性问题” 的解决方案之一,让开发人员能够更加轻松地专注于问题的实质,而不用考虑并发编程的低级细节。Actor 编程模式让高度并行应用程序的开发更加简单。Scala把Erlang风格的基于actor的并发带进了JVM。我们可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序,以自动获得多核心处理器带来的优势,而不必依照复杂的Java线程模型来编写程序。Scala 为并发性提供了两种级别的支持,这与其他与 Java 相关的主题极为类似:
首先,对底层库的完全访问(比如说 javautilconcurrent)以及对 “传统” Java 并发性语义的支持(比如说监控程序和wait()/notifyAll())。其次,这些基本机制上面有一个抽象层
Scala 提供了在稳定的高性能平台(Java 虚拟机)上生成的能力同时也是一门敏捷性语言。这一类型的语言也有其他的选择,例如 Jython, JRuby, Groovy 和 Clojure, 但是这些都是运行在 JVM 上的动态类型语言。Open Class 的效果让大家会觉得Scala是动态语言,但它是选择隐式转换来实现的,这也正好证明了Scala是静态语言。隐式转换(Implicit conversion)使 Scala 具有类型安全性,正如扩展方法(extension method)之于 C#,开放类(open class)之于 ruby。即:向未曾定义的类型添加方法(如字符串、列表、整数)。这是使得 Scala 符合 DSL(特定领域语言)模型的特性之一。
Scala结合了面向对象和函数编程的优势,函数编程的一个好处就是你能够像运用一个数据那样运用函数,可以用来定义真正高层级的库,或者去定义新的领域特殊语言(DSL)。
在谈及Java与Scala的对比时,曾冠东表示,Scala能调用绝大部分的Java,而Java调用Scala独有的东西会比较难。Java 拥有非常强的概念规范,因此任何一个 Java 程序之间具有非常多的相似之处,并且这样能够方便的进行程序员交替。但是 Scala 并没有这样的统一性,因为这是一门很有表现力的语言。现场曾冠东为我们演示了实际案例,如下图所示:
正所谓,金无足赤,人无完人。Scala对二进制不兼容,语法也越来越复杂,不能突破Bytecode的限制、编译速度有所缓慢。当它被广泛用于单元测试、开发工具、Socket开发、以及面对多核挑战的并发应用。总而言之,Scala是一种函数式面向对象语言,它融汇了许多前所未有的特性,而同时又运行于JVM之上。正如JRuby 创建者之一Charles Nutter 所宣称的那样Scala就是 Java 王位的合法继承人。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为广大软件工程师手上一件必不可少的工具。
题库内容:
送东阳马生序的解释
散文篇名。明代宋濂作。马生,是作者家乡的太学生。文中 回顾 了作者 少年 求学的艰辛,勉励后学者 珍惜 良好的学习环境, 勤奋 攻读。当时作者已身居高官、功成名就,但 文章 语言平易 亲切 ,循循善诱。 《送东阳马生序》全文如下: 余幼时即嗜学。家贫,无从致书以观,每 假借 于藏书之家,手自笔录,计日以还。天大寒,砚冰坚,手指不可屈伸,弗之怠。录毕,走送之, 不敢 稍逾约。以是人多以书假余,余因得遍观群书。既加冠,益慕圣贤之道 ,又患无硕师、名人与游,尝趋百里外,从乡之先达执经 叩问 。先达德隆望尊,门人弟子填其室, 未尝 稍降辞色。余立侍 左右 ,援疑质理,俯身倾耳以请;或遇其叱咄,色愈恭,礼愈至,不敢出一言以复;俟其 欣悦 ,则又请焉。故余虽愚,卒获 有所 闻。 当余之从师也,负箧曳屣,行 深山 巨谷中,穷冬烈风,大雪深数尺,足肤皲裂而 不知 。至舍,四支僵劲不能动,媵人持汤沃灌,以衾拥覆,久而乃和。寓 逆旅 ,主人日再食,无鲜肥滋味之享。同舍生皆被绮绣,戴朱缨宝饰之帽,腰白玉之环,左佩刀,右备容臭, 烨然 若神人;余则缊袍敝衣处其间,略无慕艳意。以中有足乐者,不知口体之奉不若人也。盖余之勤且艰若此。 今虽耄老,未有所成,犹幸预 君子 之列,而承天子之宠光,缀公卿之后,日侍坐备 顾问 ,四海亦谬称其氏名,况才之过于余者乎? 今诸生学于太学,县官日有廪稍之供,父母岁有裘葛之遗,无冻馁之患矣;坐大厦之下而诵《诗》《书》,无奔走之劳矣; 有司 业、 博士 为之师,未有问而不告,求而不得者也;凡所宜有之书,皆集于此,不必若余之手录,假诸人而后见也。其业有不精,德有不成者,非天质之卑,则心不若余之专耳,岂他人之过哉! 东阳马生 君则,在太学已二年,流辈甚称其贤。余朝 京师 ,生以乡人子谒余,撰长书以为贽,辞甚畅达,与之论辩,言和而色夷。自谓 少时 用心于学甚劳,是可谓善学者矣!其将归见其亲也,余故道为学之难以告之。谓余勉乡人以学者,余之志也;诋我夸 际遇 之盛而骄乡人者,岂知余者哉!
曾经有人问Java的创始人高斯林这样一个问题,“除了Java语言以外,您现在还使用JVM平台上的哪种编程语言”他毫不犹豫的说是Scala。
Scala到底是什么在目前众多的JVM语言当中,Scala无疑是最引人注意的语言之一。Scala是一个静态语言,更适合大型工程项目,Scala直接编译成Java字节码,性能接近Java。Scala是一个多范式的语言,你可以混合使用函数式和面向对象编程,混合使用可变类和不变类,混合使用Actor和传统的Java并发库。
短短一个月的时间,Scala于本月冲进了TIOBE的前五十名。一个 Twitter 的开发人员说过,Scala 将会成为现代 Web20 的发起语言。LinkedIn 也用这种语言。同样许多其他大的公司如 Sony Picture, EDF, SAP 也开始使用这种语言。为什么Scala发展这么迅猛,可以获得如此热烈的社区支持。
曾冠东还表示,Scala不是Java的杀手,它无法取代Java的地位,也突破不了JVM的限制、Java实现不了的功能它也实现不了。我们可以将Scala形象的理解成大量语法糖的Java。
Scala 开发团队发布了最新的292稳定版本,Scala 语言的特性有许多,例如高阶函数和对象、抽象类型绑定,actor 使得函数在 Scala 中能是一个子类成为可能,Scala 中的设计模式使得面向对象和函数编程无缝结合。Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。它已经成功运用在电信行业。Spark 是一种可扩展的数据分析平台,它整合了内存计算的基元,因此,相对于 Hadoop 的集群存储方法,它在性能方面更具优势。Spark 是在 Scala 语言中实现的,并且利用了该语言,为数据处理提供了独一无二的环境。Scala 编译器可以生成字节码,直接运行在使用JVM上。该语言(它实际上代表了可扩展语言)被定义为可直接集成到语言中的简单扩展。
Scala作为一门静态语言,它的主要特性有哪些
· Scala是面向对象的
Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。
· Scala是函数式的
Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher-order)函数、允许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中都被使用。
· Scala是静态类型的
Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。
· Scala是可扩展的
Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:
任何方式可以被用作中缀(infix)或后缀(postfix) *** 作符闭包按照所期望的类型(目标类型)自动地被构造
两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。
· Scala可与Java和NET进行互 *** 作
Scala设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载类),允许访问成千上万的高质量类库。
在并发性方面,与 Scala 在 NET 领域中的姐妹语言 F# 相似,Scala 是针对 “并发性问题” 的解决方案之一,让开发人员能够更加轻松地专注于问题的实质,而不用考虑并发编程的低级细节。Actor 编程模式让高度并行应用程序的开发更加简单。Scala把Erlang风格的基于actor的并发带进了JVM。我们可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序,以自动获得多核心处理器带来的优势,而不必依照复杂的Java线程模型来编写程序。Scala 为并发性提供了两种级别的支持,这与其他与 Java 相关的主题极为类似:
首先,对底层库的完全访问(比如说 javautilconcurrent)以及对 “传统” Java 并发性语义的支持(比如说监控程序和wait()/notifyAll())。其次,这些基本机制上面有一个抽象层
Scala 提供了在稳定的高性能平台(Java 虚拟机)上生成的能力同时也是一门敏捷性语言。这一类型的语言也有其他的选择,例如 Jython, JRuby, Groovy 和 Clojure, 但是这些都是运行在 JVM 上的动态类型语言。Open Class 的效果让大家会觉得Scala是动态语言,但它是选择隐式转换来实现的,这也正好证明了Scala是静态语言。隐式转换(Implicit conversion)使 Scala 具有类型安全性,正如扩展方法(extension method)之于 C#,开放类(open class)之于 ruby。即:向未曾定义的类型添加方法(如字符串、列表、整数)。这是使得 Scala 符合 DSL(特定领域语言)模型的特性之一。
Scala结合了面向对象和函数编程的优势,函数编程的一个好处就是你能够像运用一个数据那样运用函数,可以用来定义真正高层级的库,或者去定义新的领域特殊语言(DSL)。
在谈及Java与Scala的对比时,曾冠东表示,Scala能调用绝大部分的Java,而Java调用Scala独有的东西会比较难。Java 拥有非常强的概念规范,因此任何一个 Java 程序之间具有非常多的相似之处,并且这样能够方便的进行程序员交替。但是 Scala 并没有这样的统一性,因为这是一门很有表现力的语言。现场曾冠东为我们演示了实际案例,如下图所示:
正所谓,金无足赤,人无完人。Scala对二进制不兼容,语法也越来越复杂,不能突破Bytecode的限制、编译速度有所缓慢。当它被广泛用于单元测试、开发工具、Socket开发、以及面对多核挑战的并发应用。总而言之,Scala是一种函数式面向对象语言,它融汇了许多前所未有的特性,而同时又运行于JVM之上。正如JRuby 创建者之一Charles Nutter 所宣称的那样Scala就是 Java 王位的合法继承人。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为广大软件工程师手上一件必不可少的工具。更多精彩内容,请关注专题:>
以上就是关于嫌Stata内置Do file editor不好用,怎么办全部的内容,包括:嫌Stata内置Do file editor不好用,怎么办、Qt 软件中怎么自动加入build版本号、如何学习Kotlin编程语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)