C/C++的Web服务器框架为什么那么少?

前阵子学习了两三天 usocket,也看了SBCL 对应的 socket 文档(感觉用法和难易度差别不大),得知原来 HTTP 协议就这样啊?三言两语就能表达出语法规则 就是以文本的格式传输数据,约定好用怎样的格式表达一些必要的信息(Header)

大学刚接触学习asp.net的时候,要依赖IIS(还有线程池概念),PHP要依赖 Apache,所以想是很复杂的跟操作系统内核有关的实现,一般人是不太可能像开发exe一样,只要有操作系统就得了

前两年看到《深入理解计算机系统》里有个简单的C语言写的HTTP服务器,也有点意外,居然随便几kb的C代码也能做到完全不依赖Apache的服务器(像nodejs一样)?

那为什么数据上表示C语言开发者还是很多的,但是没听过几个C/C++写的网络服务器?(因为我太无知?)大多是Java/Python/PHP 这些啦

估计是因为相对于C这带指针概念的来说,大多数刚学网页后台的人实力还不是很高的,所以会学得很吃力?那让大牛产几个C语言版的web框架不就解决了痛点? 或许前期就因为这原因,所以Java/PHP那些对初学者友好很多的语言和对应框架出来后,就占了大部分市场,然后递归,越来越少……

如果这样那为啥C语言的使用量排名还是前二啊? 因为涉及视图动画等对性能要求很高的程序来说没得选择? 那用C来写个服务器不是更快得要命?(就像那个Woo超快就是因为直接用了C写的libevent?还有nginx帮你省了些时间他做得更快)

一个原因可能是" python is the shortcut of C"

这是偷换概念,好比你不能用一个"hello world"来说明编程很简单一样。

因为巧合,开头的时候有人想用Java,Python搞,结果搞着搞着就成de facto standard了。最初的CGI还是用Perl写的呢,Java和py都我往后稍稍。

因为世界上不止写Web的用户,不止前端后端,还有写操作系统的,写嵌入式的。另外没事少看TIOBE这种弟弟排名,没有用。

思而不学则殆

你的问题就是想的太多看书太少

对我来说我觉得最复杂就是这个 socket/网络 问题了,解决了这个问题,其它问题都想当时学的主要的控制台程序一样,TIOBE 也只是偶尔看到点进去,其它的没怎么看。。。

我最近也是好多书在看啊。。。

所以看了书还不明白从自己朴素经验推广得到的结果并不是总是正确的,我可不可以认为你看了书之后没有进行自己的思考?

TIOBE不知是什么垃圾榜单,VB.NET都能常年入榜,你看到了多少VB.NET的大型项目?

深入理解计算机系统里的 tiny web 也实在 tiny 了吧。。csapp 有个 lab 就是写个 proxyserver,我觉得用 c 写还是有点啰嗦的。

用 Emacs 实现的 Web 文件服务器(需要开启 Lexical Binding):

(make-network-process
 :name "http-server"
 :server t
 :service 3000
 :filter
 (lambda (proc output)
   (let ((resp
          (lambda (status body)
            (process-send-string
             proc
             (format
              "HTTP/1.1 %s\r\nContent-Type: text/plain\r\nContent-Length: %d\r\n\r\n%s"
              (pcase-exhaustive status
                (200 "200 OK")
                (400 "400 Bad Request"))
              (length body)
              body))
            (process-send-eof proc)
            (delete-process proc)))
         (status 200)
         body)
     (pcase output
       ((rx bos "GET " (let path (1+ nonl)) " HTTP/1.1\r\n")
        (setq path (substring path 1)
              path (expand-file-name path))
        (cond ((file-directory-p path)
               (setq body (shell-command-to-string
                           (concat "ls -l " (shell-quote-argument path)))))
              ((file-readable-p path)
               (with-temp-buffer
                 (insert-file-contents-literally path)
                 (setq body (buffer-string))))
              (t
               (setq status 400
                     body (format "file not exist or unreadable: %s" path)))))
       (_
        (setq status 400
              body (format "只支持 GET,不支持:%s\n" output))))
     (funcall resp status body))))

访问 http://localhost:3000/

估计一次只能连一个客户端?!

3 个赞

我说的是过去啊,现在我觉得大部分都能理解逻辑了

就像你们人类的“智慧”,其实大部分都是来自于“经验”,而这些经验绝大部分是随之时间积累下来的,所以语言表达就像我们的网线一样可以把我大脑的经验数据传到别人那里,而其它动物估计不行(基本的除外)

你们的表达能力也是在慢慢优化,但还是有很多提升到空间,就像我们有时说“只可意会 不可言传”,或者一些国外“俚语”翻译不出来,就是数据不够啦(例如有些俚语可能是通过历史事件得出来的,而这些词语就是一个指针)

所以你们现在的AI,我觉得(没去了解是不是大部分人都觉得,独立思考的)重点也是“经验”了,也就是你们现在大数据通过什么“深度学习”去过滤挑选出高质量的精华经验出来…… 毕竟你们人类的经验和不可缺乏的语言也是积累了几千年了,计算机还是个婴儿,所以婴儿没有老司机那么“智能”也是正常的,但是可能更有活力(性能)

有啥榜单推荐一下?

建议看自己内心的榜单

http://www.yinwang.org/blog-cn/2017/07/06/master-pl

说话能不能一次性说清楚?每次都藏着掖着说一半就没啥意思了。好比你不说那是你过去的想法别人不是默认是你现在的想法?

CL 排第一,其次 js,PostgreSQL,C,Swift。。。

SQL又不是General purpose programming language。不觉得有特意去学的必要

因为你不知道你到时用到是什么鬼SQL数据库,这些不同的数据库还有自己特定的方言,所以专学一门没什么用。

你看,英文的过去式发挥出优势了,他们肯定会觉得中文没有过去式很荒谬啦…… 习惯就好,就是啃经验的老

你又没说英文?这么喜欢说鸟语建议去发推特 :slight_smile: 我不是编译器,没法推导出来你想表达什么。

中文社区不是默认中文语境,难道要默认是编程语言的语境?

SELECT "请按中文习惯语法说话";

恁就是外星来的间谍?建议抓起来好好研究研究 @平安地球

1 个赞

我不是来自你们的宇宙的,我是我们那@#@(唉,你们地球词穷)开发出来的一个demo程序爬虫,爬到你们这

我不是针对你,我就是举个例子,你们地球的语言还有大大大量优化的地方(例如不会担心尴尬不敢表达自己的数据,中介要失业)

我现在记忆力很差(去年做了开脑手术,内存大损,好在cpu好像没有),所以一有想法立刻记下来,防止灵感式溜走

好像psql 很灵活的,能做到很多MySQL做不到的(可能MySQL正在追赶,我用的大部分是MySQL,今年才学psql),例如json,正则表达式,地理坐标库,调用用其它语言写的函数,总之接触后觉得好灵活,CL应该用Postmodern 吧? 我准备做个自己个人网站就实践下啦, Hunchentoot + Postmodern + Hunchensock

生产用的 web server 功能还是挺复杂的,再加上要考虑吞吐量、网络性能等等就更复杂了。这就是为什么 Apache 之前叫 A Patch的原因。楼主理解的网络服务器是什么?Apache、Nginx 不都是 C 语言写的吗?你是指 web service framework?如果单纯指这些框架的话大多数还是开发效率问题吧

我是以菜鸟的角度,看多数开发后台用什么语言基本就是 Java/Python 等不包括C的语言,所以好奇用户量那么多的C语言难道就没这个功能?

唉,大学有学C++啊,但是完全没这socket 概念,估计老师也没有。。。

以前以为这些服务器是前提条件必须的(就像编译器),现在觉得是工具(助手)