由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 程序的实现不变性
相关主题
纸上谈兵java的hotspot,js的v8还有dart vm都出自一个人之手
我来说说go的目标对手吧苹果又出新语言了
Typescript是不是实际上反 functional programming 的?October Headline: Dart enters the top 20 for the first time
玩go还是要玩OOnode.js快,到底什么是根本的原因?
请教一道C语言的题目js 复杂逻辑的例子,微软大杀器
这个结果是啥,为什么呢?typescript -- c# 软软的末路
写backend的朋友还是可以关注一下golang微软的visual studio code真心不错
我也说说JS, java, dart。。。取代C++!Google 开发自己的编程语言Golang了 (转载)
相关话题的讨论汇总
话题: cpp话题: 程序话题: golang话题: 问题话题: 语法
进入Programming版参与讨论
1 (共1页)
c*******v
发帖数: 2599
1
以最简单的程序为例,命题逻辑。至少有两种办法得到结果。一种是从公理出发,用逻
辑规则推断。
另一种是真值表,0,1带入evaluate其结果。这个事实看上去简单。但是其严格证明,
并不简单。
回到程序上来。显然,根据我们的日常经验,一个具有well defined的目的程序,(例如
执行神经网络模型),往往可以有多种在语法范围内的no trivial的不同的实现。
现在的问题是,对于一个任务而言,在合乎语法这个范围内,不同的程序实现,
这些实现之间,是否等价?
这条,我认为可以当作是程序语言的质量一个衡量指标。但是很遗憾,所有的程序语言,
都不具备这种严格的等价性。
这个问题和数理逻辑的类型论,模型论,证明论都有关系。数理逻辑对逻辑系统有许多
种衡量指标。
完备性,一致性,绝对一致性,等等一大堆。几十年后,距离实际应用越来越远。
任何一个程序语言,想要证明其类型安全什么的,在目前都是不切实际的目标。
对主流语言来说,要找个子集,并且证明这个子集的各种属性。那基本上就是5-7年一
个phd的工作量。
可以认为这个问题,导致了c有很多undefined行为。类型不安全,往往会导致内存问题
,以及各种内存security问题。cpp也是如此。
to be continued.
c*******v
发帖数: 2599
2
cpp以后,其实人们已经意识到了这个问题。对CPP/C来说。
语法容许的空间里,同样的目的,同一个程序员两个写法,后果就可以不同。
(例如cpp/c里的undefined behavior是古代程序员之间的名段。)
那两个程序员,写两个连接起来的程序,麻烦会更多。
所以成熟的c/cpp程序员(我认为)日常使用的都是自己琢磨清楚了的子集。
掌握程序写作风向的顶尖人物,其实对此问题非常熟悉。所以cpp之后,
python,java ,C#乃至今天的golang,都采用了所谓的strong type设计。
----严格的type safe仍然不可能,但是问题减少了很多。
(Typescript也就是strongly type的javascipt。)
在今天,以实现不变性高低为界,实际上C/Cpp和python,java,C#,golang不在一边。
(javascript我不了解。)。

例如
言,

【在 c*******v 的大作中提到】
: 以最简单的程序为例,命题逻辑。至少有两种办法得到结果。一种是从公理出发,用逻
: 辑规则推断。
: 另一种是真值表,0,1带入evaluate其结果。这个事实看上去简单。但是其严格证明,
: 并不简单。
: 回到程序上来。显然,根据我们的日常经验,一个具有well defined的目的程序,(例如
: 执行神经网络模型),往往可以有多种在语法范围内的no trivial的不同的实现。
: 现在的问题是,对于一个任务而言,在合乎语法这个范围内,不同的程序实现,
: 这些实现之间,是否等价?
: 这条,我认为可以当作是程序语言的质量一个衡量指标。但是很遗憾,所有的程序语言,
: 都不具备这种严格的等价性。

n******t
发帖数: 4406
3
C的type的問題其實是牛逼的設計,criticize it的人大部分不適合學計算機。
當然我並不是說strong type沒用,有那麼多事情要人幹,適合學計算機的人又不夠,
就這樣了。
問題是一來就學strong type language的做法,會把一些本來適合學計算機的人腦子
fucked up,這種人是最大的受害者。

例如
言,

【在 c*******v 的大作中提到】
: 以最简单的程序为例,命题逻辑。至少有两种办法得到结果。一种是从公理出发,用逻
: 辑规则推断。
: 另一种是真值表,0,1带入evaluate其结果。这个事实看上去简单。但是其严格证明,
: 并不简单。
: 回到程序上来。显然,根据我们的日常经验,一个具有well defined的目的程序,(例如
: 执行神经网络模型),往往可以有多种在语法范围内的no trivial的不同的实现。
: 现在的问题是,对于一个任务而言,在合乎语法这个范围内,不同的程序实现,
: 这些实现之间,是否等价?
: 这条,我认为可以当作是程序语言的质量一个衡量指标。但是很遗憾,所有的程序语言,
: 都不具备这种严格的等价性。

T********i
发帖数: 2416
4
这里边随便拿一个小问题出来,基本都是停机问题。根本没有必要去琢磨。
g****t
发帖数: 31659
5
As a fact, the type system of C is very far from safe. Thus, from my
observation,
mature programmers used a subset of C in their daily life to avoid the
undefined behaviors they did not anticipate.
所以,或许c/cpp 程序员水平高低,其实最后是他们自己设计的,或者经验演化出来的
,那套子集合的水平。
说白了,这问题跟欧式几何是类似的。欧几里德以来多少年,没人知道是不是前四条公理
是否可以推出第五条公理是false(也不知道能不能推出其为true),所以自《原理》
以来,
一切几何书上都少用第五公理。

【在 n******t 的大作中提到】
: C的type的問題其實是牛逼的設計,criticize it的人大部分不適合學計算機。
: 當然我並不是說strong type沒用,有那麼多事情要人幹,適合學計算機的人又不夠,
: 就這樣了。
: 問題是一來就學strong type language的做法,會把一些本來適合學計算機的人腦子
: fucked up,這種人是最大的受害者。
:
: 例如
: 言,

n******t
发帖数: 4406
6
首先你需要定義什麼叫做safe,不過不管你怎麼定義,
如果有人過來告訴某個語言是徹底safe的,這個人幾乎肯定是在賣印度神油。
所謂safe,都是限制某種可能性,這裏這個某種是好還是壞,不可能有一個宇宙適用的
唯一定論。就連指針越界almost never會被認爲是好的東西,搞不好人工智能就得靠這
個搞出最牛比的程序呢?
那既然最後都是針對某個情況來確定使用語言的限制範疇,爲什麼不是依據實際情況來
限定一個本身沒有太多限制的語言,而是要用一個限制一個本身就被限制的住的語言呢?
我從來沒有接受過所謂把safety作爲發明或者學習一門新語言的理由,我覺得提倡這種
人大多都有別的莫名其妙的目的,而且大多時候都是自己的私貨。

公理

【在 g****t 的大作中提到】
: As a fact, the type system of C is very far from safe. Thus, from my
: observation,
: mature programmers used a subset of C in their daily life to avoid the
: undefined behaviors they did not anticipate.
: 所以,或许c/cpp 程序员水平高低,其实最后是他们自己设计的,或者经验演化出来的
: ,那套子集合的水平。
: 说白了,这问题跟欧式几何是类似的。欧几里德以来多少年,没人知道是不是前四条公理
: 是否可以推出第五条公理是false(也不知道能不能推出其为true),所以自《原理》
: 以来,
: 一切几何书上都少用第五公理。

C*****l
发帖数: 1
7
C还行,c++的rule搞得太多

【在 n******t 的大作中提到】
: C的type的問題其實是牛逼的設計,criticize it的人大部分不適合學計算機。
: 當然我並不是說strong type沒用,有那麼多事情要人幹,適合學計算機的人又不夠,
: 就這樣了。
: 問題是一來就學strong type language的做法,會把一些本來適合學計算機的人腦子
: fucked up,這種人是最大的受害者。
:
: 例如
: 言,

c*******v
发帖数: 2599
8
C跟汇编类似。语法几乎毫无不变性或者说一致性。你觉得简单,
实际上是最难写的。
最简单的例子,两个char指针交换值。
正常写,你用个char中间变量交换。你这个程序是P。
但是,语法是允许你插几条没用的,用void,int指针和原来char交互
的语句的。这样,你的char指针周围的内存可能就会被弄废了。
假设你这样做的后果是程序xP。
这个xP和P是不等的。P到xP的这种变换有无数种。
都是语法允许的。所以在无数语法上等价的变换之下,
C程序的结果都是不等的。
我这不是说谁有谁劣,是说C跟硬件细节的binding非常紧密。
几乎任何一条数理逻辑的严格性要求的满足程度都极低。
cpp里面允许的C实际上填了很多坑。

【在 C*****l 的大作中提到】
: C还行,c++的rule搞得太多
c*******v
发帖数: 2599
9
好坏乃是价值判断。我考虑这些问题,主要是理解别人的设计思路。
例如cpp,java的创始人,显然不是傻子。花那么多功夫在type safe/complete/
cosistance之类的东西上,
为什么?再一个,如果不了解这些知识,新的讨论就看不懂。新的语言也不会用。
例如golang的空interface,会不会有跟c空指针类似的问题?这些问题心里可以有点数。

呢?

【在 n******t 的大作中提到】
: 首先你需要定義什麼叫做safe,不過不管你怎麼定義,
: 如果有人過來告訴某個語言是徹底safe的,這個人幾乎肯定是在賣印度神油。
: 所謂safe,都是限制某種可能性,這裏這個某種是好還是壞,不可能有一個宇宙適用的
: 唯一定論。就連指針越界almost never會被認爲是好的東西,搞不好人工智能就得靠這
: 個搞出最牛比的程序呢?
: 那既然最後都是針對某個情況來確定使用語言的限制範疇,爲什麼不是依據實際情況來
: 限定一個本身沒有太多限制的語言,而是要用一個限制一個本身就被限制的住的語言呢?
: 我從來沒有接受過所謂把safety作爲發明或者學習一門新語言的理由,我覺得提倡這種
: 人大多都有別的莫名其妙的目的,而且大多時候都是自己的私貨。
:

T********i
发帖数: 2416
10
其实这个事儿更多的是工程问题。C语言是里程碑,就因为当时缺乏一种啥都能干的工
程语言。在各种约束条件下(包括实现复杂度和优化复杂度,以及安全性)达到最优。
计算机语言发展史是非常合理的。除了C语言外,1980年开始的ADA语言是非常安全的语
言。广泛应用于雷达和军事系统。ADA没有在其他领域流行起来已经很能说明问题了。
咱们就说C++语言,其实“想”是很容易的,关键是谁来干活?我的IoT系统10年前就想
好了,也要干10年才能稳定完美。
给你看一个C++的简单feature你就明白了: Designated Initialization
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf
你可以向前想100年,但是脚踏实地地就要分出前后优先级。尤其是大项目多人参与各
种利益关系,还要做好各种互相挖坑填坑的准备(有时有意有时无意)。
说实话,C++能发展成这样,确实增加了我对人类社会的正面观感。这帮设计者还是干
人事儿说人话有人性的。
相关主题
写backend的朋友还是可以关注一下golang苹果又出新语言了
我也说说JS, java, dart。。。October Headline: Dart enters the top 20 for the first time
java的hotspot,js的v8还有dart vm都出自一个人之手node.js快,到底什么是根本的原因?
进入Programming版参与讨论
n******t
发帖数: 4406
11
人當了牛人之後,有意無意都會傾向於,幫別人把別人該做的事情做了的傾向。
這個是不可避免的。至於動機,有好有壞,我暫時先不評論。
有一點是肯定的,你在我畫里圈圈裏面玩,你肯定是永遠玩不過我的。cpp和java就是
這樣的例子,我下面怎麼搞你別管,你老老實實的認爲foo_int和bar_int 是不同的
type最好,
雖然他們其實都是一個int32.或者說你別在內存裏面指來指去的,我來幫你弄指針。
計算機大部分的東西都是會者不難,難者不會。把自己難的東西變自己會的東西,是牛
人的人生哲學。但是很多牛人還有一種哲學,就是把自己會的東西變成別人不會的東西
。但是想不想當這種不會的角色,就是每個人自己的選擇了。
BTW,我始終認爲golang沒有新東西,其實就是C+gc,外加一堆的標準庫。rob pike是
Bell出來的人怎麼會不知道這一點,但是這麼搞,不好玩啊。所以就一定要搞個不一樣
的東西,讓大家跟着他一起玩,順便把他當年沒搞出名堂的plan9的私貨給帶上。
golang的Interface其實就是void *,加一些類型檢查,我覺得沒什麼問題。

数。

【在 c*******v 的大作中提到】
: 好坏乃是价值判断。我考虑这些问题,主要是理解别人的设计思路。
: 例如cpp,java的创始人,显然不是傻子。花那么多功夫在type safe/complete/
: cosistance之类的东西上,
: 为什么?再一个,如果不了解这些知识,新的讨论就看不懂。新的语言也不会用。
: 例如golang的空interface,会不会有跟c空指针类似的问题?这些问题心里可以有点数。
:
: 呢?

g****t
发帖数: 31659
12
char ch = 7;
void* pv = &ch;
int* pi = pv;
*pi = 999;
ch周围的内存就被写了。不知golang能否构造出类似的资源leak.

【在 T********i 的大作中提到】
: 其实这个事儿更多的是工程问题。C语言是里程碑,就因为当时缺乏一种啥都能干的工
: 程语言。在各种约束条件下(包括实现复杂度和优化复杂度,以及安全性)达到最优。
: 计算机语言发展史是非常合理的。除了C语言外,1980年开始的ADA语言是非常安全的语
: 言。广泛应用于雷达和军事系统。ADA没有在其他领域流行起来已经很能说明问题了。
: 咱们就说C++语言,其实“想”是很容易的,关键是谁来干活?我的IoT系统10年前就想
: 好了,也要干10年才能稳定完美。
: 给你看一个C++的简单feature你就明白了: Designated Initialization
: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf
: 你可以向前想100年,但是脚踏实地地就要分出前后优先级。尤其是大项目多人参与各
: 种利益关系,还要做好各种互相挖坑填坑的准备(有时有意有时无意)。

T********i
发帖数: 2416
13
golang也不安全。
https://blog.stalkr.net/2015/04/golang-data-races-to-break-memory-safety.
html

【在 g****t 的大作中提到】
: char ch = 7;
: void* pv = &ch;
: int* pi = pv;
: *pi = 999;
: ch周围的内存就被写了。不知golang能否构造出类似的资源leak.

n******t
发帖数: 4406
14
這程序用意非常明確,每次你void *的時候,就是等於再說,我只要這片內存的地址,
幹啥別管我。
這怎麼能說是資源leak呢?

【在 g****t 的大作中提到】
: char ch = 7;
: void* pv = &ch;
: int* pi = pv;
: *pi = 999;
: ch周围的内存就被写了。不知golang能否构造出类似的资源leak.

g****t
发帖数: 31659
15
看来interface啥的要保守些用。自己多加
check。

【在 T********i 的大作中提到】
: golang也不安全。
: https://blog.stalkr.net/2015/04/golang-data-races-to-break-memory-safety.
: html

g****t
发帖数: 31659
16
如果这段发生在for loop里,不同的函数调用层的不同scope里。
可能会造成不停的写各种地方。
void语法上说是什么都可以干。但没人说它可以把计算机内存全写爆吧!

【在 n******t 的大作中提到】
: 這程序用意非常明確,每次你void *的時候,就是等於再說,我只要這片內存的地址,
: 幹啥別管我。
: 這怎麼能說是資源leak呢?

n******t
发帖数: 4406
17
我說過了,當你把一個東西賦給void *的時候意思是你已經不要語言給你做檢查了,你
希望直接訪問地址,現在你又怪別人讓你這麼幹了。那你到底想幹什麼?
在這件事情上面C語言你完全可以像別的語言那樣不用void *,而是自己顯式cast,但
是你不願意,要像匯編一樣幹活,然後又怪編譯器,不能怎麼搞吧?

【在 g****t 的大作中提到】
: 如果这段发生在for loop里,不同的函数调用层的不同scope里。
: 可能会造成不停的写各种地方。
: void语法上说是什么都可以干。但没人说它可以把计算机内存全写爆吧!

1 (共1页)
进入Programming版参与讨论
相关主题
简述一下常见语言的缺点请教一道C语言的题目
c++ programmer们就不用悲愤了这个结果是啥,为什么呢?
来看用什么来把nodejs给干死掉写backend的朋友还是可以关注一下golang
学FP不是为了写代码, 而是为了优秀的架构.我也说说JS, java, dart。。。
纸上谈兵java的hotspot,js的v8还有dart vm都出自一个人之手
我来说说go的目标对手吧苹果又出新语言了
Typescript是不是实际上反 functional programming 的?October Headline: Dart enters the top 20 for the first time
玩go还是要玩OOnode.js快,到底什么是根本的原因?
相关话题的讨论汇总
话题: cpp话题: 程序话题: golang话题: 问题话题: 语法