C ++程序员希望拓宽视野

时间:2009-10-17 20:39:40

标签: c++ programming-languages

我已经编程了大约5年的C ++,现在我意识到知道如何“以不同的方式”思考的价值。

这个问题适用于尝试过其他编程语言的C ++程序员,并遇到过像:

  • “喔..这太酷了!我不知道我可以像这样编程。”
  • “哇,我从没想过设计问题可以这样解决!”

那么,哪种语言对你有用?我正在寻找最大的效果,所以我认为Java不符合要求。 = p我对任何建议持开放态度!

免责声明:我问这个问题主要是因为我想扩大自己的想法。这里无意启动任何编程语言战争!

18 个答案:

答案 0 :(得分:41)

答案 1 :(得分:15)

Python给了我“非常酷”的反应

答案 2 :(得分:12)

对于真正不同的东西,请尝试使用Lisp或Scheme。

答案 3 :(得分:10)

当然是Haskell,但实际上所有这些都改变了我的观点:

几年前我从小就开始参加GWBasic,所以我很自然地倾向于程序语言。

我的职业生涯始于C ++,这是我建立的基础。

  • JavaScript - 向我介绍了第一类函数,闭包,动态类型。
  • Python - 向我介绍了更简单的语法和动态语言。
  • SQL - 向我介绍了'是'与'做'的语言,代码'是'答案。
  • Lua - 简约主义,并使用简单的数据结构(表格)作为所有数据结构的基础。
  • C#是我的新面包&黄油......垃圾收集的优点,内置于图书馆等。
  • C - 我有力量了!

答案 4 :(得分:6)

我将推出第二个Lisp / Scheme,并建议使用Haskell语言来挑战您对编程的看法。 O'Reilly的书“真实世界Haskell”是一个实用的介绍,用具体的用例很好地说明。

答案 5 :(得分:5)

整个“喔..这太酷了!我不知道我可以这样编程。”当我第一次学习functional programming时,我得到了启示。在我的例子中,这是通过我在Tcl/Tk的学习得出的,这是多范式的,但我想你可以从任何强函数语言(例如Lisp或Scheme)中获得相同的效果。

答案 6 :(得分:4)

汇编(我在C ++之前学习过,用于在DOS下编写TSR中断处理程序):我很高兴知道机器实际上在做什么。

C#也很简洁:C ++指向成员的语法是如此令人费解,C#的匿名代表相对有趣(我们将在下一版C ++中获得类似的内容)。

答案 7 :(得分:3)

Python可能就是答案 它可以改进您的C ++思维和设计方式,并教您一些新的想法和方法,如函数式编程 鸭子打字起初可能看起来很奇怪和有问题,但它有其自身的好处 而且即使出于生产目的,您也可能最终使用它

另一个选择是尝试在brain fu_k中写下“hello world”。也许它不适合你的时间,但在那之后你永远不会尝试“拓宽视角”的东西:)

答案 8 :(得分:2)

Prolog是必须的。任何其他不同范式的语言都是一个好的开始。 Prolog是一个合乎逻辑的范例。另一种非常不同的语言是Scheme。它是功能语言家族。

这里有一些Palindrome验证器样本。

编辑:有人提到我写的代码不够令人沮丧和令人沮丧。以下是一些简化示例:

Scheme factorial


 (define (fact n)
    (if (= n 0)
        1
        (* n (fact (- n 1)))))

Prolog factorial


factorial(0,1). 

factorial(N,F) :-  
   N>0, 
   N1 is N-1, 
   factorial(N1,F1), 
   F is N * F1.

我最初的例子:

Prolog样本:


:- set_prolog_flag(toplevel_print_options, [quoted(true), portray(true), max_depth(0), attributes(portray)]).


readline(Line) :-
 get0(Ch),
 readline(Ch, Line),
 !.

readline(10, []).

readline(Ch, [LowerCasedCh | RestOfLine]) :-
 is_alpha(Ch),
 name(N, [Ch]),
 downcase_atom(N, LowerCasedN),    
        %Drops element down to lowercase
 name( LowerCasedN, [LowerCasedCh]),
 get0(NextCh ),
 readline(NextCh, RestOfLine).

%Character Trimming

readline(Ch, RestOfLine) :-
 \+is_alpha(Ch),
 get0(NextCh ),
 readline(NextCh, RestOfLine).



palindrome:-
 readline(List),
 sarahPalindrome(List).


sarahPalindrome(List):-
 reverse( List, ReversedList),
 List = ReversedList.
 

这是针对同一问题的方案解决方案!


(define palindrome
  (lambda (x)
     (equal? (filter-non-char-alpha (reverse (string->list x))) (filter-non-char-alpha (string->list x))
    )
  )
)
(define filter-non-char-alpha
  (lambda (x)  
        (if (equal? x '()) #t 
                    (if (char-alphabetic? (car x)) 
                        (cons (char-downcase (car x)) (filter-non-char-alpha (cdr x)))
                        (filter-non-char-alpha (cdr x)) 
                    )
        )
   )
)

答案 9 :(得分:2)

我会按顺序尝试Scheme(或Lisp)和Python。 Scheme会以积极的方式扭曲你的思绪(它对我有用),然后转到Python,你可以(准)将你的C ++和新的功能知识放在一起。我保证,你们两个都会受到重创。

答案 10 :(得分:2)

最近“这太酷了!”对我来说是斯卡拉。它以一种很好的方式结合了函数式编程,对象和线程,并且都在JVM中运行。

对我而言,这是我见过的第一个与Java相关的非常酷的东西。 :)

哦,好吧,这是第二次。第一个是可逆的调试器,我忘记了它的名称,但是它允许你“向后”运行虚拟机以找到错误。

答案 11 :(得分:2)

我是第二个Python,也是Ruby。

重新阅读设计模式......然后学习Python,并意识到很多设计模式实际上是试图修补像C ++这样的缺陷语言的止损。

例如,当类是第一类对象时,Factory模式就会过时。刚刚通过课程,它毕竟是一个实例工厂。 Python类方法也是一个非常强大的工具,继承可以工作。

许多设计模式适用于缺少闭包,内置代理等的语言......

例如,在Javascript中:

button.onclick = function(){some code}

简单,优雅,功能强大......在C ++中你还有更多工作要做!

答案 12 :(得分:1)

首先,擅长做一些与众不同的事情!如果你能做到这一点,这是一个很好的机会,尝试以完全不同的方式工作,只是为了扩大你对事物运作方式的理解。我会回复ManicMailman's comments about Prolog,这与Pascal / C / Java方法完全不同。我还建议另外两个想法。

首先,我最喜欢的一种语言是PostScript,通常称为页面描述语言,但它本身就是一种完全成熟的语言。它几乎完全在堆栈上工作,因此调用操作符从堆栈中取出参数并将结果推回到堆栈上。当然,它也倾向于具有与之相关的高质量输出设备,这可能是有用的。 : - )

另外,如果你准备好了与你习惯的非常的东西,那么你最好考虑一种函数式编程语言。我个人并不是非常有经验,但我知道LispHaskell有他们的崇拜者。

最后,您已经假设选择新的编程语言是前进的方向。如果你的学术思想中等,你可能会发现阅读数据和算法可能会严重改善你理解和解决基于计算机的问题的方式。其中一个标准文本是Sedgewick的Algorithms in C,虽然在我看来Knuth的The Art of Computer Programming是该领域最好的。

祝你好运! : - )

答案 13 :(得分:1)

我发布了,上面:

For instance, in Javascript :
button.onclick = function(){ some code }

得到了这个评论:

  

那个button.onclick的例子绝对很酷。它看起来也非常直观。谢谢! - ShaChris23

我发现这非常有趣。

当你使用像C ++这样的低级语言时,你不会考虑用更高级语言做的事情。

ShaChris23认为像C程序员一样发现JavaScript:这很“酷”。这是真的! 但是,发现C ++的JavaScript程序员会反过来思考,比如“语言多么粗糙,我甚至无法在运行时向类添加方法!”他也是对的。

例如,当Python程序员将该类放入变量并传递它时,您将使用Factory模式。除了C ++之外从未学过任何东西的人都不会梦想到这一点!

例如,在Python中,我编写了一个基于时间的调度程序,它被称为:

task_handle = scheduler.execute_at(时间,功能)

使用“函数”闭包使得它非常强大。那些不了解“封闭”概念的人无法想到这一点。

学习新语言,甚至只学习基本概念,将使你成为所有语言中更好的程序员,因为它会扩展你的视野。

即使你从未使用它,也要学习Lisp ......

JavaScript也很好,它具有强大的功能性编程基因!

我希望每个人都学到至少Python。

然后没有人会在C中写错误的文本操作,大声笑。

答案 14 :(得分:1)

Ruby必须是让我说“酷看你怎么能做到”的人。但我再次对JavaScript有了新的喜爱。

答案 15 :(得分:1)

我用Pascal,Delphi,汇编,C,C ++,Scheme,Lisp,Java,C#和CUDA编写。

C#是答案 - 您可以使用反射编写极其动态的程序,而WPF确实将C#放在边缘。

答案 16 :(得分:0)

C ++一直在做'whaoo'......并且每隔几年左右才会有令人难以置信的应用程序。

如果我不得不选择其他一些被误解,容易被忽视但表达难以置信的东西,那肯定很简单:JavaScript。

下一个领先且有用的指标显然是谷歌最喜欢的Python,但他们正以比以往任何时候更快的速度进入上述两个领域。去图......

答案 17 :(得分:0)

我一如既往地推荐J(jsoftware.com)。它与大多数其他语言的不同之处在于它是符号(尽管符号都以纯ASCII格式呈现)和功能。更重要的是,它是动态的,交互式的,并且内置了许多高级概念。

例如,从这里的其中一个帖子中获取提示,J中的factorial是:

   !10
3628800

,例如阶乘10.扩展这一点,以评估每次5件事的数量:

   5!10
252

数组是第一类对象,因此5,10和15的阶乘是:

   !5 10 15
120 3628800 1.3076744e12

以及从6,8和10件事中获取3件事的方式:

   3!6 8 10
20 56 120

可以编写回文检查器

   palincheck=: 3 : '(]-:|.)tolower y-.'' '''

这匹配( - :)与“flip”(|。)的低级参数没有( - 。)任何空格。 将此应用于三个参数并返回“1”表示true,“0”表示false:

   palincheck&>'Able was I ere I saw Elba';'Step on no pets';'Not palindrome'
1 1 0

最初很难习惯于在如此高级的水平上进行编程,但是你可能会发现它会在你身上发展,特别是如果你想快速尝试一些想法。