私はしばらく C++ を学んでいますが、とても強力だと思います。しかし、問題は抽象化のレベルが低く、メモリ管理を自分で行わなければならないことです。より高いレベルの抽象化を使用する、使用できる言語は何ですか?
26 に答える
Java、C#、Ruby、Python、および JavaScript は、おそらくあなたの前にある大きな選択肢です。
JavaとC#はそれほど異なる言語ではありません。この C++ との大きな違いはメモリ管理です (つまり、オブジェクトは参照されなくなると自動的に解放されます)。デスクトップ スタイルのアプリケーションに興味がある場合、または静的な型付けに関心がある場合は、これらを選択することになります (Microsoft と Windows プラットフォームに対する感じ方に基づいて、どちらかを選択することになるでしょう)。どちらの場合も、C++ で慣れ親しんだ標準ライブラリよりもはるかに豊富な標準ライブラリを見つけることができます。
PythonとRubyは、静的型付けから一歩離れて、任意のオブジェクトを呼び出してメソッドを作成できる (存在しない場合は実行時に失敗する) 世界に入ります。これは祝福 (ボイラープレート コードが大幅に減る) であると同時に、呪い (コンパイラはこれらのエラーをキャッチできなくなります) でもあります。繰り返しますが、それらにはより豊富な標準ライブラリがあり、Java / C# よりも高いレベルであることがわかります。私が理解しているように、PythonはRubyよりもいくらか高速であり、パフォーマンスが主な欠点です。どちらかを選択する場合、Ruby on Rails フレームワーク コミュニティの Web 開発に興味がある場合は Ruby を選択し、それ以外の場合は Python を選択するでしょう。
JavaScriptは、クラスを完全に排除するという点で C++ とはさらに異なります。オブジェクトは他のオブジェクトから単純に複製され、実行時にメソッドとプロパティを追加できます。非常に柔軟ですが、完全に混乱するのも非常に簡単です。プラットフォームとして真価を発揮しつつあるブラウザーでアプリケーションを実行することに関心がある場合は、JavaScript が唯一の現実的な選択肢です。ブラウザーで多くのことを行っていない場合、利用可能な標準ライブラリーはかなり限られていることがわかりますが、いくつかのギャップを埋める優れたフレームワークがかなりあります。
他にもいくつか興味深いものがありますが、よりニッチな選択肢は
- Smalltalk - 多かれ少なかれ Ruby と Python の陣営で、私が理解している限りではかなり高速です。ただし注意してください _ 私は多くの優れたエンジニアが Smalltalk を学び、戻ってこないのを見てきました ;)
- Objective-C - C がオブジェクト指向になったとき、C++ は一方向 (静的型付け) になり、Objective-C は別の方向 (動的型付け) になりました。それは非常に Smalltalk にインスパイアされており、Mac / iPhone の土地にいる場合は優れた標準ライブラリがあります。メモリ管理に関しては、私がリストした他のすべてとは異なり、ガベージ コレクションは行われません (ただし、現在 Mac OS X 10.5 ではオプションになっています)。ただし、手動でメモリを管理するよりもはるかに簡単な参照カウント スキームがあります。
- Lisp - Emacs のマイナーなハッキングに必要な以上のことを自分で学んだことはありません。私が理解しているように、図書館は当時は素晴らしかったのですが、言語は非常にエレガントなままですが、時代に少し遅れをとっています.
- Haskel - オブジェクトとクラスから完全に離れたい場合は、Haskel とその関数型アプローチが興味深い方法です (または、上記の Lisp、または.Net ランドにいる場合はF# )。基本的に、すべてを再帰的に行うことを優先して、ループと変数を放棄しています。理解するには少し時間がかかり、実際のほとんどのアプリケーションではおそらく実用的ではありませんが、学ぶには良い方法です。
- Eiffel - 大好きです - 非常にクリーンな構文で、本格的なエンジニアリング タイプのシステム向けに設計されています。C# や Java のように静的に型付けし、標準ライブラリは弱いですが、言語とクラス ライブラリの設計について真剣に考える必要があります。
- ActionScriptとFlex - JavaScript の静的に型付けされたバージョンと思われるものに基づいた、Flash へのプログラミング インターフェイス。少し遊んでみましたが、メディアベースのアプリケーションの開発に興味があるなら、かなり巧妙です。また、Flex を使用してブラウザーを超えてAirプラットフォームにプッシュし、実際のデスクトップ アプリを構築することもできます。
あなたの質問から、あなたはおそらく C++ についての学習を終えていないと思います。あなたがまだ自分のメモリ管理をしているなら、あなたはまだ長い道のりを歩んでいます!
auto_ptr と shared_ptr を確認してください - Boost ライブラリを確認してください。
抽象化についても同様です - 具体的に何について不平を言っていますか? 私の知る限り、他の厳密に型指定された言語に存在する C++ でできないことはあまりありません。
これがあなたの質問に答えていないことはわかっています。あなたは前進したいと思っていますが、C++ は学習をやめることのないものの 1 つです。飽きたら、テンプレートとテンプレートのメタプログラミングに少し足を踏み入れてください...
これまでのところ、多くの優れた提案が見られます。しかし、何かが足りないと思います、アセンブラ。
アセンブリ言語を学ぶ理由
- あなたが思うほど難しいことではありません。アセンブリ言語は、現代の多くの言語よりもはるかに範囲が狭く、意味を成すために理解する必要があるいくつかのトリックがありますが、それほど複雑ではありません。
- それはあなたの知識ベースを広げます。高いレベルで作業している場合でも、基礎を知ることはほとんど常に有益です。
- これは、デバッグ時に非常に役立ちます。特にソースなしでネイティブ コードをデバッグする場合、アセンブラーを学習して得た知識により、これらの状況でのデバッグ能力が飛躍的に向上します。
- より多くのオプションを提供します。アセンブリ コードが必要なまれな状況が発生した場合、無力になることはありません。
- 履歴書でいいです。現在の仕事を維持するために必要な最低限以上のことを学んでいることを示し、基本的なことへの好奇心を示し、プログラマーの別のクラスにあなたを置き、そのクラスはより経験豊富で有能になる傾向があります。
- それはただクールです。
いくつかのアセンブリ言語リソース:
- Sandpile.org (アセンブリ言語/プロセッサ アーキテクチャのリファレンス)
- Gavin's Guide to 80x86 Assembly (適切なオンライン チュートリアル)
- Assembly Language for Intel-Based Computers (5e) (x86 アセンブリのまともな教科書)
Haskell のようなまったく異質なものを試してみると、さまざまな方法で考えることができます。また、再帰的に考えるのにも役立ちます。C++ には再帰がありますが、関数型言語のより多くの部分に浸透しています。
同上Lisp、..またはスキーム
普段使わなくても、便利です。テンプレートプログラミングを学んだ後、私は本当にテンプレートプログラミングを手に入れました。
もう一つはプロローグです。それはあなたを非連続的な考え方に陥らせます。
C++ の構文とスタイルに慣れている場合は、Dが興味深い言語であることに気付くかもしれません。または、分岐したい場合は、Python、C#、Java、Ruby のいずれかが優れた選択肢になります。
Microsoft エコシステムに参加している場合は C#。
Python と Ruby は、Linux/Unix/etc の分野で最も牽引力があるようです。
ObjectiveC は Macintosh と iPhone で優勢です。最新の MacOS は、フレームワークのサブセットに対してガベージ コレクションを実装していますが、残りを使用するには、自分でリソース管理を行う必要があります。
Java はガベージ コレクションと同じように学ぶことができますが、生産的な Java 開発者になるために慣れる必要があるフレームワークの数には気が遠くなります。
試したいプログラミングの種類にもよると思います。OOP側にとどまり、PythonまたはRubyを学びたい場合は、どちらの言語も、スクリプトからC ++コードを使用するためのバインディングを作成する簡単な方法を提供します(効率上の理由から)。
プログラミングへの別のアプローチが必要な場合は、LispやHaskellのような「関数型」言語を学びましょう。
また、C ++アプリケーション内に高速で小さなスクリプト言語を含める必要がある場合は、Luaを試してください。
最後になりましたが、Javaを知っていて嫌いな場合は、JavaクラスとScalaコードを組み合わせることができる言語であるScalaを試すことができます。これは非常に興味深いことです。
図式。
リトルスキームとコンピュータプログラムの構造と解釈は、奇妙で素晴らしい方法であなたの心を伸ばします。
DrSchemeは初心者に適したIDEです。Schemeプログラミング言語は、優れた無料のリファレンスになります。
非常に高いレベルの抽象化とメモリ管理を探しているなら、Lisp が理想的な候補だと思います。今、ゆっくりと学んでいますが、新しい言語を使った中で最も楽しいです。
Python または Ruby は、表現力と人気の間のより良い妥協点かもしれません。Python の Django フレームワークは、Web アプリケーション関連のものを探している場合、より優れた RAD フレームワークの 1 つです。
データベース設計と SQL などのクエリ言語を学ぶことをお勧めします。
Microsoft Access などのデスクトップ ツールから始めるか、無料の SQL Server Express、Postgre、または MySQL を使用できます。
C#をたくさん試してください:)
そうですね、プログラミング言語の学習に決まったルートはないと思います。次の言語は、仕事の必要性、学術研究、楽しみなどに基づいて学ぶことができます。多くのオプションがあります。
C++ に慣れたら、下に降りてアセンブリを学ぶことができます。これは暗い芸術ですが、ハードなデバッグ セッションに出くわすと嬉しくなります。
より抽象化されているという点では、Smalltalk は非常に楽しく、OOP に純粋であり、100% 動的です (静的型付け言語にはないデバッグは楽しい作業です)。Dolphin Smalltalk は Windows の優れた実装であり、無料のコミュニティ エディションでも十分に遊べます。マルチプラットフォームの Smalltalk VM では、Visualworks または Squeak を使用します。Visualworks は非常に安定しており、多くのドキュメントが付属しています。
Python は今日、非常に多くの分野で使用されています。基本的な構文とセマンティクス以外は Python について何も知りませんが、今日では多くの仕事で Python が必要とされています。
Java です、Java です。Java が私を決して捕まらないのは興味深いことです。ただし、Java に興味があるかもしれません。C++ やその他の OOP 言語よりも優れている点については、こちらでお尋ねください。
Web 開発の場合は、特に AJAX の波を考慮して、Javascript を使用してください。だんだん面白くなってきた今日この頃。Smalltalk について話しましたが、Seaside は Web 開発のための素晴らしいフレームワークです。動作します (少なくとも私は試着しました) Squeak /Visualworks ... 美しいです。
さて、手に入れるものは他にもたくさんあります:Scheme、LISP、Ruby、Lua、Bash (!)、Perl (うーん)、Haskell...それらすべてを試して楽しんでください!
Clojure は、次の両方の基準を満たしているため、検討する価値があります。
- より高いレベルの抽象化によるプログラミングに重点を置いています。たとえば、このビデオを参照してください: Clojure: The Art of Abstraction
- 自動メモリ管理/ガベージ コレクションがあります (世界最高の GC 実装を備えた JVM 経由)。
抽象化を 1 つだけ使用していくつかの例を示します。Clojure では、シーケンス抽象化を介してほとんどすべてのデータ構造を操作できます。
;; treat a vector as a sequence and reverse it
(reverse [1 2 3 4 5])
=> (5 4 3 2 1)
;; Take 10 items from a infinite sequence
(take 10 (range))
=> (0 1 2 3 4 5 6 7 8 9)
;; Treat a String as a sequence of characters, calculate the frequencies
(frequencies "abracadabra")
=> {\a 5, \b 2, \r 2, \c 1, \d 1}
;; Define an infinite lazy sequence of fibonacci numbers, take the first 10
(def fibs (concat [0 1] (lazy-seq (map + fibs (rest fibs)))))
(take 10 fibs)
=> (0 1 1 2 3 5 8 13 21 34)
Qtを学びませんか?すべてのプラットフォームやモバイル デバイスで利用できる優れたアプリケーション開発フレームワークです。
メモリ管理を抽象化したい場合、Java がすぐに頭に浮かびます。
Pythonを使い始めようと思います。より高いレベルの抽象化があり、「きれいな」コードをインデントして作成することの重要性を教えてくれます。「きれい」というのはそれほど重要ではありませんが、コードの将来のメンテナをもっと幸せにするでしょう:)
そこにはたくさんのサンプルコードがあり、Linuxに興味があるなら、言語に基づいたツールのすべて(またはほとんど)を持っているさまざまなディストリビューションがあります。オペレーティングシステムの管理がどのように機能するか(ほとんどのプログラマーが行うこと)を掘り下げるのが好きなら、それは良いスタートです。私が炎を上げる前に、私が管理していると言ったのは、実際のカーネルのものではなく、ほとんどの場合Cが必要であり、それをカバーする必要があります。
一方、物事のC側に飛び込み、OOのものを無視して、関数型プログラミングを学ぶのは良いことかもしれません。あなたがその道を進むなら、私はまた、提案された上の投稿の1つのような基本的なアセンブリ言語から始めることを提案します。たぶんHLA(Randall Hydeによるハイレベルアセンブリ、彼はArt of Assembly LanguageProgrammingと呼ばれる素晴らしい本を書いた)は良いスタートです。あなたは記憶管理を愛することを学ぶか、あなたの人生の残りの間それを嫌うでしょう。あなたがプログラミングのキャリアを始めたい場合に知っておくと良いです:)
ただし、プログラミングから仕事を作りたい場合、JavaとJ2EEは、自分が何をしているのかを知っていれば、簡単にお金を稼ぐことができます。私見それは本当にすぐに退屈になります。
まだ行っていない場合は、スクリプト言語を試してください。働き方や考え方が変わるはずです。うまくいけば、良い意味で:)
python はセクシーな言語であるだけでなく、非常に広く使用されており、Boost.Pythonを介して C++ と簡単に統合できるため、python をお勧めします。
しかし、Thomi が言ったように、C++ には探索すべきことがたくさんあり、Boost ライブラリの助けを借りて開発が非常に簡単になっています。
あなたはすでに C++ に慣れているので、次のステップは、マネージ C++または C++ のマネージ拡張を通じて .Net を学ぶことです..これにより、.Net フレームワークの大きな世界に足を踏み入れることができます. C#、VB.Net などの他の .Net 言語を快適に学習できます。
MC++ が優れている分野の 1 つであり、.NET 言語の中で実際にユニークなのは、既存のアンマネージ (C++) アプリケーションを取得し、/clr スイッチを使用して再コンパイルし、MSIL を生成して実行する機能です。 CLR。この並外れた偉業は、「It Just Works (IJW)!」と適切に呼ばれています。いくつかの制限がありますが、ほとんどの場合、アプリケーションはそのまま実行されます。C++ コードは、昔ながらの printf ステートメント、MFC、ATL、さらにはテンプレートで構成することもできます!
Perl については別の回答を用意する必要があります。Python は機能的にはほぼ同等であり、よりクリーンでモダンであると考えられていますが、Perl には独自のエレガンス、つまり純粋なプラグマティズムのエレガンスがあります。また、本当に優れたライブラリ サポートも誇っています。Perl を見て、Haskel とは反対の方向に頭脳を広げてみてください :) (ただし、Perl 愛好家は、Perl は関数型プログラミングに使用できると主張しています)。
特定の言語を提案するのではなく、次の 4 つの機能を提供する言語を選択することをお勧めします。
- 自動メモリー管理
- 振り返り/内省
- 宣言型/関数型構造 (ラムダ関数など)
- ダックタイピング
ここでの考え方は、プログラミングの観点を拡張して、C++ 言語ではそのままでは提供されない概念を含めることです。
それはあなたが何をしたいかによります。達成したい特定のタスクがある場合は、それらのタイプのタスクに最適な言語を検討してください。言語を学ぶ最善の方法は、実際に使ってみることです。
- 構文は C++ に似ています
- パフォーマンスと安全性、特に安全な並行性のために設計されています