免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[低水平帖]啥叫堆?啥叫栈? [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
61 [报告]
发表于 2011-09-06 14:48 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
62 [报告]
发表于 2011-09-06 14:49 |只看该作者
很显然, Harry G.Frankfurt 在扯淡, 法兰克福也在扯淡
自以为自己掌握真理的人, 都他妈的在扯淡

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
63 [报告]
发表于 2011-09-06 15:07 |只看该作者
为马俺总是在错误的时间进入错误的帖子{:3_191:}

论坛徽章:
0
64 [报告]
发表于 2011-09-06 17:22 |只看该作者
看来你同意了
而对于程序员来说,对计算机系统的理解、对语言的实现的了解,实际上是绕不过栈这 ...
pandaiam 发表于 2011-09-06 14:44


“计算机系统”范围太大了吧?
成本问题可以理解。理论依据?
function可以扔掉用coroutine,栈就不能扔了?

论坛徽章:
0
65 [报告]
发表于 2011-09-06 17:23 |只看该作者
很显然, Harry G.Frankfurt 在扯淡, 法兰克福也在扯淡
自以为自己掌握真理的人, 都他妈的在扯淡
zylthinking 发表于 2011-09-06 14:49



    很显然,说“显然”的人都在扯蛋。

论坛徽章:
0
66 [报告]
发表于 2011-09-06 17:27 |只看该作者
依你之见能抛开OS的一些基础理论来学好C?
    那我就有个疑问  如果抛开OS 写出来的程序根那儿 ...
chiyiangel 发表于 2011-09-06 13:19


显然存在回避OS理论学习的情况下合理合法地使用语言的方法,例如hello world。就是不知道你学“好”是什么程度了。
窃以为只是学好使用C语言本身,不关OS什么事。
如果要学历史,学经典实现,学怎么XXOO二进制代码这些语言本身以外的事情,那么学OS理论应该有些帮助。
说白了OS和程序设计语言就是两个领域的事情,不管有多少历史渊源。

论坛徽章:
0
67 [报告]
发表于 2011-09-06 17:40 |只看该作者
本帖最后由 幻の上帝 于 2011-09-06 17:49 编辑

另外说非得有OS的,看看freestanding implemention。我想敢写freestanding implemention的人都比他们清楚什么时候需要OS。
说回栈。
ISO C唯一一个和栈耦合比较严重的是variable arguments一块;除此之外,任何其它特性,包括函数,都无需理会栈的存在。(即便如此,variable arguments也没明言需要依赖于使用栈方式的实现。)
我的大脑中对C的实现不包括这些内容。换个角度想,初学C的人,必须知道函数是用栈实现的才能搞清楚使用函数这一特性的程序的行为吗?
C根本不关心参数的入栈顺序之类的琐屑问题,这些问题应该是在C之外的角度考虑实现它们的人来伤脑筋的。
把不必要的概念搅合进去,把简单的问题搞复杂,还非得说是必要的,这是什么居心?逼我恶意揣测是显现优越感什么的吗?

说到这里,干脆再表达一下另外的疑问好了。关于某些所谓汇编万能论者。C有C的局限,诸如去specify一些unspecified behavior的东西只用C的观点就不可行,用汇编探讨实际结果本无可厚非;但一脸什么东西都取决于汇编的样子……那C算什么?既然这么“精通”汇编,为什么使用C这种“高级”语言?掩饰对C的无知,只会稀里糊涂地“用”而不会从C的角度来表达么?

论坛徽章:
0
68 [报告]
发表于 2011-09-06 17:48 |只看该作者
回复 67# 幻の上帝


    更好笑的是,不光把无关主题的东西扯进去了,扯的还全都是错的~

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
69 [报告]
发表于 2011-09-06 21:09 |只看该作者
本帖最后由 captivated 于 2011-09-06 22:33 编辑

回复 64# 幻の上帝

    抛开Lisp, Scheme, Erlang之流先不谈,C/C++的函数调用,实现方式就是栈,对吧。
    我还说栈的本质是LIFO,在单栈的情况下,这是“最后压入的栈帧最先弹出”的唯一实现方式,错不了吧?告诉我除了栈之外,你还知道什么结构能具有LIFO的性质。更直白地说吧,栈就是LIFO的同义词,或者干脆地说它们是同一个词也可以。

    好嘛,非要扯coroutine, 那就看coroutine嘛。
    “Coroutines are computer program components that generalize subroutines to allow multiple entry points for suspending and resuming execution at certain locations. ”
    “  "Subroutines are special cases of ... coroutines."   —Donald Knuth.”
    上面出自Wikipedia. 大意是说,Subroutines是Coroutines特例,而Coroutines是Subroutines的范化。Coroutines可以具有多个入口点,也可以在喜欢的地方暂停/恢复执行。

    简单的说,真正要实现的东西,是一个执行流。这个执行流可以从caller贯穿到callee,而它们必须要完成的事情是从被调用者处return或者yield(好吧,coroutine嘛,必须要用个不一样的名字才能显示不同之处,对吧?)后,执行流能从调用处继续。要完成这样的事情,只要在调用者处保存“执行指针”,在被调用者处返回时转向调用者的“执行指针”就可以了,所以使用栈当然不是必须的。

    好,那我们就来看实现。Coroutine说白了是什么?如果不借助栈的能力(一丁点都不许),那么每一个coroutine都是一个“单体”,这个coroutine,如果调用另外一个coroutine,那么被调用的那个coroutine和调用方一定不在同一个栈上。当然你可以把它们放在一起,并把调用方和被调用方一起放置的地方叫栈,然后告诉我两个coroutine在同一个栈上
    说白了,可以认为每一个coroutine都是一个栈,不过这个栈只放一个coroutine. 当然也可以认为既然一个栈只放一个coroutine,那么它当然也就不叫栈了。

    结论:
    1. 执行流的实现怎样都可以,跟是否使用栈无关。
    2. 栈是广泛的实现执行流以及caller/callee调用链的方式之一,它又简单又实用,方便廉价。
    3. coroutine其实也没啥,链表之类的结构就足够实现。优点有多大?其实也没啥优点,就是每个routine都可以“同时被调用”,这个和栈不同,对于栈来说,如果某个函数被调用,那么它一定处于一个栈上的某个栈深的位置。这个应该就是coroutine所谓的多个执行绪下会有神马优势的依据。更直白地说,一个栈就是一个执行流,因为coroutine的理念是一个routine就是一个栈,因此直接当一个routine就是一个线程。
    4. coroutine的缺点?没深入研究,我不乱说。反正非coroutine不可的我没见过,现在不都是多线程用得好好的么。
    5. 说当前计算机系统中,栈是最重要的概念之一,仍然没有错。 -- 相反,很对,大大滴对,因为C/C++以及许许多多的语言执行流实现就是栈,根据这个,多线程的实现也就是一个栈一个线程。另外,就算不用来实现执行流,栈也有别的用处。而解释C/C++的函数调用,栈当然是最好的方式了,非要去扯神马coroutine!

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
70 [报告]
发表于 2011-09-06 21:28 |只看该作者
本帖最后由 captivated 于 2011-09-06 23:17 编辑

回复 67# 幻の上帝


    我从来没扯过神马汇编万能论。相反汇编是平台相关的,非必要鬼才有心情弄它。

    然而探究某个你想知道的实现,摆弄下汇编又有何不可?

    要逃离OS依赖是吧,freestanding implementation是吧?

    A freestanding implementation is one in which execution may take place without the benefit of an operating system, and has an implementation-defined set of libraries that includes certain language-support libraries .
    没出处,随便google一段E文吓唬人的...

    管你要不要freestanding,高层抽象需要建立在低层抽象之上,这一点是无法摆脱的。你要freestanding implementation,那就自己实现一个微的OS. 那这个freestanding implementation不照样在OS上跑。如果说一个微的OS也不用实现,那么没有虚拟空间之类抽象的语言怎么用,我真的不知道。说不用OS,不过是把OS的名字换成“语言支持库”罢了。啊,你的意思是你的freestanding implementation不是跑在裸机上而是跑在一个Native Operating System上?那这跟Java VM、C# Runtime Env 之流有个他妹的啥本质区别嘛?

    “计算机领域的任何问题都可以通过增加一个间接的中间层解决”。说白了就这么回事。只不过目前操作系统就是那个NB的中间层而已。

    尼玛,非要逃离了一切实现来讨论,那一句话就可以了:神马都是抽象,抽象再抽象,抽象到令人眼花缭乱。
    要是程序员都是打字员满足于流畅地使用键盘的话也就罢了。只是某天这个无聊人士突然想知道这个抽象过程,于是他的问题就来了...

      或许讨论各种计算机抽象过程不过瘾之后,继续去讨论数学?...不不不,数学也是抽象的一种,而且,...4次元的东西,叔叔怕。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP