❶ 源码中分为main和test分别是什么意思
In function 'int main()' 这种编译提示是gcc/g++的一种问题描述格式,告诉你编译问题出现在源代码什么位置,如你这里的问题就出在int main()函数中,接下来还应该有相应的错误(警告)描述,如有如下的源代码test.c:
intmain()
{
printf("helloworld")
}
$g++test.c编译程序
test.c:Infunction'intmain()':报告错误所在的位置
test.c:3:error:'printf'wasnotdeclaredinthisscope错误解释:printf未声明(缺少头文件)
test.c:4:error:expected`;'before'}'token错误解释:printf("helloworld")语句没有以分号结尾,加上分号就可以了。
❷ 如何学习sqlite源码
先来说说sqlite的资料.
首先sqlite的资料其实是不多不少的.
不少的原因是因为这些资料确实能够让你明白sqlite的设计原理.
说它不多的原因是也就让你明白其原理, 仅此而已.
sqlite的资料主要来自四个地方, 从简到深依次为:
1.<>, 这是一本介绍sqlite"基本原理"的小书, 只有80页左右, 介绍了sqlite的"后端"原理. 这本书在网络有下载, 纯英文版的, 链接:inside sqlite_网络知道. 在上面的github上, 我们项目的同伴对这本书做了翻译, 不过还没完成, 建议直接扫原版.
2.官方文档, 连接:SQLite Documentation. 但是里面的文档对于学习者来说也有轻重之分, 建议主要阅读 "SQLite Technical/Design Documentation" 这一栏的技术文档.
3.<<SQLite Database System: Design and Implementation>>. 这也是一本说sqlite的小书, 不到200页. 这本书的内容其实和<<inside sqlite>>有重叠, 甚至不少地方的段落是直接复制过来的... 不过这本书比<<inside sqlite>>详细很多, 也建议扫描一遍. 这本书我目前在做翻译, 做了3,4,5,6四章的翻译了. 不过是很粗翻译, 不建议直接看...
4.源码注释. sqlite的源码注释非常详细, 详细到比上面两本书说的还多... sqlite的每份.c代码内的注释差不多快比代码还多了, 而且除了将基本架构外, 很多上述资料没有提到的细节, 也在源码注释中被提了出来.
================================================================
接下来说一下本人推荐的学习方法~~
================================================================
下面是认真学习的方法, 如果想快速暴力的学习, 直接看下一段.
想要认真点学习的话.
应该先去看"Architecture of SQLite"这篇文档, 该文档详细的介绍了sqlite的7层结构, 总体被分为了"前段", "中层VM", "后端".
看完arch.html那文过后, 你就知道"前端"主要做的是语法分析, "后端"主要实现了数据库性质(ACID, 增删查改).
个人建议从后端开始学习, 毕竟学习sqlite是学习怎么实现数据库.
后端的tree, pager, os三层, 其实都不难(起码理解起来不难),
我建议OS->PAGER->TREE这样边学习, 边写demo.
简要说一下我在学习这三层过程中遇到的一些点, 希望能帮到楼主.
OS:
os是很薄的一层, 主要是为了提高可移植性而被设计出来的.
学习这一层的方法很粗暴:看"The OS Backend (VFS) To SQLite", 然后去看源码中的"test_demovfs.c".
主要搞清下面三个结构体.
sqlite3_vfs
sqlite3_io_methods
sqlite3_file
在我github中的demo1.1中, 有一个更简单的demo, 可以参考看下里面的os.c, os.h, unix_os.c三份代码.
-------------------------------------------------
Pager:
Pager主要实现了三段功能: ACID, log, cache.
先说ACID:
ACID的这部分我只看了最最基本的方法, 然后选择跳过的, sqlite实现ACID的方法可以看"Atomic Commit In SQLite",
这里是我翻译的, 能看,
"how-to-implement-a-DB-like-sqlite/SQLite怎样实现原子性.md at master · qw4990/how-to-implement-a-DB-like-sqlite · GitHub".
除了这篇最基本的文档, 推荐看<<SQLite Database System: Design and Implementation>>的3章和4章, 看完能理解sqlite实现ACID的基本方法.
接着是cache, sqlite提供了插件式的cache结构, 所以你或许会惊讶为什么sqlite里面同时有pager.c, pcache.c, pcache1.c:
cache这个部分比较简单, <<inside sqlite>>第三章, <<SQLite Database System>>第五章都有详细的介绍, 主要讲解了pager实现cache的方法.
在我github中的demo1.1中, cache的功能也已经完成了, 1 可以参考看下里面的pager.h, pager.c, pcache.c, pcahce1这四份代码.
最后是log:
这部分我现在直接选择了忽视...
----------------------------------------------------
Tree层:
sqlite的tree层就是用B+/B-树维护数据, 以达到快速"增删查改"的目的.
这一层在官方文档里没多少资料.
先是算法本身, 也就是B+/B-/B树, 没什么好说的, 很多算法书都有.
接下来重点是sqlite怎么将B树应用到自身的数据库中的.
这一点可以看<<inside sqlite>>的第5章, <<SQLite Database System>>的第6章, 都有很详细的介绍.
<<SQLite Database System>>讲得更为仔细, 除了说原理外, 还说了sqlite里btree大致被分为了几个结构体在工作.
以上就是我学习后端遇到的一些点吧.
=============================================================
如果嫌弃上面的学习方法麻烦的话,
可以先扫一下"Architecture of SQLite",
接着再看一下"Atomic Commit In SQLite",
最后简单粗暴的把推荐的那两本书扫完,
也大致知道sqlite是怎么设计的了.
不过个人认为sqlite是一个"大师级的精致的工艺品", 光看完两本书就说自己学完了它, 未免有点"暴殄天物".
除了基本的数据库设计方法(也就是那两本书的内容), sqlite的源代码中所蕴含的编程技巧, 工程设计, 以及各种小考虑, 也是非常值得吸收学习的.
=============================================================
最后总结一下
如果想简单粗暴快捷的学习, 直接扫arch.html, atomiccommit.html和那两本书, 就能明白sqlite是怎样被设计的了.
如果想深入学习, 建议从7层开始向前学, 边翻文档边看源码边写demo.
❸ 如何学习TensorFlow源码
如果从源码构建TensorFlow会需要执行如下命令:
bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
对应的BUILD文件的rule为:
sh_binary(
name = "build_pip_package",
srcs = ["build_pip_package.sh"],
data = [
"MANIFEST.in",
"README",
"setup.py",
"//tensorflow/core:framework_headers",
":other_headers",
":simple_console",
"//tensorflow:tensorflow_py",
"//tensorflow/examples/tutorials/mnist:package",
"//tensorflow/models/embedding:package",
"//tensorflow/models/image/cifar10:all_files",
"//tensorflow/models/image/mnist:convolutional",
"//tensorflow/models/rnn:package",
"//tensorflow/models/rnn/ptb:package",
"//tensorflow/models/rnn/translate:package",
"//tensorflow/tensorboard",
],
)
sh_binary在这里的主要作用是生成data的这些依赖。一个一个来看,一开始的三个文件MANIFEST.in、README、setup.py是直接存在的,因此不会有什么操作。
“//tensorflow/core:framework_headers”:其对应的rule为:
filegroup(
name = "framework_headers",
srcs = [
"framework/allocator.h",
......
"util/device_name_utils.h",
],
)
这里filegroup的作用是给这一堆头文件一个别名,方便其他rule引用。
“:other_headers”:rule为:
transitive_hdrs(
name = "other_headers",
deps = [
"//third_party/eigen3",
"//tensorflow/core:protos_all_cc",
],
)
transitive_hdrs的定义在:
load("//tensorflow:tensorflow.bzl", "transitive_hdrs")
实现为:
# Bazel rule for collecting the header files that a target depends on.
def _transitive_hdrs_impl(ctx):
outputs = set()
for dep in ctx.attr.deps:
outputs += dep.cc.transitive_headers
return struct(files=outputs)
_transitive_hdrs = rule(attrs={
"deps": attr.label_list(allow_files=True,
providers=["cc"]),
},
implementation=_transitive_hdrs_impl,)
def transitive_hdrs(name, deps=[], **kwargs):
_transitive_hdrs(name=name + "_gather",
deps=deps)
native.filegroup(name=name,
srcs=[":" + name + "_gather"])
其作用依旧是收集依赖需要的头文件。
“:simple_console”:其rule为:
py_binary(
name = "simple_console",
srcs = ["simple_console.py"],
srcs_version = "PY2AND3",
deps = ["//tensorflow:tensorflow_py"],
)
py_library(
name = "tensorflow_py",
srcs = ["__init__.py"],
srcs_version = "PY2AND3",
visibility = ["//visibility:public"],
deps = ["//tensorflow/python"],
)
simple_console.py的代码的主要部分是:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import code
import sys
def main(_):
"""Run an interactive console."""
code.interact()
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv))
可以看到起通过deps = [“//tensorflow/python”]构建了依赖包,然后生成了对应的执行文件。看下依赖的rule规则。//tensorflow/python对应的rule为:
py_library(
name = "python",
srcs = [
"__init__.py",
],
srcs_version = "PY2AND3",
visibility = ["//tensorflow:__pkg__"],
deps = [
":client",
":client_testlib",
":framework",
":framework_test_lib",
":kernel_tests/gradient_checker",
":platform",
":platform_test",
":summary",
":training",
"//tensorflow/contrib:contrib_py",
],
)
这里如果仔细看的话会发现其主要是生成一堆python的模块。从这里貌似可以看出每个python的mole都对应了一个rule,且mole依赖的mole都写在了deps里。特别的,作为一个C++的切入,我们关注下training这个依赖:
py_library(
name = "training",
srcs = glob(
["training/**/*.py"],
exclude = ["**/*test*"],
),
srcs_version = "PY2AND3",
deps = [
":client",
":framework",
":lib",
":ops",
":protos_all_py",
":pywrap_tensorflow",
":training_ops",
],
)
这里其依赖的pywrap_tensorflow的rule为:
tf_py_wrap_cc(
name = "pywrap_tensorflow",
srcs = ["tensorflow.i"],
swig_includes = [
"client/device_lib.i",
"client/events_writer.i",
"client/server_lib.i",
"client/tf_session.i",
"framework/python_op_gen.i",
"lib/core/py_func.i",
"lib/core/status.i",
"lib/core/status_helper.i",
"lib/core/strings.i",
"lib/io/py_record_reader.i",
"lib/io/py_record_writer.i",
"platform/base.i",
"platform/numpy.i",
"util/port.i",
"util/py_checkpoint_reader.i",
],
deps = [
":py_func_lib",
":py_record_reader_lib",
":py_record_writer_lib",
":python_op_gen",
":tf_session_helper",
"//tensorflow/core/distributed_runtime:server_lib",
"//tensorflow/core/distributed_runtime/rpc:grpc_server_lib",
"//tensorflow/core/distributed_runtime/rpc:grpc_session",
"//util/python:python_headers",
],
)
tf_py_wrap_cc为其自己实现的一个rule,这里的.i就是SWIG的interface文件。来看下其实现:
def tf_py_wrap_cc(name, srcs, swig_includes=[], deps=[], copts=[], **kwargs):
mole_name = name.split("/")[-1]
# Convert a rule name such as foo/bar/baz to foo/bar/_baz.so
# and use that as the name for the rule procing the .so file.
cc_library_name = "/".join(name.split("/")[:-1] + ["_" + mole_name + ".so"])
extra_deps = []
_py_wrap_cc(name=name + "_py_wrap",
srcs=srcs,
swig_includes=swig_includes,
deps=deps + extra_deps,
mole_name=mole_name,
py_mole_name=name)
native.cc_binary(
name=cc_library_name,
srcs=[mole_name + ".cc"],
copts=(copts + ["-Wno-self-assign", "-Wno-write-strings"]
+ tf_extension_copts()),
linkopts=tf_extension_linkopts(),
linkstatic=1,
linkshared=1,
deps=deps + extra_deps)
native.py_library(name=name,
srcs=[":" + name + ".py"],
srcs_version="PY2AND3",
data=[":" + cc_library_name])
按照SWIG的正常流程,先要通过swig命令生成我们的wrap的c文件,然后和依赖生成我们的so文件,最后生成一个同名的python文件用于import。这里native.cc_binary和native.py_library做了我们后面的两件事情,而swig命令的执行则交给了_py_wrap_cc。其实现为:
_py_wrap_cc = rule(attrs={
"srcs": attr.label_list(mandatory=True,
allow_files=True,),
"swig_includes": attr.label_list(cfg=DATA_CFG,
allow_files=True,),
"deps": attr.label_list(allow_files=True,
providers=["cc"],),
"swig_deps": attr.label(default=Label(
"//tensorflow:swig")), # swig_templates
"mole_name": attr.string(mandatory=True),
"py_mole_name": attr.string(mandatory=True),
"swig_binary": attr.label(default=Label("//tensorflow:swig"),
cfg=HOST_CFG,
executable=True,
allow_files=True,),
},
outputs={
"cc_out": "%{mole_name}.cc",
"py_out": "%{py_mole_name}.py",
},
implementation=_py_wrap_cc_impl,)
_py_wrap_cc_impl的实现为:
# Bazel rules for building swig files.
def _py_wrap_cc_impl(ctx):
srcs = ctx.files.srcs
if len(srcs) != 1:
fail("Exactly one SWIG source file label must be specified.", "srcs")
mole_name = ctx.attr.mole_name
cc_out = ctx.outputs.cc_out
py_out = ctx.outputs.py_out
src = ctx.files.srcs[0]
args = ["-c++", "-python"]
args += ["-mole", mole_name]
args += ["-l" + f.path for f in ctx.files.swig_includes]
cc_include_dirs = set()
cc_includes = set()
for dep in ctx.attr.deps:
cc_include_dirs += [h.dirname for h in dep.cc.transitive_headers]
cc_includes += dep.cc.transitive_headers
args += ["-I" + x for x in cc_include_dirs]
args += ["-I" + ctx.label.workspace_root]
args += ["-o", cc_out.path]
args += ["-outdir", py_out.dirname]
args += [src.path]
outputs = [cc_out, py_out]
ctx.action(executable=ctx.executable.swig_binary,
arguments=args,
mnemonic="PythonSwig",
inputs=sorted(set([src]) + cc_includes + ctx.files.swig_includes +
ctx.attr.swig_deps.files),
outputs=outputs,
progress_message="SWIGing {input}".format(input=src.path))
return struct(files=set(outputs))
这里的ctx.executable.swig_binary是一个shell脚本,内容为:
# If possible, read swig path out of "swig_path" generated by configure
SWIG=swig
SWIG_PATH=tensorflow/tools/swig/swig_path
if [ -e $SWIG_PATH ]; then
SWIG=`cat $SWIG_PATH`
fi
# If this line fails, rerun configure to set the path to swig correctly
"$SWIG" "$@"
可以看到起就是调用了swig命令。
“//tensorflow:tensorflow_py”:其rule为:
py_library(
name = "tensorflow_py",
srcs = ["__init__.py"],
srcs_version = "PY2AND3",
visibility = ["//visibility:public"],
deps = ["//tensorflow/python"],
)
❹ 怎样学习代码
建议你先学习C语言,C语言是最基础的东西。
1、学代码要有信心、恒心。
2、学代码要由浅入深,从简单到复杂。
代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。源代码是代码的分支,某种意义上来说,源代码相当于代码。现代程序语言中,源代码可以书籍或磁带形式出现,但最为常用格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码最终目的是将人类可读文本翻译成为计算机可执行的二进制指令,这种过程叫编译,它由通过编译器完成。
(参考资料:代码-网络)
❺ 代码如何开始学习
建议你先学习C语言,C语言是最基础的东西。
1、学代码要有信心、恒心。
2、学代码要由浅入深,从简单到复杂。
代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。源代码是代码的分支,某种意义上来说,源代码相当于代码。现代程序语言中,源代码可以书籍或磁带形式出现,但最为常用格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码最终目的是将人类可读文本翻译成为计算机可执行的二进制指令,这种过程叫编译,它由通过编译器完成。
(参考资料:代码-网络)
❻ java程序 请帮忙写出TestMyPoint类的源代码
我做的有点类似但不是完全一样 发给你看看有没有启发。
public class MyPoint{
public static void main(String[] args){
MyPoint mp =new MyPoint();
mp.setStart(new Point(10,10));
mp.setEnd(new Point(20,20));
//mp.setstray(mp.getend());
mp.setStray(new Point(30,30));
System.out.println(mp.getstray());
System.out.println(mp.getstart());
System.out.println(mp.getend());
}
private Point start;
private Point end;
private Point stray;
public Point getstart(){
return start;
}
public void setStart(Point start){
this.start=start;
}
public Point getend(){
return end;
}
public void setEnd(Point end){
this.end=end;
}
public Point getstray(){
return stray;
}
public void setStray(Point stray){
this.stray=stray;
}
public MyPoint() {
}
public MyPoint(Point start, Point end ,Point stray) {
super();
this.stray = stray;
this.start = start;
this.end = end;
}
}
class Point{
public String toString(){
return "x:"+ x +"y"+ y ;
}
private int x;
private int y;
public int getx(){
return x;
}
public void setx(int x){
this.x=x;
}
public int gety(){
return y;
}
public void sety(int y){
this.y=y;
}
public Point (int x,int y){
this.x=x;
this.y=y;
}
}
❼ 如何学习hibernate源码
我来分享一下查看源码的方法:
查看源码的首要任务是要有一款上手的工具,这里用的是 IDEA。IDEA 的功能比较强大,包括 查看类结构图,debug。这两个是查看源码的关键功能。
查看源码可以静态查看和动态查看,静态查看的方法是查看类图,还有 ALT + f7 查看方法在哪里被调用或者类在哪里被调用。在看 spring 源码的时候就是用这种方法,不过这种方法对阅读者的要求比较高,包括要了解这个方法的执行,设计模式的理解,以及框架是如何配置这个类的。第二种方法是 debug。debug 方法是后来才发现的一个重要的 查看源码的方法,要点是掌握执行栈,就能掌握整个执行流程。比如这个是在debug hibernate 源码的时候的截图,可以看到这个执行栈非常深,从 spring-data-jpa 到 hibernate 中间经过好几层的代理,主要完成一些适配,事务,拦截器等等操作,然后再到 hibernate 核心代码,最后就是 jdbc 的 statement。方法栈中的每一个方法都是可以查看的,里面的变量有时候是代理了好几层,所以要 F7 进去才能看到真正的执行类。
上面是简单的简述 mybatis 的 cache 机制的源码,真正想让读者明白的是,debug 如何查看源码,查看源码需要抓住一个主题,不然在阅读庞大的框架的时候会找不着北。
所以,阅读源码需要掌握工具使用,debug, 查看类图,查看方法在哪里调用,软知识是要掌握设计模式,对框架的概念有了解。
❽ 如何 阅读 testng 源码
1、前提
安装好jdk
配置好Java环境变量
安装Eclips
这些网上都有,就不再详细介绍。
2、安装TestNG插件
在线安装由于网速原因,速度较慢。下面是离线安装方式。
(1)解压eclipse-testng离线包.zip
(2)将【eclipse-testng离线包/feature】中的文件夹org.testng.eclipse_6.8.6.20130607_0745复制到【MyEclipse安装目录/features】目录下
(3)将【eclipse-testng离线包/org.testng.eclipse_6.8.6.20130607_0745】文件夹复制到【MyEclipse安装目录/plugins】目录下
(4)重启MyEclipse,Windows - show view - TestNG
3、安装Ant
(1)解压apache-ant-1.9.6-bin.zip到任意目录下
(2)配置Ant环境变量,在Path变量末尾添加:<Ant目录>/bin;
二、在Eclipse中创建Java工程
1、Eclipse -> File -> New -> Java Project,如下图,在弹窗中填入Project name,点击Finish,即可完成工程的创建。
2. 导入相关的jar包:
工程上右键 -> Build Path -> Configure Build Path...,如下图所示,打开Build Path配置窗口。
导入已经安装的TestNG插件,如下图所示完成testNG的导入:
3. 从资源分享链接中下载lib.zip,解压开,按下图方式导入里面的jar包。导入的这些jar包会在程序中用到。
三、使用TestNG框架编写测试用例
1. 创建src文件夹,存放测试相关的代码,在工程上右键 -> New -> Folder,填入文件名字:src。
2. 按照数据与代码分离和公共方法提取的原则,我的代码结构如下划分:
3. 脚本编写顺序
3.1 全局配置文件(GlobalSettings.java)
存放一些工程全局的变量,比如baseUrl、timeout等;
3.2 Http协议实现(HttpClientHelper.java)
根据项目接口使用的协议,实现相关的请求。我们的项目有两种方式,一种是使用NameValuePair的方式封装请求参数,一种是使用JSONObject的方式封装请求参数,因此针对这两种方式都做了代码实现。
3.3 接口实现(GList_API.java)
以“创建G单”为例,实现该接口:
3.4 准备测试数据(TestData.java)
为接口准备测试数据。
3.5 测试数据参数化(GListDataProvider.java),返回的参数个数需要与testsuit中函数参数个数一致。
3.6 测试用例suit(GListCURD.java)
4. 测试用例调试与执行
按照步骤三写好了所有的用例,可以进行用例的调试与执行了。
4.1 测试用例脚本调试
在步骤三的测试用例suit GListCURD.java上右键,“Debug as”或“Run as” -> "TestNG Test",即可运行该脚本。
4.2 测试用例脚本执行
有两种方式可以运行该脚本,testNG或者ant。
使用testNG运行,操作如步骤4.1。
使用ant运行,需要创建xml,请参考资源库中的build.xml、smokeTest.xml。若需要生成testNG报告,还需要下载test-result.xsi文件。
4.3 美化后的运行结果report
❾ 求几个JAVA小项目源代码,供自己学习参考
package com.test01;
import java.util.Scanner;
public class oop5 { public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// int x = 9;
// int y = 1;
int x = sc.nextInt();
int y = sc.nextInt();
int z;
z = add(x, y);
System.out.println("x的值为:" + x);
System.out.println("y的值为:" + y);
System.out.println("二者之和为:" + z);
}
/** 四种小算法 */
// 加法运算
public static int add(int a, int b) {
int c;
c = a + b;
return c;
}
// 减法运算
public static int jian(int d, int v) {
int m;
m = d - v;
return m;
}
// 乘积运算
public static int addAdd(int q, int w) {
int e;
e = q * w;
return e;
}
// 除法运算
public static int chu(int p, int k) {
int f;
f = p / k;
return f;
}
}
❿ 在linux系统中 编写一个C语言源代码 文件名为test.c 编写好了以后为了调试看看结果是否正确
你linux系统有没有gcc啊?
有的话直接输入 : gcc test.c -o test
没有任何提示的话,就说明编译成功了,
之后再加./test 就可以看到结果了