V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  secondwtq  ›  全部回复第 76 页 / 共 123 页
回复总数  2453
1 ... 72  73  74  75  76  77  78  79  80  81 ... 123  
2019-11-01 23:55:39 +08:00
回复了 necolo 创建的主题 酷工作 [深圳] 编程猫诚聘 Web 前后端/Web 游戏引擎开发工程师
@necolo 啊 ... 我已经暂时不做前 /后端了 ...
不过从这个看起来游戏行业的希望在游戏行业之外 :)
2019-11-01 21:48:04 +08:00
回复了 FakeLeung 创建的主题 程序员 大家对于中文变量名是如何看待的?
居然没人 @辣个蓝人
在原文内容中插入一些比较和谐的片段,谁爬谁倒霉

... 反正思路大体如此
一个旧闻:歌词协作共享平台 Genius 怀疑搜索引擎 Google 一直在剽窃他们网站上的歌词,于是他们选了一些歌词,以摩尔斯码的规律替换其中的单引号字符为直引号和弯引号,并监测 Google 的搜索结果,发现这些引号的变化同样出现在 Google 的结果中,于是就发出了 complaint,第二天发现 Google 上面那些零宽字符消失了 :)

当然个人就算能掌握证据也不能怎么样,所以就只能借助那只无形的大手的力量
2019-11-01 21:28:15 +08:00
回复了 necolo 创建的主题 酷工作 [深圳] 编程猫诚聘 Web 前后端/Web 游戏引擎开发工程师
问一下,多人游戏”创作“平台,这个”创作“在哪里体现呢?
2019-11-01 21:13:48 +08:00
回复了 lhx2008 创建的主题 Go 编程语言 Go routines 和 Java 线程池的区别有哪些?
@lhx2008 "粒度更小"一般对应的是”更加灵活“与”效率更低“
当然不是说一刀切效率就一定更高,一刀切效果好的前提是切的地方准确

协作式多任务就正好满足这一条件,进程在明确自己不需要 CPU 时放弃 CPU,而在做事情时操作系统不来烦你,实际就保证了 CPU 一直都在做有用的事情
可以类比在你写代码时没事总是来催你的产品,没事总是来找你”支持“的队友

缺点是如果你完成了任务一直不汇报,那整个项目就 block 在你这了
我认为现代编程语言(好吧 ... 强行把 Go 称为现代编程语言也过得去)对这个问题提供了很好的抽象,所以现在才有这么多人觉得这么好用。这在 Windows 3.1 和 MacOS Classic 那个年代大概是难以想象的吧
痛包?
2019-10-31 02:02:40 +08:00
回复了 xiiin 创建的主题 问与答 很好奇,大家如何在网络世界发现"新大陆"
@secondwtq 更 general 地说,你应该从用户群的特征入手来考虑你需要什么样的产品 /社区
2019-10-31 02:00:15 +08:00
回复了 xiiin 创建的主题 问与答 很好奇,大家如何在网络世界发现"新大陆"
你要发现的”新大陆“其实是”领域特定内容“
如果一个产品的目标用户是所有人,那它上面的东西就得 fit 进”所有人“的下限,然后你就必须接受这一下限。并且它也必须主要专注于满足所有人共有的需求,所有人共有的需求就那几个,顾不到你的口味的

"贴吧、微博、优酷和知乎"
这里面除了贴吧有做特定领域的内容之外,其他的都太 general 了。
知乎有”话题“,但是我觉得他们现在对这个 feature 没怎么上心
当然贴吧现在也没啥特别的营养,不过我找中文的文字游戏攻略还是去贴吧(视频去 B 站),但是前段时间贴吧的数据问题之后就必须依赖 cache 了,明显药丸
微博其实也有,不过微博太碎片化和生活化了
2019-10-27 22:38:08 +08:00
回复了 snowSe 创建的主题 硬件 又是一年双十一 给老电脑升下级
没必要为了折腾而折腾,楼主如果钱花不出去,可以试试在本站发起一个”献礼双十一,盖楼送红包“活动
玩机器哪有玩人好玩

如果你不在这个机器上玩 3A 或者有 CUDA 需求,那我觉得没必要换显卡
HDD 如果不是 SMART 数据显示药丸或者有 NAS 需求那也没必要换
如果需要更多的高速存储,现在倒是收 SSD 的好时机
CPU 要么收一个同代 i7 (这个倒是便宜,不过提升有限),要么就得连主板全换,一套下来不比显卡便宜
有 VM 需求可以加个内存,D3 内存稍微便宜一点,不过现在能不能找到两说,而且桌面用的内存也不是服务器 REG ECC 内存那么便宜

总的来说对于桌面机器而言,也就外设(包括显示器)、电源和 SSD 是不受平台限制可以当传家宝随便买的,别的我一般持”朽木不可雕也“的态度,强行升级意义不大
R ! G ! B !
2019-10-27 16:10:42 +08:00
回复了 tenstone 创建的主题 程序员 你通常使用什么写作工具?
https://www.theverge.com/2014/5/14/5716232/george-r-r-martin-uses-dos-wordstar-to-write Game of Thrones author George R.R. Martin explains why he writes on a DOS machine
2019-10-27 14:58:39 +08:00
回复了 crella 创建的主题 问与答 自写计算器的疑惑
@Mohanson 这个有意思,我当初就是想写一个 TS 的静态版,没想到一入此坑深似海 ...

nit:
> 编译器是一种将源语言翻译为另一种等价语言的程序软件
编译器对语言的等价性没有要求,只是源代码和目标代码的语义是等价的(经过优化之后语义可能也不完全等价)

> minits 项目的主要工作就集中在中端
生成 IR 一般是算在前端里面的,比如 LLVM 有 Clang、Julia、F18、Rust 等多个“前端”,LLVM 自身算是“中端”+“后端”。LLVM 代码里面有个 CodeGen 文件夹和 Target 文件夹,这俩主要构成“后端”,也就是 LLVM IR->MC,但是 Clang 代码里面也有个 CodeGen 文件夹,这个算是“前端的后端”,也就是 AST->LLVM IR,和 LLVM 的 CodeGen 是有区别的。中端就是 IR->IR。

> 在做语法分析时常用的技术手段是 "Increamental parsing", 也就是增量分析.
我认为对于新人来讲应该重点讲 Recursive Descent,Incremental Parsing 是比较高级的东西
另外看了这一段我是没理解 Incremental Parsing 是怎么做的
最后我觉得 ... 用自然语言举例有点糟糕

> 这在 C 代码中是无法想象的, 因为 C 的基本规则是先声明后赋值. 在 TS 中却可以这么用, 因为 TS 里有一个专门的模块负责维护代码内所有变量的类型, 函数签名或类签名. 这个模块的名字是 TypeChecker
有点乱 ... 首先 C 和 TS 在这里不一样,原因就是 C 标准和 TS 标准的规定不一样,也就是说是个设计问题,不是实现问题。另外 C 编译器一般也有“一个专门的模块负责维护代码内所有变量的类型, 函数签名” ... 一般编译器都有这个东西,这个叫 Symbol Table,然后操作 Symbol Table 的模块可能叫 TypeChecker ( Clang 里面直接就叫 Sema ),TypeChecker 的作用首先是 check,其次才是 infer。

> LLVM 是一个模块化的编译器套件, 它同样遵循上面的几个原则, 但它最伟大的贡献在于提出了通用中间语言表示, 也就是 LLVM IR. 但其实在 LLVM 之前, 绝大部分编译器都有自己的中间表示, 但缺点是它们是不通用的--也就是只在自己的领域内使用. 大部分后端优化, 比如消除冗余代码, 它们的算法是相同的, 但在 LLVM 之前它们要在不同的语言上各自实现一遍. 像 GCC, 它为了支持不同硬件平台, 它内部的许多编译阶段必须做到硬件无关性, GCC 内部使用了一种硬件平台无关的语言, 这个中间语言的名字叫 RTL
据我了解 GCC 有不止一个 IR,除了 RTL 之外至少还有 GENERIC 和 GIMPLE ( LLVM 其实也不止一个,只不过就使用层面而言主要用 LLVM IR ),RTL 已经比较底层了。GENERIC 其实也是 language-independent IR。LLVM 做得好的一个是 License (在当前)占便宜,一个是历史包袱比 GCC 小,然后是把生态建设起来了。换句话说“通用中间语言表示”一直都有,只是在 LLVM 之前一直没人用。
GCC 社区现在已经开始想要解决人员不足的问题了。比如参加 LLVM 的 conference 就算学生也是要收你五十刀的,GCC 的 conference 是免费的,如果是学生甚至可以申请路费赞助,可见 ...

> 实现完全复用 Clang 的 IR 优化和对应硬件平台的代码生成
Clang 不做优化和 CodeGen,这是 LLVM 做的,只是用 Clang 做了 driver

最后我觉得你可以额外讲一下这个项目之后的前景,比如现在是完全没有动态内存分配的 ... 当然作为一个入门教程这些倒没什么必要,不过如果我在现场的话我会提这个问题的
2019-10-27 13:58:34 +08:00
回复了 sunnyadamm 创建的主题 问与答 冬天用鼠标手冷你们如何解决?忍着?
TNT 了解一下
2019-10-27 13:07:13 +08:00
回复了 shaoyaoju 创建的主题 程序员 在 Map 遍历中使用 async 函数
恭喜你重新实现了 mapM 的某个实例
Office 365 的 web 版我在公司用过,不知道是版本比较老还是为啥,感觉不好用,相比而言 Google 的 GSuite 在浏览器里效果好很多

用不用 Linux 桌面没必要吵,就是一个基于实际情况的选择,你要是用 Windows 软件为主那就装 Windows + Linux 虚拟机,用 Linux 软件为主就用 Linux + Windows 虚拟机,前者比后者会多一个虚拟机的钱

当然有条件的话可以不用虚拟机,我们公司虽然依赖 Office (包括 Outlook,Skype,OneNote,Sharepoint 甚至什么 Teams ),一般是用 Windows 本,开发的话再给个台式机就能装 Linux 了
2019-10-27 03:25:05 +08:00
回复了 Kcelone 创建的主题 git git 技能复习进阶(开局一个键盘,内容全靠抄)
@Allianzcortex 就是不能做。实际上有些项目是鼓励控制 commit size 的
2019-10-27 03:22:45 +08:00
回复了 crella 创建的主题 问与答 自写计算器的疑惑
@winterbells @Sanko
给楼主打个预防针

我发 #2 之前第一行写的是“编译原理”,但是发之前最后改成了“解释器”
因为之前看了 https://v2ex.com/t/607304 这个帖子,就有直接回复“编译原理”的话是非常 misleading 的直觉

首先,楼主“编程的概念太宽泛”这个观察是对的,有很多人(包括很多面向工资编程的人)认为世界上有 10 种人,一种是程序员,另一种是非程序员。我认为所谓“程序员”和“非程序员”之间并不存在明确的界限,非要说的话只有“面向工资编程”和不是面向工资编程的区别
具体来说,很多看上去和编程无关的东西,都是要涉及到编程的,比如 VFX 领域其实很先进,已经普及了 Dataflow Programming,Visual Programming 和以 Python+Qt 为基础的辅助工具。普通人可能用个 AE,虽然 AE 智商兼容性稍微高点,不过也是要写表达式的。
在所谓 “H5” 流行起来之前的桌面时代很长一段时间 Flash 有很高的地位,Flash 的编程内容就更直接了。
还有 Apple 买的 Workflow,虽然 Apple 自己说这东西做的是“task automations ... without requiring familiarity with programming”,但是这东西本质上就是个 Visual Script
那为什么 Apple 要说它不需要“programming”呢?就是因为大众对“programming”这个东西有一种本能的距离感,你只要提了,那我觉得你这东西门槛高,不是给我用的,我就不用了。(这其实也多亏了 Apple 等公司多年来对用户苦心孤诣的“教育”)所以 Apple 要让 Workflow 在大众中流行起来,就必须明确和“programming”划清界限,哪怕这纯属一个此地无垠三百两的行为。

而杀伤力最大的例子,其实是 Excel,你用 Excel/Google Sheets 等软件时用过 公式 么?用了,你就写过程序
(这不是我自己 claim 的,至少 Shriram Krishnamurthi 和 Simon Peyton Jones 都持类似观点)
甚至广义的说,所有的管理人员都是程序员,只不过他们编程的不是机器,而是人而已
(这也就是前两天那个帖子 https://v2ex.com/t/611574 的终极解决方案:扩大“程序员”一词的定义,解构“程序员”这个概念本身

而社会主流,甚至包括 V 站,对“程序员”的定义是如此之狭窄,就好象只有写 Java Web 才能叫写程序,前端怎么能叫程序员呢(那是切图的,跟我念 qie 切 tu 图 de 的)?做硬件怎么能叫程序员呢?美术怎么能叫程序员呢?音乐人怎么能叫程序员呢?测试怎么能叫程序员呢?运维怎么能叫程序员呢?会计怎么能叫程序员呢?做科研怎么能叫程序员呢?不是,程序员就是 ATMPB 里面,写 Java Web 的那群人,给我记住了不许反驳

那么这些不是“传统”程序员的人,用的很多不是 C/Java 一类的语言,而是针对于他们自己领域(如数据处理、特效制作)的专门语言,计算机里管这东西叫 DSL ( Domain Specific Langauge )。要理解 DSL 这个词的话 ... 我好像给不出严格的定义,因为貌似并不存在。这么说吧,Excel 的公式是面向数据处理的 DSL,AE 的表达式是面向动画的 DSL,正则表达式是面向字符串匹配的 DSL,Markdown/LaTeX 等是面向文档写作排版的 DSL ( LaTeX 好像更像个数学公式 DSL ...),MATLAB 是面向数值计算的 DSL,Windows 常用的 INI 是做配置的 DSL,Shell/BAT 则是做命令行交互与自动化的 DSL,HTML 是用来描述超文本的 DSL,CSS 则是用来描述样式的 DSL。
DSL 的另一面是通用编程语言( General Purpose Language,就简称 GPL 吧),就是大众认知中的 C,C++,Java 这一类。一个 GPL 在使用了特定的框架和库之后其实也可以变成 DSL,比如 C++ 的 Boost 里面有个叫 Spirit 的东西,这东西可以直接在 C++ 里面写 parser (至于 parser 是啥 ...)。而 DSL 也可以变成 GPL,比如 JavaScript 一开始就是 Web 前端的 DSL,看起来是逆袭成 GPL 了(还派生出了 JSON 这个新的 DSL ),PHP 则偏后端,虽然有点 GPL 的意思,不过好像差了 JavaScript 两步

啰嗦了这么多,主要就是楼主要明白你要做的这个东西不叫计算器,叫 DSL
这个思维的转型首先要到位。举个例子,我们专业有个什么课,有一个作业就是写个计算器,作业要求其实很简单,大多数人就写了个加减乘除,稍微好一点的加了图形界面,就是楼主说的“按键的四则运算”。但是吧我有一个学弟,他就肝了几个晚上,把楼主的“多语句”“自定义变量”“自定义函数” 之类的都做出来了。当然他是有编译方面基础的,所以其实是按照 DSL 来做的,而不是“计算器”

楼主需要实现的也并不是把用户的代码放在 perl/ruby 里面跑,而是 按照实现 DSL 的方法实现一个 DSL。楼主现在路走的有点偏,你生成个脚本运行,然后还暴露在 CGI 上,就不说各路脚本小子要拿你 shell,就是写个死循环你也没办法啊,你见过哪家计算器会死循环的 ...

至于这个“实现 DSL 的方法”到底是什么,很大程度上就取决于你搜的是“编译原理”,还是“解释器”了
“编译原理”其实是一个科班课程(并且是非常局限于计算机的那种 ...),原则上会讲一个编译器(也就是 GCC )所涉及到的所有基础理论知识(之所以说是 GCC,因为 GCC 在这方面其实可以大概说是 Ruby/Perl 的超集,一般的课程安排也会更倾向于这个方向)
这是上交 ACM 班编译原理课程的课程设计: https://acm.sjtu.edu.cn/wiki/Compiler_2019,他们要实现的东西的文档: https://acm.sjtu.edu.cn/w/images/3/30/M_language_manual.pdf (该文档慎点,有减寿风险)
本质上和楼主要实现的东西是没有区别的,只是更 general 一点(比如楼主的“计算器”只支持计算数值,这个还能支持字符串操作和布尔逻辑)
真写起来的话,就这个课程设计的实现思路两只手数不过来,不过核心思路大差不差,只是选择的具体算法和工具选择不太一样。

但是不是说楼主要写计算器,就要去上这个课并且把讲的东西弄明白,划重点:人家要求的是生成“x86-64 Assembly”,并且学生做大作业是要评分的,你只要东西喂进去,算出结果来就行,写起来越短平快越好。
然后楼主去搜“编译原理”,搜出来的东西不仅可以写这个课程设计,甚至足够写 GCC——因为“编译原理”是对所有编译相关技术的(非常奇葩的)一个 umbrella term
但是楼主只是想要写个复杂一点的计算器 ...

具体来说吧,一个科班的编译原理课程,可能会教你什么呢,首先是编译器前端:什么 NFA,DFA,LL,LR,LALR,就是先把源码变成语法树,还有类型检查什么的,然后是中端,什么 IR,CFG,DFA,Alias Analysis, Dominator Tree, CSE, SROA, LICM, IPO,然后后端,Instruction Selection, Register Allocation, Instruction Scheduling
(大多数的课程一般都是大概按我上面写的顺序来的,为什么说是“一般”,因为后面有反例)
我就直说了吧,对于楼主的目的来说,我上面列的这些东西,有一个算一个,全都没用,看到了直接拉黑(我特意漏了 Symbol Table 和 Activation Record 之类,因为这些还是有用的 ...)
(哦对就算这些,一般本科也不会全都学,能学一半就不错了,SJTU 这个课貌似还是有基本的完成度的,也只是讲了基本的东西,我们专业 Compiler 课居然是选修 ...)

对于非编译器领域的人(这个“编译器领域”其实不算小 ... 做深度学习框架的其实有一半都能算,就连 Graphics 大佬,PBRT 的作者之一 Matt Pharr 也来插了一脚)来说,学“编译原理”很多时候只和前端部分沾一点边,至于后面的优化和代码生成部分,我说实话真觉得有点屠龙之计的意思 ...
并且很巧合的是,编译器领域所主要集火的中端和后端,与编译器领域之外的人主要集火的前端,虽然都是编译器里面的东西,但是是完全不同的两个东西。很多工业编译器不用 parser generator,而是直接用 Recursive Descent 堆前端,萌新不会玩,搜到啥就看啥(特别还是考虑到国内网络十分缺乏高质量的相关资源),上来就看龙书,从第一页一直看到第 302 页,然后说“编译原理”难(何况就算用 parser generator,也不需要你理解 parser generator 是怎么工作的啊)
我也很无奈啊 ...

相比而言,“解释器”的相关资料一般就友好很多,一般写“解释器教程”的,对读者的 assumption 是:熟悉某一门 GPL (没忘记 GPL 是什么意思吧 ...),但是对“编译原理”完全不了解,认为“编译原理”和编程语言的实现本身很神秘的萌新。这就很适合楼主。这类教程的最后作品一般也和楼主的“计算器”很类似。

https://v2ex.com/t/554319,https://v2ex.com/t/607304 这些帖子都出现了类似的现象

(当然严格来说,“解释器”也可以做得很复杂,不过一般意义上的“解释器”最多止于 bytecode 这一层,之后如果要做什么 JIT 之类的,这些内容就和传统意义上的“编译原理”直接重合了。)
(为什么搜“编译原理”或者“Compiler”不是正道,我再举个例子,你说你想写个 DSL,找个 Compiler 的课程看吧,结果好死不死选了 CMU 的 15-411,这就爽了,你还没理解第一个 Slides 说的“Focus on code generation and optimization”是什么意思的时候,第二节课就开始 Instruction Selection 了,然后 Register Allocation,然后第一个 Lab 就让你实现一个 Code Generator ...)
2019-10-27 00:50:13 +08:00
回复了 crella 创建的主题 问与答 自写计算器的疑惑
关键字:解释器( Interpreter )
一定要学 fq

我见过最好用的计算器是 Jupyter Notebook
另外我非常好奇你为什么会用 perl6/raku ...

"执行一万次运算时 ruby 太慢所以改为 c++写计算文件,ruby 调用 g++编译、执行" G++ 有时候可以比 Ruby 还慢 ... 虽然这里应该不会有太大问题
2019-10-27 00:28:30 +08:00
回复了 echofather 创建的主题 程序员 程序员缺少一个工具#
前端其实也事有的 https://arewefastyet.com
不过这个更有意思 http://arewechromeyet.com
1 ... 72  73  74  75  76  77  78  79  80  81 ... 123  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1028 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 61ms · UTC 20:11 · PVG 04:11 · LAX 12:11 · JFK 15:11
Developed with CodeLauncher
♥ Do have faith in what you're doing.