免费注册 查看新帖 |

Chinaunix

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

[C] 思考题:语言是工具?重要是思想?那如何表达思想?(修改版) [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
51 [报告]
发表于 2011-10-26 13:41 |只看该作者
互为表里,有辩证的含义。表述思想有很多种方法,语言只是传递思想的工具
一段程序/算法,似乎还没有特定要求只能用某种语言实现的。
mirnshi 发表于 2011-10-26 08:36


不是所有语言都能很好的传递思想。
自然语言中的例子,如汉语,那种细致入微的亲戚关系。 妯娌是什么? 要怎么翻译为英文?

而编程语言中rc4算法就是这样一个例子: 在一些编程语言中该算法/思想可以很直接的描述, 而在另一些编程语言里就不能。
rc4算法本身并不是重点。需要的资料我也列出了,也不长。 如果感兴趣就去看看吧。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
52 [报告]
发表于 2011-10-26 13:56 |只看该作者
不是所有语言都能很好的传递思想。
自然语言中的例子,如汉语,那种细致入微的亲戚关系。 妯娌是什么? ...
OwnWaterloo 发表于 2011-10-26 13:41


抬杠不是这么抬的。我回复的帖子里的“语言”上下文都限定于计算机语言。自然语言如果语气或者标点符号不同,表示的意思都会不同的。

某种算法可以在一种语言里直接描述,但不见得在其他语言里就不能描述。如同我上面回复的,C语言描述的,汇编也可以描述,只是复杂度高而已。
如果只抓“直接描述”,那就没有必要讨论了。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
53 [报告]
发表于 2011-10-26 13:56 |只看该作者

论坛徽章:
0
54 [报告]
发表于 2011-10-26 14:07 |只看该作者
任何高级语言描述的,都可以落实到下层的汇编语言吧?
mirnshi 发表于 2011-10-26 08:39



    是的。我这里指的主要是高级语言之间的差别

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
55 [报告]
发表于 2011-10-26 14:16 |只看该作者
本帖最后由 OwnWaterloo 于 2011-10-26 14:17 编辑

回复 52# mirnshi

>> 某种算法可以在一种语言里直接描述,但不见得在其他语言里就不能描述。如同我上面回复的,C语言描述的,汇编也可以描述,只是复杂度高而已。
>> 如果只抓“直接描述”,那就没有必要讨论了。

那是否所有算法你都会用汇编实现? 如果是,我们确实没什么好继续讨论的了。
但显然不会。

同时, C与汇编是有很高相似度的, 很容易对应的翻译
选择C或者选择汇编还只是复杂度问题而已


但我举的例子并不是这样。
比如在lua中实现这个算法与在C中实现,表达的就完全不是同一回事, 没有对应关系。
lua与wiki中给出的算法就是一一对应的, 而C做不到。
我觉得举的妯娌的例子很贴切, 只是你体会不到在C中实现这算法其实就是在英文中描述妯娌关系。

PS: 对自然语言,我只是附带举例。 如果引起你不悦了,你可以完全忽略。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
56 [报告]
发表于 2011-10-26 14:25 |只看该作者
回复 52# mirnshi

另外,既然谈论如何表达思想,我觉得就是在谈论"如何更好的表达思想"。
直接是不是更好表达的一个标准?

而"所有算法/思想都可以用汇编实现"这种不证自明而且无意义(你会用汇编去实现所有算法吗?)的话,难道不是在抬杠?

论坛徽章:
2
射手座
日期:2014-02-23 22:37:05技术图书徽章
日期:2014-04-26 15:36:27
57 [报告]
发表于 2011-10-26 14:30 |只看该作者
作为一个准备入门的新手表示...看你们的讨论搞得都不知道要学什么好了...好多东西都被这个人或那个人贬得一无是处...

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
58 [报告]
发表于 2011-10-26 14:41 |只看该作者
回复  mirnshi

>> 某种算法可以在一种语言里直接描述,但不见得在其他语言里就不能描述。如同我上面回复 ...
OwnWaterloo 发表于 2011-10-26 14:16


汇编和C都是计算机语言。Lua语言不懂,所以无法看出具体的语义表述。汇编语言并不是不适合写算法,openssl里就有些汇编(这有些抬杠, )。

如果仅限于高级语言,那么很多不同语言的数据类型都很难准确翻译了,更不用说算法了,不同的语言体现的是不同层次/层面的计算机,看到或理解的自然不同。很多高级语言从不考虑内存泄漏问题,而C语言就要关注此事。

因此,限定于高级语言,就没必要讨论了。

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
59 [报告]
发表于 2011-10-26 14:47 |只看该作者
回复 47# OwnWaterloo
  1. #include <stdio.h>
  2. #include <string.h>

  3. unsigned char* get_S(const unsigned char* key);
  4. {
  5.           int i,j;

  6.           unsigned char* S;
  7.           S = malloc(256*sizeof(unsigned char));

  8.           size_t len = strlen(key);

  9.       for (i=0; i<256; ++i) S[i] = i;
  10.       for (i=0, j=0; i<256; ++i)
  11.       {
  12.             unsigned k;
  13.             j = (j+key[i%len]+S[i]) % 256;
  14.             k = S[i]; S[i] = S[j]; S[j] = k;
  15.       }

  16.           return S;
  17. }

  18. int* rc4(const int* iBuf, int ilen, const unsigned char* S)
  19. {
  20.           size_t len = strlen(key);

  21.           set_S(len);

  22.       int i,j,c;
  23.       i = j = 0;
  24.           int n;
  25.           int* oBuf;

  26.           malloc(oBuf, ilen*sizeof(int));

  27.           for (n=0; n<iLen; ++n)
  28.       {
  29.             unsigned k, byte;
  30.                         c = iBuf[n];
  31.             i = (i+1) % 256;
  32.             j = (j+S[i]) % 256;
  33.             k = S[i]; S[i] = S[j]; S[j] = k;

  34.             byte = S[ (S[i]+S[j]) % 256 ];
  35.                         oBuf[n] = c ^ byte;
  36.       }

  37.           return oBuf;
  38. }

  39. void rc4_file(const char* iFilename, const char* oFilename, const unsigned char* key)
  40. {
  41.         unsigned char* S;
  42.         S = get_S(key);

  43.         int iBuf[256];
  44.         int bufLen;

  45.         FILE* ifile = fopen(iFilename, "rb");
  46.     FILE* ofile = fopen(oFilename, "wb");

  47.         int  off = -1;
  48.         int* oBuf = NULL;
  49.         do
  50.         {
  51.                 off++;
  52.                 if(off > 256)
  53.                 {
  54.                         oBuf = rc4(iBuf, 256, S);
  55.                         fwrite(oBuf, sizeof(int), 256, ofile);

  56.                         free(oBuf);
  57.                         oBuf = NULL;
  58.                         off  =0;
  59.                 }
  60.                
  61.                 iBuf[off] = getc(ifile);
  62.         }
  63.         while (iBuf[off] != EOF);

  64.         if(off > 0)
  65.         {
  66.                 oBuf = rc4(iBuf, off, S);
  67.                 fwrite(oBuf, sizeof(int), off, ofile);

  68.                 free(oBuf);
  69.                 oBuf = NULL;
  70.         }

  71.         fclose(ofile);
  72.         fclose(ifile);

  73.         free(S);
  74. }
复制代码
如果这样会不会好些?
不是很明白你们要讨论的问题要旨。我只是按我的理解写,纯属凑热闹~~~

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
60 [报告]
发表于 2011-10-26 15:00 |只看该作者
回复 58# mirnshi

wiki中给出的算法伪代码:

  1. i := 0
  2. j := 0
  3. while GeneratingOutput:
  4.     i := (i + 1) mod 256
  5.     j := (j + S[i]) mod 256
  6.     swap values of S[i] and S[j]
  7.     K := S[(S[i] + S[j]) mod 256]
  8.     output K
  9. endwhile
复制代码
如果用Lua(或者python,scheme,C#以及所有支持coroutine的语言),就可以写出这样的实际代码

  1. local i = 0
  2. local j = 0
  3. while true do
  4.     i = math.fmod( (i + 1),256 )
  5.     j = math.fmod( (j + S[i]),256 )
  6.     S[i],S[j] = S[j],S[i]
  7.     local  K = S[math.fmod( (S[i] + S[j]),256 )]
  8.     coroutine.yield(K)
  9. end
复制代码
这几乎就是与算法/思想一一对应了,而C很难做到这点 —— 关于那段代码,我想说的就是这个。


至于"研究各种表达方式" vs "确信始终可以用汇编表达", "高级语言" vs "中低级语言"谁才是表达思想, 这类问题我觉得争不出什么结果……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP