喷了,那传什么不能传指针?语义上不还是传值?不把struct写出来,别的语言不可以这么干吗?
居然还有这种操作....
应该是编译器可以处理赋值运算左右为相同结构体的情况.
已经验证过了, main函数中的myA和foo中的myA是两个不同的地址.
typedef struct
{
int b;
int c;
int d;
int e;
int f;
int g;
char x;
} A;
A foo(int b, int c)
{
A myA = {b, c, 5, 6, 7, 8, 10};
return myA;
}
int main()
{
A myA = foo(5,9);
return 0;
}
所以"只有在显式使用指针/手动管理內存的语言才能直接控制是否从栈上分配"有问題?
这就是从栈上分配不正確用法会产生的问題。
CL-USER> (let ((a (list 'a 'b 'c))
(b '(1 2 3)))
(declare (dynamic-extent a))
(setq z (nconc a b))
a)
(0 . 0)
CL-USER> z
(0 . 0)
CL-USER> (let ((a (list 'a 'b 'c))
(b '(1 2 3)))
(setq z (nconc a b))
a)
(A B C 1 2 3)
CL-USER> z
(A B C 1 2 3)
这个操作是cpp标准规定的 copy elision
Omits copy and move (since C++11) constructors, resulting in zero-copy pass-by-value semantics
除了机器语言,所有的都应该是汇编语言的语法糖吧
语法糖本身或许并不重要 重要的是与外围(系统中的其它接口或协议)的交互
做好自己的事情或许很容易,因为你有决定权
与别人合作应该就没那么简单了吧
OBJ family 完全基于 reduction 和 term rewrite,立足于数学而独立于 Von Neumann 存在。
op nil : -> List .
op _._ : Qid List -> List
op length : List -> Nat .
op _in_ : Qid List -> Bool .
vars I J : Qid .
var L : List .
eq length(nil) = 0 .
eq length(I . L) = s length(L) .
eq I in nil = false .
eq I in J . L = (I == J) or (I in L) .
execution(reduction):
length(’a . ’b . ’c . nil)
= s length(’b . ’c . nil)
= s s length(’c . nil)
= s s s length(nil)
= s s s 0
s 与 or 的 定义呢? List、nil是如何表示的?
s s s 0 的目的是什么呢? 还是执行多次的s(可以是一段代码)?
op _+_ : Nat Nat -> Nat .
vars N M K : Nat .
eq N + 0 = N .
eq N + (s M) = s (N + M) .
reduction
s s 0 + s s s 0
=> s s s s s 0
**** 等价于
2 + 3 => 5
or 的定义
fmod BOOL-OPS is
protecting TRUTH-VALUE .
op _and_ : Bool Bool -> Bool [assoc comm prec 55] .
op _or_ : Bool Bool -> Bool [assoc comm prec 59] .
op _xor_ : Bool Bool -> Bool [assoc comm prec 57] .
op not_ : Bool -> Bool [prec 53] .
op _implies_ : Bool Bool -> Bool [gather (e E) prec 61] .
vars A B C : Bool .
eq true and A = A .
eq false and A = false .
eq A and A = A .
eq false xor A = A .
eq A xor A = false .
eq A and (B xor C) = A and B xor A and C .
eq not A = A xor true .
eq A or B = A and B xor A xor B .
eq A implies B = not(A xor A and B) .
endfm
这个语言沒有 eval 的概念,一切都是符號和语法树,根據預定的 rule 做 reduction。
定义 nil
of Type List
,定义 .
左邊类型是 Qid,右邊类型是 List
,合起來类型是 List
。那麼 'a . 'b . nil
就是个 List
。
eq N + (s M) = s (N + M) .
可以推导出
s s 0 + s s s 0 => s s s s s 0
但是
s s s s s 0 到底是什么呢?
s s s s s 0
就是代表自然数 5 了。为了方便也可以直接用 digits 5
代表这个。在这里用 s
是为了表現这个语言的本質和与其他语言的区別。
用 reduction 如何定义 s s s s s 0 -> 5 呢?
不要给概念 给段代码
我可不可以理解为 所谓的core language其实就是汇编语言
其它都是建立在汇编语言的基础之上
除了用汇编,还可以手工算。
其实还可以脑算 有几个人能比欧拉还强的吗
请问欧拉用过汇编嗎?
用 s
还是 1
实质上沒区別,尤其是对于一個很大的数。完全可以定义
op p X = s s s s s s s s s s X
这樣 p 0
就是十了。p p 0
就是 20。
不能解答"那麼 C++ 沒汇编怎麼运行"这个关鍵问題。
还是用 Ada Lovelace 用织布机编程的极端例子对这个问題有说服力。
对了,我还忘了 Hardware description language 这个直接生成硬件的大殺器。汇编是什麼玩意兒?不存在的。
VHDL 写出来的东西是给人用的 给人用就得提供接口
接口简单的意义不大,接口复杂的,不用汇编 还能用什么呢?
一个不可配置的硬件又有是什么用呢?
verilog 和C语言类似我知道
VHDL和什么语言类似我就不知道了
An assembly (or assembler ) language ,[1] often abbreviated asm , is any low-level programming language in which there is a very strong correspondence between the program’s statements and the architecture’s machine code instructions.[2]
只有对应 computer architecture 的指令的编程语言叫汇编,也就是说,得有个 processor。出了 computer architecture,或者直接用 machine instruction,都不叫汇编。