为什么会有开发语言的想法

在2012年,我准备开发一个给前端切图使用的屏幕取色器。

需求很简单,前端经常需要获取设计稿特定位置的颜色代码。虽然当时 PhotoShop 提供了内部取色器,但操作麻烦,而且打开 PhotoShop 很慢。有时候还想要从别的网站抄一个颜色,当时没这么现在这么强大的网站开发工具,操作也非常麻烦。所以就想找一个能快速复制用#开头的CSS颜色代码的软件。然而找了一圈,只找到几个截屏软件,操作还特复杂。

于是,我就寻思这东西也不复杂,就干脆自己做一个吧。软件的原型很简单:启动软件后先截屏,鼠标右下角参考当时的 QQ 截图显示放大镜,双击复制颜色值,然后程序退出。因为是 GUI 软件,所以我就用熟悉的 C# 开始整了。

C# 做标准的软件是比较简单的,新建项目后自动创建了一个窗口。但截图软件不是常规的窗口,经过一些研究,终于把窗口的标题栏彻底去掉了。然后接下来要实现获取系统截图的功能,但之前并没接触过这类 API,于是就谷歌了一下,最终在 CodeProject 发现了一个 C# 截图的案例代码,原来C# 标准库没有截图的现成能力,而是直接调 WinAPI。最后软件的功能如期完工,但发现另一个问题:每次启动软件都需要近一秒的启动时间,这严重影响了整个软件的体验。于是我就对代码进行了优化,但无论怎么优化,都达不到理想速度。

我最终分析慢的原因是:

1. C# 只被编译为字节码,每次启动时还需要继续编译生成可执行的机器码,这需要占用时间。

2. 我用了标准的 WinForm 框架,但又把框架自动生成的界面隐藏了,这些多余的功能也占了时间。

正是因为 C# 这两个性能问题,让我无法写出快启动的软件。于是,我就用 C++ 重写了一次。

最终软件成功开发完成。但 C++ 做起来很累,大部分在 C# 一行代码搞定的事情,在 C++ 好几行。C# 版本用了 3 天完成,C++ 版本用了 10 天,还有一些功能因为实现复杂就没做了。

此时,我就想着能不能发明一个语言,既可以像 C# 这样用起来方便,又能达到 C++ 的性能。这便是我准备发明语言的原始动机。

第一次尝试语言开发

语言分脚本语言和编译语言,因为当时开发语言的动机就是性能,自然选择了编译语言。

语言的语法就觉得和 C++ 差不多就行了,再增加一些 C# 好用的功能。

要让语言运行起来就需将代码翻译为汇编。但这东西太复杂,于是就发现了 LLVM。

第一次开发语言的目标也就成立了:做一个用起来像 C#,但可以直接编译成 LLVM 的编程语言。语言命名 T。

然后我就基于更早之前完成的 JSParser,快速完成了语法解析功能。

但后面怎么生成 LLVM 卡住了。实现起来工作量大,而且难度高,还没文档。

于是我变换了开发思路,改成基于已有的编译器改。最终找到了 Mono 开源的 C# 编译器,用了一个月时间啃代码,并做了个 Hello world。

后来有一天,Swift 发布了,我发现整个语言的设计,和我正在开发的语言非常接近,于是我就果断放弃了继续开发语言的想法。

第二次尝试语言开发

2014年,JS 还是 ES5 时代,随着前端工程越复杂,越觉得 JS 因为缺少类型信息、缺少智能提示而导致难以做成大项目,就想着能不能做一个语言,以 JS 为基础,参考  ActionScript 的语法添加类型,然后通过编译将类型去掉,生成纯 JS 代码和 API 文档。

经过小范围的用户调研后,我开始了第二次语言开发,语言名 TScript。

语言本身还是用 C# 开发,将之前的 JSParser 重新改造下,花了 1 个月时间,完成了初版。但还有很多细节没完善。

后来有一天,在开发过程中我发现了 TypeScript(那时国内还不火),我发现它的目标和我正在做的简直一摸一样,并且成熟度更高。于是我就果断停止了开发新语言。

第三次尝试语言开发

2016年,移动端大火,那时公司有很多跨端业务,同样的程序需要 H5、安卓、iOS 三个程序员做三遍。于是我就开始思索有没有可能做一个语言,只写一遍,可以同时生成五种代码(H5、安卓、iOS、Windows、Mac)。

整个语言以 TypeScript 为原型改造,UI 框架以我熟悉的 .Net SliverLight 架构为原型。编译器可以将这份代码转换为等价的 .java 文件及 .swift 文件,对于不同系统不同的业务,先通过系统判断,然后调不同的 API。所以运行库也是根据不同系统不同,但会开发一个通用的适配框架。

在投入了两个半个月后,我发现了 Dart 和 Flutter,显然这条路已经提前被发现了。于是我就果断停止了继续开发。

第四次尝试语言开发

React 和 Vue 是目前最火的两个前端 UI 框架,但随着框架的不断升级,就会发现,要想实现更好用的响应式,必须通过语言层面提供支持。就像 Solidjs 这样。

于是,我便开始第四次语言开发。目标为:以 TypeScript 为原型,支持响应式组件开发,同时增强 JSX 模板语法。

但最终我发现,如果仅仅是实现上述目标,似乎只开发 TypeScript 插件即可,没必要开发新语言。因此就没有往新语言的方向思考。

第五次尝试语言开发

当我花了一年时间在低代码后,我总结认为低代码的本质就是一个新的编程语言。针对低代码平台的新型编程语言也在不断构思中。

但我并没有立即去开发语言,指不定又能发现一个类似的实现呢?

第六次尝试语言开发

现在,经过多轮验证,我决定第六次尝试语言开发。开工前记录一些先前的经验和结论。

对编程语言的质疑

没人愿意学习新语法

如果你认为现有任何语言语法比较“丑”、写起来不够“优雅”,想要根据自己喜好,设计一套新的写法,还是尽早放弃吧。

因为更多时候这只是你的一厢情愿,你觉得不习惯的东西,说不定别人很习惯了。

我们已不再需要更多动态语言

如果你准备做一个非编译的、不考虑性能的动态脚本语言,还是尽早放弃吧。

我认为 JS 、Python、Lua 等足够支撑所有动态语言的场景了。

我们已不再需要更多强类型语言

如果你准备做一个强类型的编程语言,还是尽早放弃吧。

我认为 C++、Java 等足够支撑所有强类型语言的场景了。

强类型语言本身足够复杂,需要开发者先学几个月才可以上手。显然是不会有开发者愿意把时间放在一个没有存在感的新语言上的。

唯一可能打动用户的语言

1. 首先它必须是稳定的、安全的、开源的。

2. 它必须有完备的 IDE 和充足的三方库。

3. 它的学习成本不能高于 JS 、Python 等这些能自学入门的脚本语言。

4. 它的运行性能必须高于 Java,而不是传统的脚本语言性能。

5. 当然还有最重要的一点:用户学了这门语言后可以找到工作。

T语言开发笔记1的更多相关文章

  1. LeapMotion控制器 java语言开发笔记--(Java开发环境的准备)

    (1)官方文档说的是必须是JDK6,JDK7,我试了一下JDK8也是可以的 (2)我是在Windows系统下用的是Eclipse Java的开发环境这里不再多说.将下载的JDK里面的java.dll和 ...

  2. LeapMotion控制器 java语言开发笔记--(连接控制器)

    (1)为了连接LeapMotion控制器,创建controller对象,这个对象自动创建与控制器的服务或者后台程序连接,然后捕获数据提供给你的应用程序.可以使用该对象来获取连接信息. (2)获取Fra ...

  3. LeapMotion控制器 java语言开发笔记--(LeapMotion控制器简介)

    (1)LeapMotion系统识别和追踪手,手指,以及根手指类似的工具,这个设备运行在一个极小的范围,这个范围拥有个高精度,高跟踪频率可以记录离散的点,手势,和动作. (2)LeapMotion控制器 ...

  4. LInux系统的C语言开发工具笔记

    常用的C语言开发工具有很多,每个开发工具所支持的库函数和对标准的实现都有差异.对于初学者,选择一款使用广泛.上手容易的开发工具才是王道.在Windows 上很多从事C和C++开发的人员都选择VS作为开 ...

  5. C语言学习笔记(一) 开发环境的搭建

    写这个系列的原因是因为最近在学习C语言,记录博客会让自己能够更好的掌握学习到的东西.编程贵在坚持,每天改变一丢丢! C语言开发两个软件,一个是文本编辑工具,Notepad++或者是EditPlus都可 ...

  6. Java 学习笔记 第一章:Java语言开发环境搭建

    第一章:Java语言开发环境搭建 第二章:常量.变量和数据类型 第三章:数据类型转换.运算符和方法入门 1.Java虚拟机——JVM JVM(Java Virtual Machine ):Java虚拟 ...

  7. UWP学习开发笔记记录(开篇)

    零零散散开发微软移动2年多了,基本上从未记录或写过任何笔记.所以打算写一些自己的心得和技术的分享,大家一起来共同探讨.虽然现在UWP的工作几乎没有了,但是我感觉大家都是在观望,再看接下来微软的动作,所 ...

  8. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  9. Go语言开发环境配置

    一.我为什么要学习go语言 当今已经是移动和云计算时代,Go出现在了工业向云计算转型的时刻,简单.高效.内 置并发原语和现代的标准库让Go语言尤其适合云端软件开发(毕竟它就是为此而设计的).到2014 ...

  10. Lucene/Solr搜索引擎开发笔记 - 第1章 Solr安装与部署(Jetty篇)

    一.为何开博客写<Lucene/Solr搜索引擎开发笔记> 本人毕业于2011年,2011-2014的三年时间里,在深圳前50强企业工作,从事工业控制领域的机器视觉方向,主要使用语言为C/ ...

随机推荐

  1. JS时间对象与字符串相互转换

    1.Date => String 代码 /** * 函数描述:时间格式化工具 * @param format {String} 格式(y-年,M-月,d-日,H-时[24],h-时[12],m- ...

  2. Android Qcom USB Driver学习(四)

    VID/PID识别USB设备 CDC-ACM驱动介绍 CDC-ACM(Communication Device Class--Abstract Control Model)驱动实现以USB设备驱动和t ...

  3. Makefile优化编译速度

    并行编译:使用 make -j 命令来进行并行编译,可以加快编译速度.-j 后面可以跟一个数字,表示并行编译的线程数. 懒惰计算:使用 .PHONY 规则来避免无谓的重新编译.该规则告诉 make,这 ...

  4. 59.ref和reactive的区别

    首先,ref和reactive 定义响应式数据的,& vue3中的数据分为 2 类,一类没有响应式数据 第二类是响应式数据 : 如果没有使用ref 或者 reactive 定义数据,那么默认是 ...

  5. ribbon配置负载均衡策略

    ribbon的负载均衡策略 com.netflix.loadbalancer.RandomRule:从提供服务的实例中以随机的方式: com.netflix.loadbalancer.RoundRob ...

  6. 如何正确的使用CMDB?

    为什么说CMDB在企业中很难被使用起来?第一,CMDB的数据集成与准确性维护是一大挑战,因为需要确保来自多个异构IT系统的配置信息能够实时.准确地同步与更新.第二,复杂的IT环境和快速变化的业务需求使 ...

  7. VueJS实现迷糊查询

    原文请查看公共号 前置条件: 开发环境:windows 开发框架:vue2.5 ,vue-cli 4.0+ 编辑器:HbuilderX 兼容版本:vue2.5     Chrome 99.0.4844 ...

  8. GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU

    本文主要分享在不同环境,例如裸机.Docker 和 Kubernetes 等环境中如何使用 GPU. 跳转阅读原文:GPU 环境搭建指南:如何在裸机.Docker.K8s 等环境中使用 GPU 1. ...

  9. SSM基础知识

    SSM整合 前面我们已经把Mybatis.Spring和SpringMVC三个框架进行了学习,那现在我们把这三个框架整合在一起,来完成我们的业务功能开发,具体如何来整合,我们一步步来学习. 流程分析 ...

  10. 2023年10月,红米(小米)note 8 pro 优化记

    看了红米的note 13 pro和note 12 turbo的参数和价格后,我决定下单买个note8 pro的手机壳,确实有新手机的感觉了. 我note8 pro手机参数如下 MIUI 12.0.5 ...