- 主题:现在才发现编程语言一个重要区别是变量堆栈内存分配的问题
java的volatile是JMM的事情,和CPU无关。JMM会转成对应机器的规范。
我觉得c++后面搞出那么多内存模型,肯定有一部分参考了JMM。
【 在 xeagle 的大作中提到: 】
: 借楼问一下一直没搞清楚的问题. 没有jit的Java是纯解释型的吗?
: 感觉有些特性只用解释执行没法实现啊, 比如volatile
:
: ...................
--来自微微水木3.5.14
--
FROM 222.64.91.*
再提一下,实际上多数解释性语言都是混合执行 都有即时编译这个动作。
至于楼主说的内存模型问题,其实是大家设计的都差不多,只是稍微有点差别
【 在 xeagle 的大作中提到: 】
:
: 借楼问一下一直没搞清楚的问题. 没有jit的Java是纯解释型的吗?
: 感觉有些特性只用解释执行没法实现啊, 比如volatile
:
: 【 在 nokia9300 的大作中提到: 】
#发自zSMTH@CDU.MP
--
FROM 117.23.183.*
我表达的有点不太清楚,
主要表达 在底层变量如何分配内存和语言层面如何表示的问题。
例如 java 有基本类型也就是值类型 也有对象类型(底层缺省通过引用实现关联)
从而导致不同的操作方式
python 只有引用类型 但是语言层面可以不用管考虑具体的实现细节 认为变量的值就是对象的值就可以
c++ 对象可以通过 声明赋值 也可以通过new赋值 前一个在栈分配内容返回对象 后一个在堆分配返回对象指针
js 例如numer对象通过number()函数返回的就是值类型 通过new Number 就是一个Object包装对象 在比较====是不同的
不同编程语言 在语言层面做了不同层度 封装和自动关联,从而体现不同的操作方式
【 在 nokia9300 的大作中提到: 】
: 你说的其实是谁管理动态分配内存的问题。也就是运行时支持有没有GC。
: 语言还有别的分类,比如静态类型还是动态类型。
: 是编译语言还是解释型语言。
: ...................
--
FROM 124.127.76.*
go返回局部变量指针 是因为 有GC机制
go除了用new 外 基本上存在栈上 (当然也不绝对,编译器会优化处理)
c++ 因为 函数内的局部变量因为分配在栈上 函数执行完毕 会自动回收 导致出现野指针
所以局部变量指针是否可以返回更多取决于运行环境是否有GC机制
【 在 milksea 的大作中提到: 】
: 一个反例就是go,它是值类型且有指针,但数据在概念上都是堆中存储的,栈上变量存储是靠编译器做逃逸分析优化而来的。所以go可以随意返回一个局部变量或临时结构体的指针,效果和new一样,这在其他语言都显得奇怪。
--
FROM 124.127.76.*
不仅和内存模型有关吧。我看书上介绍,有volatile编译后的机器码是不同的。感觉纯编译不可能做到
【 在 foliver 的大作中提到: 】
:
: java的volatile是JMM的事情,和CPU无关。JMM会转成对应机器的规范。
:
: 我觉得c++后面搞出那么多内存模型,肯定有一部分参考了JMM。
:
: --来自微微水木3.5.14
: --
:
发自「今日水木 on iOS」
--
FROM 61.148.245.*
没jit的java应该是完全靠解释器运行的。volatile是java 语言的一个功能。对这玩意儿的实现应该是在编译生成bytecode的时候就搞了。(比如直接翻译成一坨跟内存操作有关的字节码啥的)然后等byteccode放到jvm上跑的时候已经不是源文件那个结构了。解释器可以顺序的跑字节码。
【 在 xeagle 的大作中提到: 】
: 借楼问一下一直没搞清楚的问题. 没有jit的Java是纯解释型的吗?
: 感觉有些特性只用解释执行没法实现啊, 比如volatile
:
--
FROM 98.42.117.*
计算机原理决定了程序代码首先要放到内存中,才能让CPU执行,要不然CPU够不着。
【 在 nextworld8 的大作中提到: 】
: 其实大部分语言无论在语言层面如何定义,本质上来说就是数据是存在堆还是栈的问题。
: 一般存在栈的就是值类型,内存空间存的值。 堆一般都是动态分配的内存,那么变量对应的空间(分配在栈)存的是堆内对象地址相当于桥接。
: 可以操作指针语言分的很清楚 ;不能操作指针的都是隐含的引用,编译器负责实现
: ..................
发自「今日水木 on iOS」
--
FROM 101.30.17.*