加载中...

Julia


其中 Y=Julia

源代码下载: learn-julia-zh.jl

  1. # 单行注释只需要一个井号
  2. #= 多行注释
  3. 只需要以 '#=' 开始 '=#' 结束
  4. 还可以嵌套.
  5. =#
  6. ####################################################
  7. ## 1\. 原始类型与操作符
  8. ####################################################
  9. # Julia 中一切皆是表达式。
  10. # 这是一些基本数字类型.
  11. 3 # => 3 (Int64)
  12. 3.2 # => 3.2 (Float64)
  13. 2 + 1im # => 2 + 1im (Complex{Int64})
  14. 2//3 # => 2//3 (Rational{Int64})
  15. # 支持所有的普通中缀操作符。
  16. 1 + 1 # => 2
  17. 8 - 1 # => 7
  18. 10 * 2 # => 20
  19. 35 / 5 # => 7.0
  20. 5 / 2 # => 2.5 # 用 Int 除 Int 永远返回 Float
  21. div(5, 2) # => 2 # 使用 div 截断小数点
  22. 5 \ 35 # => 7.0
  23. 2 ^ 2 # => 4 # 次方, 不是二进制 xor
  24. 12 % 10 # => 2
  25. # 用括号提高优先级
  26. (1 + 3) * 2 # => 8
  27. # 二进制操作符
  28. ~2 # => -3 # 非
  29. 3 & 5 # => 1 # 与
  30. 2 | 4 # => 6 # 或
  31. 2 $ 4 # => 6 # 异或
  32. 2 >>> 1 # => 1 # 逻辑右移
  33. 2 >> 1 # => 1 # 算术右移
  34. 2 << 1 # => 4 # 逻辑/算术 右移
  35. # 可以用函数 bits 查看二进制数。
  36. bits(12345)
  37. # => "0000000000000000000000000000000000000000000000000011000000111001"
  38. bits(12345.0)
  39. # => "0100000011001000000111001000000000000000000000000000000000000000"
  40. # 布尔值是原始类型
  41. true
  42. false
  43. # 布尔操作符
  44. !true # => false
  45. !false # => true
  46. 1 == 1 # => true
  47. 2 == 1 # => false
  48. 1 != 1 # => false
  49. 2 != 1 # => true
  50. 1 < 10 # => true
  51. 1 > 10 # => false
  52. 2 <= 2 # => true
  53. 2 >= 2 # => true
  54. # 比较可以串联
  55. 1 < 2 < 3 # => true
  56. 2 < 3 < 2 # => false
  57. # 字符串可以由 " 创建
  58. "This is a string."
  59. # 字符字面量可用 ' 创建
  60. 'a'
  61. # 可以像取数组取值一样用 index 取出对应字符
  62. "This is a string"[1] # => 'T' # Julia 的 index 从 1 开始 :(
  63. # 但是对 UTF-8 无效,
  64. # 因此建议使用遍历器 (map, for loops, 等).
  65. # $ 可用于字符插值:
  66. "2 + 2 = $(2 + 2)" # => "2 + 2 = 4"
  67. # 可以将任何 Julia 表达式放入括号。
  68. # 另一种格式化字符串的方式是 printf 宏.
  69. @printf "%d is less than %f" 4.5 5.3 # 5 is less than 5.300000
  70. # 打印字符串很容易
  71. println("I'm Julia. Nice to meet you!")
  72. ####################################################
  73. ## 2\. 变量与集合
  74. ####################################################
  75. # 给变量赋值就是声明变量
  76. some_var = 5 # => 5
  77. some_var # => 5
  78. # 访问未声明变量会抛出异常
  79. try
  80. some_other_var # => ERROR: some_other_var not defined
  81. catch e
  82. println(e)
  83. end
  84. # 变量名需要以字母开头.
  85. # 之后任何字母,数字,下划线,叹号都是合法的。
  86. SomeOtherVar123! = 6 # => 6
  87. # 甚至可以用 unicode 字符
  88. = 8 # => 8
  89. # 用数学符号非常方便
  90. 2 * π # => 6.283185307179586
  91. # 注意 Julia 的命名规约:
  92. #
  93. # * 变量名为小写,单词之间以下划线连接('\_')。
  94. #
  95. # * 类型名以大写字母开头,单词以 CamelCase 方式连接。
  96. #
  97. # * 函数与宏的名字小写,无下划线。
  98. #
  99. # * 会改变输入的函数名末位为 !。
  100. # 这类函数有时被称为 mutating functions 或 in-place functions.
  101. # 数组存储一列值,index 从 1 开始。
  102. a = Int64[] # => 0-element Int64 Array
  103. # 一维数组可以以逗号分隔值的方式声明。
  104. b = [4, 5, 6] # => 包含 3 个 Int64 类型元素的数组: [4, 5, 6]
  105. b[1] # => 4
  106. b[end] # => 6
  107. # 二维数组以分号分隔维度。
  108. matrix = [1 2; 3 4] # => 2x2 Int64 数组: [1 2; 3 4]
  109. # 使用 push! 和 append! 往数组末尾添加元素
  110. push!(a,1) # => [1]
  111. push!(a,2) # => [1,2]
  112. push!(a,4) # => [1,2,4]
  113. push!(a,3) # => [1,2,4,3]
  114. append!(a,b) # => [1,2,4,3,4,5,6]
  115. # 用 pop 弹出末尾元素
  116. pop!(b) # => 6 and b is now [4,5]
  117. # 可以再放回去
  118. push!(b,6) # b 又变成了 [4,5,6].
  119. a[1] # => 1 # 永远记住 Julia 的 index 从 1 开始!
  120. # 用 end 可以直接取到最后索引. 可用作任何索引表达式
  121. a[end] # => 6
  122. # 还支持 shift 和 unshift
  123. shift!(a) # => 返回 1,而 a 现在时 [2,4,3,4,5,6]
  124. unshift!(a,7) # => [7,2,4,3,4,5,6]
  125. # 以叹号结尾的函数名表示它会改变参数的值
  126. arr = [5,4,6] # => 包含三个 Int64 元素的数组: [5,4,6]
  127. sort(arr) # => [4,5,6]; arr 还是 [5,4,6]
  128. sort!(arr) # => [4,5,6]; arr 现在是 [4,5,6]
  129. # 越界会抛出 BoundsError 异常
  130. try
  131. a[0] # => ERROR: BoundsError() in getindex at array.jl:270
  132. a[end+1] # => ERROR: BoundsError() in getindex at array.jl:270
  133. catch e
  134. println(e)
  135. end
  136. # 错误会指出发生的行号,包括标准库
  137. # 如果你有 Julia 源代码,你可以找到这些地方
  138. # 可以用 range 初始化数组
  139. a = [1:5] # => 5-element Int64 Array: [1,2,3,4,5]
  140. # 可以切割数组
  141. a[1:3] # => [1, 2, 3]
  142. a[2:end] # => [2, 3, 4, 5]
  143. # 用 splice! 切割原数组
  144. arr = [3,4,5]
  145. splice!(arr,2) # => 4 ; arr 变成了 [3,5]
  146. # 用 append! 连接数组
  147. b = [1,2,3]
  148. append!(a,b) # a 变成了 [1, 2, 3, 4, 5, 1, 2, 3]
  149. # 检查元素是否在数组中
  150. in(1, a) # => true
  151. # 用 length 获得数组长度
  152. length(a) # => 8
  153. # Tuples 是 immutable 的
  154. tup = (1, 2, 3) # => (1,2,3) # an (Int64,Int64,Int64) tuple.
  155. tup[1] # => 1
  156. try:
  157. tup[1] = 3 # => ERROR: no method setindex!((Int64,Int64,Int64),Int64,Int64)
  158. catch e
  159. println(e)
  160. end
  161. # 大多数组的函数同样支持 tuples
  162. length(tup) # => 3
  163. tup[1:2] # => (1,2)
  164. in(2, tup) # => true
  165. # 可以将 tuples 元素分别赋给变量
  166. a, b, c = (1, 2, 3) # => (1,2,3) # a is now 1, b is now 2 and c is now 3
  167. # 不用括号也可以
  168. d, e, f = 4, 5, 6 # => (4,5,6)
  169. # 单元素 tuple 不等于其元素值
  170. (1,) == 1 # => false
  171. (1) == 1 # => true
  172. # 交换值
  173. e, d = d, e # => (5,4) # d is now 5 and e is now 4
  174. # 字典Dictionaries store mappings
  175. empty_dict = Dict() # => Dict{Any,Any}()
  176. # 也可以用字面量创建字典
  177. filled_dict = ["one"=> 1, "two"=> 2, "three"=> 3]
  178. # => Dict{ASCIIString,Int64}
  179. # 用 [] 获得键值
  180. filled_dict["one"] # => 1
  181. # 获得所有键
  182. keys(filled_dict)
  183. # => KeyIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2])
  184. # 注意,键的顺序不是插入时的顺序
  185. # 获得所有值
  186. values(filled_dict)
  187. # => ValueIterator{Dict{ASCIIString,Int64}}(["three"=>3,"one"=>1,"two"=>2])
  188. # 注意,值的顺序也一样
  189. # 用 in 检查键值是否已存在,用 haskey 检查键是否存在
  190. in(("one", 1), filled_dict) # => true
  191. in(("two", 3), filled_dict) # => false
  192. haskey(filled_dict, "one") # => true
  193. haskey(filled_dict, 1) # => false
  194. # 获取不存在的键的值会抛出异常
  195. try
  196. filled_dict["four"] # => ERROR: key not found: four in getindex at dict.jl:489
  197. catch e
  198. println(e)
  199. end
  200. # 使用 get 可以提供默认值来避免异常
  201. # get(dictionary,key,default_value)
  202. get(filled_dict,"one",4) # => 1
  203. get(filled_dict,"four",4) # => 4
  204. # 用 Sets 表示无序不可重复的值的集合
  205. empty_set = Set() # => Set{Any}()
  206. # 初始化一个 Set 并定义其值
  207. filled_set = Set(1,2,2,3,4) # => Set{Int64}(1,2,3,4)
  208. # 添加值
  209. push!(filled_set,5) # => Set{Int64}(5,4,2,3,1)
  210. # 检查是否存在某值
  211. in(2, filled_set) # => true
  212. in(10, filled_set) # => false
  213. # 交集,并集,差集
  214. other_set = Set(3, 4, 5, 6) # => Set{Int64}(6,4,5,3)
  215. intersect(filled_set, other_set) # => Set{Int64}(3,4,5)
  216. union(filled_set, other_set) # => Set{Int64}(1,2,3,4,5,6)
  217. setdiff(Set(1,2,3,4),Set(2,3,5)) # => Set{Int64}(1,4)
  218. ####################################################
  219. ## 3\. 控制流
  220. ####################################################
  221. # 声明一个变量
  222. some_var = 5
  223. # 这是一个 if 语句,缩进不是必要的
  224. if some_var > 10
  225. println("some_var is totally bigger than 10.")
  226. elseif some_var < 10 # elseif 是可选的.
  227. println("some_var is smaller than 10.")
  228. else # else 也是可选的.
  229. println("some_var is indeed 10.")
  230. end
  231. # => prints "some var is smaller than 10"
  232. # For 循环遍历
  233. # Iterable 类型包括 Range, Array, Set, Dict, 以及 String.
  234. for animal=["dog", "cat", "mouse"]
  235. println("$animal is a mammal")
  236. # 可用 $ 将 variables 或 expression 转换为字符串into strings
  237. end
  238. # prints:
  239. # dog is a mammal
  240. # cat is a mammal
  241. # mouse is a mammal
  242. # You can use 'in' instead of '='.
  243. for animal in ["dog", "cat", "mouse"]
  244. println("$animal is a mammal")
  245. end
  246. # prints:
  247. # dog is a mammal
  248. # cat is a mammal
  249. # mouse is a mammal
  250. for a in ["dog"=>"mammal","cat"=>"mammal","mouse"=>"mammal"]
  251. println("$(a[1]) is a $(a[2])")
  252. end
  253. # prints:
  254. # dog is a mammal
  255. # cat is a mammal
  256. # mouse is a mammal
  257. for (k,v) in ["dog"=>"mammal","cat"=>"mammal","mouse"=>"mammal"]
  258. println("$k is a $v")
  259. end
  260. # prints:
  261. # dog is a mammal
  262. # cat is a mammal
  263. # mouse is a mammal
  264. # While 循环
  265. x = 0
  266. while x < 4
  267. println(x)
  268. x += 1 # x = x + 1
  269. end
  270. # prints:
  271. # 0
  272. # 1
  273. # 2
  274. # 3
  275. # 用 try/catch 处理异常
  276. try
  277. error("help")
  278. catch e
  279. println("caught it $e")
  280. end
  281. # => caught it ErrorException("help")
  282. ####################################################
  283. ## 4\. 函数
  284. ####################################################
  285. # 用关键字 'function' 可创建一个新函数
  286. #function name(arglist)
  287. # body...
  288. #end
  289. function add(x, y)
  290. println("x is $x and y is $y")
  291. # 最后一行语句的值为返回
  292. x + y
  293. end
  294. add(5, 6) # => 在 "x is 5 and y is 6" 后会打印 11
  295. # 还可以定义接收可变长参数的函数
  296. function varargs(args...)
  297. return args
  298. # 关键字 return 可在函数内部任何地方返回
  299. end
  300. # => varargs (generic function with 1 method)
  301. varargs(1,2,3) # => (1,2,3)
  302. # 省略号 ... 被称为 splat.
  303. # 刚刚用在了函数定义中
  304. # 还可以用在函数的调用
  305. # Array 或者 Tuple 的内容会变成参数列表
  306. Set([1,2,3]) # => Set{Array{Int64,1}}([1,2,3]) # 获得一个 Array 的 Set
  307. Set([1,2,3]...) # => Set{Int64}(1,2,3) # 相当于 Set(1,2,3)
  308. x = (1,2,3) # => (1,2,3)
  309. Set(x) # => Set{(Int64,Int64,Int64)}((1,2,3)) # 一个 Tuple 的 Set
  310. Set(x...) # => Set{Int64}(2,3,1)
  311. # 可定义可选参数的函数
  312. function defaults(a,b,x=5,y=6)
  313. return "$a $b and $x $y"
  314. end
  315. defaults('h','g') # => "h g and 5 6"
  316. defaults('h','g','j') # => "h g and j 6"
  317. defaults('h','g','j','k') # => "h g and j k"
  318. try
  319. defaults('h') # => ERROR: no method defaults(Char,)
  320. defaults() # => ERROR: no methods defaults()
  321. catch e
  322. println(e)
  323. end
  324. # 还可以定义键值对的参数
  325. function keyword_args(;k1=4,name2="hello") # note the ;
  326. return ["k1"=>k1,"name2"=>name2]
  327. end
  328. keyword_args(name2="ness") # => ["name2"=>"ness","k1"=>4]
  329. keyword_args(k1="mine") # => ["k1"=>"mine","name2"=>"hello"]
  330. keyword_args() # => ["name2"=>"hello","k1"=>4]
  331. # 可以组合各种类型的参数在同一个函数的参数列表中
  332. function all_the_args(normal_arg, optional_positional_arg=2; keyword_arg="foo")
  333. println("normal arg: $normal_arg")
  334. println("optional arg: $optional_positional_arg")
  335. println("keyword arg: $keyword_arg")
  336. end
  337. all_the_args(1, 3, keyword_arg=4)
  338. # prints:
  339. # normal arg: 1
  340. # optional arg: 3
  341. # keyword arg: 4
  342. # Julia 有一等函数
  343. function create_adder(x)
  344. adder = function (y)
  345. return x + y
  346. end
  347. return adder
  348. end
  349. # 这是用 "stabby lambda syntax" 创建的匿名函数
  350. (x -> x > 2)(3) # => true
  351. # 这个函数和上面的 create_adder 一模一样
  352. function create_adder(x)
  353. y -> x + y
  354. end
  355. # 你也可以给内部函数起个名字
  356. function create_adder(x)
  357. function adder(y)
  358. x + y
  359. end
  360. adder
  361. end
  362. add_10 = create_adder(10)
  363. add_10(3) # => 13
  364. # 内置的高阶函数有
  365. map(add_10, [1,2,3]) # => [11, 12, 13]
  366. filter(x -> x > 5, [3, 4, 5, 6, 7]) # => [6, 7]
  367. # 还可以使用 list comprehensions 替代 map
  368. [add_10(i) for i=[1, 2, 3]] # => [11, 12, 13]
  369. [add_10(i) for i in [1, 2, 3]] # => [11, 12, 13]
  370. ####################################################
  371. ## 5\. 类型
  372. ####################################################
  373. # Julia 有类型系统
  374. # 所有的值都有类型;但变量本身没有类型
  375. # 你可以用 `typeof` 函数获得值的类型
  376. typeof(5) # => Int64
  377. # 类型是一等值
  378. typeof(Int64) # => DataType
  379. typeof(DataType) # => DataType
  380. # DataType 是代表类型的类型,也代表他自己的类型
  381. # 类型可用作文档化,优化,以及调度
  382. # 并不是静态检查类型
  383. # 用户还可以自定义类型
  384. # 跟其他语言的 records 或 structs 一样
  385. # 用 `type` 关键字定义新的类型
  386. # type Name
  387. # field::OptionalType
  388. # ...
  389. # end
  390. type Tiger
  391. taillength::Float64
  392. coatcolor # 不附带类型标注的相当于 `::Any`
  393. end
  394. # 构造函数参数是类型的属性
  395. tigger = Tiger(3.5,"orange") # => Tiger(3.5,"orange")
  396. # 用新类型作为构造函数还会创建一个类型
  397. sherekhan = typeof(tigger)(5.6,"fire") # => Tiger(5.6,"fire")
  398. # struct 类似的类型被称为具体类型
  399. # 他们可被实例化但不能有子类型
  400. # 另一种类型是抽象类型
  401. # abstract Name
  402. abstract Cat # just a name and point in the type hierarchy
  403. # 抽象类型不能被实例化,但是可以有子类型
  404. # 例如,Number 就是抽象类型
  405. subtypes(Number) # => 6-element Array{Any,1}:
  406. # Complex{Float16}
  407. # Complex{Float32}
  408. # Complex{Float64}
  409. # Complex{T<:Real}
  410. # ImaginaryUnit
  411. # Real
  412. subtypes(Cat) # => 0-element Array{Any,1}
  413. # 所有的类型都有父类型; 可以用函数 `super` 得到父类型.
  414. typeof(5) # => Int64
  415. super(Int64) # => Signed
  416. super(Signed) # => Real
  417. super(Real) # => Number
  418. super(Number) # => Any
  419. super(super(Signed)) # => Number
  420. super(Any) # => Any
  421. # 所有这些类型,除了 Int64, 都是抽象类型.
  422. # <: 是类型集成操作符
  423. type Lion <: Cat # Lion 是 Cat 的子类型
  424. mane_color
  425. roar::String
  426. end
  427. # 可以继续为你的类型定义构造函数
  428. # 只需要定义一个同名的函数
  429. # 并调用已有的构造函数设置一个固定参数
  430. Lion(roar::String) = Lion("green",roar)
  431. # 这是一个外部构造函数,因为他再类型定义之外
  432. type Panther <: Cat # Panther 也是 Cat 的子类型
  433. eye_color
  434. Panther() = new("green")
  435. # Panthers 只有这个构造函数,没有默认构造函数
  436. end
  437. # 使用内置构造函数,如 Panther,可以让你控制
  438. # 如何构造类型的值
  439. # 应该尽可能使用外部构造函数而不是内部构造函数
  440. ####################################################
  441. ## 6\. 多分派
  442. ####################################################
  443. # 在Julia中, 所有的具名函数都是类属函数
  444. # 这意味着他们都是有很大小方法组成的
  445. # 每个 Lion 的构造函数都是类属函数 Lion 的方法
  446. # 我们来看一个非构造函数的例子
  447. # Lion, Panther, Tiger 的 meow 定义为
  448. function meow(animal::Lion)
  449. animal.roar # 使用点符号访问属性
  450. end
  451. function meow(animal::Panther)
  452. "grrr"
  453. end
  454. function meow(animal::Tiger)
  455. "rawwwr"
  456. end
  457. # 试试 meow 函数
  458. meow(tigger) # => "rawwr"
  459. meow(Lion("brown","ROAAR")) # => "ROAAR"
  460. meow(Panther()) # => "grrr"
  461. # 再看看层次结构
  462. issubtype(Tiger,Cat) # => false
  463. issubtype(Lion,Cat) # => true
  464. issubtype(Panther,Cat) # => true
  465. # 定义一个接收 Cats 的函数
  466. function pet_cat(cat::Cat)
  467. println("The cat says $(meow(cat))")
  468. end
  469. pet_cat(Lion("42")) # => prints "The cat says 42"
  470. try
  471. pet_cat(tigger) # => ERROR: no method pet_cat(Tiger,)
  472. catch e
  473. println(e)
  474. end
  475. # 在面向对象语言中,通常都是单分派
  476. # 这意味着分派方法是通过第一个参数的类型决定的
  477. # 在Julia中, 所有参数类型都会被考虑到
  478. # 让我们定义有多个参数的函数,好看看区别
  479. function fight(t::Tiger,c::Cat)
  480. println("The $(t.coatcolor) tiger wins!")
  481. end
  482. # => fight (generic function with 1 method)
  483. fight(tigger,Panther()) # => prints The orange tiger wins!
  484. fight(tigger,Lion("ROAR")) # => prints The orange tiger wins!
  485. # 让我们修改一下传入具体为 Lion 类型时的行为
  486. fight(t::Tiger,l::Lion) = println("The $(l.mane_color)-maned lion wins!")
  487. # => fight (generic function with 2 methods)
  488. fight(tigger,Panther()) # => prints The orange tiger wins!
  489. fight(tigger,Lion("ROAR")) # => prints The green-maned lion wins!
  490. # 把 Tiger 去掉
  491. fight(l::Lion,c::Cat) = println("The victorious cat says $(meow(c))")
  492. # => fight (generic function with 3 methods)
  493. fight(Lion("balooga!"),Panther()) # => prints The victorious cat says grrr
  494. try
  495. fight(Panther(),Lion("RAWR")) # => ERROR: no method fight(Panther,Lion)
  496. catch
  497. end
  498. # 在试试让 Cat 在前面
  499. fight(c::Cat,l::Lion) = println("The cat beats the Lion")
  500. # => Warning: New definition
  501. # fight(Cat,Lion) at none:1
  502. # is ambiguous with
  503. # fight(Lion,Cat) at none:2.
  504. # Make sure
  505. # fight(Lion,Lion)
  506. # is defined first.
  507. #fight (generic function with 4 methods)
  508. # 警告说明了无法判断使用哪个 fight 方法
  509. fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The victorious cat says rarrr
  510. # 结果在老版本 Julia 中可能会不一样
  511. fight(l::Lion,l2::Lion) = println("The lions come to a tie")
  512. fight(Lion("RAR"),Lion("brown","rarrr")) # => prints The lions come to a tie
  513. # Under the hood
  514. # 你还可以看看 llvm 以及生成的汇编代码
  515. square_area(l) = l * l # square_area (generic function with 1 method)
  516. square_area(5) #25
  517. # 给 square_area 一个整形时发生什么
  518. code_native(square_area, (Int32,))
  519. # .section __TEXT,__text,regular,pure_instructions
  520. # Filename: none
  521. # Source line: 1 # Prologue
  522. # push RBP
  523. # mov RBP, RSP
  524. # Source line: 1
  525. # movsxd RAX, EDI # Fetch l from memory?
  526. # imul RAX, RAX # Square l and store the result in RAX
  527. # pop RBP # Restore old base pointer
  528. # ret # Result will still be in RAX
  529. code_native(square_area, (Float32,))
  530. # .section __TEXT,__text,regular,pure_instructions
  531. # Filename: none
  532. # Source line: 1
  533. # push RBP
  534. # mov RBP, RSP
  535. # Source line: 1
  536. # vmulss XMM0, XMM0, XMM0 # Scalar single precision multiply (AVX)
  537. # pop RBP
  538. # ret
  539. code_native(square_area, (Float64,))
  540. # .section __TEXT,__text,regular,pure_instructions
  541. # Filename: none
  542. # Source line: 1
  543. # push RBP
  544. # mov RBP, RSP
  545. # Source line: 1
  546. # vmulsd XMM0, XMM0, XMM0 # Scalar double precision multiply (AVX)
  547. # pop RBP
  548. # ret
  549. #
  550. # 注意 只要参数中又浮点类型,Julia 就使用浮点指令
  551. # 让我们计算一下圆的面积
  552. circle_area(r) = pi * r * r # circle_area (generic function with 1 method)
  553. circle_area(5) # 78.53981633974483
  554. code_native(circle_area, (Int32,))
  555. # .section __TEXT,__text,regular,pure_instructions
  556. # Filename: none
  557. # Source line: 1
  558. # push RBP
  559. # mov RBP, RSP
  560. # Source line: 1
  561. # vcvtsi2sd XMM0, XMM0, EDI # Load integer (r) from memory
  562. # movabs RAX, 4593140240 # Load pi
  563. # vmulsd XMM1, XMM0, QWORD PTR [RAX] # pi * r
  564. # vmulsd XMM0, XMM0, XMM1 # (pi * r) * r
  565. # pop RBP
  566. # ret
  567. #
  568. code_native(circle_area, (Float64,))
  569. # .section __TEXT,__text,regular,pure_instructions
  570. # Filename: none
  571. # Source line: 1
  572. # push RBP
  573. # mov RBP, RSP
  574. # movabs RAX, 4593140496
  575. # Source line: 1
  576. # vmulsd XMM1, XMM0, QWORD PTR [RAX]
  577. # vmulsd XMM0, XMM1, XMM0
  578. # pop RBP
  579. # ret
  580. #

还没有评论.