新しいことをしてみたくて、C++ と C#、.NET Framework や Visual Studio のことを調べた
先日、久々に PowerShell スクリプトを書いた時に、Win32 API を触る必要があり、そのために C# のコードを何となく書いて、PowerShell スクリプト内に埋め込んで使用した。
以前は VBScript を書いて WSH を活用したり、Windows バッチを書いたりはしてきたが、C# を書いてまで Windows API を操作するようなことはしなかったので新鮮だった。
ちょっと C# でも勉強してみるか?でも Node.js や Python の拡張には C++ が使われているよなぁ。どっちがどういう言語なんだったっけ?
ということで調べてみた。
C# と C++ の違い
C# と C++ の違いを、PowerShell や .NET Framework、そして Windows API との関係性から整理してみる。
- 先日自分が触った Windows API (Win32 API) は、基本的には C 言語か、C 言語を拡張した C++ から利用することを想定されている。
- .NET Framework は Win32 API を利用しており、ラッパー的な立ち位置にある。
- C# という言語は、Microsoft が .NET Framework 上で使うことを想定して開発した言語。
- 先日 PowerShell スクリプト内に C# のコードを埋め込んで、
Add-Type
を使って実行したとおり、開発言語に C# を使用して、Win32 API を叩くようなことは、可能ではある。- ただし、C++ と比べると、.NET Framework が間に入るため Win32 API を直接的に扱えず、DLL を呼び出して使ったりするので、多少無理が出てくるところもあるらしい。
- → Win32 API を直接細かく扱っていきたいなら、C# より C++ を使った方が扱いやすそうだ。
- C# はネイティブコードにコンパイルできず、.NET Framework 上でしか動かない。Windows 以外の OS での動作も完璧ではないので、C# は Windows オンリーな言語といえる。
- PowerShell の
Add-Type
による他言語コードの埋め込みは、.NET Framework がベースになっているので、C# の他に VB.NET のコードなども埋め込めるが、C++ のコードは当然埋め込めない。 - PowerShell 自体が .NET Framework の上に成り立っているので、.NET Framework で解釈できる言語同士は親和性高い。
- PowerShell の
- C++ の場合、.NET Framework を介さず Win32 API を操作することになる。
- C++ を .NET Framework 上で使える対応させた C++/CLI という拡張言語もあったりするが、あまり使うメリットはなさそう…。
- C++ は
g++
コンパイラで実行ファイル (簡単にいえば.exe
ファイル) にコンパイルして実行するのが通常なので、PowerShell スクリプトとの連携は微妙か。実行ファイルを作っておいてコマンド化しておいて、それを PowerShell から呼び出す、みたいになるのかな。
…というワケで、ちょっと悩ましいところ。
- PowerShell 内にコードを埋め込んだりして、スクリプトとして扱うのであれば、同じ .NET Framework ベースの C# の方が親和性が高いといえるが、Windows API を直接的には扱えないところがある
- Windows API を直接扱いやすいのは C++ だが、PowerShell のような「スクリプト」ではなく、コンパイルして実行ファイルにする必要があるので扱い方が異なる
Windows API をゴリゴリ触っていきたいのか、スクリプトを拡張してちょっとリッチなスクリプトを書きたい程度なのか、といったところで、優位性が変わってくる感じ。
- 参考 : C++とC#でwin32APIを扱うに当たってどのような差があります... - Yahoo!知恵袋
- 参考 : C#でWin32APIが使えるなら、CやC++はいらないのでは? - Cや... - Yahoo!知恵袋
- 参考 : Add-Type
- 参考 : C#メモ PowerShellのps1ファイルにC#のコードを埋め込んで実行してみる | tetsuyanbo
- 参考 : C/C++ プログラムのコンパイルと実行
- 参考 : Get Started with C++ and Mingw-w64 in Visual Studio Code
.NET Framework について整理する
C# は .NET 基盤がベースなのね~、というところで、じゃあ .NET ってなんだったっけか?となった。
以前も .NET Framework のことを調べてはいて、どういう立ち位置のモノかは大体理解していたのだが、もう一度調べ直した。
- 過去記事 : JScript と WSH と JScript.NET と .NET Framework と
- .NET : 元々は2000年頃に提唱していた「ビジョン」で、今は「.NET Framework」の俗称・略称扱い。
- .NET Framework とは : ライブラリ・兼・フレームワーク・兼・ランタイム (実行環境)。
- 共通言語ランタイム (CLR Common Language Runtime) : 実行環境。色んな言語で実装したコードを「共通中間言語 (CIL Common Intermediate Language)」に変換すると、この CLR 上で実行できる。JVM 的な立ち位置といえる。
- 基本クラス・ライブラリ (BCL Base Class Library) :
System
名前空間やSystem.IO
など、基本的なクラスを提供する。 - 各種ライブラリ・フレームワーク : 「ADO.NET (データベースアクセス)」「ASP.NET (Web サービス作成)」などなど。
- VB.NET : Visual Basic を .NET Framework に対応させた、2002年のバージョンアップ後の言語を指す呼び方。
- C#.NET : C# 自体が .NET Framework 上で動作することを想定して作られた言語。C# を用いたコンパイラのことを C#.NET と呼ぶが、ほとんど C# と同義。
- ASP.NET : Active Server Pages の略。.NET Framework の一部として提供されるフレームワークで、Web サービスの開発に関する機能を提供する。立ち位置的には Ruby on Rails や CakePHP などのようなフレームワーク。.NET Framework がベースなので、使用できる開発言語としては C#、C++、VB.NET などが選べる。
- ADO.NET : ActiveX Data Objects の略。データベースに接続するためのインターフェースを提供するクラス・ライブラリ。SQL Server・Access・Oracle・MySQL などに対応するデータプロバイダがある。
…ということで、実行基盤だったり、ライブラリだったり、フレームワークだったり、そういう色んなモノを総合して「.NET Framework」と呼んでいるので、何のことについて話をしているのか、分かりづらさがある。
この辺の分かりづらさは Node.js 登場以降の JavaScript 界隈にもあることで、「JavaScript 出来ます!」っていうのが
- jQuery 使えます (レガシー・フロントエンドで Node.js とか使えない)
- SPA 書けます (Node.js・npm を開発・ビルドツールとして使うモダン・フロントエンド)
- サーバサイド処理が書けます (Node.js を実行基盤として使うバックエンド)
…の、どれのことを指しているのかが分かりづらいところ。それぞれで実行環境がブラウザなのか Node.js なのかが違うし、Node.js を開発中のみ使うのか実行時も使う領域なのかが違うので、スキルセットとしては微妙に重なっていないのよね。だから、JS 界隈に関しては、
- 「開発言語として ES2015 以降を理解し、TypeScript も読み書きできます」
- 「npm パッケージを活用して SPA プロジェクトを開発・ビルドできます」
- 「Node.js 上で動作するバックエンドサーバを作れます」
を分けて話せるようになってほしいな、って思ったりするのよね。
.NET Framework についても、「.NET 分かります」だと何のこと言ってるのか分からないワケだよね。
- 「開発言語としてスムーズに読み書きできるのは VB.NET です、C# は文法がよく分かりません」
- 「Web アプリケーションを作成するフレームワークとして ASP.NET を使ったことがあります。そのプロジェクトの開発言語は C# でした」
- 「ADO.NET を使うプロジェクトに短期間参画していたことはありますが、開発言語が VB.NET だったのか C# だったのかは知りません」
みたいな感じで、「.NET」という単語をなるべく使わず、正確に表現できるようにしておかないと、相手と解釈がズレるなーと思った。
- 参考 : .NETとは何か? : 基礎解説 : .NET初心者のための.NET入門【2011年版】 - @IT
- 参考 : .NETとは?基礎知識やできることをわかりやすく解説|発注成功のための知識が身に付く【発注ラウンジ】
- 参考 : ASP.NETとVB.NETの違いとは? | MacRuby
C++ や C# の開発には Visual Studio が必要なの?
自分は主にフロントエンド領域の開発をしていて、時々 Python や Ruby、PHP などを書く程度。なので IDE は VSCode がメイン。Java を書く時は、以前は Eclipse を使っていたが、Java に関しても VSCode の拡張機能でなんとかなるので、去年2020年に参画したプロジェクトでは VSCode で Java プロジェクトを作っていた。
C++ や C#、VB.NET の開発というと、Visual Studio という IDE が標準的なのだが、Visual Studio がないと開発が出来ないのだろうか?ちょっと調べてみた。
- Visual Studio とは
- C++、C#、VB、などなどの言語に対応する。
- 含まれる製品 : Visual C++ (コンパイラ・ライブラリ・開発ツールを統合したもの)、Visual C# などなど。
- 2019-04-02 公開の Visual Studio 2019 (v16.0) が現行最新版。Visual Studio 2022 がプレビュー公開中。
- エディションがいくつかあるが、基本は有償の IDE だと思った方が良い。
- Visual Studio Community は無料版。以前は Express という無料エディションもあったが、今後は Community のみになる模様。
- 参考 : Visual Studio IDE、コード エディター、Azure DevOps、App Center - Visual Studio
- 公式ページで、Visual Studio を使えばいいのか、VSCode を使えばいいのか、といった推奨が確認できる。
- 開発する対象がデスクトップアプリなのか Web アプリなのか、開発したい言語は何か、開発に使用する OS は何か、などを指定すると、「MacOS でデスクトップアプリを作りたいなら Visual Studio 入れましょう」とか「それなら VSCode でいいよ」とか教えてくれる。
- VSCode の拡張機能が豊富なので、C++ や C# の開発環境を VSCode で整えることはできる。
個人開発であれば Visual Studio Community というエディションが、有償版の Professional 相当だそうで、とりあえず VS Community でひととおりの開発ができるようだ。
現在は VSCode が一強状態なので、「何で他の IDE が必要なの?」みたいな感覚もあるが、フロントエンド界隈だって一昔前は Sublime Text か Atom か、みたいな感じだったし、Java 界隈も、自分は使ったことがないが NetBeans や IntelliJ IDEA といった IDE の名前を聞いたことがある。
Windows 環境における C++ や C# を中心とした IDE として育ってきたのが Visual Studio であり、豊富な機能が最初から用意されていて、インストールさえすれば何でも出来るようになるワケだ。しかし、近年の VSCode の目覚ましい成長によって、VSCode でも拡張機能さえ入れれば、「Visual Studio じゃないから出来ない (VSCode では出来ない)」ことはあまりないようである。
Java 開発がメインだった時代に、Eclipse の動作が重くて怒り狂うことがよくあった。Visual Studio も、周りの開発者が「重たい」とよく愚痴っているのを聞いているので、そうしたパフォーマンス面のストレスを感じたことがない VSCode で環境構築が済むなら、VSCode でやりたい。Visual Studio の方がお膳立てがされていて、VSCode だと面倒なところが多少あったとしても、パフォーマンス面のストレスがない方が優先かな。ちょっとぐらい機能的な制約があったとしても、自分の思考と同じスピードで実装できる IDE を選びたい。
- 参考 : VSCodeでC/C++開発環境を整えてみる(MSBuild(Visual Studio Express)編) : OFF-SOFT.net
- 参考 : Visual Studio Codeの設定(C/C++編) - Qiita
- 参考 : Visual Studio Code を使用して .NET コンソール アプリケーションを作成する - .NET | Microsoft Docs
- 参考 : ASCII.jp : VSCodeでC#開発環境整えちゃう(グッバイVisual Studio)
- 参考 : Visual Studio CodeでC#プログラミング - Qiita
- 参考 : VSCode(Visual Studio Code)によるWindowsアプリ開発(WPF C# C/C++) - Qiita
- 参考 : VSCodeでC#開発をする方法
- 参考 : Visual Studio のビルド番号とリリース日 | Microsoft Docs
- 参考 : Visual Studio の以前のバージョンのドキュメント | Microsoft Docs
以上
というワケで、VSCode 拡張機能を利用して、C# と C++ の基本的な開発環境をちょっと整えてみようと思う。
多少は知っている PowerShell から取っ掛かりを得るために、最初は C# を勉強してみようかな。C# なら PowerShell 内にコードを埋め込みやすいので、.NET Framework を使って比較的ライトに Windows API を触って何かしてみようと思う。
もっと Windows API を細かくイジってみたくなったりとか、Node.js 向けにネイティブモジュールを作ってみたいような気持ちになったら、C++ にも手を伸ばしてみようかしら。