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++能发展成这样,确实增加了我对人类社会的正面观感。这帮设计者还是干
人事儿说人话有人性的。 |
|
|
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语法上说是什么都可以干。但没人说它可以把计算机内存全写爆吧!
|