94434


C言語でオリジナルのプログラミング言語を作成したいと考えているのですが、そのようなことは可能でしょうか。  
可能な場合はどのような手順で作れば良いのか教えて下さい。

試したこと

  * 検索してみた（実際に検索するとC#とかC++とか少し違う言語が出てきました）


CC BY-SA 4.0
2023-04-07T02:17:30.067
94432
2023-04-07T08:01:26.783
56895
question
c プログラミング言語
C言語でオリジナルのプログラミング言語を作ることはできますか。


[プログラミング言語を作る](http://kmaebashi.com/programmer/devlang/)が参考になるでしょう。  
C言語でオリジナルのプログラミング言語をじっさいに作る手順が記載されています。


CC BY-SA 4.0
2023-04-07T02:56:32.117
94433
2023-04-07T02:56:32.117
25830
94432
answer


プログラミング言語は手段でしかないので、C言語を使うと決め付けなくてもいいのではないでしょうか。例えばC++言語も[初期はC言語ソースへの変換ツール](https://ja.wikipedia.org/wiki/Cfront#:%7E:text=C%2B%2B%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92C%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%97%E3%81%9F)でした。[TypeScriptはJavaScriptへの変換](https://ja.wikipedia.org/wiki/TypeScript#:%7E:text=TypeScript%E3%81%AE%E4%B8%BB%E8%A6%81%E3%81%AA%E5%AE%9F%E8%A3%85%E3%81%AF%E3%80%81%E8%87%AA%E8%BA%AB%E3%82%82TypeScript%E3%81%A7%E6%9B%B8%E3%81%8B%E3%82%8C%E3%81%9F%E3%80%81JavaScript%E3%81%B8%E3%81%AE%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%A7%E3%81%82%E3%82%8B)です。

言語そのものの設計と、コンパイラーの実装と、並行して開発していくといいんじゃないでしょうか。


CC BY-SA 4.0
2023-04-07T03:33:52.187
94434
2023-04-07T03:33:52.187
4236
94432
answer


どのような言語を作るか => 「ターゲット言語」  
どのような言語で記述するか => 「記述言語」

#### コンパイラーの場合

「ターゲット言語」がコンパイラーだとすると,  
ソースコードの文(文字列)を解析し, 実行できるものを生成し, (必要時に)実行

例として適当な「ターゲット言語」と, 適当な実行環境(そのアセンブリ言語もしくは機械語)を示します

ソースコード:

[code]

    print(12 + 345)
    
[/code]

生成するもの (アセンブリ言語もしくは機械語)):

[code]

    LOAD_VALUE 12
    LOAD_VALUE 345
    ADD_TWO_VALUES
    PRINT_ANSWER
    
[/code]

「記述言語」は, 最低限 このような変換を行うことができればよいので, ほとんどすべてのプログラミング言語で作成できます(可能か不可能かで言えば)

ただ, 積み上げられた土砂を運ぶのにショベルカーか, スプーンで一杯一杯運ぶか … 可能か不可能かで言えばスプーンでも可能だけど,
そんな場面でスプーン使う人はいないでしょう。逆に, 精密な操作が必要な場面では (その場面に適した)別の道具選ぶことになるでしょう  
このため「記述言語」は[システムプログラミング言語](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)
で行われることが多いようです (C言語も当然含まれる)

参考: [低レイヤを知りたい人のためのCコンパイラ作成入門](https://www.sigbus.info/compilerbook)

#### インタープリターの場合

コンパイラーとインタープリターは, 「翻訳」と「通訳」に例えられることが多いけれど, 速度や処理内容を考えると, 以下の手順になるでしょう

  1. ソースコードを, 中間言語 ([bytecode](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89) などと呼ばれることもある) に変換する
  2. 中間言語 (bytecode) を解釈する(実行する)

前者は, 生成する内容が異なるだけで コンパイル動作とほぼ同様の処理で  
例えば Pythonでは, 以下の 3行の(ループ含む)コードを, このような bytecodeに変換します

[code]

    >>> def myfunc(alist):
    ...    s = sum(n for n in alist)
    ...    return s / len(alist)
    ...
    >>> import dis
    >>> dis.dis(myfunc)
      2           0 LOAD_GLOBAL              0 (sum)
                  2 LOAD_CONST               1 (<code object <genexpr> at 0x7f89d6ceb030, file "<stdin>", line 2>)
                  4 LOAD_CONST               2 ('myfunc.<locals>.<genexpr>')
                  6 MAKE_FUNCTION            0
                  8 LOAD_FAST                0 (alist)
                 10 GET_ITER
                 12 CALL_FUNCTION            1
                 14 CALL_FUNCTION            1
                 16 STORE_FAST               1 (s)
    
      3          18 LOAD_FAST                1 (s)
                 20 LOAD_GLOBAL              1 (len)
                 22 LOAD_FAST                0 (alist)
                 24 CALL_FUNCTION            1
                 26 BINARY_TRUE_DIVIDE
                 28 RETURN_VALUE
    
    Disassembly of <code object <genexpr> at 0x7f89d6ceb030, file "<stdin>", line 2>:
      2           0 LOAD_FAST                0 (.0)
            >>    2 FOR_ITER                10 (to 14)
                  4 STORE_FAST               1 (n)
                  6 LOAD_FAST                1 (n)
                  8 YIELD_VALUE
                 10 POP_TOP
                 12 JUMP_ABSOLUTE            2
            >>   14 LOAD_CONST               0 (None)
                 16 RETURN_VALUE
    
[/code]

bytecodeの解釈ステップは, これもまたシステムプログラミング言語が利用されることが多いようです

(ツールチェーンの例)  
RPython というツールチェーンもあります ([Frequently Asked
Questions](https://pypyja.readthedocs.io/en/latest/faq.html) より)

> PyPyのトランスレーションツールチェーンをPython以外の言語にも使えますか？  
>  はい、PyPyインタープリターを翻訳するツールスイートはかなり汎用的で、
> Pythonだけでなく、どんな言語のインタープリタの最適化版を作るのにも使えます。
> もちろん、これらのインタープリタはPyPyがPythonにもたらしたものと同じ機能を使うことができます。
> 具体的には様々な言語の翻訳機能、スタックレス、ガベージコレクション、任意長整数型などの様々実装などです。  
>  現在、JavaScriptインタープリタの暫定版を作っています。（Leonardo Santagadaが夏のPyPyプロジェクトでやっていました）
> Prolog interpreter の暫定版（Carl Friedrich Bolzの学士論文）や SmallTalk interpreter
> の暫定版（スプリント中に作られました）もあります。 PyPy bitbucket page
> にはSchemeとIoの実装もあります。どちらもいまはまだ完成していません。

  * (和訳) RPython詳細: [PyPy - RPython toolchain](https://pypyja.readthedocs.io/en/latest/translation.html)

  * 現在の原文ページ: [Welcome to RPython’s documentation!](https://rpython.readthedocs.io/en/latest/)

    * [Frequently Asked Questions](https://rpython.readthedocs.io/en/latest/faq.html)
  * チュートリアル: [Tutorial: Writing an Interpreter with PyPy, Part 1](https://www.pypy.org/posts/2011/04/tutorial-writing-interpreter-with-pypy-3785910476193156295.html)

チュートリアルは古く, 記されてる URLが存在しないかもだけど, 内容は参考にできるかも


CC BY-SA 4.0
2023-04-07T08:01:26.783
94438
2023-04-07T08:01:26.783
43025
94432
answer