erg/doc/JA/compiler/transpile.md
Shunsuke Shibayama 96132b20f6 initial commit
2022-08-10 23:02:27 +09:00

92 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ErgコードはPythonコードにどのようにトランスパイルされるか
正確には、ErgコードはPythonバイトコードにトランスパイルされます。
しかしPythonバイトコードはほぼPythonコードに復元できるので、ここでは等価なPythonコードを例として上げています。
ちなみに、ここで紹介する例は最適化レベルの低いものです。
さらに高度な最適化が施されると、実体を生成する必要のないものは消去されます。
## Record, Record type
namedtupleにトランスパイルされます。
namedtupleについては、[こちら](https://docs.python.jp/3/library/collections.html#collections.namedtuple)を参照してください。
似たような機能にdataclassがありますが、dataclassは`__eq__``__hash__`が自動実装されるなどの影響で少しパフォーマンスが落ちます。
```erg
Employee = Class {.name = Str; .id = Int}
employee = Employee.new({.name = "John Smith"; .id = 100})
assert employee.name == "John Smith"
```
```python
from typing import NamedTuple
class Employee(NamedTuple):
__records__ = ['name', 'id']
name: str
id: int
employee = Employee('John Smith', 100)
assert employee.name == 'John Smith'
```
また、更に最適化できる場合は単なるタプルに変換されます。
## Polymorphic Type
## Instant Scope
名前空間内での衝突が起きない場合は、単にマングリングして展開されます。
`x::y`などの名前はバイトコードで使用されるものでPythonコードと対応させる事はできませんが、無理やり表現すると以下のようになります。
```erg
x =
y = 1
y + 1
```
```python
x::y = 1
x = x::y + 1
```
衝突する場合は、内部的にしか参照できない関数を定義して使用します。
```erg
x =
y = 1
y + 1
```
```python
def _():
x = 1
y = x
return y + 1
x = _()
```
## Overloading
マングリングを使用しています。
## Visibility
公開変数に関してはPythonのデフォルトなので何もしません。
非公開変数はマングリングで対処しています。
```erg
x = 1
y =
x = 2
assert module::x == 2
```
```python
module::x = 1
y::x = 2
assert module::x == 2
y = None
```