为什么这么多Emacser喜欢用clojure/Haskell?

最好把各个语言的实现,还有编译参数贴一下。

不然有的动态链接有的静态链接,有的用了fmt(format很占空间)有的没用(Nim的hello world好像就没fmt,使用fmt要import strfmt)不然这样吵来吵去没完没了,而且不够公平公正公开

上面贴了编译命令。

可是没有源代码呢

你还真较真,一个 hello world 能写出来很大差别么。。。就算有差别意义很大嘛。。。

结论并没啥不同,zig 最小,C/C++/Nim/D 在一个级别,Free Pascal/Rust/Ocaml 在一个级别,Haskell 的运行时比较大,Go 是静态链接,跟这些不具可比性,但 Go 的可执行文件大是出了名的,kubectl 有 47MB。

估计 Free Pascal 和 Rust 研究下编译参数也能到 C/C++ 那个级别,有两个意外的点:

  1. C/C++ 的 hello world 居然 50KB(macOS x64), 15KB(Linux x64),我老觉得印象中在 10KB 以下,甚至 2KB 以下,这是动态链接啊,哪来那么大的体积。
  2. OCaml 的运行时居然很小,能跟默认配置的 Free Pascal、Rust 这些没有 GC 的语言相比。

我是拿来写cc的,

在不涉及到图形的程序里,emacs的debugger足够舒服,哪个平台都能用(vscode的dap偶尔会有非常恼人的bug.

object format 的实现占空间啊,不然你把 disassemble 出来的 asm 比肯定大小也差不多啊,尤其是 DOS 用的 COM format 功能少,只支持 x86,实现特别简单啊。Mach-O 和 ELF 都是在设计成可以在多种不同系统和指令集上使用的,自然尺寸就大了

不是 object format 格式的问题,是各个 OS 各个编译器的段分配大小策略不一样,比如 macOS 上 zig 生成的段是 4kb 对齐,而 clang 是 16kb 对齐,导致 C 的 hello world 是 Zig 版的 4 倍。

差别不大吗?大不大不是要看怎么写吗?没有代码确实不公正啊,动态链接方式那么多,要比应该直接比静态链接的啊

#![no_std]
#![no_main]

#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! { loop {} }

#[link(name = "c")]
extern "C" {
    fn write(fd: i32, buf: *const i8, count: usize) -> isize;
}

#[no_mangle]
pub extern "C" fn main() -> isize {
    unsafe { write(1, b"Hello, World!\n" as *const u8 as *const i8, 14) };
    0
}

20210108_11h42m39s_grim

2 个赞

用 Rust 语法写 C 很好玩么,哈哈

我说了这句:

估计 Free Pascal 和 Rust 研究下编译参数也能到 C/C++ 那个级别

你不把怎么写的贴出来有什么对比的意义?那我在c里面写个1+1然后sleep1分钟再打印,然后python直接打印1+1,我是不是能说python比c快n倍?建议把写法和依赖了什么东西都贴出来对比才有意义。

这个编译参数和正常编译有什么不一样?问题不是在no_std吗?go用一下fmt,

package fmt

import (
	"errors"
	"io"
	"math"
	"os"
	"reflect"
	"strconv"
	"sync"
	"unicode/utf8"
)

我是因为 clojure 才接触 emacs 的,好奇多少人是反过来的

2 个赞

他说的object format是可执行可链接文件的(ELF Mach-O PE,分别对应类Unix Mac Windows)格式,不是fmt库。

不过我也赞成fmt库会影响大小。nim上就这样,Rust也有移除format string减少体积的操作。

我觉得,是 @Dieken 先拿一堆语言出来对比的,而且因为Mac机器,链接方式,strip等问题,闹了不少错误。网友对你的一些结果有质疑,这是正常的,不是特意要杠你。引起话题的是你自己,后来却说一个hello world比大小没什么意思,不让人辩论,似乎有些不近人情。

而且你突然发一堆其他语言(这title是讨论Clojure和Haskell)你这对比的连Clojure都没有,有点Off Topic了,应该另外开一个主题的。

不过 @kekeimiku 说话语气也不用这么冲,有理不在声高。语气太压迫反而容易引起反感。论坛应该友好讨论,没必要把坛友当敌人

我上面也建议 Dieken 把源码发出来,因为要讨论就最好明明白白的讨论,让大家都看明白问题的本质。在知乎上经常看到一些论战,双方各种名词互飙,大战三百回合。争论到最后发现只是同一个概念的不同表述,却因为表达不到位而导致理解上的偏差,或者两者讲的完全不是一个层面的东西,风马牛不相及。(就像keke把object format理解成了fmt库)。而程序方面的讨论就如Linus Torvalds所说的,Talk is cheap, show me the code.

最后发一下“GNU友好交流指南”。虽然Emacs China社区不归FSF管,但是这个指南的精神值得我们学习(更别说Emacs也是GNU软件)

https://www.gnu.org/philosophy/kind-communication.html

7 个赞

看了眼你写的,感觉在语言内引入下面几个符号当大量使用的语义符号的话

* $ & # !

键盘指法真的是有够为难人…

这就是 dvorak programmer 的好处了

我来补充一个,代码: <?php echo "hello world"; 编译成可执行文件是1.75M, 编译命令(win10): phpflexer compile echo-hello-world.php

图片

2 个赞

哇,PHP 逆天改命!

这个帖子好像全歪了 :rofl:
我在youtube查Emacs教程的时候,发现这些作者都用Clojure
我觉得这个语言的亲和力还是不错的,要是能作为主力编程语言就好了

歪得越来越远了😂。。。还是没明白为什么要用Clojure。。

  1. 社区的人很厉害也很友善,全都在 slack 上面,问问题都会被很耐心的回答。

  2. 生态很强大,JS 和 JVM,你还可以用 libpython-clj 来用 python 的库。啥都有就好像那种呼风唤雨的感觉,你只需要专注自已要做的东西就行。

  3. 语法是 Lisp,可以很方便的做高级的抽象。

  4. REPL 提供了交互式的开发体验,开发中可以得到很连贯的反馈。

5 个赞